1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-10 13:23:41 +00:00
Files
MeshAgent/microscript/ILibDuktape_Polyfills.c
Bryan Roe 0c6db0b2a6 1. Added additional memory check helpers
2. Updated Process exit detection to check apc flags
2020-04-19 15:18:52 -07:00

2804 lines
687 KiB
C

/*
Copyright 2006 - 2018 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include "duktape.h"
#include "ILibDuktape_Helpers.h"
#include "ILibDuktapeModSearch.h"
#include "ILibDuktape_DuplexStream.h"
#include "ILibDuktape_EventEmitter.h"
#include "ILibDuktape_Debugger.h"
#include "../microstack/ILibParsers.h"
#include "../microstack/ILibCrypto.h"
#include "../microstack/ILibRemoteLogging.h"
#define ILibDuktape_Timer_Ptrs "\xFF_DuktapeTimer_PTRS"
#define ILibDuktape_Queue_Ptr "\xFF_Queue"
#define ILibDuktape_Stream_Buffer "\xFF_BUFFER"
#define ILibDuktape_Stream_ReadablePtr "\xFF_ReadablePtr"
#define ILibDuktape_Stream_WritablePtr "\xFF_WritablePtr"
#define ILibDuktape_Console_Destination "\xFF_Console_Destination"
#define ILibDuktape_Console_LOG_Destination "\xFF_Console_Destination"
#define ILibDuktape_Console_WARN_Destination "\xFF_Console_WARN_Destination"
#define ILibDuktape_Console_ERROR_Destination "\xFF_Console_ERROR_Destination"
#define ILibDuktape_Console_INFO_Level "\xFF_Console_INFO_Level"
#define ILibDuktape_Console_SessionID "\xFF_Console_SessionID"
#define ILibDuktape_DescriptorEvents_ChainLink "\xFF_DescriptorEvents_ChainLink"
#define ILibDuktape_DescriptorEvents_Table "\xFF_DescriptorEvents_Table"
#define ILibDuktape_DescriptorEvents_FD "\xFF_DescriptorEvents_FD"
#define ILibDuktape_DescriptorEvents_Options "\xFF_DescriptorEvents_Options"
#define ILibDuktape_DescriptorEvents_WaitHandle "\xFF_DescriptorEvents_WindowsWaitHandle"
#define CP_ISO8859_1 28591
typedef enum ILibDuktape_Console_DestinationFlags
{
ILibDuktape_Console_DestinationFlags_DISABLED = 0,
ILibDuktape_Console_DestinationFlags_StdOut = 1,
ILibDuktape_Console_DestinationFlags_ServerConsole = 2,
ILibDuktape_Console_DestinationFlags_WebLog = 4,
ILibDuktape_Console_DestinationFlags_LogFile = 8
}ILibDuktape_Console_DestinationFlags;
#ifdef WIN32
typedef struct ILibDuktape_DescriptorEvents_WindowsWaitHandle
{
HANDLE waitHandle;
HANDLE eventThread;
void *chain;
duk_context *ctx;
void *object;
}ILibDuktape_DescriptorEvents_WindowsWaitHandle;
#endif
int g_displayStreamPipeMessages = 0;
int g_displayFinalizerMessages = 0;
extern int GenerateSHA384FileHash(char *filePath, char *fileHash);
duk_ret_t ILibDuktape_Pollyfills_Buffer_slice(duk_context *ctx)
{
int nargs = duk_get_top(ctx);
char *buffer;
char *out;
duk_size_t bufferLen;
int offset = 0;
duk_push_this(ctx);
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
if (nargs >= 1)
{
offset = duk_require_int(ctx, 0);
bufferLen -= offset;
}
if (nargs == 2)
{
bufferLen = (duk_size_t)duk_require_int(ctx, 1) - offset;
}
duk_push_fixed_buffer(ctx, bufferLen);
out = Duktape_GetBuffer(ctx, -1, NULL);
memcpy_s(out, bufferLen, buffer + offset, bufferLen);
return 1;
}
duk_ret_t ILibDuktape_Polyfills_Buffer_randomFill(duk_context *ctx)
{
int start, length;
char *buffer;
duk_size_t bufferLen;
start = (int)(duk_get_top(ctx) == 0 ? 0 : duk_require_int(ctx, 0));
length = (int)(duk_get_top(ctx) == 2 ? duk_require_int(ctx, 1) : -1);
duk_push_this(ctx);
buffer = (char*)Duktape_GetBuffer(ctx, -1, &bufferLen);
if ((duk_size_t)length > bufferLen || length < 0)
{
length = (int)(bufferLen - start);
}
util_random(length, buffer + start);
return(0);
}
duk_ret_t ILibDuktape_Polyfills_Buffer_toString(duk_context *ctx)
{
int nargs = duk_get_top(ctx);
char *buffer, *tmpBuffer;
duk_size_t bufferLen = 0;
char *cType;
duk_push_this(ctx); // [buffer]
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
if (nargs == 0)
{
if (bufferLen == 0 || buffer == NULL)
{
duk_push_null(ctx);
}
else
{
// Just convert to a string
duk_push_lstring(ctx, buffer, strnlen_s(buffer, bufferLen)); // [buffer][string]
}
}
else
{
cType = (char*)duk_require_string(ctx, 0);
if (strcmp(cType, "base64") == 0)
{
duk_push_fixed_buffer(ctx, ILibBase64EncodeLength((int)bufferLen));
tmpBuffer = Duktape_GetBuffer(ctx, -1, NULL);
ILibBase64Encode((unsigned char*)buffer, (int)bufferLen, (unsigned char**)&tmpBuffer);
duk_push_string(ctx, tmpBuffer);
}
else if (strcmp(cType, "hex") == 0)
{
duk_push_fixed_buffer(ctx, 1 + (bufferLen * 2));
tmpBuffer = Duktape_GetBuffer(ctx, -1, NULL);
util_tohex(buffer, (int)bufferLen, tmpBuffer);
duk_push_string(ctx, tmpBuffer);
}
else if (strcmp(cType, "hex:") == 0)
{
duk_push_fixed_buffer(ctx, 1 + (bufferLen * 3));
tmpBuffer = Duktape_GetBuffer(ctx, -1, NULL);
util_tohex2(buffer, (int)bufferLen, tmpBuffer);
duk_push_string(ctx, tmpBuffer);
}
else
{
return(ILibDuktape_Error(ctx, "Unrecognized parameter"));
}
}
return 1;
}
duk_ret_t ILibDuktape_Polyfills_Buffer_from(duk_context *ctx)
{
int nargs = duk_get_top(ctx);
char *str;
duk_size_t strlength;
char *encoding;
char *buffer;
int bufferLen;
if (nargs == 1)
{
str = (char*)duk_get_lstring(ctx, 0, &strlength);
buffer = duk_push_fixed_buffer(ctx, strlength);
memcpy_s(buffer, strlength, str, strlength);
duk_push_buffer_object(ctx, -1, 0, strlength, DUK_BUFOBJ_NODEJS_BUFFER);
return(1);
}
else if(!(nargs == 2 && duk_is_string(ctx, 0) && duk_is_string(ctx, 1)))
{
return(ILibDuktape_Error(ctx, "usage not supported yet"));
}
str = (char*)duk_get_lstring(ctx, 0, &strlength);
encoding = (char*)duk_require_string(ctx, 1);
if (strcmp(encoding, "base64") == 0)
{
// Base64
buffer = duk_push_fixed_buffer(ctx, ILibBase64DecodeLength((int)strlength));
bufferLen = ILibBase64Decode((unsigned char*)str, (int)strlength, (unsigned char**)&buffer);
duk_push_buffer_object(ctx, -1, 0, bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);
}
else if (strcmp(encoding, "hex") == 0)
{
if (ILibString_StartsWith(str, (int)strlength, "0x", 2) != 0)
{
str += 2;
strlength -= 2;
}
buffer = duk_push_fixed_buffer(ctx, strlength / 2);
bufferLen = util_hexToBuf(str, (int)strlength, buffer);
duk_push_buffer_object(ctx, -1, 0, bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);
}
else if (strcmp(encoding, "utf8") == 0)
{
str = (char*)duk_get_lstring(ctx, 0, &strlength);
buffer = duk_push_fixed_buffer(ctx, strlength);
memcpy_s(buffer, strlength, str, strlength);
duk_push_buffer_object(ctx, -1, 0, strlength, DUK_BUFOBJ_NODEJS_BUFFER);
return(1);
}
else if (strcmp(encoding, "binary") == 0)
{
str = (char*)duk_get_lstring(ctx, 0, &strlength);
#ifdef WIN32
int r = MultiByteToWideChar(CP_UTF8, 0, (LPCCH)str, (int)strlength, NULL, 0);
buffer = duk_push_fixed_buffer(ctx, 2 + (2 * r));
strlength = (duk_size_t)MultiByteToWideChar(CP_UTF8, 0, (LPCCH)str, (int)strlength, (LPWSTR)buffer, r + 1);
r = (int)WideCharToMultiByte(CP_ISO8859_1, 0, (LPCWCH)buffer, (int)strlength, NULL, 0, NULL, FALSE);
duk_push_fixed_buffer(ctx, r);
WideCharToMultiByte(CP_ISO8859_1, 0, (LPCWCH)buffer, (int)strlength, (LPSTR)Duktape_GetBuffer(ctx, -1, NULL), r, NULL, FALSE);
duk_push_buffer_object(ctx, -1, 0, r, DUK_BUFOBJ_NODEJS_BUFFER);
#else
duk_eval_string(ctx, "Buffer.fromBinary"); // [func]
duk_dup(ctx, 0);
duk_call(ctx, 1);
#endif
}
else
{
return(ILibDuktape_Error(ctx, "unsupported encoding"));
}
return 1;
}
duk_ret_t ILibDuktape_Polyfills_Buffer_readInt32BE(duk_context *ctx)
{
int offset = duk_require_int(ctx, 0);
char *buffer;
duk_size_t bufferLen;
duk_push_this(ctx);
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
duk_push_int(ctx, ntohl(((int*)(buffer + offset))[0]));
return(1);
}
duk_ret_t ILibDuktape_Polyfills_Buffer_alloc(duk_context *ctx)
{
int sz = duk_require_int(ctx, 0);
int fill = 0;
if (duk_is_number(ctx, 1)) { fill = duk_require_int(ctx, 1); }
duk_push_fixed_buffer(ctx, sz);
char *buffer = Duktape_GetBuffer(ctx, -1, NULL);
memset(buffer, fill, sz);
duk_push_buffer_object(ctx, -1, 0, sz, DUK_BUFOBJ_NODEJS_BUFFER);
return(1);
}
void ILibDuktape_Polyfills_Buffer(duk_context *ctx)
{
char extras[] =
"Object.defineProperty(Buffer.prototype, \"swap32\",\
{\
value: function swap32()\
{\
var a = this.readUInt16BE(0);\
var b = this.readUInt16BE(2);\
this.writeUInt16LE(a, 2);\
this.writeUInt16LE(b, 0);\
return(this);\
}\
});";
duk_eval_string(ctx, extras); duk_pop(ctx);
#ifdef _POSIX
char fromBinary[] =
"Object.defineProperty(Buffer, \"fromBinary\",\
{\
get: function()\
{\
return((function fromBinary(str)\
{\
var child = require('child_process').execFile('/usr/bin/iconv', ['iconv', '-c','-f', 'UTF-8', '-t', 'CP819']);\
child.stdout.buf = Buffer.alloc(0);\
child.stdout.on('data', function(c) { this.buf = Buffer.concat([this.buf, c]); });\
child.stdin.write(str);\
child.stderr.on('data', function(c) { });\
child.stdin.end();\
child.waitExit();\
return(child.stdout.buf);\
}));\
}\
});";
duk_eval_string_noresult(ctx, fromBinary);
#endif
// Polyfill Buffer.from()
duk_get_prop_string(ctx, -1, "Buffer"); // [g][Buffer]
duk_push_c_function(ctx, ILibDuktape_Polyfills_Buffer_from, DUK_VARARGS); // [g][Buffer][func]
duk_put_prop_string(ctx, -2, "from"); // [g][Buffer]
duk_pop(ctx); // [g]
// Polyfill Buffer.alloc() for Node Buffers)
duk_get_prop_string(ctx, -1, "Buffer"); // [g][Buffer]
duk_push_c_function(ctx, ILibDuktape_Polyfills_Buffer_alloc, DUK_VARARGS); // [g][Buffer][func]
duk_put_prop_string(ctx, -2, "alloc"); // [g][Buffer]
duk_pop(ctx); // [g]
// Polyfill Buffer.toString() for Node Buffers
duk_get_prop_string(ctx, -1, "Buffer"); // [g][Buffer]
duk_get_prop_string(ctx, -1, "prototype"); // [g][Buffer][prototype]
duk_push_c_function(ctx, ILibDuktape_Polyfills_Buffer_toString, DUK_VARARGS); // [g][Buffer][prototype][func]
duk_put_prop_string(ctx, -2, "toString"); // [g][Buffer][prototype]
duk_push_c_function(ctx, ILibDuktape_Polyfills_Buffer_randomFill, DUK_VARARGS); // [g][Buffer][prototype][func]
duk_put_prop_string(ctx, -2, "randomFill"); // [g][Buffer][prototype]
duk_pop_2(ctx); // [g]
}
duk_ret_t ILibDuktape_Polyfills_String_startsWith(duk_context *ctx)
{
duk_size_t tokenLen;
char *token = Duktape_GetBuffer(ctx, 0, &tokenLen);
char *buffer;
duk_size_t bufferLen;
duk_push_this(ctx);
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
if (ILibString_StartsWith(buffer, (int)bufferLen, token, (int)tokenLen) != 0)
{
duk_push_true(ctx);
}
else
{
duk_push_false(ctx);
}
return 1;
}
duk_ret_t ILibDuktape_Polyfills_String_endsWith(duk_context *ctx)
{
duk_size_t tokenLen;
char *token = Duktape_GetBuffer(ctx, 0, &tokenLen);
char *buffer;
duk_size_t bufferLen;
duk_push_this(ctx);
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
if (ILibString_EndsWith(buffer, (int)bufferLen, token, (int)tokenLen) != 0)
{
duk_push_true(ctx);
}
else
{
duk_push_false(ctx);
}
return 1;
}
duk_ret_t ILibDuktape_Polyfills_String_padStart(duk_context *ctx)
{
int totalLen = (int)duk_require_int(ctx, 0);
duk_size_t padcharLen;
duk_size_t bufferLen;
char *padchars;
if (duk_get_top(ctx) > 1)
{
padchars = (char*)duk_get_lstring(ctx, 1, &padcharLen);
}
else
{
padchars = " ";
padcharLen = 1;
}
duk_push_this(ctx);
char *buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
if ((int)bufferLen > totalLen)
{
duk_push_lstring(ctx, buffer, bufferLen);
return(1);
}
else
{
duk_size_t needs = totalLen - bufferLen;
duk_push_array(ctx); // [array]
while(needs > 0)
{
if (needs > padcharLen)
{
duk_push_string(ctx, padchars); // [array][pad]
duk_put_prop_index(ctx, -2, (duk_uarridx_t)duk_get_length(ctx, -2)); // [array]
needs -= padcharLen;
}
else
{
duk_push_lstring(ctx, padchars, needs); // [array][pad]
duk_put_prop_index(ctx, -2, (duk_uarridx_t)duk_get_length(ctx, -2)); // [array]
needs = 0;
}
}
duk_push_lstring(ctx, buffer, bufferLen); // [array][pad]
duk_put_prop_index(ctx, -2, (duk_uarridx_t)duk_get_length(ctx, -2)); // [array]
duk_get_prop_string(ctx, -1, "join"); // [array][join]
duk_swap_top(ctx, -2); // [join][this]
duk_push_string(ctx, ""); // [join][this]['']
duk_call_method(ctx, 1); // [result]
return(1);
}
}
duk_ret_t ILibDuktape_Polyfills_Array_includes(duk_context *ctx)
{
duk_push_this(ctx); // [array]
uint32_t count = (uint32_t)duk_get_length(ctx, -1);
uint32_t i;
for (i = 0; i < count; ++i)
{
duk_get_prop_index(ctx, -1, (duk_uarridx_t)i); // [array][val1]
duk_dup(ctx, 0); // [array][val1][val2]
if (duk_equals(ctx, -2, -1))
{
duk_push_true(ctx);
return(1);
}
else
{
duk_pop_2(ctx); // [array]
}
}
duk_push_false(ctx);
return(1);
}
void ILibDuktape_Polyfills_Array(duk_context *ctx)
{
// Polyfill 'Array.includes'
duk_get_prop_string(ctx, -1, "Array"); // [Array]
duk_get_prop_string(ctx, -1, "prototype"); // [Array][proto]
ILibDuktape_CreateProperty_InstanceMethod(ctx, "includes", ILibDuktape_Polyfills_Array_includes, 1);
duk_pop_2(ctx); // ...
}
void ILibDuktape_Polyfills_String(duk_context *ctx)
{
// Polyfill 'String.startsWith'
duk_get_prop_string(ctx, -1, "String"); // [string]
duk_get_prop_string(ctx, -1, "prototype"); // [string][proto]
duk_push_c_function(ctx, ILibDuktape_Polyfills_String_startsWith, DUK_VARARGS); // [string][proto][func]
duk_put_prop_string(ctx, -2, "startsWith"); // [string][proto]
duk_push_c_function(ctx, ILibDuktape_Polyfills_String_endsWith, DUK_VARARGS); // [string][proto][func]
duk_put_prop_string(ctx, -2, "endsWith"); // [string][proto]
duk_push_c_function(ctx, ILibDuktape_Polyfills_String_padStart, DUK_VARARGS); // [string][proto][func]
duk_put_prop_string(ctx, -2, "padStart");
duk_pop_2(ctx);
}
duk_ret_t ILibDuktape_Polyfills_Console_log(duk_context *ctx)
{
int numargs = duk_get_top(ctx);
int i, x;
int len = 0;
duk_size_t strLen;
char *str;
char *PREFIX = NULL;
char *DESTINATION = NULL;
duk_push_current_function(ctx);
ILibDuktape_LogTypes logType = (ILibDuktape_LogTypes)Duktape_GetIntPropertyValue(ctx, -1, "logType", ILibDuktape_LogType_Normal);
switch (logType)
{
case ILibDuktape_LogType_Warn:
PREFIX = (char*)"WARNING: "; // LENGTH MUST BE <= 9
DESTINATION = ILibDuktape_Console_WARN_Destination;
break;
case ILibDuktape_LogType_Error:
PREFIX = (char*)"ERROR: "; // LENGTH MUST BE <= 9
DESTINATION = ILibDuktape_Console_ERROR_Destination;
break;
case ILibDuktape_LogType_Info1:
case ILibDuktape_LogType_Info2:
case ILibDuktape_LogType_Info3:
duk_push_this(ctx);
i = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_Console_INFO_Level, 0);
duk_pop(ctx);
PREFIX = NULL;
if (i >= (((int)logType + 1) - (int)ILibDuktape_LogType_Info1))
{
DESTINATION = ILibDuktape_Console_LOG_Destination;
}
else
{
return(0);
}
break;
default:
PREFIX = NULL;
DESTINATION = ILibDuktape_Console_LOG_Destination;
break;
}
duk_pop(ctx);
// Calculate total length of string
for (i = 0; i < numargs; ++i)
{
if (duk_is_string(ctx, i))
{
len += (i == 0 ? 0 : 2);
duk_get_lstring(ctx, i, &strLen);
len += (int)strLen;
}
else
{
duk_dup(ctx, i);
if (strcmp("[object Object]", duk_to_string(ctx, -1)) == 0)
{
duk_pop(ctx);
duk_dup(ctx, i);
len += (i == 0 ? 1 : 3);
duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY);
int propNum = 0;
while (duk_next(ctx, -1, 1))
{
len += 2;
len += (propNum++ == 0 ? 1 : 2);
duk_to_lstring(ctx, -2, &strLen); len += (int)strLen;
duk_to_lstring(ctx, -1, &strLen); len += (int)strLen;
duk_pop_2(ctx);
}
duk_pop(ctx);
len += 2;
}
else
{
len += (i == 0 ? 0 : 2);
duk_get_lstring(ctx, -1, &strLen); len += (int)strLen;
}
}
}
len += 2; // NULL Terminator and final carriage return
strLen = len;
str = ILibMemory_AllocateA(strLen + ((PREFIX != NULL) ? strnlen_s(PREFIX, 9) : 0));
x = (int)(ILibMemory_AllocateA_Size(str) - strLen);
if (x != 0)
{
strLen += sprintf_s(str, strLen, PREFIX);
}
for (i = 0; i < numargs; ++i)
{
if (duk_is_string(ctx, i))
{
x += sprintf_s(str + x, strLen - x, "%s%s", (i == 0 ? "" : ", "), duk_require_string(ctx, i));
}
else
{
duk_dup(ctx, i);
if (strcmp("[object Object]", duk_to_string(ctx, -1)) == 0)
{
duk_pop(ctx);
duk_dup(ctx, i);
x += sprintf_s(str+x, strLen - x, "%s", (i == 0 ? "{" : ", {"));
duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY);
int propNum = 0;
while (duk_next(ctx, -1, 1))
{
x += sprintf_s(str + x, strLen - x, "%s%s: %s", ((propNum++ == 0) ? " " : ", "), (char*)duk_to_string(ctx, -2), (char*)duk_to_string(ctx, -1));
duk_pop_2(ctx);
}
duk_pop(ctx);
x += sprintf_s(str + x, strLen - x, " }");
}
else
{
x += sprintf_s(str + x, strLen - x, "%s%s", (i == 0 ? "" : ", "), duk_to_string(ctx, -1));
}
}
}
x += sprintf_s(str + x, strLen - x, "\n");
duk_push_this(ctx); // [console]
int dest = Duktape_GetIntPropertyValue(ctx, -1, DESTINATION, ILibDuktape_Console_DestinationFlags_StdOut);
if ((dest & ILibDuktape_Console_DestinationFlags_StdOut) == ILibDuktape_Console_DestinationFlags_StdOut)
{
#ifdef WIN32
DWORD writeLen;
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), (void*)str, x, &writeLen, NULL);
#else
ignore_result(write(STDOUT_FILENO, str, x));
#endif
}
if ((dest & ILibDuktape_Console_DestinationFlags_WebLog) == ILibDuktape_Console_DestinationFlags_WebLog)
{
ILibRemoteLogging_printf(ILibChainGetLogger(Duktape_GetChain(ctx)), ILibRemoteLogging_Modules_Microstack_Generic, ILibRemoteLogging_Flags_VerbosityLevel_1, "%s", str);
}
if ((dest & ILibDuktape_Console_DestinationFlags_ServerConsole) == ILibDuktape_Console_DestinationFlags_ServerConsole)
{
if (duk_peval_string(ctx, "require('MeshAgent');") == 0)
{
duk_get_prop_string(ctx, -1, "SendCommand"); // [console][agent][SendCommand]
duk_swap_top(ctx, -2); // [console][SendCommand][this]
duk_push_object(ctx); // [console][SendCommand][this][options]
duk_push_string(ctx, "msg"); duk_put_prop_string(ctx, -2, "action");
duk_push_string(ctx, "console"); duk_put_prop_string(ctx, -2, "type");
duk_push_string(ctx, str); duk_put_prop_string(ctx, -2, "value");
if (duk_has_prop_string(ctx, -4, ILibDuktape_Console_SessionID))
{
duk_get_prop_string(ctx, -4, ILibDuktape_Console_SessionID);
duk_put_prop_string(ctx, -2, "sessionid");
}
duk_call_method(ctx, 1);
}
}
if ((dest & ILibDuktape_Console_DestinationFlags_LogFile) == ILibDuktape_Console_DestinationFlags_LogFile)
{
duk_size_t pathLen;
char *path;
char *tmp = ILibMemory_AllocateA(x + 32);
int tmpx = ILibGetLocalTime(tmp + 1, (int)ILibMemory_AllocateA_Size(tmp) - 1) + 1;
tmp[0] = '[';
tmp[tmpx] = ']';
tmp[tmpx + 1] = ':';
tmp[tmpx + 2] = ' ';
memcpy_s(tmp + tmpx + 3, ILibMemory_AllocateA_Size(tmp) - tmpx - 3, str, x);
duk_eval_string(ctx, "require('fs');");
duk_get_prop_string(ctx, -1, "writeFileSync"); // [fs][writeFileSync]
duk_swap_top(ctx, -2); // [writeFileSync][this]
duk_push_heapptr(ctx, ILibDuktape_GetProcessObject(ctx)); // [writeFileSync][this][process]
duk_get_prop_string(ctx, -1, "execPath"); // [writeFileSync][this][process][execPath]
path = (char*)duk_get_lstring(ctx, -1, &pathLen);
if (path != NULL)
{
if (ILibString_EndsWithEx(path, (int)pathLen, ".exe", 4, 0))
{
duk_get_prop_string(ctx, -1, "substring"); // [writeFileSync][this][process][execPath][substring]
duk_swap_top(ctx, -2); // [writeFileSync][this][process][substring][this]
duk_push_int(ctx, 0); // [writeFileSync][this][process][substring][this][0]
duk_push_int(ctx, (int)(pathLen - 4)); // [writeFileSync][this][process][substring][this][0][len]
duk_call_method(ctx, 2); // [writeFileSync][this][process][path]
}
duk_get_prop_string(ctx, -1, "concat"); // [writeFileSync][this][process][path][concat]
duk_swap_top(ctx, -2); // [writeFileSync][this][process][concat][this]
duk_push_string(ctx, ".jlog"); // [writeFileSync][this][process][concat][this][.jlog]
duk_call_method(ctx, 1); // [writeFileSync][this][process][logPath]
duk_remove(ctx, -2); // [writeFileSync][this][logPath]
duk_push_string(ctx, tmp); // [writeFileSync][this][logPath][log]
duk_push_object(ctx); // [writeFileSync][this][logPath][log][options]
duk_push_string(ctx, "a"); duk_put_prop_string(ctx, -2, "flags");
duk_call_method(ctx, 3);
}
}
return 0;
}
duk_ret_t ILibDuktape_Polyfills_Console_enableWebLog(duk_context *ctx)
{
#ifdef _REMOTELOGGING
void *chain = Duktape_GetChain(ctx);
int port = duk_require_int(ctx, 0);
duk_size_t pLen;
if (duk_peval_string(ctx, "process.argv0") != 0) { return(ILibDuktape_Error(ctx, "console.enableWebLog(): Couldn't fetch argv0")); }
char *p = (char*)duk_get_lstring(ctx, -1, &pLen);
if (ILibString_EndsWith(p, (int)pLen, ".js", 3) != 0)
{
memcpy_s(ILibScratchPad2, sizeof(ILibScratchPad2), p, pLen - 3);
sprintf_s(ILibScratchPad2 + (pLen - 3), sizeof(ILibScratchPad2) - 3, ".wlg");
}
else if (ILibString_EndsWith(p, (int)pLen, ".exe", 3) != 0)
{
memcpy_s(ILibScratchPad2, sizeof(ILibScratchPad2), p, pLen - 4);
sprintf_s(ILibScratchPad2 + (pLen - 3), sizeof(ILibScratchPad2) - 4, ".wlg");
}
else
{
sprintf_s(ILibScratchPad2, sizeof(ILibScratchPad2), "%s.wlg", p);
}
ILibStartDefaultLoggerEx(chain, (unsigned short)port, ILibScratchPad2);
#endif
return (0);
}
duk_ret_t ILibDuktape_Polyfills_Console_displayStreamPipe_getter(duk_context *ctx)
{
duk_push_int(ctx, g_displayStreamPipeMessages);
return(1);
}
duk_ret_t ILibDuktape_Polyfills_Console_displayStreamPipe_setter(duk_context *ctx)
{
g_displayStreamPipeMessages = duk_require_int(ctx, 0);
return(0);
}
duk_ret_t ILibDuktape_Polyfills_Console_displayFinalizer_getter(duk_context *ctx)
{
duk_push_int(ctx, g_displayFinalizerMessages);
return(1);
}
duk_ret_t ILibDuktape_Polyfills_Console_displayFinalizer_setter(duk_context *ctx)
{
g_displayFinalizerMessages = duk_require_int(ctx, 0);
return(0);
}
duk_ret_t ILibDuktape_Polyfills_Console_logRefCount(duk_context *ctx)
{
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "console"); // [g][console]
duk_get_prop_string(ctx, -1, "log"); // [g][console][log]
duk_swap_top(ctx, -2); // [g][log][this]
duk_push_sprintf(ctx, "Reference Count => %s[%p]:%d\n", Duktape_GetStringPropertyValue(ctx, 0, ILibDuktape_OBJID, "UNKNOWN"), duk_require_heapptr(ctx, 0), ILibDuktape_GetReferenceCount(ctx, 0) - 1);
duk_call_method(ctx, 1);
return(0);
}
duk_ret_t ILibDuktape_Polyfills_Console_setDestination(duk_context *ctx)
{
int nargs = duk_get_top(ctx);
int dest = duk_require_int(ctx, 0);
duk_push_this(ctx); // console
if ((dest & ILibDuktape_Console_DestinationFlags_ServerConsole) == ILibDuktape_Console_DestinationFlags_ServerConsole)
{
// Mesh Server Console
if (duk_peval_string(ctx, "require('MeshAgent');") != 0) { return(ILibDuktape_Error(ctx, "Unable to set destination to Mesh Console ")); }
duk_pop(ctx);
if (nargs > 1)
{
duk_dup(ctx, 1);
duk_put_prop_string(ctx, -2, ILibDuktape_Console_SessionID);
}
else
{
duk_del_prop_string(ctx, -1, ILibDuktape_Console_SessionID);
}
}
duk_dup(ctx, 0);
duk_put_prop_string(ctx, -2, ILibDuktape_Console_Destination);
return(0);
}
duk_ret_t ILibDuktape_Polyfills_Console_setInfoLevel(duk_context *ctx)
{
int val = duk_require_int(ctx, 0);
if (val < 0) { return(ILibDuktape_Error(ctx, "Invalid Info Level: %d", val)); }
duk_push_this(ctx);
duk_push_int(ctx, val);
duk_put_prop_string(ctx, -2, ILibDuktape_Console_INFO_Level);
return(0);
}
duk_ret_t ILibDuktape_Polyfills_Console_rawLog(duk_context *ctx)
{
char *val = (char*)duk_require_string(ctx, 0);
ILIBLOGMESSAGEX("%s", val);
return(0);
}
void ILibDuktape_Polyfills_Console(duk_context *ctx)
{
// Polyfill console.log()
#ifdef WIN32
SetConsoleOutputCP(CP_UTF8);
#endif
if (duk_has_prop_string(ctx, -1, "console"))
{
duk_get_prop_string(ctx, -1, "console"); // [g][console]
}
else
{
duk_push_object(ctx); // [g][console]
duk_dup(ctx, -1); // [g][console][console]
duk_put_prop_string(ctx, -3, "console"); // [g][console]
}
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Normal, "log", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Warn, "warn", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Error, "error", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Info1, "info1", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Info2, "info2", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Info3, "info3", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
ILibDuktape_CreateInstanceMethod(ctx, "rawLog", ILibDuktape_Polyfills_Console_rawLog, 1);
ILibDuktape_CreateInstanceMethod(ctx, "enableWebLog", ILibDuktape_Polyfills_Console_enableWebLog, 1);
ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "displayStreamPipeMessages", ILibDuktape_Polyfills_Console_displayStreamPipe_getter, ILibDuktape_Polyfills_Console_displayStreamPipe_setter);
ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "displayFinalizerMessages", ILibDuktape_Polyfills_Console_displayFinalizer_getter, ILibDuktape_Polyfills_Console_displayFinalizer_setter);
ILibDuktape_CreateInstanceMethod(ctx, "logReferenceCount", ILibDuktape_Polyfills_Console_logRefCount, 1);
ILibDuktape_CreateInstanceMethod(ctx, "setDestination", ILibDuktape_Polyfills_Console_setDestination, DUK_VARARGS);
ILibDuktape_CreateInstanceMethod(ctx, "setInfoLevel", ILibDuktape_Polyfills_Console_setInfoLevel, 1);
duk_push_object(ctx);
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_DISABLED); duk_put_prop_string(ctx, -2, "DISABLED");
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_StdOut); duk_put_prop_string(ctx, -2, "STDOUT");
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_ServerConsole); duk_put_prop_string(ctx, -2, "SERVERCONSOLE");
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_WebLog); duk_put_prop_string(ctx, -2, "WEBLOG");
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_LogFile); duk_put_prop_string(ctx, -2, "LOGFILE");
ILibDuktape_CreateReadonlyProperty(ctx, "Destinations");
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_StdOut | ILibDuktape_Console_DestinationFlags_LogFile);
duk_put_prop_string(ctx, -2, ILibDuktape_Console_ERROR_Destination);
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_StdOut | ILibDuktape_Console_DestinationFlags_LogFile);
duk_put_prop_string(ctx, -2, ILibDuktape_Console_WARN_Destination);
duk_push_int(ctx, 0); duk_put_prop_string(ctx, -2, ILibDuktape_Console_INFO_Level);
duk_pop(ctx); // [g]
}
duk_ret_t ILibDuktape_ntohl(duk_context *ctx)
{
duk_size_t bufferLen;
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
int offset = duk_require_int(ctx, 1);
if ((int)bufferLen < (4 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); }
duk_push_int(ctx, ntohl(((unsigned int*)(buffer + offset))[0]));
return 1;
}
duk_ret_t ILibDuktape_ntohs(duk_context *ctx)
{
duk_size_t bufferLen;
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
int offset = duk_require_int(ctx, 1);
if ((int)bufferLen < 2 + offset) { return(ILibDuktape_Error(ctx, "buffer too small")); }
duk_push_int(ctx, ntohs(((unsigned short*)(buffer + offset))[0]));
return 1;
}
duk_ret_t ILibDuktape_htonl(duk_context *ctx)
{
duk_size_t bufferLen;
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
int offset = duk_require_int(ctx, 1);
unsigned int val = (unsigned int)duk_require_int(ctx, 2);
if ((int)bufferLen < (4 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); }
((unsigned int*)(buffer + offset))[0] = htonl(val);
return 0;
}
duk_ret_t ILibDuktape_htons(duk_context *ctx)
{
duk_size_t bufferLen;
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
int offset = duk_require_int(ctx, 1);
unsigned int val = (unsigned int)duk_require_int(ctx, 2);
if ((int)bufferLen < (2 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); }
((unsigned short*)(buffer + offset))[0] = htons(val);
return 0;
}
void ILibDuktape_Polyfills_byte_ordering(duk_context *ctx)
{
ILibDuktape_CreateInstanceMethod(ctx, "ntohl", ILibDuktape_ntohl, 2);
ILibDuktape_CreateInstanceMethod(ctx, "ntohs", ILibDuktape_ntohs, 2);
ILibDuktape_CreateInstanceMethod(ctx, "htonl", ILibDuktape_htonl, 3);
ILibDuktape_CreateInstanceMethod(ctx, "htons", ILibDuktape_htons, 3);
}
typedef enum ILibDuktape_Timer_Type
{
ILibDuktape_Timer_Type_TIMEOUT = 0,
ILibDuktape_Timer_Type_INTERVAL = 1,
ILibDuktape_Timer_Type_IMMEDIATE = 2
}ILibDuktape_Timer_Type;
typedef struct ILibDuktape_Timer
{
duk_context *ctx;
void *object;
void *callback;
void *args;
int timeout;
ILibDuktape_Timer_Type timerType;
}ILibDuktape_Timer;
duk_ret_t ILibDuktape_Polyfills_timer_finalizer(duk_context *ctx)
{
// Make sure we remove any timers just in case, so we don't leak resources
ILibDuktape_Timer *ptrs;
if (duk_has_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs))
{
duk_get_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs);
if (duk_has_prop_string(ctx, 0, "\xFF_callback"))
{
duk_del_prop_string(ctx, 0, "\xFF_callback");
}
if (duk_has_prop_string(ctx, 0, "\xFF_argArray"))
{
duk_del_prop_string(ctx, 0, "\xFF_argArray");
}
ptrs = (ILibDuktape_Timer*)Duktape_GetBuffer(ctx, -1, NULL);
ILibLifeTime_Remove(ILibGetBaseTimer(Duktape_GetChain(ctx)), ptrs);
}
return 0;
}
void ILibDuktape_Polyfills_timer_elapsed(void *obj)
{
ILibDuktape_Timer *ptrs = (ILibDuktape_Timer*)obj;
int argCount, i;
duk_context *ctx = ptrs->ctx;
char *funcName;
if (!ILibMemory_CanaryOK(ptrs)) { return; }
if (duk_check_stack(ctx, 3) == 0) { return; }
duk_push_heapptr(ctx, ptrs->callback); // [func]
funcName = Duktape_GetStringPropertyValue(ctx, -1, "name", "unknown_method");
duk_push_heapptr(ctx, ptrs->object); // [func][this]
duk_push_heapptr(ctx, ptrs->args); // [func][this][argArray]
if (ptrs->timerType == ILibDuktape_Timer_Type_INTERVAL)
{
ILibLifeTime_AddEx(ILibGetBaseTimer(Duktape_GetChain(ctx)), ptrs, ptrs->timeout, ILibDuktape_Polyfills_timer_elapsed, NULL);
}
else
{
if (ptrs->timerType == ILibDuktape_Timer_Type_IMMEDIATE)
{
duk_push_heap_stash(ctx);
duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object));
duk_pop(ctx);
}
duk_del_prop_string(ctx, -2, "\xFF_callback");
duk_del_prop_string(ctx, -2, "\xFF_argArray");
duk_del_prop_string(ctx, -2, ILibDuktape_Timer_Ptrs);
}
argCount = (int)duk_get_length(ctx, -1);
for (i = 0; i < argCount; ++i)
{
duk_get_prop_index(ctx, -1, i); // [func][this][argArray][arg]
duk_swap_top(ctx, -2); // [func][this][arg][argArray]
}
duk_pop(ctx); // [func][this][...arg...]
if (duk_pcall_method(ctx, argCount) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "timers.onElapsed() callback handler on '%s()' ", funcName); }
duk_pop(ctx); // ...
}
duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx)
{
int nargs = duk_get_top(ctx);
ILibDuktape_Timer *ptrs;
ILibDuktape_Timer_Type timerType;
void *chain = Duktape_GetChain(ctx);
int argx;
duk_push_current_function(ctx);
duk_get_prop_string(ctx, -1, "type");
timerType = (ILibDuktape_Timer_Type)duk_get_int(ctx, -1);
duk_push_object(ctx); //[retVal]
switch (timerType)
{
case ILibDuktape_Timer_Type_IMMEDIATE:
ILibDuktape_WriteID(ctx, "Timers.immediate");
// We're only saving a reference for immediates
duk_push_heap_stash(ctx); //[retVal][stash]
duk_dup(ctx, -2); //[retVal][stash][immediate]
duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); //[retVal][stash]
duk_pop(ctx); //[retVal]
break;
case ILibDuktape_Timer_Type_INTERVAL:
ILibDuktape_WriteID(ctx, "Timers.interval");
break;
case ILibDuktape_Timer_Type_TIMEOUT:
ILibDuktape_WriteID(ctx, "Timers.timeout");
break;
}
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_Polyfills_timer_finalizer);
ptrs = (ILibDuktape_Timer*)Duktape_PushBuffer(ctx, sizeof(ILibDuktape_Timer)); //[retVal][ptrs]
duk_put_prop_string(ctx, -2, ILibDuktape_Timer_Ptrs); //[retVal]
ptrs->ctx = ctx;
ptrs->object = duk_get_heapptr(ctx, -1);
ptrs->timerType = timerType;
ptrs->timeout = timerType == ILibDuktape_Timer_Type_IMMEDIATE ? 0 : (int)duk_require_int(ctx, 1);
ptrs->callback = duk_require_heapptr(ctx, 0);
duk_push_array(ctx); //[retVal][argArray]
for (argx = ILibDuktape_Timer_Type_IMMEDIATE == timerType ? 1 : 2; argx < nargs; ++argx)
{
duk_dup(ctx, argx); //[retVal][argArray][arg]
duk_put_prop_index(ctx, -2, argx - (ILibDuktape_Timer_Type_IMMEDIATE == timerType ? 1 : 2));//[retVal][argArray]
}
ptrs->args = duk_get_heapptr(ctx, -1); //[retVal]
duk_put_prop_string(ctx, -2, "\xFF_argArray");
duk_dup(ctx, 0); //[retVal][callback]
duk_put_prop_string(ctx, -2, "\xFF_callback"); //[retVal]
ILibLifeTime_AddEx(ILibGetBaseTimer(chain), ptrs, ptrs->timeout, ILibDuktape_Polyfills_timer_elapsed, NULL);
return 1;
}
duk_ret_t ILibDuktape_Polyfills_timer_clear(duk_context *ctx)
{
ILibDuktape_Timer *ptrs;
ILibDuktape_Timer_Type timerType;
duk_push_current_function(ctx);
duk_get_prop_string(ctx, -1, "type");
timerType = (ILibDuktape_Timer_Type)duk_get_int(ctx, -1);
if(!duk_has_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs))
{
switch (timerType)
{
case ILibDuktape_Timer_Type_TIMEOUT:
return(ILibDuktape_Error(ctx, "timers.clearTimeout(): Invalid Parameter"));
case ILibDuktape_Timer_Type_INTERVAL:
return(ILibDuktape_Error(ctx, "timers.clearInterval(): Invalid Parameter"));
case ILibDuktape_Timer_Type_IMMEDIATE:
return(ILibDuktape_Error(ctx, "timers.clearImmediate(): Invalid Parameter"));
}
}
duk_get_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs);
ptrs = (ILibDuktape_Timer*)Duktape_GetBuffer(ctx, -1, NULL);
if (ptrs->timerType == ILibDuktape_Timer_Type_IMMEDIATE)
{
duk_push_heap_stash(ctx);
duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object));
duk_pop(ctx);
}
ILibLifeTime_Remove(ILibGetBaseTimer(Duktape_GetChain(ctx)), ptrs);
return 0;
}
void ILibDuktape_Polyfills_timer(duk_context *ctx)
{
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_TIMEOUT, "setTimeout", ILibDuktape_Polyfills_timer_set, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_INTERVAL, "setInterval", ILibDuktape_Polyfills_timer_set, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_IMMEDIATE, "setImmediate", ILibDuktape_Polyfills_timer_set, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_TIMEOUT, "clearTimeout", ILibDuktape_Polyfills_timer_clear, 1);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_INTERVAL, "clearInterval", ILibDuktape_Polyfills_timer_clear, 1);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_IMMEDIATE, "clearImmediate", ILibDuktape_Polyfills_timer_clear, 1);
}
duk_ret_t ILibDuktape_Polyfills_getJSModule(duk_context *ctx)
{
if (ILibDuktape_ModSearch_GetJSModule(ctx, (char*)duk_require_string(ctx, 0)) == 0)
{
return(ILibDuktape_Error(ctx, "getJSModule(): (%s) not found", (char*)duk_require_string(ctx, 0)));
}
return(1);
}
duk_ret_t ILibDuktape_Polyfills_addModule(duk_context *ctx)
{
duk_size_t moduleLen;
char *module = (char*)Duktape_GetBuffer(ctx, 1, &moduleLen);
char *moduleName = (char*)duk_require_string(ctx, 0);
if (ILibDuktape_ModSearch_AddModule(ctx, moduleName, module, (int)moduleLen) != 0)
{
return(ILibDuktape_Error(ctx, "Cannot add module: %s", moduleName));
}
return(0);
}
duk_ret_t ILibDuktape_Polyfills_addModuleObject(duk_context *ctx)
{
void *module = duk_require_heapptr(ctx, 1);
char *moduleName = (char*)duk_require_string(ctx, 0);
ILibDuktape_ModSearch_AddModuleObject(ctx, moduleName, module);
return(0);
}
duk_ret_t ILibDuktape_Queue_Finalizer(duk_context *ctx)
{
duk_get_prop_string(ctx, 0, ILibDuktape_Queue_Ptr);
ILibQueue_Destroy((ILibQueue)duk_get_pointer(ctx, -1));
return(0);
}
duk_ret_t ILibDuktape_Queue_EnQueue(duk_context *ctx)
{
ILibQueue Q;
int i;
int nargs = duk_get_top(ctx);
duk_push_this(ctx); // [queue]
duk_get_prop_string(ctx, -1, ILibDuktape_Queue_Ptr); // [queue][ptr]
Q = (ILibQueue)duk_get_pointer(ctx, -1);
duk_pop(ctx); // [queue]
ILibDuktape_Push_ObjectStash(ctx); // [queue][stash]
duk_push_array(ctx); // [queue][stash][array]
for (i = 0; i < nargs; ++i)
{
duk_dup(ctx, i); // [queue][stash][array][arg]
duk_put_prop_index(ctx, -2, i); // [queue][stash][array]
}
ILibQueue_EnQueue(Q, duk_get_heapptr(ctx, -1));
duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); // [queue][stash]
return(0);
}
duk_ret_t ILibDuktape_Queue_DeQueue(duk_context *ctx)
{
duk_push_current_function(ctx);
duk_get_prop_string(ctx, -1, "peek");
int peek = duk_get_int(ctx, -1);
duk_push_this(ctx); // [Q]
duk_get_prop_string(ctx, -1, ILibDuktape_Queue_Ptr); // [Q][ptr]
ILibQueue Q = (ILibQueue)duk_get_pointer(ctx, -1);
void *h = peek == 0 ? ILibQueue_DeQueue(Q) : ILibQueue_PeekQueue(Q);
if (h == NULL) { return(ILibDuktape_Error(ctx, "Queue is empty")); }
duk_pop(ctx); // [Q]
ILibDuktape_Push_ObjectStash(ctx); // [Q][stash]
duk_push_heapptr(ctx, h); // [Q][stash][array]
int length = (int)duk_get_length(ctx, -1);
int i;
for (i = 0; i < length; ++i)
{
duk_get_prop_index(ctx, -i - 1, i); // [Q][stash][array][args]
}
if (peek == 0) { duk_del_prop_string(ctx, -length - 2, Duktape_GetStashKey(h)); }
return(length);
}
duk_ret_t ILibDuktape_Queue_isEmpty(duk_context *ctx)
{
duk_push_this(ctx);
duk_push_boolean(ctx, ILibQueue_IsEmpty((ILibQueue)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Queue_Ptr)));
return(1);
}
duk_ret_t ILibDuktape_Queue_new(duk_context *ctx)
{
duk_push_object(ctx); // [queue]
duk_push_pointer(ctx, ILibQueue_Create()); // [queue][ptr]
duk_put_prop_string(ctx, -2, ILibDuktape_Queue_Ptr); // [queue]
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_Queue_Finalizer);
ILibDuktape_CreateInstanceMethod(ctx, "enQueue", ILibDuktape_Queue_EnQueue, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "peek", 0, "deQueue", ILibDuktape_Queue_DeQueue, DUK_VARARGS);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "peek", 1, "peekQueue", ILibDuktape_Queue_DeQueue, DUK_VARARGS);
ILibDuktape_CreateInstanceMethod(ctx, "isEmpty", ILibDuktape_Queue_isEmpty, 0);
return(1);
}
void ILibDuktape_Queue_Push(duk_context *ctx, void* chain)
{
duk_push_c_function(ctx, ILibDuktape_Queue_new, 0);
}
typedef struct ILibDuktape_DynamicBuffer_data
{
int start;
int end;
int unshiftBytes;
char *buffer;
int bufferLen;
}ILibDuktape_DynamicBuffer_data;
typedef struct ILibDuktape_DynamicBuffer_ContextSwitchData
{
void *chain;
void *heapptr;
ILibDuktape_DuplexStream *stream;
ILibDuktape_DynamicBuffer_data *data;
int bufferLen;
char buffer[];
}ILibDuktape_DynamicBuffer_ContextSwitchData;
ILibTransport_DoneState ILibDuktape_DynamicBuffer_WriteSink(ILibDuktape_DuplexStream *stream, char *buffer, int bufferLen, void *user);
void ILibDuktape_DynamicBuffer_WriteSink_ChainThread(void *chain, void *user)
{
ILibDuktape_DynamicBuffer_ContextSwitchData *data = (ILibDuktape_DynamicBuffer_ContextSwitchData*)user;
if(ILibMemory_CanaryOK(data->stream))
{
ILibDuktape_DynamicBuffer_WriteSink(data->stream, data->buffer, data->bufferLen, data->data);
ILibDuktape_DuplexStream_Ready(data->stream);
}
free(user);
}
ILibTransport_DoneState ILibDuktape_DynamicBuffer_WriteSink(ILibDuktape_DuplexStream *stream, char *buffer, int bufferLen, void *user)
{
ILibDuktape_DynamicBuffer_data *data = (ILibDuktape_DynamicBuffer_data*)user;
if (ILibIsRunningOnChainThread(stream->readableStream->chain) == 0)
{
ILibDuktape_DynamicBuffer_ContextSwitchData *tmp = (ILibDuktape_DynamicBuffer_ContextSwitchData*)ILibMemory_Allocate(sizeof(ILibDuktape_DynamicBuffer_ContextSwitchData) + bufferLen, 0, NULL, NULL);
tmp->chain = stream->readableStream->chain;
tmp->heapptr = stream->ParentObject;
tmp->stream = stream;
tmp->data = data;
tmp->bufferLen = bufferLen;
memcpy_s(tmp->buffer, bufferLen, buffer, bufferLen);
Duktape_RunOnEventLoop(tmp->chain, duk_ctx_nonce(stream->readableStream->ctx), stream->readableStream->ctx, ILibDuktape_DynamicBuffer_WriteSink_ChainThread, NULL, tmp);
return(ILibTransport_DoneState_INCOMPLETE);
}
if ((data->bufferLen - data->start - data->end) < bufferLen)
{
if (data->end > 0)
{
// Move the buffer first
memmove_s(data->buffer, data->bufferLen, data->buffer + data->start, data->end);
data->start = 0;
}
if ((data->bufferLen - data->end) < bufferLen)
{
// Need to resize buffer first
int tmpSize = data->bufferLen;
while ((tmpSize - data->end) < bufferLen)
{
tmpSize += 4096;
}
if ((data->buffer = (char*)realloc(data->buffer, tmpSize)) == NULL) { ILIBCRITICALEXIT(254); }
data->bufferLen = tmpSize;
}
}
memcpy_s(data->buffer + data->start + data->end, data->bufferLen - data->start - data->end, buffer, bufferLen);
data->end += bufferLen;
int unshifted = 0;
do
{
duk_push_heapptr(stream->readableStream->ctx, stream->ParentObject); // [ds]
duk_get_prop_string(stream->readableStream->ctx, -1, "emit"); // [ds][emit]
duk_swap_top(stream->readableStream->ctx, -2); // [emit][this]
duk_push_string(stream->readableStream->ctx, "readable"); // [emit][this][readable]
if (duk_pcall_method(stream->readableStream->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(stream->readableStream->ctx, "DynamicBuffer.WriteSink => readable(): "); }
duk_pop(stream->readableStream->ctx); // ...
ILibDuktape_DuplexStream_WriteData(stream, data->buffer + data->start, data->end);
if (data->unshiftBytes == 0)
{
// All the data was consumed
data->start = data->end = 0;
}
else
{
unshifted = (data->end - data->unshiftBytes);
if (unshifted > 0)
{
data->start += unshifted;
data->end = data->unshiftBytes;
data->unshiftBytes = 0;
}
}
} while (unshifted != 0);
return(ILibTransport_DoneState_COMPLETE);
}
void ILibDuktape_DynamicBuffer_EndSink(ILibDuktape_DuplexStream *stream, void *user)
{
ILibDuktape_DuplexStream_WriteEnd(stream);
}
duk_ret_t ILibDuktape_DynamicBuffer_Finalizer(duk_context *ctx)
{
duk_get_prop_string(ctx, 0, "\xFF_buffer");
ILibDuktape_DynamicBuffer_data *data = (ILibDuktape_DynamicBuffer_data*)Duktape_GetBuffer(ctx, -1, NULL);
free(data->buffer);
return(0);
}
int ILibDuktape_DynamicBuffer_unshift(ILibDuktape_DuplexStream *sender, int unshiftBytes, void *user)
{
ILibDuktape_DynamicBuffer_data *data = (ILibDuktape_DynamicBuffer_data*)user;
data->unshiftBytes = unshiftBytes;
return(unshiftBytes);
}
duk_ret_t ILibDuktape_DynamicBuffer_read(duk_context *ctx)
{
ILibDuktape_DynamicBuffer_data *data;
duk_push_this(ctx); // [DynamicBuffer]
duk_get_prop_string(ctx, -1, "\xFF_buffer"); // [DynamicBuffer][buffer]
data = (ILibDuktape_DynamicBuffer_data*)Duktape_GetBuffer(ctx, -1, NULL);
duk_push_external_buffer(ctx); // [DynamicBuffer][buffer][extBuffer]
duk_config_buffer(ctx, -1, data->buffer + data->start, data->bufferLen - (data->start + data->end));
duk_push_buffer_object(ctx, -1, 0, data->bufferLen - (data->start + data->end), DUK_BUFOBJ_NODEJS_BUFFER);
return(1);
}
duk_ret_t ILibDuktape_DynamicBuffer_new(duk_context *ctx)
{
ILibDuktape_DynamicBuffer_data *data;
int initSize = 4096;
if (duk_get_top(ctx) != 0)
{
initSize = duk_require_int(ctx, 0);
}
duk_push_object(ctx); // [stream]
duk_push_fixed_buffer(ctx, sizeof(ILibDuktape_DynamicBuffer_data));
data = (ILibDuktape_DynamicBuffer_data*)Duktape_GetBuffer(ctx, -1, NULL);
memset(data, 0, sizeof(ILibDuktape_DynamicBuffer_data));
duk_put_prop_string(ctx, -2, "\xFF_buffer");
data->bufferLen = initSize;
data->buffer = (char*)malloc(initSize);
ILibDuktape_DuplexStream_InitEx(ctx, ILibDuktape_DynamicBuffer_WriteSink, ILibDuktape_DynamicBuffer_EndSink, NULL, NULL, ILibDuktape_DynamicBuffer_unshift, data);
ILibDuktape_EventEmitter_CreateEventEx(ILibDuktape_EventEmitter_GetEmitter(ctx, -1), "readable");
ILibDuktape_CreateInstanceMethod(ctx, "read", ILibDuktape_DynamicBuffer_read, DUK_VARARGS);
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_DynamicBuffer_Finalizer);
return(1);
}
void ILibDuktape_DynamicBuffer_Push(duk_context *ctx, void *chain)
{
duk_push_c_function(ctx, ILibDuktape_DynamicBuffer_new, DUK_VARARGS);
}
duk_ret_t ILibDuktape_Polyfills_debugCrash(duk_context *ctx)
{
void *p = NULL;
((int*)p)[0] = 55;
return(0);
}
void ILibDuktape_Stream_PauseSink(struct ILibDuktape_readableStream *sender, void *user)
{
}
void ILibDuktape_Stream_ResumeSink(struct ILibDuktape_readableStream *sender, void *user)
{
int skip = 0;
duk_size_t bufferLen;
duk_push_heapptr(sender->ctx, sender->object); // [stream]
void *func = Duktape_GetHeapptrProperty(sender->ctx, -1, "_read");
duk_pop(sender->ctx); // ...
while (func != NULL && sender->paused == 0)
{
duk_push_heapptr(sender->ctx, sender->object); // [this]
if (!skip && duk_has_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer))
{
duk_get_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer); // [this][buffer]
if ((bufferLen = duk_get_length(sender->ctx, -1)) > 0)
{
// Buffer is not empty, so we need to 'PUSH' it
duk_get_prop_string(sender->ctx, -2, "push"); // [this][buffer][push]
duk_dup(sender->ctx, -3); // [this][buffer][push][this]
duk_dup(sender->ctx, -3); // [this][buffer][push][this][buffer]
duk_remove(sender->ctx, -4); // [this][push][this][buffer]
duk_call_method(sender->ctx, 1); // [this][boolean]
sender->paused = !duk_get_boolean(sender->ctx, -1);
duk_pop(sender->ctx); // [this]
if (duk_has_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer))
{
duk_get_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer); // [this][buffer]
if (duk_get_length(sender->ctx, -1) == bufferLen)
{
// All the data was unshifted
skip = !sender->paused;
}
duk_pop(sender->ctx); // [this]
}
duk_pop(sender->ctx); // ...
}
else
{
// Buffer is empty
duk_pop(sender->ctx); // [this]
duk_del_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer);
duk_pop(sender->ctx); // ...
}
}
else
{
// We need to 'read' more data
duk_push_heapptr(sender->ctx, func); // [this][read]
duk_swap_top(sender->ctx, -2); // [read][this]
if (duk_pcall_method(sender->ctx, 0) != 0) { ILibDuktape_Process_UncaughtException(sender->ctx); duk_pop(sender->ctx); break; }
// // [buffer]
duk_push_heapptr(sender->ctx, sender->object); // [buffer][this]
duk_swap_top(sender->ctx, -2); // [this][buffer]
if (duk_has_prop_string(sender->ctx, -2, ILibDuktape_Stream_Buffer))
{
duk_push_global_object(sender->ctx); // [this][buffer][g]
duk_get_prop_string(sender->ctx, -1, "Buffer"); // [this][buffer][g][Buffer]
duk_remove(sender->ctx, -2); // [this][buffer][Buffer]
duk_get_prop_string(sender->ctx, -1, "concat"); // [this][buffer][Buffer][concat]
duk_swap_top(sender->ctx, -2); // [this][buffer][concat][this]
duk_push_array(sender->ctx); // [this][buffer][concat][this][Array]
duk_get_prop_string(sender->ctx, -1, "push"); // [this][buffer][concat][this][Array][push]
duk_dup(sender->ctx, -2); // [this][buffer][concat][this][Array][push][this]
duk_get_prop_string(sender->ctx, -7, ILibDuktape_Stream_Buffer); // [this][buffer][concat][this][Array][push][this][buffer]
duk_call_method(sender->ctx, 1); duk_pop(sender->ctx); // [this][buffer][concat][this][Array]
duk_get_prop_string(sender->ctx, -1, "push"); // [this][buffer][concat][this][Array][push]
duk_dup(sender->ctx, -2); // [this][buffer][concat][this][Array][push][this]
duk_dup(sender->ctx, -6); // [this][buffer][concat][this][Array][push][this][buffer]
duk_remove(sender->ctx, -7); // [this][concat][this][Array][push][this][buffer]
duk_call_method(sender->ctx, 1); duk_pop(sender->ctx); // [this][concat][this][Array]
duk_call_method(sender->ctx, 1); // [this][buffer]
}
duk_put_prop_string(sender->ctx, -2, ILibDuktape_Stream_Buffer); // [this]
duk_pop(sender->ctx); // ...
skip = 0;
}
}
}
int ILibDuktape_Stream_UnshiftSink(struct ILibDuktape_readableStream *sender, int unshiftBytes, void *user)
{
duk_push_fixed_buffer(sender->ctx, unshiftBytes); // [buffer]
memcpy_s(Duktape_GetBuffer(sender->ctx, -1, NULL), unshiftBytes, sender->unshiftReserved, unshiftBytes);
duk_push_heapptr(sender->ctx, sender->object); // [buffer][stream]
duk_push_buffer_object(sender->ctx, -2, 0, unshiftBytes, DUK_BUFOBJ_NODEJS_BUFFER); // [buffer][stream][buffer]
duk_put_prop_string(sender->ctx, -2, ILibDuktape_Stream_Buffer); // [buffer][stream]
duk_pop_2(sender->ctx); // ...
return(unshiftBytes);
}
duk_ret_t ILibDuktape_Stream_Push(duk_context *ctx)
{
duk_push_this(ctx); // [stream]
ILibDuktape_readableStream *RS = (ILibDuktape_readableStream*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Stream_ReadablePtr);
duk_size_t bufferLen;
char *buffer = (char*)Duktape_GetBuffer(ctx, 0, &bufferLen);
if (buffer != NULL)
{
duk_push_boolean(ctx, !ILibDuktape_readableStream_WriteDataEx(RS, 0, buffer, (int)bufferLen)); // [stream][buffer][retVal]
}
else
{
ILibDuktape_readableStream_WriteEnd(RS);
duk_push_false(ctx);
}
return(1);
}
duk_ret_t ILibDuktape_Stream_EndSink(duk_context *ctx)
{
duk_push_this(ctx); // [stream]
ILibDuktape_readableStream *RS = (ILibDuktape_readableStream*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Stream_ReadablePtr);
ILibDuktape_readableStream_WriteEnd(RS);
return(0);
}
duk_ret_t ILibDuktape_Stream_readonlyError(duk_context *ctx)
{
duk_push_current_function(ctx);
duk_size_t len;
char *propName = Duktape_GetStringPropertyValueEx(ctx, -1, "propName", "<unknown>", &len);
duk_push_lstring(ctx, propName, len);
duk_get_prop_string(ctx, -1, "concat"); // [string][concat]
duk_swap_top(ctx, -2); // [concat][this]
duk_push_string(ctx, " is readonly"); // [concat][this][str]
duk_call_method(ctx, 1); // [str]
duk_throw(ctx);
return(0);
}
duk_idx_t ILibDuktape_Stream_newReadable(duk_context *ctx)
{
ILibDuktape_readableStream *RS;
duk_push_object(ctx); // [Readable]
ILibDuktape_WriteID(ctx, "stream.readable");
RS = ILibDuktape_ReadableStream_InitEx(ctx, ILibDuktape_Stream_PauseSink, ILibDuktape_Stream_ResumeSink, ILibDuktape_Stream_UnshiftSink, NULL);
RS->paused = 1;
duk_push_pointer(ctx, RS);
duk_put_prop_string(ctx, -2, ILibDuktape_Stream_ReadablePtr);
ILibDuktape_CreateInstanceMethod(ctx, "push", ILibDuktape_Stream_Push, DUK_VARARGS);
ILibDuktape_EventEmitter_AddOnceEx3(ctx, -1, "end", ILibDuktape_Stream_EndSink);
if (duk_is_object(ctx, 0))
{
void *h = Duktape_GetHeapptrProperty(ctx, 0, "read");
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_read"); }
else
{
ILibDuktape_CreateEventWithSetterEx(ctx, "_read", ILibDuktape_Stream_readonlyError);
}
}
return(1);
}
duk_ret_t ILibDuktape_Stream_Writable_WriteSink_Flush(duk_context *ctx)
{
duk_push_current_function(ctx);
ILibTransport_DoneState *retVal = (ILibTransport_DoneState*)Duktape_GetPointerProperty(ctx, -1, "retval");
if (retVal != NULL)
{
*retVal = ILibTransport_DoneState_COMPLETE;
}
else
{
ILibDuktape_WritableStream *WS = (ILibDuktape_WritableStream*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Stream_WritablePtr);
ILibDuktape_WritableStream_Ready(WS);
}
return(0);
}
ILibTransport_DoneState ILibDuktape_Stream_Writable_WriteSink(struct ILibDuktape_WritableStream *stream, char *buffer, int bufferLen, void *user)
{
void *h;
ILibTransport_DoneState retVal = ILibTransport_DoneState_INCOMPLETE;
duk_push_this(stream->ctx); // [writable]
duk_get_prop_string(stream->ctx, -1, "_write"); // [writable][_write]
duk_swap_top(stream->ctx, -2); // [_write][this]
if (stream->Reserved == 0)
{
duk_push_external_buffer(stream->ctx); // [_write][this][extBuffer]
duk_insert(stream->ctx, -3); // [extBuffer][_write][this]
duk_config_buffer(stream->ctx, -3, buffer, (duk_size_t)bufferLen);
duk_push_buffer_object(stream->ctx, -3, 0, (duk_size_t)bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);// [extBuffer][_write][this][buffer]
}
else
{
duk_push_lstring(stream->ctx, buffer, (duk_size_t)bufferLen); // [_write][this][string]
}
duk_push_c_function(stream->ctx, ILibDuktape_Stream_Writable_WriteSink_Flush, DUK_VARARGS); // [_write][this][string/buffer][callback]
h = duk_get_heapptr(stream->ctx, -1);
duk_push_heap_stash(stream->ctx); // [_write][this][string/buffer][callback][stash]
duk_dup(stream->ctx, -2); // [_write][this][string/buffer][callback][stash][callback]
duk_put_prop_string(stream->ctx, -2, Duktape_GetStashKey(h)); // [_write][this][string/buffer][callback][stash]
duk_pop(stream->ctx); // [_write][this][string/buffer][callback]
duk_push_pointer(stream->ctx, stream); duk_put_prop_string(stream->ctx, -2, ILibDuktape_Stream_WritablePtr);
duk_push_pointer(stream->ctx, &retVal); // [_write][this][string/buffer][callback][retval]
duk_put_prop_string(stream->ctx, -2, "retval"); // [_write][this][string/buffer][callback]
if (duk_pcall_method(stream->ctx, 2) != 0)
{
ILibDuktape_Process_UncaughtExceptionEx(stream->ctx, "stream.writable.write(): "); retVal = ILibTransport_DoneState_ERROR;
}
else
{
retVal = duk_to_boolean(stream->ctx, -1) ? ILibTransport_DoneState_COMPLETE : ILibTransport_DoneState_INCOMPLETE;
}
duk_pop(stream->ctx); // ...
duk_push_heapptr(stream->ctx, h); // [callback]
duk_del_prop_string(stream->ctx, -1, "retval");
duk_pop(stream->ctx); // ...
duk_push_heap_stash(stream->ctx);
duk_del_prop_string(stream->ctx, -1, Duktape_GetStashKey(h));
duk_pop(stream->ctx);
return(retVal);
}
duk_ret_t ILibDuktape_Stream_Writable_EndSink_finish(duk_context *ctx)
{
duk_push_current_function(ctx);
ILibDuktape_WritableStream *ws = (ILibDuktape_WritableStream*)Duktape_GetPointerProperty(ctx, -1, "ptr");
if (ILibMemory_CanaryOK(ws))
{
ILibDuktape_WritableStream_Finish(ws);
}
return(0);
}
void ILibDuktape_Stream_Writable_EndSink(struct ILibDuktape_WritableStream *stream, void *user)
{
duk_push_this(stream->ctx); // [writable]
duk_get_prop_string(stream->ctx, -1, "_final"); // [writable][_final]
duk_swap_top(stream->ctx, -2); // [_final][this]
duk_push_c_function(stream->ctx, ILibDuktape_Stream_Writable_EndSink_finish, 0); // [_final][this][callback]
duk_push_pointer(stream->ctx, stream); duk_put_prop_string(stream->ctx, -2, "ptr");
if (duk_pcall_method(stream->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(stream->ctx, "stream.writable._final(): "); }
duk_pop(stream->ctx); // ...
}
duk_ret_t ILibDuktape_Stream_newWritable(duk_context *ctx)
{
ILibDuktape_WritableStream *WS;
duk_push_object(ctx); // [Writable]
ILibDuktape_WriteID(ctx, "stream.writable");
WS = ILibDuktape_WritableStream_Init(ctx, ILibDuktape_Stream_Writable_WriteSink, ILibDuktape_Stream_Writable_EndSink, NULL);
WS->JSCreated = 1;
duk_push_pointer(ctx, WS);
duk_put_prop_string(ctx, -2, ILibDuktape_Stream_WritablePtr);
if (duk_is_object(ctx, 0))
{
void *h = Duktape_GetHeapptrProperty(ctx, 0, "write");
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_write"); }
h = Duktape_GetHeapptrProperty(ctx, 0, "final");
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_final"); }
}
return(1);
}
void ILibDuktape_Stream_Duplex_PauseSink(ILibDuktape_DuplexStream *stream, void *user)
{
ILibDuktape_Stream_PauseSink(stream->readableStream, user);
}
void ILibDuktape_Stream_Duplex_ResumeSink(ILibDuktape_DuplexStream *stream, void *user)
{
ILibDuktape_Stream_ResumeSink(stream->readableStream, user);
}
int ILibDuktape_Stream_Duplex_UnshiftSink(ILibDuktape_DuplexStream *stream, int unshiftBytes, void *user)
{
return(ILibDuktape_Stream_UnshiftSink(stream->readableStream, unshiftBytes, user));
}
ILibTransport_DoneState ILibDuktape_Stream_Duplex_WriteSink(ILibDuktape_DuplexStream *stream, char *buffer, int bufferLen, void *user)
{
return(ILibDuktape_Stream_Writable_WriteSink(stream->writableStream, buffer, bufferLen, user));
}
void ILibDuktape_Stream_Duplex_EndSink(ILibDuktape_DuplexStream *stream, void *user)
{
ILibDuktape_Stream_Writable_EndSink(stream->writableStream, user);
}
duk_ret_t ILibDuktape_Stream_newDuplex(duk_context *ctx)
{
ILibDuktape_DuplexStream *DS;
duk_push_object(ctx); // [Duplex]
ILibDuktape_WriteID(ctx, "stream.Duplex");
DS = ILibDuktape_DuplexStream_InitEx(ctx, ILibDuktape_Stream_Duplex_WriteSink, ILibDuktape_Stream_Duplex_EndSink, ILibDuktape_Stream_Duplex_PauseSink, ILibDuktape_Stream_Duplex_ResumeSink, ILibDuktape_Stream_Duplex_UnshiftSink, NULL);
DS->writableStream->JSCreated = 1;
duk_push_pointer(ctx, DS->writableStream);
duk_put_prop_string(ctx, -2, ILibDuktape_Stream_WritablePtr);
duk_push_pointer(ctx, DS->readableStream);
duk_put_prop_string(ctx, -2, ILibDuktape_Stream_ReadablePtr);
ILibDuktape_CreateInstanceMethod(ctx, "push", ILibDuktape_Stream_Push, DUK_VARARGS);
ILibDuktape_EventEmitter_AddOnceEx3(ctx, -1, "end", ILibDuktape_Stream_EndSink);
if (duk_is_object(ctx, 0))
{
void *h = Duktape_GetHeapptrProperty(ctx, 0, "write");
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_write"); }
else
{
ILibDuktape_CreateEventWithSetterEx(ctx, "_write", ILibDuktape_Stream_readonlyError);
}
h = Duktape_GetHeapptrProperty(ctx, 0, "final");
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_final"); }
else
{
ILibDuktape_CreateEventWithSetterEx(ctx, "_final", ILibDuktape_Stream_readonlyError);
}
h = Duktape_GetHeapptrProperty(ctx, 0, "read");
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_read"); }
else
{
ILibDuktape_CreateEventWithSetterEx(ctx, "_read", ILibDuktape_Stream_readonlyError);
}
}
return(1);
}
void ILibDuktape_Stream_Init(duk_context *ctx, void *chain)
{
duk_push_object(ctx); // [stream
ILibDuktape_WriteID(ctx, "stream");
ILibDuktape_CreateInstanceMethod(ctx, "Readable", ILibDuktape_Stream_newReadable, DUK_VARARGS);
ILibDuktape_CreateInstanceMethod(ctx, "Writable", ILibDuktape_Stream_newWritable, DUK_VARARGS);
ILibDuktape_CreateInstanceMethod(ctx, "Duplex", ILibDuktape_Stream_newDuplex, DUK_VARARGS);
}
void ILibDuktape_Polyfills_debugGC2(duk_context *ctx, void ** args, int argsLen)
{
if (duk_ctx_is_alive((duk_context*)args[1]) && duk_ctx_is_valid((uintptr_t)args[2], ctx) && duk_ctx_shutting_down(ctx)==0)
{
if (g_displayFinalizerMessages) { printf("=> GC();\n"); }
duk_gc(ctx, 0);
}
}
duk_ret_t ILibDuktape_Polyfills_debugGC(duk_context *ctx)
{
ILibDuktape_Immediate(ctx, (void*[]) { Duktape_GetChain(ctx), ctx, (void*)duk_ctx_nonce(ctx), NULL }, 3, ILibDuktape_Polyfills_debugGC2);
return(0);
}
duk_ret_t ILibDuktape_Polyfills_debug(duk_context *ctx)
{
#ifdef WIN32
if (IsDebuggerPresent()) { __debugbreak(); }
#elif defined(_POSIX)
raise(SIGTRAP);
#endif
return(0);
}
#ifndef MICROSTACK_NOTLS
duk_ret_t ILibDuktape_PKCS7_getSignedDataBlock(duk_context *ctx)
{
char *hash = ILibMemory_AllocateA(UTIL_SHA256_HASHSIZE);
char *pkeyHash = ILibMemory_AllocateA(UTIL_SHA256_HASHSIZE);
unsigned int size, r;
BIO *out = NULL;
PKCS7 *message = NULL;
char* data2 = NULL;
STACK_OF(X509) *st = NULL;
duk_size_t bufferLen;
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
message = d2i_PKCS7(NULL, (const unsigned char**)&buffer, (long)bufferLen);
if (message == NULL) { return(ILibDuktape_Error(ctx, "PKCS7 Error")); }
// Lets rebuild the original message and check the size
size = i2d_PKCS7(message, NULL);
if (size < (unsigned int)bufferLen) { PKCS7_free(message); return(ILibDuktape_Error(ctx, "PKCS7 Error")); }
out = BIO_new(BIO_s_mem());
// Check the PKCS7 signature, but not the certificate chain.
r = PKCS7_verify(message, NULL, NULL, NULL, out, PKCS7_NOVERIFY);
if (r == 0) { PKCS7_free(message); BIO_free(out); return(ILibDuktape_Error(ctx, "PKCS7 Verify Error")); }
// If data block contains less than 32 bytes, fail.
size = (unsigned int)BIO_get_mem_data(out, &data2);
if (size <= ILibMemory_AllocateA_Size(hash)) { PKCS7_free(message); BIO_free(out); return(ILibDuktape_Error(ctx, "PKCS7 Size Mismatch Error")); }
duk_push_object(ctx); // [val]
duk_push_fixed_buffer(ctx, size); // [val][fbuffer]
duk_dup(ctx, -1); // [val][fbuffer][dup]
duk_put_prop_string(ctx, -3, "\xFF_fixedbuffer"); // [val][fbuffer]
duk_swap_top(ctx, -2); // [fbuffer][val]
duk_push_buffer_object(ctx, -2, 0, size, DUK_BUFOBJ_NODEJS_BUFFER); // [fbuffer][val][buffer]
ILibDuktape_CreateReadonlyProperty(ctx, "data"); // [fbuffer][val]
memcpy_s(Duktape_GetBuffer(ctx, -2, NULL), size, data2, size);
// Get the certificate signer
st = PKCS7_get0_signers(message, NULL, PKCS7_NOVERIFY);
// Get a full certificate hash of the signer
X509_digest(sk_X509_value(st, 0), EVP_sha256(), (unsigned char*)hash, NULL);
X509_pubkey_digest(sk_X509_value(st, 0), EVP_sha256(), (unsigned char*)pkeyHash, NULL);
sk_X509_free(st);
// Check certificate hash with first 32 bytes of data.
if (memcmp(hash, Duktape_GetBuffer(ctx, -2, NULL), ILibMemory_AllocateA_Size(hash)) != 0) { PKCS7_free(message); BIO_free(out); return(ILibDuktape_Error(ctx, "PKCS7 Certificate Hash Mismatch Error")); }
char *tmp = ILibMemory_AllocateA(1 + (ILibMemory_AllocateA_Size(hash) * 2));
util_tohex(hash, (int)ILibMemory_AllocateA_Size(hash), tmp);
duk_push_object(ctx); // [fbuffer][val][cert]
ILibDuktape_WriteID(ctx, "certificate");
duk_push_string(ctx, tmp); // [fbuffer][val][cert][fingerprint]
ILibDuktape_CreateReadonlyProperty(ctx, "fingerprint"); // [fbuffer][val][cert]
util_tohex(pkeyHash, (int)ILibMemory_AllocateA_Size(pkeyHash), tmp);
duk_push_string(ctx, tmp); // [fbuffer][val][cert][publickeyhash]
ILibDuktape_CreateReadonlyProperty(ctx, "publicKeyHash"); // [fbuffer][val][cert]
ILibDuktape_CreateReadonlyProperty(ctx, "signingCertificate"); // [fbuffer][val]
// Approved, cleanup and return.
BIO_free(out);
PKCS7_free(message);
return(1);
}
duk_ret_t ILibDuktape_PKCS7_signDataBlockFinalizer(duk_context *ctx)
{
char *buffer = Duktape_GetPointerProperty(ctx, 0, "\xFF_signature");
if (buffer != NULL) { free(buffer); }
return(0);
}
duk_ret_t ILibDuktape_PKCS7_signDataBlock(duk_context *ctx)
{
duk_get_prop_string(ctx, 1, "secureContext");
duk_get_prop_string(ctx, -1, "\xFF_SecureContext2CertBuffer");
struct util_cert *cert = (struct util_cert*)Duktape_GetBuffer(ctx, -1, NULL);
duk_size_t bufferLen;
char *buffer = (char*)Duktape_GetBuffer(ctx, 0, &bufferLen);
BIO *in = NULL;
PKCS7 *message = NULL;
char *signature = NULL;
int signatureLength = 0;
// Sign the block
in = BIO_new_mem_buf(buffer, (int)bufferLen);
message = PKCS7_sign(cert->x509, cert->pkey, NULL, in, PKCS7_BINARY);
if (message != NULL)
{
signatureLength = i2d_PKCS7(message, (unsigned char**)&signature);
PKCS7_free(message);
}
if (in != NULL) BIO_free(in);
if (signatureLength <= 0) { return(ILibDuktape_Error(ctx, "PKCS7_signDataBlockError: ")); }
duk_push_external_buffer(ctx);
duk_config_buffer(ctx, -1, signature, signatureLength);
duk_push_buffer_object(ctx, -1, 0, signatureLength, DUK_BUFOBJ_NODEJS_BUFFER);
duk_push_pointer(ctx, signature);
duk_put_prop_string(ctx, -2, "\xFF_signature");
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_PKCS7_signDataBlockFinalizer);
return(1);
}
void ILibDuktape_PKCS7_Push(duk_context *ctx, void *chain)
{
duk_push_object(ctx);
ILibDuktape_CreateInstanceMethod(ctx, "getSignedDataBlock", ILibDuktape_PKCS7_getSignedDataBlock, 1);
ILibDuktape_CreateInstanceMethod(ctx, "signDataBlock", ILibDuktape_PKCS7_signDataBlock, DUK_VARARGS);
}
extern uint32_t crc32c(uint32_t crc, const unsigned char* buf, uint32_t len);
duk_ret_t ILibDuktape_Polyfills_crc32c(duk_context *ctx)
{
duk_size_t len;
char *buffer = Duktape_GetBuffer(ctx, 0, &len);
duk_push_uint(ctx, crc32c(0, (unsigned char*)buffer, (uint32_t)len));
return(1);
}
#endif
duk_ret_t ILibDuktape_Polyfills_Object_hashCode(duk_context *ctx)
{
duk_push_this(ctx);
duk_push_string(ctx, Duktape_GetStashKey(duk_get_heapptr(ctx, -1)));
return(1);
}
duk_ret_t ILibDuktape_Polyfills_Array_peek(duk_context *ctx)
{
duk_push_this(ctx); // [Array]
duk_get_prop_index(ctx, -1, (duk_uarridx_t)duk_get_length(ctx, -1) - 1);
return(1);
}
void ILibDuktape_Polyfills_object(duk_context *ctx)
{
// Polyfill Object._hashCode()
duk_get_prop_string(ctx, -1, "Object"); // [g][Object]
duk_get_prop_string(ctx, -1, "prototype"); // [g][Object][prototype]
duk_push_c_function(ctx, ILibDuktape_Polyfills_Object_hashCode, 0); // [g][Object][prototype][func]
ILibDuktape_CreateReadonlyProperty(ctx, "_hashCode"); // [g][Object][prototype]
duk_pop_2(ctx); // [g]
duk_get_prop_string(ctx, -1, "Array"); // [g][Array]
duk_get_prop_string(ctx, -1, "prototype"); // [g][Array][prototype]
duk_push_c_function(ctx, ILibDuktape_Polyfills_Array_peek, 0); // [g][Array][prototype][peek]
ILibDuktape_CreateReadonlyProperty(ctx, "peek"); // [g][Array][prototype]
duk_pop_2(ctx); // [g]
}
#ifndef MICROSTACK_NOTLS
void ILibDuktape_bignum_addBigNumMethods(duk_context *ctx, BIGNUM *b);
duk_ret_t ILibDuktape_bignum_toString(duk_context *ctx)
{
duk_push_this(ctx);
BIGNUM *b = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
if (b != NULL)
{
char *numstr = BN_bn2dec(b);
duk_push_string(ctx, numstr);
OPENSSL_free(numstr);
return(1);
}
else
{
return(ILibDuktape_Error(ctx, "Invalid BIGNUM"));
}
}
duk_ret_t ILibDuktape_bignum_add(duk_context* ctx)
{
BIGNUM *ret = BN_new();
BIGNUM *r1, *r2;
duk_push_this(ctx);
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
BN_add(ret, r1, r2);
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
return(1);
}
duk_ret_t ILibDuktape_bignum_sub(duk_context* ctx)
{
BIGNUM *ret = BN_new();
BIGNUM *r1, *r2;
duk_push_this(ctx);
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
BN_sub(ret, r1, r2);
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
return(1);
}
duk_ret_t ILibDuktape_bignum_mul(duk_context* ctx)
{
BN_CTX *bx = BN_CTX_new();
BIGNUM *ret = BN_new();
BIGNUM *r1, *r2;
duk_push_this(ctx);
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
BN_mul(ret, r1, r2, bx);
BN_CTX_free(bx);
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
return(1);
}
duk_ret_t ILibDuktape_bignum_div(duk_context* ctx)
{
BN_CTX *bx = BN_CTX_new();
BIGNUM *ret = BN_new();
BIGNUM *r1, *r2;
duk_push_this(ctx);
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
BN_div(ret, NULL, r1, r2, bx);
BN_CTX_free(bx);
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
return(1);
}
duk_ret_t ILibDuktape_bignum_mod(duk_context* ctx)
{
BN_CTX *bx = BN_CTX_new();
BIGNUM *ret = BN_new();
BIGNUM *r1, *r2;
duk_push_this(ctx);
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
BN_div(NULL, ret, r1, r2, bx);
BN_CTX_free(bx);
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
return(1);
}
duk_ret_t ILibDuktape_bignum_cmp(duk_context *ctx)
{
BIGNUM *r1, *r2;
duk_push_this(ctx);
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
duk_push_int(ctx, BN_cmp(r2, r1));
return(1);
}
duk_ret_t ILibDuktape_bignum_finalizer(duk_context *ctx)
{
BIGNUM *b = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
if (b != NULL)
{
BN_free(b);
}
return(0);
}
void ILibDuktape_bignum_addBigNumMethods(duk_context *ctx, BIGNUM *b)
{
duk_push_object(ctx);
duk_push_pointer(ctx, b); duk_put_prop_string(ctx, -2, "\xFF_BIGNUM");
ILibDuktape_CreateProperty_InstanceMethod(ctx, "toString", ILibDuktape_bignum_toString, DUK_VARARGS);
ILibDuktape_CreateInstanceMethod(ctx, "add", ILibDuktape_bignum_add, 1);
ILibDuktape_CreateInstanceMethod(ctx, "sub", ILibDuktape_bignum_sub, 1);
ILibDuktape_CreateInstanceMethod(ctx, "mul", ILibDuktape_bignum_mul, 1);
ILibDuktape_CreateInstanceMethod(ctx, "div", ILibDuktape_bignum_div, 1);
ILibDuktape_CreateInstanceMethod(ctx, "mod", ILibDuktape_bignum_mod, 1);
ILibDuktape_CreateInstanceMethod(ctx, "cmp", ILibDuktape_bignum_cmp, 1);
duk_push_c_function(ctx, ILibDuktape_bignum_finalizer, 1); duk_set_finalizer(ctx, -2);
duk_eval_string(ctx, "(function toNumber(){return(parseInt(this.toString()));})"); duk_put_prop_string(ctx, -2, "toNumber");
}
duk_ret_t ILibDuktape_bignum_random(duk_context *ctx)
{
BIGNUM *r = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
BIGNUM *rnd = BN_new();
if (BN_rand_range(rnd, r) == 0) { return(ILibDuktape_Error(ctx, "Error Generating Random Number")); }
ILibDuktape_bignum_addBigNumMethods(ctx, rnd);
return(1);
}
duk_ret_t ILibDuktape_bignum_fromBuffer(duk_context *ctx)
{
char *endian = duk_get_top(ctx) > 1 ? Duktape_GetStringPropertyValue(ctx, 1, "endian", "big") : "big";
duk_size_t len;
char *buffer = Duktape_GetBuffer(ctx, 0, &len);
BIGNUM *b;
if (strcmp(endian, "big") == 0)
{
b = BN_bin2bn((unsigned char*)buffer, (int)len, NULL);
}
else if (strcmp(endian, "little") == 0)
{
b = BN_lebin2bn((unsigned char*)buffer, (int)len, NULL);
}
else
{
return(ILibDuktape_Error(ctx, "Invalid endian specified"));
}
ILibDuktape_bignum_addBigNumMethods(ctx, b);
return(1);
}
duk_ret_t ILibDuktape_bignum_func(duk_context *ctx)
{
BIGNUM *b = NULL;
BN_dec2bn(&b, duk_require_string(ctx, 0));
ILibDuktape_bignum_addBigNumMethods(ctx, b);
return(1);
}
void ILibDuktape_bignum_Push(duk_context *ctx, void *chain)
{
duk_push_c_function(ctx, ILibDuktape_bignum_func, DUK_VARARGS);
duk_push_c_function(ctx, ILibDuktape_bignum_fromBuffer, DUK_VARARGS); duk_put_prop_string(ctx, -2, "fromBuffer");
duk_push_c_function(ctx, ILibDuktape_bignum_random, DUK_VARARGS); duk_put_prop_string(ctx, -2, "random");
char randRange[] = "exports.randomRange = function randomRange(low, high)\
{\
var result = exports.random(high.sub(low)).add(low);\
return(result);\
};";
ILibDuktape_ModSearch_AddHandler_AlsoIncludeJS(ctx, randRange, sizeof(randRange) - 1);
}
void ILibDuktape_dataGenerator_onPause(struct ILibDuktape_readableStream *sender, void *user)
{
}
void ILibDuktape_dataGenerator_onResume(struct ILibDuktape_readableStream *sender, void *user)
{
SHA256_CTX shctx;
char *buffer = (char*)user;
size_t bufferLen = ILibMemory_Size(buffer);
int val;
while (sender->paused == 0)
{
duk_push_heapptr(sender->ctx, sender->object);
val = Duktape_GetIntPropertyValue(sender->ctx, -1, "\xFF_counter", 0);
duk_push_int(sender->ctx, (val + 1) < 255 ? (val+1) : 0); duk_put_prop_string(sender->ctx, -2, "\xFF_counter");
duk_pop(sender->ctx);
//util_random((int)(bufferLen - UTIL_SHA256_HASHSIZE), buffer + UTIL_SHA256_HASHSIZE);
memset(buffer + UTIL_SHA256_HASHSIZE, val, bufferLen - UTIL_SHA256_HASHSIZE);
SHA256_Init(&shctx);
SHA256_Update(&shctx, buffer + UTIL_SHA256_HASHSIZE, bufferLen - UTIL_SHA256_HASHSIZE);
SHA256_Final((unsigned char*)buffer, &shctx);
ILibDuktape_readableStream_WriteData(sender, buffer, (int)bufferLen);
}
}
duk_ret_t ILibDuktape_dataGenerator_const(duk_context *ctx)
{
int bufSize = (int)duk_require_int(ctx, 0);
void *buffer;
if (bufSize <= UTIL_SHA256_HASHSIZE)
{
return(ILibDuktape_Error(ctx, "Value too small. Must be > %d", UTIL_SHA256_HASHSIZE));
}
duk_push_object(ctx);
duk_push_int(ctx, 0); duk_put_prop_string(ctx, -2, "\xFF_counter");
buffer = Duktape_PushBuffer(ctx, bufSize);
duk_put_prop_string(ctx, -2, "\xFF_buffer");
ILibDuktape_ReadableStream_Init(ctx, ILibDuktape_dataGenerator_onPause, ILibDuktape_dataGenerator_onResume, buffer)->paused = 1;
return(1);
}
void ILibDuktape_dataGenerator_Push(duk_context *ctx, void *chain)
{
duk_push_c_function(ctx, ILibDuktape_dataGenerator_const, DUK_VARARGS);
}
#endif
void ILibDuktape_Polyfills_JS_Init(duk_context *ctx)
{
// The following can be overriden by calling addModule() or by having a .js file in the module path
// http-digest. Refer to /modules/http-digest.js for a human readable version
duk_peval_string_noresult(ctx, "addModule('http-digest', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCnZhciB3cml0YWJsZSA9IHJlcXVpcmUoJ3N0cmVhbScpLldyaXRhYmxlOw0KdmFyIG1kNSA9IHJlcXVpcmUoJ01ENVN0cmVhbScpLmNyZWF0ZSgpOw0KDQpmdW5jdGlvbiBjaGVja0V2ZW50Rm9yd2FyZGluZyhkaWdlc3RSZXF1ZXN0LCBldmVudE5hbWUpDQp7DQogICAgaWYgKGRpZ2VzdFJlcXVlc3QubGlzdGVuZXJDb3VudChldmVudE5hbWUpID4gMCkNCiAgICB7DQogICAgICAgIHZhciBlRm9yd2FyZCA9IGZ1bmN0aW9uIF9lRm9yd2FyZCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBwID0gW2VGb3J3YXJkLl9ldmVudE5hbWVdOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsgcC5wdXNoKGFyZ3VtZW50c1tpXSk7IH0NCiAgICAgICAgICAgIF9lRm9yd2FyZC5fZGlnZXN0UmVxdWVzdC5lbWl0LmFwcGx5KF9lRm9yd2FyZC5fZGlnZXN0UmVxdWVzdCwgcCk7DQogICAgICAgIH07DQogICAgICAgIGVGb3J3YXJkLl9ldmVudE5hbWUgPSBldmVudE5hbWU7DQogICAgICAgIGVGb3J3YXJkLl9kaWdlc3RSZXF1ZXN0ID0gZGlnZXN0UmVxdWVzdDsNCiAgICAgICAgZGlnZXN0UmVxdWVzdC5fcmVxdWVzdC5vbihldmVudE5hbWUsIGVGb3J3YXJkKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGdlbmVyYXRlQXV0aEhlYWRlcnMoaW1zZywgb3B0aW9ucywgZGlnZXN0KQ0Kew0KICAgIHZhciBhdXRoOw0KDQogICAgaWYgKGltc2cgIT0gbnVsbCkNCiAgICB7DQogICAgICAgIGF1dGggPSB7IHJlYWxtOiBudWxsLCBub25jZTogbnVsbCwgb3BhcXVlOiBudWxsLCBxb3A6IG51bGwgfTsNCiAgICAgICAgdmFyIHd3dyA9IGltc2cuaGVhZGVyc1snV1dXLUF1dGhlbnRpY2F0ZSddOw0KICAgICAgICB2YXIgdG9rZW5zID0gd3d3LnNwbGl0KCcsJyk7DQoNCiAgICAgICAgdmFyIHBhaXJzOw0KICAgICAgICBmb3IgKHZhciBpIGluIHRva2VucykNCiAgICAgICAgew0KICAgICAgICAgICAgcGFpcnMgPSB0b2tlbnNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgICAgIGlmIChwYWlycy5sZW5ndGggPT0gMikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhaXJzWzBdLnRvTG93ZXJDYXNlKCkudHJpbSgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGlnZXN0IHJlYWxtJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgucmVhbG0gPSBwYWlyc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoLnJlYWxtWzBdID09ICciJykgeyBhdXRoLnJlYWxtID0gYXV0aC5yZWFsbS5zdWJzdHJpbmcoMSwgYXV0aC5yZWFsbS5sZW5ndGggLSAxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vbmNlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgubm9uY2UgPSBwYWlyc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoLm5vbmNlWzBdID09ICciJykgeyBhdXRoLm5vbmNlID0gYXV0aC5ub25jZS5zdWJzdHJpbmcoMSwgYXV0aC5ub25jZS5sZW5ndGggLSAxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ29wYXF1ZSc6DQogICAgICAgICAgICAgICAgICAgICAgICBhdXRoLm9wYXF1ZSA9IHBhaXJzWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGgub3BhcXVlWzBdID09ICciJykgeyBhdXRoLm9wYXF1ZSA9IGF1dGgub3BhcXVlLnN1YnN0cmluZygxLCBhdXRoLm9wYXF1ZS5sZW5ndGggLSAxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3FvcCc6DQogICAgICAgICAgICAgICAgICAgICAgICBhdXRoLnFvcCA9IHBhaXJzWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGgucW9wWzBdID09ICciJykgeyBhdXRoLnFvcCA9IGF1dGgucW9wLnN1YnN0cmluZygxLCBhdXRoLnFvcC5sZW5ndGggLSAxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGRpZ2VzdC5fYXV0aCA9IGF1dGg7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGlmICghKGF1dGggPSBkaWdlc3QuX2F1dGgpKSB7IHJldHVybjsgfQ0KICAgIH0NCg0KICAgIHZhciBzdGVwMSA9IGRpZ2VzdC5fb3B0aW9ucy51c2VybmFtZSArICc6JyArIGF1dGgucmVhbG0gKyAnOicgKyBkaWdlc3QuX29wdGlvbnMucGFzc3dvcmQ7DQogICAgYXV0aC5zdGVwMSA9IG1kNS5zeW5jSGFzaChzdGVwMSkudG9TdHJpbmcoJ2hleCcpLnRvTG93ZXJDYXNlKCk7DQoNCiAgICB2YXIgc3RlcDIgPSBvcHRpb25zLm1ldGhvZCArICc6JyArIG9wdGlvbnMucGF0aDsNCiAgICBhdXRoLnN0ZXAyID0gbWQ1LnN5bmNIYXNoKHN0ZXAyKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTsNCg0KDQogICAgaWYgKGF1dGgucW9wID09IG51bGwpDQogICAgew0KICAgICAgICB2YXIgc3RlcDMgPSBhdXRoLnN0ZXAxICsgJzonICsgYXV0aC5ub25jZSArICc6JyArIGF1dGguc3RlcDI7DQogICAgICAgIGF1dGguc3RlcDMgPSBtZDUuc3luY0hhc2goc3RlcDMpLnRvU3RyaW5nKCdoZXgnKS50b0xvd2VyQ2FzZSgpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBkaWdlc3QuX05DICs9IDE7DQogICAgICAgIHZhciBzdGVwMyA9IGF1dGguc3RlcDEgKyAnOicgKyBhdXRoLm5vbmNlICsgJzonICsgZGlnZXN0Ll9OQy50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg4LCAnMCcpICsgJzonICsgZGlnZXN0Ll9DTk9OQ0UgKyAnOicgKyBhdXRoLnFvcCArICc6JyArIGF1dGguc3RlcDI7DQogICAgICAgIGF1dGguc3RlcDMgPSBtZDUuc3luY0hhc2goc3RlcDMpLnRvU3RyaW5nKCdoZXgnKS50b0xvd2VyQ2FzZSgpOw0KICAgIH0NCg0KICAgIHZhciByZXQgPSAnRGlnZXN0IHVzZXJuYW1lPSInICsgZGlnZXN0Ll9vcHRpb25zLnVzZXJuYW1lICsgJyIscmVhbG09IicgKyBhdXRoLnJlYWxtICsgJyIsbm9uY2U9IicgKyBhdXRoLm5vbmNlICsgJyIsdXJpPSInICsgb3B0aW9ucy5wYXRoICsgJyInOw0KICAgIGlmIChhdXRoLm9wYXF1ZSAhPSBudWxsKSB7IHJldCArPSAoJyxvcGFxdWU9IicgKyBhdXRoLm9wYXF1ZSArICciJyk7IH0NCiAgICByZXQgKz0gKCcscmVzcG9uc2U9IicgKyBhdXRoLnN0ZXAzICsgJyInKTsNCg0KICAgIGlmIChhdXRoLnFvcCAhPSBudWxsKQ0KICAgIHsNCiAgICAgICAgcmV0ICs9ICgnLHFvcD0iJyArIGF1dGgucW9wICsgJyIsbmM9IicgKyBkaWdlc3QuX05DLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpLnBhZFN0YXJ0KDgsICcwJykgKyAnIixjbm9uY2U9IicgKyBkaWdlc3QuX0NOT05DRSArICciJyk7DQogICAgfQ0KDQoNCiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykgeyBvcHRpb25zLmhlYWRlcnMgPSB7fTsgfQ0KICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gcmV0Ow0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gaHR0cF9kaWdlc3QoKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gImh0dHAtZGlnZXN0IjsNCiAgICB0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uKCkNCiAgICB7DQogICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMSAmJiB0eXBlb2YoYXJndW1lbnRzWzBdID09ICdvYmplY3QnKSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIChuZXcgaHR0cF9kaWdlc3RfaW5zdGFuY2UoYXJndW1lbnRzWzBdKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAyICYmIHR5cGVvZihhcmd1bWVudHNbMF0pID09ICdzdHJpbmcnICYmIHR5cGVvZihhcmd1bWVudHNbMV0pID09ICdzdHJpbmcnKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKG5ldyBodHRwX2RpZ2VzdF9pbnN0YW5jZSh7dXNlcm5hbWU6IGFyZ3VtZW50c1swXSwgcGFzc3dvcmQ6IGFyZ3VtZW50c1sxXX0pKTsNCiAgICAgICAgfQ0KICAgICAgICB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gaHR0cF9kaWdlc3RfaW5zdGFuY2Uob3B0aW9ucykNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdodHRwLWRpZ2VzdC5pbnN0YW5jZSc7DQogICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7DQogICAgdGhpcy5odHRwID0gbnVsbDsNCiAgICB0aGlzLl9OQyA9IDA7DQogICAgdGhpcy5fQ05PTkNFID0gcmVxdWlyZSgnaHR0cCcpLmdlbmVyYXRlTm9uY2UoMTYpOw0KDQogICAgdGhpcy5nZXQgPSBmdW5jdGlvbih1cmkpDQogICAgew0KICAgICAgICByZXR1cm4gKHRoaXMucmVxdWVzdCh1cmkpKTsNCiAgICB9DQogICAgdGhpcy5yZXF1ZXN0ID0gZnVuY3Rpb24gKHBhcjEpDQogICAgew0KICAgICAgICB2YXIgY2FsbGVuZCA9IGZhbHNlOw0KICAgICAgICB2YXIgcmV0ID0gbmV3IHdyaXRhYmxlKA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbiAoY2h1bmssIGZsdXNoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VuZGVkKSB7IHRocm93ICgnU3RyZWFtIGFscmVhZHkgZW5kZWQnKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5fYnVmZmVyZWQpIA0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9idWZmZXJlZCA9IEJ1ZmZlci5hbGxvYyhjaHVuay5sZW5ndGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsuY29weSh0aGlzLl9idWZmZXJlZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9idWZmZXJlZCA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZmZlcmVkLCBjaHVua10sIHRoaXMuX2J1ZmZlcmVkLmxlbmd0aCArIGNodW5rLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVxdWVzdCkgeyB0aGlzLl9yZXF1ZXN0LndyaXRlKGNodW5rKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZmx1c2ggIT0gbnVsbCkgeyBmbHVzaCgpOyB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBmaW5hbDogZnVuY3Rpb24gKGZsdXNoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VuZGVkKSB7IHRocm93ICgnU3RyZWFtIGFscmVhZHkgZW5kZWQnKTsgfQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0KSB7IHRoaXMuX3JlcXVlc3QuZW5kKCk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZsdXNoICE9IG51bGwpIHsgZmx1c2goKTsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICByZXQuX2J1ZmZlcmVkID0gbnVsbDsNCiAgICAgICAgcmV0Ll9lbmRlZCA9IGZhbHNlOw0KICAgICAgICBzd2l0Y2ggKHR5cGVvZiAocGFyMSkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgdGhyb3cgKCdJbnZhbGlkIFBhcmFtZXRlcicpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzoNCiAgICAgICAgICAgICAgICByZXQub3B0aW9ucyA9IHRoaXMuaHR0cC5wYXJzZVVyaShwYXIxKTsNCiAgICAgICAgICAgICAgICBjYWxsZW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6DQogICAgICAgICAgICAgICAgcmV0Lm9wdGlvbnMgPSBwYXIxOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHJldCwgdHJ1ZSkNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgncmVzcG9uc2UnKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdlcnJvcicpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3VwZ3JhZGUnKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdjb250aW51ZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3RpbWVvdXQnKTsNCiAgICAgICAgcmV0Ll9kaWdlc3QgPSB0aGlzOw0KDQogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgKGFyZ3VtZW50c1sxXSkgPT0gJ2Z1bmN0aW9uJykNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Lm9uY2UoJ3Jlc3BvbnNlJywgYXJndW1lbnRzWzFdKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vDQogICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBhZGQgQXV0aEhlYWRlcnMgbm93DQogICAgICAgIC8vDQogICAgICAgIGdlbmVyYXRlQXV0aEhlYWRlcnMobnVsbCwgcmV0Lm9wdGlvbnMsIHRoaXMpOw0KDQogICAgICAgIC8vIFdoZW4gc29tZWJvZHkgaG9va3MgdXAgZXZlbnRzIHRvIGRpZ2VzdC5jbGllbnRSZXF1ZXN0LCB3ZSBuZWVkIHRvIGhvb2sgdGhlIHJlYWwgZXZlbnQgb24gaHR0cC5jbGllbnRSZXF1ZXN0DQogICAgICAgIHJldC5fcmVxdWVzdCA9IHRoaXMuaHR0cC5yZXF1ZXN0KHJldC5vcHRpb25zKTsNCiAgICAgICAgcmV0Ll9yZXF1ZXN0LmRpZ1JlcXVlc3QgPSByZXQ7DQogICAgICAgIHJldC5vbignbmV3TGlzdGVuZXInLCBmdW5jdGlvbiAoZXZOYW1lLCBjYWxsYmFjaykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGV2TmFtZSAhPSAndXBncmFkZScgJiYgZXZOYW1lICE9ICdlcnJvcicgJiYgZXZOYW1lICE9ICdjb250aW51ZScgJiYgZXZOYW1lICE9ICd0aW1lb3V0JyAmJiBldk5hbWUgIT0gJ2RyYWluJykgeyByZXR1cm47IH0NCiAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0Lmxpc3RlbmVyQ291bnQoZXZOYW1lKSA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBldlNpbmsgPSBmdW5jdGlvbiBfZXZTaW5rKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBwYXJtcyA9IFtfZXZTaW5rLmV2ZW50TmFtZV07DQogICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDsrK2kpIHtwYXJtcy5wdXNoKGFyZ3VtZW50c1tpXSk7fQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuZW1pdC5hcHBseSh0aGlzLmRpZ1JlcXVlc3QsIHBhcm1zKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIGV2U2luay5ldmVudE5hbWUgPSBldk5hbWU7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdC5vbihldk5hbWUsIGV2U2luayk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIHJldC5fcmVxdWVzdC5vbmNlKCdyZXNwb25zZScsIGZ1bmN0aW9uIChpbXNnKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoaW1zZy5zdGF0dXNDb2RlID09IDQwMSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2FsbGVuZCA9IHRoaXMuZGlnUmVxdWVzdC5fcmVxdWVzdC5fY2FsbGVuZDsNCiAgICAgICAgICAgICAgICB2YXIgYXV0aCA9IGdlbmVyYXRlQXV0aEhlYWRlcnMoaW1zZywgdGhpcy5kaWdSZXF1ZXN0Lm9wdGlvbnMsIHRoaXMuZGlnUmVxdWVzdC5fZGlnZXN0KTsNCg0KICAgICAgICAgICAgICAgIHRoaXMuZGlnUmVxdWVzdC5fcmVxdWVzdCA9IHRoaXMuZGlnUmVxdWVzdC5fZGlnZXN0Lmh0dHAucmVxdWVzdCh0aGlzLmRpZ1JlcXVlc3Qub3B0aW9ucyk7DQogICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0Ll9yZXF1ZXN0LmRpZ1JlcXVlc3QgPSB0aGlzLmRpZ1JlcXVlc3Q7DQogICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0Ll9yZXF1ZXN0Lm9uY2UoJ3Jlc3BvbnNlJywgZnVuY3Rpb24gKGltc2cpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2goaW1zZy5zdGF0dXNDb2RlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuZW1pdCgnZXJyb3InLCAnRGlnZXN0IGZhaWxlZCB0b28gbWFueSB0aW1lcycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuZW1pdCgncmVzcG9uc2UnLCBpbXNnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIGNoZWNrRXZlbnRGb3J3YXJkaW5nKHRoaXMuZGlnUmVxdWVzdCwgJ3VwZ3JhZGUnKTsNCiAgICAgICAgICAgICAgICBjaGVja0V2ZW50Rm9yd2FyZGluZyh0aGlzLmRpZ1JlcXVlc3QsICdlcnJvcicpOw0KICAgICAgICAgICAgICAgIGNoZWNrRXZlbnRGb3J3YXJkaW5nKHRoaXMuZGlnUmVxdWVzdCwgJ2NvbnRpbnVlJyk7DQogICAgICAgICAgICAgICAgY2hlY2tFdmVudEZvcndhcmRpbmcodGhpcy5kaWdSZXF1ZXN0LCAndGltZW91dCcpOw0KICAgICAgICAgICAgICAgIGNoZWNrRXZlbnRGb3J3YXJkaW5nKHRoaXMuZGlnUmVxdWVzdCwgJ2RyYWluJyk7DQogICAgICAgICAgICAgICAgaWYgKGNhbGxlbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuX3JlcXVlc3QuZW5kKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpZ1JlcXVlc3QuX2J1ZmZlcmVkKSB7IHRoaXMuZGlnUmVxdWVzdC5fcmVxdWVzdC53cml0ZSh0aGlzLmRpZ1JlcXVlc3QuX2J1ZmZlcmVkKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kaWdSZXF1ZXN0Ll9lbmRlZCkgeyB0aGlzLmRpZ1JlcXVlc3QuX3JlcXVlc3QuZW5kKCk7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0LmVtaXQoJ3Jlc3BvbnNlJywgaW1zZyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBpZiAoY2FsbGVuZCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Ll9yZXF1ZXN0Ll9jYWxsZW5kID0gdHJ1ZTsgcmV0Ll9yZXF1ZXN0LmVuZCgpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHJldC5fYnVmZmVyZWQpIHsgcmV0Ll9yZXF1ZXN0LndyaXRlKHJldC5fYnVmZmVyZWQpOyB9DQogICAgICAgICAgICBpZiAocmV0Ll9lbmRlZCkgeyByZXQuX3JlcXVlc3QuZW5kKCk7IH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCn0NCg0KDQptb2R1bGUuZXhwb3J0cyA9IG5ldyBodHRwX2RpZ2VzdCgpOw0KDQo=', 'base64').toString());");
// Clipboard. Refer to /modules/clipboard.js for a human readable version
char *_clipboard = ILibMemory_Allocate(41147, 0, NULL, NULL);
memcpy_s(_clipboard + 0, 23512, "LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwoKdmFyIEFueVByb3BlcnR5VHlwZSA9IDA7CnZhciBDdXJyZW50VGltZSA9IDA7CnZhciBOb25lID0gMDsKdmFyIFByb3BNb2RlUmVwbGFjZSA9IDA7CnZhciBTZWxlY3Rpb25DbGVhciA9IDI5Owp2YXIgU2VsZWN0aW9uTm90aWZ5ID0gMzE7CnZhciBTZWxlY3Rpb25SZXF1ZXN0ID0gMzA7CnZhciBYQV9QUklNQVJZID0gMTsKdmFyIENGX1RFWFQgPSAxOwp2YXIgQ0ZfVU5JQ09ERVRFWFQgPSAxMzsKCmZ1bmN0aW9uIG5hdGl2ZUFkZE1vZHVsZShuYW1lKQp7CiAgICB2YXIgdmFsdWUgPSBnZXRKU01vZHVsZShuYW1lKTsKICAgIHZhciByZXQgPSAiZHVrX3BldmFsX3N0cmluZ19ub3Jlc3VsdChjdHgsIFwiYWRkTW9kdWxlKCciICsgbmFtZSArICInLCBCdWZmZXIuZnJvbSgnIiArIEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygnYmFzZTY0JykgKyAiJywgJ2Jhc2U2NCcpLnRvU3RyaW5nKCkpO1wiKTsiOwogICAgaWYgKHJldC5sZW5ndGggPiAxNjMwMCkKICAgIHsKICAgICAgICAvLyBNUyBWaXN1YWwgU3R1ZGlvIGhhcyBhIG1heHNpemUgbGltaXRhdGlvbgogICAgICAgIHZhciB0bXAgPSBCdWZmZXIuZnJvbSh2YWx1ZSkudG9TdHJpbmcoJ2Jhc2U2NCcpOwogICAgICAgIHJldCA9ICdjaGFyICpfJyArIG5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKSArICcgPSBJTGliTWVtb3J5X0FsbG9jYXRlKCcgKyAodG1wLmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIDIpICsgJywgMCwgTlVMTCwgTlVMTCk7XG4nOwogICAgICAgIHZhciBpID0gMDsKICAgICAgICB3aGlsZSAoaSA8IHRtcC5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2h1bmsgPSB0bXAuc3Vic3RyaW5nKGksIGkrMTYwMDApOwogICAgICAgICAgICByZXQgKz0gKCdtZW1jcHlfcyhfJyArIG5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKSArICcgKyAnICsgaSArICcsICcgKyAodG1wLmxlbmd0aCAtIGkpICsgJywgIicgKyBjaHVuayArICciLCAnICsgY2h1bmsubGVuZ3RoICsgJyk7XG4nKTsKICAgICAgICAgICAgaSArPSBjaHVuay5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldCArPSAoJ0lMaWJCYXNlNjREZWNvZGVFeCgodW5zaWduZWQgY2hhciopXycgKyBuYW1lLnNwbGl0KCctJykuam9pbignJykgKyAnLCAnICsgdG1wLmxlbmd0aCArICcsICh1bnNpZ25lZCBjaGFyKilfJyArIG5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKSArICcgKyAnICsgdG1wLmxlbmd0aCArICcpO1xuJyk7CiAgICAgICAgcmV0ICs9ICgnZHVrX3B1c2hfZ2xvYmFsX29iamVjdChjdHgpO2R1a19nZXRfcHJvcF9zdHJpbmcoY3R4LCAtMSwgImFkZE1vZHVsZSIpO2R1a19zd2FwX3RvcChjdHgsIC0yKTtkdWtfcHVzaF9zdHJpbmcoY3R4LCAiJyArIG5hbWUgKyAnIik7ZHVrX3B1c2hfc3RyaW5nKGN0eCwgXycgKyBuYW1lLnNwbGl0KCctJykuam9pbignJykgKyAnICsgJyArIHRtcC5sZW5ndGggKyAnKTtcbicpOwogICAgICAgIHJldCArPSAoJ2R1a19wY2FsbF9tZXRob2QoY3R4LCAyKTsgZHVrX3BvcChjdHgpO1xuJyk7CiAgICAgICAgcmV0ICs9ICgnZnJlZShfJyArIG5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKSArICcpO1xuJyk7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyhyZXQpOwp9CmZ1bmN0aW9uIGRpc3BhdGNoUmVhZChzaWQpCnsKICAgIHZhciBpZCA9IDA7CgogICAgaWYoc2lkPT1udWxsKQogICAgewogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYWN0aXZlID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLkN1cnJlbnQoKS5BY3RpdmU7CiAgICAgICAgICAgIGlmIChhY3RpdmUubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWQgPSBwYXJzZUludChhY3RpdmVbMF0uU2Vzc2lvbklkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlkID0gc2lkOwogICAgfQoKICAgIGlmKGlkID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cy5yZWFkKCkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBjaGlsZFByb3BlcnRpZXMgPSB7IHNlc3Npb25JZDogaWQgfTsKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgIHsKICAgICAgICAgICAgeGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbyhpZCk7CiAgICAgICAgICAgIGNoaWxkUHJvcGVydGllcy5lbnYgPSB7IFhBVVRIT1JJVFk6IHhpbmZvLnhhdXRob3JpdHksIERJU1BMQVk6IHhpbmZvLmRpc3BsYXkgfTsKICAgICAgICB9CgogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwogICAgICAgIHJldC5zdWNjZXNzID0gZmFsc2U7CiAgICAgICAgcmV0Lm1hc3RlciA9IHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLkNyZWF0ZShjaGlsZFByb3BlcnRpZXMpOwogICAgICAgIHJldC5tYXN0ZXIucHJvbWlzZSA9IHJldDsKICAgICAgICByZXQubWFzdGVyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnByb21pc2Uuc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVzKGQpOwogICAgICAgICAgICB0aGlzLmV4aXQoKTsKICAgICAgICB9KTsKICAgICAgICByZXQubWFzdGVyLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMucHJvbWlzZS5zdWNjZXNzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignRXJyb3IgcmVhZGluZyBjbGlwYm9hcmQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgdGhpcy5wcm9taXNlLm1hc3RlcjsKICAgICAgICB9KTsKICAgICAgICByZXQubWFzdGVyLkV4ZWN1dGVTdHJpbmcoInZhciBwYXJlbnQgPSByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKTsgcmVxdWlyZSgnY2xpcGJvYXJkJykucmVhZCgpLnRoZW4oZnVuY3Rpb24odil7cGFyZW50LnNlbmQodik7fSwgZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKTtwcm9jZXNzLmV4aXQoKTt9KTsiKTsKICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGRpc3BhdGNoV3JpdGUoZGF0YSwgc2lkKQp7CiAgICB2YXIgaWQgPSAwOwoKICAgIGlmKHNpZCA9PSBudWxsKQogICAgewogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhY3RpdmUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuQ3VycmVudCgpLkFjdGl2ZTsKICAgICAgICAgICAgaWYoYWN0aXZlLmxlbmd0aD4wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZCA9IHBhcnNlSW50KGFjdGl2ZVswXS5TZXNzaW9uSWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWQgPSBzaWQ7CiAgICB9CgogICAgaWYoaWQgPT0gMCkKICAgIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyhkYXRhKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgY2hpbGRQcm9wZXJ0aWVzID0geyBzZXNzaW9uSWQ6IGlkIH07CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICB7CiAgICAgICAgICAgIHhpbmZvID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuZ2V0WEluZm8oaWQpOwogICAgICAgICAgICBjaGlsZFByb3BlcnRpZXMuZW52ID0geyBYQVVUSE9SSVRZOiB4aW5mby54YXV0aG9yaXR5LCBESVNQTEFZOiB4aW5mby5kaXNwbGF5IH07CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInIHx8ICF0aGlzLm1hc3RlcikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMubWFzdGVyID0gcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuQ3JlYXRlKGNoaWxkUHJvcGVydGllcyk7CiAgICAgICAgICAgIHRoaXMubWFzdGVyLnBhcmVudCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMubWFzdGVyLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgaWYgKHRoaXMucGFyZW50Lm1hc3RlcikgeyBkZWxldGUgdGhpcy5wYXJlbnQubWFzdGVyOyB9IH0pOwogICAgICAgICAgICB0aGlzLm1hc3Rlci5vbignZGF0YScsIGZ1bmN0aW9uIChkKSB7IGNvbnNvbGUubG9nKGQpOyB9KTsKICAgICAgICAgICAgdGhpcy5tYXN0ZXIuRXhlY3V0ZVN0cmluZygidmFyIHBhcmVudCA9IHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpOyBwYXJlbnQub24oJ2RhdGEnLCBmdW5jdGlvbihkKXt0cnl7cmVxdWlyZSgnY2xpcGJvYXJkJykoZCk7fWNhdGNoKGUpe3JlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoZSk7fWlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyl7cHJvY2Vzcy5leGl0KCk7fX0pOyIpOwogICAgICAgIH0KICAgICAgICB0aGlzLm1hc3Rlci5zZW5kKGRhdGEpOwoKICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgJiYgdGhpcy5tYXN0ZXIpCiAgICAgICAgewogICAgICAgICAgICBpZih0aGlzLm1hc3Rlci50aW1lb3V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tYXN0ZXIudGltZW91dCk7CiAgICAgICAgICAgICAgICB0aGlzLm1hc3Rlci50aW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm1hc3Rlci50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoc2VsZikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5tYXN0ZXIuZXhpdCgpOwogICAgICAgICAgICAgICAgc2VsZi5tYXN0ZXIgPSBudWxsOwogICAgICAgICAgICB9LCA2MDAwMCwgdGhpcyk7CiAgICAgICAgfQoKICAgIH0KfQoKZnVuY3Rpb24gbGluX3JlYWR0ZXh0KCkKewogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICB0cnkKICAgIHsKICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKQogICAgfQogICAgY2F0Y2goZXhjKQogICAgewogICAgICAgIHJldC5fcmVqKGV4Yyk7CiAgICAgICAgcmV0dXJuIChyZXQpOwogICAgfQoKICAgIHZhciBYMTEgPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExOwogICAgaWYgKCFYMTEpCiAgICB7CiAgICAgICAgcmV0Ll9yZWooJ1gxMSByZXF1aXJlZCBmb3IgQ2xpcGJvYXJkIE1hbmlwdWxhdGlvbicpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9nbTsKCgogICAgICAgIHJldC5fZ2V0SW5mb1Byb21pc2UgPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRJbmZvKCk7CiAgICAgICAgcmV0Ll9nZXRJbmZvUHJvbWlzZS5fbWFzdGVyUHJvbWlzZSA9IHJldDsKICAgICAgICByZXQuX2dldEluZm9Qcm9taXNlLnRoZW4oZnVuY3Rpb24gKG1vbikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChtb24ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdoaXRlID0gWDExLlhXaGl0ZVBpeGVsKG1vblswXS5kaXNwbGF5LCBtb25bMF0uc2NyZWVuSWQpLlZhbDsKCiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkNMSVBJRCA9IFgxMS5YSW50ZXJuQXRvbShtb25bMF0uZGlzcGxheSwgR00uQ3JlYXRlVmFyaWFibGUoJ0NMSVBCT0FSRCcpLCAwKTsKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRk1USUQgPSBYMTEuWEludGVybkF0b20obW9uWzBdLmRpc3BsYXksIEdNLkNyZWF0ZVZhcmlhYmxlKCdVVEY4X1NUUklORycpLCAwKTsKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuUFJPUElEID0gWDExLlhJbnRlcm5BdG9tKG1vblswXS5kaXNwbGF5LCBHTS5DcmVhdGVWYXJpYWJsZSgnWFNFTF9EQVRBJyksIDApOwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5JTkNSSUQgPSBYMTEuWEludGVybkF0b20obW9uWzBdLmRpc3BsYXksIEdNLkNyZWF0ZVZhcmlhYmxlKCdJTkNSJyksIDApOwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5ST09UV0lOID0gWDExLlhSb290V2luZG93KG1vblswXS5kaXNwbGF5LCBtb25bMF0uc2NyZWVuSWQpOwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOID0gWDExLlhDcmVhdGVTaW1wbGVXaW5kb3cobW9uWzBdLmRpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuUk9PVFdJTiwgMCwgMCwgbW9uWzBdLnJpZ2h0LCA1LCAwLCB3aGl0ZSwgd2hpdGUpOwoKICAgICAgICAgICAgICAgIFgxMS5YU3luYyhtb25bMF0uZGlzcGxheSwgMCk7CiAgICAgICAgICAgICAgICBYMTEuWENvbnZlcnRTZWxlY3Rpb24obW9uWzBdLmRpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuQ0xJUElELCB0aGlzLl9tYXN0ZXJQcm9taXNlLkZNVElELCB0aGlzLl9tYXN0ZXJQcm9taXNlLlBST1BJRCwgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOLCBDdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICBYMTEuWFN5bmMobW9uWzBdLmRpc3BsYXksIDApOwoKCiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudCA9IHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5hZGREZXNjcmlwdG9yKFgxMS5YQ29ubmVjdGlvbk51bWJlcihtb25bMF0uZGlzcGxheSkuVmFsLCB7IHJlYWRzZXQ6IHRydWUgfSk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudC5fbWFzdGVyUHJvbWlzZSA9IHRoaXMuX21hc3RlclByb21pc2U7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudC5fZGlzcGxheSA9IG1vblswXS5kaXNwbGF5OwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5EZXNjcmlwdG9yRXZlbnQub24oJ3JlYWRzZXQnLCBmdW5jdGlvbiAoZmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFhFID0gR00uQ3JlYXRlVmFyaWFibGUoMTAyNCk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFgxMS5YUGVuZGluZyh0aGlzLl9kaXNwbGF5KS5WYWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBYMTEuWE5leHRFdmVudFN5bmModGhpcy5fZGlzcGxheSwgWEUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihYRS5EZXJlZigwLCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID09IFNlbGVjdGlvbk5vdGlmeSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJpdHMgPSBHTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ogPSBHTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFpbCA9IEdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBHTS5DcmVhdGVQb2ludGVyKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhHZXRXaW5kb3dQcm9wZXJ0eSh0aGlzLl9kaXNwbGF5LCB0aGlzLl9tYXN0ZXJQcm9taXNlLkZBS0VXSU4sIHRoaXMuX21hc3RlclByb21pc2UuUFJPUElELCAwLCA2NTUzNSwgMCwgQW55UHJvcGVydHlUeXBlLCBpZCwgYml0cywgc3osIHRhaWwsIHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5fcmVzKHJlc3VsdC5EZXJlZigpLlN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYMTEuWEZyZWUocmVzdWx0LkRlcmVmKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhEZXN0cm95V2luZG93KHRoaXMuX2Rpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuRkFLRVdJTik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEZXNjcmlwdG9yKGZkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBjb25zb2xlLmVycm9yKTsKICAgIH0KICAgIHJldHVybiAocmV0KTsKfQpmdW5jdGlvbiBsaW5fY29weXRleHQodHh0KQp7CiAgICB2YXIgWDExID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMTsKICAgIGlmICghWDExKQogICAgewogICAgICAgIHRocm93KCdYMTEgcmVxdWlyZWQgZm9yIENsaXBib2FyZCBNYW5pcHVsYXRpb24nKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgR00gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fZ207CiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgcmV0Ll90eHQgPSB0eHQ7CiAgICAgICAgcmV0Ll9nZXRJbmZvUHJvbWlzZSA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldEluZm8oKTsKICAgICAgICByZXQuX2dldEluZm9Qcm9taXNlLl9tYXN0ZXJQcm9taXNlID0gcmV0OwogICAgICAgIHJldC5fZ2V0SW5mb1Byb21pc2UudGhlbihmdW5jdGlvbiAobW9uKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKG1vbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgd2hpdGUgPSBYMTEuWFdoaXRlUGl4ZWwobW9uWzBdLmRpc3BsYXksIG1vblswXS5zY3JlZW5JZCkuVmFsOwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5DTElQSUQgPSBYMTEuWEludGVybkF0b20obW9uWzBdLmRpc3BsYXksIEdNLkNyZWF0ZVZhcmlhYmxlKCdDTElQQk9BUkQnKSwgMCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkZNVElEID0gWDExLlhJbnRlcm5BdG9tKG1vblswXS5kaXNwbGF5LCBHTS5DcmVhdGVWYXJpYWJsZSgnVVRGOF9TVFJJTkcnKSwgMCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLlJPT1RXSU4gPSBYMTEuWFJvb3RXaW5kb3cobW9uWzBdLmRpc3BsYXksIG1vblswXS5zY3JlZW5JZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkZBS0VXSU4gPSBYMTEuWENyZWF0ZVNpbXBsZVdpbmRvdyhtb25bMF0uZGlzcGxheSwgdGhpcy5fbWFzdGVyUHJvbWlzZS5ST09UV0lOLCAwLCAwLCBtb25bMF0ucmlnaHQsIDUsIDAsIHdoaXRlLCB3aGl0ZSk7CgogICAgICAgICAgICAgICAgWDExLlhTZXRTZWxlY3Rpb25Pd25lcihtb25bMF0uZGlzcGxheSwgWEFfUFJJTUFSWSwgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOLCBDdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICBYMTEuWFNldFNlbGVjdGlvbk93bmVyKG1vblswXS5kaXNwbGF5LCB0aGlzLl9tYXN0ZXJQcm9taXNlLkNMSVBJRCwgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOLCBDdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICBYMTEuWFN5bmMobW9uWzBdLmRpc3BsYXksIDApOwoKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRGVzY3JpcHRvckV2ZW50ID0gcmVxdWlyZSgnRGVzY3JpcHRvckV2ZW50cycpLmFkZERlc2NyaXB0b3IoWDExLlhDb25uZWN0aW9uTnVtYmVyKG1vblswXS5kaXNwbGF5KS5WYWwsIHsgcmVhZHNldDogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRGVzY3JpcHRvckV2ZW50Ll9tYXN0ZXJQcm9taXNlID0gdGhpcy5fbWFzdGVyUHJvbWlzZTsKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRGVzY3JpcHRvckV2ZW50Ll9kaXNwbGF5ID0gbW9uWzBdLmRpc3BsYXk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudC5vbigncmVhZHNldCcsIGZ1bmN0aW9uIChmZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgWEUgPSBHTS5DcmVhdGVWYXJpYWJsZSgxMDI0KTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoWDExLlhQZW5kaW5nKHRoaXMuX2Rpc3BsYXkpLlZhbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFgxMS5YTmV4dEV2ZW50U3luYyh0aGlzLl9kaXNwbGF5LCBYRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoWEUuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTZWxlY3Rpb25DbGVhcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8xKCdTb21lYm9keSBlbHNlIG93bnMgY2xpcGJvYXJkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNlbGVjdGlvblJlcXVlc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnU29tZWJvZHkgd2FudHMgdXMgdG8gc2VuZCB0aGVtIGRhdGEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ID0gR00uQ3JlYXRlVmFyaWFibGUoR00uUG9pbnRlclNpemUgPT0gOCA/IDcyIDogMzYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcl9yZXF1ZXN0b3IgPSBHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gWEUuRGVyZWYoNDAsIDgpIDogWEUuRGVyZWYoMjAsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcl9zZWxlY3Rpb24gPSBHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gWEUuRGVyZWYoNDgsIDgpIDogWEUuRGVyZWYoMjQsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcl9wcm9wZXJ0eSA9IEdNLlBvaW50ZXJTaXplID09IDggPyBYRS5EZXJlZig2NCwgOCkgOiBYRS5EZXJlZigzMiwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyX3RhcmdldCA9IEdNLlBvaW50ZXJTaXplID09IDggPyBYRS5EZXJl", 16000);
memcpy_s(_clipboard + 16000, 7512, "Zig1NiwgOCkgOiBYRS5EZXJlZigyOCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyX3RpbWUgPSBHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gWEUuRGVyZWYoNzIsIDgpIDogWEUuRGVyZWYoMzYsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcl9kaXNwbGF5ID0gR00uUG9pbnRlclNpemUgPT0gOCA/IFhFLkRlcmVmKDI0LCA4KSA6IFhFLkRlcmVmKDEyLCA0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKFNlbGVjdGlvbk5vdGlmeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2X3JlcXVlc3RvciA9IEdNLlBvaW50ZXJTaXplID09IDggPyBldi5EZXJlZigzMiwgOCkgOiBldi5EZXJlZigxNiwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2X3NlbGVjdGlvbiA9IEdNLlBvaW50ZXJTaXplID09IDggPyBldi5EZXJlZig0MCwgOCkgOiBldi5EZXJlZigyMCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2X3RhcmdldCA9IEdNLlBvaW50ZXJTaXplID09IDggPyBldi5EZXJlZig0OCwgOCkgOiBldi5EZXJlZigyNCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2X3RpbWUgPSBHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gZXYuRGVyZWYoNjQsIDgpIDogZXYuRGVyZWYoMzIsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldl9wcm9wZXJ0eSA9IEdNLlBvaW50ZXJTaXplID09IDggPyBldi5EZXJlZig1NiwgOCkgOiBldi5EZXJlZigyOCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaXB0ZXh0ID0gR00uQ3JlYXRlVmFyaWFibGUodGhpcy5fbWFzdGVyUHJvbWlzZS5fdHh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JfcmVxdWVzdG9yLkRlcmVmKCkucG9pbnRlckJ1ZmZlcigpLmNvcHkoZXZfcmVxdWVzdG9yLnRvQnVmZmVyKCkpOyBjb25zb2xlLmluZm8xKCdSRVFVRVNUT1I6ICcgKyBzcl9yZXF1ZXN0b3IuRGVyZWYoKS5wb2ludGVyQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcl9zZWxlY3Rpb24uRGVyZWYoKS5wb2ludGVyQnVmZmVyKCkuY29weShldl9zZWxlY3Rpb24udG9CdWZmZXIoKSk7IGNvbnNvbGUuaW5mbzEoJ1NFTEVDVElPTjogJyArIHNyX3NlbGVjdGlvbi5EZXJlZigpLnBvaW50ZXJCdWZmZXIoKS50b1N0cmluZygnaGV4JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyX3RhcmdldC5EZXJlZigpLnBvaW50ZXJCdWZmZXIoKS5jb3B5KGV2X3RhcmdldC50b0J1ZmZlcigpKTsgY29uc29sZS5pbmZvMSgnVEFSR0VUOiAnICsgc3JfdGFyZ2V0LkRlcmVmKCkucG9pbnRlckJ1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JfdGltZS5EZXJlZigpLnBvaW50ZXJCdWZmZXIoKS5jb3B5KGV2X3RpbWUudG9CdWZmZXIoKSk7IGNvbnNvbGUuaW5mbzEoJ1RJTUU6ICcgKyBzcl90aW1lLkRlcmVmKCkucG9pbnRlckJ1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcl90YXJnZXQuRGVyZWYoKS5WYWwgPT0gdGhpcy5fbWFzdGVyUHJvbWlzZS5GTVRJRC5WYWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8xKCdVVEY4IFJlcXVlc3QgZm9yOiAnICsgY2xpcHRleHQuU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMShzcl9kaXNwbGF5LlZhbCwgc3JfcmVxdWVzdG9yLkRlcmVmKCkuVmFsLCBzcl9wcm9wZXJ0eS5EZXJlZigpLlZhbCwgc3JfdGFyZ2V0LkRlcmVmKCkuVmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhDaGFuZ2VQcm9wZXJ0eShzcl9kaXNwbGF5LkRlcmVmKCksIHNyX3JlcXVlc3Rvci5EZXJlZigpLCBzcl9wcm9wZXJ0eS5EZXJlZigpLCBzcl90YXJnZXQuRGVyZWYoKSwgOCwgUHJvcE1vZGVSZXBsYWNlLCBjbGlwdGV4dCwgY2xpcHRleHQuX3NpemUgLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhTeW5jKHNyX2Rpc3BsYXkuRGVyZWYoKSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyX3Byb3BlcnR5LkRlcmVmKCkucG9pbnRlckJ1ZmZlcigpLmNvcHkoZXZfcHJvcGVydHkudG9CdWZmZXIoKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8xKCdVbmtub3duIEZvcm1hdCBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2X3Byb3BlcnR5LnBvaW50ZXJCdWZmZXIoKS53cml0ZVVJbnQzMkxFKE5vbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhTZW5kRXZlbnQoc3JfZGlzcGxheS5EZXJlZigpLCBzcl9yZXF1ZXN0b3IuRGVyZWYoKSwgMSwgMCwgZXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBjb25zb2xlLmxvZyk7CiAgICB9Cn0KCmZ1bmN0aW9uIHdpbl9yZWFkdGV4dCgpCnsKICAgIHZhciBoOwogICAgdmFyIHJldCA9ICcnOwogICAgdmFyIEdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsQWxsb2MnKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsTG9jaycpOwogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHbG9iYWxVbmxvY2snKTsKCiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdDbG9zZUNsaXBib2FyZCcpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ0dldENsaXBib2FyZERhdGEnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ09wZW5DbGlwYm9hcmQnKTsKCiAgICB1c2VyMzIuT3BlbkNsaXBib2FyZCgwKTsKCiAgICBpZiAodXNlcjMyLklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1VOSUNPREVURVhUKS5WYWwgIT0gMCkKICAgIHsNCiAgICAgICAgaCA9IHVzZXIzMi5HZXRDbGlwYm9hcmREYXRhKENGX1VOSUNPREVURVhUKTsNCiAgICAgICAgaWYgKGguVmFsICE9IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBoYnVmZmVyID0ga2VybmVsMzIuR2xvYmFsTG9jayhoKTsKICAgICAgICAgICAgaGJ1ZmZlci5fc2l6ZSA9IC0xOwogICAgICAgICAgICByZXQgPSBoYnVmZmVyLldpZGUyVVRGODsKICAgICAgICAgICAga2VybmVsMzIuR2xvYmFsVW5sb2NrKGgpOw0KICAgICAgICB9DQogICAgfQogICAgZWxzZQogICAgew0KICAgICAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgcC5fcmVqKCdVbmtub3duIENsaXBib2FyZCBEYXRhJyk7CiAgICAgICAgcmV0dXJuIChwKTsNCiAgICB9CgoKICAgIHVzZXIzMi5DbG9zZUNsaXBib2FyZCgpOwoKICAgIHZhciBwID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsKICAgIHAuX3JlcyhyZXQpOwogICAgcmV0dXJuIChwKTsKfQoKZnVuY3Rpb24gd2luX2NvcHl0ZXh0KHR4dCkKewogICAgdmFyIEdNRU1fTU9WRUFCTEUgPSAweDAwMDI7CiAgICB2YXIgQ0ZfVEVYVCA9IDE7CgogICAgdmFyIEdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsQWxsb2MnKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsTG9jaycpOwogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHbG9iYWxVbmxvY2snKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ0Nsb3NlQ2xpcGJvYXJkJyk7CiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdFbXB0eUNsaXBib2FyZCcpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ09wZW5DbGlwYm9hcmQnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ1NldENsaXBib2FyZERhdGEnKTsKCiAgICB2YXIgbXR4dCA9IEdNLkNyZWF0ZVZhcmlhYmxlKHR4dCwgeyB3aWRlOiB0cnVlIH0pOyAKICAgIHZhciBoID0ga2VybmVsMzIuR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgbXR4dC5fc2l6ZSk7CiAgICBoLmF1dG9GcmVlKGZhbHNlKTsKICAgIHZhciBoYnVmZmVyID0ga2VybmVsMzIuR2xvYmFsTG9jayhoKTsKICAgIGhidWZmZXIuYXV0b0ZyZWUoZmFsc2UpOwoKICAgIG10eHQudG9CdWZmZXIoKS5jb3B5KGhidWZmZXIuRGVyZWYoMCwgKDIgKiB0eHQubGVuZ3RoKSArIDIpLnRvQnVmZmVyKCkpOwogICAga2VybmVsMzIuR2xvYmFsVW5sb2NrKGgpOwoKICAgIHVzZXIzMi5PcGVuQ2xpcGJvYXJkKDApOwogICAgdXNlcjMyLkVtcHR5Q2xpcGJvYXJkKCk7CiAgICB1c2VyMzIuU2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgaCk7CiAgICB1c2VyMzIuQ2xvc2VDbGlwYm9hcmQoKTsKfQoKc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCnsKICAgIGNhc2UgJ3dpbjMyJzoKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbl9jb3B5dGV4dDsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5yZWFkID0gd2luX3JlYWR0ZXh0OwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnbGludXgnOgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGluX2NvcHl0ZXh0OwogICAgICAgIG1vZHVsZS5leHBvcnRzLnJlYWQgPSBsaW5fcmVhZHRleHQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgIGJyZWFrOwp9Cm1vZHVsZS5leHBvcnRzLm5hdGl2ZUFkZE1vZHVsZSA9IG5hdGl2ZUFkZE1vZHVsZTsKbW9kdWxlLmV4cG9ydHMuZGlzcGF0Y2hXcml0ZSA9IGRpc3BhdGNoV3JpdGU7Cm1vZHVsZS5leHBvcnRzLmRpc3BhdGNoUmVhZCA9IGRpc3BhdGNoUmVhZDs=", 7512);
ILibBase64DecodeEx((unsigned char*)_clipboard, 23512, (unsigned char*)_clipboard + 23512);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "clipboard"); duk_push_string(ctx, _clipboard + 23512);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_clipboard);
// Promise: This is very important, as it is used everywhere. Refer to /modules/promise.js to see a human readable version of promise.js
duk_peval_string_noresult(ctx, "addModule('promise', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciByZWZUYWJsZSA9IHt9OwoKZnVuY3Rpb24gZXZlbnRfc3dpdGNoZXJfaGVscGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQsIGZvcndhcmQpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ2V2ZW50X3N3aXRjaGVyJzsKICAgIHRoaXMuZnVuYyA9IGZ1bmN0aW9uIGZ1bmMoKQogICAgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgaWYgKGZ1bmMuZm9yd2FyZCAhPSBudWxsKSB7IGFyZ3MucHVzaChmdW5jLmZvcndhcmQpOyB9CiAgICAgICAgZm9yKHZhciBpIGluIGFyZ3VtZW50cykKICAgICAgICB7CiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKGZ1bmMudGFyZ2V0LmFwcGx5KGZ1bmMuZGVzaXJlZCwgYXJncykpOwogICAgfTsKICAgIHRoaXMuZnVuYy5kZXNpcmVkID0gZGVzaXJlZF9jYWxsZWU7CiAgICB0aGlzLmZ1bmMudGFyZ2V0ID0gdGFyZ2V0OwogICAgdGhpcy5mdW5jLmZvcndhcmQgPSBmb3J3YXJkOwogICAgdGhpcy5mdW5jLnNlbGYgPSB0aGlzOwp9CmZ1bmN0aW9uIGV2ZW50X3N3aXRjaGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQpCnsKICAgIHJldHVybiAobmV3IGV2ZW50X3N3aXRjaGVyX2hlbHBlcihkZXNpcmVkX2NhbGxlZSwgdGFyZ2V0KSk7Cn0KCmZ1bmN0aW9uIGV2ZW50X2ZvcndhcmRlcihzb3VyY2VPYmosIHNvdXJjZU5hbWUsIHRhcmdldE9iaiwgdGFyZ2V0TmFtZSkKewogICAgc291cmNlT2JqLm9uKHNvdXJjZU5hbWUsICAgKG5ldyBldmVudF9zd2l0Y2hlcl9oZWxwZXIodGFyZ2V0T2JqLCB0YXJnZXRPYmouZW1pdCwgdGFyZ2V0TmFtZSkpLmZ1bmMpOyAgICAgIAp9CgpmdW5jdGlvbiBQcm9taXNlKHByb21pc2VGdW5jKQp7CiAgICB0aGlzLl9PYmplY3RJRCA9ICdwcm9taXNlJzsKICAgIHRoaXMucHJvbWlzZSA9IHRoaXM7CiAgICB0aGlzLl9pbnRlcm5hbCA9IHsgX09iamVjdElEOiAncHJvbWlzZS5pbnRlcm5hbCcsIHByb21pc2U6IHRoaXMsIGZ1bmM6IHByb21pc2VGdW5jLCBjb21wbGV0ZWQ6IGZhbHNlLCBlcnJvcnM6IGZhbHNlLCBjb21wbGV0ZWRBcmdzOiBbXSB9OwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcy5faW50ZXJuYWwpOwogICAgdGhpcy5faW50ZXJuYWwub24oJ25ld0xpc3RlbmVyJywgZnVuY3Rpb24gKGV2ZW50TmFtZSwgZXZlbnRDYWxsYmFjaykKICAgIHsKICAgICAgICAvL2NvbnNvbGUubG9nKCduZXdMaXN0ZW5lcicsIGV2ZW50TmFtZSwgJ2Vycm9ycy8nICsgdGhpcy5lcnJvcnMgKyAnIGNvbXBsZXRlZC8nICsgdGhpcy5jb21wbGV0ZWQpOwogICAgICAgIHZhciByID0gbnVsbDsKCiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PSAncmVzb2x2ZWQnICYmICF0aGlzLmVycm9ycyAmJiB0aGlzLmNvbXBsZXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHIgPSBldmVudENhbGxiYWNrLmFwcGx5KHRoaXMsIHRoaXMuY29tcGxldGVkQXJncyk7CiAgICAgICAgICAgIGlmKHIhPW51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSgncmVzb2x2ZWQnLCByKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnROYW1lID09ICdyZWplY3RlZCcgJiYgdGhpcy5lcnJvcnMgJiYgdGhpcy5jb21wbGV0ZWQpCiAgICAgICAgewogICAgICAgICAgICBldmVudENhbGxiYWNrLmFwcGx5KHRoaXMsIHRoaXMuY29tcGxldGVkQXJncyk7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudE5hbWUgPT0gJ3NldHRsZWQnICYmIHRoaXMuY29tcGxldGVkKQogICAgICAgIHsKICAgICAgICAgICAgZXZlbnRDYWxsYmFjay5hcHBseSh0aGlzLCBbXSk7CiAgICAgICAgfQogICAgfSk7CiAgICB0aGlzLl9pbnRlcm5hbC5yZXNvbHZlciA9IGZ1bmN0aW9uIF9yZXNvbHZlcigpCiAgICB7CiAgICAgICAgaWYgKF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWQpIHsgcmV0dXJuOyB9CiAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmVycm9ycyA9IGZhbHNlOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWRBcmdzID0gW107CiAgICAgICAgdmFyIGFyZ3MgPSBbJ3Jlc29sdmVkJ107CiAgICAgICAgaWYgKHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSAmJiB0aGlzLmVtaXRfcmV0dXJuVmFsdWUoJ3Jlc29sdmVkJykgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWRBcmdzLnB1c2godGhpcy5lbWl0X3JldHVyblZhbHVlKCdyZXNvbHZlZCcpKTsKICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSgncmVzb2x2ZWQnKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGEgaW4gYXJndW1lbnRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuY29tcGxldGVkQXJncy5wdXNoKGFyZ3VtZW50c1thXSk7CiAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2FdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuZW1pdC5hcHBseShfcmVzb2x2ZXIuX3NlbGYsIGFyZ3MpOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5lbWl0KCdzZXR0bGVkJyk7CiAgICB9OwogICAgdGhpcy5faW50ZXJuYWwucmVqZWN0b3IgPSBmdW5jdGlvbiBfcmVqZWN0b3IoKQogICAgewogICAgICAgIGlmIChfcmVqZWN0b3IuX3NlbGYuY29tcGxldGVkKSB7IHJldHVybjsgfQogICAgICAgIF9yZWplY3Rvci5fc2VsZi5lcnJvcnMgPSB0cnVlOwogICAgICAgIF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWRBcmdzID0gW107CiAgICAgICAgdmFyIGFyZ3MgPSBbJ3JlamVjdGVkJ107CiAgICAgICAgZm9yICh2YXIgYSBpbiBhcmd1bWVudHMpCiAgICAgICAgewogICAgICAgICAgICBfcmVqZWN0b3IuX3NlbGYuY29tcGxldGVkQXJncy5wdXNoKGFyZ3VtZW50c1thXSk7CiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbYV0pOwogICAgICAgIH0KCiAgICAgICAgX3JlamVjdG9yLl9zZWxmLmVtaXQuYXBwbHkoX3JlamVjdG9yLl9zZWxmLCBhcmdzKTsKICAgICAgICBfcmVqZWN0b3IuX3NlbGYuZW1pdCgnc2V0dGxlZCcpOwogICAgfTsKICAgIHRoaXMuY2F0Y2ggPSBmdW5jdGlvbihmdW5jKQogICAgewogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3JlamVjdGVkJywgZXZlbnRfc3dpdGNoZXIodGhpcywgZnVuYykuZnVuYyk7CiAgICB9CiAgICB0aGlzLmZpbmFsbHkgPSBmdW5jdGlvbiAoZnVuYykKICAgIHsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdzZXR0bGVkJywgZXZlbnRfc3dpdGNoZXIodGhpcywgZnVuYykuZnVuYyk7CiAgICB9OwogICAgdGhpcy50aGVuID0gZnVuY3Rpb24gKHJlc29sdmVkLCByZWplY3RlZCkKICAgIHsKICAgICAgICBpZiAocmVzb2x2ZWQpIHsgdGhpcy5faW50ZXJuYWwub25jZSgncmVzb2x2ZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCByZXNvbHZlZCkuZnVuYyk7IH0KICAgICAgICBpZiAocmVqZWN0ZWQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdyZWplY3RlZCcsIGV2ZW50X3N3aXRjaGVyKHRoaXMsIHJlamVjdGVkKS5mdW5jKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5faW50ZXJuYWwub25jZSgncmVqZWN0ZWQnLCBmdW5jdGlvbiAoZSkgeyBwcm9jZXNzLmVtaXQoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgJ3Byb21pc2UudW5oYW5kbGVkUmVqZWN0aW9uOiAnICsgZSk7IH0pOwogICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIHZhciByZXRWYWwgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAociwgaikgeyB9KTsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdyZXNvbHZlZCcsIHJldFZhbC5faW50ZXJuYWwucmVzb2x2ZXIpOwogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3JlamVjdGVkJywgcmV0VmFsLl9pbnRlcm5hbC5yZWplY3Rvcik7CiAgICAgICAgcmV0VmFsLnBhcmVudFByb21pc2UgPSB0aGlzOwogICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgIH07CgogICAgdGhpcy5faW50ZXJuYWwucmVzb2x2ZXIuX3NlbGYgPSB0aGlzLl9pbnRlcm5hbDsKICAgIHRoaXMuX2ludGVybmFsLnJlamVjdG9yLl9zZWxmID0gdGhpcy5faW50ZXJuYWw7OwoKICAgIHRyeQogICAgewogICAgICAgIHByb21pc2VGdW5jLmNhbGwodGhpcywgdGhpcy5faW50ZXJuYWwucmVzb2x2ZXIsIHRoaXMuX2ludGVybmFsLnJlamVjdG9yKTsKICAgIH0KICAgIGNhdGNoKGUpCiAgICB7CiAgICAgICAgdGhpcy5faW50ZXJuYWwuZXJyb3JzID0gdHJ1ZTsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIHRoaXMuX2ludGVybmFsLmNvbXBsZXRlZEFyZ3MgPSBbZV07CiAgICAgICAgdGhpcy5faW50ZXJuYWwuZW1pdCgncmVqZWN0ZWQnLCBlKTsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5lbWl0KCdzZXR0bGVkJyk7CiAgICB9CgogICAgaWYoIXRoaXMuX2ludGVybmFsLmNvbXBsZXRlZCkKICAgIHsKICAgICAgICAvLyBTYXZlIHJlZmVyZW5jZSBvZiB0aGlzIG9iamVjdAogICAgICAgIHJlZlRhYmxlW3RoaXMuX2ludGVybmFsLl9oYXNoQ29kZSgpXSA9IHRoaXMuX2ludGVybmFsOwogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3NldHRsZWQnLCBmdW5jdGlvbiAoKSB7IHJlZlRhYmxlW3RoaXMuX2hhc2hDb2RlKCldID0gbnVsbDsgfSk7CiAgICB9Cn0KClByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc29sdmUoKQp7CiAgICB2YXIgcmV0VmFsID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIGopIHsgfSk7CiAgICB2YXIgYXJncyA9IFtdOwogICAgZm9yICh2YXIgaSBpbiBhcmd1bWVudHMpCiAgICB7CiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICB9CiAgICByZXRWYWwuX2ludGVybmFsLnJlc29sdmVyLmFwcGx5KHJldFZhbC5faW50ZXJuYWwsIGFyZ3MpOwogICAgcmV0dXJuIChyZXRWYWwpOwp9OwpQcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uIHJlamVjdCgpIHsKICAgIHZhciByZXRWYWwgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAociwgaikgeyB9KTsKICAgIHZhciBhcmdzID0gW107CiAgICBmb3IgKHZhciBpIGluIGFyZ3VtZW50cykgewogICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgfQogICAgcmV0VmFsLl9pbnRlcm5hbC5yZWplY3Rvci5hcHBseShyZXRWYWwuX2ludGVybmFsLCBhcmdzKTsKICAgIHJldHVybiAocmV0VmFsKTsKfTsKUHJvbWlzZS5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZUxpc3QpCnsKICAgIHZhciByZXQgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopCiAgICB7CiAgICAgICAgdGhpcy5fX3JlamVjdG9yID0gcmVqOwogICAgICAgIHRoaXMuX19yZXNvbHZlciA9IHJlczsKICAgICAgICB0aGlzLl9fcHJvbWlzZUxpc3QgPSBwcm9taXNlTGlzdDsKICAgICAgICB0aGlzLl9fZG9uZSA9IGZhbHNlOwogICAgICAgIHRoaXMuX19jb3VudCA9IDA7CiAgICB9KTsKCiAgICBmb3IgKHZhciBpIGluIHByb21pc2VMaXN0KQogICAgewogICAgICAgIHByb21pc2VMaXN0W2ldLnRoZW4oZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFN1Y2Nlc3MKICAgICAgICAgICAgaWYoKytyZXQuX19jb3VudCA9PSByZXQuX19wcm9taXNlTGlzdC5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldC5fX2RvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0Ll9fcmVzb2x2ZXIocmV0Ll9fcHJvbWlzZUxpc3QpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24gKGFyZykKICAgICAgICB7CiAgICAgICAgICAgIC8vIEZhaWx1cmUKICAgICAgICAgICAgaWYoIXJldC5fX2RvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldC5fX2RvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0Ll9fcmVqZWN0b3IoYXJnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgaWYgKHByb21pc2VMaXN0Lmxlbmd0aCA9PSAwKQogICAgewogICAgICAgIHJldC5fX3Jlc29sdmVyKHByb21pc2VMaXN0KTsKICAgIH0KICAgIHJldHVybiAocmV0KTsKfTsKCm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTsKbW9kdWxlLmV4cG9ydHMuZXZlbnRfc3dpdGNoZXIgPSBldmVudF9zd2l0Y2hlcjsKbW9kdWxlLmV4cG9ydHMuZXZlbnRfZm9yd2FyZGVyID0gZXZlbnRfZm9yd2FyZGVyO/==', 'base64').toString());");
#ifdef WIN32
// Adding win-registry, since it is very useful for windows... Refer to /modules/win-registry.js to see a human readable version
duk_peval_string_noresult(ctx, "addModule('win-registry', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBLRVlfUVVFUllfVkFMVUUgPSAweDAwMDE7CnZhciBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTID0gMHgwMDA4Owp2YXIgS0VZX1dSSVRFID0gMHgyMDAwNjsKCnZhciBLRVlfREFUQV9UWVBFUyA9CiAgICB7CiAgICAgICAgUkVHX05PTkU6IDAsCiAgICAgICAgUkVHX1NaOiAxLAogICAgICAgIFJFR19FWFBBTkRfU1o6IDIsCiAgICAgICAgUkVHX0JJTkFSWTogMywKICAgICAgICBSRUdfRFdPUkQ6IDQsCiAgICAgICAgUkVHX0RXT1JEX0JJR19FTkRJQU46IDUsCiAgICAgICAgUkVHX0xJTks6IDYsCiAgICAgICAgUkVHX01VTFRJX1NaOiA3LAogICAgICAgIFJFR19SRVNPVVJDRV9MSVNUOiA4LAogICAgICAgIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1I6IDksCiAgICAgICAgUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUOiAxMCwKICAgICAgICBSRUdfUVdPUkQ6IDExCiAgICB9OwoKZnVuY3Rpb24gd2luZG93c19yZWdpc3RyeSgpCnsKICAgIHRoaXMuX09iamVjdElkID0gJ3dpbi1yZWdpc3RyeSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9BZHZBcGkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0NyZWF0ZUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnT3BlbktleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlJbmZvS2V5VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlWYWx1ZUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnQ2xvc2VLZXknKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZUtleVcnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnU2V0VmFsdWVFeFcnKTsKICAgIHRoaXMuSEtFWSA9IHsgUm9vdDogQnVmZmVyLmZyb20oJzgwMDAwMDAwJywgJ2hleCcpLnN3YXAzMigpLCBDdXJyZW50VXNlcjogQnVmZmVyLmZyb20oJzgwMDAwMDAxJywgJ2hleCcpLnN3YXAzMigpLCBMb2NhbE1hY2hpbmU6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMicsICdoZXgnKS5zd2FwMzIoKSwgVXNlcnM6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMycsICdoZXgnKS5zd2FwMzIoKSB9OwoKICAgIHRoaXMuUXVlcnlLZXkgPSBmdW5jdGlvbiBRdWVyeUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgdmFyIGVycjsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIHZhciBsZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgIHZhciB2YWxUeXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICB2YXIgSEsgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSk7CiAgICAgICAgdmFyIHJldFZhbCA9IG51bGw7CiAgICAgICAgaWYgKGtleSkgeyBrZXkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSwgeyB3aWRlOiB0cnVlIH0pOyB9CiAgICAgICAgaWYgKCFwYXRoKSB7IHBhdGggPSAnJzsgfQoKCiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9BZHZBcGkuUmVnT3BlbktleUV4VyhISywgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShwYXRoLCB7IHdpZGU6IHRydWUgfSksIDAsIEtFWV9RVUVSWV9WQUxVRSB8IEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMsIGgpLlZhbCkgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoICsgJyA9PiBSZXR1cm5lZCBFcnJvcjogJyArIGVycik7CiAgICAgICAgfQogIAoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXkgPyBrZXkgOiAwLCAwLCAwLCAwLCBsZW4pLlZhbCA9PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUobGVuLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXkgPyBrZXkgOiAwLCAwLCB2YWxUeXBlLCBkYXRhLCBsZW4pLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsVHlwZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkRfQklHX0VORElBTjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpLnJlYWRVSW50MzJCRSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19TWjoKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19FWFBBTkRfU1o6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk6CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2RhdGEgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3R5cGUgPSB2YWxUeXBlLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGtleSkgICAgLy8gT25seSB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXhwbGljaXQga2V5IHdhcyBzcGVjaWZpZWQsIGJlY3Vhc2UgaXQgd2Fzbid0IGZvdW5kLiBPdGhlcndpc2UsIGFsbCB3ZSBrbm93IGlzIHRoYXQgYSBkZWZhdWx0IHZhbHVlIHdhc24ndCBzZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgICAgIHRocm93ICgnTm90IEZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0KCgoKICAgICAgICBpZiAoKHBhdGggPT0gJycgJiYgIWtleSkgfHwgIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSB7IHN1YmtleXM6IFtdLCB2YWx1ZXM6IFtdLCBkZWZhdWx0OiByZXRWYWwgfTsKICAgICAgICAgICAgaWYgKCFrZXkgJiYgIXJldFZhbCkgeyBkZWxldGUgcmVzdWx0LmRlZmF1bHQ7IH0KCiAgICAgICAgICAgIC8vIEVudW1lcmF0ZSAga2V5cwogICAgICAgICAgICB2YXIgYWNoQ2xhc3MgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgICAgICAgICB2YXIgYWNoS2V5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsKICAgICAgICAgICAgdmFyIGFjaFZhbHVlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgzMjc2OCk7CiAgICAgICAgICAgIHZhciBhY2hWYWx1ZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbmFtZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyAKICAgICAgICAgICAgdmFyIGFjaENsYXNzU2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7IGFjaENsYXNzU2l6ZS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7CiAgICAgICAgICAgIHZhciBudW1TdWJLZXlzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIG51bVZhbHVlcyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0U3Via2V5U2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0Q2xhc3NTdHJpbmcgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbG9uZ2VzdFZhbHVlTmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0VmFsdWVEYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIHNlY3VyaXR5RGVzY3JpcHRvciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsYXN0V3JpdGVUaW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg4KTsKCiAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdRdWVyeUluZm9LZXlXKGguRGVyZWYoKSwgYWNoQ2xhc3MsIGFjaENsYXNzU2l6ZSwgMCwKICAgICAgICAgICAgICAgIG51bVN1YktleXMsIGxvbmdlc3RTdWJrZXlTaXplLCBsb25nZXN0Q2xhc3NTdHJpbmcsIG51bVZhbHVlcywKICAgICAgICAgICAgICAgIGxvbmdlc3RWYWx1ZU5hbWUsIGxvbmdlc3RWYWx1ZURhdGEsIHNlY3VyaXR5RGVzY3JpcHRvciwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgIGlmIChyZXRWYWwuVmFsICE9IDApIHsgdGhyb3cgKCdSZWdRdWVyeUluZm9LZXlXKCkgcmV0dXJuZWQgZXJyb3I6ICcgKyByZXRWYWwuVmFsKTsgfQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtU3ViS2V5cy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWVTaXplLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsKICAgICAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdFbnVtS2V5RXhXKGguRGVyZWYoKSwgaSwgYWNoS2V5LCBuYW1lU2l6ZSwgMCwgMCwgMCwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgICAgICBpZihyZXRWYWwuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN1YmtleXMucHVzaChhY2hLZXkuV2lkZTJVVEY4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlcy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhY2hWYWx1ZVNpemUudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMyNzY4KTsKICAgICAgICAgICAgICAgIGlmKHRoaXMuX0FkdkFwaS5SZWdFbnVtVmFsdWVXKGguRGVyZWYoKSwgaSwgYWNoVmFsdWUsIGFjaFZhbHVlU2l6ZSwgMCwgMCwgMCwgMCkuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlcy5wdXNoKGFjaFZhbHVlLldpZGUyVVRGOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgfTsKICAgIHRoaXMuV3JpdGVLZXkgPSBmdW5jdGlvbiBXcml0ZUtleShoa2V5LCBwYXRoLCBrZXksIHZhbHVlKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgdmFyIGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKCiAgICAgICAgaWYgKHRoaXMuX0FkdkFwaS5SZWdDcmVhdGVLZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgMCwgMCwgS0VZX1dSSVRFLCAwLCBoLCAwKS5WYWwgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnRXJyb3IgT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoKTsKICAgICAgICB9CgogICAgICAgIHZhciBkYXRhOwogICAgICAgIHZhciBkYXRhVHlwZTsKCiAgICAgICAgc3dpdGNoKHR5cGVvZih2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gS0VZX0RBVEFfVFlQRVMuUkVHX0RXT1JEOwogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICBkYXRhLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh2YWx1ZSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdudW1iZXInOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHZhbHVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdHJpbmcnOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfU1o7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdmFsdWUuY29weShkYXRhLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1NldFZhbHVlRXhXKGguRGVyZWYoKSwga2V5P3RoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSk6MCwgMCwgZGF0YVR5cGUsIGRhdGEsIGRhdGEuX3NpemUpLlZhbCAhPSAwKQogICAgICAgIHsgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgdGhyb3cgKCdFcnJvciB3cml0aW5nIHJlZyBrZXk6ICcgKyBrZXkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgIH07CiAgICB0aGlzLkRlbGV0ZUtleSA9IGZ1bmN0aW9uIERlbGV0ZUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgaWYoIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9BZHZBcGkuUmVnRGVsZXRlS2V5Vyh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCwgeyB3aWRlOiB0cnVlIH0pKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBEZWxldGluZyBLZXk6ICcgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ09wZW5LZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgS0VZX1FVRVJZX1ZBTFVFIHwgS0VZX1dSSVRFLCBoKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBPcGVuaW5nIFJlZ2lzdHJ5IEtleTogJyArIHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fQWR2QXBpLlJlZ0RlbGV0ZVZhbHVlVyhoLkRlcmVmKCksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSkpLlZhbCkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yWycgKyByZXN1bHQgKyAnXSBEZWxldGluZyBLZXk6ICcgKyBwYXRoICsgJy4nICsga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICB9CiAgICB9OwogICAgdGhpcy51c2VybmFtZVRvVXNlcktleSA9IGZ1bmN0aW9uIHVzZXJuYW1lVG9Vc2VyS2V5KHVzZXIpDQogICAgew0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHNpZCA9IHVzZXI7DQogICAgICAgICAgICBpZiAodHlwZW9mICh1c2VyKSA9PSAnc3RyaW5nJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuUXVlcnlLZXkodGhpcy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NBTVxcU0FNXFxEb21haW5zXFxBY2NvdW50XFxVc2Vyc1xcTmFtZXNcXCcgKyB1c2VyKTsNCiAgICAgICAgICAgICAgICBzaWQgPSByLmRlZmF1bHQuX3R5cGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgdSA9IHRoaXMuUXVlcnlLZXkodGhpcy5IS0VZLlVzZXJzKTsNCiAgICAgICAgICAgIGZvcihpIGluIHUuc3Via2V5cykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZih1LnN1YmtleXNbaV0uZW5kc1dpdGgoJy0nICsgc2lkKSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAodS5zdWJrZXlzW2ldKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgew0KICAgICAgICB9DQoNCiAgICAgICAgLy8gTm90IEZvdW5kIHlldCwgc28gbGV0J3MgdHJ5IHRvIGJydXRlLWZvcmNlIGl0DQogICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5RdWVyeUtleSh0aGlzLkhLRVkuVXNlcnMpOw0KICAgICAgICBmb3IoaSBpbiBlbnRyaWVzLnN1YmtleXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKGVudHJpZXMuc3Via2V5c1tpXS5zcGxpdCgnLScpLmxlbmd0aD41ICYmICFlbnRyaWVzLnN1YmtleXNbaV0uZW5kc1dpdGgoJ19DbGFzc2VzJykpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5RdWVyeUtleSh0aGlzLkhLRVkuVXNlcnMsIGVudHJpZXMuc3Via2V5c1tpXSArICdcXFZvbGF0aWxlIEVudmlyb25tZW50JywgJ1VTRVJOQU1FJykgPT0gdXNlcikNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRyaWVzLnN1YmtleXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoKGVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhyb3cgKCdVbmFibGUgdG8gZGV0ZXJtaW5lIEhLRVlfVVNFUlMga2V5IGZvcjogJyArIHVzZXIpOw0KICAgIH07Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IHdpbmRvd3NfcmVnaXN0cnkoKTsKCv==', 'base64').toString());");
// Adding PE_Parser, since it is very userful for windows.. Refer to /modules/PE_Parser.js to see a human readable version
duk_peval_string_noresult(ctx, "addModule('PE_Parser', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCi8vIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4ZWN1dGFibGUKZnVuY3Rpb24gcGFyc2UoZXhlUGF0aCkKewogICAgdmFyIHJldFZhbCA9IHt9OwogICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKGV4ZVBhdGgsICdyYicpOwogICAgdmFyIGJ5dGVzUmVhZDsKICAgIHZhciBkb3NIZWFkZXIgPSBCdWZmZXIuYWxsb2MoNjQpOwogICAgdmFyIG50SGVhZGVyID0gQnVmZmVyLmFsbG9jKDI0KTsKICAgIHZhciBvcHRIZWFkZXI7CgogICAgLy8gUmVhZCB0aGUgRE9TIGhlYWRlcgogICAgYnl0ZXNSZWFkID0gZnMucmVhZFN5bmMoZmQsIGRvc0hlYWRlciwgMCwgNjQsIDApOwogICAgaWYgKGRvc0hlYWRlci5yZWFkVUludDE2TEUoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgIT0gJzVBNEQnKQogICAgewogICAgICAgIHRocm93ICgndW5yZWNvZ25pemVkIGJpbmFyeSBmb3JtYXQnKTsKICAgIH0KCiAgICAvLyBSZWFkIHRoZSBOVCBoZWFkZXIKICAgIGJ5dGVzUmVhZCA9IGZzLnJlYWRTeW5jKGZkLCBudEhlYWRlciwgMCwgbnRIZWFkZXIubGVuZ3RoLCBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSk7CiAgICBpZiAobnRIZWFkZXIuc2xpY2UoMCwgNCkudG9TdHJpbmcoJ2hleCcpICE9ICc1MDQ1MDAwMCcpCiAgICB7CiAgICAgICAgdGhyb3cgKCdub3QgYSBQRSBmaWxlJyk7CiAgICB9CiAgICBzd2l0Y2ggKG50SGVhZGVyLnJlYWRVSW50MTZMRSg0KS50b1N0cmluZygxNikpCiAgICB7CiAgICAgICAgY2FzZSAnMTRjJzogLy8gMzIgYml0CiAgICAgICAgICAgIHJldFZhbC5mb3JtYXQgPSAneDg2JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnODY2NCc6IC8vIDY0IGJpdAogICAgICAgICAgICByZXRWYWwuZm9ybWF0ID0gJ3g2NCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IC8vIFVua25vd24KICAgICAgICAgICAgcmV0VmFsLmZvcm1hdCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0VmFsLm9wdGlvbmFsSGVhZGVyU2l6ZSA9IG50SGVhZGVyLnJlYWRVSW50MTZMRSgyMCk7CiAgICByZXRWYWwub3B0aW9uYWxIZWFkZXJTaXplQWRkcmVzcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjA7CgogICAgLy8gUmVhZCB0aGUgb3B0aW9uYWwgaGVhZGVyCiAgICBvcHRIZWFkZXIgPSBCdWZmZXIuYWxsb2MobnRIZWFkZXIucmVhZFVJbnQxNkxFKDIwKSk7CiAgICBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmZCwgb3B0SGVhZGVyLCAwLCBvcHRIZWFkZXIubGVuZ3RoLCBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSArIDI0KTsKICAgIHZhciBudW1SVkEgPSB1bmRlZmluZWQ7CgogICAgcmV0VmFsLkNoZWNrU3VtUG9zID0gZG9zSGVhZGVyLnJlYWRVSW50MzJMRSg2MCkgKyAyNCArIDY0OwogICAgcmV0VmFsLlNpemVPZkNvZGUgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDQpOwogICAgcmV0VmFsLlNpemVPZkluaXRpYWxpemVkRGF0YSA9IG9wdEhlYWRlci5yZWFkVUludDMyTEUoOCk7CiAgICByZXRWYWwuU2l6ZU9mVW5Jbml0aWFsaXplZERhdGEgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDEyKTsKCiAgICBzd2l0Y2ggKG9wdEhlYWRlci5yZWFkVUludDE2TEUoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpCiAgICB7CiAgICAgICAgY2FzZSAnMTBCJzogLy8gMzIgYml0IGJpbmFyeQogICAgICAgICAgICBudW1SVkEgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDkyKTsKICAgICAgICAgICAgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzID0gb3B0SGVhZGVyLnJlYWRVSW50MzJMRSgxMjgpOwogICAgICAgICAgICByZXRWYWwuQ2VydGlmaWNhdGVUYWJsZVNpemUgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDEzMik7CiAgICAgICAgICAgIHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlU2l6ZVBvcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjQgKyAxMzI7CiAgICAgICAgICAgIHJldFZhbC5ydmFTdGFydEFkZHJlc3MgPSBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSArIDI0ICsgOTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzIwQic6IC8vIDY0IGJpdCBiaW5hcnkKICAgICAgICAgICAgbnVtUlZBID0gb3B0SGVhZGVyLnJlYWRVSW50MzJMRSgxMDgpOwogICAgICAgICAgICByZXRWYWwuQ2VydGlmaWNhdGVUYWJsZUFkZHJlc3MgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDE0NCk7CiAgICAgICAgICAgIHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlU2l6ZSA9IG9wdEhlYWRlci5yZWFkVUludDMyTEUoMTQ4KTsKICAgICAgICAgICAgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVTaXplUG9zID0gZG9zSGVhZGVyLnJlYWRVSW50MzJMRSg2MCkgKyAyNCArIDE0ODsKICAgICAgICAgICAgcmV0VmFsLnJ2YVN0YXJ0QWRkcmVzcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjQgKyAxMTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93ICgnVW5rbm93biBWYWx1ZSBmb3VuZCBmb3IgT3B0aW9uYWwgTWFnaWM6ICcgKyBudEhlYWRlci5yZWFkVUludDE2TEUoMjQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXRWYWwucnZhQ291bnQgPSBudW1SVkE7CgogICAgaWYgKHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlQWRkcmVzcykKICAgIHsKICAgICAgICAvLyBSZWFkIHRoZSBhdXRoZW50aWNvZGUgY2VydGlmaWNhdGUsIG9ubHkgb25lIGNlcnQgKG9ubHkgdGhlIGZpcnN0IGVudHJ5KQogICAgICAgIHZhciBoZHIgPSBCdWZmZXIuYWxsb2MoOCk7CiAgICAgICAgZnMucmVhZFN5bmMoZmQsIGhkciwgMCwgaGRyLmxlbmd0aCwgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzKTsKICAgICAgICByZXRWYWwuY2VydGlmaWNhdGUgPSBCdWZmZXIuYWxsb2MoaGRyLnJlYWRVSW50MzJMRSgwKSk7CiAgICAgICAgZnMucmVhZFN5bmMoZmQsIHJldFZhbC5jZXJ0aWZpY2F0ZSwgMCwgcmV0VmFsLmNlcnRpZmljYXRlLmxlbmd0aCwgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzICsgaGRyLmxlbmd0aCk7CiAgICAgICAgcmV0VmFsLmNlcnRpZmljYXRlID0gcmV0VmFsLmNlcnRpZmljYXRlLnRvU3RyaW5nKCdiYXNlNjQnKTsKICAgICAgICByZXRWYWwuY2VydGlmaWNhdGVEd0xlbmd0aCA9IGhkci5yZWFkVUludDMyTEUoMCk7CiAgICB9CiAgICBmcy5jbG9zZVN5bmMoZmQpOwogICAgcmV0dXJuIChyZXRWYWwpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHBhcnNlOwoKCv==', 'base64').toString());");
// Windows Message Pump, refer to modules/win-message-pump.js
duk_peval_string_noresult(ctx, "addModule('win-message-pump', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgV0hfQ0FMTFdORFBST0MgPSA0Ow0KdmFyIFdNX1FVSVQgPSAgMHgwMDEyOw0KdmFyIFdNX0NMT1NFID0gMHgwMDEwOw0KdmFyIEdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQoNCmZ1bmN0aW9uIFdpbmRvd3NNZXNzYWdlUHVtcChvcHRpb25zKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gJ3dpbi1tZXNzYWdlLXB1bXAnOw0KICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zOw0KICAgIHZhciBlbWl0dGVyVXRpbHMgPSByZXF1aXJlKCdldmVudHMnKS5pbmhlcml0cyh0aGlzKTsNCiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ2h3bmQnKTsNCiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ2Vycm9yJyk7DQogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdtZXNzYWdlJyk7DQogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdleGl0Jyk7DQoNCiAgICB0aGlzLl9tc2cgPSBHTS5DcmVhdGVWYXJpYWJsZShHTS5Qb2ludGVyU2l6ZSA9PSA0ID8gMjggOiA0OCk7DQogICAgdGhpcy5fa2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7DQogICAgdGhpcy5fa2VybmVsMzIubXAgPSB0aGlzOw0KICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TGFzdEVycm9yJyk7DQogICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRNb2R1bGVIYW5kbGVBJyk7DQoNCiAgICB0aGlzLl91c2VyMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgnVXNlcjMyLmRsbCcpOw0KICAgIHRoaXMuX3VzZXIzMi5tcCA9IHRoaXM7DQogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnQ3JlYXRlV2luZG93RXhBJyk7DQogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRGVmV2luZG93UHJvY0EnKTsNCiAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdEZXN0cm95V2luZG93Jyk7DQogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRGlzcGF0Y2hNZXNzYWdlQScpOw0KICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ0dldE1lc3NhZ2VBJyk7DQogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnUG9zdE1lc3NhZ2VBJyk7DQogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnUmVnaXN0ZXJDbGFzc0V4QScpOw0KICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1NldFdpbmRvd1BvcycpOw0KICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1Nob3dXaW5kb3cnKTsNCiAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdUcmFuc2xhdGVNZXNzYWdlJyk7DQoNCg0KICAgIHRoaXMud25kY2xhc3MgPSBHTS5DcmVhdGVWYXJpYWJsZShHTS5Qb2ludGVyU2l6ZSA9PSA0ID8gNDggOiA4MCk7DQogICAgdGhpcy53bmRjbGFzcy5tcCA9IHRoaXM7DQogICAgdGhpcy53bmRjbGFzcy5oaW5zdGFuY2UgPSB0aGlzLl9rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKDApOw0KICAgIHRoaXMud25kY2xhc3MuY25hbWUgPSBHTS5DcmVhdGVWYXJpYWJsZSgnTWFpbldXV0NsYXNzJyk7DQogICAgdGhpcy53bmRjbGFzcy53bmRwcm9jID0gR00uR2V0R2VuZXJpY0dsb2JhbENhbGxiYWNrKDQpOw0KICAgIHRoaXMud25kY2xhc3Mud25kcHJvYy5tcCA9IHRoaXM7DQogICAgdGhpcy53bmRjbGFzcy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodGhpcy53bmRjbGFzcy5fc2l6ZSk7DQogICAgdGhpcy53bmRjbGFzcy5jbmFtZS5wb2ludGVyQnVmZmVyKCkuY29weSh0aGlzLnduZGNsYXNzLkRlcmVmKEdNLlBvaW50ZXJTaXplID09IDQgPyA0MCA6IDY0LCBHTS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7DQogICAgdGhpcy53bmRjbGFzcy53bmRwcm9jLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHRoaXMud25kY2xhc3MuRGVyZWYoOCwgR00uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOw0KICAgIHRoaXMud25kY2xhc3MuaGluc3RhbmNlLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHRoaXMud25kY2xhc3MuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDIwIDogMjQsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsNCiAgICB0aGlzLnduZGNsYXNzLnduZHByb2Mub24oJ0dsb2JhbENhbGxiYWNrJywgZnVuY3Rpb24gb25XbmRQcm9jKHhod25kLCB4bXNnLCB3cGFyYW0sIGxwYXJhbSkNCiAgICB7DQogICAgICAgIHZhciBwcm9jZXNzZWQgPSBmYWxzZTsNCiAgICAgICAgaWYgKHRoaXMubXAuX2h3bmQgIT0gbnVsbCAmJiB0aGlzLm1wLl9od25kLlZhbCA9PSB4aHduZC5WYWwpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFRoaXMgaXMgZm9yIHVzDQogICAgICAgICAgICBwcm9jZXNzZWQgPSB0cnVlOw0KICAgICAgICAgICAgdmFyIGQgPSB0aGlzLlN0YXJ0RGlzcGF0Y2hlcigpOw0KICAgICAgICAgICAgdGhpcy5tcC5lbWl0KCdtZXNzYWdlJywgeyBtZXNzYWdlOiB4bXNnLlZhbCwgd3BhcmFtOiB3cGFyYW0uVmFsLCBscGFyYW06IGxwYXJhbS5WYWwsIGxwYXJhbV9oZXg6IGxwYXJhbS5wb2ludGVyQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLCBscGFyYW1fcmF3OiBscGFyYW0sIGh3bmQ6IHhod25kLCBkaXNwYXRjaGVyOiBkIH0pOw0KDQogICAgICAgICAgICB2YXIgbXNnUmV0ID0gdGhpcy5tcC5lbWl0X3JldHVyblZhbHVlKCdtZXNzYWdlJyk7DQogICAgICAgICAgICBpZiAobXNnUmV0ID09IG51bGwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjYWxsIERlZldpbmRvd1Byb2NBLCBiZWN1YXNlIHRoaXMgbWVzc2FnZSB3YXMgbm90IGhhbmRsZWQNCiAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMubXAuX3VzZXIzMi5EZWZXaW5kb3dQcm9jQS5hc3luYyhkLCB4aHduZCwgeG1zZywgd3BhcmFtLCBscGFyYW0pOw0KICAgICAgICAgICAgICAgIHAuZGlzcGF0Y2hlciA9IHRoaXM7DQogICAgICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uIChyZXQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuRW5kRGlzcGF0Y2hlcihyZXQpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByID0gR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgICAgIHIuVmFsID0gbXNnUmV0Ow0KICAgICAgICAgICAgICAgIHRoaXMuRW5kRGlzcGF0Y2hlcihyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHRoaXMubXAuX2h3bmQgPT0gbnVsbCAmJiB0aGlzLkNhbGxpbmdUaHJlYWQoKSA9PSB0aGlzLm1wLl91c2VyMzIuUmVnaXN0ZXJDbGFzc0V4QS5hc3luYy50aHJlYWRJZCgpKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBUaGlzIG1lc3NhZ2Ugd2FzIGdlbmVyYXRlZCBmcm9tIG91ciBDcmVhdGVXaW5kb3dFeEEgbWV0aG9kDQogICAgICAgICAgICBwcm9jZXNzZWQgPSB0cnVlOw0KDQogICAgICAgICAgICB2YXIgZCA9IHRoaXMuU3RhcnREaXNwYXRjaGVyKCk7DQoNCiAgICAgICAgICAgIHRoaXMubXAuZW1pdCgnbWVzc2FnZScsIHsgbWVzc2FnZTogeG1zZy5WYWwsIHdwYXJhbTogd3BhcmFtLlZhbCwgbHBhcmFtOiBscGFyYW0uVmFsLCBscGFyYW1faGV4OiBscGFyYW0ucG9pbnRlckJ1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSwgaHduZDogeGh3bmQsIGRpc3BhdGNoZXI6IGQgfSk7DQoNCiAgICAgICAgICAgIHZhciBtc2dSZXQgPSB0aGlzLm1wLmVtaXRfcmV0dXJuVmFsdWUoJ21lc3NhZ2UnKTsNCiAgICAgICAgICAgIGlmIChtc2dSZXQgPT0gbnVsbCkNCnsNCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgRGVmV2luZG93UHJvY0EsIGJlY3Vhc2UgdGhpcyBtZXNzYWdlIHdhcyBub3QgaGFuZGxlZA0KICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcy5tcC5fdXNlcjMyLkRlZldpbmRvd1Byb2NBLmFzeW5jKGQsIHhod25kLCB4bXNnLCB3cGFyYW0sIGxwYXJhbSk7DQogICAgICAgICAgICAgICAgcC5kaXNwYXRjaGVyID0gdGhpczsNCiAgICAgICAgICAgICAgICBwLnRoZW4oZnVuY3Rpb24gKHJldCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5FbmREaXNwYXRjaGVyKHJldCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBHTS5DcmVhdGVQb2ludGVyKCk7DQogICAgICAgICAgICAgICAgci5WYWwgPSBtc2dSZXQ7DQogICAgICAgICAgICAgICAgdGhpcy5FbmREaXNwYXRjaGVyKHIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHByb2Nlc3NlZCkgeyBfZGVidWdHQygpOyB9DQogICAgfSk7DQoNCiAgICB0aGlzLl91c2VyMzIuUmVnaXN0ZXJDbGFzc0V4QS5hc3luYyh0aGlzLnduZGNsYXNzKS50aGVuKGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICBpZiAoIXRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMpICB7ICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucyA9IHt9OyAgfQ0KICAgICAgICBpZiAoIXRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93KSB7IHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93ID0ge307IH0NCiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmV4c3R5bGVzID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cuZXhzdHlsZXMgPSAweDAwMDAwMDg4OyB9ICAgIC8vIFRvcE1vc3QgVG9vbCBXaW5kb3cNCiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LndpbnN0eWxlcyA9PSBudWxsKSB7IHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LndpbnN0eWxlcyA9IDB4MDA4MDAwMDA7IH0gIC8vIFdTX0JPUkRFUg0KICAgICAgICBpZiAodGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueCA9PSBudWxsKSB7IHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LnggPSAwOyB9DQogICAgICAgIGlmICh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy55ID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueSA9IDA7IH0NCiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LndpZHRoID09IG51bGwpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2lkdGggPSAxMDA7IH0NCiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmhlaWdodCA9PSBudWxsKSB7IHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmhlaWdodCA9IDEwMDsgfQ0KDQogICAgICAgIHRoaXMubmF0aXZlUHJveHkuQ3JlYXRlV2luZG93RXhBLmFzeW5jKHRoaXMubmF0aXZlUHJveHkuUmVnaXN0ZXJDbGFzc0V4QS5hc3luYywgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cuZXhzdHlsZXMsIHRoaXMubmF0aXZlUHJveHkubXAud25kY2xhc3MuY25hbWUsDQogICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy50aXRsZSA9PSBudWxsID8gMCA6IEdNLkNyZWF0ZVZhcmlhYmxlKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LnRpdGxlKSwgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2luc3R5bGVzLCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy54LCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy55LA0KICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2lkdGgsIHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmhlaWdodCwgMCwgMCwgMCwgMCkNCiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGguVmFsID09IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvLyBFcnJvciBjcmVhdGluZyBoaWRkZW4gd2luZG93DQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuZW1pdCgnZXJyb3InLCAnRXJyb3IgY3JlYXRpbmcgaGlkZGVuIHdpbmRvdycpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9od25kID0gaDsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5lbWl0KCdod25kJywgaCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuX3N0YXJ0UHVtcCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgIH0pOw0KICAgIHRoaXMuX3N0YXJ0UHVtcCA9IGZ1bmN0aW9uIF9zdGFydFB1bXAoKQ0KICAgIHsNCiAgICAgICAgdGhpcy5fdXNlcjMyLkdldE1lc3NhZ2VBLmFzeW5jKHRoaXMuX3VzZXIzMi5SZWdpc3RlckNsYXNzRXhBLmFzeW5jLCB0aGlzLl9tc2csIHRoaXMuX2h3bmQsIDAsIDApLnRoZW4oZnVuY3Rpb24gKHIpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKHIuVmFsID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5LlRyYW5zbGF0ZU1lc3NhZ2UuYXN5bmModGhpcy5uYXRpdmVQcm94eS5SZWdpc3RlckNsYXNzRXhBLmFzeW5jLCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9tc2cpLnRoZW4oZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkuRGlzcGF0Y2hNZXNzYWdlQS5hc3luYyh0aGlzLm5hdGl2ZVByb3h5LlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMsIHRoaXMubmF0aXZlUHJveHkubXAuX21zZykudGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9zdGFydFB1bXAoKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy8gV2UgZ290IGEgJ1FVSVQnIG1lc3NhZ2UNCiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5LkRlc3Ryb3lXaW5kb3cuYXN5bmModGhpcy5uYXRpdmVQcm94eS5SZWdpc3RlckNsYXNzRXhBLmFzeW5jLCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9od25kKS50aGVuKGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5LlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMuYWJvcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubmF0aXZlUHJveHkubXAuX2h3bmQ7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuZW1pdCgnZXhpdCcsIDApOw0KDQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAud25kY2xhc3Mud25kcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ0dsb2JhbENhbGxiYWNrJyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAud25kY2xhc3Mud25kcHJvYyA9IG51bGw7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsgdGhpcy5uYXRpdmVQcm94eS5tcC5zdG9wKCk7IH0pOw0KICAgIH0NCg0KICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uIHN0b3AoKQ0KICAgIHsNCiAgICAgICAgaWYgKHRoaXMuX2h3bmQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX3VzZXIzMi5Qb3N0TWVzc2FnZUEodGhpcy5faHduZCwgV01fUVVJVCwgMCwgMCk7DQogICAgICAgICAgICB0aGlzLm9uY2UoJ2V4aXQnLCBmdW5jdGlvbiAoKSB7IHRoaXMud25kY2xhc3Mud25kcHJvYy5jbG9zZSgpIH0pOw0KICAgICAgICB9DQogICAgfTsNCiAgICB0aGlzLmNsb3NlID0gZnVuY3Rpb24gY2xvc2UoKQ0KICAgIHsNCiAgICAgICAgaWYgKHRoaXMuX2h3bmQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX3VzZXIzMi5Qb3N0TWVzc2FnZUEodGhpcy5faHduZCwgV01fQ0xPU0UsIDAsIDApOw0KICAgICAgICAgICAgdGhpcy5vbmNlKCdleGl0JywgZnVuY3Rpb24gKCkgeyB0aGlzLnduZGNsYXNzLnduZHByb2MuY2xvc2UoKTsgfSk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIHRoaXMub25jZSgnficsIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLnN0b3AoKTsNCiAgICB9KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSBXaW5kb3dzTWVzc2FnZVB1bXA7DQptb2R1bGUuZXhwb3J0cy5XaW5kb3dTdHlsZXMgPQ0KICAgIHsNCiAgICAgICAgV1NfQk9SREVSOiAweDAwODAwMDAwLCBXU19DQVBUSU9OOiAweDAwQzAwMDAwLCBXU19DSElMRDogMHg0MDAwMDAwMCwgV1NfQ0hJTERXSU5ET1c6IDB4NDAwMDAwMDAsIFdTX0NMSVBDSElMRFJFTjogMHgwMjAwMDAwMCwNCiAgICAgICAgV1NfQ0xJUFNJQkxJTkdTOiAweDA0MDAwMDAwLCBXU19ESVNBQkxFRDogMHgwODAwMDAwMCwgV1NfRExHRlJBTUU6IDB4MDA0MDAwMDAsIFdTX0dST1VQOiAweDAwMDIwMDAwLCBXU19IU0NST0xMOiAweDAwMTAwMDAwLA0KICAgICAgICBXU19JQ09OSUM6IDB4MjAwMDAwMDAsIFdTX01BWElNSVpFOiAweDAxMDAwMDAwLCBXU19NQVhJTUlaRUJPWDogMHgwMDAxMDAwMCwgV1NfTUlOSU1JWkU6IDB4MjAwMDAwMDAsIFdTX01JTklNSVpFQk9YOiAweDAwMDIwMDAwLA0KICAgICAgICBXU19PVkVSTEFQUEVEOiAweDAwMDAwMDAwLCBXU19QT1BVUDogMHg4MDAwMDAwMCwgV1NfU0laRUJPWDogMHgwMDA0MDAwMCwgV1NfU1lTTUVOVTogMHgwMDA4MDAwMCwgV1NfVEFCU1RPUDogMHgwMDAxMDAwMCwNCiAgICAgICAgV1NfVEhJQ0tGUkFNRTogMHgwMDA0MDAwMCwgV1NfVElMRUQ6IDB4MDAwMDAwMDAsIFdTX1ZJU0lCTEU6IDB4MTAwMDAwMDAsIFdTX1ZTQ1JPTEw6IDB4MDAyMDAwMDANCiAgICB9Ow0KbW9kdWxlLmV4cG9ydHMuV2luZG93U3R5bGVzRXggPQ0KICAgIHsNCiAgICAgICAgV1NfRVhfQUNDRVBURklMRVM6IDB4MDAwMDAwMTAsIFdTX0VYX0FQUFdJTkRPVzogMHgwMDA0MDAwMCwgV1NfRVhfQ0xJRU5URURHRTogMHgwMDAwMDIwMCwgV1NfRVhfQ09NUE9TSVRFRDogMHgwMjAwMDAwMCwNCiAgICAgICAgV1NfRVhfQ09OVEVYVEhFTFA6IDB4MDAwMDA0MDAsIFdTX0VYX0NPTlRST0xQQVJFTlQ6IDB4MDAwMTAwMDAsIFdTX0VYX0RMR01PREFMRlJBTUU6IDB4MDAwMDAwMDEsIFdTX0VYX0xBWUVSRUQ6IDB4MDAwODAwMCwNCiAgICAgICAgV1NfRVhfTEFZT1VUUlRMOiAweDAwNDAwMDAwLCBXU19FWF9MRUZUOiAweDAwMDAwMDAwLCBXU19FWF9MRUZUU0NST0xMQkFSOiAweDAwMDA0MDAwLCBXU19FWF9MVFJSRUFESU5HOiAweDAwMDAwMDAwLA0KICAgICAgICBXU19FWF9NRElDSElMRDogMHgwMDAwMDA0MCwgV1NfRVhfTk9BQ1RJVkFURTogMHgwODAwMDAwMCwgV1NfRVhfTk9JTkhFUklUTEFZT1VUOiAweDAwMTAwMDAwLCBXU19FWF9OT1BBUkVOVE5PVElGWTogMHgwMDAwMDAwNCwNCiAgICAgICAgV1NfRVhfTk9SRURJUkVDVElPTkJJVE1BUDogMHgwMDIwMDAwMCwgV1NfRVhfUklHSFQ6IDB4MDAwMDEwMDAsIFdTX0VYX1JJR0hUU0NST0xMQkFSOiAweDAwMDAwMDAwLCBXU19FWF9SVExSRUFESU5HOiAweDAwMDAyMDAwLA0KICAgICAgICBXU19FWF9TVEFUSUNFREdFOiAweDAwMDIwMDAwLCBXU19FWF9UT09MV0lORE9XOiAweDAwMDAwMDgwLCBXU19FWF9UT1BNT1NUOiAweDAwMDAwMDA4LCBXU19FWF9UUkFOU1BBUkVOVDogMHgwMDAwMDAyMCwgV1NfRVhfV0lORE9XRURHRTogMHgwMDAwMDEwMA0KICAgIH07DQo=', 'base64').toString());");
duk_peval_string_noresult(ctx, "addModule('win-console', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBUcmF5SWNvbkZsYWdzID0KICAgIHsKICAgICAgICBOSUZfTUVTU0FHRTogMHgwMDAwMDAwMSwKICAgICAgICBOSUZfSUNPTjogMHgwMDAwMDAwMiwKICAgICAgICBOSUZfVElQOiAweDAwMDAwMDA0LAogICAgICAgIE5JRl9TVEFURTogMHgwMDAwMDAwOCwKICAgICAgICBOSUZfSU5GTzogMHgwMDAwMDAxMCwKICAgICAgICBOSUZfR1VJRDogMHgwMDAwMDAyMCwKICAgICAgICBOSUZfUkVBTFRJTUU6IDB4MDAwMDAwNDAsCiAgICAgICAgTklGX1NIT1dUSVA6IDB4MDAwMDAwODAsCgogICAgICAgIE5JTV9BREQ6IDB4MDAwMDAwMDAsCiAgICAgICAgTklNX01PRElGWTogMHgwMDAwMDAwMSwKICAgICAgICBOSU1fREVMRVRFOiAweDAwMDAwMDAyLAogICAgICAgIE5JTV9TRVRGT0NVUzogMHgwMDAwMDAwMywKICAgICAgICBOSU1fU0VUVkVSU0lPTjogMHgwMDAwMDAwNAogICAgfTsKdmFyIE5PVElGWUlDT05fVkVSU0lPTl80ID0gNDsKdmFyIE1lc3NhZ2VUeXBlcyA9IHsgV01fQVBQOiAweDgwMDAsIFdNX1VTRVI6IDB4MDQwMCB9OwpmdW5jdGlvbiBXaW5kb3dzQ29uc29sZSgpCnsKICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpCiAgICB7CiAgICAgICAgdGhpcy5fT2JqZWN0SUQgPSAnd2luLWNvbnNvbGUnOwogICAgICAgIHRoaXMuX01hcnNoYWwgPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMiA9IHRoaXMuX01hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoImtlcm5lbDMyLmRsbCIpOwogICAgICAgIHRoaXMuX3VzZXIzMiA9IHRoaXMuX01hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoInVzZXIzMi5kbGwiKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoIkdldENvbnNvbGVXaW5kb3ciKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldEN1cnJlbnRUaHJlYWQnKTsKICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCJTaG93V2luZG93Iik7CiAgICAgICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgiTG9hZEltYWdlQSIpOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoeyBtZXRob2Q6ICdHZXRNZXNzYWdlQScsIHRocmVhZERpc3BhdGNoOiAxIH0pOwogICAgICAgIHRoaXMuX3NoZWxsMzIgPSB0aGlzLl9NYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdTaGVsbDMyLmRsbCcpOwogICAgICAgIHRoaXMuX3NoZWxsMzIuQ3JlYXRlTWV0aG9kKCdTaGVsbF9Ob3RpZnlJY29uQScpOwoKICAgICAgICB0aGlzLl9oYW5kbGUgPSB0aGlzLl9rZXJuZWwzMi5HZXRDb25zb2xlV2luZG93KCk7CiAgICAgICAgdGhpcy5taW5pbWl6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA2KTsKICAgICAgICB9OwogICAgICAgIHRoaXMucmVzdG9yZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA5KTsKICAgICAgICB9OwogICAgICAgIHRoaXMuaGlkZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCAwKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuc2hvdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA1KTsKICAgICAgICB9OwoKCiAgICAgICAgdGhpcy5fbG9hZGljb24gPSBmdW5jdGlvbiAoaW1hZ2VQYXRoKSB7CiAgICAgICAgICAgIHZhciBoID0gdGhpcy5fdXNlcjMyLkxvYWRJbWFnZUEoMCwgdGhpcy5fTWFyc2hhbC5DcmVhdGVWYXJpYWJsZShpbWFnZVBhdGgpLCAxLCAwLCAwLCAweDAwMDAwMDEwIHwgMHgwMDAwODAwMCB8IDB4MDAwMDAwNDApOyAvLyBMUl9MT0FERlJPTUZJTEUgfCBMUl9TSEFSRUQgfCBMUl9ERUZBVUxUU0laRQogICAgICAgICAgICByZXR1cm4gKGgpOwogICAgICAgIH07CgogICAgICAgIHRoaXMuU2V0VHJheUljb24gPSBmdW5jdGlvbiBTZXRUcmF5SWNvbihvcHRpb25zKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9NYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDUwOCA6IDUyOCk7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3N0cnVjdCBzaXplID0gJyArIGRhdGEuX3NpemUpOwogICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdUcnlJY29uLCBXTV9NRVNTQUdFIGZpbHRlciA9ICcgKyBvcHRpb25zLmZpbHRlcik7CiAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGRhdGEuX3NpemUsIDApOwoKICAgICAgICAgICAgdmFyIHRyYXlUeXBlID0gVHJheUljb25GbGFncy5OSUZfVElQIHwgVHJheUljb25GbGFncy5OSUZfTUVTU0FHRQogICAgICAgICAgICBvcHRpb25zLmZpbHRlciA9IE1lc3NhZ2VUeXBlcy5XTV9BUFAgKyAxOwogICAgICAgICAgICBkYXRhLkRlcmVmKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDE2IDogMjQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShvcHRpb25zLmZpbHRlcik7CgogICAgICAgICAgICBpZiAoIW9wdGlvbnMubm9CYWxsb29uKSB7IHRyYXlUeXBlIHw9IFRyYXlJY29uRmxhZ3MuTklGX0lORk87IH0KCiAgICAgICAgICAgIGlmIChvcHRpb25zLmljb24pCiAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0cmF5VHlwZSB8PSBUcmF5SWNvbkZsYWdzLk5JRl9JQ09OOwogICAgICAgICAgICAgICAgdmFyIGhJY29uID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAyMCA6IDMyLCB0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgIG9wdGlvbnMuaWNvbi5wb2ludGVyQnVmZmVyKCkuY29weShoSWNvbi50b0J1ZmZlcigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplICogMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOwogICAgICAgICAgICBkYXRhLkRlcmVmKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh0cmF5VHlwZSk7CiAgICAgICAgICAgIGRhdGEuRGVyZWYodGhpcy5fTWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNDE2IDogNDMyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoTk9USUZZSUNPTl9WRVJTSU9OXzQpOwoKICAgICAgICAgICAgdmFyIHN6VGlwID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAyNCA6IDQwLCAxMjgpOwogICAgICAgICAgICB2YXIgc3pJbmZvID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxNjAgOiAxNzYsIDI1Nik7CiAgICAgICAgICAgIHZhciBzekluZm9UaXRsZSA9IGRhdGEuRGVyZWYodGhpcy5fTWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNDIwIDogNDM2LCA2NCk7CgogICAgICAgICAgICBpZiAob3B0aW9ucy5zelRpcCkgeyBCdWZmZXIuZnJvbShvcHRpb25zLnN6VGlwKS5jb3B5KHN6VGlwLnRvQnVmZmVyKCkpOyB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLnN6SW5mbykgeyBCdWZmZXIuZnJvbShvcHRpb25zLnN6SW5mbykuY29weShzekluZm8udG9CdWZmZXIoKSk7IH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3pJbmZvVGl0bGUpIHsgQnVmZmVyLmZyb20ob3B0aW9ucy5zekluZm9UaXRsZSkuY29weShzekluZm9UaXRsZS50b0J1ZmZlcigpKTsgfQoKCiAgICAgICAgICAgIHZhciBNZXNzYWdlUHVtcCA9IHJlcXVpcmUoJ3dpbi1tZXNzYWdlLXB1bXAnKTsKICAgICAgICAgICAgcmV0VmFsID0geyBfT2JqZWN0SUQ6ICdXaW5kb3dzQ29uc29sZS5UcmF5SWNvbicsIE1lc3NhZ2VQdW1wOiBuZXcgTWVzc2FnZVB1bXAob3B0aW9ucykgfTsKICAgICAgICAgICAgdmFyIHJldFZhbEV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpLmluaGVyaXRzKHJldFZhbCk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnVG9hc3RDbGlja2VkJyk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnSWNvbkhvdmVyJyk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnVG9hc3REaXNtaXNzZWQnKTsKICAgICAgICAgICAgcmV0VmFsLk9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICByZXRWYWwuTWVzc2FnZVB1bXAuVHJheUljb24gPSByZXRWYWw7CiAgICAgICAgICAgIHJldFZhbC5NZXNzYWdlUHVtcC5Ob3RpZnlEYXRhID0gZGF0YTsKICAgICAgICAgICAgcmV0VmFsLk1lc3NhZ2VQdW1wLldpbmRvd3NDb25zb2xlID0gdGhpczsKICAgICAgICAgICAgcmV0VmFsLk1lc3NhZ2VQdW1wLm9uKCdleGl0JywgZnVuY3Rpb24gb25FeGl0KGNvZGUpIHsgY29uc29sZS5sb2coJ1B1bXAgRXhpdGVkJyk7IGlmICh0aGlzLlRyYXlJY29uKSB7IHRoaXMuVHJheUljb24ucmVtb3ZlKCk7IH0gfSk7CiAgICAgICAgICAgIHJldFZhbC5NZXNzYWdlUHVtcC5vbignaHduZCcsIGZ1bmN0aW9uIG9uSHduZChoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdHb3QgSFdORCcpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5od25kID0gaDsKICAgICAgICAgICAgICAgIGgucG9pbnRlckJ1ZmZlcigpLmNvcHkodGhpcy5Ob3RpZnlEYXRhLkRlcmVmKHRoaXMuV2luZG93c0NvbnNvbGUuX01hcnNoYWwuUG9pbnRlclNpemUsIHRoaXMuV2luZG93c0NvbnNvbGUuX01hcnNoYWwuUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOwoKICAgICAgICAgICAgICAgIGlmKHRoaXMuV2luZG93c0NvbnNvbGUuX3NoZWxsMzIuU2hlbGxfTm90aWZ5SWNvbkEoVHJheUljb25GbGFncy5OSU1fQURELCB0aGlzLk5vdGlmeURhdGEpLlZhbCA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXRWYWwuTWVzc2FnZVB1bXAub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBvbldpbmRvd3NNZXNzYWdlKG1zZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYobXNnLm1lc3NhZ2UgPT0gdGhpcy5UcmF5SWNvbi5PcHRpb25zLmZpbHRlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChtc2cud3BhcmFtID09IDEgJiYgbXNnLmxwYXJhbSA9PSAxMDI5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UcmF5SWNvbi5lbWl0KCdUb2FzdENsaWNrZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChtc2cud3BhcmFtID09IDEgJiYgbXNnLmxwYXJhbSA9PSA1MTIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRyYXlJY29uLmVtaXQoJ0ljb25Ib3ZlcicpOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVHJheUljb24uT3B0aW9ucy5iYWxsb29uT25seSAmJiBtc2cud3BhcmFtID09IDEgJiYgKG1zZy5scGFyYW0gPT0gMTAyOCB8fCBtc2cubHBhcmFtID09IDEwMjkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UcmF5SWNvbi5lbWl0KCdUb2FzdERpc21pc3NlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRyYXlJY29uLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXRWYWwucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5NZXNzYWdlUHVtcC5XaW5kb3dzQ29uc29sZS5fc2hlbGwzMi5TaGVsbF9Ob3RpZnlJY29uQShUcmF5SWNvbkZsYWdzLk5JTV9ERUxFVEUsIHRoaXMuTWVzc2FnZVB1bXAuTm90aWZ5RGF0YSk7CiAgICAgICAgICAgICAgICB0aGlzLk1lc3NhZ2VQdW1wLnN0b3AoKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLk1lc3NhZ2VQdW1wLlRyYXlJY29uOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuTWVzc2FnZVB1bXA7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgCiAgICAgICAgfTsKICAgIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgV2luZG93c0NvbnNvbGUoKTs=', 'base64').toString());");
// Windows Cert Store, refer to modules/win-certstore.js
duk_peval_string_noresult(ctx, "addModule('win-certstore', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KY29uc3QgQ0VSVF9GSU5EX1NVQkpFQ1RfTkFNRSA9ICgyIDw8IDE2IHwgNyk7CmNvbnN0IENFUlRfU1RPUkVfT1BFTl9FWElTVElOR19GTEFHID0gMHgwMDAwNDAwMDsKY29uc3QgQ0VSVF9TVE9SRV9QUk9WX1NZU1RFTSA9IDEwOwpjb25zdCBDRVJUX1g1MDBfTkFNRV9TVFIgPSAzOwpjb25zdCBQS0NTXzdfQVNOX0VOQ09ESU5HID0gMHgwMDAxMDAwMDsKY29uc3QgWDUwOV9BU05fRU5DT0RJTkcgPSAweDAwMDAwMDAxOwpjb25zdCBDRVJUX0NMT1NFX1NUT1JFX0ZPUkNFX0ZMQUcgPSAweDAwMDAwMDAxOwpjb25zdCBDRVJUX0NMT1NFX1NUT1JFX0NIRUNLX0ZMQUcgPSAweDAwMDAwMDAyOwoKZnVuY3Rpb24gY2VydHN0b3JlKCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnd2luLWNlcnRzdG9yZSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9DcnlwdDMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQ3J5cHQzMi5kbGwnKTsKICAgIHRoaXMuX0NyeXB0MzIuQ3JlYXRlTWV0aG9kKCdDZXJ0Q2xvc2VTdG9yZScpOwogICAgdGhpcy5fQ3J5cHQzMi5DcmVhdGVNZXRob2QoJ0NlcnREZWxldGVDZXJ0aWZpY2F0ZUZyb21TdG9yZScpOwogICAgdGhpcy5fQ3J5cHQzMi5DcmVhdGVNZXRob2QoJ0NlcnRGaW5kQ2VydGlmaWNhdGVJblN0b3JlJyk7CiAgICB0aGlzLl9DcnlwdDMyLkNyZWF0ZU1ldGhvZCgnQ2VydE9wZW5TdG9yZScpOwogICAgdGhpcy5fQ3J5cHQzMi5DcmVhdGVNZXRob2QoJ0NlcnRTdHJUb05hbWVBJyk7CgogICAgdGhpcy5fTmNycHl0ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnTmNyeXB0LmRsbCcpOwogICAgdGhpcy5fTmNycHl0LkNyZWF0ZU1ldGhvZCgnTkNyeXB0RnJlZU9iamVjdCcpOwogICAgdGhpcy5fTmNycHl0LkNyZWF0ZU1ldGhvZCgnTkNyeXB0T3BlblN0b3JhZ2VQcm92aWRlcicpOwogICAgdGhpcy5TVE9SRV9MT0NBVElPTiA9IHsgTE9DQUxfTUFDSElORTogMiA8PCAxNiwgQ1VSUkVOVF9VU0VSOiAxIDw8IDE2IH07CiAgICB0aGlzLlBST1ZJREVSUyA9IFt0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKCdNaWNyb3NvZnQgUGxhdGZvcm0gQ3J5cHRvIFByb3ZpZGVyJywgeyB3aWRlOiB0cnVlIH0pLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKCdNaWNyb3NvZnQgU29mdHdhcmUgS2V5IFN0b3JhZ2UgUHJvdmlkZXInLCB7IHdpZGU6IHRydWUgfSldOwoKICAgIHRoaXMuT3BlbkNyeXB0b1Byb3ZpZGVyID0gZnVuY3Rpb24gT3BlbkNyeXB0b1Byb3ZpZGVyKCkKICAgIHsKICAgICAgICB2YXIgcmV0ID0gbnVsbDsKICAgICAgICB2YXIgcCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIGZvcih2YXIgcHJvdmlkZXIgaW4gdGhpcy5QUk9WSURFUlMpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9OY3JweXQuTkNyeXB0T3BlblN0b3JhZ2VQcm92aWRlcihwLCB0aGlzLlBST1ZJREVSU1twcm92aWRlcl0sIDApOwogICAgICAgICAgICBpZiAocC5EZXJlZigpLlZhbCAhPSAwKSB7IHJldCA9IHAuRGVyZWYoKTsgcmV0Ll9iID0gcDsgYnJlYWs7fQogICAgICAgIH0KICAgICAgICBpZiAocmV0ID09IG51bGwpIHsgdGhyb3cgKCdVbmFibGUgdG8gb3BlbiBDcnlwdG9Qcm92aWRlcicpOyB9CiAgICAgICAgcmV0Ll9jcnlwdCA9IHRoaXM7CiAgICAgICAgcmV0Ll9maW5hbGl6ZWQgPSBmYWxzZTsKICAgICAgICByZXQuY2xvc2UgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9maW5hbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9jcnlwdC5fTmNycHl0Lk5DcnlwdEZyZWVPYmplY3QodGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldC5wcmVwZW5kT25jZUxpc3RlbmVyKCd+JywgZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmKCF0aGlzLl9maW5hbGl6ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07CiAgICB0aGlzLk9wZW5TdG9yZSA9IGZ1bmN0aW9uIE9wZW5TdG9yZShwcm92aWRlciwgbG9jYXRpb24pCiAgICB7CiAgICAgICAgdmFyIGhzdG9yZSA9IHRoaXMuX0NyeXB0MzIuQ2VydE9wZW5TdG9yZShDRVJUX1NUT1JFX1BST1ZfU1lTVEVNLCBYNTA5X0FTTl9FTkNPRElORyB8IFBLQ1NfN19BU05fRU5DT0RJTkcsIHByb3ZpZGVyLCBsb2NhdGlvbiB8IENFUlRfU1RPUkVfT1BFTl9FWElTVElOR19GTEFHLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKCdNWScsIHt3aWRlOiB0cnVlfSkpOwogICAgICAgIGlmIChoc3RvcmUuVmFsID09IDApIHsgdGhyb3cgKCdFcnJvciBvcGVuaW5nIENlcnRTdG9yZScpOyB9CiAgICAgICAgaHN0b3JlLl9jcnlwdCA9IHRoaXM7CiAgICAgICAgaHN0b3JlLl9maW5hbGl6ZWQgPSBmYWxzZTsKICAgICAgICBoc3RvcmUuY2xvc2UgPSBmdW5jdGlvbiBjbG9zZSgpIHsgdGhpcy5fZmluYWxpemVkID0gdHJ1ZTsgdGhpcy5fY3J5cHQuX0NyeXB0MzIuQ2VydENsb3NlU3RvcmUodGhpcywgQ0VSVF9DTE9TRV9TVE9SRV9DSEVDS19GTEFHKTsgfTsKICAgICAgICBoc3RvcmUucHJlcGVuZE9uY2VMaXN0ZW5lcignficsIGZ1bmN0aW9uICgpIHsgaWYgKCF0aGlzLl9maW5hbGl6ZWQpIHsgdGhpcy5jbG9zZSgpOyB9IH0pOwogICAgICAgIHJldHVybiAoaHN0b3JlKTsKICAgIH07CiAgICB0aGlzLkdldENlcnRpZmljYXRlID0gZnVuY3Rpb24gR2V0Q2VydGlmaWNhdGUoQ04sIGxvY2F0aW9uKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShDTik7CiAgICAgICAgdmFyIGVuY29kZWRTaXplID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsgLy8gRFdPUkQKICAgICAgICBpZih0aGlzLl9DcnlwdDMyLkNlcnRTdHJUb05hbWVBKFg1MDlfQVNOX0VOQ09ESU5HLCBzdWJqZWN0LCBDRVJUX1g1MDBfTkFNRV9TVFIsIDAsIDAsIGVuY29kZWRTaXplLCAwKS5WYWwgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93KCdFcnJvciBjYWxjdWxhdGluZyBDRVJUX1g1MDBfTkFNRV9TVFIgZm9yICgnICsgQ04gKyAnKScpOwogICAgICAgIH0KICAgICAgICB2YXIgc3ViamVjdEVuY29kZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGVuY29kZWRTaXplLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgIGlmKHRoaXMuX0NyeXB0MzIuQ2VydFN0clRvTmFtZUEoWDUwOV9BU05fRU5DT0RJTkcsIHN1YmplY3QsIENFUlRfWDUwMF9OQU1FX1NUUiwgMCwgc3ViamVjdEVuY29kZWQsIGVuY29kZWRTaXplLCAwKS5WYWwgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93KCdFcnJvciBlbmNvZGluZyBDRVJUX1g1MDBfTkFNRV9TVFIgZm9yICgnICsgQ04gKyAnKScpOwogICAgICAgIH0KICAgICAgICB2YXIgcHJvdmlkZXIgPSB0aGlzLk9wZW5DcnlwdG9Qcm92aWRlcigpOwogICAgICAgIHZhciBzdG9yZSA9IHRoaXMuT3BlblN0b3JlKHByb3ZpZGVyLCBsb2NhdGlvbik7CiAgICAgICAgdmFyIHNlYXJjaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUodGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSAqIDIpOwogICAgICAgIHNlYXJjaC5EZXJlZigwLDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShlbmNvZGVkU2l6ZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsKICAgICAgICBzdWJqZWN0RW5jb2RlZC5wb2ludGVyQnVmZmVyKCkuY29weShzZWFyY2gudG9CdWZmZXIoKSwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSk7CgogICAgICAgIC8vIExvb2sgZm9yIGNlcnQKICAgICAgICB2YXIgY2VydGN0eCA9IHRoaXMuX0NyeXB0MzIuQ2VydEZpbmRDZXJ0aWZpY2F0ZUluU3RvcmUoc3RvcmUsIFg1MDlfQVNOX0VOQ09ESU5HIHwgUEtDU183X0FTTl9FTkNPRElORywgMCwgQ0VSVF9GSU5EX1NVQkpFQ1RfTkFNRSwgc2VhcmNoLCAwKTsKICAgICAgICBpZihjZXJ0Y3R4LlZhbCAhPSAwKQogICAgICAgIHsKICAgICAgICAgICAgLy8gRm91bmQgQ2VydGlmaWNhdGUKICAgICAgICAgICAgdmFyIGNlciA9IGNlcnRjdHguRGVyZWYodGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSkuRGVyZWYoY2VydGN0eC5EZXJlZih0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplICogMiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkudG9CdWZmZXIoKTsKICAgICAgICAgICAgdmFyIGZvdW5kY2VydCA9IHJlcXVpcmUoJ3RscycpLmxvYWRDZXJ0aWZpY2F0ZSh7IGNlcjogY2VyIH0pOwogICAgICAgICAgICByZXR1cm4gKGZvdW5kY2VydCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnTm90IEZvdW5kJyk7CiAgICAgICAgfQoKICAgIH07Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IGNlcnRzdG9yZSgpOwoK', 'base64').toString());");
// win-bcd is used to configure booting in Safe-Mode. refer to modules/win-bcd.js
duk_peval_string_noresult(ctx, "addModule('win-bcd', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQpmdW5jdGlvbiBnZXRLZXlzKCkNCnsNCiAgICB2YXIgcmV0ID0ge307DQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgIlxcU3lzdGVtMzJcXGJjZGVkaXQuZXhlIiwgWydiY2RlZGl0JywgJy9lbnVtJywgJ3tjdXJyZW50fSddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJ1xyXG4nKTsNCiAgICBsaW5lcy5zaGlmdCgpOyBsaW5lcy5zaGlmdCgpOw0KDQogICAgZm9yICh2YXIgaSBpbiBsaW5lcykNCiAgICB7DQogICAgICAgIHZhciB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOw0KICAgICAgICB2YXIga2V5ID0gdG9rZW5zLnNoaWZ0KCk7DQogICAgICAgIHZhciB2YWx1ZSA9IHRva2Vucy5qb2luKCcgJykudHJpbSgpOw0KICAgICAgICByZXRba2V5XSA9IHZhbHVlOw0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9DQpmdW5jdGlvbiBnZXRLZXkoa2V5KQ0Kew0KICAgIHJldHVybiAodGhpcy5nZXRLZXlzKClba2V5XSk7DQp9DQpmdW5jdGlvbiBzZXRLZXkoa2V5LCB2YWx1ZSkNCnsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgIlxcU3lzdGVtMzJcXGJjZGVkaXQuZXhlIiwgWydiY2RlZGl0JywgJy9zZXQnLCAne2N1cnJlbnR9Jywga2V5LCB2YWx1ZV0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQp9DQpmdW5jdGlvbiBkZWxldGVLZXkoa2V5KQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAiXFxTeXN0ZW0zMlxcYmNkZWRpdC5leGUiLCBbJ2JjZGVkaXQnLCAnL2RlbGV0ZXZhbHVlJywgJ3tjdXJyZW50fScsIGtleV0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQp9DQoNCmZ1bmN0aW9uIGVuYWJsZVNhZmVNb2RlU2VydmljZShzZXJ2aWNlTmFtZSkNCnsNCiAgICByZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5Xcml0ZUtleShyZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXFNhZmVib290XFxOZXR3b3JrXFwnICsgc2VydmljZU5hbWUsIG51bGwsICdTZXJ2aWNlJyk7DQp9DQpmdW5jdGlvbiBpc1NhZmVNb2RlU2VydmljZShzZXJ2aWNlTmFtZSkNCnsNCiAgICB2YXIgcmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7DQogICAgdmFyIGtleSA9IHsgZGVmYXVsdDogJ25vbmUnIH07DQogICAgdHJ5IHsga2V5ID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXFNhZmVib290XFxOZXR3b3JrXFwnICsgc2VydmljZU5hbWUpOyB9IGNhdGNoIChxa2UpIHsgfQ0KICAgIHJldHVybiAoa2V5LmRlZmF1bHQgPT0gJ1NlcnZpY2UnKTsNCn0NCmZ1bmN0aW9uIGRpc2FibGVTYWZlTW9kZVNlcnZpY2Uoc2VydmljZU5hbWUpDQp7DQogICAgdHJ5DQogICAgew0KICAgICAgICByZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5EZWxldGVLZXkocmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxTYWZlYm9vdFxcTmV0d29ya1xcJyArIHNlcnZpY2VOYW1lKTsNCiAgICB9DQogICAgY2F0Y2goeCkNCiAgICB7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiByZXN0YXJ0KGRlbGF5KQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAiXFxTeXN0ZW0zMlxcc2h1dGRvd24uZXhlIiwgWydzaHV0ZG93bicsICcvcicsICcvdCcsIGRlbGF5IT1udWxsP2RlbGF5LnRvU3RyaW5nKCk6JzAnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IGNvbnNvbGUubG9nKGMudG9TdHJpbmcoKSk7fSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCn0NCg0KaWYgKHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLlBvaW50ZXJTaXplID09IDQgJiYgcmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQ0KICAgIHsNCiAgICAgICAgZW5hYmxlU2FmZU1vZGVTZXJ2aWNlOiBlbmFibGVTYWZlTW9kZVNlcnZpY2UsDQogICAgICAgIGRpc2FibGVTYWZlTW9kZVNlcnZpY2U6IGRpc2FibGVTYWZlTW9kZVNlcnZpY2UsIHJlc3RhcnQ6IHJlc3RhcnQsIGlzU2FmZU1vZGVTZXJ2aWNlOiBpc1NhZmVNb2RlU2VydmljZQ0KICAgIH07DQp9DQplbHNlDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQ0KICAgICAgICB7DQogICAgICAgICAgICBnZXRLZXlzOiBnZXRLZXlzLCBzZXRLZXk6IHNldEtleSwgZGVsZXRlS2V5OiBkZWxldGVLZXksIGVuYWJsZVNhZmVNb2RlU2VydmljZTogZW5hYmxlU2FmZU1vZGVTZXJ2aWNlLA0KICAgICAgICAgICAgZGlzYWJsZVNhZmVNb2RlU2VydmljZTogZGlzYWJsZVNhZmVNb2RlU2VydmljZSwgZ2V0S2V5OiBnZXRLZXksIHJlc3RhcnQ6IHJlc3RhcnQsIGlzU2FmZU1vZGVTZXJ2aWNlOiBpc1NhZmVNb2RlU2VydmljZQ0KICAgICAgICB9Ow0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAiYm9vdE1vZGUiLA0KICAgICAgICB7DQogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLlF1ZXJ5S2V5KHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcU2FmZWJvb3RcXE9wdGlvbicsICdPcHRpb25WYWx1ZScpOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHYpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdTQUZFX01PREVfTkVUV09SSycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdTQUZFX01PREUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaCAoeCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoJ05PUk1BTCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQp9', 'base64').toString());");
// win-dispatcher a helper to run JavaScript as a particular user. Refer to modules/win-dispatcher.js
duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGRpc3BhdGNoKG9wdGlvbnMpDQp7DQogICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm1vZHVsZXMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICB2YXIgaXBjSW50ZWdlcg0KICAgIHZhciByZXQgPSB7IG9wdGlvbnM6IG9wdGlvbnMgfTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpLmNyZWF0ZUV2ZW50KCdjb25uZWN0aW9uJyk7DQoNCiAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMyID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjMi5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICByZXQuX2lwYzIub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCg0KICAgIHdoaWxlICh0cnVlKQ0KICAgIHsNCiAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOw0KICAgICAgICANCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5faXBjLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCwgd3JpdGFibGVBbGw6IHRydWUgfSk7DQogICAgICAgICAgICByZXQuX2lwYzIubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoICsgJ0MnLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoICh4KQ0KICAgICAgICB7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB2YXIgc3RyID0gQnVmZmVyLmZyb20oInJlcXVpcmUoJ3dpbi1jb25zb2xlJykuaGlkZSgpO3JlcXVpcmUoJ3dpbi1kaXNwYXRjaGVyJykuY29ubmVjdCgnIiArIGlwY0ludGVnZXIgKyAiJyk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOw0KICAgIHJldC5faXBjMi5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpDQogICAgew0KICAgICAgICB0aGlzLnBhcmVudC5fY29udHJvbCA9IHM7DQogICAgICAgIHRoaXMucGFyZW50Ll9jb250cm9sLl9wYXJlbnQgPSB0aGlzOw0KICAgICAgICB0aGlzLnBhcmVudC5pbnZva2UgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmdzKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZCwgaCA9IEJ1ZmZlci5hbGxvYyg0KTsNCiAgICAgICAgICAgIGQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGNvbW1hbmQ6ICdpbnZva2UnLCB2YWx1ZTogeyBtZXRob2Q6IG1ldGhvZCwgYXJnczogYXJncyB9IH0pKTsNCiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgdGhpcy5fY29udHJvbC53cml0ZShoKTsNCiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wud3JpdGUoZCk7DQogICAgICAgIH07DQogICAgICAgIHMub25jZSgnZW5kJywgZnVuY3Rpb24gKCkgeyB0aGlzLl9wYXJlbnQuY2xvc2UoKTsgfSk7DQogICAgfSk7DQogICAgcmV0Ll9pcGMub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQ0KICAgIHsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NsaWVudCA9IHM7DQogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7DQogICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOw0KDQogICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQ0KICAgICAgICB7DQogICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnYWRkTW9kdWxlJywgdmFsdWU6IHsgbmFtZTogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLm5hbWUsIGpzOiB0aGlzLnBhcmVudC5vcHRpb25zLm1vZHVsZXNbbV0uc2NyaXB0IH0gfSkpOw0KICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgICAgICBzLndyaXRlKGgpOw0KICAgICAgICAgICAgcy53cml0ZShkKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGNvbW1hbmQ6ICdsYXVuY2gnLCB2YWx1ZTogeyBtb2R1bGU6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1vZHVsZSwgbWV0aG9kOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tZXRob2QsIGFyZ3M6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLmFyZ3MgfSB9KSk7DQogICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICBzLndyaXRlKGgpOw0KICAgICAgICBzLndyaXRlKGQpOw0KICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOw0KICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdjb25uZWN0aW9uJywgcyk7DQogICAgfSk7DQoNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXGNtZC5leGUnLCBbJ2NtZCddKTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCg0KICAgIGlmIChvcHRpb25zLnVzZXIpDQogICAgew0KICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnU0NIVEFTS1MgL0NSRUFURSAvRiAvVE4gTWVzaFVzZXJUYXNrIC9TQyBPTkNFIC9TVCAwMDowMCAvUlUgJyArIG9wdGlvbnMudXNlciArICcgL1RSICJcXCInICsgcHJvY2Vzcy5leGVjUGF0aCArICdcXCIgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpLnRzaWQgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSBTWVNURU0gL1RSICJcXCInICsgcHJvY2Vzcy5leGVjUGF0aCArICdcXCIgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gUnVubmluZyBhcyBsb2dnZWQgaW4gdXNlcg0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9DUkVBVEUgL0YgL1ROIE1lc2hVc2VyVGFzayAvU0MgT05DRSAvU1QgMDA6MDAgL1RSICJcXCInICsgcHJvY2Vzcy5leGVjUGF0aCArICdcXCIgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvUlVOIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxyXG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBjb25uZWN0KGlwYykNCnsNCiAgICB2YXIgaXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGM7DQogICAgZ2xvYmFsLmlwYzJDbGllbnQgPSByZXF1aXJlKCduZXQnKS5jcmVhdGVDb25uZWN0aW9uKHsgcGF0aDogaXBjUGF0aCArICdDJyB9LCBmdW5jdGlvbiAoKQ0KICAgIHsNCiAgICAgICAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uIChjKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY0xlbiA9IGMucmVhZFVJbnQzMkxFKDApOw0KICAgICAgICAgICAgaWYgKGNMZW4gPiBjLmxlbmd0aCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnVuc2hpZnQoYyk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdpbnZva2UnOg0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KGdsb2JhbC5fcHJveHlTdHJlYW0sIGNtZC52YWx1ZS5hcmdzKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KICAgIGdsb2JhbC5pcGNDbGllbnQgPSByZXF1aXJlKCduZXQnKS5jcmVhdGVDb25uZWN0aW9uKHsgcGF0aDogaXBjUGF0aCB9LCBmdW5jdGlvbiAoKQ0KICAgIHsNCiAgICAgICAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uIChjKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY0xlbiA9IGMucmVhZFVJbnQzMkxFKDApOw0KICAgICAgICAgICAgaWYgKGNMZW4gPiBjLmxlbmd0aCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnVuc2hpZnQoYyk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdhZGRNb2R1bGUnOg0KICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGUoY21kLnZhbHVlLm5hbWUsIGNtZC52YWx1ZS5qcyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2xhdW5jaCc6DQogICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSByZXF1aXJlKGNtZC52YWx1ZS5tb2R1bGUpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtLnBpcGUodGhpcywgeyBlbmQ6IGZhbHNlIH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBpcGUoZ2xvYmFsLl9wcm94eVN0cmVhbSwgeyBlbmQ6IGZhbHNlIH0pOw0KDQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KfQ0KDQptb2R1bGUuZXhwb3J0cyA9IHsgZGlzcGF0Y2g6IGRpc3BhdGNoLCBjb25uZWN0OiBjb25uZWN0IH07DQoNCv==', 'base64').toString());");
// win-firewall is a helper to Modify Windows Firewall Filters. Refer to modules/win-firewall.js
char *_winfirewall = ILibMemory_Allocate(60573, 0, NULL, NULL);
memcpy_s(_winfirewall + 0, 34612, "LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciB3aW5yZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCg0KLy9hdHRhY2hEZWJ1Z2dlcih7IHdlYnBvcnQ6IDk5OTUsIHdhaXQ6IHRydWUgfSkudGhlbihjb25zb2xlLmxvZywgY29uc29sZS5sb2cpOw0KDQpmdW5jdGlvbiBuZXRzZWN1cml0eUV4aXN0cygpDQp7DQogICAgdmFyIGNoaWxkOw0KICAgIHZhciBjb21tYW5kID0gJ0dldC1Nb2R1bGUgLUxpc3RBdmFpbGFibGUgLU5hbWUgbmV0c2VjdXJpdHknOw0KICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykNCiAgICB7DQogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIGNoaWxkLndhaXRFeGl0KDIwMDApOw0KICAgIH0NCiAgICBjYXRjaChlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIChmYWxzZSk7DQogICAgfQ0KDQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyICE9ICcnKTsNCn0NCg0KZnVuY3Rpb24gc3RyaXBVbnJlY29nbml6ZWRLZXlzKG9iaiwgYWxsb3dlZEtleXMpDQp7DQogICAgZm9yKHZhciBrZXkgaW4gb2JqKQ0KICAgIHsNCiAgICAgICAgaWYoIWFsbG93ZWRLZXlzLmluY2x1ZGVzKGtleSkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGRlbGV0ZSBvYmpba2V5XTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gcGFyc2VDbWRsZXRPdXRwdXQoZGF0YSkNCnsNCiAgICB2YXIgdG91Y2hlZDsNCiAgICB2YXIgcmV0ID0gW107DQogICAgdmFyIGNodW5rcyA9IGRhdGEudHJpbSgpLnNwbGl0KCdcclxuXHJcbicpOw0KICAgIHZhciBsaW5lcywgeCwgb2JqOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgKytpKQ0KICAgIHsNCiAgICAgICAgb2JqID0ge307IHRvdWNoZWQgPSBmYWxzZTsNCiAgICAgICAgbGluZXMgPSBjaHVua3NbaV0uc3BsaXQoJ1xyXG4nKTsNCiAgICAgICAgZm9yICh4ID0gMDsgeCA8IGxpbmVzLmxlbmd0aDsgKyt4KQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZCA9IGxpbmVzW3hdLmluZGV4T2YoJzonKTsNCiAgICAgICAgICAgIHZhciBrZXkgPSBsaW5lc1t4XS5zdWJzdHJpbmcoMCwgZCkudHJpbSgpOw0KICAgICAgICAgICAgdmFyIHZhbHVlID0gbGluZXNbeF0uc3Vic3RyaW5nKGQgKyAxKS50cmltKCk7DQogICAgICAgICAgICBpZiAoa2V5ICE9ICIiKSB7IG9ialtrZXldID0gdmFsdWU7IHRvdWNoZWQgPSB0cnVlOyB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRvdWNoZWQpIHsgcmV0LnB1c2gob2JqKTsgfQ0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9DQpmdW5jdGlvbiBmZXRjaFBvcnRGaWx0ZXJzKHJ1bGVzKQ0Kew0KICAgIHZhciBpOw0KICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpDQogICAgew0KICAgICAgICBydWxlcyA9IFtydWxlc107DQogICAgfQ0KICAgIGZvciAoaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7ICsraSkNCiAgICB7DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICBmaWx0ZXIgPSB3aW5yZWcuUXVlcnlLZXkod2lucmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXFNoYXJlZEFjY2Vzc1xcUGFyYW1ldGVyc1xcRmlyZXdhbGxQb2xpY3lcXEZpcmV3YWxsUnVsZXMnLCBydWxlc1tpXS5OYW1lKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChmZSkNCiAgICAgICAgew0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5zID0gZmlsdGVyLnNwbGl0KCd8Jyk7DQogICAgICAgIGZvciAoayA9IDA7IGsgPCB0b2tlbnMubGVuZ3RoOyArK2spDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICgodG9rZW5YID0gdG9rZW5zW2tdLmluZGV4T2YoJz0nKSkgPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW5zW2tdLnN1YnN0cmluZygwLCB0b2tlblgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUHJvdG9jb2wnOg0KICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXNbaV0uUHJvdG9jb2wgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0xQb3J0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLkxvY2FsUG9ydCA9IHRva2Vuc1trXS5zdWJzdHJpbmcodG9rZW5YICsgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUlBvcnQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXNbaV0uUmVtb3RlUG9ydCA9IHRva2Vuc1trXS5zdWJzdHJpbmcodG9rZW5YICsgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQXBwJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlByb2dyYW0gPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBnZXRGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChwLCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2ZpcmV3YWxsUnVsZScpOw0KDQogICAgdmFyIHJldFZhbCA9IFtdLCBmaWx0ZXIgPSBbXTsNCiAgICB2YXIgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxSdWxlJzsNCiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IG9wdGlvbnMuUHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbTsgZGVsZXRlIG9wdGlvbnMucHJvZ3JhbTsgfQ0KICAgIGlmIChvcHRpb25zLlByb2dyYW0pIHsgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOyB9DQoNCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQogICAgew0KICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBwLm9wdGlvbnMgPSBvcHRpb25zOw0KICAgIHAuY2hpbGQucGFyZW50ID0gcDsNCiAgICBwLmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICB7DQogICAgICAgIHZhciBjb21tYW5kOw0KICAgICAgICB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7DQogICAgICAgIGlmKHRoaXMucGFyZW50LnBhcmVudC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKT4wKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIGlmKChpPXRoaXMuc3RyLmluZGV4T2YoJ1xyXG5cclxuJykpPj0wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIsIGssIHRva2VucywgdG9rZW5YOw0KICAgICAgICAgICAgICAgIHZhciBqID0gdGhpcy5zdHIuc3Vic3RyaW5nKDAsIGkpOw0KICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGkgKyA0KTsNCg0KICAgICAgICAgICAgICAgIGogPSBwYXJzZUNtZGxldE91dHB1dChqKTsNCiAgICAgICAgICAgICAgICBmZXRjaFBvcnRGaWx0ZXJzKGopOw0KDQogICAgICAgICAgICAgICAgZm9yKGk9MDtpPGoubGVuZ3RoOysraSkNCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQucGFyZW50LmVtaXQoJ2ZpcmV3YWxsUnVsZScsIGpbaV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHAuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBwLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoNCiAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHZhciBjb21tYW5kLCBpLCBqLCBjaGlsZCwgZmlsdGVyOw0KICAgICAgICBpZiAodGhpcy5zdGRlcnIuc3RyLnRyaW0oKSAhPSAiIikgeyB0aGlzLnBhcmVudC5fcmVqKHRoaXMuc3RkZXJyLnN0ci50cmltKCkpOyByZXR1cm47IH0NCg0KICAgICAgICBpZiAodGhpcy5wYXJlbnQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJykgPiAwKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5fcmVzKCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgb2JqQXJyID0gcGFyc2VDbWRsZXRPdXRwdXQodGhpcy5zdGRvdXQuc3RyKTsNCiAgICAgICAgZmV0Y2hQb3J0RmlsdGVycyhvYmpBcnIpOw0KICAgICAgICB0aGlzLnBhcmVudC5fcmVzKG9iakFycik7DQogICAgfSk7DQoNCiAgICByZXR1cm4gKHApOw0KfQ0KDQoNCmZ1bmN0aW9uIGRpc2FibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOw0KICAgIHZhciBjb21tYW5kID0gJ0Rpc2FibGUtTmV0RmlyZXdhbGxSdWxlJzsNCiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IG9wdGlvbnMuUHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbTsgZGVsZXRlIG9wdGlvbnMucHJvZ3JhbTsgfQ0KDQogICAgaWYgKG9wdGlvbnMuUHJvZ3JhbSkNCiAgICB7DQogICAgICAgIGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsQXBwbGljYXRpb25GaWx0ZXIgLVByb2dyYW0gXFwiJyArIG9wdGlvbnMuUHJvZ3JhbSArICdcXCIgfCAnICsgY29tbWFuZDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgdmFyIGtleSwgdmFsdWU7DQogICAgICAgIGZvciAoa2V5IGluIG9wdGlvbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhbHVlID0gb3B0aW9uc1trZXldOw0KICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJyAnKSA+PSAwKSB7IHZhbHVlID0gJ1xcIicgKyBvcHRpb25zW2tleV0gKyAnXFwiJzsgfQ0KICAgICAgICAgICAgY29tbWFuZCArPSAoJy0nICsga2V5ICsgJyAnICsgdmFsdWUpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQ0KDQogICAgcmV0LmNoaWxkLnJldCA9IHJldDsNCiAgICByZXQuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoKQ0KICAgIHsNCiAgICAgICAgaWYgKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBlbmFibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOw0KICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9DQoNCiAgICB2YXIgY29tbWFuZCA9ICdFbmFibGUtTmV0RmlyZXdhbGxSdWxlJzsNCiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB2YXIga2V5LCB2YWx1ZTsNCiAgICAgICAgZm9yIChrZXkgaW4gb3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25zW2tleV07DQogICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignICcpID49IDApIHsgdmFsdWUgPSAnXFwiJyArIG9wdGlvbnNba2V5XSArICdcXCInOyB9DQogICAgICAgICAgICBjb21tYW5kICs9ICgnLScgKyBrZXkgKyAnICcgKyB2YWx1ZSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQogICAgew0KICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9DQoNCiAgICByZXQuY2hpbGQucmV0ID0gcmV0Ow0KICAgIHJldC5jaGlsZC5zdGRvdXQuc3RyID0gJyc7IHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIHJldC5jaGlsZC5zdGRlcnIuc3RyID0gJyc7IHJldC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICBpZih0aGlzLnN0ZGVyci5zdHIgIT0gJycpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZWoodGhpcy5zdGRlcnIuc3RyLnRyaW0oKSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KDQpmdW5jdGlvbiB2ZXJpZnlWYWx1ZXMob3B0aW9uc0lucHV0LCBrZXlOYW1lLCBrZXlWYWx1ZXMsIGRlZmF1bHRWYWx1ZSkNCnsNCiAgICB2YXIgaSwgaiwgdG1wLCBvazsNCiAgICBmb3IgKHZhciBrZXkgaW4gb3B0aW9uc0lucHV0KQ0KICAgIHsNCiAgICAgICAgaWYoa2V5TmFtZS50b0xvd2VyQ2FzZSgpID09IGtleS50b0xvd2VyQ2FzZSgpKQ0KICAgICAgICB7DQogICAgICAgICAgICB0bXAgPSBvcHRpb25zSW5wdXRba2V5XTsNCiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zSW5wdXRba2V5XTsNCg0KICAgICAgICAgICAgaWYgKGtleVZhbHVlcyA9PSBudWxsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9wdGlvbnNJbnB1dFtrZXlOYW1lXSA9IHRtcDsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRtcCE9bnVsbCkgeyB0bXAgPSB0bXAudG9TdHJpbmcoKS5zcGxpdCgnLCcpOyB9DQogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRtcC5sZW5ndGg7ICsraikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8a2V5VmFsdWVzLmxlbmd0aDsrK2kpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHRtcFtqXS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNJbnB1dFtrZXlOYW1lXSA9IChvcHRpb25zSW5wdXRba2V5TmFtZV0gPT0gbnVsbCA/IGtleVZhbHVlc1tpXSA6IChvcHRpb25zSW5wdXRba2V5TmFtZV0gKyAnLCAnICsga2V5VmFsdWVzW2ldKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICghb2spDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnSW52YWxpZCB2YWx1ZSBmb3IgWycgKyBrZXlOYW1lICsgJ106ICcgKyB0bXBbal0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zSW5wdXRba2V5TmFtZV0gIT0gbnVsbCkgeyByZXR1cm47IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIHRoZSBrZXkgZG9lc24ndCBleGlzdC4uLiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBwdXQgaW4gYSBkZWZhdWx0IHZhbHVlDQogICAgaWYoZGVmYXVsdFZhbHVlICE9IG51bGwpDQogICAgew0KICAgICAgICBvcHRpb25zSW5wdXRba2V5TmFtZV0gPSBkZWZhdWx0VmFsdWU7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiByZW1hcFZhbHVlcyhvYmosIG9sZG5hbWUsIG5ld25hbWUsIHRhYmxlKQ0Kew0KICAgIGlmKG9ialtvbGRuYW1lXSAhPSBudWxsKQ0KICAgIHsNCiAgICAgICAgdmFyIHZhbHVlID0gb2JqW29sZG5hbWVdOw0KICAgICAgICBkZWxldGUgb2JqW29sZG5hbWVdDQoNCiAgICAgICAgaWYoIXRhYmxlKQ0KICAgICAgICB7DQogICAgICAgICAgICBvYmpbbmV3bmFtZV0gPSB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcsJykgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialtuZXduYW1lXSA9IHRhYmxlW3ZhbHVlXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdmFsdWUuc3BsaXQoJywnKTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDtpPHRva2Vucy5sZW5ndGg7KytpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYob2JqW25ld25hbWVdID09IG51bGwpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtuZXduYW1lXSA9IHRhYmxlW3Rva2Vuc1tpXS50cmltKCldOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gKG9ialtuZXduYW1lXSArICcsJyArIHRhYmxlW3Rva2Vuc1tpXS50cmltKCldKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gY29udmVydE5ldHNoVmFsdWVzKG9iaikNCnsNCiAgICByZW1hcFZhbHVlcyhvYmosICdSdWxlIE5hbWUnLCAnTmFtZScpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0VuYWJsZWQnLCAnRW5hYmxlZCcsIHsgTm86ICdGYWxzZScsIFllczogJ1RydWUnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1Byb2ZpbGVzJywgJ1Byb2ZpbGUnLCB7IEFueTogJ0FueScsIERvbWFpbjogJ0RvbWFpbicsIFB1YmxpYzogJ1B1YmxpYycsIFByaXZhdGU6ICdQcml2YXRlJyB9KTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdFZGdlIHRyYXZlcnNhbCcsICdFZGdlVHJhdmVyc2FsUG9saWN5JywgeyBObzog", 16000);
memcpy_s(_winfirewall + 16000, 18612, "J0Jsb2NrJywgWWVzOiAnQWxsb3cnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0RpcmVjdGlvbicsICdEaXJlY3Rpb24nLCB7IEluOiAnSW5ib3VuZCcsIE91dDogJ091dGJvdW5kJyB9KTsNCn0NCmZ1bmN0aW9uIGNvbnZlcnROZXRTZWN1cml0eVZhbHVlcyhvYmopDQp7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnQWN0aW9uJywgJ2FjdGlvbicsIHsgQWxsb3c6ICdhbGxvdycsIEJsb2NrOiAnYmxvY2snIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0Rlc2NyaXB0aW9uJywgJ2Rlc2NyaXB0aW9uJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRGlyZWN0aW9uJywgJ2RpcicsIHsgSW5ib3VuZDogJ2luJywgT3V0Ym91bmQ6ICdvdXQnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0Rpc3BsYXlOYW1lJywgJ2Rpc3BsYXluYW1lJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRW5hYmxlZCcsICdlbmFibGVkJywgeyBGYWxzZTogJ25vJywgVHJ1ZTogJ3llcycgfSk7DQoNCiAgICByZW1hcFZhbHVlcyhvYmosICdQcm9ncmFtJywgJ3Byb2dyYW0nKTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdQcm90b2NvbCcsICdwcm90b2NvbCcpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1Byb2ZpbGUnLCAncHJvZmlsZScsIHsgQW55OiAnYW55JywgRG9tYWluOiAnZG9tYWluJywgUHJpdmF0ZTogJ3ByaXZhdGUnLCBQdWJsaWM6ICdwdWJsaWMnLCBOb3RBcHBsaWNhYmxlOiAnYW55JyB9KTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdJbnRlcmZhY2VUeXBlJywgJ2ludGVyZmFjZXR5cGUnLCB7IEFueTogJ2FueScsIFdpcmVkOiAnbGFuJywgV2lyZWxlc3M6ICd3aXJlbGVzcycsIFJlbW90ZUFjY2VzczogJ3JhcycgfSk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRWRnZVRyYXZlcnNhbFBvbGljeScsICdlZGdlJywgeyBBbGxvdzogJ3llcycsIEJsb2NrOiAnbm8nLCBEZWZlclRvVXNlcjogJ2RlZmVydXNlcicsIERlZmVyVG9BcHA6ICdkZWZlcmFwcCcgfSk7DQoNCiAgICByZW1hcFZhbHVlcyhvYmosICdMb2NhbEFkZHJlc3MnLCAnbG9jYWxpcCcpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0xvY2FsUG9ydCcsICdsb2NhbHBvcnQnKTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdSZW1vdGVBZGRyZXNzJywgJ3JlbW90ZWlwJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnUmVtb3RlUG9ydCcsICdyZW1vdGVwb3J0Jyk7DQp9DQoNCmZ1bmN0aW9uIGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpDQp7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdBY3Rpb24nLCBbJ05vdENvbmZpZ3VyZWQnLCAnQWxsb3cnLCAnQmxvY2snXSwgJ0FsbG93Jyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdBdXRoZW50aWNhdGlvbicsIFsnTm90UmVxdWlyZWQnLCAnUmVxdWlyZWQnLCAnTm9FbmNhcCddKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0Rlc2NyaXB0aW9uJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdEaXJlY3Rpb24nLCBbJ0luYm91bmQnLCAnT3V0Ym91bmQnXSk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdEaXNwbGF5TmFtZScpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRHluYW1pY1RhcmdldCcsIFsnQW55JywgJ1Byb3hpbWl0eUFwcHMnLCAnUHJveGltaXR5U2hhcmluZycsICdXaWZpRGlyZWN0UHJpbnRpbmcnLCAnV2lmaURpcmVjdERpc3BsYXknLCAnV2lmaURpcmVjdERldmljZXMnXSwgJ0FueScpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRWRnZVRyYXZlcnNhbFBvbGljeScsIFsnQmxvY2snLCAnQWxsb3cnLCAnRGVmZXJUb1VzZXInLCAnRGVmZXJUb0FwcCddKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuYWJsZWQnLCBbJ1RydWUnLCAnRmFsc2UnXSwgJ1RydWUnKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuY3J5cHRpb24nLCBbJ05vdFJlcXVpcmVkJywgJ1JlcXVpcmVkJywgJ0R5bmFtaWMnXSk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdJbnRlcmZhY2VUeXBlJywgWydBbnknLCAnV2lyZWQnLCAnV2lyZWxlc3MnLCAnUmVtb3RlQWNjZXNzXSddLCAnQW55Jyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbEFkZHJlc3MnKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsT25seU1hcHBpbmcnLCBbJ1RydWUnLCAnRmFsc2UnXSk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbFBvcnQnKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsVXNlcicpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9vc2VTb3VyY2VNYXBwaW5nJywgWydUcnVlJywgJ0ZhbHNlJ10pOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTmFtZScpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3ZlcnJpZGVCbG9ja1J1bGVzJywgWydUcnVlJywgJ0ZhbHNlJ10pOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3duZXInKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1BhY2thZ2UnKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1BsYXRmb3JtJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQb2xpY3lTdG9yZScpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUHJvZmlsZScsIFsnQW55JywgJ0RvbWFpbicsICdQcml2YXRlJywgJ1B1YmxpYycsICdOb3RBcHBsaWNhYmxlJ10sICdBbnknKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb2dyYW0nKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb3RvY29sJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVBZGRyZXNzJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVNYWNoaW5lJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVQb3J0Jyk7DQogICAgDQogICAgcmV0dXJuIChvcHRpb25zKTsNCn0NCg0KZnVuY3Rpb24gcmVtb3ZlRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQogICAgaWYgKHR5cGVvZiAob3B0aW9ucykgPT0gJ3N0cmluZycpIHsgb3B0aW9ucyA9IHsgTmFtZTogb3B0aW9ucyB9OyB9DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOw0KICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9DQoNCiAgICB2YXIgY29tbWFuZCA9ICdSZW1vdmUtTmV0RmlyZXdhbGxSdWxlJzsNCiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB2YXIga2V5LCB2YWx1ZTsNCiAgICAgICAgZm9yKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykNCiAgICB7DQogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCg0KICAgIHJldC5jaGlsZC5yZXQgPSByZXQ7DQogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgcmV0LmNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgcmV0LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gYWRkRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQogICAgdmFyIGNvbW1hbmQgPSAnTmV3LU5ldEZpcmV3YWxsUnVsZSc7DQogICAgdmFyIHZhbCA9IGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpOw0KICAgIHZhciBrZXk7DQoNCiAgICBmb3IgKGtleSBpbiB2YWwpDQogICAgew0KICAgICAgICBpZiAodmFsW2tleV0udG9TdHJpbmcoKS5pbmRleE9mKCcgJykgPj0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCArPSAoJyAtJyArIGtleSArICcgXFwiJyArIHZhbFtrZXldICsgJ1xcIicpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCArPSAoJyAtJyArIGtleSArICcgJyArIHZhbFtrZXldICsgJycpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdmFyIGNoaWxkOw0KICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykNCiAgICB7DQogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9DQoNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICBpZihjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSAhPSAnJykNCiAgICB7DQogICAgICAgIHRocm93IChjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBuZXRzaF9wYXJzZVJlc3VsdHMoc3RyKQ0Kew0KICAgIHZhciByZXQgPSBbXTsNCiAgICB2YXIgaSwgaiwgaywgb2JqLCB0b2tlbnM7DQogICAgdmFyIGJsb2NrcyA9IHN0ci5zcGxpdCgnXHJcblxyXG4nKTsNCiAgICBmb3IoaT0wO2k8YmxvY2tzLmxlbmd0aDsrK2kpDQogICAgew0KICAgICAgICBvYmogPSB7fTsNCiAgICAgICAgdG9rZW5zID0gYmxvY2tzW2ldLnNwbGl0KCdcclxuJyk7DQogICAgICAgIGZvcihqPTA7ajx0b2tlbnMubGVuZ3RoOysraikNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKChrID0gdG9rZW5zW2pdLmluZGV4T2YoJzonKSkgPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialt0b2tlbnNbal0uc3Vic3RyaW5nKDAsIGspLnRyaW0oKV0gPSB0b2tlbnNbal0uc3Vic3RyaW5nKGsgKyAxKS50cmltKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY29udmVydE5ldHNoVmFsdWVzKG9iaik7DQogICAgICAgIHJldC5wdXNoKG9iaik7DQogICAgfQ0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gbmV0c2hfZ2V0RmlyZXdhbGxSdWxlcyhvcHRpb25zKQ0Kew0KICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9DQogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChwLCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2ZpcmV3YWxsUnVsZScpOw0KDQogICAgdmFyIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgc2hvdyBydWxlIG5hbWU9YWxsIHZlcmJvc2UnOw0KICAgIHAub3B0aW9ucyA9IG9wdGlvbnM7DQogICAgcC5fcmVzdWx0cyA9IFtdOw0KICAgIHAuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXGNtZC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIHAuY2hpbGQucmV0ID0gcDsNCiAgICBwLmNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgcC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIHAuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgIHAuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGIpDQogICAgew0KICAgICAgICB2YXIga2V5LCBvazsNCiAgICAgICAgdGhpcy5zdHIgKz0gYi50b1N0cmluZygpOw0KICAgICAgICB2YXIgZVggPSB0aGlzLnN0ci5sYXN0SW5kZXhPZignXHJcblxyXG4nKTsNCg0KICAgICAgICBpZiAoZVggPj0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJ1bGVzID0gbmV0c2hfcGFyc2VSZXN1bHRzKHRoaXMuc3RyLnN1YnN0cmluZygwLCBlWCkpOw0KICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBydWxlcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvayA9IHRydWU7DQogICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5wYXJlbnQucmV0Lm9wdGlvbnMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnBhcmVudC5yZXQub3B0aW9uc1trZXldID09IG51bGwgfHwgdGhpcy5wYXJlbnQucmV0Lm9wdGlvbnNba2V5XSAhPSBydWxlc1tpXVtrZXldKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKG9rKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LnJldC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnJldC5lbWl0KCdmaXJld2FsbFJ1bGUnLCBydWxlc1tpXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZXQuX3Jlc3VsdHMucHVzaChydWxlc1tpXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnN0ci5sZW5ndGggLSBlWCA+IDQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zdHIgPSB0aGlzLnN0ci5zdWJzdHJpbmcoZVggKyA0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHAuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoKQ0KICAgIHsNCiAgICAgICAgaWYgKHRoaXMucmV0Lmxpc3RlbmVyQ291bnQoJ2ZpcmV3YWxsUnVsZScpID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3JlcygpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYodGhpcy5yZXQuX3Jlc3VsdHMubGVuZ3RoPjApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5yZXQuX3Jlcyh0aGlzLnJldC5fcmVzdWx0cyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5yZXQuX3JlaignTm8gbWF0Y2hlcycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCg0KICAgIHJldHVybiAocCk7DQp9DQpmdW5jdGlvbiBuZXRzaF9kaXNhYmxlRmlyZXdhbGxSdWxlcyhvcHRpb25zKQ0Kew0KICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICByZXQuZ2V0cCA9IG5ldHNoX2dldEZpcmV3YWxsUnVsZXMob3B0aW9ucyk7DQogICAgcmV0LmdldHAucmV0ID0gcmV0Ow0KICAgIHJldC5nZXRwLnRoZW4oZnVuY3Rpb24gKHJ1bGVzKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkOw0KICAgICAgICB2YXIgY29tbWFuZDsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBydWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzZXQgcnVsZSBuYW1lPSInICsgcnVsZXNbaV0uTmFtZSArICciJyArICcgbmV3IGVuYWJsZT1ubyc7DQogICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcY21kLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICB9LCBmdW5jdGlvbiAoZSkNCiAgICB7DQogICAgICAgIHRoaXMucmV0Ll9yZWooZSk7DQogICAgfSk7DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KZnVuY3Rpb24gbmV0c2hfZW5hYmxlRmlyZXdhbGxSdWxlcyhvcHRpb25zKQ0Kew0KICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICByZXQuZ2V0cCA9IG5ldHNoX2dldEZpcmV3YWxsUnVsZXMob3B0aW9ucyk7DQogICAgcmV0LmdldHAucmV0ID0gcmV0Ow0KICAgIHJldC5nZXRwLnRoZW4oZnVuY3Rpb24gKHJ1bGVzKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkOw0KICAgICAgICB2YXIgY29tbWFuZDsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBydWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzZXQgcnVsZSBuYW1lPSInICsgcnVsZXNbaV0uTmFtZSArICciJyArICcgbmV3IGVuYWJsZT15ZXMnOw0KICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXGNtZC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgfSwgZnVuY3Rpb24gKGUpDQogICAgew0KICAgICAgICB0aGlzLnJldC5fcmVqKGUpOw0KICAgIH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCmZ1bmN0aW9uIG5ldHNoX2FkZEZpcmV3YWxsUnVsZShvcHRpb25zKQ0Kew0KICAgIHZhciB2YWwgPSBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKTsNCiAgICBjb252ZXJ0TmV0U2VjdXJpdHlWYWx1ZXModmFsKTsNCg0KICAgIGlmICghdmFsLm5hbWUpDQogICAgew0KICAgICAgICBpZih2YWwuZGlzcGxheW5hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhbC5uYW1lID0gdmFsLmRpc3BsYXluYW1lICsgJyAnICsgcmVxdWlyZSgndXVpZC92NCcpKCk7DQogICAgICAgICAgICBkZWxldGUgdmFsLmRpc3BsYXluYW1lOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsLm5hbWUgPSByZXF1aXJlKCd1dWlkL3Y0JykoKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBzdHJpcFVucmVjb2duaXplZEtleXModmFsLCBbJ25hbWUnLCAnZGlyJywgJ2FjdGlvbicsICdwcm9ncmFtJywgJ3NlcnZpY2UnLCAnZGVzY3JpcHRpb24nLCAnZW5hYmxlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2ZpbGUnLCAnbG9jYWxpcCcsICdyZW1vdGVpcCcsICdsb2NhbHBvcnQnLCAncmVtb3RlcG9ydCcsICdwcm90b2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcmZhY2V0eXBlJywgJ3JtdGNvbXB1dGVyZ3JwJywgJ3JtdHVzcmdycCcsICdlZGdlJywgJ3NlY3VyaXR5J10pOw0KDQogICAgdmFyIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgYWRkIHJ1bGUgbmFtZT0iJyArIHZhbC5uYW1lICsgJyInDQogICAgZGVsZXRlIHZhbC5uYW1lOw0KDQogICAgZm9yICh2YXIgaSBpbiB2YWwpDQogICAgew0KICAgICAgICBpZiAodmFsW2ldLnRvU3RyaW5nKCkuaW5kZXhPZignICcpID49IDAgfHwgdmFsW2ldLnRvU3RyaW5nKCkuaW5kZXhPZignLCcpID49IDApIHsgdmFsW2ldID0gKCciJyArIHZhbFtpXSArICciJyk7IH0NCiAgICAgICAgY29tbWFuZCArPSAoJyAnICsgaSArICc9JyArIHZhbFtpXSk7DQogICAgfQ0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQp9DQpmdW5jdGlvbiBuZXRzaF9yZW1vdmVGaXJld2FsbFJ1bGUob3B0aW9ucykNCnsNCiAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7", 16000);
memcpy_s(_winfirewall + 32000, 2612, "DQogICAgcmV0Lm9wdGlvbnMgPSBvcHRpb25zOw0KICAgIHJldC5nZXRwID0gbmV0c2hfZ2V0RmlyZXdhbGxSdWxlcyhvcHRpb25zKTsNCiAgICByZXQuZ2V0cC5yZXQgPSByZXQ7DQogICAgcmV0LmdldHAudGhlbihmdW5jdGlvbiAocnVsZXMpDQogICAgew0KICAgICAgICB2YXIgY2hpbGQsIGNvbW1hbmQsIGtleSwgdmFsdWU7DQogICAgICAgIGNvbnZlcnROZXRTZWN1cml0eVZhbHVlcyh0aGlzLnJldC5vcHRpb25zKTsNCg0KICAgICAgICBmb3IodmFyIGkgaW4gcnVsZXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgZGVsZXRlIHJ1bGUgbmFtZT0iJyArIHJ1bGVzW2ldLk5hbWUgKyAnIic7DQogICAgICAgICAgICBmb3Ioa2V5IGluIHRoaXMucmV0Lm9wdGlvbnMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJldC5vcHRpb25zW2tleV0udG9TdHJpbmcoKTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignICcpID49IDApIHsgdmFsdWUgPSAoJyInICsgdmFsdWUgKyAnIicpOyB9DQogICAgICAgICAgICAgICAgY29tbWFuZCArPSAoJyAnICsga2V5ICsgJz0nICsgdmFsdWUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcY21kLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICB9LCBmdW5jdGlvbiAoZSkgeyB0aGlzLnJldC5fcmVqKGUpOyB9KTsNCiAgICByZXR1cm4ocmV0KTsNCn0NCg0KDQppZiAobmV0c2VjdXJpdHlFeGlzdHMoKSkNCnsNCiAgICBtb2R1bGUuZXhwb3J0cyA9DQogICAgICAgIHsNCiAgICAgICAgICAgIGdldEZpcmV3YWxsUnVsZXM6ICAgICAgIGdldEZpcmV3YWxsUnVsZXMsDQogICAgICAgICAgICBkaXNhYmxlRmlyZXdhbGxSdWxlczogICBkaXNhYmxlRmlyZXdhbGxSdWxlcywNCiAgICAgICAgICAgIGVuYWJsZUZpcmV3YWxsUnVsZXM6ICAgIGVuYWJsZUZpcmV3YWxsUnVsZXMsDQogICAgICAgICAgICBhZGRGaXJld2FsbFJ1bGU6ICAgICAgICBhZGRGaXJld2FsbFJ1bGUsDQogICAgICAgICAgICByZW1vdmVGaXJld2FsbFJ1bGU6ICAgICByZW1vdmVGaXJld2FsbFJ1bGUsDQogICAgICAgICAgICBuZXRzZWN1cml0eUV4aXN0czogICAgICBuZXRzZWN1cml0eUV4aXN0cw0KICAgICAgICB9Ow0KfQ0KZWxzZQ0Kew0KICAgIG1vZHVsZS5leHBvcnRzID0NCiAgICAgICAgew0KICAgICAgICAgICAgZ2V0RmlyZXdhbGxSdWxlczogICAgICAgbmV0c2hfZ2V0RmlyZXdhbGxSdWxlcywNCiAgICAgICAgICAgIGRpc2FibGVGaXJld2FsbFJ1bGVzOiAgIG5ldHNoX2Rpc2FibGVGaXJld2FsbFJ1bGVzLA0KICAgICAgICAgICAgZW5hYmxlRmlyZXdhbGxSdWxlczogICAgbmV0c2hfZW5hYmxlRmlyZXdhbGxSdWxlcywNCiAgICAgICAgICAgIGFkZEZpcmV3YWxsUnVsZTogICAgICAgIG5ldHNoX2FkZEZpcmV3YWxsUnVsZSwNCiAgICAgICAgICAgIHJlbW92ZUZpcmV3YWxsUnVsZTogICAgIG5ldHNoX3JlbW92ZUZpcmV3YWxsUnVsZSwNCiAgICAgICAgICAgIG5ldHNlY3VyaXR5RXhpc3RzOiAgICAgIG5ldHNlY3VyaXR5RXhpc3RzDQogICAgICAgIH07DQp9", 2612);
ILibBase64DecodeEx((unsigned char*)_winfirewall, 34612, (unsigned char*)_winfirewall + 34612);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "win-firewall"); duk_push_string(ctx, _winfirewall + 34612);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_winfirewall);
#endif
#ifdef _FREEBSD
// Helper to locate installed libraries. Currently only supports FreeBSD
duk_peval_string_noresult(ctx, "addModule('lib-finder', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQpmdW5jdGlvbiBmaW5kKG5hbWUpDQp7DQoJc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQoJew0KCQljYXNlICdmcmVlYnNkJzoNCgkJCXZhciByZXQgPSBbXTsNCgkJCXZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQoJCQljaGlsZC5zdGRvdXQuc3RyID0gJyc7DQoJCQljaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KCQkJY2hpbGQuc3RkaW4ud3JpdGUoInBrZyBpbmZvICIgKyBuYW1lICsgIiB8IHRyICdcXG4nICdcXHwnIHwgYXdrICcgeyBhPXNwbGl0KCQwLCB0LCBcIlNoYXJlZCBMaWJzIHByb3ZpZGVkOlwiKTsgaWYoYT09MikgeyBzcGxpdCh0WzJdLCBsaWIsIFwiOlwiKTsgcHJpbnQgbGliWzFdOyB9IH0nIHwgdHIgJ1xcfCcgJ1xcbicgfCBhd2sgJ3sgaWYoc3BsaXQoJDEsIHJlcywgXCIuc29cIik+MSkgeyBwcmludCAkMTsgfSB9J1xuZXhpdFxuIik7DQoJCQljaGlsZC53YWl0RXhpdCgpOw0KCQkJdmFyIHJlcyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCdcbicpOw0KCQkJZm9yKHZhciBpIGluIHJlcykNCgkJCXsNCgkJCQlpZighcmVzW2ldLnN0YXJ0c1dpdGgobmFtZSArICcuc28nKSkgeyBjb250aW51ZTsgfQ0KCQkJCXZhciB2ID0ge25hbWU6IHJlc1tpXX07DQoJCQkJY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KCQkJCWNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCgkJCQljaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KCQkJCWNoaWxkLnN0ZGluLndyaXRlKCdwa2cgaW5mbyAtbCAnICsgbmFtZSArICcgfCBncmVwICcgKyB2Lm5hbWUgKyAnIHwgYXdrIFwneyBhPXNwbGl0KCQxLCB0b2ssICIvIik7IGlmKHRva1thXT09IicgKyB2Lm5hbWUgKyAnIikgeyBwcmludCAkMTsgfSB9XCdcbmV4aXRcbicpOw0KCQkJCWNoaWxkLndhaXRFeGl0KCk7DQoJCQkJdi5sb2NhdGlvbiA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KCQkJCXJldC5wdXNoKHYpOw0KCQkJfQ0KCQkJcmV0dXJuKHJldCk7DQoJCWJyZWFrOw0KCX0NCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSBmaW5kOw0K', 'base64').toString());");
#endif
// monitor-info: Refer to modules/monitor-info.js
char *_monitorinfo = ILibMemory_Allocate(56149, 0, NULL, NULL);
memcpy_s(_monitorinfo + 0, 32084, "LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBQUG9zaXRpb24gPSA0Ow0KdmFyIFBTaXplID0gODsNCnZhciBQTWluU2l6ZSA9IDEgPDwgNDsNCnZhciBQTWF4U2l6ZSA9IDEgPDwgNTsNCnZhciBfTkVUX1dNX1NUQVRFX1JFTU9WRSA9IDA7ICAgIC8vIHJlbW92ZS91bnNldCBwcm9wZXJ0eQ0KdmFyIF9ORVRfV01fU1RBVEVfQUREID0gMTsgICAgLy8gYWRkL3NldCBwcm9wZXJ0eQ0KdmFyIF9ORVRfV01fU1RBVEVfVE9HR0xFID0gMjsgICAgLy8gdG9nZ2xlIHByb3BlcnR5DQp2YXIgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrID0gKDEgPDwgMjApOw0KdmFyIFN1YnN0cnVjdHVyZU5vdGlmeU1hc2sgPSAoMSA8PCAxOSk7DQp2YXIgUHJvcE1vZGVSZXBsYWNlID0gMDsNCnZhciBYQV9BVE9NID0gNDsNCnZhciBNV01fSElOVFNfRlVOQ1RJT05TID0gKDEgPDwgMCk7DQp2YXIgTVdNX0hJTlRTX0RFQ09SQVRJT05TID0gKDEgPDwgMSk7DQp2YXIgQ2xpZW50TWVzc2FnZSA9IDMzOw0KDQpmdW5jdGlvbiBnZXRMaWJJbmZvKGxpYm5hbWUpDQp7DQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ2xpbnV4JykgeyB0aHJvdyAoJ09ubHkgc3VwcG9ydGVkIG9uIGxpbnV4Jyk7IH0NCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBsZGNvbmZpZyB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBsZGNvbmZpZyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUobGRjb25maWcgKyAiIC1wIHwgZ3JlcCAnIiArIGxpYm5hbWUgKyAiLnNvLicgfCB0ciAnXFxuJyAnXicgfCBhd2sgLUZeICd7IHByaW50ZiBcIltcIjsgZm9yKGk9MTtpPD1ORjsrK2kpIHsiICsgJyBzcGxpdCgkaSwgcGxhdCwgIikiKTsgc3BsaXQocGxhdFsxXSwgcGxhdDIsICIoIik7IGlmb3g9c3BsaXQocGxhdDJbMl0sIGlmbywgIiwiKTsgbGliYz0iIjsgaHdjYXA9IjAiOyBmb3IoaWZvaT0xO2lmb2k8PWlmb3g7KytpZm9pKSB7IGlmKHNwbGl0KGlmb1tpZm9pXSwgam5rLCAibGliYyIpPT0yKSB7IGxpYmM9aWZvW2lmb2ldOyB9IGlmKHNwbGl0KGlmb1tpZm9pXSwgam5rLCAiaHdjYXA6Iik9PTIpIHsgc3BsaXQoaWZvW2lmb2ldLCBqbmssICIweCIpOyBod2NhcD1qbmtbMl07IH0gICB9ICAgICAgeD1zcGxpdCgkaSwgdG9rLCAiICIpOyBpZih0b2tbMV0hPSIiKSB7IHByaW50ZiAiJXN7XFwibGliXFwiOiBcXCIlc1xcIiwgXFwicGF0aFxcIjogXFwiJXNcXCIsIFxcImh3Y2FwXFwiOiBcXCIlc1xcIiwgXFwibGliY1xcIjogXFwiJXNcXCJ9IiwgKGkhPTE/IiwiOiIiKSwgdG9rWzFdLCB0b2tbeF0sIGh3Y2FwLCBsaWJjOyB9fSBwcmludGYgIl0iOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHZhciB2ID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgIHJldHVybiAodik7DQogICAgfQ0KICAgIGNhdGNoKGUpDQogICAgew0KICAgICAgICByZXR1cm4gKHt9KTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIG1vbml0b3JpbmZvKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdtb25pdG9yLWluZm8nOw0KICAgIHRoaXMuX2dtID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQoNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgdGhpcy5fdXNlcjMyID0gdGhpcy5fZ20uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsNCiAgICAgICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRW51bURpc3BsYXlNb25pdG9ycycpOw0KICAgICAgICB0aGlzLl9rZXJuZWwzMiA9IHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsNCiAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsNCg0KICAgICAgICB0aGlzLmdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGluZm8gPSB0aGlzOw0KICAgICAgICAgICAgcmV0dXJuIChuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZXIsIHJlamVjdG9yKSB7DQogICAgICAgICAgICAgICAgdGhpcy5fbW9uaXRvcmluZm8gPSB7IHJlc29sdmVyOiByZXNvbHZlciwgcmVqZWN0b3I6IHJlamVjdG9yLCBzZWxmOiBpbmZvLCBjYWxsYmFjazogaW5mby5fZ20uR2V0R2VuZXJpY0dsb2JhbENhbGxiYWNrKDQpIH07DQogICAgICAgICAgICAgICAgdGhpcy5fbW9uaXRvcmluZm8uY2FsbGJhY2suaW5mbyA9IHRoaXMuX21vbml0b3JpbmZvOw0KICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmZvLmR3RGF0YSA9IGluZm8uX2dtLk9iamVjdFRvUHRyKHRoaXMuX21vbml0b3JpbmZvKTsNCg0KICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmZvLmNhbGxiYWNrLnJlc3VsdHMgPSBbXTsNCiAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjay5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBPbk1vbml0b3JJbmZvKGhtb24sIGhkYywgciwgdXNlcikgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5PYmplY3RUb1B0cl9WZXJpZnkodGhpcy5pbmZvLCB1c2VyKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJiID0gci5EZXJlZigwLCAxNikudG9CdWZmZXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgbGVmdDogcmIucmVhZEludDMyTEUoMCksIHRvcDogcmIucmVhZEludDMyTEUoNCksIHJpZ2h0OiByYi5yZWFkSW50MzJMRSg4KSwgYm90dG9tOiByYi5yZWFkSW50MzJMRSgxMikgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5pbmZvLnNlbGYuX2dtLkNyZWF0ZUludGVnZXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHIuVmFsID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgIGlmIChpbmZvLl91c2VyMzIuRW51bURpc3BsYXlNb25pdG9ycygwLCAwLCB0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjaywgdGhpcy5fbW9uaXRvcmluZm8uZHdEYXRhKS5WYWwgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICByZWplY3RvcignTGFzdEVycm9yPScgKyBpbmZvLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IoKS5WYWwpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXNvbHZlcih0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjay5yZXN1bHRzKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgew0KICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvLCBpcyBkZXRlcm1pbmUgd2hlcmUgdGhlIFgxMSBsaWJyYXJpZXMgYXJlDQoNCiAgICAgICAgLy8gU3VmZmljaWVudCBhY2Nlc3MgcmlnaHRzIHRvIHVzZSBsZGNvbmZpZw0KICAgICAgICB2YXIgeDExaW5mbyA9IGdldExpYkluZm8oJ2xpYlgxMScpOw0KICAgICAgICB2YXIgeHRzdGluZm8gPSBnZXRMaWJJbmZvKCdsaWJYdHN0Jyk7DQogICAgICAgIHZhciB4ZXh0aW5mbyA9IGdldExpYkluZm8oJ2xpYlhleHQnKTsNCiAgICAgICAgdmFyIHhmaXhlc2luZm8gPSBnZXRMaWJJbmZvKCdsaWJYZml4ZXMnKTsNCiAgICAgICAgdmFyIGl4Ow0KDQogICAgICAgIGZvciAoaXggaW4geDExaW5mbykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHgxMWluZm8ubGVuZ3RoID09IDEgfHwgeDExaW5mb1tpeF0uaHdjYXAgPT0gIjAiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ20uQ3JlYXRlTmF0aXZlUHJveHkoeDExaW5mb1tpeF0ucGF0aCk7DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExTElCJywgeyB2YWx1ZTogeDExaW5mb1tpeF0ucGF0aCB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChleCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaXggaW4geHRzdGluZm8pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh4dHN0aW5mby5sZW5ndGggPT0gMSB8fCB4dHN0aW5mb1tpeF0uaHdjYXAgPT0gIjAiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ20uQ3JlYXRlTmF0aXZlUHJveHkoeHRzdGluZm9baXhdLnBhdGgpOw0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMVRTVCcsIHsgdmFsdWU6IHh0c3RpbmZvW2l4XS5wYXRoIH0pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKGV4KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpeCBpbiB4ZXh0aW5mbykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHhleHRpbmZvLmxlbmd0aCA9PSAxIHx8IHhleHRpbmZvW2l4XS5od2NhcCA9PSAiMCIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSh4ZXh0aW5mb1tpeF0ucGF0aCk7DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExRVhUJywgeyB2YWx1ZTogeGV4dGluZm9baXhdLnBhdGggfSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaCAoZXgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGl4IGluIHhmaXhlc2luZm8pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh4Zml4ZXNpbmZvLmxlbmd0aCA9PSAxIHx8IHhmaXhlc2luZm9baXhdLmh3Y2FwID09ICIwIikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KHhmaXhlc2luZm9baXhdLnBhdGgpOw0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUZJWEVTJywgeyB2YWx1ZTogeGZpeGVzaW5mb1tpeF0ucGF0aCB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChleCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9ICAgDQoNCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExTElCJ10pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFMSUInLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExTElCJ10gfSk7IH0NCiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExVFNUJ10pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFUU1QnLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExVFNUJ10gfSk7IH0NCiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRVhUJ10pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFFWFQnLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRVhUJ10gfSk7IH0NCiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRklYRVMnXSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUZJWEVTJywgeyB2YWx1ZTogcHJvY2Vzcy5lbnZbJ0xvY2F0aW9uX1gxMUZJWEVTJ10gfSk7IH0NCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChleCkNCiAgICAgICAgew0KICAgICAgICB9DQogICAgfQ0KICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQ0KICAgIHsNCgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFMSUInLCB7IHZhbHVlOiByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlgxMScpWzBdP3JlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWDExJylbMF0ubG9jYXRpb246IHVuZGVmaW5lZCB9KTsNCgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFUU1QnLCB7IHZhbHVlOiByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlh0c3QnKVswXT9yZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlh0c3QnKVswXS5sb2NhdGlvbjp1bmRlZmluZWQgfSk7DQoJICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExRVhUJywgeyB2YWx1ZTogcmVxdWlyZSgnbGliLWZpbmRlcicpKCdsaWJYZXh0JylbMF0gPyByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlhleHQnKVswXS5sb2NhdGlvbiA6IHVuZGVmaW5lZCB9KTsNCgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFGSVhFUycsIHsgdmFsdWU6IHJlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWGZpeGVzJylbMF0gPyByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlhmaXhlcycpWzBdLmxvY2F0aW9uIDogdW5kZWZpbmVkIH0pOw0KICAgIH0NCg0KICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICB7DQogICAgICAgIHRoaXMuTU9USUZfRkxBR1MgPSANCiAgICAgICAgew0KICAgICAgICAgICAgTVdNX0ZVTkNfQUxMICAgICAgICA6ICgxIDw8IDApICwNCiAgICAgICAgICAgIE1XTV9GVU5DX1JFU0laRSAgICAgOiAoMSA8PCAxKSAsDQogICAgICAgICAgICBNV01fRlVOQ19NT1ZFICAgICAgIDogKDEgPDwgMikgLA0KICAgICAgICAgICAgTVdNX0ZVTkNfTUlOSU1JWkUgICA6ICgxIDw8IDMpICwNCiAgICAgICAgICAgIE1XTV9GVU5DX01BWElNSVpFICAgOiAoMSA8PCA0KSAsDQogICAgICAgICAgICBNV01fRlVOQ19DTE9TRSAgICAgIDogKDEgPDwgNSkgDQogICAgICAgIH07DQoNCg0KICAgICAgICBpZiAodGhpcy5Mb2NhdGlvbl9YMTFMSUIgJiYgdGhpcy5Mb2NhdGlvbl9YMTFUU1QgJiYgdGhpcy5Mb2NhdGlvbl9YMTFFWFQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgICAgICAgICAgY2guc3Rkb3V0LnN0ciA9ICcnOyBjaC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2guc3RkaW4ud3JpdGUoJ3BzIC1lIHwgZ3JlcCBYXG5leGl0XG4nKTsNCiAgICAgICAgICAgIGNoLndhaXRFeGl0KCk7DQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2t2bV94MTFfc3VwcG9ydCcsIHsgdmFsdWU6IGNoLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gZmFsc2UgOiB0cnVlIH0pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrdm1feDExX3N1cHBvcnQnLCB7IHZhbHVlOiBmYWxzZSB9KTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgaWYgKHRoaXMuTG9jYXRpb25fWDExTElCKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9YMTEgPSB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSh0aGlzLkxvY2F0aW9uX1gxMUxJQik7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ2hhbmdlUHJvcGVydHknKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDbG9zZURpc3BsYXknKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDb25uZWN0aW9uTnVtYmVyJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ29udmVydFNlbGVjdGlvbicpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWENyZWF0ZUdDJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ3JlYXRlV2luZG93Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ3JlYXRlU2ltcGxlV2luZG93Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRGVmYXVsdENvbG9ybWFwJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRGVmYXVsdFNjcmVlbicpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERlc3Ryb3lXaW5kb3cnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hEcmF3TGluZScpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERpc3BsYXlIZWlnaHQnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hEaXNwbGF5V2lkdGgnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hGZXRjaE5hbWUnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hGbHVzaCcpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWEZyZWUnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDcmVhdGVHQycpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWEdldEF0b21OYW1lJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYR2V0V2luZG93UHJvcGVydHknKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hJbnRlcm5BdG9tJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYTWFwV2luZG93Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnWE5leHRFdmVudCcsIHRocmVhZERpc3BhdGNoOiB0cnVlIH0pOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCh7IG1ldGhvZDogJ1hOZXh0RXZlbnQnLCBuZXdOYW1lOiAnWE5leHRFdmVudFN5bmMnIH0pOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWE9wZW5EaXNwbGF5Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYUGVuZGluZycpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFJvb3RXaW5kb3cnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZWxlY3RJbnB1dCcpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNjcmVlbkNvdW50Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2NyZWVuT2ZEaXNwbGF5Jyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2VsZWN0SW5wdXQnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZW5kRXZlbnQnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZXRGb3JlZ3JvdW5kJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0RnVuY3Rpb24nKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZXRMaW5lQXR0cmlidXRlcycpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNldE5vcm1hbEhpbnRzJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0U2VsZWN0aW9uT3duZXInKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZXRTdWJ3aW5kb3dNb2RlJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0V01Qcm90b2NvbHMnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTdG9yZU5hbWUnKTsNCiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTeW5jJyk7DQogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQmxhY2tQaXhlbCcpOw0KICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFdoaXRlUGl4ZWwnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuaXNVbml0eSA9IGZ1bmN0aW9uIGlzVW5pdHkoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKHByb2Nlc3MuZW52WydYREdfQ1VSUkVOVF9ERVNLVE9QJ10gPT0gJ1VuaXR5Jyk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnVuRGVjb3JhdGVXaW5kb3cgPSBmdW5jdGlvbiB1bkRlY29yYXRlV2luZG93KGRpc3BsYXksIHdpbmRvdykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIE13bUhpbnRzID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoNDApOw0KICAgICAgICAgICAgdmFyIG13bUhpbnRzUHJvcGVydHkgPSB0aGlzLl9YMTEuWEludGVybkF0b20oZGlzcGxheSwgdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoJ19NT1RJRl9XTV9ISU5UUycpLCAwKTsNCiAgICAgICAgICAgIE13bUhpbnRzLkRlcmVmKDAs", 16000);
memcpy_s(_monitorinfo + 16000, 16084, "IDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxIDw8IDEpOw0KICAgICAgICAgICAgdGhpcy5fWDExLlhDaGFuZ2VQcm9wZXJ0eShkaXNwbGF5LCB3aW5kb3csIG13bUhpbnRzUHJvcGVydHksIG13bUhpbnRzUHJvcGVydHksIDMyLCAwLCBNd21IaW50cywgNSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZXRBbGxvd2VkQWN0aW9ucyA9IGZ1bmN0aW9uIHNldEFsbG93ZWRBY3Rpb25zKGRpc3BsYXksIHdpbmRvdywgZmxhZ3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgTVdNX0hJTlRTX0ZVTkNUSU9OUyA9ICgxTCA8PCAwKSwNCiAgICAgICAgICAgICAgICBNV01fSElOVFNfREVDT1JBVElPTlMgPSAgKDFMIDw8IDEpLA0KDQogICAgICAgICAgICAgICAgTVdNX0ZVTkNfQUxMID0gKDFMIDw8IDApLA0KICAgICAgICAgICAgICAgIE1XTV9GVU5DX1JFU0laRSA9ICgxTCA8PCAxKSwNCiAgICAgICAgICAgICAgICBNV01fRlVOQ19NT1ZFID0gKDFMIDw8IDIpLA0KICAgICAgICAgICAgICAgIE1XTV9GVU5DX01JTklNSVpFID0gKDFMIDw8IDMpLA0KICAgICAgICAgICAgICAgIE1XTV9GVU5DX01BWElNSVpFID0gKDFMIDw8IDQpLA0KICAgICAgICAgICAgICAgIE1XTV9GVU5DX0NMT1NFID0gKDFMIDw8IDUpDQogICAgICAgICAgICAqLw0KDQogICAgICAgICAgICB2YXIgTXdtSGludHMgPSB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSg0MCk7DQogICAgICAgICAgICB2YXIgbXdtSGludHNQcm9wZXJ0eSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX01PVElGX1dNX0hJTlRTJyksIDApOw0KDQogICAgICAgICAgICBNd21IaW50cy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoTVdNX0hJTlRTX0ZVTkNUSU9OUyk7DQogICAgICAgICAgICBNd21IaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZsYWdzKTsNCg0KICAgICAgICAgICAgdGhpcy5fWDExLlhDaGFuZ2VQcm9wZXJ0eShkaXNwbGF5LCB3aW5kb3csIG13bUhpbnRzUHJvcGVydHksIG13bUhpbnRzUHJvcGVydHksIDMyLCBQcm9wTW9kZVJlcGxhY2UsIE13bUhpbnRzLCA1KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNldFdpbmRvd1NpemVIaW50cyA9IGZ1bmN0aW9uIHNldFdpbmRvd1NpemVIaW50cyhkaXNwbGF5LCB3aW5kb3csIHgsIHksIHdpZHRoLCBoZWlnaHQsIG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBzaXplSGludHMgPSB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSg4MCk7DQogICAgICAgICAgICB2YXIgc3BlYyA9IFBQb3NpdGlvbiB8IFBTaXplOw0KICAgICAgICAgICAgaWYgKG1pbldpZHRoICE9IG51bGwgJiYgbWluSGVpZ2h0ICE9IG51bGwpIHsgc3BlYyB8PSBQTWluU2l6ZTsgfQ0KICAgICAgICAgICAgaWYgKG1heFdpZHRoICE9IG51bGwgJiYgbWF4SGVpZ2h0ICE9IG51bGwpIHsgc3BlYyB8PSBQTWF4U2l6ZTsgfQ0KDQogICAgICAgICAgICBzaXplSGludHMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHNwZWMpOw0KICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoeCk7DQogICAgICAgICAgICBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyA0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoeSk7DQogICAgICAgICAgICBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyA4LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUod2lkdGgpOw0KICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShoZWlnaHQpOw0KICAgICAgICAgICAgaWYgKG1pbldpZHRoICE9IG51bGwpIHsgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMTYsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShtaW5XaWR0aCk7IH0NCiAgICAgICAgICAgIGlmIChtaW5IZWlnaHQgIT0gbnVsbCkgeyBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyAyMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKG1pbkhlaWdodCk7IH0NCiAgICAgICAgICAgIGlmIChtYXhXaWR0aCAhPSBudWxsKSB7IHNpemVIaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSArIDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUobWF4V2lkdGgpOyB9DQogICAgICAgICAgICBpZiAobWF4SGVpZ2h0ICE9IG51bGwpIHsgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMjgsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShtYXhIZWlnaHQpOyB9DQoNCiAgICAgICAgICAgIHRoaXMuX1gxMS5YU2V0Tm9ybWFsSGludHMoZGlzcGxheSwgd2luZG93LCBzaXplSGludHMpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2V0QWx3YXlzT25Ub3AgPSBmdW5jdGlvbiBzZXRBbHdheXNPblRvcChkaXNwbGF5LCByb290V2luZG93LCB3aW5kb3cpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciB3bU5ldFdtU3RhdGUgPSB0aGlzLl9YMTEuWEludGVybkF0b20oZGlzcGxheSwgdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoJ19ORVRfV01fU1RBVEUnKSwgMSk7DQogICAgICAgICAgICB2YXIgd21TdGF0ZUFib3ZlID0gdGhpcy5fWDExLlhJbnRlcm5BdG9tKGRpc3BsYXksIHRoaXMuX2dtLkNyZWF0ZVZhcmlhYmxlKCdfTkVUX1dNX1NUQVRFX0FCT1ZFJyksIDEpOw0KDQogICAgICAgICAgICB2YXIgeGNsaWVudCA9IHRoaXMuX2dtLkNyZWF0ZVZhcmlhYmxlKDk2KTsNCiAgICAgICAgICAgIHhjbGllbnQuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMzKTsgICAgICAgICAgICAgICAgICAgLy8gQ2xpZW50TWVzc2FnZSB0eXBlDQogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA0OCA6IDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzIpOyAgIC8vIEZvcm1hdCAzMg0KICAgICAgICAgICAgd21OZXRXbVN0YXRlLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgPT0gOCA/IDQwIDogMjAsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsgLy8gbWVzc2FnZV90eXBlDQogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA1NiA6IDI4LCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKF9ORVRfV01fU1RBVEVfQUREKTsgICAvLyBkYXRhLmxbMF0NCiAgICAgICAgICAgIHdtU3RhdGVBYm92ZS5wb2ludGVyQnVmZmVyKCkuY29weSh4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA2NCA6IDMyLCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7ICAvLyBkYXRhLmxbMV0NCiAgICAgICAgICAgIHdpbmRvdy5wb2ludGVyQnVmZmVyKCkuY29weSh4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyAzMiA6IDE2LCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7ICAgICAgIC8vIHdpbmRvdw0KICAgICAgICAgICAgdGhpcy5fWDExLlhTZW5kRXZlbnQoZGlzcGxheSwgcm9vdFdpbmRvdywgMCwgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrIHwgU3Vic3RydWN0dXJlTm90aWZ5TWFzaywgeGNsaWVudCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5oaWRlV2luZG93SWNvbiA9IGZ1bmN0aW9uIGhpZGVXaW5kb3dJY29uKGRpc3BsYXksIHJvb3RXaW5kb3csIHdpbmRvdykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHdtTmV0V21TdGF0ZSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURScpLCAxKTsNCiAgICAgICAgICAgIHZhciB3bVN0YXRlU2tpcCA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURV9TS0lQX1RBU0tCQVInKSwgMSk7DQoNCiAgICAgICAgICAgIHZhciB4Y2xpZW50ID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoOTYpOw0KICAgICAgICAgICAgeGNsaWVudC5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnRNZXNzYWdlIHR5cGUNCiAgICAgICAgICAgIHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemU9PTg/NDg6MjQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgzMik7ICAgLy8gRm9ybWF0IDMyDQogICAgICAgICAgICB3bU5ldFdtU3RhdGUucG9pbnRlckJ1ZmZlcigpLmNvcHkoeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZT09OD80MDoyMCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOyAvLyBtZXNzYWdlX3R5cGUNCiAgICAgICAgICAgIHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemU9PTg/NTY6MjgsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoX05FVF9XTV9TVEFURV9BREQpOyAgIC8vIGRhdGEubFswXQ0KICAgICAgICAgICAgd21TdGF0ZVNraXAucG9pbnRlckJ1ZmZlcigpLmNvcHkoeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZT09OD82NDozMiwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOyAgLy8gZGF0YS5sWzFdDQoNCiAgICAgICAgICAgIHdpbmRvdy5wb2ludGVyQnVmZmVyKCkuY29weSh4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplPT04PzMyOjE2LCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7ICAgICAgIC8vIHdpbmRvdw0KICAgICAgICAgICAgdGhpcy5fWDExLlhTZW5kRXZlbnQoZGlzcGxheSwgcm9vdFdpbmRvdywgMCwgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrIHwgU3Vic3RydWN0dXJlTm90aWZ5TWFzaywgeGNsaWVudCk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGluZm8gPSB0aGlzOw0KICAgICAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgICAgICAgICByZXQucGFyZW50ID0gdGhpczsNCg0KICAgICAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5YQVVUSE9SSVRZIHx8ICFwcm9jZXNzLmVudi5ESVNQTEFZKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB4aW5mbyA9IHRoaXMuZ2V0WEluZm8ocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVpZChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykud2hvYW1pKCkpKTsNCiAgICAgICAgICAgICAgICBwcm9jZXNzLnNldGVudignWEFVVEhPUklUWScsIHhpbmZvLnhhdXRob3JpdHkpOw0KICAgICAgICAgICAgICAgIHByb2Nlc3Muc2V0ZW52KCdESVNQTEFZJywgeGluZm8uZGlzcGxheSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gaW5mby5fWDExLlhPcGVuRGlzcGxheShpbmZvLl9nbS5DcmVhdGVWYXJpYWJsZShwcm9jZXNzLmVudi5ESVNQTEFZKSk7DQogICAgICAgICAgICBpZiAoZGlzcGxheS5WYWwgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy92YXIvdG1wL2FnZW50U2xhdmUnLCAnWE9wZW5EaXNwbGF5IEZhaWxlZCcsIHsgZmxhZ3M6ICdhJyB9KTsNCiAgICAgICAgICAgICAgICByZXQuX3JlaignWE9wZW5EaXNwbGF5IEZhaWxlZCcpOw0KICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHNjcmVlbkNvdW50ID0gaW5mby5fWDExLlhTY3JlZW5Db3VudChkaXNwbGF5KS5WYWw7DQogICAgICAgICAgICB2YXIgaWZvID0gW107DQogICAgICAgICAgICBmb3IodmFyIGk9MDtpPHNjcmVlbkNvdW50OysraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgc2NyZWVuID0gaW5mby5fWDExLlhTY3JlZW5PZkRpc3BsYXkoZGlzcGxheSwgaSk7DQogICAgICAgICAgICAgICAgaWZvLnB1c2goeyBsZWZ0OiAwLCB0b3A6IDAsIHJpZ2h0OiBpbmZvLl9YMTEuWERpc3BsYXlXaWR0aChkaXNwbGF5LCBpKS5WYWwsIGJvdHRvbTogaW5mby5fWDExLlhEaXNwbGF5SGVpZ2h0KGRpc3BsYXksIGkpLlZhbCwgc2NyZWVuOiBzY3JlZW4sIHNjcmVlbklkOiBpLCBkaXNwbGF5OiBkaXNwbGF5IH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0Ll9yZXMoaWZvKTsNCg0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZ2V0WEluZm8gPSBmdW5jdGlvbiBnZXRYSW5mbyhjb25zb2xldWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmV0ID0gbnVsbDsNCiAgICAgICAgICAgIHZhciB1bmFtZSA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRVc2VybmFtZShjb25zb2xldWlkKTsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgIiArIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJz8iLWF4ICI6IiIpICsgIi1lIC1vIHVzZXIiICsgKHByb2Nlc3MucGxhdGZvcm09PSdsaW51eCc/Ijo5OTkiOiIiKSArICIgLW8gdHR5IC1vIGNvbW1hbmQgfCBncmVwIFggfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiLWF1dGhcIik7IHNwbGl0KGFbMl0sIGIsIFwiIFwiKTsgaWYoJDE9PVwiIiArIHVuYW1lICsgIlwiICYmIGJbMV0hPVwiXCIpIHsgcHJpbnRmIFwiJXMsJXMsJXNcIiwkMSwkMixiWzFdIH0gfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHZhciB0b2tlbnMgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQgPSB7IHR0eTogdG9rZW5zWzFdLCB4YXV0aG9yaXR5OiB0b2tlbnNbMl0sIGV4cG9ydEVudjogZXhwb3J0RW52IH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChyZXQgPT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvLyBUaGlzIExpbnV4IERpc3RybyBkb2VzIG5vdCBzcGF3biBhbiBYU2VydmVyIGluc3RhbmNlIGluIHRoZSB1c2VyIHNlc3Npb24sIHRoYXQgc3BlY2lmaWVzIHRoZSBYQVVUSE9SSVRZLg0KICAgICAgICAgICAgICAgIC8vIFNvIHdlJ3JlIGdvaW5nIHRvIGJydXRlIGZvcmNlIGl0LCBieSBlbnVtZXJhdGluZyBhbGwgcHJvY2Vzc2VzIG93bmVkIGJ5IHRoaXMgdXNlciwgYW5kIGluc3BlY3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcw0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgIiArIChwcm9jZXNzLnBsYXRmb3JtPT0nZnJlZWJzZCc/Ii1heCAiOiIiKSArICItZSAtbyBwaWQgLW8gdXNlciB8IGdyZXAgIiArIHVuYW1lICsgIiB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICAgICAgZm9yKHZhciBuIGluIGxpbmVzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxuID0gbGluZXNbbl0udHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICBpZihsbi5sZW5ndGg+MCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0RW52RnJvbVBpZChsbik7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihlLlhBVVRIT1JJVFkgJiYgZS5ESVNQTEFZKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgdHR5OiAnPycsIHhhdXRob3JpdHk6IGUuWEFVVEhPUklUWSwgZGlzcGxheTogZS5ESVNQTEFZLCBleHBvcnRFbnY6IGV4cG9ydEVudiB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihyZXQgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgWEFVVEhPUklUWSBhbmQgRElTUExBWSwgc28gYXMgYSBsYXN0IGRpdGNoIGVmZm9ydCwgbGV0cyBqdXN0IGxvb2sgZm9yIERJU1BMQVkNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBsaW5lcykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxuID0gbGluZXNbbl0udHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxuLmxlbmd0aCA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0RW52RnJvbVBpZChsbik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuRElTUExBWSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgdHR5OiAnPycsIGRpc3BsYXk6IGUuRElTUExBWSwgZXhwb3J0RW52OiBleHBvcnRFbnYgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbmQgJERJU1BMQVkgYnkgbG9va2luZyBhdCBhbGwgdGhlIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZSBzYW1lIHR0eSBhcyB0aGUgWFNlcnZlciBpbnN0YW5jZSBmb3IgdGhpcyB1c2VyIHNlc3Npb24NCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgLWUgLW8gdHR5IC1vIHBpZCAtbyB1c2VyOjk5OTkgfCBncmVwICIgKyByZXQudHR5ICsgIiB8IGdyZXAgIiArIHVuYW1lICsgIiB8IGF3ayAneyBwcmludCAkMiB9JyBcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgICAgIHZhciBwcywgcHN4LCB2LCB2cyA9IDA7DQogICAgICAgICAgICAgICAgZm9yKHZhciB4IGluIGxpbmVzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYobGluZXNbeF0udHJpbSgpLmxlbmd0aD4wKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgbGluZXNbeF0udHJpbSgpICsgJy9lbnZpcm9uJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChwc2UpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB2cyA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IocHN4PTA7cHN4PHBzLmxlbmd0aDsrK3BzeCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHNbcHN4XSA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBzLnNsaWNlKHZzLCBwc3gpLnRvU3RyaW5nKCkuc3BsaXQoJz0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZbMF0gPT0gJ0RJU1BMQVknKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuZGlzcGxheSA9IHZbMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMgPSBwc3ggKyAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGV4cG9ydEVudigpDQp7DQogICAgdmFyIHIgPQ0KICAgICAgICB7DQogICAgICAgICAgICBYQVVUSE9SSVRZOiB0aGlzLnhhdXRob3JpdHk/dGhpcy54YXV0aG9yaXR5OiIiLCBESVNQTEFZOiB0aGlzLmRpc3BsYXksDQogICAgICAgICAgICBMb2NhdGlvbl9YMTFMSUI6IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLkxvY2F0aW9uX1gxMUxJQiwNCiAgICAgICAgICAgIExvY2F0aW9uX1gxMVRTVDogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuTG9jYXRpb25fWDExVFNULA0KICAgICAgICAgICAgTG9jYXRpb25fWDExRVhUOiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5Mb2NhdGlvbl9YMTFFWFQsDQogICAgICAgICAgICBMb2NhdGlvbl9YMTFGSVhFUzogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuTG9jYXRpb25fWDExRklYRVMNCiAgICAgICAgfTsNCiAgICByZXR1cm4gKHIpOw0KfQ0KDQppZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnZGFyd2luJykNCnsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBtb25pdG9yaW5mbygpOw0KfQ0KDQppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9", 16000);
memcpy_s(_monitorinfo + 32000, 84, "PSAnbGludXgnKQ0Kew0KICAgIG1vZHVsZS5leHBvcnRzLmdldExpYkluZm8gPSBnZXRMaWJJbmZvOw0KfQ0K", 84);
ILibBase64DecodeEx((unsigned char*)_monitorinfo, 32084, (unsigned char*)_monitorinfo + 32084);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "monitor-info"); duk_push_string(ctx, _monitorinfo + 32084);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_monitorinfo);
// service-host. Refer to modules/service-host.js
char *_servicehost = ILibMemory_Allocate(30948, 0, NULL, NULL);
memcpy_s(_servicehost + 0, 17684, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgp2YXIgU0VSVklDRV9XSU4zMiA9IDB4MDAwMDAwMTAgfCAweDAwMDAwMDIwOwp2YXIgU0VSVklDRV9TVEFURSA9IHsgU1RPUFBFRDogMHgwMDAwMDAwMSwgU0VSVklDRV9TVEFSVF9QRU5ESU5HOiAweDAwMDAwMDAyLCBTRVJWSUNFX1NUT1BfUEVORElORzogMHgwMDAwMDAwMywgUlVOTklORzogMHgwMDAwMDAwNCB9Owp2YXIgU0VSVklDRV9BQ0NFUFQgPSB7IFNFUlZJQ0VfQUNDRVBUX1NUT1A6IDB4MDAwMDAwMDEsIFNFUlZJQ0VfQUNDRVBUX1NIVVRET1dOOiAweDAwMDAwMDA0LCBTRVJWSUNFX0FDQ0VQVF9QT1dFUkVWRU5UOiAweDAwMDAwMDQwLCBTRVJWSUNFX0FDQ0VQVF9TRVNTSU9OQ0hBTkdFOiAweDAwMDAwMDgwIH07Cgp2YXIgU0VSVklDRV9DT05UUk9MID0geyBTRVJWSUNFX0NPTlRST0xfU0hVVERPV046IDB4MDAwMDAwMDUsIFNFUlZJQ0VfQ09OVFJPTF9TVE9QOiAweDAwMDAwMDAxLCBTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVDogMHgwMDAwMDAwRCwgU0VSVklDRV9DT05UUk9MX1NFU1NJT05DSEFOR0U6IDB4MDAwMDAwMEV9Owp2YXIgU0VTU0lPTl9DSEFOR0VfVFlQRSA9CnsKICAgIFdUU19DT05TT0xFX0NPTk5FQ1Q6IDB4MSwKICAgIFdUU19DT05TT0xFX0RJU0NPTk5FQ1Q6IDB4MiwKICAgIFdUU19SRU1PVEVfQ09OTkVDVDogMHgzLAogICAgV1RTX1JFTU9URV9ESVNDT05ORUNUOiAweDQsCiAgICBXVFNfU0VTU0lPTl9MT0dPTjogMHg1LAogICAgV1RTX1NFU1NJT05fTE9HT0ZGOiAweDYsCiAgICBXVFNfU0VTU0lPTl9MT0NLOiAweDcsCiAgICBXVFNfU0VTU0lPTl9VTkxPQ0s6IDB4OCwKICAgIFdUU19TRVNTSU9OX1JFTU9URV9DT05UUk9MOiAweDksCiAgICBXVFNfU0VTU0lPTl9DUkVBVEU6IDB4YSwKICAgIFdUU19TRVNTSU9OX1RFUk1JTkFURTogMHhiCn07CgoKdmFyIE5PX0VSUk9SID0gMDsKCnZhciBzZXJ2aWNlTWFuYWdlciA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpOwoKZnVuY3Rpb24gc2VydmljZUhvc3Qoc2VydmljZU5hbWUpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3NlcnZpY2UtaG9zdCc7CiAgICB2YXIgZW1pdHRlclV0aWxzID0gcmVxdWlyZSgnZXZlbnRzJykuaW5oZXJpdHModGhpcyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ3NlcnZpY2VTdGFydCcpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdzZXJ2aWNlU3RvcCcpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdub3JtYWxTdGFydCcpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdzZXNzaW9uJyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ3Bvd2VyU3RhdGVDaGFuZ2UnKTsKCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgewogICAgICAgIHRoaXMuR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKICAgICAgICB0aGlzLkFkdmFwaSA9IHRoaXMuR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0FkdmFwaTMyLmRsbCcpOwogICAgICAgIHRoaXMuQWR2YXBpLkNyZWF0ZU1ldGhvZCh7IG1ldGhvZDogJ1N0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQScsIHRocmVhZERpc3BhdGNoOiAxIH0pOwogICAgICAgIHRoaXMuQWR2YXBpLkNyZWF0ZU1ldGhvZCgnUmVnaXN0ZXJTZXJ2aWNlQ3RybEhhbmRsZXJFeEEnKTsKICAgICAgICB0aGlzLkFkdmFwaS5DcmVhdGVNZXRob2QoJ1NldFNlcnZpY2VTdGF0dXMnKTsKICAgICAgICB0aGlzLktlcm5lbDMyID0gdGhpcy5HTS5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7CiAgICAgICAgdGhpcy5LZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOwoKICAgICAgICB0aGlzLk9sZTMyID0gdGhpcy5HTS5DcmVhdGVOYXRpdmVQcm94eSgnT2xlMzIuZGxsJyk7CiAgICAgICAgdGhpcy5PbGUzMi5DcmVhdGVNZXRob2QoJ0NvSW5pdGlhbGl6ZUV4Jyk7CiAgICAgICAgdGhpcy5PbGUzMi5DcmVhdGVNZXRob2QoJ0NvVW5pbml0aWFsaXplJyk7CgogICAgICAgIHRoaXMuX1NlcnZpY2VOYW1lID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSh0eXBlb2YgKHNlcnZpY2VOYW1lKSA9PSAnc3RyaW5nJyA/IHNlcnZpY2VOYW1lIDogc2VydmljZU5hbWUubmFtZSk7CiAgICAgICAgdGhpcy5fU2VydmljZU1haW4gPSB0aGlzLkdNLkdldEdlbmVyaWNHbG9iYWxDYWxsYmFjaygyKTsKICAgICAgICB0aGlzLl9TZXJ2aWNlTWFpbi5QYXJlbnQgPSB0aGlzOwogICAgICAgIHRoaXMuX1NlcnZpY2VNYWluLkdNID0gdGhpcy5HTTsKICAgICAgICB0aGlzLl9TZXJ2aWNlTWFpbi5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBvbkdsb2JhbENhbGxiYWNrKGFyZ2MsIGFyZ3YpCiAgICAgICAgewogICAgICAgICAgICAvL1RvRG86IENoZWNrIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIGZvciB1cwoKICAgICAgICAgICAgdGhpcy5QYXJlbnQuX1NlcnZpY2VTdGF0dXMgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDI4KTsKICAgICAgICAgICAgLy90eXBlZGVmIHN0cnVjdCBfU0VSVklDRV9TVEFUVVMgewogICAgICAgICAgICAvLyAgICBEV09SRCAgIGR3U2VydmljZVR5cGU7CiAgICAgICAgICAgIC8vICAgIERXT1JEICAgZHdDdXJyZW50U3RhdGU7CiAgICAgICAgICAgIC8vICAgIERXT1JEICAgZHdDb250cm9sc0FjY2VwdGVkOwogICAgICAgICAgICAvLyAgICBEV09SRCAgIGR3V2luMzJFeGl0Q29kZTsKICAgICAgICAgICAgLy8gICAgRFdPUkQgICBkd1NlcnZpY2VTcGVjaWZpY0V4aXRDb2RlOwogICAgICAgICAgICAvLyAgICBEV09SRCAgIGR3Q2hlY2tQb2ludDsKICAgICAgICAgICAgLy8gICAgRFdPUkQgICBkd1dhaXRIaW50OwogICAgICAgICAgICAvL30gU0VSVklDRV9TVEFUVVMsICpMUFNFUlZJQ0VfU1RBVFVTOwoKICAgICAgICAgICAgLy8gSW5pdGlhbGlzZSBzZXJ2aWNlIHN0YXR1cwogICAgICAgICAgICB0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1cy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoU0VSVklDRV9XSU4zMik7CiAgICAgICAgICAgIHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShTRVJWSUNFX1NUQVRFLlNFUlZJQ0VfU1RPUFBFRCwgNCk7CiAgICAgICAgICAgIHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzSGFuZGxlID0gdGhpcy5QYXJlbnQuQWR2YXBpLlJlZ2lzdGVyU2VydmljZUN0cmxIYW5kbGVyRXhBKHRoaXMuUGFyZW50Ll9TZXJ2aWNlTmFtZSwgdGhpcy5QYXJlbnQuX1NlcnZpY2VDb250cm9sSGFuZGxlciwgdGhpcy5QYXJlbnQuR00uU3Rhc2hPYmplY3QodGhpcy5QYXJlbnQuX1NlcnZpY2VDb250cm9sSGFuZGxlcikpOwogICAgICAgICAgICBpZih0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1c0hhbmRsZS5WYWwgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXJ2aWNlIGlzIHN0YXJ0aW5nCiAgICAgICAgICAgIHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShTRVJWSUNFX1NUQVRFLlNFUlZJQ0VfU1RBUlRfUEVORElORywgNCk7CiAgICAgICAgICAgIHRoaXMuUGFyZW50LkFkdmFwaS5TZXRTZXJ2aWNlU3RhdHVzKHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzSGFuZGxlLCB0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1cyk7CgogICAgICAgICAgICAvLyBTZXJ2aWNlIHJ1bm5pbmcKICAgICAgICAgICAgdGhpcy5QYXJlbnQuX1NlcnZpY2VTdGF0dXMudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKFNFUlZJQ0VfU1RBVEUuUlVOTklORywgNCk7CiAgICAgICAgICAgIHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShTRVJWSUNFX0FDQ0VQVC5TRVJWSUNFX0FDQ0VQVF9TVE9QIHwgU0VSVklDRV9BQ0NFUFQuU0VSVklDRV9BQ0NFUFRfUE9XRVJFVkVOVCB8IFNFUlZJQ0VfQUNDRVBULlNFUlZJQ0VfQUNDRVBUX1NFU1NJT05DSEFOR0UsIDgpOwogICAgICAgICAgICB0aGlzLlBhcmVudC5BZHZhcGkuU2V0U2VydmljZVN0YXR1cyh0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1c0hhbmRsZSwgdGhpcy5QYXJlbnQuX1NlcnZpY2VTdGF0dXMpOwoKICAgICAgICAgICAgdGhpcy5QYXJlbnQuT2xlMzIuQ29Jbml0aWFsaXplRXgoMCwgMik7CiAgICAgICAgICAgIHRoaXMuUGFyZW50Lm9uKCd+JywgZnVuY3Rpb24gT25TZXJ2aWNlSG9zdEZpbmFsaXplcigpCiAgICAgICAgICAgIHsgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgICAgICAgICAgdmFyIEFkdmFwaSA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgICAgICAgICAgICAgIEFkdmFwaS5DcmVhdGVNZXRob2QoJ1NldFNlcnZpY2VTdGF0dXMnKTsKCiAgICAgICAgICAgICAgICBLZXJuZWwzMiA9IHRoaXMuR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0tlcm5lbDMyLmRsbCcpOwogICAgICAgICAgICAgICAgS2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKCiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gR00uQ3JlYXRlVmFyaWFibGUoMjgpOwoKICAgICAgICAgICAgICAgIC8vIFNlcnZpY2Ugd2FzIHN0b3BwZWQKICAgICAgICAgICAgICAgIHN0YXR1cy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoU0VSVklDRV9XSU4zMik7CiAgICAgICAgICAgICAgICBzdGF0dXMudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDB4MDAwMDAwMDEsIDQpOwogICAgICAgICAgICAgICAgc3RhdHVzLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgwLCA4KTsKCiAgICAgICAgICAgICAgICBBZHZhcGkuU2V0U2VydmljZVN0YXR1cyh0aGlzLl9TZXJ2aWNlU3RhdHVzSGFuZGxlLCBzdGF0dXMpOwoKICAgICAgICAgICAgICAgIHRoaXMuT2xlMzIuQ29VbmluaXRpYWxpemUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLlBhcmVudC5lbWl0KCdzZXJ2aWNlU3RhcnQnKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9TZXJ2aWNlQ29udHJvbEhhbmRsZXIgPSB0aGlzLkdNLkdldEdlbmVyaWNHbG9iYWxDYWxsYmFjayg0KTsKICAgICAgICB0aGlzLl9TZXJ2aWNlQ29udHJvbEhhbmRsZXIuUGFyZW50ID0gdGhpczsKICAgICAgICB0aGlzLl9TZXJ2aWNlQ29udHJvbEhhbmRsZXIuR00gPSB0aGlzLkdNOwogICAgICAgIHRoaXMuX1NlcnZpY2VDb250cm9sSGFuZGxlci5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBvblNlcnZpY2VDb250cm9sSGFuZGxlcihjb2RlLCBldmVudFR5cGUsIGV2ZW50RGF0YSwgY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBqID0gdGhpcy5QYXJlbnQuR00uVW5zdGFzaE9iamVjdChjb250ZXh0KTsKICAgICAgICAgICAgaWYgKGogIT0gbnVsbCAmJiBqID09IHRoaXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5WYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX0NPTlRST0wuU0VSVklDRV9DT05UUk9MX1NIVVRET1dOOgogICAgICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9DT05UUk9MLlNFUlZJQ0VfQ09OVFJPTF9TVE9QOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBhcmVudC5lbWl0KCdzZXJ2aWNlU3RvcCcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX0NPTlRST0wuU0VSVklDRV9DT05UUk9MX1NFU1NJT05DSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXNzaW9uSWQgPSBldmVudERhdGEuRGVyZWYoNCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGV2ZW50VHlwZS5WYWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9DSEFOR0VfVFlQRS5XVFNfU0VTU0lPTl9MT0dPTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9DSEFOR0VfVFlQRS5XVFNfU0VTU0lPTl9MT0dPRkY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmVtaXQoJ2NoYW5nZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLlBhcmVudC5BZHZhcGkuU2V0U2VydmljZVN0YXR1cyh0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1c0hhbmRsZSwgdGhpcy5QYXJlbnQuX1NlcnZpY2VTdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHNlcnZpY2VOYW1lKSB7IHRoaXMuX1NlcnZpY2VPcHRpb25zID0gdHlwZW9mIChzZXJ2aWNlTmFtZSkgPT0gJ29iamVjdCcgPyBzZXJ2aWNlTmFtZSA6IHsgbmFtZTogc2VydmljZU5hbWUgfTsgfQogICAgZWxzZQogICAgewogICAgICAgIHRocm93ICgnTXVzdCBzcGVjaWZ5IGVpdGhlciBTZXJ2aWNlTmFtZSBvciBPcHRpb25zJyk7CiAgICB9CiAgICBpZiAoIXRoaXMuX1NlcnZpY2VPcHRpb25zLnNlcnZpY2VQYXRoKQogICAgewogICAgICAgIHRoaXMuX1NlcnZpY2VPcHRpb25zLnNlcnZpY2VQYXRoID0gcHJvY2Vzcy5leGVjUGF0aDsKICAgIH0KICAgIAogICAgdGhpcy5ydW4gPSBmdW5jdGlvbiBydW4oKQogICAgewogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9ICd3aW4zMicpCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIFNJR1RFUk1fSGFuZGxlciA9IGZ1bmN0aW9uIF9TSUdURVJNX0hhbmRsZXIoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIF9TSUdURVJNX0hhbmRsZXIucGFyZW50LmVtaXQoJ3NlcnZpY2VTdG9wJyk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgU0lHVEVSTV9IYW5kbGVyLnBhcmVudCA9IHRoaXM7DQogICAgICAgICAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgU0lHVEVSTV9IYW5kbGVyKTsNCiAgICAgICAgfQoKICAgICAgICBmb3IodmFyIGkgPSAwOyBpPHByb2Nlc3MuYXJndi5sZW5ndGg7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChwcm9jZXNzLmFyZ3ZbaV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJy1pbnN0YWxsJzoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3N2Y01hbmFnZXIpIHsgdGhpcy5fc3ZjTWFuYWdlciA9IG5ldyBzZXJ2aWNlTWFuYWdlcigpOyB9CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdmNNYW5hZ2VyLmluc3RhbGxTZXJ2aWNlKHRoaXMuX1NlcnZpY2VPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuX1NlcnZpY2VPcHRpb25zLm5hbWUgKyAnIGluc3RhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnLXVuaW5zdGFsbCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdmNNYW5hZ2VyKSB7IHRoaXMuX3N2Y01hbmFnZXIgPSBuZXcgc2VydmljZU1hbmFnZXIoKTsgfQogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3ZjTWFuYWdlci51bmluc3RhbGxTZXJ2aWNlKHRoaXMuX1NlcnZpY2VPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuX1NlcnZpY2VPcHRpb25zLm5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgICAgICBjYXNlICctZCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgeyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc3ZjTWFuYWdlcikgeyB0aGlzLl9zdmNNYW5hZ2VyID0gbmV3IHNlcnZpY2VNYW5hZ2VyKCk7IH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdmNNYW5hZ2VyLmdldFNlcnZpY2UodGhpcy5fU2VydmljZU9wdGlvbnMubmFtZSkuc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLl9TZXJ2aWNlT3B0aW9ucy5uYW1lICsgJyBzdGFydGluZy4uLicpOwogICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3RvcCc6CiAgICAgICAgICAgICAgICBjYXNlICctcyc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgeyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc3ZjTWFuYWdlcikgeyB0aGlzLl9zdmNNYW5hZ2VyID0gbmV3IHNlcnZpY2VNYW5hZ2VyKCk7IH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdmNNYW5hZ2VyLmdldFNlcnZpY2UodGhpcy5fU2VydmljZU9wdGlvbnMubmFtZSkuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuX1NlcnZpY2VPcHRpb25zLm5hbWUgKyAnIHN0b3BwaW5nLi4uJyk7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlcnZpY2VUYWJsZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCAqIHRoaXMuR00uUG9pbnRlclNpemUpOwogICAgICAgICAgICB0aGlzLl9TZXJ2aWNlTmFtZS5wb2ludGVyQnVmZmVyKCkuY29weShzZXJ2aWNlVGFibGUudG9CdWZmZXIoKSk7CiAgICAgICAgICAgIHRoaXMuX1NlcnZpY2VNYWluLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHNlcnZpY2VUYWJsZS50b0J1ZmZlcigpLCB0aGlzLkdNLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgdGhpcy5fc3NjZCA9IHRoaXMuQWR2YXBpLlN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQShzZXJ2aWNlVGFibGUpOwogICAgICAgICAgICB0aGlzLl9zc2NkLnBhcmVudCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuX3NzY2Qub24oJ2RvbmUnLCBmdW5jdGlvbiBPblN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQShyZXRWYWwpIHsKICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnbm9ybWFsU3RhcnQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSB0aGlzLl9TZXJ2aWNlT3B0aW9ucyA/IHRoaXMuX1NlcnZpY2VPcHRpb25zLm5hbWUgOiBwcm9jZXNzLmV4ZWNQYXRoLnN1YnN0cmluZygxICsgcHJvY2Vzcy5leGVjUGF0aC5sYXN0SW5kZXhPZignLycpKTsKICAgICAgICAgICAgdmFyIHBsYXRmb3JtVHlwZSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbWFuYWdlcicpLmdldFByb2Nlc3NJbmZvKDEpLk5hbWU7CgogICAgICAgICAgICBpZiAocGxhdGZvcm1UeXBlICE9ICdzeXN0ZW1kJyAmJiBwbGF0Zm9ybVR5cGUgIT0gJ2luaXQnKQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdub3JtYWxTdGFydCcpOyAvLyBVbmtub3duIFBsYXRmb3JtIFR5cGUsIHNvIHdlJ3JlIHByb2JhYmx5IG5vdCBhIHNlcnZpY2UNCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2twaWQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2twaWQuc3Rkb3V0LnJlc3VsdCA9ICcnOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrcGlkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnJlc3VsdCArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBzd2l0Y2gocGxhdGZvcm1UeXBlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja3BpZC5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgbW9kdWxlTmFtZSArICIgc3RhdHVzIHwgYXdrICd7cHJpbnQgJDR9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja3BpZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0YXR1cyAnICsgbW9kdWxlTmFtZSArICIgfCBncmVwICdNYWluIFBJRDonIHwgYXdrICd7cHJpbnQgJDN9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2twaWQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIGlmKHRoaXMuX2NoZWNrcGlkLnN0ZG91dC5yZXN1bHQgIT0gJycgJiYgcGFyc2VJbnQodGhpcy5fY2hlY2twaWQuc3Rkb3V0LnJlc3VsdCkgPT0gcHJvY2Vzcy5waWQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NlcnZpY2VT", 16000);
memcpy_s(_servicehost + 16000, 1684, "dGFydCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ25vcm1hbFN0YXJ0Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCiAgICAgICAgewogICAgICAgICAgICAvLyBGaXJzdCBsZXQncyBmZXRjaCBhbGwgdGhlIFBJRHMgb2YgcnVubmluZyBzZXJ2aWNlcwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBsaXN0XG5leGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciB0b2tlbnMsIGk7CiAgICAgICAgICAgIHZhciBwID0ge307CiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJ1x0Jyk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdICYmIHRva2Vuc1swXSAhPSAnLScpIHsgcFt0b2tlbnNbMF1dID0gdG9rZW5zWzBdOyB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHBbcHJvY2Vzcy5waWQudG9TdHJpbmcoKV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhIHNlcnZpY2UhCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NlcnZpY2VTdGFydCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdub3JtYWxTdGFydCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzZXJ2aWNlSG9zdDsKbW9kdWxlLmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpDQp7DQogICAgcmV0dXJuIChuZXcgc2VydmljZUhvc3Qob3B0aW9ucykpOw0KfTs=", 1684);
ILibBase64DecodeEx((unsigned char*)_servicehost, 17684, (unsigned char*)_servicehost + 17684);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "service-host"); duk_push_string(ctx, _servicehost + 17684);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_servicehost);
// service-manager, which on linux has a dependency on user-sessions and process-manager. Refer to /modules folder for human readable versions.
duk_peval_string_noresult(ctx, "addModule('process-manager', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOw0KDQovLyBVc2VkIG9uIFdpbmRvd3MgYW5kIExpbnV4IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBydW5uaW5nIHByb2Nlc3Nlcw0KZnVuY3Rpb24gcHJvY2Vzc01hbmFnZXIoKSB7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAncHJvY2Vzcy1tYW5hZ2VyJzsgLy8gVXNlZCBmb3IgZGVidWdnaW5nLCBhbGxvd3MgeW91IHRvIGdldCB0aGUgb2JqZWN0IHR5cGUgYXQgcnVudGltZS4NCiAgICANCiAgICAvLyBTZXR1cCB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgY2FsbHMuDQogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgIHsNCiAgICAgICAgY2FzZSAnd2luMzInOg0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOw0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdDcmVhdGVUb29saGVscDMyU25hcHNob3QnKTsNCiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUHJvY2VzczMyRmlyc3RXJyk7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1Byb2Nlc3MzMk5leHRXJyk7DQogICAgICAgICAgICBicmVhazsNCgljYXNlICdmcmVlYnNkJzoNCiAgICAgICAgY2FzZSAnbGludXgnOg0KICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgdGhpcy5fY2hpbGRQcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICB0aHJvdyAocHJvY2Vzcy5wbGF0Zm9ybSArICcgbm90IHN1cHBvcnRlZCcpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KICAgIHRoaXMuZW51bWVyYXRlUHJvY2Vzc2VzID0gZnVuY3Rpb24gZW51bWVyYXRlUHJvY2Vzc2VzKCkNCiAgICB7DQogICAgICAgIHZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOw0KICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsNCiAgICAgICAgcmV0LmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2socHMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhbGxiYWNrLnByb20uX3Jlcyhwcyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0LmNhbGxiYWNrLnByb20gPSByZXQ7DQogICAgICAgIHRoaXMuZ2V0UHJvY2Vzc2VzKHJldC5jYWxsYmFjayk7DQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9DQogICAgLy8gUmV0dXJuIGEgb2JqZWN0IG9mOiBwaWQgLT4gcHJvY2VzcyBpbmZvcm1hdGlvbi4NCiAgICB0aGlzLmdldFByb2Nlc3NlcyA9IGZ1bmN0aW9uIGdldFByb2Nlc3NlcyhjYWxsYmFjaykNCiAgICB7DQogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHRocm93ICgnRW51bWVyYXRpbmcgcHJvY2Vzc2VzIG9uICcgKyBwcm9jZXNzLnBsYXRmb3JtICsgJyBub3Qgc3VwcG9ydGVkJyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICd3aW4zMic6IC8vIFdpbmRvd3MgcHJvY2Vzc2VzDQogICAgICAgICAgICAgICAgdmFyIHBpZDsNCiAgICAgICAgICAgICAgICB2YXIgcmV0VmFsID0ge307DQogICAgICAgICAgICAgICAgdmFyIGggPSB0aGlzLl9rZXJuZWwzMi5DcmVhdGVUb29saGVscDMyU25hcHNob3QoMiwgMCk7DQogICAgICAgICAgICAgICAgdmFyIGluZm8gPSBHTS5DcmVhdGVWYXJpYWJsZShHTS5Qb2ludGVyU2l6ZT09OCA/IDU2OCA6IDU1Nik7DQogICAgICAgICAgICAgICAgaW5mby50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoaW5mby5fc2l6ZSwgMCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRQcm9jZXNzID0gdGhpcy5fa2VybmVsMzIuUHJvY2VzczMyRmlyc3RXKGgsIGluZm8pOw0KICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0UHJvY2Vzcy5WYWwpIA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcGlkID0gaW5mby5EZXJlZig4LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW3BpZF0gPSB7IHBpZDogcGlkLCBjbWQ6IGluZm8uRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDM2IDogNDQsIDI2MCkuV2lkZTJVVEY4IH07DQogICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWxbcGlkXS51c2VyID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocGlkKS5uYW1lOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoKGVlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIG5leHRQcm9jZXNzID0gdGhpcy5fa2VybmVsMzIuUHJvY2VzczMyTmV4dFcoaCwgaW5mbyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjay5hcHBseSh0aGlzLCBbcmV0VmFsXSk7IH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzogLy8gTGludXggcHJvY2Vzc2VzDQogICAgICAgICAgICAgICAgdmFyIHAgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIHAuc3Rkb3V0LnN0ciA9ICcnOyBwLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgcC5zdGRlcnIuc3RyID0gJyc7IHAuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCdwcyAtYXggLW8gcGlkIC1vIHVzZXI6OTkgLW8gY29tbWFuZCB8IHRyICcgKyAiJ1xcbicgJ1xcdCcgfCBhd2sgLUYiICsgJyJcXHQiIFwneyBwcmludGYgInsiOyBmb3IoaT0yO2k8TkY7KytpKSB7IHNwbGl0KCRpLHRvaywiICIpOyBwaWQ9dG9rWzFdOyB1c2VyPXRva1syXTsgY21kPXN1YnN0cigkaSxsZW5ndGgodG9rWzFdKSsxMDIpOyBnc3ViKC9cXFxcLywiXFxcXFxcXFwmIixjbWQpOyBnc3ViKC8iLywiXFxcXFxcXFwmIixjbWQpOyBnc3ViKC9eWyBdKy8sIiIsY21kKTsgcHJpbnRmICIlc1xcIiVzXFwiOntcXCJwaWRcXCI6XFwiJXNcXCIsXFwidXNlclxcIjpcXCIlc1xcIixcXCJjbWRcXCI6XFwiJXNcXCJ9IiwoaSE9Mj8iLCI6IiIpLHBpZCxwaWQsdXNlcixjbWQ7IH0gcHJpbnRmICJ9IjsgfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICBwLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBwLmFyZ3MgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsgcC5hcmdzLnB1c2goYXJndW1lbnRzW2ldKTsgfQ0KDQogICAgICAgICAgICAgICAgICAgIHAuYXJncy51bnNoaWZ0KEpTT04ucGFyc2UocC5zdGRvdXQuc3RyKSk7DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIHAuYXJncyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgY2FzZSAnZnJlZWJzZCc6DQogICAgICAgICAgICAgICAgdmFyIHAgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIHAuc3Rkb3V0LnN0ciA9ICcnOyBwLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgcC5zdGRlcnIuc3RyID0gJyc7IHAuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCdwcyAtYXhvIHBpZCAtbyB1c2VyIC1vIGNvbW1hbmQgfCB0ciAnICsgIidcXG4nICdcXHQnIHwgYXdrIC1GIiArICciXFx0IiBcJ3sgcHJpbnRmICJ7IjsgZm9yKGk9MjtpPE5GOysraSkgeyBnc3ViKC9eWyBdKy8sIiIsJGkpOyBzcGxpdCgkaSx0b2ssIiAiKTsgcGlkPXRva1sxXTsgdXNlcj10b2tbMl07IGNtZD1zdWJzdHIoJGksbGVuZ3RoKHRva1sxXSkrbGVuZ3RoKHRva1syXSkrMik7IGdzdWIoL1xcXFwvLCJcXFxcXFxcXCYiLGNtZCk7IGdzdWIoLyIvLCJcXFxcXFxcXCYiLGNtZCk7IGdzdWIoL15bIF0rLywiIixjbWQpOyBwcmludGYgIiVzXFwiJXNcXCI6e1xcInBpZFxcIjpcXCIlc1xcIixcXCJ1c2VyXFwiOlxcIiVzXFwiLFxcImNtZFxcIjpcXCIlc1xcIn0iLChpIT0yPyIsIjoiIikscGlkLHBpZCx1c2VyLGNtZDsgfSBwcmludGYgIn0iOyB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIHAud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHAuYXJncyA9IFtdOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeyBwLmFyZ3MucHVzaChhcmd1bWVudHNbaV0pOyB9DQoNCiAgICAgICAgICAgICAgICAgICAgcC5hcmdzLnVuc2hpZnQoSlNPTi5wYXJzZShwLnN0ZG91dC5zdHIpKTsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgcC5hcmdzKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9jZXNzIG9uIExpbnV4DQogICAgdGhpcy5nZXRQcm9jZXNzSW5mbyA9IGZ1bmN0aW9uIGdldFByb2Nlc3NJbmZvKHBpZCkNCiAgICB7DQogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHRocm93ICgnZ2V0UHJvY2Vzc0luZm8oKSBub3Qgc3VwcG9ydGVkIGZvciAnICsgcHJvY2Vzcy5wbGF0Zm9ybSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdsaW51eCc6DQogICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgcGlkICsgJy9zdGF0dXMnKTsNCiAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHt9Ow0KICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IHN0YXR1cy50b1N0cmluZygpLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8bGluZXMubGVuZ3RoOysraSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnOicpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHsgdG9rZW5zWzFdID0gdG9rZW5zWzFdLnRyaW0oKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpbmZvW3Rva2Vuc1swXV0gPSB0b2tlbnNbMV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiAoaW5mbyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdfcGdyZXAnLCB7DQogICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzIHBncmVwIHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgfSkoKQ0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAodGhpcy5fcGdyZXAgIT0gJycpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuZ2V0UHJvY2VzcyA9IGZ1bmN0aW9uIGdldFByb2Nlc3MoY21kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicGdyZXAgZ25vbWUtc2Vzc2lvbiB8IHRyICdcXG4nICdcXHQnIHwiICsgJyBhd2sgLUYiXFx0IiBcJ3sgcHJpbnRmICJbIjsgZm9yKGk9MTtpPE5GOysraSkgeyBpZihpPjEpIHsgcHJpbnRmICIsIjsgfSBwcmludGYgIiVkIiwgJGk7IH0gcHJpbnRmICJdIjsgfVwnJyk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc3RkZXJyLnN0ciAhPSAnJykgeyB0aHJvdyAoY2hpbGQuc3RkZXJyLnN0ci50cmltKCkpOyB9DQogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnKSB7IHRocm93IChjbWQgKyAnIG5vdCBmb3VuZCcpOyB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gKEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmdldFByb2Nlc3NFeCA9IGZ1bmN0aW9uIGdldFByb2Nlc3NFeChjbWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgncHMgLWF4IC1vIHBpZCAtbyBjb21tYW5kIHwgZ3JlcCAnICsgY21kICsgIiB8IHRyICdcXG4nICdcXHQnIHwgYXdrIC1GIiArICciXFx0IiBcJ3sgcHJpbnRmICJbIjsgZm9yKGk9MTtpPE5GOysraSkgeyBzcGxpdCgkaSxyLCIgIik7IGlmKHJbMl0hPSJncmVwIikgeyBpZihpPjEpIHsgcHJpbnRmICIsIjsgfSBwcmludGYgIiVzIiwgclsxXTsgfSB9IHByaW50ZiAiXSI7IH1cJycpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKGNtZCArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gbmV3IHByb2Nlc3NNYW5hZ2VyKCk7DQo=', 'base64').toString());");
#if defined(_POSIX) && !defined(__APPLE__) && !defined(_FREEBSD)
duk_peval_string_noresult(ctx, "addModule('linux-dbus', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp0cnkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAicGVlayIsIHsgdmFsdWU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmxlbmd0aCA+IDAgPyB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQpOyB9IH0pOyB9IGNhdGNoIChlKSB7IH0NCg0KDQoNCmZ1bmN0aW9uIGRidXMoYWRkcmVzcywgdWlkLCBlbnYpDQp7DQogICAgLy9jb25zb2xlLmxvZyhhZGRyZXNzLCB1aWQsIGVudik7DQogICAgdmFyIG9wdGlvbnMgPSB7IGVudjogZW52LCB1aWQ6IHVpZCA9PSBudWxsID8gLTEgOiB1aWQgfTsNCiAgICBpZiAodWlkID09IG51bGwgJiYgZW52ID09IG51bGwpIHsgb3B0aW9ucyA9IHt9OyB9DQoNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdsaW51eC1kYnVzJzsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ3NpZ25hbCcpOw0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidWlkIiwgeyB2YWx1ZTogdWlkIH0pOw0KICAgIHRoaXMuX2NoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCIvYmluL3NoIiwgWyJzaCJdLCBvcHRpb25zKTsNCiAgICBpZiAodWlkICE9IG51bGwpDQogICAgew0KICAgICAgICB0aGlzLl9jaGlsZC5zdGRpbi53cml0ZSgnZGJ1cy1tb25pdG9yIC0tc2Vzc2lvbiAidHlwZT1cJ3NpZ25hbFwnLCBpbnRlcmZhY2U9XCcnICsgYWRkcmVzcyArICdcJyIgfCAoIHdoaWxlIHJlYWQgWDsgZG8gZWNobyAiJFgiOyBkb25lIClcbicpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB0aGlzLl9jaGlsZC5zdGRpbi53cml0ZSgnZGJ1cy1tb25pdG9yIC0tc3lzdGVtICJ0eXBlPVwnc2lnbmFsXCcnICsgKGFkZHJlc3MhPW51bGw/KCcsIGludGVyZmFjZT1cJycgKyBhZGRyZXNzICsgJ1wnJyk6KCcnKSkgKyAnIiB8ICggd2hpbGUgcmVhZCBYOyBkbyBlY2hvICIkWCI7IGRvbmUgKVxuJyk7DQogICAgfQ0KICAgIHRoaXMuX2NoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7ICB9KTsNCiAgICB0aGlzLl9jaGlsZC5zdGRvdXQuZGJ1cyA9IHRoaXM7DQogICAgdGhpcy5fY2hpbGQuc3Rkb3V0Ll9zdHIgPSAnJzsNCiAgICB0aGlzLl9jaGlsZC5zdGRvdXQuX3BlbmRpbmcgPSBbXTsNCiAgICB0aGlzLl9jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpIHsgfSk7DQogICAgdGhpcy5fY2hpbGQuc3Rkb3V0Ll9wcm9jZXNzUGVuZGluZyA9IGZ1bmN0aW9uIF9wcm9jZXNzUGVuZGluZygpDQogICAgew0KICAgICAgICAvL2NvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMuX3BlbmRpbmcsIG51bGwsIDEpKTsNCg0KICAgICAgICB0aGlzLl9wZW5kaW5nVGltZW91dCA9IG51bGw7DQogICAgICAgIHZhciBzaWcgPSB7fTsNCiAgICAgICAgdmFyIHRtcCwgdG1wMjsNCg0KICAgICAgICB2YXIgaW5mbyA9IHRoaXMuX3BlbmRpbmdbMF0uc3BsaXQoJzsnKTsNCiAgICAgICAgZm9yIChpID0gMTsgaSA8IGluZm8ubGVuZ3RoOyArK2kpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBpbmZvMiA9IGluZm9baV0uc3BsaXQoJz0nKTsNCiAgICAgICAgICAgIGlmIChpbmZvMlswXSAmJiBpbmZvMlsxXSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzaWdbaW5mbzJbMF0udHJpbSgpXSA9IGluZm8yWzFdLnRyaW0oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGkgPSAxOyBpIDwgdGhpcy5fcGVuZGluZy5sZW5ndGg7ICsraSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdbaV0uc3RhcnRzV2l0aCgnc3RyaW5nICcpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHNpZ1sndmFsdWUnXSA9IHRoaXMuX3BlbmRpbmdbaV0uc3BsaXQoJyInKVsxXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3BlbmRpbmdbaV0uc3RhcnRzV2l0aCgnYm9vbGVhbiAnKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzaWdbJ3ZhbHVlJ10gPSBKU09OLnBhcnNlKHRoaXMuX3BlbmRpbmdbaV0uc3BsaXQoJyAnKVsxXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1tpXS5zdGFydHNXaXRoKCdhcnJheSAnKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzaWdbJ2RhdGEnXSA9IFtdOw0KICAgICAgICAgICAgICAgIGZvciAoaSA9IGkgKyAxOyBpIDwgdGhpcy5fcGVuZGluZy5sZW5ndGg7ICsraSkNCiAgICAgICAgICAgICAgICB7DQoJCSAgICAgICAgICAgIGlmKHRoaXMuX3BlbmRpbmdbaV0uc3RhcnRzV2l0aCgnZGljdCBlbnRyeScpKQ0KCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICB2YXIgZGljdEVudHJ5ID0ge307DQoJCQkgICAgICAgICAgICB2YXIgajsNCgkJCSAgICAgICAgICAgIGZvcihqPWk7dGhpcy5fcGVuZGluZ1tqXS5pbmRleE9mKCcpJyk8MDsrK2opIHt9DQoJCQkgICAgICAgICAgICB2YXIgdG1wU3RyaW5nID0gdGhpcy5fcGVuZGluZy5zbGljZShpLGopLmpvaW4oJyAnKTsNCgkJCSAgICAgICAgICAgIHZhciB0bXBLZXkgPSB0bXBTdHJpbmcuc3BsaXQoJyInKVsxXTsNCgkJCSAgICAgICAgICAgIHZhciB0bXBWYWw7DQoJCQkgICAgICAgICAgICB0cnkNCgkJCSAgICAgICAgICAgIHsJCQkNCgkJCQkgICAgICAgICAgICB0bXBWYWwgID0gdG1wU3RyaW5nLnNwbGl0KCd2YXJpYW50JylbMV0udHJpbSgpOw0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgY2F0Y2goZSkNCgkJCSAgICAgICAgICAgIHsNCgkJCQkgICAgICAgICAgICBjb25zb2xlLmxvZygnT09QUzogJyArIHRtcFN0cmluZyk7DQoJCQkJICAgICAgICAgICAgY29uc29sZS5sb2coJ1xuJyk7DQoJCQkgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgICBpZih0bXBWYWwuc3RhcnRzV2l0aCgnc3RyaW5nICcpKQ0KCQkJICAgICAgICAgICAgew0KCQkJICAgICAgICAgICAgICAgdG1wVmFsID0gdG1wVmFsLnNwbGl0KCciJylbMV07DQoJCQkgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgICBpZih0bXBWYWwuc3RhcnRzV2l0aCgndWludCcpIHx8IHRtcFZhbC5zdGFydHNXaXRoKCdpbnQnKSkNCgkJCSAgICAgICAgICAgIHsNCgkJCSAgICAgICAgICAgICAgIHRtcFZhbCA9IHRtcFZhbC5zcGxpdCgnICcpWzFdOw0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgZGljdEVudHJ5W3RtcFN0cmluZy5zcGxpdCgnIicpWzFdXSA9IHRtcFZhbDsNCgkJCSAgICAgICAgICAgIHNpZ1snZGF0YSddLnB1c2goZGljdEVudHJ5KTsNCgkJCSAgICAgICAgICAgIGkgPSBqIC0gMTsNCgkJICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9wZW5kaW5nW2ldLnN0YXJ0c1dpdGgoJ3N0cmluZyAnKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdGhpcy5fcGVuZGluZ1tpXS5zcGxpdCgnIicpWzFdLnNwbGl0KCc9Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZih0bXBbMV0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDJbdG1wWzBdLnRyaW0oKV0gPSB0bXBbMV0udHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ1snZGF0YSddLnB1c2godG1wMik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5fcGVuZGluZyA9IFtdOw0KDQogICAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbiAoZSwgcykNCiAgICAgICAgew0KICAgICAgICAgICAgZS5kYnVzLmVtaXQoJ3NpZ25hbCcsIHMpOw0KICAgICAgICB9LCB0aGlzLCBzaWcpOw0KICAgIH07DQogICAgdGhpcy5fY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKQ0KICAgIHsNCiAgICAgICAgLy8gUGFyc2UgREJVUyBEYXRhDQogICAgICAgIGlmICh0aGlzLl9wZW5kaW5nVGltZW91dCkgeyBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1RpbWVvdXQpOyB0aGlzLl9wZW5kaW5nVGltZW91dCA9IG51bGw7IH0NCiAgICAgICAgLy9jb25zb2xlLmxvZygnPT4nICsgY2h1bmsudG9TdHJpbmcoKSArICc8PScpOw0KDQogICAgICAgIHZhciBpOw0KICAgICAgICB2YXIgdG9rZW5zID0gY2h1bmsudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsNCiAgICAgICAgZm9yIChpIGluIHRva2VucykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHRva2Vuc1tpXS5zdGFydHNXaXRoKCdzaWduYWwgJykpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmcubGVuZ3RoID4gMCkgeyB0aGlzLl9wcm9jZXNzUGVuZGluZygpOyB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLl9wZW5kaW5nLnB1c2godG9rZW5zW2ldKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLl9wZW5kaW5nLmxlbmd0aCA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoc2VsZikgeyBzZWxmLl9wcm9jZXNzUGVuZGluZygpOyB9LCA1MDAsIHRoaXMpOw0KICAgICAgICB9DQogICAgfSk7DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gZGJ1czsNCm1vZHVsZS5leHBvcnRzLmhhc1NlcnZpY2UgPSBmdW5jdGlvbiBoYXNTZXJ2aWNlKG5hbWUpDQp7DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9zaGFyZS9kYnVzLTEvc2VydmljZXMvKi5zZXJ2aWNlIHwgZ3JlcCAiJyArIG5hbWUgKyAnIiB8IGF3ayAtRj0gXCd7IGlmKCAkMj09IicgKyBuYW1lICsgJyIgKSB7IHByaW50ICQyOyB9IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKTsNCn07DQptb2R1bGUuZXhwb3J0cy5nZXRTZXJ2aWNlcyA9IGZ1bmN0aW9uIGdldFNlcnZpY2VzKCkNCnsNCiAgICB2YXIgZ3JlcCA9IG51bGw7DQogICAgdmFyIG9wdGlvbnMgPSBudWxsOw0KICAgIGZvciAodmFyIGF4IGluIGFyZ3VtZW50cykNCiAgICB7DQogICAgICAgIGlmKHR5cGVvZihhcmd1bWVudHNbYXhdKT09J3N0cmluZycpDQogICAgICAgIHsNCiAgICAgICAgICAgIGdyZXAgPSBhcmd1bWVudHNbYXhdOw0KICAgICAgICB9DQogICAgICAgIGlmKHR5cGVvZihhcmd1bWVudHNbYXhdKT09J29iamVjdCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbYXhdOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKGdyZXApIHsgZ3JlcCA9ICcgfCBncmVwICInICsgZ3JlcCArICciJzsgfSBlbHNlIHsgZ3JlcCA9ICcnOyB9DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsNCiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdkYnVzLXNlbmQgLS1zZXNzaW9uIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvb3JnL2ZyZWVkZXNrdG9wL0RCdXMgb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzJyArIGdyZXAgKyAnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIHJldCA9IFtdOw0KICAgIHZhciBpLCB0bXA7DQogICAgdmFyIHRva2VucyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCdcbicpOw0KICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyArK2kpDQogICAgew0KICAgICAgICBpZiAoKHRtcCA9IHRva2Vuc1tpXS50cmltKCkpLnN0YXJ0c1dpdGgoJ2FycmF5ICcpKQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3IgKGkgPSBpICsgMTsgaSA8IHRva2Vucy5sZW5ndGg7ICsraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0bXAgPSB0b2tlbnNbaV0udHJpbSgpOw0KICAgICAgICAgICAgICAgIGlmICh0bXAuc3RhcnRzV2l0aCgnc3RyaW5nICcpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goSlNPTi5wYXJzZSh0bXAuc3BsaXQoJyAnKVsxXSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHRtcC5zdGFydHNXaXRoKCdzdHJpbmcgJykpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5wdXNoKEpTT04ucGFyc2UodG1wLnNwbGl0KCcgJylbMV0pKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9DQo=', 'base64').toString());");
duk_peval_string_noresult(ctx, "addModule('linux-gnome-helpers', Buffer.from('DQoNCmZ1bmN0aW9uIGdub21lX2dldFByb3h5U2V0dGluZ3ModWlkKQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgeyBlbnY6IHsgSE9NRTogcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIodWlkKSB9fSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ3NldHRpbmdzIGxpc3QtcmVjdXJzaXZlbHkgb3JnLmdub21lLnN5c3RlbS5wcm94eSB8IHRyICJcXG4iICJcXHwiIHwgdHIgIlxcXCciICJcXGAiIHwgYXdrIFwneyBjb3VudD1zcGxpdCgkMCwgcmVzLCAifCIpOycpDQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4Yz0iW10iOycpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdmb3IoYT0wO2E8Y291bnQ7KythKScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCd7Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NwbGl0KHJlc1thXSwgbW9kZWNoZWNrLCAiICIpOycpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpZihtb2RlY2hlY2tbMl0gPT0gIm1vZGUiKScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCd7Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NwbGl0KG1vZGVjaGVja1szXSwgcHJ4LCAiYCIpOyBtb2RlID0gcHJ4WzJdOycpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCd9Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lmKG1vZGVjaGVja1sxXT09Im9yZy5nbm9tZS5zeXN0ZW0ucHJveHkuaHR0cCIgJiYgbW9kZWNoZWNrWzJdPT0iaG9zdCIpIHsgc3BsaXQobW9kZWNoZWNrWzNdLCBoc3QsICJgIik7IGhvc3QgPSBoc3RbMl07IH0nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaWYobW9kZWNoZWNrWzFdPT0ib3JnLmdub21lLnN5c3RlbS5wcm94eS5odHRwIiAmJiBtb2RlY2hlY2tbMl09PSJwb3J0IikgeyBwb3J0ID0gbW9kZWNoZWNrWzNdOyB9Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lmKG1vZGVjaGVja1sxXT09Im9yZy5nbm9tZS5zeXN0ZW0ucHJveHkiICYmIG1vZGVjaGVja1syXT09Imlnbm9yZS1ob3N0cyIpIHsgZXhjID0gc3Vic3RyKHJlc1thXSwgMzYpOyBnc3ViKCJgIiwgIlxcIiIsIGV4Yyk7IH0nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnfScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdwcmludGYgIntcXCJtb2RlXFwiOiBcXCIlc1xcIiwgXFwiaG9zdFxcIjogXFwiJXNcXCIsIFxcInBvcnRcXCI6ICVzLCBcXCJleGNlcHRpb25zXFwiOiAlc30iLCBtb2RlLCBob3N0LCBwb3J0LCBleGM7IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgIH0NCiAgICBjYXRjaChlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICh7fSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBnbm9tZV9nZXREZXNrdG9wV2FsbHBhcGVyKHVpZCkNCnsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgZW52OiB7IEhPTUU6IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRIb21lRm9sZGVyKHVpZCkgfSB9KTsNCiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ3NldHRpbmdzIGdldCBvcmcuZ25vbWUuZGVza3RvcC5iYWNrZ3JvdW5kIHBpY3R1cmUtdXJpXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5zcGxpdCgnZmlsZTovLycpLnBvcCgpOw0KICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLmVuZHNXaXRoKCciJykgfHwgY2hpbGQuc3Rkb3V0LnN0ci5lbmRzV2l0aCgiJyIpKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnN1YnN0cmluZygwLCBjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCAtIDEpKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGdub21lX3NldERlc2t0b3BXYWxscGFwZXIodWlkLCBmaWxlUGF0aCkNCnsNCiAgICBpZiAoIWZpbGVQYXRoKSB7IGZpbGVQYXRoID0gJy9kZXYvbnVsbCc7IH0NCg0KICAgIHZhciB2ID0geyBIT01FOiByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0SG9tZUZvbGRlcih1aWQpIH07DQogICAgdmFyIHBpZHMgPSByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5nZXRQcm9jZXNzKCdnbm9tZS1zZXNzaW9uJyk7DQogICAgZm9yICh2YXIgaSBpbiBwaWRzKQ0KICAgIHsNCiAgICAgICAgdmFyIGUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0RW52RnJvbVBpZChwaWRzW2ldKTsNCiAgICAgICAgaWYgKGUuVVNFUiAmJiByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VWlkKGUuVVNFUikhPXVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgdi5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgPSBlLkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzsNCiAgICAgICAgaWYgKHYuREJVU19TRVNTSU9OX0JVU19BRERSRVNTKSB7IGJyZWFrOyB9DQogICAgfQ0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCB7IHVpZDogdWlkLCBlbnY6IHYgfSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ3NldHRpbmdzIHNldCBvcmcuZ25vbWUuZGVza3RvcC5iYWNrZ3JvdW5kIHBpY3R1cmUtdXJpIGZpbGU6Ly8nICsgZmlsZVBhdGggKyAnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KfQ0KDQpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCnsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0NCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnZXRQcm94eVNldHRpbmdzOiBnbm9tZV9nZXRQcm94eVNldHRpbmdzLA0KICAgICAgICAgICAgICAgIGdldERlc2t0b3BXYWxscGFwZXI6IGdub21lX2dldERlc2t0b3BXYWxscGFwZXIsDQogICAgICAgICAgICAgICAgc2V0RGVza3RvcFdhbGxwYXBlcjogZ25vbWVfc2V0RGVza3RvcFdhbGxwYXBlcg0KICAgICAgICAgICAgfTsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnX2xvY2F0aW9uJywgew0KICAgICAgICAgICAgdmFsdWU6IChmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBnc2V0dGluZ3MgfCBhd2sgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICB9KSgpDQogICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdhdmFpbGFibGUnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX2xvY2F0aW9uICE9ICcnID8gdHJ1ZSA6IGZhbHNlKTsgfSB9KTsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnc2NyaXB0VmVyc2lvbicsDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFsdWU6IChmdW5jdGlvbigpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0geyBtYWpvcjogMCwgbWlub3I6IDAgfTsNCiAgICAgICAgICAgICAgICAgICAgaWYocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2Jpbi9zY3JpcHQnKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uICgpIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2NyaXB0IC1WIHwgYXdrIFwneyBzcGxpdCgkTkYsIFQsICIuIik7IHByaW50ZiAie1xcIm1ham9yXFwiOiVzLCBcXCJtaW5vclxcIjolc30iLFRbMV0sVFsyXTsgfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoICh4KQ0KICAgICAgICAgICAgICAgICAgICAgICAgeyB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgIH0pKCkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBicmVhazsNCn0=', 'base64').toString());");
duk_peval_string_noresult(ctx, "addModule('linux-cpuflags', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCmNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Byb2MvY3B1aW5mbyB8IGdyZXAgZmxhZ3MgfCB0ciAnXFxuJyAnficgfCBhd2sgLUZ+ICd7IHByaW50ZiAiICsgJyJbIjsgZm9yKGk9MTtpPD1ORi0xOysraSkgeyBzcGxpdCgkaSwgbGluZSwgIjoiKTsgeD1zcGxpdChsaW5lWzJdLCB2YWxzLCAiICIpOyBwcmludGYgIiVzeyIsIChpIT0xPyIsIjoiIik7IGZvcihqPTE7ajw9eDsrK2opIHsgcHJpbnRmICIlc1xcIiVzXFwiOiAxIiwgKGohPTE/IiwiOiIiKSwgdmFsc1tqXTsgIH0gcHJpbnRmICJ9IjsgIH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KY2hpbGQud2FpdEV4aXQoKTsNCg0KaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCnsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgfQ0KICAgIGNhdGNoICh4KQ0KICAgIHsNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBudWxsOw0KICAgIH0NCn0NCmVsc2UNCnsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IG51bGw7DQp9DQoNCv==', 'base64').toString());");
#endif
char *_servicemanager = ILibMemory_Allocate(301462, 0, NULL, NULL);
memcpy_s(_servicemanager + 0, 172264, "LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7DQoNCmZ1bmN0aW9uIGZhaWx1cmVBY3Rpb25Ub0ludGVnZXIoYWN0aW9uKQ0Kew0KICAgIHZhciByZXQ7DQogICAgc3dpdGNoKGFjdGlvbikNCiAgICB7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgIGNhc2UgJ05PTkUnOg0KICAgICAgICAgICAgcmV0PTA7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnU0VSVklDRV9SRVNUQVJUJzoNCiAgICAgICAgICAgIHJldD0xOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ1JFQk9PVCc6DQogICAgICAgICAgICByZXQ9MjsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICByZXR1cm4ocmV0KTsNCn0NCg0KZnVuY3Rpb24gZXh0cmFjdEZpbGVOYW1lKGZpbGVQYXRoKQ0Kew0KICAgIGlmICh0eXBlb2YgKGZpbGVQYXRoKSA9PSAnc3RyaW5nJykNCiAgICB7DQogICAgICAgIHZhciB0b2tlbnMgPSBmaWxlUGF0aC5zcGxpdCgnXFwnKS5qb2luKCcvJykuc3BsaXQoJy8nKTsNCiAgICAgICAgdmFyIG5hbWU7DQoNCiAgICAgICAgd2hpbGUgKChuYW1lID0gdG9rZW5zLnBvcCgpKSA9PSAnJyk7DQogICAgICAgIHJldHVybiAobmFtZSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldHVybihmaWxlUGF0aC5uZXdOYW1lKQ0KICAgIH0NCn0NCmZ1bmN0aW9uIGV4dHJhY3RGaWxlU291cmNlKGZpbGVQYXRoKQ0Kew0KICAgIHJldHVybiAodHlwZW9mIChmaWxlUGF0aCkgPT0gJ3N0cmluZycgPyBmaWxlUGF0aCA6IGZpbGVQYXRoLnNvdXJjZSk7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlU2VydmljZVN0YXR1cyh0b2tlbikNCnsNCiAgICB2YXIgaiA9IHt9Ow0KICAgIHZhciBzZXJ2aWNlVHlwZSA9IHRva2VuLkRlcmVmKDAsIDQpLkludFZhbDsNCiAgICBqLmlzRmlsZVN5c3RlbURyaXZlciA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKTsNCiAgICBqLmlzS2VybmVsRHJpdmVyID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMDEpID09IDB4MDAwMDAwMDEpOw0KICAgIGouaXNTaGFyZWRQcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMjApID09IDB4MDAwMDAwMjApOw0KICAgIGouaXNPd25Qcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApOw0KICAgIGouaXNJbnRlcmFjdGl2ZSA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMTAwKSA9PSAweDAwMDAwMTAwKTsNCiAgICBqLndhaXRIaW50ID0gdG9rZW4uRGVyZWYoKDYgKiA0KSwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICBzd2l0Y2ggKHRva2VuLkRlcmVmKCgxICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpDQogICAgew0KICAgICAgICBjYXNlIDB4MDAwMDAwMDU6DQogICAgICAgICAgICBqLnN0YXRlID0gJ0NPTlRJTlVFX1BFTkRJTkcnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMHgwMDAwMDAwNjoNCiAgICAgICAgICAgIGouc3RhdGUgPSAnUEFVU0VfUEVORElORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDA3Og0KICAgICAgICAgICAgai5zdGF0ZSA9ICdQQVVTRUQnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMHgwMDAwMDAwNDoNCiAgICAgICAgICAgIGouc3RhdGUgPSAnUlVOTklORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDAyOg0KICAgICAgICAgICAgai5zdGF0ZSA9ICdTVEFSVF9QRU5ESU5HJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDB4MDAwMDAwMDM6DQogICAgICAgICAgICBqLnN0YXRlID0gJ1NUT1BfUEVORElORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDAxOg0KICAgICAgICAgICAgai5zdGF0ZSA9ICdTVE9QUEVEJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICB2YXIgY29udHJvbHNBY2NlcHRlZCA9IHRva2VuLkRlcmVmKCgyICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7DQogICAgai5jb250cm9sc0FjY2VwdGVkID0gW107DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAxMCkgPT0gMHgwMDAwMDAxMCkNCiAgICB7DQogICAgICAgIGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfTkVUQklOREFERCcpOw0KICAgICAgICBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX05FVEJJTkRSRU1PVkUnKTsNCiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERU5BQkxFJyk7DQogICAgICAgIGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfTkVUQklORERJU0FCTEUnKTsNCiAgICB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwOCkgPT0gMHgwMDAwMDAwOCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BBUkFNQ0hBTkdFJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUEFVU0UnKTsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9DT05USU5VRScpOyB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDEwMCkgPT0gMHgwMDAwMDEwMCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BSRVNIVVRET1dOJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDA0KSA9PSAweDAwMDAwMDA0KSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0hVVERPV04nKTsgfQ0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMDEpID09IDB4MDAwMDAwMDEpIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9TVE9QJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfSEFSRFdBUkVQUk9GSUxFQ0hBTkdFJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDQwKSA9PSAweDAwMDAwMDQwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVCcpOyB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDA4MCkgPT0gMHgwMDAwMDA4MCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1NFU1NJT05DSEFOR0UnKTsgfQ0KICAgIGoucGlkID0gdG9rZW4uRGVyZWYoKDcgKiA0KSwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICByZXR1cm4gKGopOw0KfQ0KDQppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCnsNCiAgICBmdW5jdGlvbiBnZXRPU1ZlcnNpb24oKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzd192ZXJzIHwgZ3JlcCBQcm9kdWN0VmVyc2lvbiB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgLy9jaGlsZC5zdGRvdXQuc3RyID0gJzEwLjknOw0KDQogICAgICAgIHZhciByZXQgPSB7IHJhdzogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJy4nKSwgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLnJhdy5qb2luKCcuJykpOyB9IH07DQogICAgICAgIHJldC5jb21wYXJlVG8gPSBmdW5jdGlvbiBjb21wYXJlVG8odmFsKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmF3ID0gKHR5cGVvZiAodmFsKSA9PSAnc3RyaW5nJykgPyB2YWwuc3BsaXQoJy4nKSA6IHZhbC5yYXc7IGlmICghcmF3KSB7IHRocm93ICgnSW52YWxpZCBwYXJhbWV0ZXInKTsgfQ0KICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLnJhdy5qb2luKCcuJykuc3BsaXQoJy4nKTsNCg0KICAgICAgICAgICAgdmFyIHIgPSBudWxsLCBzID0gbnVsbDsNCiAgICAgICAgICAgIHdoaWxlIChzZWxmLmxlbmd0aCA+IDAgJiYgcmF3Lmxlbmd0aCA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcyA9IHBhcnNlSW50KHNlbGYuc2hpZnQoKSk7IHIgPSBwYXJzZUludChyYXcuc2hpZnQoKSk7DQogICAgICAgICAgICAgICAgaWYgKHMgPCByKSB7IHJldHVybiAoLTEpOyB9DQogICAgICAgICAgICAgICAgaWYgKHMgPiByKSB7IHJldHVybiAoMSk7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzZWxmLmxlbmd0aCA9PSByYXcubGVuZ3RoKSB7IHJldHVybiAoMCk7IH0NCiAgICAgICAgICAgIGlmIChzZWxmLmxlbmd0aCA8IHJhdy5sZW5ndGgpIHsgcmV0dXJuICgtMSk7IH0gZWxzZSB7IHJldHVybiAoMSk7IH0gICAgDQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH07DQoNCg0KICAgIGZ1bmN0aW9uIGZldGNoUGxpc3QoZm9sZGVyLCBuYW1lLCB1c2VyaWQpDQogICAgew0KICAgICAgICBpZiAoZm9sZGVyLmVuZHNXaXRoKCcvJykpIHsgZm9sZGVyID0gZm9sZGVyLnN1YnN0cmluZygwLCBmb2xkZXIubGVuZ3RoIC0gMSk7IH0NCiAgICAgICAgdmFyIHJldCA9IHsgbmFtZTogbmFtZSwgY2xvc2U6IGZ1bmN0aW9uICgpIHsgfSwgX3VpZDogdXNlcmlkIH07DQogICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JykpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSB0aHJvdyBpbiB0aGUgdG93ZWwsIGxldCdzIGVudW1lcmF0ZSBhbGwgdGhlIHBsaXN0IGZpbGVzLCBhbmQgc2VlIGlmIG9uZSBoYXMgYSBtYXRjaGluZyBsYWJlbA0KICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhmb2xkZXIpOw0KICAgICAgICAgICAgZm9yICh2YXIgZmlsZSBpbiBmaWxlcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIWZpbGVzW2ZpbGVdLmVuZHNXaXRoKCcucGxpc3QnKSkgeyBjb250aW51ZTsgfQ0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyBmb2xkZXIgKyAnLycgKyBmaWxlc1tmaWxlXSArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiPGtleT5MYWJlbDwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCI8L3N0cmluZz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPHN0cmluZz5cIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSBuYW1lKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0Lm5hbWUgPSBmaWxlc1tmaWxlXS5lbmRzV2l0aCgnLnBsaXN0JykgPyBmaWxlc1tmaWxlXS5zdWJzdHJpbmcoMCwgZmlsZXNbZmlsZV0ubGVuZ3RoIC0gNikgOiBmaWxlc1tmaWxlXTsNCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2FsaWFzJywgeyB2YWx1ZTogbmFtZSB9KTsNCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ3BsaXN0JywgeyB2YWx1ZTogZm9sZGVyICsgJy8nICsgZmlsZXNbZmlsZV0gfSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXQubmFtZSA9PSBuYW1lKSB7IHRocm93ICgnICcgKyAoZm9sZGVyLnNwbGl0KCdMYXVuY2hEYWVtb24nKS5sZW5ndGg+MSA/ICdMYXVuY2hEYWVtb24nIDogJ0xhdW5jaEFnZW50JykgKyAnICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOyB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAncGxpc3QnLCB7IHZhbHVlOiBmb2xkZXIgKyAnLycgKyBuYW1lICsgJy5wbGlzdCcgfSk7DQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnYWxpYXMnLA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnZGFlbW9uJywgeyB2YWx1ZTogcmV0LnBsaXN0LnNwbGl0KCcvTGF1bmNoRGFlbW9ucy8nKS5sZW5ndGggPiAxID8gdHJ1ZSA6IGZhbHNlIH0pOw0KDQogICAgICAgIHJldC5hcHBXb3JraW5nRGlyZWN0b3J5ID0gZnVuY3Rpb24gYXBwV29ya2luZ0RpcmVjdG9yeSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyB0aGlzLnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIuZW5kc1dpdGgoJy8nKSA/IGNoaWxkLnN0ZG91dC5zdHIuc3Vic3RyaW5nKDAsIGNoaWxkLnN0ZG91dC5zdHIubGVuZ3RoIC0gMSkgOiBjaGlsZC5zdGRvdXQuc3RyKTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0LmFwcExvY2F0aW9uID0gZnVuY3Rpb24gYXBwTG9jYXRpb24oKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5wbGlzdCArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICB9Ow0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnX3J1bkF0TG9hZCcsDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzZWUgaWYgdGhpcyBpcyBhbiBBdXRvLVN0YXJ0aW5nIHNlcnZpY2UsIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGltcGxlbWVudCAnc3RhcnQnDQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+UnVuQXRMb2FkPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIi8+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxcIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09ICJUUlVFIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdzdGFydFR5cGUnLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYWVtb24pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5fcnVuQXRMb2FkID8gJ0FVVE9fU1RBUlQnIDogJ0RFTUFORF9TVEFSVCcpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnQVVUT19TVEFSVCcpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJfa2VlcEFsaXZlIiwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHJldC5wbGlzdCArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3tzcGxpdCgkMCwgYSwgXCI8a2V5PktlZXBBbGl2ZTwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCI8XCIpOyBzcGxpdChiWzJdLCBjLCBcIj5cIik7ICIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiIGlmKGNbMV09PVwiZGljdFwiKXsgc3BsaXQoYVsyXSwgZCwgXCI8L2RpY3Q+XCIpOyBpZihzcGxpdChkWzFdLCB0cnV2YWwsIFwiPHRydWUvPlwiKT4xKSB7IHNwbGl0KHRydXZhbFsxXSwga24xLCBcIjxrZXk+XCIpOyBzcGxpdChrbjFbMl0sIGtuMiwgXCI8L2tleT5cIik7IHByaW50IGtuMlsxXTsgfSB9Iik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCIgZWxzZSB7IHNwbGl0KGNbMV0sIGthLCBcIi9cIik7IGlmKGthWzFdPT1cInRydWVcIikge3ByaW50IFwiQUxXQVlTXCI7fSB9IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIHJldC5nZXRQSUQgPSBmdW5jdGlvbiBnZXRQSUQodWlkLCBhc1N0cmluZykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7DQogICAgICAgICAgICB2YXIgY29tbWFuZDsNCiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0NCg0KICAgICAgICAgICAgaWYgKGdldE9TVmVyc2lvbigpLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29tbWFuZCA9ICJsYXVuY2hjdGwgbGlzdCB8IGdyZXAgJyIgKyB0aGlzLmFsaWFzICsgIicgfCBhd2sgJ3sgaWYoJDM9PVwiIiArIHRoaXMuYWxpYXMgKyAiXCIpe3ByaW50ICQxO319J1xuZXhpdFxuIjsNCiAgICAgICAgICAgICAgICBvcHRpb25zID0geyB1aWQ6IHVpZCB9", 16000);
memcpy_s(_servicemanager + 16000, 156264, "Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICh1aWQgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHByaW50IHN5c3RlbSB8IGdyZXAgIicgKyB0aGlzLmFsaWFzICsgJyIgfCBhd2sgXCd7IGlmKHNwbGl0KCQwLCB0bXAsICIgIik9PTMpIHsgaWYoJDM9PSInICsgdGhpcy5hbGlhcyArICciKSB7IHByaW50ICQxOyB9IH19XCdcbmV4aXRcbic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHByaW50IGd1aS8nICsgdWlkICsgJyB8IGdyZXAgIicgKyB0aGlzLmFsaWFzICsgJyIgfCBhd2sgXCd7IGlmKHNwbGl0KCQwLCB0bXAsICIgIik9PTMpIHsgaWYoJDM9PSInICsgdGhpcy5hbGlhcyArICciKSB7IHByaW50ICQxOyB9IH19XCdcbmV4aXRcbic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIG9wdGlvbnMpOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoY29tbWFuZCk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICBpZiAoYXNTdHJpbmcgPT0gbnVsbCB8fCBhc1N0cmluZyAhPSB0cnVlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgcmV0LmlzTG9hZGVkID0gZnVuY3Rpb24gaXNMb2FkZWQodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9DQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UElEKHVpZCwgdHJ1ZSkgIT0gJycpOw0KICAgICAgICB9Ow0KICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQ0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFBJRCh1aWQpID4gMCk7DQogICAgICAgIH07DQogICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSh1aWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0NCiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRQSUQodWlkKSA9PSBwcm9jZXNzLnBpZCk7DQogICAgICAgIH07DQogICAgICAgIHJldC5sb2FkID0gZnVuY3Rpb24gbG9hZCh1aWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsNCiAgICAgICAgICAgIHZhciB2ZXIgPSBnZXRPU1ZlcnNpb24oKTsNCiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSAnbG9hZCc7DQogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9DQoNCiAgICAgICAgICAgIGlmICh0aGlzLmRhZW1vbikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZih1aWQhPW51bGwgJiYgdWlkIT0wKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdMYXVuY2hEYWVtb24gbXVzdCBydW4gYXMgcm9vdCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodWlkID09IG51bGwpIHsgdWlkID0gc2VsZjsgfQ0KICAgICAgICAgICAgICAgIGlmKHZlci5jb21wYXJlVG8oJzEwLjEwJykgPCAwICYmIHVpZCAhPSBzZWxmICYmIHNlbGYgIT0gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRocm93ICgnT24gdGhpcyB2ZXJzaW9uIG9mIE1hY09TLCBtdXN0IGJlIHJvb3QgdG8gbG9hZCB0aGlzIHNlcnZpY2UgaW50byB0aGUgc3BlY2lmaWVkIHVzZXIgc3BhY2UnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmVyLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0geyB1aWQ6IHVpZCB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2Jvb3RzdHJhcCBndWkvJyArIHVpZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCAnICsgY29tbWFuZCArICcgJyArIHRoaXMucGxpc3QgKyAnXG5cZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICB9Ow0KICAgICAgICByZXQudW5sb2FkID0gZnVuY3Rpb24gdW5sb2FkKHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gbnVsbDsNCiAgICAgICAgICAgIHZhciB2ID0gZ2V0T1NWZXJzaW9uKCk7DQogICAgICAgICAgICB2YXIgc2VsZiA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIHZhciB1c2VCb290b3V0ID0gZmFsc2U7DQogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9DQoNCiAgICAgICAgICAgIGlmKHVpZCE9bnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodi5jb21wYXJlVG8oJzEwLjEwJykgPD0gMCAmJiBzZWxmID09IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHN3aXRjaCB0byB1c2VyIGNvbnRleHQgdG8gdW5sb2FkIHRoZSBzZXJ2aWNlDQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7IHVpZDogdWlkIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmKHYuY29tcGFyZVRvKCcxMC4xMCcpID4gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VsZiA9PSAwIHx8IHNlbGYgPT0gdWlkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBib290b3V0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9vdG91dCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdWZmaWNpZW50IGFjY2Vzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnTmVlZHMgZWxldmF0ZWQgcHJpdmlsZWdlcycpDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZiA9PSB1aWQpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCB1bmxvYWQsIGJlY3Vhc2Ugd2UgYXJlIGFscmVhZHkgaW4gdGhlIHJpZ2h0IGNvbnRleHQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VCb290b3V0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdWZmaWNpZW50IGFjY2Vzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnTmVlZHMgZWxldmF0ZWQgcHJpdmlsZWdlcycpDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYoc2VsZiA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYodi5jb21wYXJlVG8oJzEwLjEwJykgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgYm9vdG91dA0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9vdG91dCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHVubG9hZA0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9vdG91dCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIEluc3VmZmljaWVudCBhY2Nlc3MNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdOZWVkcyBlbGV2YXRlZCBwcml2aWxlZ2VzJykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGlmICh1c2VCb290b3V0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICh1aWQgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgYm9vdG91dCBzeXN0ZW0gJyArIHRoaXMucGxpc3QgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBib290b3V0IGd1aS8nICsgdWlkICsgJyAnICsgdGhpcy5wbGlzdCArICdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHVubG9hZCAnICsgdGhpcy5wbGlzdCArICdcbmV4aXRcbicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0LnN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsNCiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0NCiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID09IG51bGwpIHsgdWlkID0gc2VsZjsgfQ0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPiAwICYmIHNlbGYgPT0gMCkgeyBvcHRpb25zID0geyB1aWQ6IHVpZCB9OyB9DQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA+IDAgJiYgc2VsZiAhPSAwICYmIHVpZCAhPSBzZWxmKSB7IHRocm93ICgnQ2Fubm90IHN0YXJ0IExhdW5jaEFnZW50IGludG8gYW5vdGhlciB1c2VyIGRvbWFpbiB3aGlsZSBub3Qgcm9vdCcpOyB9DQogICAgICAgICAgICBpZiAodGhpcy5kYWVtb24gJiYgc2VsZiAhPSAwKSB7IHRocm93ICgnQ2Fubm90IHN0YXJ0IExhdW5jaERhZW1vbiB3aGlsZSBub3Qgcm9vdCcpOyB9DQoNCiAgICAgICAgICAgIHRoaXMubG9hZCh1aWQpOw0KDQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIG9wdGlvbnMpOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBzdGFydCAnICsgdGhpcy5hbGlhcyArICdcblxleGl0XG4nKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgIH07DQogICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCh1aWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgdmFyIHNlbGYgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpOw0KICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQ0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPT0gbnVsbCkgeyB1aWQgPSBzZWxmOyB9DQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA+IDAgJiYgc2VsZiA9PSAwKSB7IG9wdGlvbnMgPSB7IHVpZDogdWlkIH07IH0NCiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmICE9IDAgJiYgdWlkICE9IHNlbGYpIHsgdGhyb3cgKCdDYW5ub3Qgc3RvcCBMYXVuY2hBZ2VudCBpbiBhbm90aGVyIHVzZXIgZG9tYWluIHdoaWxlIG5vdCByb290Jyk7IH0NCiAgICAgICAgICAgIGlmICh0aGlzLmRhZW1vbiAmJiBzZWxmICE9IDApIHsgdGhyb3cgKCdDYW5ub3Qgc3RvcCBMYXVuY2hEYWVtb24gd2hpbGUgbm90IHJvb3QnKTsgfQ0KDQogICAgICAgICAgICBpZiAoISh0aGlzLl9rZWVwQWxpdmUgPT0gJ0NyYXNoZWQnIHx8IHRoaXMuX2tlZXBBbGl2ZSA9PSAnJykpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy8gV2UgbXVzdCB1bmxvYWQgdGhlIHNlcnZpY2UsIHJhdGhlciB0aGFuIHN0b3BwaW5nIGl0LCBiZWNhdXNlIG90aGVyd2lzZSBpdCdsbCBsaWtlbHkgcmVzdGFydA0KICAgICAgICAgICAgICAgIHRoaXMudW5sb2FkKHVpZCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHN0b3AgJyArIHRoaXMuYWxpYXMgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICByZXQucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9DQogICAgICAgICAgICBpZiAoZ2V0T1NWZXJzaW9uKCkuY29tcGFyZVRvKCcxMC4xMCcpIDwgMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA9PSBudWxsKSB7IHVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7IH0NCiAgICAgICAgICAgICAgICB2YXIgY29tbWFuZCA9ICdsYXVuY2hjdGwgdW5sb2FkICcgKyB0aGlzLnBsaXN0ICsgJ1xubGF1bmNoY3RsIGxvYWQgJyArIHRoaXMucGxpc3QgKyAnXG5sYXVuY2hjdGwgc3RhcnQgJyArIHRoaXMuYWxpYXMgKyAnXG5leGl0XG4nOw0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgeyBkZXRhY2hlZDogdHJ1ZSwgdWlkOiB1aWQgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoY29tbWFuZCk7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY29tbWFuZCA9IHRoaXMuZGFlbW9uID8gKCdzeXN0ZW0vJyArIHRoaXMuYWxpYXMpIDogKCdndWkvJyArICh1aWQgIT0gbnVsbCA/IHVpZCA6IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCkpICsgJy8nICsgdGhpcy5hbGlhcyk7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIGtpY2tzdGFydCAtayAnICsgY29tbWFuZCArICdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9Ow0KfQ0KDQoNCg0KZnVuY3Rpb24gc2VydmljZU1hbmFnZXIoKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gJ3NlcnZpY2UtbWFuYWdlcic7DQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykgDQogICAgew0KICAgICAgICB0aGlzLkdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQogICAgICAgIHRoaXMucHJveHkgPSB0aGlzLkdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ09wZW5TQ01hbmFnZXJBJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdFbnVtU2VydmljZXNTdGF0dXNFeFcnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ09wZW5TZXJ2aWNlVycpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnUXVlcnlTZXJ2aWNlU3RhdHVzRXgnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZUNvbmZpZ0EnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZUNvbmZpZzJBJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdDb250cm9sU2VydmljZScpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnU3RhcnRTZXJ2aWNlQScpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ2xvc2VTZXJ2aWNlSGFuZGxlJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdDcmVhdGVTZXJ2aWNlVycpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ2hhbmdlU2VydmljZUNvbmZpZzJXJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdEZWxldGVTZXJ2aWNlJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdBbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NoZWNrVG9rZW5NZW1iZXJzaGlwJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7DQoNCiAgICAgICAgdGhpcy5wcm94eTIgPSB0aGlzLkdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdLZXJuZWwzMi5kbGwnKTsNCiAgICAgICAgdGhpcy5wcm94eTIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsNCg0KICAgICAgICB0aGlzLmlzQWRtaW4gPSBmdW5jdGlvbiBpc0FkbWluKCkgew0KICAgICAgICAgICAgdmFyIE5UQXV0aG9yaXR5ID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg2KTsNCiAgICAgICAgICAgIE5UQXV0aG9yaXR5LnRvQnVmZmVyKCkud3JpdGVJbnQ4KDUsIDUpOw0KICAgICAgICAgICAgdmFyIEFkbWluaXN0cmF0b3JzR3JvdXAgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIHZhciBhZG1pbiA9IGZhbHNlOw0KDQogICAgICAgICAgICBpZiAodGhpcy5wcm94eS5BbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoTlRBdXRob3JpdHksIDIsIDMyLCA1NDQsIDAsIDAsIDAsIDAsIDAsIDAsIEFkbWluaXN0cmF0b3JzR3JvdXApLlZhbCAhPSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBtZW1iZXIgPSB0aGlzLkdNLkNyZWF0ZUludGVnZXIoKTsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5DaGVja1Rva2VuTWVtYmVyc2hpcCgwLCBBZG1pbmlzdHJhdG9yc0dyb3VwLkRlcmVmKCksIG1lbWJlcikuVmFsICE9IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgIT0gMCkgeyBhZG1pbiA9IHRydWU7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhp", 16000);
memcpy_s(_servicemanager + 32000, 140264, "cy5wcm94eS5GcmVlU2lkKEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gYWRtaW47DQogICAgICAgIH07DQogICAgICAgIHRoaXMuZ2V0UHJvZ3JhbUZvbGRlciA9IGZ1bmN0aW9uIGdldFByb2dyYW1Gb2xkZXIoKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy8gNjQgYml0IFdpbmRvd3MNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA0KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMoeDg2KSddOyAgICAvLyAzMiBCaXQgQXBwDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ1Byb2dyYW1GaWxlcyddOyAgICAgICAgICAgICAvLyA2NCBiaXQgQXBwDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIDMyIGJpdCBXaW5kb3dzDQogICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ1Byb2dyYW1GaWxlcyddOyAgICAgICAgICAgICAgICAgDQogICAgICAgIH07DQogICAgICAgIHRoaXMuZ2V0U2VydmljZUZvbGRlciA9IGZ1bmN0aW9uIGdldFNlcnZpY2VGb2xkZXIoKSB7IHJldHVybiB0aGlzLmdldFByb2dyYW1Gb2xkZXIoKSArICdcXG1lc2gnOyB9Ow0KDQogICAgICAgIHRoaXMuZW51bWVyYXRlU2VydmljZSA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBtYWNoaW5lTmFtZSA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIGRiTmFtZSA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMucHJveHkuT3BlblNDTWFuYWdlckEoMHgwMCwgMHgwMCwgMHgwMDAxIHwgMHgwMDA0KTsNCg0KICAgICAgICAgICAgdmFyIGJ5dGVzTmVlZGVkID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7DQogICAgICAgICAgICB2YXIgc2VydmljZXNSZXR1cm5lZCA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIHJlc3VtZUhhbmRsZSA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgLy92YXIgc2VydmljZXMgPSB0aGlzLnByb3h5LkNyZWF0ZVZhcmlhYmxlKDI2MjE0NCk7DQogICAgICAgICAgICB2YXIgc3VjY2VzcyA9IHRoaXMucHJveHkuRW51bVNlcnZpY2VzU3RhdHVzRXhXKGhhbmRsZSwgMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAwMywgMHgwMCwgMHgwMCwgYnl0ZXNOZWVkZWQsIHNlcnZpY2VzUmV0dXJuZWQsIHJlc3VtZUhhbmRsZSwgMHgwMCk7DQoNCiAgICAgICAgICAgIHZhciBwdHJTaXplID0gZGJOYW1lLl9zaXplOw0KICAgICAgICAgICAgdmFyIHN6ID0gYnl0ZXNOZWVkZWQuRGVyZWYoMCwgZGJOYW1lLl9zaXplKS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOw0KDQogICAgICAgICAgICBpZiAoc3ogPCAwKSB7IHRocm93ICgnZXJyb3IgZW51bWVyYXRpbmcgc2VydmljZXMnKTsgfQ0KDQogICAgICAgICAgICB2YXIgc2VydmljZXMgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKHN6KTsNCiAgICAgICAgICAgIHRoaXMucHJveHkuRW51bVNlcnZpY2VzU3RhdHVzRXhXKGhhbmRsZSwgMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAwMywgc2VydmljZXMsIHN6LCBieXRlc05lZWRlZCwgc2VydmljZXNSZXR1cm5lZCwgcmVzdW1lSGFuZGxlLCAweDAwKTsNCg0KICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IDM2ICsgKDIgKiBwdHJTaXplKTsNCiAgICAgICAgICAgIGJsb2NrU2l6ZSArPSAoKHB0clNpemUgLSAoYmxvY2tTaXplICUgcHRyU2l6ZSkpICUgcHRyU2l6ZSk7DQogICAgICAgICAgICB2YXIgcmV0VmFsID0gW107DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcnZpY2VzUmV0dXJuZWQuRGVyZWYoMCwgZGJOYW1lLl9zaXplKS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOyArK2kpDQp7DQogICAgICAgICAgICAgICAgdmFyIHRva2VuID0gc2VydmljZXMuRGVyZWYoaSAqIGJsb2NrU2l6ZSwgYmxvY2tTaXplKTsNCiAgICAgICAgICAgICAgICB2YXIgaiA9IHt9Ow0KICAgICAgICAgICAgICAgIGoubmFtZSA9IHRva2VuLkRlcmVmKDAsIHB0clNpemUpLkRlcmVmKCkuV2lkZTJVVEY4Ow0KICAgICAgICAgICAgICAgIGouZGlzcGxheU5hbWUgPSB0b2tlbi5EZXJlZihwdHJTaXplLCBwdHJTaXplKS5EZXJlZigpLldpZGUyVVRGODsNCiAgICAgICAgICAgICAgICBqLnN0YXR1cyA9IHBhcnNlU2VydmljZVN0YXR1cyh0b2tlbi5EZXJlZigyICogcHRyU2l6ZSwgMzYpKTsNCiAgICAgICAgICAgICAgICByZXRWYWwucHVzaChqKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKGhhbmRsZSk7DQogICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5nZXRTZXJ2aWNlID0gZnVuY3Rpb24gZ2V0U2VydmljZShuYW1lKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgc2VydmljZU5hbWUgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKG5hbWUsIHsgd2lkZTogdHJ1ZSB9KTsNCiAgICAgICAgICAgIHZhciBwdHIgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUocHRyLl9zaXplKTsNCiAgICAgICAgICAgIHZhciBoYW5kbGUgPSB0aGlzLnByb3h5Lk9wZW5TQ01hbmFnZXJBKDB4MDAsIDB4MDAsIDB4MDAwMSB8IDB4MDAwNCB8IDB4MDAyMCB8IDB4MDAxMCk7DQogICAgICAgICAgICBpZiAoaGFuZGxlLlZhbCA9PSAwKSB7IHRocm93ICgnY291bGQgbm90IG9wZW4gU2VydmljZU1hbmFnZXInKTsgfQ0KICAgICAgICAgICAgdmFyIGggPSB0aGlzLnByb3h5Lk9wZW5TZXJ2aWNlVyhoYW5kbGUsIHNlcnZpY2VOYW1lLCAweDAwMDEgfCAweDAwMDIgfCAweDAwMDQgfCAweDAwMjAgfCAweDAwMTAgfCAweDAwMDEwMDAwKTsNCiAgICAgICAgICAgIGlmIChoLlZhbCAhPSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByZXRWYWwgPSB7IF9PYmplY3RJRDogJ3NlcnZpY2UtbWFuYWdlci5zZXJ2aWNlJyB9DQogICAgICAgICAgICAgICAgcmV0VmFsLl9zY20gPSBoYW5kbGU7DQogICAgICAgICAgICAgICAgcmV0VmFsLl9zZXJ2aWNlID0gaDsNCiAgICAgICAgICAgICAgICByZXRWYWwuX0dNID0gdGhpcy5HTTsNCiAgICAgICAgICAgICAgICByZXRWYWwuX3Byb3h5ID0gdGhpcy5wcm94eTsNCiAgICAgICAgICAgICAgICByZXRWYWwuX3Byb3h5MiA9IHRoaXMucHJveHkyOw0KICAgICAgICAgICAgICAgIHJldFZhbC5uYW1lID0gbmFtZTsNCg0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICdzdGF0dXMnLCANCiAgICAgICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKHRoaXMuX0dNLlBvaW50ZXJTaXplKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm94eS5RdWVyeVNlcnZpY2VTdGF0dXNFeCh0aGlzLl9zZXJ2aWNlLCAwLCAwLCAwLCBieXRlc05lZWRlZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ID0gdGhpcy5fR00uQ3JlYXRlVmFyaWFibGUoYnl0ZXNOZWVkZWQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5LlF1ZXJ5U2VydmljZVN0YXR1c0V4KHRoaXMuX3NlcnZpY2UsIDAsIHN0LCBzdC5fc2l6ZSwgYnl0ZXNOZWVkZWQpLlZhbCAhPSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHBhcnNlU2VydmljZVN0YXR1cyhzdCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHsgc3RhdGU6ICdVTktOT1dOJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICdpbnN0YWxsZWRCeScsDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihyZWcuUXVlcnlLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXCcgKyB0aGlzLm5hbWUsICdfSW5zdGFsbGVkQnknKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKHh4KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuc3RhdHVzLnN0YXRlICE9ICdVTktOT1dOJykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHJldFZhbCk7DQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5jbG9zZSA9IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuX3NlcnZpY2UgJiYgdGhpcy5fc2NtKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3h5LkNsb3NlU2VydmljZUhhbmRsZSh0aGlzLl9zZXJ2aWNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUodGhpcy5fc2NtKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlID0gdGhpcy5fc2NtID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLm9uKCd+JywgcmV0VmFsLmNsb3NlKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmlzTWUgPSBmdW5jdGlvbiBpc01lKCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludCh0aGlzLnN0YXR1cy5waWQpID09IHByb2Nlc3MucGlkKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXRWYWwudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmFpbHVyZUFjdGlvbnMpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSh0aGlzLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMubGVuZ3RoICogOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZW4qc2l6ZW9mKFNDX0FDVElPTikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5sZW5ndGggJiYgaSA8IDM7ICsraSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoaSo4LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZmFpbHVyZUFjdGlvblRvSW50ZWdlcih0aGlzLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnNbaV0udHlwZSkpOyAgIC8vIFNDX0FDVElPTltpXS50eXBlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoNCsoaSo4KSwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHRoaXMuZmFpbHVyZUFjdGlvbnMuYWN0aW9uc1tpXS5kZWxheSk7ICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTltpXS5kZWxheQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkRmFpbHVyZUFjdGlvbnMgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSg0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplb2YoU0VSVklDRV9GQUlMVVJFX0FDVElPTlMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEZhaWx1cmVBY3Rpb25zLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh0aGlzLmZhaWx1cmVBY3Rpb25zLnJlc2V0UGVyaW9kKTsgICAgLy8gZHdSZXNldFBlcmlvZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRGYWlsdXJlQWN0aW9ucy5EZXJlZih0aGlzLl9HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMjQgOiAxMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHRoaXMuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5sZW5ndGgpOyAvLyBjQWN0aW9ucw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucG9pbnRlckJ1ZmZlcigpLmNvcHkodXBkYXRlZEZhaWx1cmVBY3Rpb25zLkRlcmVmKHRoaXMuX0dNLlBvaW50ZXJTaXplID09IDggPyAzMiA6IDE2LCB0aGlzLl9HTS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5LkNoYW5nZVNlcnZpY2VDb25maWcyVyh0aGlzLl9zZXJ2aWNlLCAyLCB1cGRhdGVkRmFpbHVyZUFjdGlvbnMpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3coJ1VuYWJsZSB0byBzZXQgRmFpbHVyZUFjdGlvbnMuLi4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWFnZVBhdGggPSByZWcuUXVlcnlLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXCcgKyB0aGlzLm5hbWUsICdJbWFnZVBhdGgnKS50b1N0cmluZygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IGltYWdlUGF0aC5zcGxpdCgnLmV4ZScpWzBdICsgJy5leGUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5zdGFydHNXaXRoKCciJykpIHsgcmV0ID0gcmV0LnN1YnN0cmluZygxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5hcHBXb3JraW5nRGlyZWN0b3J5ID0gZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuYXBwTG9jYXRpb24oKS5zcGxpdCgnXFwnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG9rZW5zLmpvaW4oJ1xcJykpOw0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuaXNSdW5uaW5nID0gZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnN0YXR1cy5zdGF0ZSA9PSAnUlVOTklORycpOw0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5fc3RvcEV4ID0gZnVuY3Rpb24ocywgcCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBzLnN0YXR1cy5zdGF0ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTVE9QUEVEJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5fcmVzKCdTVE9QUEVEJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NUT1BfUEVORElORyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX2VsYXBzZWRUaW1lID0gRGF0ZS5ub3coKSAtIHAuX3N0YXJ0VGltZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuX2VsYXBzZWRUaW1lIDwgMTAwMDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudGltZXIgPSBzZXRUaW1lb3V0KHMuX3N0b3BFeCwgcC5fd2FpdFRpbWUsIHMsIHApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5fcmVqKCd0aW1lb3V0IHdhaXRpbmcgZm9yIHNlcnZpY2UgdG8gc3RvcCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlaignVW5leHBlY3RlZCBzdGF0ZTogJyArIGN1cnJlbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5zdG9wID0gZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuc3RhdHVzOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLnN0YXRlID09ICdSVU5OSU5HJykNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIFNlcnZpY2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3c3RhdGUgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSgzNik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlYXNvbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9wcm94eS5Db250cm9sU2VydmljZSh0aGlzLl9zZXJ2aWNlLCAweDAwMDAwMDAxLCBuZXdzdGF0ZSkuVmFsID09IDAgJiYgKHJlYXNvbiA9IHRoaXMuX3Byb3h5Mi5HZXRMYXN0RXJyb3IoKS5WYWwpIT0wKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWoodGhpcy5uYW1lICsgJy5zdG9wKCkgZmFpbGVkIHdpdGggZXJyb3I6ICcgKyByZWFzb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byBzZXR1cCBhIHRpbWVkIGNhbGxiYWNrIHRvIGNoZWNrIHRoZSBzdGF0dXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9zdGFydFRpbWUgPSBEYXRlLm5vdygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX2VsYXBzZWRUaW1lID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll93YWl0VGltZSA9IHN0YXR1cy53YWl0SGludCAvIDEwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0Ll93YWl0VGltZSA8IDUwMCkgeyByZXQuX3dhaXRUaW1lID0gNTAwOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuX3dhaXRUaW1lID4gNTAwMCkgeyByZXQuX3dhaXRUaW1lID0gNTAwMDsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQudGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuX3N0b3BFeCwgcmV0Ll93YWl0VGltZSwgdGhpcywgcmV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ2Nhbm5vdCBjYWxsICcgKyB0aGlzLm5hbWUgKyAnLnN0b3AoKSwgd2hlbiBjdXJyZW50IHN0YXRlIGlzOiAnICsgdGhpcy5zdGF0dXMuc3RhdGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5zdGFydCA9IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cy5zdGF0ZSA9PSAnU1RPUFBFRCcpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSB0aGlzLl9wcm94eS5TdGFydFNlcnZpY2VBKHRoaXMuX3NlcnZpY2UsIDAsIDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzID09IDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAodGhpcy5uYW1lICsgJy5zdGFydCgpIGZhaWxlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ2Nhbm5vdCBjYWxsICcgKyB0aGlzLm5hbWUgKyAnLnN0YXJ0KCksIHdoZW4gY3VycmVudCBzdGF0ZSBpczogJyArIHRoaXMuc3RhdHVzLnN0YXRlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAg", 16000);
memcpy_s(_servicemanager + 48000, 124264, "fQ0KICAgICAgICAgICAgICAgICAgICByZXRWYWwucmVzdGFydCA9IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTWUoKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byByZXN0YXJ0IG91cnNlbHZlcyBvbiBXaW5kb3dzLCB3ZSBtdXN0IHNwYXduIGEgZGV0YWNoZWQgY2hpbGQgcHJvY2VzcywgYmVjdWFzZSB3ZSBuZWVkIHRvIGNhbGwgc3RhcnQsIG9uY2Ugd2UgYXJlIHN0b3BwZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnXFwnKS5wb3AoKSwgJy1leGVjICInICsgInJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZSgnIiArIHRoaXMubmFtZSArICInKS5yZXN0YXJ0KCkuZmluYWxseShmdW5jdGlvbigpe3Byb2Nlc3MuZXhpdCgpO30pOyIgKyAnIiddLCB7IHR5cGU6IDQsIGRldGFjaGVkOiB0cnVlIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcy5zdG9wKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zdGFydHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9hID0gYTsgdGhpcy5fciA9IHI7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc2VydmljZSA9IHRoaXM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnN0YXJ0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRwLl9yKGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRwLl9hKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsgY29uc29sZS5yYXdMb2coJ3N0b3AoKSBmYWlsZWQgPT4gJyArIGUudG9TdHJpbmcoKSk7fSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwLnN0YXJ0cCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHkuUXVlcnlTZXJ2aWNlQ29uZmlnQShoLCAwLCAwLCBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlfc2VydmljZV9jb25maWdhX0RXT1JELnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlfc2VydmljZV9jb25maWdhID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnByb3h5LlF1ZXJ5U2VydmljZUNvbmZpZ0EoaCwgcXVlcnlfc2VydmljZV9jb25maWdhLCBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2EuX3NpemUsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRCkuVmFsICE9IDApDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHF1ZXJ5X3NlcnZpY2VfY29uZmlnYS5EZXJlZih0aGlzLkdNLlBvaW50ZXJTaXplID09IDQgPyAyOCA6IDQ4LCB0aGlzLkdNLlBvaW50ZXJTaXplKS5EZXJlZigpLlN0cmluZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAndXNlcicsIHsgdmFsdWU6IHZhbCB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocXVlcnlfc2VydmljZV9jb25maWdhLkRlcmVmKDQsNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDI6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RhcnRUeXBlID0gJ0FVVE9fU1RBUlQnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5zdGFydFR5cGUgPSAnREVNQU5EX1NUQVJUJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RhcnRUeXBlID0gJ0RJU0FCTEVEJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZhaWx1cmVhY3Rpb25zID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg4MTkyKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGJuZWVkZWQgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDQpOyAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3h5LlF1ZXJ5U2VydmljZUNvbmZpZzJBKGgsIDIsIGZhaWx1cmVhY3Rpb25zLCA4MTkyLCBibmVlZGVkKS5WYWwgIT0gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNBY3Rpb25zID0gZmFpbHVyZWFjdGlvbnMudG9CdWZmZXIoKS5yZWFkVUludDMyTEUodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMjQgOiAxMik7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMgPSB7fTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5yZXNldFBlcmlvZCA9IGZhaWx1cmVhY3Rpb25zLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgYWN0ID0gMCA7IGFjdCA8IGNBY3Rpb25zOyArK2FjdCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gZmFpbHVyZWFjdGlvbnMuRGVyZWYodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMzIgOiAxNiwgdGhpcy5HTS5Qb2ludGVyU2l6ZSkuRGVyZWYoKS5EZXJlZihhY3QqOCw4KS50b0J1ZmZlcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChhY3Rpb24ucmVhZFVJbnQzMkxFKCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ05PTkUnIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zLnB1c2goeyB0eXBlOiAnU0VSVklDRV9SRVNUQVJUJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ1JFQk9PVCcgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zLnB1c2goeyB0eXBlOiAnT1RIRVInIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zLnBlZWsoKS5kZWxheSA9IGFjdGlvbi5yZWFkVUludDMyTEUoNCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsNCiAgICAgICAgICAgIHRocm93ICgnY291bGQgbm90IGZpbmQgc2VydmljZTogJyArIG5hbWUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIC8vIExpbnV4LCBNYWNPUywgRnJlZUJTRA0KDQogICAgICAgIHRoaXMuaXNBZG1pbiA9IGZ1bmN0aW9uIGlzQWRtaW4oKSANCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuaXNSb290KCkpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlKG5hbWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHJldCA9IHsgbmFtZTogbmFtZSwgY2xvc2U6IGZ1bmN0aW9uICgpIHsgfSB9Ow0KICAgICAgICAgICAgICAgIGlmKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9yYy5kLycgKyBuYW1lKSkgDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAncmMnLCB7IHZhbHVlOiAnL2V0Yy9yYy5kLycgKyBuYW1lIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgbmFtZSkpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAncmMnLCB7IHZhbHVlOiAnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgbmFtZSB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdTZXJ2aWNlOiAnICsgbmFtZSArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJzdGFydFR5cGUiLA0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgcmN2YXIgfCBncmVwIF9lbmFibGU9IHwgYXdrIFwneyBhPXNwbGl0KCQwLCBiLCAiXFwiIik7IGlmKGJbMl09PSJZRVMiKSB7IHByaW50ICJZRVMiOyB9IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gJ0RFTUFORF9TVEFSVCcgOiAnQVVUT19TVEFSVCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwIGRlc2M9IHwgYXdrIC1GPSAnIiArICd7IGlmKCQxPT0iZGVzYyIpIHsgJDE9IiI7IGE9c3BsaXQoJDAsIHJlcywgIlxcIiIpOyBpZihhPjEpIHsgcHJpbnQgcmVzWzJdOyB9IGVsc2UgeyBwcmludCAkMDsgfSB9IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwICIgKyB0aGlzLm5hbWUgKyAiX2NoZGlyPSB8IGF3ayAtRj0gJ3sgcHJpbnQgJDIgfScgfCBhd2sgLUZcXFwiICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCiAgICAgICAgICAgICAgICAgICAgaWYocmV0ID09ICcnKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJjLnNwbGl0KCcvJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQuam9pbignLycpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uIGFwcExvY2F0aW9uKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQoJCSAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwIGNvbW1hbmQ9IHwgYXdrIC1GPSAneyBwcmludCAkMiB9JyB8IGF3ayAtRlxcXCIgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KCQkgICAgICAgICAgICB2YXIgdG1wID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJyR7bmFtZX0nKS5qb2luKHRoaXMubmFtZSk7DQoJCSAgICAgICAgICAgIGlmKHRtcD09Jy91c3Ivc2Jpbi9kYWVtb24nKQ0KCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQoJCQkgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoJCQkgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0ICcgKyB0aGlzLnJjICsgJyB8IGdyZXAgY29tbWFuZF9hcmdzPSB8IGF3ayAtRiItZiAiIFwneyAkMT0iIjsgc3BsaXQoJDAsIHJlcywgIlxcIiIpOyBzcGxpdChyZXNbMV0sIHQsICIgIik7IHByaW50IHRbMV07IH1cJ1xuZXhpdFxuJyk7DQoJCQkgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KCQkJICAgICAgICAgICAgcmV0dXJuKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAJCSAgICAgICAgfQ0KCQkgICAgICAgICAgICBlbHNlDQoJCSAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOw0KCQkgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RhdHVzIHwgYXdrICd7IHByaW50ICQzIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAncnVubmluZycpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RhdHVzIHwgYXdrICd7IHNwbGl0KCQ2LCByZXMsIFwiLlwiKTsgcHJpbnQgcmVzWzFdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID09IHByb2Nlc3MucGlkKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0b3BcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0LnN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBvbmVzdGFydFxuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICByZXQucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBvbmVyZXN0YXJ0XG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCiAgICAgICAgew0KICAgICAg", 16000);
memcpy_s(_servicemanager + 64000, 108264, "ICAgICAgdGhpcy5nZXRTZXJ2aWNlID0gZnVuY3Rpb24gZ2V0U2VydmljZShuYW1lKSB7IHJldHVybiAoZmV0Y2hQbGlzdCgnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucycsIG5hbWUpKTsgfTsNCiAgICAgICAgICAgIHRoaXMuZ2V0TGF1bmNoQWdlbnQgPSBmdW5jdGlvbiBnZXRMYXVuY2hBZ2VudChuYW1lLCB1c2VyaWQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHVzZXJpZCA9PSBudWxsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmZXRjaFBsaXN0KCcvTGlicmFyeS9MYXVuY2hBZ2VudHMnLCBuYW1lKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmV0Y2hQbGlzdChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0SG9tZUZvbGRlcihyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VXNlcm5hbWUodXNlcmlkKSkgKyAnL0xpYnJhcnkvTGF1bmNoQWdlbnRzJywgbmFtZSwgdXNlcmlkKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSwgcGxhdGZvcm0pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKCFwbGF0Zm9ybSkgeyBwbGF0Zm9ybSA9IHRoaXMuZ2V0U2VydmljZVR5cGUoKTsgfQ0KICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWUsIGNsb3NlOiBmdW5jdGlvbiAoKSB7IH0sIHNlcnZpY2VUeXBlOiBwbGF0Zm9ybX07DQogICAgICAgICAgICAgICAgc3dpdGNoKHBsYXRmb3JtKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LmQvJyArIG5hbWUpKSB7IHBsYXRmb3JtID0gJ2luaXQnOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKSkgeyBwbGF0Zm9ybSA9ICd1cHN0YXJ0JzsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbGF0Zm9ybSA9PSAnaW5pdCcgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsYXRmb3JtID09ICd1cHN0YXJ0JyAmJiByZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC8nICsgbmFtZSArICcuY29uZicpKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuY29uZiA9IChwbGF0Zm9ybSA9PSAndXBzdGFydCcgPyAoJy9ldGMvaW5pdCcgKyBuYW1lICsgJy5jb25mJykgOiAoJy9ldGMvaW5pdC5kLycgKyBuYW1lKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnNlcnZpY2VUeXBlID0gcGxhdGZvcm07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgInN0YXJ0VHlwZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlVHlwZSA9PSAndXBzdGFydCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0ICcgKyB0aGlzLmNvbmYgKyAnIHwgZ3JlcCAic3RhcnQgb24gcnVubGV2ZWwiXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2ZpbmQgL2V0Yy9yYyogLW1heGRlcHRoIDIgLXR5cGUgbCAtbHMgfCBncmVwICIgLi4vaW5pdC5kLycgKyB0aGlzLm5hbWUgKyAnIiB8IGF3ayAtRiItPiAiIFwneyBpZigkMj09Ii4uL2luaXQuZC8nICsgdGhpcy5uYW1lICsgJyIpIHsgcHJpbnQgInRydWUiOyB9IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/ICdERU1BTkRfU1RBUlQnIDogJ0FVVE9fU1RBUlQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVzY3JpcHRpb24ucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCBkZXNjcmlwdGlvbiB8IGF3ayAnIiArICd7IGlmKCQxPT0iZGVzY3JpcHRpb24iKSB7ICQxPSIiOyBhPXNwbGl0KCQwLCByZXMsICJcXCIiKTsgaWYoYT4xKSB7IHByaW50IHJlc1syXTsgfSBlbHNlIHsgcHJpbnQgJDA7IH19fVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LmQvIiArIHRoaXMubmFtZSArICIgfCBncmVwIFNob3J0LURlc2NyaXB0aW9uOiB8IGF3ayAnIiArICd7IGlmKCQyPT0iU2hvcnQtRGVzY3JpcHRpb246IikgeyAkMT0iIjsgJDI9IiI7IHByaW50ICQwOyB9fVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBwV29ya2luZ0RpcmVjdG9yeS5wbGF0Zm9ybSA9PSAnaW5pdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LmQvIiArIHRoaXMubmFtZSArICIgfCBncmVwICdTQ1JJUFQ9JyB8IGF3ayAtRj0gJ3sgbGVuPXNwbGl0KCQyLCBhLCBcIi9cIik7IHByaW50IHN1YnN0cigkMiwwLGxlbmd0aCgkMiktbGVuZ3RoKGFbbGVuXSkpOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCAnY2hkaXIgJyB8IGF3ayAne3ByaW50ICQyfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXBwTG9jYXRpb24ucGxhdGZvcm0gPT0gJ2luaXQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC5kLyIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnU0NSSVBUPScgfCBhd2sgLUY9ICd7cHJpbnQgJDJ9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCAnZXhlYyAnIHwgYXdrICd7cHJpbnQgJDJ9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24ucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNNZSA9IGZ1bmN0aW9uIGlzTWUoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01lLnBsYXRmb3JtID09ICd1cHN0YXJ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImluaXRjdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgYXdrICd7cHJpbnQgJE5GfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgc3RhdHVzIHwgYXdrICd7cHJpbnQgJE5GfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID09IHByb2Nlc3MucGlkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lLnBsYXRmb3JtID0gcGxhdGZvcm07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzUnVubmluZyA9IGZ1bmN0aW9uIGlzUnVubmluZygpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnVubmluZy5wbGF0Zm9ybSA9PSAndXBzdGFydCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpbml0Y3RsIHN0YXR1cyAiICsgdGhpcy5uYW1lICsgIiB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDF9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBzdGF0dXMgfCBhd2sgJ3twcmludCAkMn0nIHwgYXdrIC1GLCAne3ByaW50ICQxfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJ3N0YXJ0L3J1bm5pbmcnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydC5wbGF0Zm9ybSA9PSAndXBzdGFydCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHN0YXJ0XG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0YXJ0LnBsYXRmb3JtID0gcGxhdGZvcm07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3AucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW5pdGN0bCBzdG9wICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHN0b3BcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RvcC5wbGF0Zm9ybSA9IHBsYXRmb3JtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydCgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0YXJ0LnBsYXRmb3JtID09ICd1cHN0YXJ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2luaXRjdGwgcmVzdGFydCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgdGhpcy5uYW1lICsgJyByZXN0YXJ0XG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhdHVzID0gZnVuY3Rpb24gc3RhdHVzKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5fc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLl9zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW5pdGN0bCBzdGF0dXMgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAg", 16000);
memcpy_s(_servicemanager + 80000, 92264, "ICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RhdHVzXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5fc3RyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGF0dXMucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHBsYXRmb3JtICsgJyBTZXJ2aWNlICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb25mID0gJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb25mID0gJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuY29uZikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAic3RhcnRUeXBlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RhdHVzICcgKyB0aGlzLm5hbWUgKyAnIHwgZ3JlcCBMb2FkZWQ6IHwgYXdrIFwneyBhPXNwbGl0KCQwLCBiLCAiOyIpOyBmb3IoYz0xO2M8PWE7KytjKSB7IGlmKGJbY109PSJlbmFibGVkIiB8fCBiW2NdPT0iIGVuYWJsZWQiKSB7IHByaW50ICJ0cnVlIjsgfSB9IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gJ0RFTUFORF9TVEFSVCcgOiAnQVVUT19TVEFSVCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0IC91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJyB8IGdyZXAgRGVzY3JpcHRpb249IHwgYXdrIC1GPSBcJ3sgaWYoJDE9PSJEZXNjcmlwdGlvbiIpIHsgJDE9IiI7IHByaW50ICQwOyB9fVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBXb3JraW5nRGlyZWN0b3J5ID0gZnVuY3Rpb24gYXBwV29ya2luZ0RpcmVjdG9yeSgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgdGhpcy5uYW1lICsgJy5zZXJ2aWNlJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2xpYi9zeXN0ZW1kL3N5c3RlbS8iICsgdGhpcy5uYW1lICsgIi5zZXJ2aWNlIHwgZ3JlcCAnV29ya2luZ0RpcmVjdG9yeT0nIHwgYXdrIC1GPSAneyBwcmludCAkMiB9J1xuXGV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8iICsgdGhpcy5uYW1lICsgIi5zZXJ2aWNlIHwgZ3JlcCAnV29ya2luZ0RpcmVjdG9yeT0nIHwgYXdrIC1GPSAneyBwcmludCAkMiB9J1xuXGV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcExvY2F0aW9uID0gZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyB0aGlzLm5hbWUgKyAnLnNlcnZpY2UnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdFeGVjU3RhcnQ9JyB8IGF3ayAtRj0gJ3sgc3BsaXQoJDIsIGEsIFwiIFwiKTsgcHJpbnQgYVsxXSB9J1xuXGV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8iICsgdGhpcy5uYW1lICsgIi5zZXJ2aWNlIHwgZ3JlcCAnRXhlY1N0YXJ0PScgfCBhd2sgLUY9ICd7IHNwbGl0KCQyLCBhLCBcIiBcIik7IHByaW50IGFbMV0gfSdcblxleGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInN5c3RlbWN0bCBzdGF0dXMgIiArIHRoaXMubmFtZSArICIgfCBncmVwICdNYWluIFBJRDonIHwgYXdrICd7cHJpbnQgJDN9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID09IHByb2Nlc3MucGlkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzeXN0ZW1jdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnQWN0aXZlOicgfCBhd2sgJ3twcmludCAkMn0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnYWN0aXZlJyk7ICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0b3AgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgcmVzdGFydCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhdHVzID0gZnVuY3Rpb24gc3RhdHVzKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuX3N0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5fc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0YXR1cyAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0Ll9zdHIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChwbGF0Zm9ybSArICcgU2VydmljZSAoJyArIG5hbWUgKyAnKSBOT1QgRk9VTkQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGV1ZG8gU2VydmljZSAobWVzaERhZW1vbikNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmNvbmYgPSAnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG5hbWUgKyAnLnNlcnZpY2UnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7ICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAnICsgdGhpcy5jb25mICsgIiB8IHRyICdcbicgJ34nIHwgYXdrIC1GfiAneyB3ZD0iICsgJyIiOyBwYXJtcz0iIjsgcmVzcGF3bj0iMCI7IGZvcihpPTE7aTw9TkY7KytpKSB7IHNwbGl0KCRpLCB0b2sxLCAiPSIpOyBpZih0b2sxWzFdPT0id29ya2luZ0RpcmVjdG9yeSIpIHsgd2Q9dG9rMVsyXTt9IGlmKHRvazFbMV09PSJwYXJhbWV0ZXJzIikgeyBwYXJtcz10b2sxWzJdO30gaWYodG9rMVsxXT09InJlc3Bhd24iKSB7IHJlc3Bhd249IjEiOyB9IH0gcHJpbnRmICJ7IFxcXCJ3ZFxcXCI6IFxcXCIlc1xcXCIsIFxcXCJwYXJtc1xcXCI6ICVzLCBcXFwicmVzcGF3blxcXCI6ICVzIH0iLCB3ZCwgcGFybXMsIHJlc3Bhd24gfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmV4ZVBhdGggPSBpbmZvLndkICsgJy8nICsgaW5mby5wYXJtcy5zaGlmdCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0geyBwaWRQYXRoOiBpbmZvLndkICsgJy9waWQnLCBsb2dPdXRwdXRzOiBmYWxzZSwgY3Jhc2hSZXN0YXJ0OiBpbmZvLnJlc3Bhd24gPyB0cnVlIDogZmFsc2UgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5kYWVtb24oaW5mby5leGVQYXRoLCBpbmZvLnBhcm1zLCBvcHRpb25zKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG5hbWUgKyAnL3BpZCBcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSwgJ1NJR1RFUk0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCh4KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG5hbWUgKyAnL3BpZCBcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg", 16000);
memcpy_s(_servicemanager + 96000, 76264, "ICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSA9PSBwcm9jZXNzLnBpZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgJyArIHRoaXMuY29uZiArICIgfCB0ciAnXG4nICd+JyB8IGF3ayAtRn4gJ3sgd2Q9IiArICciIjsgcGFybXM9IiI7IGZvcihpPTE7aTw9TkY7KytpKSB7IHNwbGl0KCRpLCB0b2sxLCAiPSIpOyBpZih0b2sxWzFdPT0id29ya2luZ0RpcmVjdG9yeSIpIHsgd2Q9dG9rMVsyXTt9IGlmKHRvazFbMV09PSJwYXJhbWV0ZXJzIikgeyBwYXJtcz10b2sxWzJdO30gfSBwcmludGYgInsgXFxcIndkXFxcIjogXFxcIiVzXFxcIiwgXFxcInBhcm1zXFxcIjogJXMgfSIsIHdkLCBwYXJtcyB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmZvID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5mby53ZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAnICsgdGhpcy5jb25mICsgIiB8IHRyICdcbicgJ34nIHwgYXdrIC1GfiAneyB3ZD0iICsgJyIiOyBwYXJtcz0iIjsgZm9yKGk9MTtpPD1ORjsrK2kpIHsgc3BsaXQoJGksIHRvazEsICI9Iik7IGlmKHRvazFbMV09PSJ3b3JraW5nRGlyZWN0b3J5IikgeyB3ZD10b2sxWzJdO30gaWYodG9rMVsxXT09InBhcmFtZXRlcnMiKSB7IHBhcm1zPXRvazFbMl07fSB9IHByaW50ZiAieyBcXFwid2RcXFwiOiBcXFwiJXNcXFwiLCBcXFwicGFybXNcXFwiOiAlcyB9Iiwgd2QsIHBhcm1zIH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZm8gPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbmZvLndkICsgJy8nICsgaW5mby5wYXJtcy5zaGlmdCgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgbmFtZSArICcvcGlkJykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0IC91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBuYW1lICsgJy9waWQgXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGlkID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdwcyAtcCAnICsgcGlkICsgJyAtbyBwaWQgaFxuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gcGlkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBuYW1lICsgJy9waWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goeCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ01lc2hEYWVtb24gKCcgKyBuYW1lICsgJykgTk9UIEZPVU5EJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIHRoaXMuZW51bWVyYXRlU2VydmljZSA9IGZ1bmN0aW9uIChvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgICAgICAgICAgdmFyIHBhdGhzID0gW107DQogICAgICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdsaW51eCc6DQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCgob3B0aW9ucyAmJiBvcHRpb25zLnBsYXRmb3JtVHlwZSk/b3B0aW9ucy5wbGF0Zm9ybVR5cGUgOiB0aGlzLmdldFNlcnZpY2VUeXBlKCkpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9ldGMvaW5pdC5kJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvZXRjL2luaXQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9saWIvc3lzdGVtZC9zeXN0ZW0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2ZyZWVic2QnOg0KICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvZXRjL3JjLmQnKTsNCiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL3Vzci9sb2NhbC9ldGMvcmMuZCcpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zJyk7DQogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9TeXN0ZW0vTGlicmFyeS9MYXVuY2hEYWVtb25zJyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmb3IodmFyIGkgaW4gcGF0aHMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhwYXRoc1tpXSk7DQogICAgICAgICAgICAgICAgZm9yKHZhciBqIGluIGZpbGVzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKChvcHRpb25zICYmIG9wdGlvbnMucGxhdGZvcm1UeXBlKSA/IG9wdGlvbnMucGxhdGZvcm1UeXBlIDogdGhpcy5nZXRTZXJ2aWNlVHlwZSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdLCAnaW5pdCcpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzW2pdLmVuZHNXaXRoKCcuY29uZicpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZ2V0U2VydmljZShmaWxlc1tqXS5zcGxpdCgnLmNvbmYnKVswXSwgJ3Vwc3RhcnQnKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5zZXJ2aWNlJykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdLnNwbGl0KCcuc2VydmljZScpWzBdLCAnc3lzdGVtZCcpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5zZXJ2aWNlJykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdLnNwbGl0KCcuc2VydmljZScpWzBdLCAndW5rbm93bicpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZyZWVic2QnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZ2V0U2VydmljZShmaWxlc1tqXSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5wbGlzdCcpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChmZXRjaFBsaXN0KHBhdGhzW2ldLCBmaWxlc1tqXS5zcGxpdCgnLnBsaXN0JylbMF0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yICh2YXIgayBpbiByZXN1bHRzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzW2tdLmRlc2NyaXB0aW9uKSB7IHJlc3VsdHNba10uZGVzY3JpcHRpb24gPSByZXN1bHRzW2tdLmRlc2NyaXB0aW9uKCk7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmVzdWx0cyk7DQogICAgICAgIH07DQogICAgfQ0KICAgIHRoaXMuaW5zdGFsbFNlcnZpY2UgPSBmdW5jdGlvbiBpbnN0YWxsU2VydmljZShvcHRpb25zKQ0KICAgIHsNCiAgICAgICAgaWYgKCFvcHRpb25zLnRhcmdldCkgeyBvcHRpb25zLnRhcmdldCA9IG9wdGlvbnMubmFtZTsgfQ0KICAgICAgICBpZiAoIW9wdGlvbnMuZGlzcGxheU5hbWUpIHsgb3B0aW9ucy5kaXNwbGF5TmFtZSA9IG9wdGlvbnMubmFtZTsgfQ0KDQogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCiAgICAgICAgICAgIGlmICghdGhpcy5pc0FkbWluKCkpIHsgdGhyb3cgKCdJbnN0YWxsaW5nIGFzIFNlcnZpY2UsIHJlcXVpcmVzIGFkbWluJyk7IH0NCg0KICAgICAgICAgICAgLy8gQmVmb3JlIHdlIHN0YXJ0LCB3ZSBuZWVkIHRvIGNvcHkgdGhlIGJpbmFyeSB0byB0aGUgcmlnaHQgcGxhY2UNCiAgICAgICAgICAgIHZhciBmb2xkZXIgPSB0aGlzLmdldFNlcnZpY2VGb2xkZXIoKTsNCiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlcikpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoZm9sZGVyKTsgfQ0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSk7IH0NCiAgICAgICAgICAgIGlmIChvcHRpb25zLnNlcnZpY2VQYXRoID09IHByb2Nlc3MuZXhlY1BhdGgpIHsgb3B0aW9ucy5faXNNZXNoQWdlbnQgPSB0cnVlOyB9DQogICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIG9wdGlvbnMudGFyZ2V0ICsgJy5leGUnKTsNCiAgICAgICAgICAgIG9wdGlvbnMuc2VydmljZVBhdGggPSBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIG9wdGlvbnMudGFyZ2V0ICsgJy5leGUnOw0KDQogICAgICAgICAgICB2YXIgc2VydmljZVBhdGggPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKCciJyArIG9wdGlvbnMuc2VydmljZVBhdGggKyAnIicsIHsgd2lkZTogdHJ1ZSB9KTsNCiAgICAgICAgICAgIHZhciBoYW5kbGUgPSB0aGlzLnByb3h5Lk9wZW5TQ01hbmFnZXJBKDB4MDAsIDB4MDAsIDB4MDAwMik7DQogICAgICAgICAgICBpZiAoaGFuZGxlLlZhbCA9PSAwKSB7IHRocm93ICgnZXJyb3Igb3BlbmluZyBTQ01hbmFnZXInKTsgfQ0KICAgICAgICAgICAgdmFyIHNlcnZpY2VOYW1lID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShvcHRpb25zLm5hbWUsIHsgd2lkZTogdHJ1ZSB9KTsNCiAgICAgICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUob3B0aW9ucy5kaXNwbGF5TmFtZSwgeyB3aWRlOiB0cnVlfSk7DQogICAgICAgICAgICB2YXIgYWxsQWNjZXNzID0gMHgwMDBGMDFGRjsNCiAgICAgICAgICAgIHZhciBzZXJ2aWNlVHlwZTsNCiAgICAgICAgICAgIA0KDQogICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3RhcnRUeXBlKSB7DQogICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gMHgwMjsgLy8gQXV0b21hdGljDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ0RFTUFORF9TVEFSVCc6DQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgc2VydmljZVR5cGUgPSAweDAzOyAvLyBNYW51YWwNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnRElTQUJMRUQnOg0KICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSA9IDB4MDQ7IC8vIERpc2FibGVkDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgaCA9IHRoaXMucHJveHkuQ3JlYXRlU2VydmljZVcoaGFuZGxlLCBzZXJ2aWNlTmFtZSwgZGlzcGxheU5hbWUsIGFsbEFjY2VzcywgMHgxMCB8IDB4MTAwLCBzZXJ2aWNlVHlw", 16000);
memcpy_s(_servicemanager + 112000, 60264, "ZSwgMCwgc2VydmljZVBhdGgsIDAsIDAsIDAsIDAsIDApOw0KICAgICAgICAgICAgaWYgKGguVmFsID09IDApIHsgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsgdGhyb3cgKCdFcnJvciBDcmVhdGluZyBTZXJ2aWNlOiAnICsgdGhpcy5wcm94eTIuR2V0TGFzdEVycm9yKCkuVmFsKTsgfQ0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVzY3JpcHRpb24pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGRzYyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUob3B0aW9ucy5kZXNjcmlwdGlvbiwgeyB3aWRlOiB0cnVlIH0pOw0KICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlRGVzY3JpcHRpb24gPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKHRoaXMuR00uUG9pbnRlclNpemUpOw0KICAgICAgICAgICAgICAgIGRzYy5wb2ludGVyQnVmZmVyKCkuY29weShzZXJ2aWNlRGVzY3JpcHRpb24uRGVyZWYoMCwgdGhpcy5HTS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5DaGFuZ2VTZXJ2aWNlQ29uZmlnMlcoaCwgMSwgc2VydmljZURlc2NyaXB0aW9uKS5WYWwgPT0gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bmFibGUgdG8gc2V0IGRlc2NyaXB0aW9uLi4uJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgPyA1MDAwIDogb3B0aW9ucy5mYWlsdXJlUmVzdGFydDsgICAgICAgICAgICAgLy8gRGVsYXkgaW4gbWlsbGlzZWNvbmRzDQogICAgICAgICAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDMgKiA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMqc2l6ZW9mKFNDX0FDVElPTikNCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0NfQUNUSU9OWzBdLnR5cGUNCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShkZWxheSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlswXS5kZWxheQ0KICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoOCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMV0udHlwZQ0KICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShkZWxheSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0NfQUNUSU9OWzFdLmRlbGF5DQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsyXS50eXBlDQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigyMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGRlbGF5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMl0uZGVsYXkNCg0KICAgICAgICAgICAgICAgIHZhciBmYWlsdXJlQWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplb2YoU0VSVklDRV9GQUlMVVJFX0FDVElPTlMpDQogICAgICAgICAgICAgICAgZmFpbHVyZUFjdGlvbnMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDcyMDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR3UmVzZXRQZXJpb2Q6IDIgSG91cnMNCiAgICAgICAgICAgICAgICBmYWlsdXJlQWN0aW9ucy5EZXJlZih0aGlzLkdNLlBvaW50ZXJTaXplID09IDggPyAyNCA6IDEyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMyk7Ly8gY0FjdGlvbnM6IDMNCiAgICAgICAgICAgICAgICBhY3Rpb25zLnBvaW50ZXJCdWZmZXIoKS5jb3B5KGZhaWx1cmVBY3Rpb25zLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuR00uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOw0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3h5LkNoYW5nZVNlcnZpY2VDb25maWcyVyhoLCAyLCBmYWlsdXJlQWN0aW9ucykuVmFsID09IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIHNldCBGYWlsdXJlQWN0aW9ucy4uLicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKGgpOw0KICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsNCg0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIG9wdGlvbnMuZmlsZXMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc1tpXS5fYnVmZmVyKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd3JpdGluZyAnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYyhmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIGV4dHJhY3RGaWxlTmFtZShvcHRpb25zLmZpbGVzW2ldKSwgb3B0aW9ucy5maWxlc1tpXS5fYnVmZmVyKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5aW5nICcgKyBleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQoNCg0KDQogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBpbWFnZVBhdGggPSByZWcuUXVlcnlLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXCcgKyBvcHRpb25zLm5hbWUsICdJbWFnZVBhdGgnKTsNCiAgICAgICAgICAgICAgICBpbWFnZVBhdGggKz0gKCcgJyArIG9wdGlvbnMucGFyYW1ldGVycy5qb2luKCcgJykpOw0KICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcJyArIG9wdGlvbnMubmFtZSwgJ0ltYWdlUGF0aCcsIGltYWdlUGF0aCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcJyArIG9wdGlvbnMubmFtZSwgJ19JbnN0YWxsZWRCeScsIHJlZy51c2VybmFtZVRvVXNlcktleShyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0UHJvY2Vzc093bmVyTmFtZShwcm9jZXNzLnBpZCkubmFtZSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKHh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgIGlmIChvcHRpb25zLl9pc01lc2hBZ2VudCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIC8vIEZvciBub3csIHdlJ2xsIG9ubHkgcHJvdmlkZSBhbiB1bmluc3RhbGxlciBpZiB0aGUgYmluYXJ5IGlzIHRoZSBtZXNoIGFnZW50IGJpbmFyeSwgc28gd2UNCiAgICAgICAgICAgICAgICAvLyB3b24ndCBuZWVkIHRvIGNvcHkgdGhlIGJpbmFyeSB0byBydW4gdGhlIHVuaW5zdGFsbCBzY3JpcHQNCiAgICAgICAgICAgICAgICAvLw0KICAgICAgICAgICAgICAgIHZhciBzY3JpcHQgPSBCdWZmZXIuZnJvbSgidHJ5e3JlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIudW5pbnN0YWxsU2VydmljZSgnIiArIG9wdGlvbnMubmFtZSArICInKTt9Y2F0Y2goeCl7fXByb2Nlc3MuZXhpdCgpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFwnICsgb3B0aW9ucy5uYW1lLCAnRGlzcGxheU5hbWUnLCBvcHRpb25zLmRpc3BsYXlOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgcmVnLldyaXRlS2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXCcgKyBvcHRpb25zLm5hbWUsICdEaXNwbGF5SWNvbicsIGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgb3B0aW9ucy50YXJnZXQgKyAnLmV4ZScpOw0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wdWJsaXNoZXIpIHsgcmVnLldyaXRlS2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXCcgKyBvcHRpb25zLm5hbWUsICdQdWJsaXNoZXInLCBvcHRpb25zLnB1Ymxpc2hlcik7IH0NCiAgICAgICAgICAgICAgICAgICAgcmVnLldyaXRlS2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXCcgKyBvcHRpb25zLm5hbWUsICdJbnN0YWxsTG9jYXRpb24nLCBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgcmVnLldyaXRlS2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXCcgKyBvcHRpb25zLm5hbWUsICdFc3RpbWF0ZWRTaXplJywgTWF0aC5mbG9vcihyZXF1aXJlKCdmcycpLnN0YXRTeW5jKGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgb3B0aW9ucy50YXJnZXQgKyAnLmV4ZScpLnNpemUgLyAxMDI0KSk7DQogICAgICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFwnICsgb3B0aW9ucy5uYW1lLCAnTm9Nb2RpZnknLCAweDEpOw0KICAgICAgICAgICAgICAgICAgICByZWcuV3JpdGVLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU09GVFdBUkVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbFxcJyArIG9wdGlvbnMubmFtZSwgJ05vUmVwYWlyJywgMHgxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PSAnTWVzaCBBZ2VudCcpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFwnICsgb3B0aW9ucy5uYW1lLCAnVW5pbnN0YWxsU3RyaW5nJywgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBvcHRpb25zLnRhcmdldCArICcuZXhlIC1mdW5pbnN0YWxsJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZWcuV3JpdGVLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU09GVFdBUkVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbFxcJyArIG9wdGlvbnMubmFtZSwgJ1VuaW5zdGFsbFN0cmluZycsIGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgb3B0aW9ucy50YXJnZXQgKyAnLmV4ZSAtYjY0ZXhlYyAnICsgc2NyaXB0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaCAoeHgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5pc0FkbWluKCkpIHsgY29uc29sZS5sb2coJ0luc3RhbGxpbmcgYSBTZXJ2aWNlIHJlcXVpcmVzIHJvb3QnKTsgdGhyb3cgKCdJbnN0YWxsaW5nIGFzIFNlcnZpY2UsIHJlcXVpcmVzIHJvb3QnKTsgfQ0KICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvcHRpb25zLnBhcmFtZXRlcnMgPyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpIDogJyc7DQogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9DQogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0NCiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsNCiAgICAgICAgICAgIHZhciBibSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7DQogICAgICAgICAgICBibSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsNCiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBibSk7DQoNCiAgICAgICAgICAgIHZhciByYyA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG9wdGlvbnMubmFtZSwgeyBmbGFnczogJ3diJyB9KTsNCiAgICAgICAgICAgIHJjLndyaXRlKCcjIS9iaW4vc2hcbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJyMgUFJPVklERTogJyArIG9wdGlvbnMubmFtZSArICdcbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJyMgUkVRVUlSRTogRklMRVNZU1RFTVMgTkVUV09SS0lOR1xuJyk7DQogICAgICAgICAgICByYy53cml0ZSgnIyBLRVlXT1JEOiBzaHV0ZG93blxuJyk7DQogICAgICAgICAgICByYy53cml0ZSgnLiAvZXRjL3JjLnN1YnJcblxuJyk7DQogICAgICAgICAgICByYy53cml0ZSgnbmFtZT0iJyArIG9wdGlvbnMubmFtZSArICciXG4nKTsNCiAgICAgICAgICAgIHJjLndyaXRlKCdkZXNjPSInICsgKG9wdGlvbnMuZGVzY3JpcHRpb24gPyBvcHRpb25zLmRlc2NyaXB0aW9uIDogJ01lc2hDZW50cmFsIEFnZW50JykgKyAnIlxuJyk7DQogICAgICAgICAgICByYy53cml0ZSgncmN2YXI9JHtuYW1lfV9lbmFibGVcbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJ3BpZGZpbGU9Ii92YXIvcnVuLycgKyBvcHRpb25zLm5hbWUgKyAnLnBpZCJcbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJ2NvbW1hbmQ9Ii91c3Ivc2Jpbi9kYWVtb24iXG4nKTsNCiAgICAgICAgICAgIHJjLndyaXRlKCdjb21tYW5kX2FyZ3M9Ii1QICR7cGlkZmlsZX0gJyArICgob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKT8nLXInOicnKSArICcgLWYgL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICcgJyArIHBhcmFtZXRlcnMgKyAnIlxuJyk7DQogICAgICAgICAgICByYy53cml0ZSgnY29tbWFuZF9jaGRpcj0iL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnIlxuXG4nKTsNCiAgICAgICAgICAgIHJjLndyaXRlKCdsb2FkX3JjX2NvbmZpZyAkbmFtZVxuJyk7DQogICAgICAgICAgICByYy53cml0ZSgnOiAkeycgKyBvcHRpb25zLm5hbWUgKyAnX2VuYWJsZT0iJyArICgob3B0aW9ucy5zdGFydFR5cGUgPT0gJ0FVVE9fU1RBUlQnIHx8IG9wdGlvbnMuc3RhcnRUeXBlID09ICdCT09UX1NUQVJUJyk/J1lFUyc6J05PJykgKyAnIn1cbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJ3J1bl9yY19jb21tYW5kICIkMSJcbicpOw0KICAgICAgICAgICAgcmMuZW5kKCk7DQogICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG9wdGlvbnMubmFtZSkubW9kZTsNCiAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7DQogICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgb3B0aW9ucy5uYW1lLCBtKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5pc0FkbWluKCkpIHsgY29uc29sZS5sb2coJ0luc3RhbGxpbmcgYSBTZXJ2aWNlIHJlcXVpcmVzIHJvb3QnKTsgdGhyb3cgKCdJbnN0YWxsaW5nIGFzIFNlcnZpY2UsIHJlcXVpcmVzIHJvb3QnKTsgfQ0KICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvcHRpb25zLnBhcmFtZXRlcnMgPyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpIDogJyc7DQogICAgICAgICAgICB2YXIgY29uZjsNCiAgICAgICAgICAgIGlmICghb3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0pIHsgb3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0gPSB0aGlzLmdldFNlcnZpY2VUeXBlKCk7IH0NCiAgICAgICAgICAgDQogICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc2VydmljZVBsYXRmb3JtKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0NCg0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5aW5nICcgKyBvcHRpb25zLnNlcnZpY2VQYXRoKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7DQogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmFzaCBSZXN0YXJ0IGlzIGVuYWJsZWQsIGJ1dCBpdCBpc24ndCBpbmhlcmVudGx5IHN1cHBvcnRlZCBieSBJTklULCBzbyB3ZSBtdXN0IGZha2UgaXQgd2l0aCBKUw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcF9wYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5zcGxpdCgnIicpLmpvaW4oJ1xcIicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9ICItZXhlYyBcXFwidmFyIGNoaWxkOyBwcm9jZXNzLm9uKCdTSUdURVJNJywgZnVuY3Rpb24gKCkgeyBjaGlsZC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2V4aXQnKTsgY2hpbGQua2lsbCgpOyBwcm9jZXNzLmV4aXQoKTsgfSk7IGZ1bmN0aW9uIHN0YXJ0KCkgeyBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5hcmd2MCwgXFxcIiIgKyB0bXBfcGFyYW1ldGVycyArICJcXFwiXSk7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsgY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoc3RhdHVzKSB7IHN0YXJ0KCk7IH0pOyB9IHN0YXJ0KCk7XFxcIiI7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIHRoZSBpbml0LmQgc2NyaXB0IEkgd3JvdGUuIFJhdGhlciB0aGFuIGhhdmluZyB0byBkZWFsIHdpdGggZXNjYXBpbmcgdGhlIHRoaW5nLCBJIGp1c3QgQmFzZTY0IGVuY29kZWQgaXQgdG8gcHJldmVudCBpc3N1ZXMuDQogICAgICAgICAgICAgICAgICAgIGNvbmYgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvZXRjL2luaXQuZC8nICsgb3B0aW9ucy5uYW1lLCB7IGZsYWdzOiAnd2InIH0pOw0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKEJ1ZmZlci5mcm9tKCdJeUV2WW1sdUwzTm9DZ29LVTBOU1NWQlVQUzkxYzNJdmJHOWpZV3d2YldWemFGOXpaWEoyYVdObGN5OVlXRmhZV0M5WldWbFpXUXBTVlU1QlV6MXliMjkwQ2dwUVNVUkdTVXhGUFM5MllYSXZjblZ1TDFoWVdGaFlMbkJwWkFwTVQwZEdTVXhGUFM5MllYSXZiRzluTDFoWVdGaFlMbXh2WndvS2Mz", 16000);
memcpy_s(_servicemanager + 128000, 44264, "UmhjblFvS1NCN0NpQWdhV1lnV3lBdFppQWlKRkJKUkVaSlRFVWlJRjBnSmlZZ2EybHNiQ0F0TUNBa0tHTmhkQ0FpSkZCSlJFWkpURVVpS1NBeVBpOWtaWFl2Ym5Wc2JEc2dkR2hsYmdvZ0lDQWdaV05vYnlBblUyVnlkbWxqWlNCaGJISmxZV1I1SUhKMWJtNXBibWNuSUQ0bU1nb2dJQ0FnY21WMGRYSnVJREVLSUNCbWFRb2dJR1ZqYUc4Z0oxTjBZWEowYVc1bklITmxjblpwWTJYaWdLWW5JRDRtTWdvZ0lHeHZZMkZzSUVOTlJEMGlKRk5EVWtsUVZDQjdlMUJCVWsxVGZYMGdKajRnWENJa1RFOUhSa2xNUlZ3aUlDWWdaV05vYnlCY0pDRWlDaUFnYkc5allXd2dRMDFFVUVGVVNEMGtLR1ZqYUc4Z0pGTkRVa2xRVkNCOElHRjNheUFuZXlCc1pXNDljM0JzYVhRb0pEQXNJR0VzSUNJdklpazdJSEJ5YVc1MElITjFZbk4wY2lna01Dd2dNQ3dnYkdWdVozUm9LQ1F3S1Mxc1pXNW5kR2dvWVZ0c1pXNWRLU2s3SUgwbktRb2dJR05rSUNSRFRVUlFRVlJJQ2lBZ2MzVWdMV01nSWlSRFRVUWlJQ1JTVlU1QlV5QStJQ0lrVUVsRVJrbE1SU0lLSUNCbFkyaHZJQ2RUWlhKMmFXTmxJSE4wWVhKMFpXUW5JRDRtTWdwOUNncHpkRzl3S0NrZ2V3b2dJR2xtSUZzZ0lTQXRaaUFpSkZCSlJFWkpURVVpSUYwN0lIUm9aVzRLSUNBZ0lHVmphRzhnSjFObGNuWnBZMlVnYm05MElISjFibTVwYm1jbklENG1NZ29nSUNBZ2NtVjBkWEp1SURFS0lDQmxiSE5sQ2dsd2FXUTlKQ2dnWTJGMElDSWtVRWxFUmtsTVJTSWdLUW9KYVdZZ2EybHNiQ0F0TUNBa2NHbGtJREkrTDJSbGRpOXVkV3hzT3lCMGFHVnVDaUFnSUNBZ0lHVmphRzhnSjFOMGIzQndhVzVuSUhObGNuWnBZMlhpZ0tZbklENG1NZ29nSUNBZ0lDQnJhV3hzSUMweE5TQWtjR2xrQ2lBZ0lDQWdJR1ZqYUc4Z0oxTmxjblpwWTJVZ2MzUnZjSEJsWkNjZ1BpWXlDZ2xsYkhObENna2dJR1ZqYUc4Z0oxTmxjblpwWTJVZ2JtOTBJSEoxYm01cGJtY25DZ2xtYVFvSmNtMGdMV1lnSkNKUVNVUkdTVXhGSWdvZ0lHWnBDbjBLY21WemRHRnlkQ2dwZXdvSmMzUnZjQW9KYzNSaGNuUUtmUXB6ZEdGMGRYTW9LWHNLQ1dsbUlGc2dMV1lnSWlSUVNVUkdTVXhGSWlCZENnbDBhR1Z1Q2drSmNHbGtQU1FvSUdOaGRDQWlKRkJKUkVaSlRFVWlJQ2tLQ1FscFppQnJhV3hzSUMwd0lDUndhV1FnTWo0dlpHVjJMMjUxYkd3N0lIUm9aVzRLQ1FrSlpXTm9ieUFpV0ZoWVdGZ2djM1JoY25RdmNuVnVibWx1Wnl3Z2NISnZZMlZ6Y3lBa2NHbGtJZ29KQ1dWc2MyVUtDUWtKWldOb2J5QW5XRmhZV0ZnZ2MzUnZjQzkzWVdsMGFXNW5Kd29KQ1dacENnbGxiSE5sQ2drSlpXTm9ieUFuV0ZoWVdGZ2djM1J2Y0M5M1lXbDBhVzVuSndvSlpta0tDbjBLQ2dwallYTmxJQ0lrTVNJZ2FXNEtDWE4wWVhKMEtRb0pDWE4wWVhKMENna0pPenNLQ1hOMGIzQXBDZ2tKYzNSdmNBb0pDVHM3Q2dseVpYTjBZWEowS1FvSkNYTjBiM0FLQ1FsemRHRnlkQW9KQ1RzN0NnbHpkR0YwZFhNcENna0pjM1JoZEhWekNna0pPenNLQ1NvcENna0paV05vYnlBaVZYTmhaMlU2SUhObGNuWnBZMlVnV0ZoWVdGZ2dlM04wWVhKMGZITjBiM0I4Y21WemRHRnlkSHh6ZEdGMGRYTjlJZ29KQ1RzN0NtVnpZV01LWlhocGRDQXdDZ289JywgJ2Jhc2U2NCcpLnRvU3RyaW5nKCkuc3BsaXQoJ1hYWFhYJykuam9pbihvcHRpb25zLm5hbWUpLnNwbGl0KCdZWVlZWScpLmpvaW4ob3B0aW9ucy50YXJnZXQpLnJlcGxhY2UoJ3t7UEFSTVN9fScsIHBhcmFtZXRlcnMpKTsNCiAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsNCg0KICAgICAgICAgICAgICAgICAgICBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL2V0Yy9pbml0LmQvJyArIG9wdGlvbnMubmFtZSkubW9kZTsNCiAgICAgICAgICAgICAgICAgICAgbSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsNCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy9ldGMvaW5pdC5kLycgKyBvcHRpb25zLm5hbWUsIG0pOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3RhcnRUeXBlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCT09UX1NUQVJUJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NZU1RFTV9TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBVVRPX1NUQVJUJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgndXBkYXRlLXJjLmQgJyArIG9wdGlvbnMubmFtZSArICcgZGVmYXVsdHNcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0NCg0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5aW5nICcgKyBvcHRpb25zLnNlcnZpY2VQYXRoKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7DQogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsNCg0KICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL2V0Yy9pbml0LycgKyBvcHRpb25zLm5hbWUgKyAnLmNvbmYnLCB7IGZsYWdzOiAnd2InIH0pOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3RhcnRUeXBlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCT09UX1NUQVJUJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NZU1RFTV9TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBVVRPX1NUQVJUJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdzdGFydCBvbiBydW5sZXZlbCBbMjM0NV1cbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdzdG9wIG9uIHJ1bmxldmVsIFswMTZdXG5cbicpOw0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdyZXNwYXduXG5cbicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ2NoZGlyIC91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJ1xuJyk7DQogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ2V4ZWMgL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICcgJyArIHBhcmFtZXRlcnMgKyAnXG5cbicpOw0KICAgICAgICAgICAgICAgICAgICBjb25mLmVuZCgpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoNCiAgICAgICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VEZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb24gPyBvcHRpb25zLmRlc2NyaXB0aW9uIDogJ01lc2hDZW50cmFsIEFnZW50JzsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0NCg0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCk7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7DQogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtJykpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2UnLCB7IGZsYWdzOiAnd2InIH0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0nKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2UnLCB7IGZsYWdzOiAnd2InIH0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCd1bmtub3duIGxvY2F0aW9uIGZvciBzeXN0ZW1kIGNvbmZpZ3VyYXRpb24gZmlsZXMnKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1tVbml0XVxuRGVzY3JpcHRpb249JyArIHNlcnZpY2VEZXNjcmlwdGlvbiArICdcbicpOw0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdbU2VydmljZV1cbicpOw0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdXb3JraW5nRGlyZWN0b3J5PS91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJ1xuJyk7DQogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ0V4ZWNTdGFydD0vdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0ICsgJyAnICsgcGFyYW1ldGVycyArICdcbicpOw0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdTdGFuZGFyZE91dHB1dD1udWxsXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnUmVzdGFydD1vbi1mYWlsdXJlXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnUmVzdGFydFNlYz0zXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdSZXN0YXJ0U2VjPScgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJ1xuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQk9PVF9TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTWVNURU1fU1RBUlQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnW0luc3RhbGxdXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnQWxpYXM9JyArIG9wdGlvbnMubmFtZSArICcuc2VydmljZVxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5fbW9kdWxlTmFtZSA9IG9wdGlvbnMubmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIGVuYWJsZSAnICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLmVuZCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIFVua25vd24gU2VydmljZSBUeXBlLCBpbnN0YWxsIGFzIGEgUHNldWRvIFNlcnZpY2UgKE1lc2hEYWVtb24pDQogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMnKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBvcHRpb25zLm5hbWUpOyB9DQogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy9kYWVtb24nKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZUd1aWQgPSAnQjk5NjAxNTg4MDU0NEExOUI3RjdFOUJFNDQ5MTRDMTgnOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhZW1vbkpTID0gQnVmZmVyLmZyb20oJ0x5b0tRMjl3ZVhKcFoyaDBJREl3TVRrZ1NXNTBaV3dnUTI5eWNHOXlZWFJwYjI0S0NreHBZMlZ1YzJWa0lIVnVaR1Z5SUhSb1pTQkJjR0ZqYUdVZ1RHbGpaVzV6WlN3Z1ZtVnljMmx2YmlBeUxqQWdLSFJvWlNBaVRHbGpaVzV6WlNJcE93cDViM1VnYldGNUlHNXZkQ0IxYzJVZ2RHaHBjeUJtYVd4bElHVjRZMlZ3ZENCcGJpQmpiMjF3YkdsaGJtTmxJSGRwZEdnZ2RHaGxJRXhwWTJWdWMyVXVDbGx2ZFNCdFlYa2diMkowWVdsdUlHRWdZMjl3ZVNCdlppQjBhR1VnVEdsalpXNXpaU0JoZEFvS0lDQWdJR2gwZEhBNkx5OTNkM2N1WVhCaFkyaGxMbTl5Wnk5c2FXTmxibk5sY3k5TVNVTkZUbE5GTFRJdU1Bb0tWVzVzWlhOeklISmxjWFZwY21Wa0lHSjVJR0Z3Y0d4cFkyRmliR1VnYkdGM0lHOXlJR0ZuY21WbFpDQjBieUJwYmlCM2NtbDBhVzVuTENCemIyWjBkMkZ5WlFwa2FYTjBjbWxpZFhSbFpDQjFibVJsY2lCMGFHVWdUR2xqWlc1elpTQnBjeUJrYVhOMGNtbGlkWFJsWkNCdmJpQmhiaUFpUVZNZ1NWTWlJRUpCVTBsVExBcFhTVlJJVDFWVUlGZEJVbEpCVGxSSlJWTWdUMUlnUTA5T1JFbFVTVTlPVXlCUFJpQkJUbGtnUzBsT1JDd2daV2wwYUdWeUlHVjRjSEpsYzNNZ2IzSWdhVzF3YkdsbFpDNEtVMlZsSUhSb1pTQk1hV05sYm5ObElHWnZjaUIwYUdVZ2MzQmxZMmxtYVdNZ2JHRnVaM1ZoWjJVZ1oyOTJaWEp1YVc1bklIQmxjbTFwYzNOcGIyNXpJR0Z1WkFwc2FXMXBkR0YwYVc5dWN5QjFibVJsY2lCMGFHVWdUR2xqWlc1elpTNEtLaThLQ2dwcFppQW9jSEp2WTJWemN5NWhjbWQyTG14bGJtZDBhQ0E4SURNcENuc0tJQ0FnSUdOdmJuTnZiR1V1Ykc5bktDZDFjMkZuWlRvZ1pHRmxiVzl1SUZzZ2MzUmhjblFnZkNCemRHOXdJSHdnYzNSaGRIVnpJRjBnVzNObGNuWnBZMlZkSnlrN0NpQWdJQ0J3Y205alpYTnpMbVY0YVhRb0tUc0tmUW9LZG1GeUlITWdQU0J1ZFd4c093cDBjbmtLZXdvZ0lDQWdjeUE5SUhKbGNYVnBjbVVvSjNObGNuWnBZMlV0YldGdVlXZGxjaWNwTG0xaGJtRm5aWEl1WjJWMFUyVnlkbWxqWlNod2NtOWpaWE56TG1GeVozWmJNbDBwT3dwOUNtTmhkR05vS0hncENuc0tJQ0FnSUdOdmJuTnZiR1V1Ykc5bktIZ3BPd29nSUNBZ2NISnZZMlZ6Y3k1bGVHbDBLQ2s3Q24wS0NuTjNhWFJqYUNod2NtOWpaWE56TG1GeVozWmJNVjBwQ25zS0lDQWdJR05oYzJVZ0ozTjBZWEowSnpvS0lDQWdJQ0FnSUNCekxuTjBZWEowS0NrN0NpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29KMU4wWVhKMGFXNW5MaTR1SnlrN0NpQWdJQ0FnSUNBZ1luSmxZV3M3Q2lBZ0lDQmpZWE5sSUNkemRHOXdKem9LSUNBZ0lDQWdJQ0J6TG5OMGIzQW9LVHNLSUNBZ0lDQWdJQ0JqYjI1emIyeGxMbXh2WnlnblUzUnZjSEJwYm1jdUxpNG5LVHNLSUNBZ0lDQWdJQ0JpY21WaGF6c0tJQ0FnSUdOaGMyVWdKM04wWVhSMWN5YzZDaUFnSUNBZ0lDQWdhV1lnS0hNdWFYTlNkVzV1YVc1bktDa3BDaUFnSUNBZ0lDQWdld29nSUNBZ0lDQWdJQ0FnSUNCamIyNXpiMnhsTG14dlp5Z25VblZ1Ym1sdVp5d2dVRWxFSUQwZ0p5QXJJSEpsY1hWcGNtVW9KMlp6SnlrdWNtVmhaRVpwYkdWVGVXNWpLQ2N2ZFhOeUwyeHZZMkZzTDIxbGMyaGZaR0ZsYlc5dWN5OG5JQ3NnY0hKdlkyVnpjeTVoY21kMld6SmRJQ3NnSnk5d2FXUW5LUzUwYjFOMGNtbHVaeWdwS1RzS0lDQWdJQ0FnSUNCOUNpQWdJQ0FnSUNBZ1pXeHpaUW9nSUNBZ0lDQWdJSHNLSUNBZ0lDQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29KMDV2ZENCeWRXNXVhVzVuSnlrN0NpQWdJQ0FnSUNBZ2ZRb2dJQ0FnSUNBZ0lHSnlaV0ZyT3dvZ0lDQWdaR1ZtWVhWc2REb0tJQ0FnSUNBZ0lDQmpiMjV6YjJ4bExteHZaeWduVlc1cmJtOTNiaUJqYjIxdFlXNWtPaUFuSUNzZ2NISnZZMlZ6Y3k1aGNtZDJXekZkS1RzS0lDQWdJQ0FnSUNCaWNtVmhhenNLZlFvS2NISnZZMlZ6Y3k1bGVHbDBLQ2s3Q2c9PScsICdiYXNlNjQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGUgPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYyhwcm9jZXNzLmV4ZWNQYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWRkaW5nID0gQnVmZmVyLmFsbG9jKDggLSAoKGV4ZS5sZW5ndGggKyBkYWVtb25KUy5sZW5ndGggKyAxNiArIDQpICUgOCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy9kYWVtb24nLCB7IGZsYWdzOiAid2IiIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhZW1vbkpTTGVuID0gQnVmZmVyLmFsbG9jKDQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGFlbW9uSlNMZW4ud3JpdGVVSW50MzJCRShkYWVtb25KUy5sZW5ndGgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB3LndyaXRlKGV4ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFkZGluZy5sZW5ndGggPiAwKSB7IHcud3JpdGUocGFkZGluZyk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHcud3JpdGUoZGFlbW9uSlMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdy53cml0ZShkYWVtb25KU0xlbik7DQogICAgICAgICAgICAgICAgICAgICAgICB3LndyaXRlKEJ1ZmZlci5mcm9tKGV4ZUd1aWQsICdoZXgnKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB3LmVuZCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvZGFlbW9uJywgcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvZGFlbW9uJykubW9kZSB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVz", 16000);
memcpy_s(_servicemanager + 144000, 28264, "aF9kYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7DQogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG0pOw0KDQogICAgICAgICAgICAgICAgICAgIGNvbmYgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlJywgeyBmbGFnczogJ3diJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnd29ya2luZ0RpcmVjdG9yeT0nICsgJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnXG4nKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZighb3B0aW9ucy5wYXJhbWV0ZXJzKSB7b3B0aW9ucy5wYXJhbWV0ZXJzID0gW107fQ0KICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtZXRlcnMudW5zaGlmdChvcHRpb25zLm5hbWUpOw0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdwYXJhbWV0ZXJzPScgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtZXRlcnMpICsgJ1xuJyk7DQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1ldGVycy5zaGlmdCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdyZXNwYXduXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb25mLmVuZCgpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0NCg0KICAgICAgICAgICAgLy8gTWFjIE9TDQogICAgICAgICAgICB2YXIgc3Rkb3V0cGF0aCA9IChvcHRpb25zLnN0ZG91dCA/ICgnPGtleT5TdGFuZGFyZE91dFBhdGg8L2tleT5cbjxzdHJpbmc+JyArIG9wdGlvbnMuc3Rkb3V0ICsgJzwvc3RyaW5nPicpIDogJycpOw0KICAgICAgICAgICAgdmFyIGF1dG9TdGFydCA9IChvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQVVUT19TVEFSVCcgPyAnPHRydWUvPicgOiAnPGZhbHNlLz4nKTsNCiAgICAgICAgICAgIHZhciBwYXJhbXMgPSAgJyAgICAgPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XG4nOw0KICAgICAgICAgICAgcGFyYW1zICs9ICcgICAgIDxhcnJheT5cbic7DQogICAgICAgICAgICBwYXJhbXMgKz0gKCcgICAgICAgICA8c3RyaW5nPi91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnPC9zdHJpbmc+XG4nKTsNCiAgICAgICAgICAgIGlmKG9wdGlvbnMucGFyYW1ldGVycykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGl0bSBpbiBvcHRpb25zLnBhcmFtZXRlcnMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBwYXJhbXMgKz0gKCcgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnBhcmFtZXRlcnNbaXRtXSArICc8L3N0cmluZz5cbicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gICAgICAgIA0KICAgICAgICAgICAgcGFyYW1zICs9ICcgICAgIDwvYXJyYXk+XG4nOw0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgcGxpc3QgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAnPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gJzxwbGlzdCB2ZXJzaW9uPSIxLjAiPlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDxkaWN0PlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PkxhYmVsPC9rZXk+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMubmFtZSArICc8L3N0cmluZz5cbicpOw0KICAgICAgICAgICAgcGxpc3QgKz0gKHBhcmFtcyArICdcbicpOw0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+V29ya2luZ0RpcmVjdG9yeTwva2V5PlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICA8c3RyaW5nPi91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJzwvc3RyaW5nPlxuJyk7DQogICAgICAgICAgICBwbGlzdCArPSAoc3Rkb3V0cGF0aCArICdcbicpOw0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gKGF1dG9TdGFydCArICdcbicpOw0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+S2VlcEFsaXZlPC9rZXk+XG4nOw0KICAgICAgICAgICAgaWYob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZGljdD5cbic7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgIDxrZXk+Q3Jhc2hlZDwva2V5PlxuJzsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICAgPHRydWUvPlxuJzsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9kaWN0PlxuJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGZhbHNlLz5cbic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ICE9IG51bGwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+VGhyb3R0bGVJbnRlcnZhbDwva2V5PlxuJzsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGludGVnZXI+JyArIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0IC8gMTAwMCkgKyAnPC9pbnRlZ2VyPlxuJzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgPC9kaWN0PlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICc8L3BsaXN0Pic7DQoNCiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0NCiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JykpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9DQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmluYXJ5KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBvcHRpb25zLmJpbmFyeSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JywgcGxpc3QpOw0KICAgICAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCkubW9kZTsNCiAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOw0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ1NlcnZpY2U6ICcgKyBvcHRpb25zLm5hbWUgKyAnIGFscmVhZHkgZXhpc3RzJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAob3B0aW9ucy5maWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBvcHRpb25zLmZpbGVzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd3JpdGluZyAnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2VydmljZVBsYXRmb3JtID09ICd1bmtub3duJykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIGV4dHJhY3RGaWxlTmFtZShvcHRpb25zLmZpbGVzW2ldKSwgb3B0aW9ucy5maWxlc1tpXS5fYnVmZmVyKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgZXh0cmFjdEZpbGVTb3VyY2Uob3B0aW9ucy5maWxlc1tpXSkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0gPT0gJ3Vua25vd24nKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMoZXh0cmFjdEZpbGVTb3VyY2Uob3B0aW9ucy5maWxlc1tpXSksICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIGV4dHJhY3RGaWxlTmFtZShvcHRpb25zLmZpbGVzW2ldKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpDQogICAgew0KICAgICAgICB0aGlzLmluc3RhbGxMYXVuY2hBZ2VudCA9IGZ1bmN0aW9uIGluc3RhbGxMYXVuY2hBZ2VudChvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnVpZCB8fCBvcHRpb25zLnVzZXIpICYmICF0aGlzLmlzQWRtaW4oKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0luc3RhbGxpbmcgYSBHbG9iYWwgQWdlbnQvRGFlbW9uLCByZXF1aXJlcyBhZG1pbicpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgc2VydmljZVBhdGhUb2tlbnMgPSBvcHRpb25zLnNlcnZpY2VQYXRoLnNwbGl0KCcvJyk7DQogICAgICAgICAgICBzZXJ2aWNlUGF0aFRva2Vucy5wb3AoKTsNCiAgICAgICAgICAgIGlmIChzZXJ2aWNlUGF0aFRva2Vucy5wZWVrKCkgPT0gJy4nKSB7IHNlcnZpY2VQYXRoVG9rZW5zLnBvcCgpOyB9DQogICAgICAgICAgICBvcHRpb25zLndvcmtpbmdEaXJlY3RvcnkgPSBzZXJ2aWNlUGF0aFRva2Vucy5qb2luKCcvJyk7DQoNCiAgICAgICAgICAgIHZhciBhdXRvU3RhcnQgPSAob3B0aW9ucy5zdGFydFR5cGUgPT0gJ0FVVE9fU1RBUlQnID8gJzx0cnVlLz4nIDogJzxmYWxzZS8+Jyk7DQogICAgICAgICAgICB2YXIgc3Rkb3V0cGF0aCA9IChvcHRpb25zLnN0ZG91dCA/ICgnPGtleT5TdGFuZGFyZE91dFBhdGg8L2tleT5cbjxzdHJpbmc+JyArIG9wdGlvbnMuc3Rkb3V0ICsgJzwvc3RyaW5nPicpIDogJycpOw0KICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICAgICAgICAgJyAgICAgPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XG4nOw0KICAgICAgICAgICAgcGFyYW1zICs9ICAgICAgICAgICAgJyAgICAgPGFycmF5PlxuJzsNCiAgICAgICAgICAgIHBhcmFtcyArPSAgICAgICAgICAgKCcgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnNlcnZpY2VQYXRoICsgJzwvc3RyaW5nPlxuJyk7DQogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaXRtIGluIG9wdGlvbnMucGFyYW1ldGVycykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSAgICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5wYXJhbWV0ZXJzW2l0bV0gKyAnPC9zdHJpbmc+XG4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICAnICAgICA8L2FycmF5PlxuJzsNCg0KICAgICAgICAgICAgdmFyIHBsaXN0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICc8cGxpc3QgdmVyc2lvbj0iMS4wIj5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAnICA8ZGljdD5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICA8c3RyaW5nPicgKyBvcHRpb25zLm5hbWUgKyAnPC9zdHJpbmc+XG4nKTsNCiAgICAgICAgICAgIHBsaXN0ICs9IChwYXJhbXMgKyAnXG4nKTsNCiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgb3B0aW9ucy53b3JraW5nRGlyZWN0b3J5ICsgJzwvc3RyaW5nPlxuJyk7DQogICAgICAgICAgICBwbGlzdCArPSAoc3Rkb3V0cGF0aCArICdcbicpOw0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gKGF1dG9TdGFydCArICdcbicpOw0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2Vzc2lvblR5cGVzICYmIG9wdGlvbnMuc2Vzc2lvblR5cGVzLmxlbmd0aCA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+TGltaXRMb2FkVG9TZXNzaW9uVHlwZTwva2V5PlxuJzsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGFycmF5PlxuJzsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHlwZSBpbiBvcHRpb25zLnNlc3Npb25UeXBlcykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICAgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMuc2Vzc2lvblR5cGVzW3N0eXBlXSArICc8L3N0cmluZz5cbicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9hcnJheT5cbic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5LZWVwQWxpdmU8L2tleT5cbic7DQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKSB7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxkaWN0PlxuJzsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICAgPGtleT5DcmFzaGVkPC9rZXk+XG4nOw0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgICA8dHJ1ZS8+XG4nOw0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8L2RpY3Q+XG4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxmYWxzZS8+XG4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PlRocm90dGxlSW50ZXJ2YWw8L2tleT5cbic7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxpbnRlZ2VyPicgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJzwvaW50ZWdlcj5cbic7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAnPC9wbGlzdD4nOw0KDQogICAgICAgICAgICBpZiAob3B0aW9ucy51aWQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb3B0aW9ucy51c2VyID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKG9wdGlvbnMudWlkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIGZvbGRlciA9IG9wdGlvbnMudXNlciA/IChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0SG9tZUZvbGRlcihvcHRpb25zLnVzZXIpICsgJy9MaWJyYXJ5L0xhdW5jaEFnZW50cy8nKSA6ICcvTGlicmFyeS9MYXVuY2hBZ2VudHMvJzsNCiAgICAgICAgICAgIG9wdGlvbnMuZ2lkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEdyb3VwSUQob3B0aW9ucy51aWQpOw0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoZm9sZGVyKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLm1rZGlyU3luYyhmb2xkZXIpOw0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2hvd25TeW5jKGZvbGRlciwgb3B0aW9ucy51aWQsIG9wdGlvbnMuZ2lkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYyhmb2xkZXIgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JywgcGxpc3QpOw0KICAgICAgICAgICAgaWYob3B0aW9ucy51c2VyKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2hvd25TeW5jKGZvbGRlciArIG9wdGlvbnMubmFtZSArICcucGxpc3QnLCBvcHRpb25zLnVpZCwgb3B0aW9ucy5naWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH0NCiAgICB0aGlzLnVuaW5zdGFsbFNlcnZpY2UgPSBmdW5jdGlvbiB1bmluc3RhbGxTZXJ2aWNlKG5hbWUpDQogICAgew0KICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnVW5pbnN0YWxsaW5nIGEgc2VydmljZSwgcmVxdWlyZXMgYWRtaW4nKTsgfQ0KDQogICAgICAgIGlmICh0eXBlb2YgKG5hbWUpID09ICdvYmplY3QnKSB7IG5hbWUgPSBuYW1lLm5hbWU7IH0NCiAgICAgICAgdmFyIHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2UobmFtZSk7DQogICAgICAgIHZhciBzZXJ2aWNlUGF0aCA9IHNlcnZpY2UuYXBwTG9jYXRpb24oKTsNCg0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZVBhdGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyBZIC9OIC9EIFkgL1QgMiAmIGRlbCAiJyArIHNlcnZpY2VQYXRoICsgJyInXSwgeyB0eXBlOiA0IH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuRGVsZXRlU2VydmljZShzZXJ2aWNlLl9zZXJ2aWNlKSA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnVW5pbnN0YWxsIFNlcnZpY2UgZm9yOiAnICsgbmFtZSArICcsIGZhaWxlZCB3aXRoIGVycm9yOiAnICsgdGhpcy5wcm94eTIuR2V0TGFzdEVycm9yKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7DQogICAgICAgICAgICBzZXJ2aWNlID0gbnVsbDsNCg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOw0KICAgICAgICAgICAgICAgIHJlZy5EZWxldGVLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU09GVFdBUkVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbFxcJyArIG5hbWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2goZWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5nZXRTZXJ2aWNlVHlwZSgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQn", 16000);
memcpy_s(_servicemanager + 160000, 12264, "Og0KICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOg0KICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXQuZCBzZXJ2aWNlDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgbmFtZSArICcgc3RvcFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3VwZGF0ZS1yYy5kIC1mICcgKyBuYW1lICsgJyByZW1vdmVcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy9ldGMvaW5pdC5kLycgKyBuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZVBhdGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIGNvdWxkIG5vdCBiZSB1bmluc3RhbGxlZCcsIGUpDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LycgKyBuYW1lICsgJy5jb25mJykpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwc3RhcnQgc2VydmljZQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIG5hbWUgKyAnIHN0b3BcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy9ldGMvaW5pdC8nICsgbmFtZSArICcuY29uZicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgdW5pbnN0YWxsZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgY291bGQgbm90IGJlIHVuaW5zdGFsbGVkJywgZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCB7IHR5cGU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlRFUk0gfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0b3AgJyArIG5hbWUgKyAnLnNlcnZpY2VcbicpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBkaXNhYmxlICcgKyBuYW1lICsgJy5zZXJ2aWNlXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZVBhdGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKSB7IHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKSB7IHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgdW5pbnN0YWxsZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgY291bGQgbm90IGJlIHVuaW5zdGFsbGVkJywgZSkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyB1bmtub3duIHBsYXRmb3JtIHNlcnZpY2UgdHlwZQ0KICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5pc1J1bm5pbmcoKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zdG9wKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY2F0Y2goeCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZS5jb25mKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCh4KQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgdW5pbnN0YWxsZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgICAgICB7DQogICAgICAgICAgICBzZXJ2aWNlLnVubG9hZCgpOw0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2UucGxpc3QpOw0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIHVuaW5zdGFsbGluZyBzZXJ2aWNlOiAnICsgbmFtZSArICcgPT4gJyArIGUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnJtZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNlcnZpY2Uuc3RvcCgpOw0KICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2UuYXBwTG9jYXRpb24oKSk7DQogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZS5yYyk7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnJtZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBuYW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgeyB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLmdldFNlcnZpY2VUeXBlID0gZnVuY3Rpb24gZ2V0U2VydmljZVR5cGUoKQ0KICAgIHsNCiAgICAgICAgdmFyIHBsYXRmb3JtID0gJ3Vua25vd24nOw0KICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnd2luMzInOg0KICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbmRvd3MnOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnZnJlZWJzZCc6DQogICAgICAgICAgICAgICAgcGxhdGZvcm0gPSAnZnJlZWJzZCc7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ2xhdW5jaGQnOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnbGludXgnOg0KICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gcmVxdWlyZSgncHJvY2Vzcy1tYW5hZ2VyJykuZ2V0UHJvY2Vzc0luZm8oMSkuTmFtZTsNCiAgICAgICAgICAgICAgICBpZiAocGxhdGZvcm0gPT0gImJ1c3lib3giKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgLWF4IC1vIHBpZCAtbyBjb21tYW5kIHwgYXdrICd7IGlmKCQxPT1cIjFcIikgeyAkMT1cIlwiOyBzcGxpdCgkMCwgcmVzLCBcIiBcIik7IHByaW50IHJlc1syXTsgfX0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0gPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09ICdpbml0JykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdCcpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICd1cHN0YXJ0JzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYXRmb3JtKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOg0KICAgICAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0gPSAndW5rbm93bic7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChwbGF0Zm9ybSk7DQogICAgfTsNCg0KDQogICAgdGhpcy5kYWVtb24gPSBmdW5jdGlvbiBkYWVtb24ocGF0aCwgcGFyYW1ldGVycywgb3B0aW9ucykNCiAgICB7DQogICAgICAgIHZhciB0bXAgPSBKU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKTsNCiAgICAgICAgdG1wID0gdG1wLnN1YnN0cmluZygxLCB0bXAubGVuZ3RoIC0gMSk7DQoNCiAgICAgICAgaWYgKCFvcHRpb25zKSB7IG9wdGlvbnMgPSB7fTsgfQ0KICAgICAgICB2YXIgY2hpbGRQYXJtcyA9ICJcDQogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOyBcDQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9ICIgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zKSArICI7XA0KICAgICAgICAgICAgaWYob3B0aW9ucy5sb2dPdXRwdXQpXA0KICAgICAgICAgICAgeyBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkxPR0ZJTEUpOyBjb25zb2xlLmxvZygnTG9nZ2luZyBPdXRwdXRzLi4uJyk7IH1cDQogICAgICAgICAgICBlbHNlXA0KICAgICAgICAgICAge1wNCiAgICAgICAgICAgICAgY29uc29sZS5zZXREZXN0aW5hdGlvbihjb25zb2xlLkRlc3RpbmF0aW9ucy5ESVNBQkxFRCk7XA0KICAgICAgICAgICAgfVwNCiAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFudXBBbmRFeGl0KClcDQogICAgICAgICAgICB7XA0KICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMucGlkUGF0aCkgeyB0cnl7cmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKG9wdGlvbnMucGlkUGF0aCk7fSBjYXRjaCh4KXt9IH1cDQogICAgICAgICAgICB9XA0KICAgICAgICAgICAgZnVuY3Rpb24gc3Bhd25DaGlsZCgpXA0KICAgICAgICAgICAge1wNCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnIiArIHBhdGggKyAiJywgWyciICsgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/IHBhdGguc3BsaXQoJ1xcJykucG9wKCkgOiBwYXRoLnNwbGl0KCcvJykucG9wKCkgKyAiJyIgKyAodG1wICE9ICcnID8gKCIsICIgKyB0bXApIDogIiIpKSArICJdKTtcDQogICAgICAgICAgICAgICAgaWYoY2hpbGQpXA0KICAgICAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uKGMpIHsgY29uc29sZS5sb2coYy50b1N0cmluZygpKTsgfSk7XA0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbihjKSB7IGNvbnNvbGUubG9nKGMudG9TdHJpbmcoKSk7IH0pO1wNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQub25jZSgnZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSBcDQogICAgICAgICAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25zLmNyYXNoUmVzdGFydCkgeyBzcGF3bkNoaWxkKCk7IH0gZWxzZSB7IGNsZWFudXBBbmRFeGl0KCk7IH1cDQogICAgICAgICAgICAgICAgICAgIH0pO1wNCiAgICAgICAgICAgICAgICB9XA0KICAgICAgICAgICAgfVwNCiAgICAgICAgICAgIGlmKG9wdGlvbnMucGlkUGF0aCkgeyByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMob3B0aW9ucy5waWRQYXRoLCBwcm9jZXNzLnBpZC50b1N0cmluZygpKTsgfVwNCiAgICAgICAgICAgIHNwYXduQ2hpbGQoKTtcDQogICAgICAgICAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgZnVuY3Rpb24oKVwNCiAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgaWYoY2hpbGQpIHsgY2hpbGQua2lsbCgpOyB9XA0KICAgICAgICAgICAgICAgIGNsZWFudXBBbmRFeGl0KCk7XA0KICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgpO1wNCiAgICAgICAgICAgIH0pOyI7DQogICAgICAgIA0KICAgICAgICB2YXIgcGFybXMgPSBbcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnXFwnKS5wb3AoKSA6IHByb2Nlc3MuZXhlY1BhdGguc3BsaXQoJy8nKS5wb3AoKV07DQogICAgICAgIHBhcm1zLnB1c2goJy1iNjRleGVjJyk7DQogICAgICAgIHBhcm1zLnB1c2goQnVmZmVyLmZyb20oY2hpbGRQYXJtcykudG9TdHJpbmcoJ2Jhc2U2NCcpKTsNCiAgICAgICAgb3B0aW9ucy5fcGFybXMgPSBwYXJtczsNCiAgICAgICAgb3B0aW9ucy5kZXRhY2hlZCA9IHRydWU7DQogICAgICAgIG9wdGlvbnMudHlwZSA9IDQ7DQoNCiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZXhlY1BhdGgsIG9wdGlvbnMuX3Bhcm1zLCBvcHRpb25zKTsgICAgICAgDQogICAgICAgIGlmICghY2hpbGQpIHsgdGhyb3cgKCdFcnJvciBzcGF3bmluZyBwcm9jZXNzJyk7IH0NCiAgICB9DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gc2VydmljZU1hbmFnZXI7DQptb2R1bGUuZXhwb3J0cy5tYW5hZ2VyID0gbmV3IHNlcnZpY2VNYW5hZ2VyKCk7DQoNCmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0Kew0KICAgIG1vZHVsZS5leHBvcnRzLmdldE9TVmVyc2lvbiA9IGdldE9TVmVyc2lvbjsNCn0NCv==", 12264);
ILibBase64DecodeEx((unsigned char*)_servicemanager, 172264, (unsigned char*)_servicemanager + 172264);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "service-manager"); duk_push_string(ctx, _servicemanager + 172264);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_servicemanager);
char *_usersessions = ILibMemory_Allocate(111218, 0, NULL, NULL);
memcpy_s(_usersessions + 0, 63552, "LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgTk9USUZZX0ZPUl9USElTX1NFU1NJT04gPSAwOw0KdmFyIE5PVElGWV9GT1JfQUxMX1NFU1NJT05TID0gMTsNCnZhciBXTV9XVFNTRVNTSU9OX0NIQU5HRSA9IDB4MDJCMTsNCnZhciBXTV9QT1dFUkJST0FEQ0FTVCA9IDB4MjE4Ow0KdmFyIFBCVF9QT1dFUlNFVFRJTkdDSEFOR0UgPSAweDgwMTM7DQp2YXIgUEJUX0FQTVNVU1BFTkQgPSAweDQ7DQp2YXIgUEJUX0FQTVJFU1VNRVNVU1BFTkQgPSAweDc7DQp2YXIgUEJUX0FQTVJFU1VNRUFVVE9NQVRJQyA9IDB4MTI7DQp2YXIgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFID0gMHhBOw0KdmFyIFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04gPSAweDA0MDA7DQp2YXIgVE9LRU5fUVVFUlkgPSAweDAwMDg7DQp2YXIgVG9rZW5Vc2VyID0gMTsNCnZhciBUb2tlblR5cGUgPSA4Ow0KdmFyIFRva2VuU2Vzc2lvbklkID0gMTI7DQp2YXIgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiA9IDEyMjsNCnZhciBIRUFQX1pFUk9fTUVNT1JZID0gMHgwMDAwMDAwODsNCg0KdmFyIFdUU19DT05TT0xFX0NPTk5FQ1QgICAgICAgICA9ICgweDEpOw0KdmFyIFdUU19DT05TT0xFX0RJU0NPTk5FQ1QgICAgICA9ICgweDIpOw0KdmFyIFdUU19SRU1PVEVfQ09OTkVDVCAgICAgICAgICA9ICgweDMpOw0KdmFyIFdUU19SRU1PVEVfRElTQ09OTkVDVCAgICAgICA9ICgweDQpOw0KdmFyIFdUU19TRVNTSU9OX0xPR09OICAgICAgICAgICA9ICgweDUpOw0KdmFyIFdUU19TRVNTSU9OX0xPR09GRiAgICAgICAgICA9ICgweDYpOw0KdmFyIFdUU19TRVNTSU9OX0xPQ0sgICAgICAgICAgICA9ICgweDcpOw0KdmFyIFdUU19TRVNTSU9OX1VOTE9DSyAgICAgICAgICA9ICgweDgpOw0KdmFyIFdUU19TRVNTSU9OX1JFTU9URV9DT05UUk9MICA9ICgweDkpOw0KdmFyIFdUU19TRVNTSU9OX0NSRUFURSAgICAgICAgICA9ICgweEEpOw0KdmFyIFdUU19TRVNTSU9OX1RFUk1JTkFURSAgICAgICA9ICgweEIpOw0KDQp2YXIgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRTsNCnZhciBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkc7DQp2YXIgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEU7DQoNCmZ1bmN0aW9uIGNvbHVtblBhcnNlKGRhdGEsIGRlbGltaXRlcikNCnsNCiAgICB2YXIgdG9rZW5zID0gZGF0YS5zcGxpdChkZWxpbWl0ZXIpOw0KICAgIHZhciByZXQgPSBbXTsNCiAgICBmb3IodmFyIGkgaW4gdG9rZW5zKQ0KICAgIHsNCiAgICAgICAgaWYgKHRva2Vuc1tpXS5sZW5ndGggPiAwKSB7IHJldC5wdXNoKHRva2Vuc1tpXSk7IH0NCiAgICB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQoNCmZ1bmN0aW9uIFVzZXJTZXNzaW9ucygpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAndXNlci1zZXNzaW9ucyc7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdjaGFuZ2VkJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdsb2NrZWQnKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ3VubG9ja2VkJyk7DQoNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgdGhpcy5fc2VydmljZUhvb2tlZCA9IGZhbHNlOw0KICAgICAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TGFzdEVycm9yJyk7DQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnV1RTR2V0QWN0aXZlQ29uc29sZVNlc3Npb25JZCcpDQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VIYW5kbGUnKTsNCg0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fd3RzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnV3RzYXBpMzIuZGxsJyk7DQogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNFbnVtZXJhdGVTZXNzaW9uc0EnKTsNCiAgICAgICAgICAgIHRoaXMuX3d0cy5DcmVhdGVNZXRob2QoJ1dUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVycpOw0KICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uJyk7DQogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNVblJlZ2lzdGVyU2Vzc2lvbk5vdGlmaWNhdGlvbicpOw0KICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRnJlZU1lbW9yeScpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoKGV4YykNCiAgICAgICAgew0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5fYWR2YXBpID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7DQogICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0FsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCcpOw0KICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdDaGVja1Rva2VuTWVtYmVyc2hpcCcpOw0KICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7DQoNCiAgICAgICAgdGhpcy5fdXNlcjMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgndXNlcjMyLmRsbCcpOw0KICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nLCB0aHJlYWREaXNwYXRjaDogMX0pOw0KICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdVbnJlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uJyk7DQogICAgICAgIHRoaXMuX3JwY3J0ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnUnBjcnQ0LmRsbCcpOw0KICAgICAgICB0aGlzLl9ycGNydC5DcmVhdGVNZXRob2QoJ1V1aWRGcm9tU3RyaW5nQScpOw0KICAgICAgICB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQgPSBmdW5jdGlvbiBTdHJpbmdUb1VVSUQoZ3VpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldFZhbCA9IFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxNik7DQogICAgICAgICAgICBpZihTdHJpbmdUb1VVSUQudXMuX3JwY3J0LlV1aWRGcm9tU3RyaW5nQShTdHJpbmdUb1VVSUQudXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoZ3VpZCksIHJldFZhbCkuVmFsID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnQ291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIFVVSUQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQudXMgPSB0aGlzOw0KDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzJykNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzVG9rZW4nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0dldFRva2VuSW5mb3JtYXRpb24nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0xvb2t1cEFjY291bnRTaWRXJyk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdPcGVuVGhyZWFkVG9rZW4nKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChlKQ0KICAgICAgICB7DQogICAgICAgIH0NCg0KDQogICAgICAgIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJzVkM2U5YTU5LWU5RDUtNGIwMC1hNmJkLWZmMzRmZjUxNjU0OCcpOw0KICAgICAgICBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJ2E3YWQ4MDQxLWI0NWEtNGNhZS04N2EzLWVlY2JiNDY4YTllMScpOw0KICAgICAgICBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURSA9IHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCgnNmZlNjk1NTYtNzA0YS00N2EwLThmMjQtYzI4ZDkzNmZkYTQ3Jyk7DQoNCiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdGVzID0gWydBY3RpdmUnLCAnQ29ubmVjdGVkJywgJ0Nvbm5lY3RRdWVyeScsICdTaGFkb3cnLCAnRGlzY29ubmVjdGVkJywgJ0lkbGUnLCAnTGlzdGVuaW5nJywgJ1Jlc2V0JywgJ0Rvd24nLCAnSW5pdCddOw0KICAgICAgICB0aGlzLkluZm9DbGFzcyA9DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ1dUU0luaXRpYWxQcm9ncmFtJzogMCwNCiAgICAgICAgICAgICAgICAnV1RTQXBwbGljYXRpb25OYW1lJzogMSwNCiAgICAgICAgICAgICAgICAnV1RTV29ya2luZ0RpcmVjdG9yeSc6IDIsDQogICAgICAgICAgICAgICAgJ1dUU09FTUlkJzogMywNCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbklkJzogNCwNCiAgICAgICAgICAgICAgICAnV1RTVXNlck5hbWUnOiA1LA0KICAgICAgICAgICAgICAgICdXVFNXaW5TdGF0aW9uTmFtZSc6IDYsDQogICAgICAgICAgICAgICAgJ1dUU0RvbWFpbk5hbWUnOiA3LA0KICAgICAgICAgICAgICAgICdXVFNDb25uZWN0U3RhdGUnOiA4LA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRCdWlsZE51bWJlcic6IDksDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudE5hbWUnOiAxMCwNCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlyZWN0b3J5JzogMTEsDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb2R1Y3RJZCc6IDEyLA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRIYXJkd2FyZUlkJzogMTMsDQogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEFkZHJlc3MnOiAxNCwNCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlzcGxheSc6IDE1LA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRQcm90b2NvbFR5cGUnOiAxNiwNCiAgICAgICAgICAgICAgICAnV1RTSWRsZVRpbWUnOiAxNywNCiAgICAgICAgICAgICAgICAnV1RTTG9nb25UaW1lJzogMTgsDQogICAgICAgICAgICAgICAgJ1dUU0luY29taW5nQnl0ZXMnOiAxOSwNCiAgICAgICAgICAgICAgICAnV1RTT3V0Z29pbmdCeXRlcyc6IDIwLA0KICAgICAgICAgICAgICAgICdXVFNJbmNvbWluZ0ZyYW1lcyc6IDIxLA0KICAgICAgICAgICAgICAgICdXVFNPdXRnb2luZ0ZyYW1lcyc6IDIyLA0KICAgICAgICAgICAgICAgICdXVFNDbGllbnRJbmZvJzogMjMsDQogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvJzogMjQsDQogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvRXgnOiAyNSwNCiAgICAgICAgICAgICAgICAnV1RTQ29uZmlnSW5mbyc6IDI2LA0KICAgICAgICAgICAgICAgICdXVFNWYWxpZGF0aW9uSW5mbyc6IDI3LA0KICAgICAgICAgICAgICAgICdXVFNTZXNzaW9uQWRkcmVzc1Y0JzogMjgsDQogICAgICAgICAgICAgICAgJ1dUU0lzUmVtb3RlU2Vzc2lvbic6IDI5DQogICAgICAgICAgICB9Ow0KDQogICAgICAgIHRoaXMuaXNSb290ID0gZnVuY3Rpb24gaXNSb290KCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIE5UQXV0aG9yaXR5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg2KTsNCiAgICAgICAgICAgIE5UQXV0aG9yaXR5LnRvQnVmZmVyKCkud3JpdGVJbnQ4KDUsIDUpOw0KDQogICAgICAgICAgICB2YXIgQWRtaW5pc3RyYXRvcnNHcm91cCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIGFkbWluID0gZmFsc2U7DQoNCiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhcGkuQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKE5UQXV0aG9yaXR5LCAyLCAzMiwgNTQ0LCAwLCAwLCAwLCAwLCAwLCAwLCBBZG1pbmlzdHJhdG9yc0dyb3VwKS5WYWwgIT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVJbnRlZ2VyKCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5DaGVja1Rva2VuTWVtYmVyc2hpcCgwLCBBZG1pbmlzdHJhdG9yc0dyb3VwLkRlcmVmKCksIG1lbWJlcikuVmFsICE9IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgIT0gMCkgeyBhZG1pbiA9IHRydWU7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkZyZWVTaWQoQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBhZG1pbjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldFByb2Nlc3NPd25lck5hbWUgPSBmdW5jdGlvbiBnZXRQcm9jZXNzT3duZXJOYW1lKHBpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldCA9IG51bGw7DQogICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoMTAyNCk7DQogICAgICAgICAgICB2YXIgZG9tYWluID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBuYW1lRG9tYWluTGVuZ3RoID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsgbmFtZURvbWFpbkxlbmd0aC50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7DQogICAgICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHZhciBzaWR0eXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHZhciB0b2tlbnVzZXIgPSAwOw0KICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7DQoNCiAgICAgICAgICAgIHZhciBoID0gdGhpcy5fa2VybmVsMzIuT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiwgMSwgcGlkKTsNCiAgICAgICAgICAgIGlmIChoLlZhbCA9PSAwKSB7IHRocm93ICgnRmFpbGVkIHRvIHF1ZXJ5IHByb2Nlc3MgaWQ6ICcgKyBwaWQpOyB9DQoNCiAgICAgICAgICAgIGlmKHRoaXMuX2FkdmFwaS5PcGVuUHJvY2Vzc1Rva2VuKGgsIFRPS0VOX1FVRVJZLCB0b2tlbikuVmFsPT0wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNsb3NlSGFuZGxlKGgpOw0KICAgICAgICAgICAgICAgIHRocm93ICgnRmFpbGVkIHRvIFF1ZXJ5IFByb2Nlc3MgVG9rZW4gZm9yIHBpZDogJyArIHBpZCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciB0c2lkID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5HZXRUb2tlbkluZm9ybWF0aW9uKHRva2VuLkRlcmVmKCksIFRva2VuU2Vzc2lvbklkLCB0c2lkLCA0LCBidWZmZXJMZW5ndGgpOw0KICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5Vc2VyLCB0b2tlbnVzZXIsIDAsIGJ1ZmZlckxlbmd0aCk7DQogICAgICAgICAgICB0b2tlbnVzZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGJ1ZmZlckxlbmd0aC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5HZXRUb2tlbkluZm9ybWF0aW9uKHRva2VuLkRlcmVmKCksIFRva2VuVXNlciwgdG9rZW51c2VyLCBidWZmZXJMZW5ndGgudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSwgYnVmZmVyTGVuZ3RoKS5WYWwgPT0gMCkgeyB0aHJvdyAoJ0ludGVybmFsIEVycm9yJyk7IH0NCiAgICAgICAgICAgIGlmKHRoaXMuX2FkdmFwaS5Mb29rdXBBY2NvdW50U2lkVygwLCB0b2tlbnVzZXIuRGVyZWYoKSwgbmFtZSwgbmFtZURvbWFpbkxlbmd0aCwgZG9tYWluLCBuYW1lRG9tYWluTGVuZ3RoLCBzaWR0eXBlKS5WYWwgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0xvb2t1cCBFcnJvcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWUuX3NpemUgPSAwOyBkb21haW4uX3NpemUgPSAwOw0KICAgICAgICAgICAgICAgIHJldCA9IHsgbmFtZTogbmFtZS5XaWRlMlVURjgsIGRvbWFpbjogZG9tYWluLldpZGUyVVRGOCwgdHNpZDogdHNpZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNsb3NlSGFuZGxlKHRva2VuLkRlcmVmKCkpOw0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUoaCk7DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH07DQoNCiAgICAgICAgdGhpcy5nZXRSYXdTZXNzaW9uQXR0cmlidXRlID0gZnVuY3Rpb24gZ2V0UmF3U2Vzc2lvbkF0dHJpYnV0ZShzZXNzaW9uSWQsIGF0dHIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIHZhciBieXRlc1JldHVybmVkID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblcoMCwgc2Vzc2lvbklkLCBhdHRyLCBidWZmZXIsIGJ5dGVzUmV0dXJuZWQpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblc6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGIgPSBidWZmZXIuRGVyZWYoKS5EZXJlZigwLCBieXRlc1JldHVybmVkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpLnRvQnVmZmVyKCk7DQogICAgICAgICAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jKGJ5dGVzUmV0dXJuZWQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7DQogICAgICAgICAgICBiLmNvcHkocmV0KTsNCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KGJ1ZmZlci5EZXJlZigpKTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRTZXNzaW9uQXR0cmlidXRlKHNlc3Npb25JZCwgYXR0cikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIGJ5dGVzUmV0dXJuZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KDQogICAgICAgICAgICBpZiAodGhpcy5fd3RzLldUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVygwLCBzZXNzaW9uSWQsIGF0dHIsIGJ1ZmZlciwgYnl0ZXNSZXR1cm5lZCkuVmFsID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBjYWxsaW5nIFdUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVzogJyArIHRoaXMuX2tlcm5lbDMyLkdldExhc3RFcnJvci5WYWwpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcmV0VmFsID0gYnVmZmVyLkRlcmVmKCkuV2lkZTJVVEY4Ow0KDQogICAgICAgICAgICB0aGlzLl93dHMuV1RTRnJlZU1lbW9yeShidWZmZXIuRGVyZWYoKSk7DQogICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7DQogICAgICAgIH07DQogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLl9rZXJuZWwzMi5XVFNHZXRBY3RpdmVDb25zb2xlU2Vzc2lvbklkKCkuVmFsOw0KICAgICAgICAgICAgaWYoaWQ9PTB4RkZGRkZGRkYpIHt0aHJvdygnTm9ib2R5IGxvZ2dlZCBpbicpO30NCiAgICAgICAgICAgIHJldHVybiAoaWQpOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldFVzZXJuYW1lID0gZnVuY3Rpb24gZ2V0VXNlcm5hbWUodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZSh1aWQsIHRoaXMuSW5mb0NsYXNzLldUU1VzZXJOYW1lKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJldFZhbCA9IHt9Ow0KICAgICAgICAgICAgdmFyIHBpbmZvID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7DQogICAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNFbnVtZXJhdGVTZXNzaW9uc0EoMCwgMCwgMSwgcGluZm8sIGNvdW50KS5WYWwgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIGNhbGxpbmcgV1RTRW51bWVyYXRlU2Vzc2lvbnNBOiAnICsgdGhpcy5fa2VybmVsMzIuR2V0TGFzdEVycm9yKCkuVmFsKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBpbmZvID0gcGluZm8uRGVyZWYoKS5EZXJlZihpICogKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjQpLCB0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxMiA6IDI0KTsNCiAgICAgICAgICAgICAgICB2YXIgaiA9IHsgU2Vzc2lvbklkOiBpbmZvLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfTsNCiAgICAgICAgICAgICAgICBqLlN0YXRpb25OYW1lID0gaW5mby5EZXJlZih0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyA0IDogOCwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSkuRGVyZWYoKS5TdHJpbmc7DQogICAgICAgICAgICAgICAgai5TdGF0ZSA9IHRoaXMuU2Vzc2lvblN0YXRlc1tpbmZvLkRlcmVmKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDggOiAxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKV07DQogICAgICAgICAgICAgICAgaWYgKGouU3RhdGUgPT0gJ0FjdGl2ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgai5Vc2VybmFtZSA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTVXNlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICBqLkRv", 16000);
memcpy_s(_usersessions + 16000, 47552, "bWFpbiA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTRG9tYWluTmFtZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldFZhbFtqLlNlc3Npb25JZF0gPSBqOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLl93dHMuV1RTRnJlZU1lbW9yeShwaW5mby5EZXJlZigpKTsNCg0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHJldFZhbCkgfSk7DQogICAgICAgICAgICBpZiAoY2IpIHsgY2IocmV0VmFsKTsgfQ0KICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGlmICghZ2xvYmFsLl9ub01lc3NhZ2VQdW1wKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNwaW4gdXAgYSBtZXNzYWdlIHB1bXAsIGFuZCBmZXRjaCBhIHdpbmRvdyBoYW5kbGUNCiAgICAgICAgICAgIHZhciBtZXNzYWdlX3B1bXAgPSByZXF1aXJlKCd3aW4tbWVzc2FnZS1wdW1wJyk7DQogICAgICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcCA9IG5ldyBtZXNzYWdlX3B1bXAoeyBmaWx0ZXI6IFdNX1dUU1NFU1NJT05fQ0hBTkdFIH0pOyB0aGlzLl9tZXNzYWdlcHVtcC5wYXJlbnQgPSB0aGlzOw0KICAgICAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyB0aGlzLnBhcmVudC5fd3RzLldUU1VuUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHRoaXMucGFyZW50Lmh3bmQpOyB9KTsNCiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wLm9uKCdod25kJywgZnVuY3Rpb24gKGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuaHduZCA9IGg7DQoNCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHlpZWxkLCBhbmQgZG8gdGhpcyBpbiB0aGUgbmV4dCBldmVudCBsb29wIHBhc3MsIGJlY3Vhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsICdSZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbicNCiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBtZXNzYWdlcHVtcCAndGhyZWFkJywgYmVjYXVzZSB3ZSBhcmUgYWN0dWFsbHkgb24gdGhlIG1pY3Jvc3RhY2sgdGhyZWFkLCBzdWNoIHRoYXQgdGhlIG1lc3NhZ2UgcHVtcCB0aHJlYWQsIGlzIGhvbGRpbmcNCiAgICAgICAgICAgICAgICAvLyBvbiBhIHNlbWFwaG9yZSBmb3IgdXMgdG8gcmV0dXJuLiBJZiB3ZSBjYWxsIG5vdywgd2UgbWF5IGRlYWRsb2NrIG9uIFdpbmRvd3MgNywgYmVjdWFzZSBpdCB3aWxsIHRyeSB0byBub3RpZnkgaW1tZWRpYXRlbHkNCiAgICAgICAgICAgICAgICB0aGlzLmltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZShmdW5jdGlvbiAoc2VsZikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSB3aW5kb3cgaGFuZGxlLCB3ZSBjYW4gcmVnaXN0ZXIgaXQgdG8gcmVjZWl2ZSBXaW5kb3dzIE1lc3NhZ2VzDQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBhcmVudC5fd3RzKSB7IHNlbGYucGFyZW50Ll93dHMuV1RTUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHNlbGYucGFyZW50Lmh3bmQsIE5PVElGWV9GT1JfQUxMX1NFU1NJT05TKTsgfQ0KICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkFDRENfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRSwgMCk7DQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50Ll91c2VyMzIuQkFUVF9IID0gc2VsZi5wYXJlbnQuX3VzZXIzMi5SZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbihzZWxmLnBhcmVudC5od25kLCBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcsIDApOw0KICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUsIDApOw0KICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYucGFyZW50Ll91c2VyMzIuQUNEQ19ILlZhbCwgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0guVmFsLCBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSC5WYWwpOw0KICAgICAgICAgICAgICAgIH0sIHRoaXMpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3dpdGNoIChtc2cubWVzc2FnZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgV01fV1RTU0VTU0lPTl9DSEFOR0U6DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53cGFyYW0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXVFNfU0VTU0lPTl9MT0NLOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbnVtZXJhdGVVc2VycygpLnRoZW4oZnVuY3Rpb24gKHVzZXJzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcnNbbXNnLmxwYXJhbV0pIHsgdGhpcy5wYXJlbnQuZW1pdCgnbG9ja2VkJywgdXNlcnNbbXNnLmxwYXJhbV0pOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX1VOTE9DSzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1c2VycykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJzW21zZy5scGFyYW1dKSB7IHRoaXMucGFyZW50LmVtaXQoJ3VubG9ja2VkJywgdXNlcnNbbXNnLmxwYXJhbV0pOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPR09OOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fTE9HT0ZGOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdjaGFuZ2VkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgV01fUE9XRVJCUk9BRENBU1Q6DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53cGFyYW0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dNX1BPV0VSQlJPQURDQVNUIFtVTktOT1dOIHdwYXJhbV06ICcgKyBtc2cud3BhcmFtKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNU1VTUEVORDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1NMRUVQJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVJFU1VNRUFVVE9NQVRJQzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1JFU1VNRV9OT05fSU5URVJBQ1RJVkUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNUkVTVU1FU1VTUEVORDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1JFU1VNRV9JTlRFUkFDVElWRScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1QT1dFUlNUQVRVU0NIQU5HRToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2NoYW5nZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbHBhcmFtID0gdGhpcy5wYXJlbnQuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcihCdWZmZXIuZnJvbShtc2cubHBhcmFtX2hleCwgJ2hleCcpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBscGFyYW0uRGVyZWYoMjAsIGxwYXJhbS5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoMCkpLnRvQnVmZmVyKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobHBhcmFtLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHVUlEX0FDRENfUE9XRVJfU09VUkNFLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEucmVhZFVJbnQzMkxFKDApKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnQUMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdCQVRURVJZJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnSE9UJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORy5EZXJlZigwLCAxNikudG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2JhdHRlcnlMZXZlbCcsIGRhdGEucmVhZFVJbnQzMkxFKDApKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS5yZWFkVUludDMyTEUoMCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPRkYnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPTicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdkaXNwbGF5JywgJ0RJTU1FRCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICB7DQogICAgICAgIHRoaXMuZ2V0VWlkID0gZnVuY3Rpb24gZ2V0VWlkKHVzZXJuYW1lKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgXCIiICsgdXNlcm5hbWUgKyAiXCIgfCBhd2sgLUY6ICd7cHJpbnQgJDN9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgcmV0ID0gcGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0cik7DQogICAgICAgICAgICBpZiAocmV0ID49IDApIHsgcmV0dXJuIChyZXQpOyB9DQogICAgICAgICAgICB0aHJvdyAoJ3VzZXJuYW1lOiAnICsgdXNlcm5hbWUgKyAnIE5PVCBGT1VORCcpOw0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hvIHwgdHIgJ1xcbicgJ2AnIHwgYXdrIC1GJ2AnICciICsgJ3sgcHJpbnRmICJ7IjsgZm9yKGE9MTthPE5GOysrYSkgeyBuPXNwbGl0KCRhLCB0b2ssICIgIik7IHByaW50ZiAiJXNcXCIlc1xcIjogXFwiJXNcXCIiLCAoYT4xPyIsIjoiIiksIHRva1syXSwgdG9rWzFdOyAgfSBwcmludGYgIn0iOyAgfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHZhciByZXQgPSB7fTsNCg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0ID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHJldCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldFtrZXldID0geyBVc2VybmFtZTogcmV0W2tleV0sIFNlc3Npb25JZDoga2V5LCBTdGF0ZTogJ0FjdGl2ZScsIHVpZDogdGhpcy5nZXRVaWQocmV0W2tleV0pIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHJldCkgfSk7DQoNCiAgICAgICAgICAgIGlmIChjYikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYi5jYWxsKHRoaXMsIHJldCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZGJ1cyA9IHJlcXVpcmUoJ2xpbnV4LWRidXMnKTsNCiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLndhdGNoKSB7DQogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyID0gcmVxdWlyZSgnZnMnKS53YXRjaCgnL3Zhci9ydW4vdXRtcCcpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2xpbnV4V2F0Y2hlci51c2VyX3Nlc3Npb24gPSB0aGlzOw0KICAgICAgICAgICAgICAgIHRoaXMuX2xpbnV4V2F0Y2hlci5vbignY2hhbmdlJywgZnVuY3Rpb24gKGEsIGIpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJfc2Vzc2lvbi5lbWl0KCdjaGFuZ2VkJyk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIHRoaXMuX3JlY2hlY2tMb2dnZWRJblVzZXJzID0gZnVuY3Rpb24gX3JlY2hlY2tMb2dnZWRJblVzZXJzKCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLmVudW1lcmF0ZVVzZXJzKCkudGhlbihmdW5jdGlvbiAodSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh1LkFjdGl2ZS5sZW5ndGggPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IGEgdXNlciBsb2dnZWQgaW4sIHNvIHdlIGNhbiBtb25pdG9yIERCVVMgZm9yIGxvY2svdW5sb2NrDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlciAhPSBudWxsICYmIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIudWlkICE9IHUuQWN0aXZlWzBdLnVpZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnYgPSB0aGlzLnBhcmVudC5maW5kRW52RW50cnkoeyB1c2VybmFtZTogdS5BY3RpdmVbMF0uVXNlcm5hbWUsIGdyZXA6ICdkYnVzLWRhZW1vbicsIHZhbHVlczogWydEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MnLCAnWERHX0NVUlJFTlRfREVTS1RPUCddIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGVudikubGVuZ3RoID09IDApIHsgZW52ID0gdGhpcy5wYXJlbnQuZmluZEVudkVudHJ5KHsgdXNlcm5hbWU6IHUuQWN0aXZlWzBdLlVzZXJuYW1lLCBncmVwOiAnWCcsIHZhbHVlczogWydEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MnLCAnWERHX0NVUlJFTlRfREVTS1RPUCddIH0pOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZW52KS5sZW5ndGggPT0gMCkgeyBlbnYgPSB0aGlzLnBhcmVudC5maW5kRW52RW50cnkoeyB1c2VybmFtZTogdS5BY3RpdmVbMF0uVXNlcm5hbWUsIGdyZXA6ICdkYnVzLWRhZW1vbicsIHZhbHVlczogWydEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MnXSB9KTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlcnZpY2U7DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZW52WydYREdfQ1VSUkVOVF9ERVNLVE9QJ10pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVW5pdHknOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gJ2NvbS51YnVudHUuVXBzdGFydDBfNic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSByZXF1aXJlKCdsaW51eC1kYnVzJykuZ2V0U2VydmljZXMoJ1NjcmVlblNhdmVyJywgeyB1aWQ6IHUuQWN0aXZlWzBdLnVpZCwgZW52OiBlbnYgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmluY2x1ZGVzKCdvcmcuZ25vbWUuU2NyZWVuU2F2ZXInKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9ICdvcmcuZ25vbWUuU2NyZWVuU2F2ZXInOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlcnZpY2UuaW5jbHVkZXMoJ29yZy5mcmVlZGVza3RvcC5TY3JlZW5TYXZlcicpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gJ29yZy5mcmVlZGVza3RvcC5TY3JlZW5TYXZlcic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAg", 16000);
memcpy_s(_usersessions + 32000, 31552, "ICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7IHJldHVybjsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlciA9IG5ldyBkYnVzKHNlcnZpY2UsIHUuQWN0aXZlWzBdLnVpZCwgZW52KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIudXNlcl9zZXNzaW9uID0gdGhpcy5wYXJlbnQ7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLm9uKCdzaWduYWwnLCBmdW5jdGlvbiAocykNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHMudmFsdWUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRydWU6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2t0b3AtbG9jayc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJfc2Vzc2lvbi5lbWl0KCdsb2NrZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZXNrdG9wLXVubG9jayc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJfc2Vzc2lvbi5lbWl0KCd1bmxvY2tlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlciAhPSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlcjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdGhpcy5nZXRVaWRDb25maWcgPSBmdW5jdGlvbiBnZXRVaWRDb25maWcoKSB7DQogICAgICAgICAgICAgICAgdmFyIHJldCA9IHt9Ow0KICAgICAgICAgICAgICAgIHZhciBjZmcgPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL2V0Yy9sb2dpbi5kZWZzJykudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY2ZnKSB7DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGNvbHVtblBhcnNlKGNmZ1tpXSwgJ1x0Jyk7IC8vY29uc29sZS5sb2codG9rZW5zKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSA9PSAnVUlEX01JTicpIHsgcmV0Lk1JTiA9IHBhcnNlSW50KHRva2Vuc1sxXSk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSA9PSAnVUlEX01BWCcpIHsgcmV0Lk1BWCA9IHBhcnNlSW50KHRva2Vuc1sxXSk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5NSU4gIT0gbnVsbCAmJiByZXQuTUFYICE9IG51bGwpIHsgYnJlYWs7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMub24oJ2NoYW5nZWQnLCBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIEZvciBsaW51eCBMb2NrL1VubG9jayBtb25pdG9yaW5nLCB3ZSBuZWVkIHRvIHdhdGNoIGZvciBMb2dPbi9Mb2dPZmYsIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSBVSUQuDQogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICh0aGF0KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gRG9pbmcgdGhpcyBpbiBhIHRpbWVvdXQsIGJlY3Vhc2UgdGhlcmUgaXMgYSByYWNlIGJldHdlZW4gd2hlbiBsb2dvbiBpcyBkZXRlY3RlZCwgYW5kIHdoZW4gZGJ1cyBzZXNzaW9uIGlzIHNwYXduZWQNCiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVjaGVja0xvZ2dlZEluVXNlcnMuY2FsbCh0aGF0KTsNCiAgICAgICAgICAgICAgICB9LCAyMDAwLCB0aGlzKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5taW5VaWQgPSAgZnVuY3Rpb24gbWluVWlkKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvbG9naW4uZGVmcyB8IGdyZXAgVUlEXyB8IGF3ayAneyBpZigkMT09XCJVSURfTUlOXCIpIHsgcHJpbnQgJDI7IH0gfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID49IDAgPyBwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgOiA1MDApOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuX3VzZXJzID0gZnVuY3Rpb24gX3VzZXJzKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkIHwgYXdrIC1GOiAneyBpZigkMz49MCkgeyBwcmludGYgXCIlczolc1xcblwiLCAkMSwgJDM7IH0gfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgIHZhciByZXQgPSB7fSwgdG9rZW5zOw0KICAgICAgICAgICAgZm9yICh2YXIgbG4gaW4gbGluZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbbG5dLnNwbGl0KCc6Jyk7DQogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyByZXRbdG9rZW5zWzBdXSA9IHRva2Vuc1sxXTsgfSAgICAgICAgICAgDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5fdWlkcyA9IGZ1bmN0aW9uIF91aWRzKCkgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkIHwgYXdrIC1GOiAneyBpZigkMz49MCkgeyBwcmludGYgXCIlczolc1xcblwiLCAkMSwgJDM7IH0gfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgIHZhciByZXQgPSB7fSwgdG9rZW5zOw0KICAgICAgICAgICAgZm9yICh2YXIgbG4gaW4gbGluZXMpIHsNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tsbl0uc3BsaXQoJzonKTsNCiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHJldFt0b2tlbnNbMV1dID0gdG9rZW5zWzBdOyB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5sb2dpblVpZHMgPSBmdW5jdGlvbiBsb2dpblVpZHMoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgbWluID0gdGhpcy5taW5VaWQoKTsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2dldGVudCBwYXNzd2QgfCBhd2sgLUY6IFwneyBpZigkMyA+PSAnICsgbWluICsgJykgeyBhPXNwbGl0KCQ3LGIsIi8iKTsgaWYoYlthXSE9Im5vbG9naW4iKSB7IHByaW50ICQzOyB9IH19XCcgfCB0ciAiXFxuIiAiXFwsIiB8IGF3ayBcJ3sgcHJpbnRmICJbJXNdIiwgJDA7IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnJlcGxhY2UoJyxdJywnXScpKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jb25zb2xlVWlkID0gZnVuY3Rpb24gY29uc29sZVVpZCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3dob1xuZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICBpZiAoY2hpbGQuc3RkZXJyLnN0ciAhPSAnJykgeyByZXR1cm4gKDApOyB9DQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICB2YXIgdG9rZW5zLCBpLCBqOw0KICAgICAgICAgICAgZm9yIChpIGluIGxpbmVzKSB7DQogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsNCiAgICAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgdG9rZW5zLmxlbmd0aDsgKytqKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbal0ubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludCh0aGlzLl91c2VycygpW3Rva2Vuc1swXV0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRocm93ICgnbm9ib2R5IGxvZ2dlZCBpbnRvIGNvbnNvbGUnKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdGhpcy5nZXRIb21lRm9sZGVyID0gZnVuY3Rpb24gZ2V0SG9tZUZvbGRlcihpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkICIgKyBpZCArICIgfCBhd2sgLUY6ICd7cHJpbnQgJDZ9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmdldFVzZXJuYW1lID0gZnVuY3Rpb24gZ2V0VXNlcm5hbWUodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgIiArIHVpZCArICIgfCBhd2sgLUY6ICd7cHJpbnQgJDF9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIubGVuZ3RoID4gMCkgeyByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsgfQ0KICAgICAgICAgICAgdGhyb3cgKCd1aWQ6ICcgKyB1aWQgKyAnIE5PVCBGT1VORCcpOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldEdyb3VwbmFtZSA9IGZ1bmN0aW9uIGdldEdyb3VwbmFtZShnaWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IGdyb3VwICIgKyBnaWQgKyAiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCA+IDApIHsgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0NCiAgICAgICAgICAgIHRocm93ICgnZ2lkOiAnICsgZ2lkICsgJyBOT1QgRk9VTkQnKTsNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy53aG9hbWkgPSBmdW5jdGlvbiB3aG9hbWkoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndob2FtaVxuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgIH07DQogICAgICAgIHRoaXMuZ2V0UGlkcyA9IGZ1bmN0aW9uIGdldFBpZHMob3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGdyZXAgPSAnJzsNCiAgICAgICAgICAgIHN3aXRjaCh0eXBlb2Yob3B0aW9ucykpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdJbnZhbGlkIHR5cGUgc3BlY2lmaWVkOiAnICsgdHlwZW9mIChvcHRpb25zKSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6DQogICAgICAgICAgICAgICAgICAgIGdyZXAgPSAnIHwgZ3JlcCAiJyArIHRoaXMuZ2V0VXNlcm5hbWUob3B0aW9ucykgKyAnIic7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6DQogICAgICAgICAgICAgICAgICAgIGdyZXAgPSAnIHwgZ3JlcCAiJyArIG9wdGlvbnMgKyAnIic7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVzZXJuYW1lKSB7IGdyZXAgPSAnIHwgZ3JlcCAiJyArIG9wdGlvbnMudXNlcm5hbWUgKyAnIic7IH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy51aWQgIT0gbnVsbCkgeyBncmVwID0gJyB8IGdyZXAgIicgKyB0aGlzLmdldFVzZXJuYW1lKG9wdGlvbnMudWlkKSArICciJzsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ncmVwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBncmVwICs9ICgnIHwgZ3JlcCAiJyArIG9wdGlvbnMuZ3JlcCArICciJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uKGMpe3RoaXMuc3RyICs9IGMudG9TdHJpbmcoKTt9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24oYyl7dGhpcy5zdHIgKz0gYy50b1N0cmluZygpO30pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3BzIC1lIC1vIHBpZCAtbyB1c2VyIC1vIGNtZCAnICsgZ3JlcCArICcgfCcgKyAiIHRyICdcbicgJ2AnIHwgYXdrIC1GJ2AnICd7ICIgKyAncHJpbnRmICJbIjsgZm9yKGk9MTtpPE5GOysraSkgeyBzcGxpdCgkaSwgdG9rLCAiICIpOyBwcmludGYgIiVzJXMiLChpIT0xPyIsIjoiIiksIHRva1sxXTsgIH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2goZWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuKFtdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5maW5kRW52RW50cnkgPSBmdW5jdGlvbiBmaW5kRW52RW50cnkob3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGJyb2tlID0gZmFsc2U7DQogICAgICAgICAgICB2YXIgcmV0ID0ge307DQogICAgICAgICAgICB2YXIgcGlkcyA9IHRoaXMuZ2V0UGlkcyhvcHRpb25zKTsNCg0KICAgICAgICAgICAgdmFyIHZhbHM7DQogICAgICAgICAgICB2YXIgajsNCiAgICAgICAgICAgIGZvcih2YXIgaSBpbiBwaWRzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGJyb2tlID0gZmFsc2U7DQogICAgICAgICAgICAgICAgcmV0ID0ge307DQogICAgICAgICAgICAgICAgdmFscyA9IHRoaXMuZ2V0RW52RnJvbVBpZChwaWRzW2ldKTsNCg0KICAgICAgICAgICAgICAgIGZvciAoaiBpbiBvcHRpb25zLnZhbHVlcykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmKHZhbHNbb3B0aW9ucy52YWx1ZXNbal1dKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRbb3B0aW9ucy52YWx1ZXNbal1dID0gdmFsc1tvcHRpb25zLnZhbHVlc1tqXV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBicm9rZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChicm9rZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHt9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMuZ2V0RW52RnJvbVBpZCA9IGZ1bmN0aW9uIGdldEVudkZyb21QaWQocGlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmV0ID0ge307DQogICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCg0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Byb2MvIiArIHBpZCArICIvZW52aXJvbiB8IHRyICdcXDAnICdcXHQnIHwiICsgJyBhd2sgLUYiXHQiIFwneyBwcmludGYgInsiOyBmb3IoaT0xO2k8TkY7KytpKSB7IGlmKGk+MSkge3ByaW50ZiAiLCI7fSB4PXNwbGl0KCRpLCB0b2ssICI9Iik7IHByaW50ZiAiXFwiJXNcXCI6IFxcIiVzXFwiIiwgdG9rWzFdLCBzdWJzdHIoJGksIDIrbGVuZ3RoKHRva1sxXSkpOyB9IHByaW50ZiAifSI7IH1cJycpOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaChlZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoe30pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcm9jc3RhdCAtZSAiICsgcGlk", 16000);
memcpy_s(_usersessions + 48000, 15552, "ICsgIiB8IGdyZXAgIiArIHBpZCArICIgfCBhd2sgJ3sgJDE9XCJcIjsgJDI9XCJcIjsgcHJpbnQgJDAgfScgfCB0ciBcIlxcIFwiIFwiXFxuXCJcbmV4aXRcbiIpOyANCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KCQkNCiAgICAgICAgICAgICAgICB2YXIgZW52Ow0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgaW4gdG9rZW5zKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9rZW5zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgICAgICAgICAgICAgIHJldFtlbnZbMF1dID0gZW52WzFdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5maW5kRW52ID0gZnVuY3Rpb24gZmluZEVudih1aWQsIGVudikNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHVuYW1lID0gdGhpcy5nZXRVc2VybmFtZSh1aWQpOw0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcyAiICsgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnID8gIi1heCAiOiIiKSArICItZSAtbyBwaWQgLW8gdXNlciB8IGdyZXAgIiArIHVuYW1lICsgIiB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBsaW5lcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbG4gPSBsaW5lc1tuXS50cmltKCk7DQogICAgICAgICAgICAgICAgaWYgKGxuLmxlbmd0aCA+IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2V0RW52RnJvbVBpZChsbik7DQogICAgICAgICAgICAgICAgICAgIGlmIChlW2Vudl0pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVtlbnZdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAobnVsbCk7DQogICAgICAgIH07DQogICAgfQ0KICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCiAgICB7DQogICAgICAgIHRoaXMuZ2V0VWlkID0gZnVuY3Rpb24gZ2V0VWlkKHVzZXJuYW1lKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImlkICIgKyB1c2VybmFtZSArICIgfCBhd2sgJ3sgc3BsaXQoJDEsIHRva2VuLCBcIj1cIik7IHNwbGl0KHRva2VuWzJdLCB1aWQsIFwiKFwiKTsgcHJpbnQgdWlkWzFdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldEdyb3VwSUQgPSBmdW5jdGlvbiBnZXRHcm91cElEKHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpZCAiICsgdWlkICsgIiB8IGF3ayAneyBzcGxpdCgkMiwgZ2lkLCBcIj1cIik7IGlmKGdpZFsxXT09XCJnaWRcIikgeyBzcGxpdChnaWRbMl0sIGdpZG51bSwgXCIoXCIpOyBwcmludCBnaWRudW1bMV07ICB9IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5nZXRVc2VybmFtZSA9IGZ1bmN0aW9uIGdldFVzZXJuYW1lKHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJkc2NsIC4gbGlzdCAvVXNlcnMgVW5pcXVlSUQgfCBncmVwICIgKyB1aWQgKyAiIHwgYXdrICd7IGlmKCQyPT0iICsgdWlkICsgIil7IHByaW50ICQxIH19J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgaWYoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCd1aWQ6ICcgKyB1aWQgKyAnIG5vdCBmb3VuZCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldEdyb3VwbmFtZSA9IGZ1bmN0aW9uIGdldEdyb3VwbmFtZShnaWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIGxpc3QgL0dyb3VwcyBQcmltYXJ5R3JvdXBJRCB8IGdyZXAgIiArIGdpZCArICIgfCBhd2sgJ3sgaWYoJDI9PSIgKyBnaWQgKyAiKXsgcHJpbnQgJDEgfX0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICBpZihjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ2dpZDogJyArIGdpZCArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndobyB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgcmV0ID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQogICAgICAgICAgICBpZiAocmV0ICE9ICcnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRVaWQocmV0KSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aHJvdyAoJ25vYm9keSBsb2dnZWQgaW50byBjb25zb2xlJyk7ICAgICANCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldEhvbWVGb2xkZXIgPSBmdW5jdGlvbiBnZXRIb21lRm9sZGVyKHVzZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIC1yZWFkIC9Vc2Vycy8iICsgdXNlciArICIgfCBncmVwIE5GU0hvbWVEaXJlY3RvcnkgfCBhd2sgLUY6ICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKCd1c2VyOiAnICsgdXNlciArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMuX3VzZXJzID0gZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9kc2NsJywgWydkc2NsJywgJy4nLCAnbGlzdCcsICcvVXNlcnMnLCAnVW5pcXVlSUQnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICB2YXIgdG9rZW5zLCBpOw0KICAgICAgICAgICAgdmFyIHVzZXJzID0ge307DQoNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgew0KICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7DQogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyB1c2Vyc1t0b2tlbnNbMF1dID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTsgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gKHVzZXJzKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl91aWRzID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9kc2NsJywgWydkc2NsJywgJy4nLCAnbGlzdCcsICcvVXNlcnMnLCAnVW5pcXVlSUQnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgdmFyIHRva2VucywgaTsNCiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9Ow0KDQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOw0KICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgdXNlcnNbdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXV0gPSB0b2tlbnNbMF07IH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuICh1c2Vycyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5faWRUYWJsZSA9IGZ1bmN0aW9uKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHRhYmxlID0ge307DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2lkJywgWydpZCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJylbMF0uc3BsaXQoJyAnKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgICAgICAgICB2YXIgdHlwZXMgPSBsaW5lc1tpXS5zcGxpdCgnPScpOw0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0eXBlc1sxXS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVzWzBdXSA9IHt9Ow0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaiBpbiB0b2tlbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlkYXJyID0gdG9rZW5zW2pdLnNwbGl0KCcoJyk7DQogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkYXJyWzBdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGlkYXJyWzFdLnN1YnN0cmluZygwLCBpZGFyclsxXS5sZW5ndGggLSAxKS50cmltKCk7DQogICAgICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVzWzBdXVtuYW1lXSA9IGlkOw0KICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV1baWRdID0gbmFtZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKHRhYmxlKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLkN1cnJlbnQgPSBmdW5jdGlvbiAoY2IpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9Ow0KICAgICAgICAgICAgdmFyIHRhYmxlID0gdGhpcy5faWRUYWJsZSgpOw0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9sYXN0JywgWydsYXN0J10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2ldLmxlbmd0aCA+IDA7ICsraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIXVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dID0geyBVc2VybmFtZTogbGluZXNbaV0uc3BsaXQoJyAnKVswXSwgU3RhdGU6IGxpbmVzW2ldLnNwbGl0KCdzdGlsbCBsb2dnZWQgaW4nKS5sZW5ndGggPiAxID8gJ0FjdGl2ZScgOiAnSW5hY3RpdmUnLCB1aWQ6IHRhYmxlLnVpZFtsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSB9Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpDQogICAgICAgICAgICAgICAgICAgIHt9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmKHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dLlN0YXRlICE9ICdBY3RpdmUnICYmIGxpbmVzW2ldLnNwbGl0KCdzdGlsbCBsb2dnZWQgaW4nKS5sZW5ndGggPiAxKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXS5TdGF0ZSA9ICdBY3RpdmUnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXNlcnMsICdBY3RpdmUnLCB7IHZhbHVlOiBzaG93QWN0aXZlT25seSh1c2VycykgfSk7DQogICAgICAgICAgICBpZiAoY2IpIHsgY2IuY2FsbCh0aGlzLCB1c2Vycyk7IH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgLy8gTGludXgsIE1hY09TLCBGcmVlQlNEDQogICAgew0KICAgICAgICB0aGlzLlNlbGYgPSBmdW5jdGlvbiBTZWxmKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9pZCcsIFsnaWQnLCAnLXUnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyKSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5pc1Jvb3QgPSBmdW5jdGlvbiBpc1Jvb3QoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKHRoaXMuU2VsZigpID09IDApOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5lbnVtZXJhdGVVc2VycyA9IGZ1bmN0aW9uIGVudW1lcmF0ZVVzZXJzKCkNCiAgICB7DQogICAgICAgIHZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOw0KICAgICAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fX3Jlc29sdmVyID0gcmVzOw0KICAgICAgICAgICAgdGhpcy5fX3JlamVjdG9yID0gcmVqOw0KICAgICAgICB9KTsNCiAgICAgICAgcC5fX2hhbmRsZXIgPSBmdW5jdGlvbiBfX2hhbmRsZXIodXNlcnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHAuX19yZXNvbHZlcih1c2Vycyk7DQogICAgICAgIH07DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLkN1cnJlbnQocC5fX2hhbmRsZXIpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChlKQ0KICAgICAgICB7DQogICAgICAgICAgICBwLl9fcmVqZWN0b3IoZSk7DQogICAgICAgIH0NCiAgICAgICAgcC5wYXJlbnQgPSB0aGlzOw0KICAgICAgICByZXR1cm4gKHApOw0KICAgIH0NCg0KICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCiAgICB7DQogICAgICAgIC8vIEZpcnN0IHN0ZXAsIGlzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHVzZXIgbG9nZ2VkIGluOg0KICAgICAgICB0aGlzLl9yZWNoZWNrTG9nZ2VkSW5Vc2VycygpOw0KICAgIH0NCn0NCmZ1bmN0aW9uIHNob3dBY3RpdmVPbmx5KHNvdXJjZSkNCnsNCiAgICB2YXIgcmV0VmFsID0gW107DQogICAgdmFyIHVuaXF1ZSA9IHt9Ow0KICAgIHZhciB1c2VybmFtZXMgPSBbXTsNCiAgICB2YXIgdG1wOw0KDQogICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpDQogICAgew0KICAgICAgICBpZiAoc291cmNlW2ldLlN0YXRlID09ICdBY3RpdmUnKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXRWYWwucHVzaChzb3VyY2VbaV0pOw0KICAgICAgICAgICAgdG1wID0gKHNvdXJjZVtpXS5Eb21haW4gPyAoc291cmNlW2ldLkRvbWFpbiArICdcXCcpIDogJycpICsgc291cmNlW2ldLlVzZXJuYW1lOw0KICAgICAgICAgICAgaWYgKCF1bmlxdWVbdG1wXSkgeyB1bmlxdWVbdG1wXSA9IHRtcDt9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKHZhciBpIGluIHVuaXF1ZSkNCiAgICB7DQogICAgICAgIHVzZXJuYW1lcy5wdXNoKGkpOw0KICAgIH0NCg0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICd1c2VybmFtZXMnLCB7IHZhbHVlOiB1c2VybmFtZXMgfSk7DQogICAgcmV0dXJuIChyZXRWYWwpOw0KfQ0KZnVuY3Rpb24gZ2V0VG9rZW5zKHN0cikNCnsNCiAgICB2YXIgY29sdW1ucyA9IFtdOw0KICAgIHZhciBpOw0KDQogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoMCwgKGk9c3RyLmluZGV4T2YoJyAnKSkpKTsNCiAgICB3aGlsZSAoc3RyWysraV0gPT0gJyAnKTsNCiAgICBjb2x1bW5zLnB1c2goc3RyLnN1YnN0cmluZyhpLCAoaT1zdHIuc3Vic3RyaW5nKGkpLmluZGV4T2YoJyAnKSArIGkpKSk7DQogICAgd2hpbGUgKHN0clsrK2ldID09ICcgJyk7DQogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoaSwgKGk9c3RyLnN1YnN0cmluZyhpKS5pbmRleE9mKCcgJykgKyBpKSkpOw0KICAgIHdoaWxlIChzdHJbKytpXSA9PSAnICcpOw0KICAgIHZhciBzdGF0dXMgPSBzdHIuc3Vic3RyaW5nKGkpLnRyaW0oKTsNCiAgICBjb2x1bW5zLnB1c2goc3RhdHVzKTsNCg0KICAgIHJldHVybiAoY29sdW1ucyk7DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gbmV3IFVzZXJTZXNzaW9ucygpOw0K", 15552);
ILibBase64DecodeEx((unsigned char*)_usersessions, 63552, (unsigned char*)_usersessions + 63552);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "user-sessions"); duk_push_string(ctx, _usersessions + 63552);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_usersessions);
// Mesh Agent NodeID helper, refer to modules/_agentNodeId.js
duk_peval_string_noresult(ctx, "addModule('_agentNodeId', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIF9tZXNoTm9kZUlkKCkKewogICAgdmFyIHJldCA9ICcnOwogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgewogICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxdWlyZSgnU2ltcGxlRGF0YVN0b3JlJykuQ3JlYXRlKHByb2Nlc3MuZXhlY1BhdGggKyAnLmRiJywgeyByZWFkT25seTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHJldCA9IHJlcXVpcmUoJ3RscycpLmxvYWRDZXJ0aWZpY2F0ZSh7IHBmeDogZGIuR2V0QnVmZmVyKCdTZWxmTm9kZUNlcnQnKSwgcGFzc3BocmFzZTogJ2hpZGRlbicgfSkuZ2V0S2V5SGFzaCgpLnRvU3RyaW5nKCdoZXgnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnd2luMzInOgogICAgICAgICAgICAvLyBGaXJzdCBDaGVjayBpZiB0aGUgZGIgQ29udGFpbnMgdGhlIE5vZGVJRAogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxdWlyZSgnU2ltcGxlRGF0YVN0b3JlJykuQ3JlYXRlKHByb2Nlc3MuZXhlY1BhdGgucmVwbGFjZSgnLmV4ZScsICcuZGInKSwgeyByZWFkT25seTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHZhciB2ID0gZGIuR2V0QnVmZmVyKCdTZWxmTm9kZUNlcnQnKTsKICAgICAgICAgICAgICAgIGlmICh2KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVxdWlyZSgndGxzJykubG9hZENlcnRpZmljYXRlKHsgcGZ4OiB2LCBwYXNzcGhyYXNlOiAnaGlkZGVuJyB9KS5nZXRLZXlIYXNoKCkudG9TdHJpbmcoJ2hleCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCAmJiAodiA9IGRiLkdldEJ1ZmZlcignTm9kZUlEJykpICE9IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gdi50b1N0cmluZygnaGV4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiAocmV0KTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBfbWVzaE5vZGVJZDsKCv==', 'base64').toString());");
// Task Scheduler, refer to modules/task-scheduler.js
char *_taskscheduler = ILibMemory_Allocate(48679, 0, NULL, NULL);
memcpy_s(_taskscheduler + 0, 27816, "LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgc2VydmljZW1hbmFnZXIgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKTsKdmFyIG1nciA9IG5ldyBzZXJ2aWNlbWFuYWdlcigpOwoKLy9hdHRhY2hEZWJ1Z2dlcih7IHdlYnBvcnQ6IDk5OTUsIHdhaXQ6IDEgfSkudGhlbihjb25zb2xlLmxvZyk7CgpmdW5jdGlvbiB0YXNrKCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAndGFzay1zY2hlZHVsZXInOwoKICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpCiAgICB7CiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgaWYob3B0aW9ucy5uYW1lICYmIG9wdGlvbnMuc2VydmljZSkKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICd3aW4zMic6CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcm1zID0gWydzY2h0YXNrcycsICcvQ3JlYXRlJywgJy9SVSBTWVNURU0nXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmdHlwZSBpbiBvcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZ0eXBlLnRvVXBwZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01JTlVURSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIT1VSTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnREFJTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV0VFS0xZJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01PTlRITFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9TQyAnICsgZnR5cGUudG9VcHBlckNhc2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL01PICcgKyBvcHRpb25zW2Z0eXBlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQVknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9EICcgKyBvcHRpb25zW2Z0eXBlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNT05USCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL00gJyArIG9wdGlvbnNbZnR5cGVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RJTUUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9TVCAnICsgb3B0aW9uc1tmdHlwZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTkFNRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL1ROICInICsgb3B0aW9uc1tmdHlwZV0uc3BsaXQoJy8nKS5qb2luKCdcXCcpICsgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NFUlZJQ0UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9UUiAibmV0IHN0YXJ0ICcgKyBvcHRpb25zW2Z0eXBlXSArICciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFybXMuam9pbignICcpKTsKICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXHNjaHRhc2tzLmV4ZScsIHBhcm1zKTsKICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQucHJvbWlzZSA9IHJldDsKICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyBpZiAoY29kZSA9PSAwKSB7IHRoaXMucHJvbWlzZS5fcmVzKCk7IH0gZWxzZSB7IHRoaXMucHJvbWlzZS5fcmVqKGNvZGUpOyB9fSk7IAogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGludXgnOgogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvY3Jvbi5kLycgKyBvcHRpb25zLm5hbWUuc3BsaXQoJy8nKS5qb2luKCdfJykuc3BsaXQoJy4nKS5qb2luKCcnKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignVGFzayBbJyArIG9wdGlvbnMubmFtZSArICddIEFscmVhZHkgZXhpc3RzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbnV0ZSA9ICcqJzsKICAgICAgICAgICAgICAgICAgICB2YXIgaG91ciA9ICcqJzsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF5ID0gJyonOwogICAgICAgICAgICAgICAgICAgIHZhciBtb250aCA9ICcqJzsKICAgICAgICAgICAgICAgICAgICB2YXIgd2Vla2RheSA9ICcqJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmdHlwZSBpbiBvcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZ0eXBlLnRvVXBwZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01JTlVURSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLlRJTUUgJiYgIW9wdGlvbnMudGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSA9ICcqLycgKyBvcHRpb25zW2Z0eXBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIT1VSTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5USU1FICYmICFvcHRpb25zLnRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gJyovJyArIG9wdGlvbnNbZnR5cGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RBSUxZJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkgPSAnKi8nICsgb3B0aW9uc1tmdHlwZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdXRUVLTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zW2Z0eXBlXSA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW9wdGlvbnMuREFZICYmICFvcHRpb25zLmRheSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla2RheSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ09ubHkgT25jZS9XZWVrbHkgc3VwcG9ydGVkIG9uIExpbnV4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQVknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLndlZWtseSB8fCBvcHRpb25zLldFRUtMWSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBvcHRpb25zW2Z0eXBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gb3B0aW9uc1tmdHlwZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVElNRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9IG9wdGlvbnNbZnR5cGVdLnNwbGl0KCc6JylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlID0gb3B0aW9uc1tmdHlwZV0uc3BsaXQoJzonKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01PTlRITFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gJyovJyArIG9wdGlvbnNbZnR5cGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gJ1NIRUxMPS9iaW4vc2hcblBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi9zYmluOi9iaW46L3Vzci9zYmluOi91c3IvYmluXG5cbic7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uICs9IChtaW51dGUgKyAnICcgKyBob3VyICsgJyAnICsgZGF5ICsgJyAnICsgbW9udGggKyAnICcgKyB3ZWVrZGF5ICsgJyAgIHJvb3QgICAnKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlVHlwZSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMgc2VydmljZSB8IGF3ayAne3ByaW50ICQyfSdcblxleGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gKz0gKGNoaWxkLnN0ZG91dC5zdHIgKyAnICcgKyBvcHRpb25zLnNlcnZpY2UgKyAnIHN0YXJ0ID4vZGV2L251bGwgMj4mMSBcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzIGluaXRjdGwgfCBhd2sgJ3twcmludCAkMn0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uICs9IChjaGlsZC5zdGRvdXQuc3RyICsgJyBzdGFydCAnICsgb3B0aW9ucy5zZXJ2aWNlICsgJyA+L2Rldi9udWxsIDI+JjEgXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBzeXN0ZW1jdGwgfCBhd2sgJ3twcmludCAkMn0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uICs9IChjaGlsZC5zdGRvdXQuc3RyICsgJyBzdGFydCAnICsgb3B0aW9ucy5zZXJ2aWNlICsgJyA+L2Rldi9udWxsIDI+JjEgXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ1Vua25vd24gU2VydmljZSBQbGF0Zm9ybTogJyArIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZVR5cGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVJVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVdVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVJPVEg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL2V0Yy9jcm9uLmQvJyArIG9wdGlvbnMubmFtZS5zcGxpdCgnLycpLmpvaW4oJ18nKS5zcGxpdCgnLicpLmpvaW4oJycpLCBhY3Rpb24sIHsgZmxhZ3M6ICd3YicsIG1vZGU6IG0gfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXQuX3JlcygpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICAgICB2YXIgdGFza25hbWUgPSBvcHRpb25zLm5hbWUuc3BsaXQoJy8nKS5qb2luKCdfJykuc3BsaXQoJy4nKS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcGxpc3QgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz5cbic7CiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnPHBsaXN0IHZlcnNpb249IjEuMCI+XG4nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgIDxkaWN0PlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgdGFza25hbWUgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8YXJyYXk+XG4nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgIDxzdHJpbmc+L2Jpbi9sYXVuY2hjdGw8L3N0cmluZz5cbic7CiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgPHN0cmluZz5zdGFydDwvc3RyaW5nPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnNlcnZpY2UgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9hcnJheT5cbic7CiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZmFsc2UvPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAne3t7SU5URVJWQUx9fX0nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7CiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJzwvcGxpc3Q+JzsKCiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ZjID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKG9wdGlvbnMuc2VydmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ZjLmlzTG9hZGVkKCkpIHsgc3ZjLmxvYWQoKTsgfQogICAgICAgICAgICAgICAgICAgICAgICBzdmMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChzZSkKICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaihzZSk7IHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHZhciBwZXJpb2RpYyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmdHlwZSBpbiBvcHRpb25zKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ0eXBlLnRvVXBwZXJDYXNlKCkpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnREFJTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYWlseVZhbCA9IHBhcnNlSW50KG9wdGlvbnNbZnR5cGVdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhaWx5VmFsIDwgMSB8fCBkYWlseVZhbCA+IDMxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignSW52YWxpZCBPcHRpb25zJyk7IHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGFpbHlWYWwgPiAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudERheSA9IChuZXcgRGF0ZSgpKS5nZXREYXRlKCk7ICAvLyAwIC0gMzENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxEYXkgPSBjdXJyZW50RGF5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGF5ICs9IGRhaWx5VmFsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RGF5ID4gMzEpIGN1cnJlbnREYXkgPSBjdXJyZW50RGF5ICUgMzE7DQogICAgICAgICAgICAgICAgICAg", 16000);
memcpy_s(_taskscheduler + 16000, 11816, "ICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMucHVzaCgoJyAgICAgICAgIDxrZXk+RGF5PC9rZXk+XG4gICAgICAgICA8aW50ZWdlcj4nICsgY3VycmVudERheSArICc8L2ludGVnZXI+XG4nKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghKGN1cnJlbnREYXkgPCBhY3R1YWxEYXkgJiYgKGN1cnJlbnREYXkgKyBkYWlseVZhbCkgPiBhY3R1YWxEYXkpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RpYy5wdXNoKCcnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV0VFS0xZJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQob3B0aW9uc1tmdHlwZV0pICE9IDEpIHsgcmV0Ll9yZWooJ09ubHkgb25jZSB3ZWVrbHkgaXMgc3VwcG9ydGVkJyk7IHJldHVybiAocmV0KTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLkRBWSA8IDAgfHwgb3B0aW9ucy5EQVkgPiA2IHx8IG9wdGlvbnMuZGF5IDwgMCB8fCBvcHRpb25zLmRheSA+IDYpIHsgcmV0Ll9yZWooJ0RBWSBvdXQgb2YgcmFuZ2UnKTsgcmV0dXJuIChyZXQpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuREFZID09IG51bGwgJiYgb3B0aW9ucy5kYXkgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMucHVzaCgoJyAgICAgICAgIDxrZXk+RGF5PC9rZXk+XG4gICAgICAgICA8aW50ZWdlcj4nICsgKG5ldyBEYXRlKCkpLmdldERheSgpICsgJzwvaW50ZWdlcj5cbicpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RpYy5wdXNoKCcnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTU9OVEhMWSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9udGggPT0gbnVsbCAmJiBvcHRpb25zLk1PTlRIID09IG51bGwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb250aGx5VmFsID0gcGFyc2VJbnQob3B0aW9uc1tmdHlwZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudE1vbnRoID0gKG5ldyBEYXRlKCkpLmdldE1vbnRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxNb250aD0gY3VycmVudE1vbnRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb250aCArPSBtb250aGx5VmFsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TW9udGggPiAxMikgY3VycmVudE1vbnRoID0gY3VycmVudE1vbnRoICUgMTI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMucHVzaCgoJyAgICAgICAgIDxrZXk+TW9udGg8L2tleT5cbiAgICAgICAgIDxpbnRlZ2VyPicgKyBjdXJyZW50TW9udGggKyAnPC9pbnRlZ2VyPlxuJykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIShjdXJyZW50TW9udGggPCBhY3R1YWxNb250aCAmJiAoY3VycmVudE1vbnRoICsgbW9udGhseVZhbCkgPiBhY3R1YWxNb250aCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMucHVzaCgnJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZnR5cGUgaW4gb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZnR5cGUudG9VcHBlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTUlOVVRFJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwgIT0gbnVsbCB8fCBwZXJpb2RpYy5sZW5ndGggPiAwKSB7IHJldC5fcmVqKCdJbnZhbGlkIE9wdGlvbnMnKTsgcmV0dXJuIChyZXQpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAnICAgICAgPGludGVnZXI+JyArIChwYXJzZUludChvcHRpb25zW2Z0eXBlXSkgKiA2MCkgKyAnPC9pbnRlZ2VyPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0hPVVJMWSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsICE9IG51bGwgfHwgcGVyaW9kaWMubGVuZ3RoID4gMCkgeyByZXQuX3JlaignSW52YWxpZCBPcHRpb25zJyk7IHJldHVybiAocmV0KTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gJyAgICAgIDxpbnRlZ2VyPicgKyAocGFyc2VJbnQob3B0aW9uc1tmdHlwZV0pICogNjAgKiA2MCkgKyAnPC9pbnRlZ2VyPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQVknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQgaW4gcGVyaW9kaWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNbZF0gKz0gKCcgICAgICAgICA8a2V5PkRheTwva2V5PlxuICAgICAgICAgPGludGVnZXI+JyArIG9wdGlvbnNbZnR5cGVdICsgJzwvaW50ZWdlcj5cbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNT05USCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbSBpbiBwZXJpb2RpYykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNbbV0gKz0gKCcgICAgICAgICA8a2V5Pk1vbnRoPC9rZXk+XG4gICAgICAgICA8aW50ZWdlcj4nICsgb3B0aW9uc1tmdHlwZV0gKyAnPC9pbnRlZ2VyPlxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RJTUUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCAhPSBudWxsKSB7IHJldC5fcmVqKCdJbnZhbGlkIE9wdGlvbnMnKTsgcmV0dXJuIChyZXQpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBwZXJpb2RpYykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNbdF0gKz0gKCcgICAgICAgICA8a2V5PkhvdXI8L2tleT5cbiAgICAgICAgIDxpbnRlZ2VyPicgKyBvcHRpb25zW2Z0eXBlXS5zcGxpdCgnOicpWzBdICsgJzwvaW50ZWdlcj5cbicgKyAnICAgICAgICAgPGtleT5NaW51dGU8L2tleT5cbiAgICAgICAgIDxpbnRlZ2VyPicgKyBvcHRpb25zW2Z0eXBlXS5zcGxpdCgnOicpWzFdICsgJzwvaW50ZWdlcj5cbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgPSBwbGlzdC5yZXBsYWNlKCd7e3tJTlRFUlZBTH19fScsICcgICAgICA8a2V5PlN0YXJ0SW50ZXJ2YWw8L2tleT5cbicgKyBpbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAocGVyaW9kaWMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ID0gcGxpc3QucmVwbGFjZSgne3t7SU5URVJWQUx9fX0nLCAnICAgICAgPGtleT5TdGFydENhbGVuZGFySW50ZXJ2YWw8L2tleT5cbiAgICAgIDxhcnJheT48ZGljdD5cbicgKyBwZXJpb2RpYy5qb2luKCcgICAgICA8L2RpY3Q+XG4gICAgICA8ZGljdD5cbicpICsgJyAgICAgIDwvZGljdD48L2FycmF5PlxuJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgdGFza25hbWUgKyAnLnBsaXN0JywgcGxpc3QpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIGxvYWQgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgdGFza25hbWUgKyAnLnBsaXN0XG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKCgogICAgICAgICAgICAgICAgICAgIHJldC5fcmVzKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKCdOb3QgaW1wbGVtZW50ZWQgb24gJyArIHByb2Nlc3MucGxhdGZvcm0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldC5fcmVqKCdJbnZhbGlkIFBhcmFtZXRlcnMsIG11c3QgYXQgbGVhc3Qgc3BlY2lmeSBuYW1lIGFuZCBzZXJ2aWNlJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07CiAgICB0aGlzLmluZm8gPSBmdW5jdGlvbiBpbmZvKG5hbWUpCiAgICB7CiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldC5fcmVqKCdOb3QgaW1wbGVtZW50ZWQgb24gJyArIHByb2Nlc3MucGxhdGZvcm0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07CiAgICB0aGlzLmRlbGV0ZSA9IGZ1bmN0aW9uIF9kZWxldGUobmFtZSkKICAgIHsKICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsKICAgICAgICBzd2l0Y2ggKHByb2Nlc3MucGxhdGZvcm0pCiAgICAgICAgewogICAgICAgICAgICBjYXNlICd3aW4zMic6CiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXHNjaHRhc2tzLmV4ZScsIFsnc2NodGFza3MnLCAnL0RlbGV0ZScsICcvVE4gIicgKyBuYW1lLnNwbGl0KCcvJykuam9pbignXFwnKSArICciJywgJy9GJ10pOwogICAgICAgICAgICAgICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgcmV0LmNoaWxkLnByb21pc2UgPSByZXQ7CiAgICAgICAgICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyBpZiAoY29kZSA9PSAwKSB7IHRoaXMucHJvbWlzZS5fcmVzKCk7IH0gZWxzZSB7IHRoaXMucHJvbWlzZS5fcmVqKGNvZGUpOyB9IH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvY3Jvbi5kLycgKyBuYW1lLnNwbGl0KCcvJykuam9pbignXycpLnNwbGl0KCcuJykuam9pbignJykpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvZXRjL2Nyb24uZC8nICsgbmFtZS5zcGxpdCgnLycpLmpvaW4oJ18nKS5zcGxpdCgnLicpLmpvaW4oJycpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldC5fcmVzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ1Rhc2sgWycgKyBuYW1lICsgJ10gZG9lcyBub3QgZXhpc3QnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgICAgICAgICAgdmFyIHRhc2tuYW1lID0gbmFtZS5zcGxpdCgnLycpLmpvaW4oJ18nKS5zcGxpdCgnLicpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgdGFza25hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCB1bmxvYWQgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgdGFza25hbWUgKyAnLnBsaXN0XG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyB0YXNrbmFtZSArICcucGxpc3QnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXQuX3JlcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKCdUYXNrIFsnICsgbmFtZSArICddIGRvZXMgbm90IGV4aXN0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldC5fcmVqKCdOb3QgaW1wbGVtZW50ZWQgb24gJyArIHByb2Nlc3MucGxhdGZvcm0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07Cn0KCgptb2R1bGUuZXhwb3J0cyA9IG5ldyB0YXNrKCk7Cgo=", 11816);
ILibBase64DecodeEx((unsigned char*)_taskscheduler, 27816, (unsigned char*)_taskscheduler + 27816);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "task-scheduler"); duk_push_string(ctx, _taskscheduler + 27816);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_taskscheduler);
// message-box, refer to modules/message-box.js
char *_messagebox = ILibMemory_Allocate(58779, 0, NULL, NULL);
memcpy_s(_messagebox + 0, 33588, "LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmNvbnN0IE1CX09LICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwOw0KY29uc3QgTUJfT0tDQU5DRUwgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDE7DQpjb25zdCBNQl9BQk9SVFJFVFJZSUdOT1JFICAgICAgID0gMHgwMDAwMDAwMjsNCmNvbnN0IE1CX1lFU05PQ0FOQ0VMICAgICAgICAgICAgPSAweDAwMDAwMDAzOw0KY29uc3QgTUJfWUVTTk8gICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQ7DQpjb25zdCBNQl9SRVRSWUNBTkNFTCAgICAgICAgICAgID0gMHgwMDAwMDAwNTsNCmNvbnN0IE1CX1RPUE1PU1QgICAgICAgICAgICAgICAgPSAweDAwMDQwMDAwOw0KY29uc3QgTUJfU0VURk9SRUdST1VORCAgICAgICAgICA9IDB4MDAwMTAwMDA7DQoNCmNvbnN0IE1CX0RFRkJVVFRPTjEgICAgICAgICAgICAgPSAweDAwMDAwMDAwOw0KY29uc3QgTUJfREVGQlVUVE9OMiAgICAgICAgICAgICA9IDB4MDAwMDAxMDA7DQpjb25zdCBNQl9ERUZCVVRUT04zICAgICAgICAgICAgID0gMHgwMDAwMDIwMDsNCmNvbnN0IE1CX0lDT05IQU5EICAgICAgICAgICAgICAgPSAweDAwMDAwMDEwOw0KY29uc3QgTUJfSUNPTlFVRVNUSU9OICAgICAgICAgICA9IDB4MDAwMDAwMjA7DQpjb25zdCBNQl9JQ09ORVhDTEFNQVRJT04gICAgICAgID0gMHgwMDAwMDAzMDsNCmNvbnN0IE1CX0lDT05BU1RFUklTSyAgICAgICAgICAgPSAweDAwMDAwMDQwOw0KDQpjb25zdCBJRE9LICAgICA9IDE7DQpjb25zdCBJRENBTkNFTCA9IDI7DQpjb25zdCBJREFCT1JUICA9IDM7DQpjb25zdCBJRFJFVFJZICA9IDQ7DQpjb25zdCBJRElHTk9SRSA9IDU7DQpjb25zdCBJRFlFUyAgICA9IDY7DQpjb25zdCBJRE5PICAgICA9IDc7DQoNCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOw0KdmFyIGNoaWxkU2NyaXB0ID0gIlwNCiAgICAgICAgcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykub24oJ2RhdGEnLCBmdW5jdGlvbiAoailcDQogICAgICAgIHtcDQogICAgICAgICAgICBzd2l0Y2goai5jb21tYW5kKVwNCiAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgY2FzZSAnbWVzc2FnZUJveCc6XA0KICAgICAgICAgICAgICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpXA0KICAgICAgICAgICAgICAgICAgICB7XA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7XA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXIzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCd1c2VyMzIuZGxsJyk7XA0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnTWVzc2FnZUJveEEnKTtcDQogICAgICAgICAgICAgICAgICAgICAgICB1c2VyMzIuTWVzc2FnZUJveEEuYXN5bmMoMCwgR00uQ3JlYXRlVmFyaWFibGUoai5jYXB0aW9uKSwgR00uQ3JlYXRlVmFyaWFibGUoai50aXRsZSksIGoubGF5b3V0KS50aGVuKFwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHIpXA0KICAgICAgICAgICAgICAgICAgICAgICAge1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goci5WYWwpXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiArIElET0sudG9TdHJpbmcoKSArICI6XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIgKyBJRENBTkNFTC50b1N0cmluZygpICsgIjpcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiArIElEQUJPUlQudG9TdHJpbmcoKSArICI6XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIgKyBJRFJFVFJZLnRvU3RyaW5nKCkgKyAiOlwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiICsgSURJR05PUkUudG9TdHJpbmcoKSArICI6XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIgKyBJRFlFUy50b1N0cmluZygpICsgIjpcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5zZW5kKHIuVmFsKTtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuc2VuZCgiICsgSUROTy50b1N0cmluZygpICsgIik7XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KCk7XA0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7XA0KICAgICAgICAgICAgICAgICAgICB9XA0KICAgICAgICAgICAgICAgICAgICBicmVhaztcDQogICAgICAgICAgICB9XA0KICAgICAgICB9KTtcDQogICAgIjsNCg0KZnVuY3Rpb24gbWVzc2FnZUJveCgpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAnbWVzc2FnZS1ib3gnOw0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjYXB0aW9uLCB0aW1lb3V0LCBsYXlvdXQpDQogICAgew0KICAgICAgICBpZiAobGF5b3V0ID09IG51bGwpDQogICAgICAgIHsNCiAgICAgICAgICAgIGxheW91dCA9IChNQl9ZRVNOTyB8IE1CX0RFRkJVVFRPTjIgfCBNQl9JQ09ORVhDTEFNQVRJT04gfCBNQl9UT1BNT1NUKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGxheW91dCA9IChNQl9PSyB8IE1CX0RFRkJVVFRPTjIgfCBNQl9JQ09ORVhDTEFNQVRJT04gfCBNQl9UT1BNT1NUKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsNCiAgICAgICAgdmFyIGtlcm5lbDMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ2tlcm5lbDMyLmRsbCcpOw0KICAgICAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1Byb2Nlc3NJZFRvU2Vzc2lvbklkJyk7DQogICAgICAgIHZhciBwc2lkID0gR00uQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgIGlmIChrZXJuZWwzMi5Qcm9jZXNzSWRUb1Nlc3Npb25JZChwcm9jZXNzLnBpZCwgcHNpZCkuVmFsID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5fcmVqKCdJbnRlcm5hbCBFcnJvcicpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCkgeyB0aW1lb3V0ID0gMTA7IH0NCiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgICAgIHZhciBvcHRpb25zID0geyBleGVjdXRpb25UaW1lb3V0OiB0aW1lb3V0IH07DQoNCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIG9wdGlvbnMuc2Vzc2lvbklkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCA9PSBwc2lkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpIHsgZGVsZXRlIG9wdGlvbnMuc2Vzc2lvbklkOyB9DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2goZWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5fcmVqKCdObyBsb2dnZWQgb24gdXNlcnMnKTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KICAgICAgICByZXQuX3RpdGxlID0gdGl0bGU7DQogICAgICAgIHJldC5fY2FwdGlvbiA9IGNhcHRpb247DQogICAgICAgIHJldC5fY29udGFpbmVyID0gcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuQ3JlYXRlKG9wdGlvbnMpOw0KICAgICAgICByZXQuX2NvbnRhaW5lci5wcm9taXNlID0gcmV0Ow0KICAgICAgICByZXQuX2NvbnRhaW5lci5vbignZGF0YScsIGZ1bmN0aW9uIChqKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZihqID09IElEWUVTIHx8IGogPT0gSURPSykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdEZW5pZWQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIHJldC5fY29udGFpbmVyLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ1RpbWVvdXQnKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJldC5fY29udGFpbmVyLkV4ZWN1dGVTdHJpbmcoY2hpbGRTY3JpcHQpOw0KICAgICAgICByZXQuX2NvbnRhaW5lci5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2VCb3gnLCBjYXB0aW9uOiBjYXB0aW9uLCB0aXRsZTogdGl0bGUsIGxheW91dDogbGF5b3V0IH0pOw0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCn0NCg0KDQpmdW5jdGlvbiBsaW51eF9tZXNzYWdlQm94KCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdtZXNzYWdlLWJveCc7DQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd6ZW5pdHknLA0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyB6ZW5pdHkgfCBhd2sgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQogICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09ICcnICYmIHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9iaW4vemVuaXR5JykpIHsgbG9jYXRpb24gPSAnL3Vzci9sb2NhbC9iaW4vemVuaXR5JzsgfQ0KICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSAnJykgeyByZXR1cm4gKG51bGwpOyB9DQoNCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUobG9jYXRpb24gKyAnIC0taGVscC1hbGwgfCBncmVwIHRpbWVvdXRcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmV0ID0geyBwYXRoOiBsb2NhdGlvbiwgdGltZW91dDogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyBmYWxzZSA6IHRydWUgfTsNCg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZShsb2NhdGlvbiArICcgLS12ZXJzaW9uIHwgYXdrIC1GLiBcJ3sgcHJpbnRmICJbJXMsICVzXVxcbiIsICQxLCAkMjsgfSBcJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0LnZlcnNpb24gPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldC52ZXJzaW9uID0gWzIsIDE2XTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgfSkoKQ0KICAgICAgICB9KTsNCiAgICBpZiAoIXRoaXMuemVuaXR5KQ0KICAgIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrZGlhbG9nJywNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMga2RpYWxvZyB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyBudWxsIDogeyBwYXRoOiBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSB9KTsNCiAgICAgICAgICAgICAgICB9KSgpDQogICAgICAgICAgICB9KTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub3RpZnlzZW5kJywNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMgbm90aWZ5LXNlbmQgfCBhd2sgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gbnVsbCA6IHsgcGF0aDogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgfSk7DQogICAgICAgICAgICAgICAgfSkoKQ0KICAgICAgICAgICAgfSk7DQogICAgfQ0KDQogICAgdGhpcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNhcHRpb24sIHRpbWVvdXQsIGxheW91dCkNCiAgICB7DQogICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwpIHsgdGltZW91dCA9IDEwOyB9DQogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgICAgICB2YXIgdWlkOyAgICANCiAgICAgICAgdmFyIHhpbmZvOw0KDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICB1aWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOw0KICAgICAgICAgICAgeGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbyh1aWQpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoKGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVpZCA9IDA7DQogICAgICAgICAgICB4aW5mbyA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldFhJbmZvKDApOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHhpbmZvID09IG51bGwpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5fcmVqKCdUaGlzIHN5c3RlbSBjYW5ub3QgZGlzcGxheSBhIHVzZXIgZGlhbG9nIGJveCB3aGVuIGEgdXNlciBpcyBub3QgbG9nZ2VkIGluJyk7DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy56ZW5pdHkpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEdOT01FL1pFTklUWQ0KICAgICAgICAgICAgaWYgKHRoaXMuemVuaXR5LnRpbWVvdXQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHRoaXMuemVuaXR5LnBhdGgsIFsnemVuaXR5JywgbGF5b3V0PT1udWxsPyctLXF1ZXN0aW9uJzonLS13YXJuaW5nJywgJy0tdGl0bGU9JyArIHRpdGxlLCAnLS10ZXh0PScgKyBjYXB0aW9uLCAnLS10aW1lb3V0PScgKyB0aW1lb3V0XSwgeyB1aWQ6IHVpZCwgZW52OiB7IFhBVVRIT1JJVFk6IHhpbmZvLnhhdXRob3JpdHkgPyB4aW5mby54YXV0aG9yaXR5IDogIiIsIERJU1BMQVk6IHhpbmZvLmRpc3BsYXkgfSB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodGhpcy56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCBsYXlvdXQgPT0gbnVsbCA/ICctLXF1ZXN0aW9uJyA6ICctLXdhcm5pbmcnLCAnLS10aXRsZT0nICsgdGl0bGUsICctLXRleHQ9JyArIGNhcHRpb25dLCB7IHVpZDogdWlkLCBlbnY6IHsgWEFVVEhPUklUWTogeGluZm8ueGF1dGhvcml0eSA/IHhpbmZvLnhhdXRob3JpdHkgOiAiIiwgRElTUExBWTogeGluZm8uZGlzcGxheSB9IH0pOw0KICAgICAgICAgICAgICAgIHJldC5jaGlsZC50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoYykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGMudGltZW91dCA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIGMua2lsbCgpOw0KICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQgKiAxMDAwLCByZXQuY2hpbGQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0LmNoaWxkLnByb21pc2UgPSByZXQ7DQogICAgICAgICAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7IH0NCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdkZW5pZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ3RpbWVvdXQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYodGhpcy5rZGlhbG9nKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnZnJlZWJzZCcgJiYgcHJvY2Vzcy5lbnZbJ0RJU1BMQVknXSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodGhpcy5rZGlhbG9nLnBhdGgsIFsna2RpYWxvZycsICctLXRpdGxlJywgdGl0bGUsIGxheW91dD09bnVsbD8nLS15ZXNubyc6Jy0tbXNnYm94JywgY2FwdGlvbl0pOw0KICAgICAgICAgICAgICAgIHJldC5jaGlsZC5wcm9taXNlID0gcmV0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB4ZGcgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZmluZEVudih1aWQsICdYREdfUlVOVElNRV9ESVInKTsgaWYgKHhkZyA9PSBudWxsKSB7IHhkZyA9ICcnOyB9DQogICAgICAgICAgICAgICAgaWYgKCF4aW5mbyB8fCAheGluZm8uZGlzcGxheSB8fCAheGluZm8ueGF1dGhvcml0eSkgeyByZXQuX3JlaignSW50ZXJhbCBFcnJvciwgY291bGQgbm90IGRldGVybWluZSBYMTEvWERHIGVudicpOyByZXR1cm4gKHJldCk7IH0NCiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodGhpcy5rZGlhbG9nLnBhdGgsIFsna2RpYWxvZycsICctLXRpdGxlJywgdGl0bGUsIGxheW91dCA9PSBudWxsID8gJy0teWVzbm8nIDogJy0tbXNnYm94JywgY2FwdGlvbl0sIHsgdWlkOiB1aWQsIGVudjogeyBESVNQTEFZOiB4aW5mby5kaXNwbGF5LCBYQVVUSE9SSVRZOiB4aW5mby54YXV0aG9yaXR5LCBYREdfUlVOVElNRV9ESVI6IHhkZyB9IH0pOw0KICAgICAgICAgICAgICAgIHJldC5jaGlsZC5wcm9taXNlID0gcmV0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0LmNoaWxkLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChjKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGMudGltZW91dCA9IG51bGw7DQogICAgICAgICAgICAgICAgYy5raWxsKCk7DQogICAgICAgICAgICB9LCB0aW1lb3V0ICogMTAwMCwgcmV0LmNoaWxkKTsNCiAgICAgICAgICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgcmV0LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZW91dCkNCiAgICAgICAgICAgICAg", 16000);
memcpy_s(_messagebox + 16000, 17588, "ICB7DQogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdkZW5pZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ3RpbWVvdXQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaigndGltZW91dCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9Ow0KfQ0KDQppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCnsNCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVPYmplY3Qob2JqKQ0KICAgIHsNCiAgICAgICAgdmFyIGogPSBKU09OLnN0cmluZ2lmeShvYmopOw0KICAgICAgICB2YXIgYiA9IEJ1ZmZlci5hbGxvYyhqLmxlbmd0aCArIDQpOw0KICAgICAgICBiLndyaXRlVUludDMyTEUoai5sZW5ndGggKyA0KTsNCiAgICAgICAgQnVmZmVyLmZyb20oaikuY29weShiLCA0KTsNCiAgICAgICAgcmV0dXJuIChiKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIG1hY29zX21lc3NhZ2VCb3goKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gJ21lc3NhZ2UtYm94JzsNCiAgICB0aGlzLl9pbml0SVBDQmFzZSA9IGZ1bmN0aW9uIF9pbml0SVBDQmFzZSgpDQogICAgew0KICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsNCg0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0LnVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5fcmVqKGUpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0LnBhdGggPSAnL3Zhci90bXAvJyArIHByb2Nlc3MuZXhlY1BhdGguc3BsaXQoJy8nKS5wb3AoKSArICdfZXYnOw0KICAgICAgICB2YXIgbjsNCg0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgbiA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMScsICc5OTk5OScpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChlKQ0KICAgICAgICB7DQogICAgICAgICAgICBuID0gMDsNCiAgICAgICAgfQ0KICAgICAgICB3aGlsZSAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKHJldC5wYXRoICsgbikpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgbiA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMScsICc5OTk5OScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICArK247DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0LnBhdGggPSByZXQucGF0aCArIG47DQogICAgICAgIHJldC50bXBTZXJ2aWNlTmFtZSA9ICdtZXNoTm90aWZpY2F0aW9uU2VydmVyJyArIG47DQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjYXB0aW9uLCB0aW1lb3V0LCBsYXlvdXQpDQogICAgew0KICAgICAgICAvLyBTdGFydCBMb2NhbCBTZXJ2ZXINCiAgICAgICAgdmFyIHJldCA9IHRoaXMuX2luaXRJUENCYXNlKCk7DQogICAgICAgIHJldC50aXRsZSA9IHRpdGxlOyByZXQuY2FwdGlvbiA9IGNhcHRpb247IHJldC50aW1lb3V0ID0gdGltZW91dDsgcmV0LmxheW91dCA9IGxheW91dDsNCiAgICAgICAgcmV0LnNlcnZlciA9IHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyKHJldCk7DQogICAgICAgIHJldC5zZXJ2ZXIucmV0ID0gcmV0Ow0KICAgICAgICByZXQuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBjOw0KICAgICAgICAgICAgYy5wcm9taXNlID0gdGhpcy5yZXQ7DQogICAgICAgICAgICBjLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ1ZmZlcikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbiA8IDQgfHwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSA+IGJ1ZmZlci5sZW4pIHsgdGhpcy51bnNoaWZ0KGJ1ZmZlcik7IH0NCiAgICAgICAgICAgICAgICB2YXIgcCA9IEpTT04ucGFyc2UoYnVmZmVyLnNsaWNlKDQsIGJ1ZmZlci5yZWFkVUludDMyTEUoMCkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAocC5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRVJST1InOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWoocC5yZWFzb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RJQUxPRyc6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocC50aW1lb3V0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdUSU1FT1VUJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuYnV0dG9uID09ICdZZXMnIHx8IHAuYnV0dG9uID09ICdPSycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcyhwLmJ1dHRvbik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdkZW5pZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGMud3JpdGUodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0RJQUxPRycsIHRpdGxlOiB0aGlzLnJldC50aXRsZSwgY2FwdGlvbjogdGhpcy5yZXQuY2FwdGlvbiwgaWNvbjogJ2NhdXRpb24nLCBidXR0b25zOiB0aGlzLnJldC5sYXlvdXQ9PW51bGw/WyciWWVzIicsICciTm8iJ106WyciT0siJ10sIGJ1dHRvbkRlZmF1bHQ6IHRoaXMucmV0LmxheW91dD09bnVsbD8yOjEsIHRpbWVvdXQ6IHRoaXMucmV0LnRpbWVvdXQgfSkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCiAgICB0aGlzLmxvY2sgPSBmdW5jdGlvbiBsb2NrKCkNCiAgICB7DQogICAgICAgIC8vIFN0YXJ0IExvY2FsIFNlcnZlcg0KICAgICAgICB2YXIgcmV0ID0gdGhpcy5faW5pdElQQ0Jhc2UoKTsNCiAgICAgICAgcmV0LnNlcnZlciA9IHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyKHJldCk7DQogICAgICAgIHJldC5zZXJ2ZXIucmV0ID0gcmV0Ow0KICAgICAgICByZXQuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBjOw0KICAgICAgICAgICAgYy5wcm9taXNlID0gdGhpcy5yZXQ7DQogICAgICAgICAgICBjLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ1ZmZlcikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbiA8IDQgfHwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSA+IGJ1ZmZlci5sZW4pIHsgdGhpcy51bnNoaWZ0KGJ1ZmZlcik7IH0NCiAgICAgICAgICAgICAgICB2YXIgcCA9IEpTT04ucGFyc2UoYnVmZmVyLnNsaWNlKDQsIGJ1ZmZlci5yZWFkVUludDMyTEUoMCkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAocC5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRVJST1InOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWoocC5yZWFzb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0xPQ0snOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgYy53cml0ZSh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnTE9DSycgfSkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCiAgICB0aGlzLm5vdGlmeSA9IGZ1bmN0aW9uIG5vdGlmeSh0aXRsZSwgY2FwdGlvbikNCiAgICB7DQogICAgICAgIC8vIFN0YXJ0IExvY2FsIFNlcnZlcg0KICAgICAgICB2YXIgcmV0ID0gdGhpcy5faW5pdElQQ0Jhc2UoKTsNCiAgICAgICAgcmV0LnRpdGxlID0gdGl0bGU7IHJldC5jYXB0aW9uID0gY2FwdGlvbjsgDQogICAgICAgIHJldC5zZXJ2ZXIgPSB0aGlzLnN0YXJ0TWVzc2FnZVNlcnZlcihyZXQpOw0KICAgICAgICByZXQuc2VydmVyLnJldCA9IHJldDsNCiAgICAgICAgcmV0LnNlcnZlci5vbignY29ubmVjdGlvbicsIGZ1bmN0aW9uIChjKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9jb25uZWN0aW9uID0gYzsNCiAgICAgICAgICAgIGMucHJvbWlzZSA9IHRoaXMucmV0Ow0KICAgICAgICAgICAgYy5vbignZGF0YScsIGZ1bmN0aW9uIChidWZmZXIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW4gPCA0IHx8IGJ1ZmZlci5yZWFkVUludDMyTEUoMCkgPiBidWZmZXIubGVuKSB7IHRoaXMudW5zaGlmdChidWZmZXIpOyB9DQogICAgICAgICAgICAgICAgdmFyIHAgPSBKU09OLnBhcnNlKGJ1ZmZlci5zbGljZSg0LCBidWZmZXIucmVhZFVJbnQzMkxFKDApKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHAuY29tbWFuZCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0VSUk9SJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKHAucmVhc29uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdOT1RJRlknOg0KDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBjLndyaXRlKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdOT1RJRlknLCB0aXRsZTogdGhpcy5yZXQudGl0bGUsIGNhcHRpb246IHRoaXMucmV0LmNhcHRpb24gfSkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCiAgICB0aGlzLnN0YXJ0Q2xpZW50ID0gZnVuY3Rpb24gc3RhcnRDbGllbnQob3B0aW9ucykNCiAgICB7DQogICAgICAgIC8vIENyZWF0ZSB0aGUgQ2xpZW50DQogICAgICAgIGNvbnNvbGUubG9nKCdTdGFydGluZyBDbGllbnQuLi4nKTsNCg0KICAgICAgICBvcHRpb25zLm9zdmVyc2lvbiA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLmdldE9TVmVyc2lvbigpOw0KICAgICAgICBvcHRpb25zLnVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7DQogICAgICAgIHRoaXMuY2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbihvcHRpb25zKTsNCiAgICAgICAgdGhpcy5jbGllbnQuX29wdGlvbnMgPSBvcHRpb25zOw0KICAgICAgICB0aGlzLmNsaWVudC5vbignZGF0YScsIGZ1bmN0aW9uIChidWZmZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChidWZmZXIubGVuIDwgNCB8fCBidWZmZXIucmVhZFVJbnQzMkxFKDApID4gYnVmZmVyLmxlbikgeyB0aGlzLnVuc2hpZnQoYnVmZmVyKTsgfQ0KICAgICAgICAgICAgdmFyIHAgPSBKU09OLnBhcnNlKGJ1ZmZlci5zbGljZSg0LCBidWZmZXIucmVhZFVJbnQzMkxFKDApKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgIHN3aXRjaCAocC5jb21tYW5kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ0xPQ0snOg0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZG91dC5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRlcnIuc3RyID0gJyc7IHRoaXMuX3NoZWxsLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3RkaW4ud3JpdGUoJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvTWVudVxcIEV4dHJhcy9Vc2VyLm1lbnUvQ29udGVudHMvUmVzb3VyY2VzL0NHU2Vzc2lvbiAtc3VzcGVuZFxuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zaGVsbC5zdGRlcnIuc3RyICE9ICcnKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRVJST1InLCByZWFzb246IHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgfSkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0xPQ0snLCBzdGF0dXM6IDAgfSkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ05PVElGWSc6DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3Rkb3V0LnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRpbi53cml0ZSgnb3Nhc2NyaXB0IC1lIFwndGVsbCBjdXJyZW50IGFwcGxpY2F0aW9uIHRvIGRpc3BsYXkgbm90aWZpY2F0aW9uICInICsgcC5jYXB0aW9uICsgJyIgd2l0aCB0aXRsZSAiJyArIHAudGl0bGUgKyAnIlwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgIT0gJycpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdFUlJPUicsIHJlYXNvbjogdGhpcy5fc2hlbGwuc3RkZXJyLnN0ciB9KSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnTk9USUZZJywgc3RhdHVzOiAwIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdESUFMT0cnOg0KICAgICAgICAgICAgICAgICAgICB2YXIgdGltZW91dCA9IHAudGltZW91dCA/ICgnIGdpdmluZyB1cCBhZnRlciAnICsgcC50aW1lb3V0KSA6ICcnOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaWNvbiA9IHAuaWNvbiA/ICgnd2l0aCBpY29uICcgKyBwLmljb24pIDogJyc7DQogICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25zID0gcC5idXR0b25zID8gKCdidXR0b25zIHsnICsgcC5idXR0b25zLnRvU3RyaW5nKCkgKyAnfScpIDogJyc7DQogICAgICAgICAgICAgICAgICAgIGlmIChwLmJ1dHRvbkRlZmF1bHQgIT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyArPSAoJyBkZWZhdWx0IGJ1dHRvbiAnICsgcC5idXR0b25EZWZhdWx0KQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3Rkb3V0LnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRpbi53cml0ZSgnb3Nhc2NyaXB0IC1lIFwndGVsbCBjdXJyZW50IGFwcGxpY2F0aW9uIHRvIGRpc3BsYXkgZGlhbG9nICInICsgcC5jYXB0aW9uICsgJyIgd2l0aCB0aXRsZSAiJyArIHAudGl0bGUgKyAnIiAnICsgaWNvbiArICcgJyArIGJ1dHRvbnMgKyB0aW1lb3V0ICsgJ1wnIHwgYXdrIFwneyBjPXNwbGl0KCQwLCB0b2tlbnMsICIsIik7IHNwbGl0KHRva2Vuc1sxXSwgdmFsLCAiOiIpOyBpZihjPT0xKSB7IHByaW50IHZhbFsyXSB9IGVsc2UgeyBzcGxpdCh0b2tlbnNbMl0sIGd1LCAiOiIpOyBpZihndVsyXT09InRydWUiKSB7IHByaW50ICJfVElNRU9VVF8iIH0gZWxzZSB7IHByaW50IHZhbFsyXSAgfSAgfSB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2hlbGwuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0VSUk9SJywgcmVhc29uOiB0aGlzLl9zaGVsbC5zdGRlcnIuc3RyIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zaGVsbC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnX1RJTUVPVVRfJykNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRElBTE9HJywgdGltZW91dDogdHJ1ZSB9KSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0RJQUxPRycsIGJ1dHRvbjogdGhpcy5fc2hlbGwuc3Rkb3V0LnN0ci50cmltKCkgfSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyB0aGlzLnVuaW5zdGFsbCgpOyB9KS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyB0aGlzLnVuaW5zdGFsbCgpOyB9KTsNCiAgICAgICAgdGhpcy5jbGllbnQudW5pbnN0YWxsID0gZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTmVlZCB0byB1bmluc3RhbGwgb3Vyc2VsdmVzDQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQoJy8nKS5wb3AoKSwgJy1leGVjJywgInZhciBzPXJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0TGF1bmNoQWdlbnQoJyIgKyB0aGlzLl9vcHRpb25zLnNlcnZpY2UgKyAiJywgIiArIHRoaXMuX29wdGlvbnMudWlkICsgIik7IHMudW5sb2FkKCk7IHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzLnBsaXN0KTtwcm9jZXNzLmV4aXQoKTsiXSwgeyBkZXRhY2hlZDogdHJ1ZSwgdHlwZTogcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuREVUQUNIRUQgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4gKHRoaXMuY2xpZW50KTsNCiAgICB9Ow0KICAgIHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyID0gZnVuY3Rpb24gc3RhcnRNZXNzYWdlU2VydmVyKG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKG9wdGlvbnMucGF0aCkpIHsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKG9wdGlvbnMucGF0aCk7IH0NCiAgICAgICAgb3B0aW9ucy53cml0YWJsZUFsbCA9IHRydWU7DQoNCiAgICAgICAgdmFyIHJldCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOw0KICAgICAgICByZXQudWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsNCiAgICAgICAgcmV0Lm9zdmVyc2lvbiA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLmdldE9TVmVyc2lvbigpOw0KICAgICAgICByZXQuX29wdGlvbnMgPSBvcHRpb25zOw0KICAgICAgICByZXQudGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChvYmopDQogICAgICAgIHsNCiAgICAgICAgICAgIG9iai5jbG9zZSgpOw0KICAgICAgICAgICAgb2JqLl9vcHRpb25zLl9yZWooJ0Nvbm5lY3Rpb24gdGltZW91dCcpOw0KICAgICAgICB9LCA1MDAwLCByZXQpOw0K", 16000);
memcpy_s(_messagebox + 32000, 1588, "ICAgICAgICByZXQubGlzdGVuKG9wdGlvbnMpOw0KICAgICAgICByZXQub24oJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0Lm9uKCd+JywgZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHRoaXMuX29wdGlvbnMucGF0aCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuaW5zdGFsbExhdW5jaEFnZW50KA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMudG1wU2VydmljZU5hbWUsIHNlcnZpY2VQYXRoOiBwcm9jZXNzLmV4ZWNQYXRoLCBzdGFydFR5cGU6ICdBVVRPX1NUQVJUJywgdWlkOiByZXQudWlkLA0KICAgICAgICAgICAgICAgIHNlc3Npb25UeXBlczogWydBcXVhJ10sIHBhcmFtZXRlcnM6IFsnLWV4ZWMnLCAicmVxdWlyZSgnbWVzc2FnZS1ib3gnKS5zdGFydENsaWVudCh7IHBhdGg6ICciICsgb3B0aW9ucy5wYXRoICsgIicsIHNlcnZpY2U6ICciICsgb3B0aW9ucy50bXBTZXJ2aWNlTmFtZSArICInIH0pLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsiXQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0TGF1bmNoQWdlbnQob3B0aW9ucy50bXBTZXJ2aWNlTmFtZSwgcmV0LnVpZCkubG9hZCgpOw0KDQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9Ow0KfQ0KDQoNCnN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0Kew0KICAgIGNhc2UgJ3dpbjMyJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgbWVzc2FnZUJveCgpOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdsaW51eCc6DQogICAgY2FzZSAnZnJlZWJzZCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IGxpbnV4X21lc3NhZ2VCb3goKTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgbWFjb3NfbWVzc2FnZUJveCgpOw0KICAgICAgICBicmVhazsNCn0NCg0KDQoNCg0KDQoNCv==", 1588);
ILibBase64DecodeEx((unsigned char*)_messagebox, 33588, (unsigned char*)_messagebox + 33588);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "message-box"); duk_push_string(ctx, _messagebox + 33588);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_messagebox);
// toaster, refer to modules/toaster.js
char *_toaster = ILibMemory_Allocate(29988, 0, NULL, NULL);
memcpy_s(_toaster + 0, 17136, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwoKaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nIHx8IHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQp7CiAgICBmdW5jdGlvbiBmaW5kUGF0aChhcHApCiAgICB7CiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgewogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyAiICsgYXBwICsgIiB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzICIgKyBhcHAgKyAiXG5leGl0XG4iKTsKICAgICAgICB9CiAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnICYmIGNoaWxkLnN0ZG91dC5zdHIgPT0gJycgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL2Jpbi8nICsgYXBwKSkgeyByZXR1cm4gKCcvdXNyL2xvY2FsL2Jpbi8nICsgYXBwKTsgfQogICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ciA9PSAnJyA/IG51bGwgOiBjaGlsZC5zdGRvdXQuc3RyKTsKICAgIH0KfQoKZnVuY3Rpb24gVG9hc3RlcigpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3RvYXN0ZXInOwogICAgdGhpcy5Ub2FzdCA9IGZ1bmN0aW9uIFRvYXN0KHRpdGxlLCBjYXB0aW9uLCB0c2lkKQogICAgewogICAgICAgIHZhciByZXRWYWwgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwogICAgICAgIHJldFZhbC50aXRsZSA9IHRpdGxlOwogICAgICAgIHJldFZhbC5jYXB0aW9uID0gY2FwdGlvbjsKCiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnd2luMzInOgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkOwogICAgICAgICAgICAgICAgICAgIHZhciBjb25zb2xlVWlkID0gMDsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVVaWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fcmVqKCdDYW5ub3QgZGlzcGxheSB1c2VyIG5vdGlmaWNhdGlvbiB3aGVuIGEgdXNlciBpcyBub3QgbG9nZ2VkIGluJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcnVubmluZyBhcyB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRzaWQgIT0gbnVsbCAmJiB0c2lkICE9IGlkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgTG9jYWxTeXN0ZW0sIHdlIGNhbm5vdCBzcGF3biBhcyBhIGRpZmZlcmVudCB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3JlaignQ2Fubm90IGRpc3BsYXkgdXNlciBub3RpZmljYXRpb24gdG8gVFNJRDogJyArIHRzaWQgKyAnIGZyb20gVFNJRDogJyArIGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkID0gcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuQ3JlYXRlKHsgcHJvY2Vzc0lzb2xhdGlvbjogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHJ1bm5pbmcgYXMgTG9jYWxTeXN0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzaWQgPT0gbnVsbCkgeyB0c2lkID0gY29uc29sZVVpZDsgfQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkID0gcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuQ3JlYXRlKHsgcHJvY2Vzc0lzb2xhdGlvbjogdHJ1ZSwgc2Vzc2lvbklkOiB0c2lkIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5wYXJlbnQgPSByZXRWYWw7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50Ll9yZXMoJ0RJU01JU1NFRCcpOyB9KTsKICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLmFkZE1vZHVsZSgnd2luLWNvbnNvbGUnLCBnZXRKU01vZHVsZSgnd2luLWNvbnNvbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5hZGRNb2R1bGUoJ3dpbi1tZXNzYWdlLXB1bXAnLCBnZXRKU01vZHVsZSgnd2luLW1lc3NhZ2UtcHVtcCcpKTsKCiAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9IGNhcHRpb24uc3BsaXQoIiciKS5qb2luKCJcXCciKTsKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnNwbGl0KCInIikuam9pbigiXFwnIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2FzdCA9IHJlcXVpcmUoJ3dpbi1jb25zb2xlJyk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhbGxvb24gPSB0b2FzdC5TZXRUcmF5SWNvbih7IHN6SW5mbzogJyIgKyBjYXB0aW9uICsgIicsIHN6SW5mb1RpdGxlOiAnIiArIHRpdGxlICsgIicsIGJhbGxvb25Pbmx5OiB0cnVlIH0pO1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGxvb24ub24oJ1RvYXN0RGlzbWlzc2VkJywgZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSlcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoZSk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5zZW5kKCdkb25lJyk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLkV4ZWN1dGVTdHJpbmcoc3RyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgY2FzZSAnZnJlZWJzZCc6CiAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jb25zb2xlVWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnhpbmZvID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuZ2V0WEluZm8ocmV0VmFsLmNvbnNvbGVVaWQpOwoJCQkgICAgICAgICAgICByZXRWYWwudXNlcm5hbWUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VXNlcm5hbWUocmV0VmFsLmNvbnNvbGVVaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoeHhlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9yZWooeHhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyAmJiAhcmVxdWlyZSgnbGludXgtZGJ1cycpLmhhc1NlcnZpY2UoJ29yZy5mcmVlZGVza3RvcC5Ob3RpZmljYXRpb25zJykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIEQtQnVzIHNlcnZpY2UgdG8gaGFuZGxlIG5vdGlmaWNhdGlvbnMsIHNvIHdlIG11c3QgZmFrZSBhIG5vdGlmaWNhdGlvbiB3aXRoIFpFTklUWSAtLWluZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS50aW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQgU3VwcG9ydGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnBhdGgsIFsnemVuaXR5JywgJy0taW5mbycsICctLXRpdGxlPScgKyByZXRWYWwudGl0bGUsICctLXRleHQ9JyArIHJldFZhbC5jYXB0aW9uLCAnLS10aW1lb3V0PTUnXSwgeyB1aWQ6IHJldFZhbC5jb25zb2xlVWlkLCBlbnY6IHsgWEFVVEhPUklUWTogcmV0VmFsLnhpbmZvLnhhdXRob3JpdHksIERJU1BMQVk6IHJldFZhbC54aW5mby5kaXNwbGF5IH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gVGltZW91dCBTdXBwb3J0LCBzbyB3ZSBtdXN0IGZha2UgaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCAnLS1pbmZvJywgJy0tdGl0bGU9JyArIHJldFZhbC50aXRsZSwgJy0tdGV4dD0nICsgcmV0VmFsLmNhcHRpb25dLCB7IHVpZDogcmV0VmFsLmNvbnNvbGVVaWQsIGVudjogeyBYQVVUSE9SSVRZOiByZXRWYWwueGluZm8ueGF1dGhvcml0eSwgRElTUExBWTogcmV0VmFsLnhpbmZvLmRpc3BsYXkgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGMpIHsgYy50aW1lb3V0ID0gbnVsbDsgYy5raWxsKCk7IH0sIDUwMDAsIHJldFZhbC5jaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnZlcnNpb25bMF0gPCAzIHx8IChyZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS52ZXJzaW9uWzBdID09IDMgJiYgcmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkudmVyc2lvblsxXSA8IDEwKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWkVOSVRZIE5vdGlmaWNhdGlvbiBpcyBicm9rZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdtZXNzYWdlLWJveCcpLm5vdGlmeXNlbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNpbmcgbm90aWZ5LXNlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLndob2FtaSgpID09ICdyb290JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHJvb3QsIHNvIHdlIG11c3QgcnVuIGluIGNvcnJlY3QgY29udGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQuc3RkaW4ud3JpdGUoJ3N1IC0gJyArIHJldFZhbC51c2VybmFtZSArICcgLWMgIkRJU1BMQVk9XCcnICsgcmV0VmFsLnhpbmZvLmRpc3BsYXkgKyAnXCcgbm90aWZ5LXNlbmQgXCcnICsgcmV0VmFsLnRpdGxlICsgJ1wnIFwnJyArIHJldFZhbC5jYXB0aW9uICsgJ1wnIlxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGEgcmVndWxhciB1c2VyLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHJlcXVpcmUoJ21lc3NhZ2UtYm94Jykubm90aWZ5c2VuZC5wYXRoLCBbJ25vdGlmeS1zZW5kJywgcmV0VmFsLnRpdGxlLCByZXRWYWwuY2FwdGlvbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWtpbmcgbm90aWZpY2F0aW9uIHdpdGggWkVOSVRZIC0taW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS50aW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGltZW91dCBTdXBwb3J0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnBhdGgsIFsnemVuaXR5JywgJy0taW5mbycsICctLXRpdGxlPScgKyByZXRWYWwudGl0bGUsICctLXRleHQ9JyArIHJldFZhbC5jYXB0aW9uLCAnLS10aW1lb3V0PTUnXSwgeyB1aWQ6IHJldFZhbC5jb25zb2xlVWlkLCBlbnY6IHsgWEFVVEhPUklUWTogcmV0VmFsLnhpbmZvLnhhdXRob3JpdHksIERJU1BMQVk6IHJldFZhbC54aW5mby5kaXNwbGF5IH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIFRpbWVvdXQgU3VwcG9ydCwgc28gd2UgbXVzdCBmYWtlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShyZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS5wYXRoLCBbJ3plbml0eScsICctLWluZm8nLCAnLS10aXRsZT0nICsgcmV0VmFsLnRpdGxlLCAnLS10ZXh0PScgKyByZXRWYWwuY2FwdGlvbl0sIHsgdWlkOiByZXRWYWwuY29uc29sZVVpZCwgZW52OiB7IFhBVVRIT1JJVFk6IHJldFZhbC54aW5mby54YXV0aG9yaXR5LCBESVNQTEFZOiByZXRWYWwueGluZm8uZGlzcGxheSB9IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGMpIHsgYy50aW1lb3V0ID0gbnVsbDsgYy5raWxsKCk7IH0sIDUwMDAsIHJldFZhbC5jaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFpFTklUWSBOb3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShyZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS5wYXRoLCBbJ3plbml0eScsICctLW5vdGlmaWNhdGlvbicsICctLXRpdGxlPScgKyB0aXRsZSwgJy0tdGV4dD0nICsgY2FwdGlvbiwgJy0tdGltZW91dD01J10sIHsgdWlkOiByZXRWYWwuY29uc29sZVVpZCwgZW52OiB7IFhBVVRIT1JJVFk6IHJldFZhbC54aW5mby54YXV0aG9yaXR5LCBESVNQTEFZOiByZXRWYWwueGluZm8uZGlzcGxheSB9IH0pOyAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQucGFyZW50ID0gcmV0VmFsOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7ICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9yZXMoJ0RJU01JU1NFRCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbCA9IGZpbmRQYXRoKCdrZGlhbG9nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsKSAKCQkJICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIEtESUFMT0cKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ZGcgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZmluZEVudihyZXRWYWwuY29uc29sZVVpZCwgJ1hER19SVU5USU1FX0RJUicpOyBpZiAoeGRnID09IG51bGwpIHsgeGRnID0gJyc7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0VmFsLnhpbmZvIHx8ICFyZXRWYWwueGluZm8uZGlzcGxheSB8fCAhcmV0VmFsLnhpbmZvLnhhdXRob3JpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9yZWooJ0ludGVybmFsIEVycm9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9ub3RpZnkgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodXRpbCwgWydrZGlhbG9nJywgJy0tdGl0bGUnLCByZXRWYWwudGl0bGUsICctLXBhc3NpdmVwb3B1cCcsIHJldFZhbC5jYXB0aW9uLCAnNSddLCB7IHVpZDogcmV0VmFsLmNvbnNvbGVVaWQsIGVudjogeyBESVNQTEFZOiByZXRWYWwueGluZm8uZGlzcGxheSwgWEFVVEhPUklUWTogcmV0VmFsLnhpbmZvLnhhdXRob3JpdHksIFhER19SVU5USU1FX0RJUjogeGRnIH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5wYXJlbnQgPSByZXRWYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50Ll9yZXMoJ0RJU01JU1NFRCcpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fcmVqKCdaZW5pdHkvS0RpYWxvZyBub3QgZm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgICAgICAgICAgcmV0VmFsLl90b2FzdCA9IHJlcXVpcmUoJ21lc3NhZ2UtYm94Jykubm90aWZ5KHRpdGxlLCBjYXB0aW9uKTsKICAgICAgICAgICAgICAgIHJldFZhbC5fdG9hc3QucGFyZW50ID0gcmV0VmFsOwogICAgICAgICAgICAgICAgcmV0VmFs", 16000);
memcpy_s(_toaster + 16000, 1136, "Ll90b2FzdC50aGVuKGZ1bmN0aW9uICh2KSB7IHRoaXMucGFyZW50Ll9yZXModik7IH0sIGZ1bmN0aW9uIChlKSB7IHRoaXMucGFyZW50Ll9yZWooZSk7IH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IG5ldyBUb2FzdGVyKCk7CmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgJiYgIXJlcXVpcmUoJ2xpbnV4LWRidXMnKS5oYXNTZXJ2aWNlKQp7CiAgICByZXF1aXJlKCdsaW51eC1kYnVzJykuaGFzU2VydmljZSA9IGZ1bmN0aW9uIGhhc1NlcnZpY2UobmFtZSkKICAgIHsKICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAvdXNyL3NoYXJlL2RidXMtMS9zZXJ2aWNlcy8qLnNlcnZpY2UgfCBncmVwICInICsgbmFtZSArICciIHwgYXdrIC1GPSBcJ3sgaWYoICQyPT0iJyArIG5hbWUgKyAnIiApIHsgcHJpbnQgJDI7IH0gfVwnXG5leGl0XG4nKTsKICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpOwogICAgfTsKff==", 1136);
ILibBase64DecodeEx((unsigned char*)_toaster, 17136, (unsigned char*)_toaster + 17136);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "toaster"); duk_push_string(ctx, _toaster + 17136);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_toaster);
// notifybar-desktop, refer to modules/notifybar-desktop.js
char *_notifybardesktop = ILibMemory_Allocate(29400, 0, NULL, NULL);
memcpy_s(_notifybardesktop + 0, 16800, "LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwdHJzaXplID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJykuUG9pbnRlclNpemU7CnZhciBDbGllbnRNZXNzYWdlID0gMzM7CgoKZnVuY3Rpb24gd2luZG93c19ub3RpZnliYXJfY2hlY2sodGl0bGUsIHRzaWQpCnsKICAgIGlmKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuICh3aW5kb3dzX25vdGlmeWJhcl9zeXN0ZW0odGl0bGUsIHRzaWQpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXR1cm4gKHdpbmRvd3Nfbm90aWZ5YmFyX2xvY2FsKHRpdGxlKSk7CiAgICB9Cn0KZnVuY3Rpb24gd2luZG93c19ub3RpZnliYXJfc3lzdGVtKHRpdGxlLCB0c2lkKQp7CiAgICB2YXIgcmV0ID0ge307CgogICAgdmFyIHNjcmlwdCA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCdub3RpZnliYXItZGVza3RvcCcpKCciICsgdGl0bGUgKyAiJykub24oJ2Nsb3NlJywgZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTsiKS50b1N0cmluZygnYmFzZTY0Jyk7CgogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQogICAgICAgIC5hZGRNZXRob2QoJ2Nsb3NlJywgZnVuY3Rpb24gY2xvc2UoKSB7IHRoaXMuY2hpbGQua2lsbCgpOyB9KTsKCiAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQoJ1xcJykucG9wKCksICctYjY0ZXhlYycsIHNjcmlwdF0sIHsgdHlwZTogMSwgdWlkOiB0c2lkIH0pOwogICAgcmV0LmNoaWxkLnBhcmVudCA9IHJldDsKICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKICAgIHJldC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50LmVtaXQoJ2Nsb3NlJywgY29kZSk7IH0pOwoKICAgIHJldHVybiAocmV0KTsKfQoKZnVuY3Rpb24gd2luZG93c19ub3RpZnliYXJfbG9jYWwodGl0bGUpCnsKICAgIHZhciBNZXNzYWdlUHVtcDsKICAgIHZhciByZXQ7CgogICAgTWVzc2FnZVB1bXAgPSByZXF1aXJlKCd3aW4tbWVzc2FnZS1wdW1wJyk7CiAgICByZXQgPSB7IF9PYmplY3RJRDogJ25vdGlmeWJhci1kZXNrdG9wLldpbmRvd3MnLCB0aXRsZTogdGl0bGUsIF9wdW1wczogW10sIF9wcm9taXNlOiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRJbmZvKCkgfTsKCiAgICByZXQuX3Byb21pc2Uubm90aWZ5YmFyID0gcmV0OwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQogICAgICAgIC5hZGRNZXRob2QoJ2Nsb3NlJywgZnVuY3Rpb24gY2xvc2UoKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9wdW1wcy5sZW5ndGg7ICsraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9wdW1wc1tpXS5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2V4aXQnKTsKICAgICAgICAgICAgICAgIHRoaXMuX3B1bXBzW2ldLmNsb3NlKCk7DQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3B1bXBzID0gW107CiAgICAgICAgfSk7CgogICAgcmV0Ll9wcm9taXNlLnRoZW4oZnVuY3Rpb24gKG0pCiAgICB7CiAgICAgICAgdmFyIG9mZnNldDsKICAgICAgICB2YXIgYmFyV2lkdGgsIG1vbldpZHRoLCBvZmZzZXQsIGJhckhlaWdodCwgbW9uSGVpZ2h0OwoKICAgICAgICBmb3IgKHZhciBpIGluIG0pCiAgICAgICAgewogICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdNb25pdG9yOiAnICsgaSArICcgPSBXaWR0aFsnICsgKG1baV0ucmlnaHQgLSBtW2ldLmxlZnQpICsgJ10nKTsKICAgICAgICAgICAgbW9uV2lkdGggPSAobVtpXS5yaWdodCAtIG1baV0ubGVmdCk7CiAgICAgICAgICAgIG1vbkhlaWdodCA9IChtW2ldLmJvdHRvbSAtIG1baV0udG9wKTsKICAgICAgICAgICAgYmFyV2lkdGggPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC4zMCk7CiAgICAgICAgICAgIGJhckhlaWdodCA9IE1hdGguZmxvb3IobW9uSGVpZ2h0ICogMC4wMzUpOwogICAgICAgICAgICBvZmZzZXQgPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC41MCkgLSBNYXRoLmZsb29yKGJhcldpZHRoICogMC41MCk7CiAgICAgICAgICAgIHN0YXJ0ID0gbVtpXS5sZWZ0ICsgb2Zmc2V0OwogICAgICAgICAgICB2YXIgb3B0aW9ucyA9CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93OgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luc3R5bGVzOiBNZXNzYWdlUHVtcC5XaW5kb3dTdHlsZXMuV1NfVklTSUJMRSB8IE1lc3NhZ2VQdW1wLldpbmRvd1N0eWxlcy5XU19CT1JERVIgfCBNZXNzYWdlUHVtcC5XaW5kb3dTdHlsZXMuV1NfQ0FQVElPTiB8IE1lc3NhZ2VQdW1wLldpbmRvd1N0eWxlcy5XU19TWVNNRU5VLAogICAgICAgICAgICAgICAgICAgICAgICB4OiBzdGFydCwgeTogbVtpXS50b3AsIGxlZnQ6IG1baV0ubGVmdCwgcmlnaHQ6IG1baV0ucmlnaHQsIHdpZHRoOiBiYXJXaWR0aCwgaGVpZ2h0OiBiYXJIZWlnaHQsIHRpdGxlOiB0aGlzLm5vdGlmeWJhci50aXRsZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucHVzaChuZXcgTWVzc2FnZVB1bXAob3B0aW9ucykpOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm5vdGlmeWJhciA9IHRoaXMubm90aWZ5YmFyOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm9uKCdod25kJywgZnVuY3Rpb24gKGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuX0hBTkRMRSA9IGg7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm9uKCdleGl0JywgZnVuY3Rpb24gKGgpCiAgICAgICAgICAgIHsgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm90aWZ5YmFyLl9wdW1wcy5sZW5ndGg7ICsraSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl9wdW1wc1tpXS5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2V4aXQnKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHNbaV0uY2xvc2UoKTsNCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5lbWl0KCdjbG9zZScpOwogICAgICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3B1bXBzID0gW107CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm9uKCdtZXNzYWdlJywgZnVuY3Rpb24gb25XaW5kb3dzTWVzc2FnZShtc2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChtc2cubWVzc2FnZSA9PSAxMzMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiV01fTkNQQUlOVCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1zZy5tZXNzYWdlID09IDcwKSAgIC8vIFdlIGFyZSBpbnRlcmNlcHRpbmcgV01fV0lORE9XUE9TQ0hBTkdJTkcgdG8gRElTQUJMRSBtb3ZpbmcgdGhlIHdpbmRvdwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9IQU5ETEUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmxhZ3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHB0cnNpemUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IG1zZy5scGFyYW1fcmF3LkRlcmVmKDI0LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIHwgMHgwMDAyOyAvLyBTZXQgU1dQX05PTU9WRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cubHBhcmFtX3Jhdy5EZXJlZig4LCA0KS50b0J1ZmZlcigpLnJlYWRJbnQzMkxFKCkgPCB0aGlzLl9vcHRpb25zLndpbmRvdy5sZWZ0IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtc2cubHBhcmFtX3Jhdy5EZXJlZig4LCA0KS50b0J1ZmZlcigpLnJlYWRJbnQzMkxFKCkgKyB0aGlzLl9vcHRpb25zLndpbmRvdy53aWR0aCkgPj0gdGhpcy5fb3B0aW9ucy53aW5kb3cucmlnaHQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWxsb3cgdGhpcyBtb3ZlLCBiZWNhdXNlIGl0IHdpbGwgZ28gb3V0IG9mIGJvdW5kcyBvZiB0aGUgY3VycmVudCBtb25pdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5scGFyYW1fcmF3LkRlcmVmKDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZmxhZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgbW92ZSwgYnV0IG9ubHkgb24gdGhlIFgtYXhpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmxwYXJhbV9yYXcuRGVyZWYoMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVJbnQzMkxFKHRoaXMuX29wdGlvbnMud2luZG93LnkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBtc2cubHBhcmFtX3Jhdy5EZXJlZigzMiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSB8IDB4MDAwMiAgLy8gU2V0IFNXUF9OT01PVkUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmxwYXJhbV9yYXcuRGVyZWYoMTYsIDQpLnRvQnVmZmVyKCkucmVhZEludDMyTEUoKSA8IHRoaXMuX29wdGlvbnMud2luZG93LmxlZnQgfHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtc2cubHBhcmFtX3Jhdy5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS5yZWFkSW50MzJMRSgpICsgdGhpcy5fb3B0aW9ucy53aW5kb3cud2lkdGgpID49IHRoaXMuX29wdGlvbnMud2luZG93LnJpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWxsb3cgdGhpcyBtb3ZlLCBiZWNhdXNlIGl0IHdpbGwgZ28gb3V0IG9mIGJvdW5kcyBvZiB0aGUgY3VycmVudCBtb25pdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5scGFyYW1fcmF3LkRlcmVmKDMyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgdGhlIG1vdmUsIGJ1dCBvbmx5IG9uIHRoZSBYLWF4aXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5scGFyYW1fcmF3LkRlcmVmKDIwLCA0KS50b0J1ZmZlcigpLndyaXRlSW50MzJMRSh0aGlzLl9vcHRpb25zLndpbmRvdy55KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gKHJldCk7Cn0KCgpmdW5jdGlvbiB4X25vdGlmeWJhcl9jaGVjayh0aXRsZSkKewogICAgaWYocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKSE9MCB8fCByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuICh4X25vdGlmeWJhcih0aXRsZSkpOyAvLyBObyBEaXNwYXRjaGluZyBuZWNlc3NhcnkKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvLyBXZSBhcmUgcm9vdCwgc28gd2Ugc2hvdWxkIHRyeSB0byBzcGF3biBhIGNoaWxkIGludG8gdGhlIHVzZXIncyBkZXNrdG9wCiAgICAgICAgdmFyIHVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7CiAgICAgICAgdmFyIHhpbmZvID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuZ2V0WEluZm8odWlkKTsKICAgICAgICAKICAgICAgICBpZiAoIXhpbmZvKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3coJ1hTZXJ2ZXIgSW5pdGlhbGl6YXRpb24gRXJyb3InKQogICAgICAgIH0KICAgICAgICB2YXIgcmV0ID0ge307CiAgICAgICAgdmFyIHNjcmlwdCA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCdub3RpZnliYXItZGVza3RvcCcpKCciICsgdGl0bGUgKyAiJykub24oJ2Nsb3NlJywgZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTsiKS50b1N0cmluZygnYmFzZTY0Jyk7CgogICAgICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHJldCwgdHJ1ZSkKICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdjbG9zZScpCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ2Nsb3NlJywgZnVuY3Rpb24gY2xvc2UoKSB7IHRoaXMuY2hpbGQua2lsbCgpOyB9KTsKCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZXhlY1BhdGgsIFtwcm9jZXNzLmV4ZWNQYXRoLnNwbGl0KCcvJykucG9wKCksICctYjY0ZXhlYycsIHNjcmlwdF0sIHsgdWlkOiB1aWQsIGVudjogeGluZm8uZXhwb3J0RW52KCkgfSk7CiAgICAgICAgcmV0LmNoaWxkLnBhcmVudCA9IHJldDsKICAgICAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7CiAgICAgICAgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOwogICAgICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50LmVtaXQoJ2Nsb3NlJywgY29kZSk7IH0pOwoKICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9Cn0KCmZ1bmN0aW9uIHhfbm90aWZ5YmFyKHRpdGxlKQp7CiAgICByZXQgPSB7IF9PYmplY3RJRDogJ25vdGlmeWJhci1kZXNrdG9wLlgnLCB0aXRsZTogdGl0bGUsIF93aW5kb3dzOiBbXSwgX3Byb21pc2U6IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldEluZm8oKSB9OwoKICAgIHJldC5fcHJvbWlzZS5ub3RpZnliYXIgPSByZXQ7CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdjbG9zZScpCiAgICAgICAgLmFkZE1ldGhvZCgnY2xvc2UnLCBmdW5jdGlvbiBjbG9zZSgpCiAgICAgICAgewogICAgICAgIH0pOwoKICAgIHJldC5fcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChtKQogICAgewogICAgICAgIHZhciBvZmZzZXQ7CiAgICAgICAgdmFyIGJhcldpZHRoLCBtb25XaWR0aCwgb2Zmc2V0LCBiYXJIZWlnaHQsIG1vbkhlaWdodDsKICAgICAgICBmb3IgKHZhciBpIGluIG0pCiAgICAgICAgewogICAgICAgICAgICBtb25XaWR0aCA9IChtW2ldLnJpZ2h0IC0gbVtpXS5sZWZ0KTsKICAgICAgICAgICAgbW9uSGVpZ2h0ID0gKG1baV0uYm90dG9tIC0gbVtpXS50b3ApOwogICAgICAgICAgICBiYXJXaWR0aCA9IE1hdGguZmxvb3IobW9uV2lkdGggKiAwLjMwKTsKICAgICAgICAgICAgYmFySGVpZ2h0ID0gTWF0aC5mbG9vcihtb25IZWlnaHQgKiAwLjAzNSk7CiAgICAgICAgICAgIG9mZnNldCA9IE1hdGguZmxvb3IobW9uV2lkdGggKiAwLjUwKSAtIE1hdGguZmxvb3IoYmFyV2lkdGggKiAwLjUwKTsKICAgICAgICAgICAgc3RhcnQgPSBtW2ldLmxlZnQgKyBvZmZzZXQ7CgogICAgICAgICAgICB2YXIgd2hpdGUgPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhXaGl0ZVBpeGVsKG1baV0uZGlzcGxheSwgbVtpXS5zY3JlZW5JZCkuVmFsOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wdXNoKHsKICAgICAgICAgICAgICAgIHJvb3Q6IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWFJvb3RXaW5kb3cobVtpXS5kaXNwbGF5LCBtW2ldLnNjcmVlbklkKSwKICAgICAgICAgICAgICAgIGRpc3BsYXk6IG1baV0uZGlzcGxheSwgaWQ6IG1baV0uc2NyZWVkSWQKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YQ3JlYXRlU2ltcGxlV2luZG93KG1baV0uZGlzcGxheSwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLnJvb3QsIHN0YXJ0LCAwLCBiYXJXaWR0aCwgMSwgMCwgd2hpdGUsIHdoaXRlKTsKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YU3RvcmVOYW1lKG1baV0uZGlzcGxheSwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLm5vdGlmeWJhciwgcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJykuQ3JlYXRlVmFyaWFibGUodGhpcy5ub3RpZnliYXIudGl0bGUpKTsKCiAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLnNldFdpbmRvd1NpemVIaW50cyhtW2ldLmRpc3BsYXksIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5ub3RpZnliYXIsIHN0YXJ0LCAwLCBiYXJXaWR0aCwgMSwgYmFyV2lkdGgsIDEsIGJhcldpZHRoLCAxKTsKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuaGlkZVdpbmRvd0ljb24obVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkucm9vdCwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLm5vdGlmeWJhcik7CgogICAgICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5zZXRBbGxvd2VkQWN0aW9ucyhtW2ldLmRpc3BsYXksIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5ub3RpZnliYXIsIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLk1PVElGX0ZMQUdTLk1XTV9GVU5DX0NMT1NFKTsKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuc2V0QWx3YXlzT25Ub3AobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkucm9vdCwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLm5vdGlmeWJhcik7CgoKICAgICAgICAgICAgdmFyIHdtX2RlbGV0ZV93aW5kb3dfYXRvbSA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWEludGVybkF0b20obVtpXS5kaXNwbGF5LCByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKS5DcmVhdGVWYXJpYWJsZSgnV01fREVMRVRFX1dJTkRPVycpLCAwKS5WYWw7CiAgICAgICAgICAgIHZhciBhdG9tcyA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICBhdG9tcy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUod21fZGVsZXRlX3dpbmRvd19hdG9tKTsKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YU2V0V01Qcm90b2NvbHMobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyLCBhdG9tcywgMSk7CgogICAgICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhNYXBXaW5kb3cobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyKTsKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YRmx1c2gobVtpXS5kaXNwbGF5KTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5EZXNjcmlwdG9yRXZlbnQgPSByZXF1aXJlKCdEZXNjcmlwdG9yRXZlbnRzJykuYWRkRGVzY3JpcHRvcihyZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhDb25uZWN0aW9uTnVtYmVyKG1baV0uZGlzcGxheSkuVmFsLCB7IHJlYWRzZXQ6IHRydWUgfSk7CiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5EZXNjcmlwdG9yRXZlbnQuYXRvbSA9IHdtX2RlbGV0ZV93aW5kb3dfYXRvbTsKICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLkRlc2NyaXB0b3JFdmVudC5yZXQgPSB0aGlzLm5vdGlmeWJhcjsKICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLkRlc2NyaXB0b3JFdmVudC5fZGlzcGxheSA9IG1baV0uZGlzcGxheTsKICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLkRlc2NyaXB0b3JFdmVudC5vbigncmVhZHNldCcsIGZ1bmN0aW9uIChmZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIFhFID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJykuQ3JlYXRlVmFyaWFibGUoMTAyNCk7CiAgICAgICAgICAgICAgICB3aGlsZSAocmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YUGVuZGluZyh0aGlzLl9kaXNwbGF5KS5WYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YTmV4dEV2ZW50U3luYyh0aGlzLl9kaXNwbGF5LCBYRSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKFhFLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgPT0gQ2xpZW50TWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnRUeXBlID0gWEUuRGVyZWYocmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJykuUG9pbnRlclNpemUgPT0gOCA/IDU2IDogMjgsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRUeXBlID09IHRoaXMuYXRvbSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnRGVzY3JpcHRvckV2ZW50cycpLnJlbW92ZURlc2NyaXB0b3IoZmQpOwogICAgICAgICAgICAg", 16000);
memcpy_s(_notifybardesktop + 16000, 800, "ICAgICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YQ2xvc2VEaXNwbGF5KHRoaXMuX2Rpc3BsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmVtaXQoJ2Nsb3NlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3dpbmRvd3MuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9KTsKICAgIHJldHVybiAocmV0KTsKfQoKCgpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkKewogICAgY2FzZSAnd2luMzInOgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93c19ub3RpZnliYXJfY2hlY2s7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMuc3lzdGVtID0gd2luZG93c19ub3RpZnliYXJfc3lzdGVtOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnbGludXgnOgogICAgY2FzZSAnZnJlZWJzZCc6CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB4X25vdGlmeWJhcl9jaGVjazsKICAgICAgICBicmVhazsKfQoKCv==", 800);
ILibBase64DecodeEx((unsigned char*)_notifybardesktop, 16800, (unsigned char*)_notifybardesktop + 16800);
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "notifybar-desktop"); duk_push_string(ctx, _notifybardesktop + 16800);
duk_pcall_method(ctx, 2); duk_pop(ctx);
free(_notifybardesktop);
// proxy-helper, refer to modules/proxy-helper.js
duk_peval_string_noresult(ctx, "addModule('proxy-helper', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KZnVuY3Rpb24gcG9zaXhfcHJveHlDaGVjayh1aWQsIGNoZWNrQWRkcikNCnsNCiAgICB2YXIgZzsNCiAgICB2YXIgeCA9IHByb2Nlc3MuZW52Wydub19wcm94eSddID8gcHJvY2Vzcy5lbnZbJ25vX3Byb3h5J10uc3BsaXQoJywnKSA6IFtdOw0KICAgIHZhciB0Ow0KDQogICAgaWYgKHJlcXVpcmUoJ2xpbnV4LWdub21lLWhlbHBlcnMnKS5hdmFpbGFibGUgJiYgKGcgPSByZXF1aXJlKCdsaW51eC1nbm9tZS1oZWxwZXJzJykuZ2V0UHJveHlTZXR0aW5ncyh1aWQpKS5tb2RlICE9ICdub25lJykNCiAgICB7DQogICAgICAgIHggPSBnLmV4Y2VwdGlvbnM7DQogICAgfQ0KDQogICAgZm9yKHZhciBpIGluIHgpDQogICAgew0KICAgICAgICBpZiAoeFtpXSA9PSBjaGVja0FkZHIpIHsgcmV0dXJuICh0cnVlKTsgfSAgICAgICAgICAgICAgIC8vIERpcmVjdCBNYXRjaA0KICAgICAgICBpZiAoY2hlY2tBZGRyLmVuZHNXaXRoKCcuJyArIHhbaV0pKSB7IHJldHVybiAodHJ1ZSk7IH0gIC8vIFN1YmRvbWFpbiBNYXRjaA0KICAgICAgICBpZiAoKHYgPSB4W2ldLnNwbGl0KCcvJykpLmxlbmd0aCA9PSAyKQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZihyZXF1aXJlKCdpcC1hZGRyZXNzJykuQWRkcmVzczQuZnJvbVN0cmluZyh2WzBdKS5tYXNrKHBhcnNlSW50KHZbMV0pKSA9PSByZXF1aXJlKCdpcC1hZGRyZXNzJykuQWRkcmVzczQuZnJvbVN0cmluZyhjaGVja0FkZHIpLm1hc2socGFyc2VJbnQodlsxXSkpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChleCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gKGZhbHNlKTsNCn0NCg0KZnVuY3Rpb24gd2luZG93c19wcm94eUNoZWNrKGtleSwgY2hlY2tBZGRyKQ0Kew0KICAgIGlmKCFrZXkpDQogICAgew0KICAgICAgICB2YXIgaTsNCiAgICAgICAgLy8gS2V5IHdhc24ndCBzcGVjaWZpZWQsIHNvIGxldHMgdHJ5IHRvIGZpZ3VyZSBpdCBvdXQNCiAgICAgICAgaWYoKGk9cmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpKS50c2lkID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFdlIGFyZSBhIHNlcnZpY2UsIHNvIHdlIHNob3VsZCBjaGVjayB0aGUgdXNlciB0aGF0IGluc3RhbGxlZCB0aGUgTWVzaCBBZ2VudA0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAga2V5ID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuUXVlcnlLZXkocmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcTWVzaCBBZ2VudCcsICdfSW5zdGFsbGVkQnknKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoKHh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIFRoaXMgaW5mbyBpc24ndCBhdmFpbGFibGUsIHNvIGxldCdzIHRyeSB0byB1c2UgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlcg0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAga2V5ID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykudXNlcm5hbWVUb1VzZXJLZXkocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCkpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2goeHh4KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gTm8gdXNlcnMgYXJlIGxvZ2dlZCBpbiwgc28gYXMgYSBsYXN0IHJlc29ydCwgbGV0J3MgdHJ5IHRoZSBsYXN0IGxvZ2dlZCBpbiB1c2VyLg0KICAgICAgICAgICAgICAgICAgICB2YXIgZW50cmllcyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLlF1ZXJ5S2V5KHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLkhLRVkuVXNlcnMpOw0KICAgICAgICAgICAgICAgICAgICBmb3IoaSBpbiBlbnRyaWVzLnN1YmtleXMpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVudHJpZXMuc3Via2V5c1tpXS5zcGxpdCgnLScpLmxlbmd0aD41ICYmICFlbnRyaWVzLnN1YmtleXNbaV0uZW5kc1dpdGgoJ19DbGFzc2VzJykpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZW50cmllcy5zdWJrZXlzW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gV2UgYXJlIGEgbG9nZ2VkIGluIHVzZXINCiAgICAgICAgICAgIGtleSA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLnVzZXJuYW1lVG9Vc2VyS2V5KGkubmFtZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYoIWtleSkge3Rocm93KCdDb3VsZCBub3QgZGV0ZXJtaW5lIHdoaWNoIHVzZXIgcHJveHkgc2V0dGluZyB0byBxdWVyeScpO30NCiAgICB9DQogICAgdmFyIHByb3h5T3ZlcnJpZGUgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5RdWVyeUtleShyZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5IS0VZLlVzZXJzLCBrZXkgKyAnXFxTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcSW50ZXJuZXQgU2V0dGluZ3MnLCAnUHJveHlPdmVycmlkZScpLnNwbGl0KCc7Jyk7DQogICAgZm9yKHZhciBpIGluIHByb3h5T3ZlcnJpZGUpDQogICAgew0KICAgICAgICBwcm94eU92ZXJyaWRlW2ldID0gcHJveHlPdmVycmlkZVtpXS50cmltKCk7DQogICAgICAgIGlmICgoY2hlY2tBZGRyID09ICcxMjcuMC4wLjEnIHx8IGNoZWNrQWRkciA9PSAnOjoxJykgJiYgcHJveHlPdmVycmlkZVtpXSA9PSAnPGxvY2FsPicpIHsgcmV0dXJuICh0cnVlKTsgfQ0KICAgICAgICBpZiAoY2hlY2tBZGRyID09IHByb3h5T3ZlcnJpZGVbaV0pIHsgcmV0dXJuICh0cnVlKTsgfSAvLyBFeGFjdCBNYXRjaA0KICAgICAgICBpZiAocHJveHlPdmVycmlkZVtpXS5zdGFydHNXaXRoKCcqLicpICYmIGNoZWNrQWRkci5lbmRzV2l0aChwcm94eU92ZXJyaWRlW2ldLnN1YnN0cmluZygxKSkpIHsgcmV0dXJuICh0cnVlKTsgfQ0KICAgICAgICBpZiAocHJveHlPdmVycmlkZVtpXS5lbmRzV2l0aCgnLionKSAmJiBjaGVja0FkZHIuc3RhcnRzV2l0aChwcm94eU92ZXJyaWRlW2ldLnN1YnN0cmluZygwLCBwcm94eU92ZXJyaWRlW2ldLmxlbmd0aCAtIDEpKSkgeyByZXR1cm4gKHRydWUpOyB9DQogICAgfQ0KICAgIHJldHVybiAoZmFsc2UpOw0KfQ0KDQpzd2l0Y2ggKHByb2Nlc3MucGxhdGZvcm0pDQp7DQogICAgY2FzZSAnbGludXgnOg0KICAgIGNhc2UgJ2ZyZWVic2QnOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgaWdub3JlUHJveHk6IHBvc2l4X3Byb3h5Q2hlY2sgfTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgaWdub3JlUHJveHk6IHdpbmRvd3NfcHJveHlDaGVjayB9Ow0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICBicmVhazsNCn0NCv==', 'base64').toString());");
#ifdef _POSIX
duk_peval_string_noresult(ctx, "addModule('linux-pathfix', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KZnVuY3Rpb24gY2hlY2tQYXRoKCkNCnsNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdlY2hvICRQQVRIIHwgYXdrIFwneyB5ZXM9MDsgYT1zcGxpdCgkMCwgYiwgIjoiKTsgZm9yKHg9MTt4PD1hOysreCkgeyBpZihiW3hdPT0iL3NiaW4iKSB7IHllcz0xOyB9IH0gcHJpbnQgeWVzOyB9XCdcbmV4aXRcbicpOw0KICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgIGlmIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgcHJvY2Vzcy5zZXRlbnYoJ1BBVEgnLCBwcm9jZXNzLmVudlsnUEFUSCddICsgJzovc2JpbicpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQptb2R1bGUuZXhwb3J0cyA9IGNoZWNrUGF0aDsNCg0KDQo=', 'base64').toString());");
#endif
// wget: Refer to modules/wget.js for a human readable version.
duk_peval_string_noresult(ctx, "addModule('wget', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOw0KdmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7DQp2YXIgd3JpdGFibGUgPSByZXF1aXJlKCdzdHJlYW0nKS5Xcml0YWJsZTsNCg0KDQpmdW5jdGlvbiB3Z2V0KHJlbW90ZVVyaSwgbG9jYWxGaWxlUGF0aCwgd2dldG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgdmFyIGFnZW50Q29ubmVjdGVkID0gZmFsc2U7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2J5dGVzJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdhYm9ydCcpDQogICAgICAgIC5hZGRNZXRob2QoJ2Fib3J0JywgZnVuY3Rpb24gKCkgeyB0aGlzLl9yZXF1ZXN0LmFib3J0KCk7IH0pOw0KDQogICAgdHJ5DQogICAgew0KICAgICAgICBhZ2VudENvbm5lY3RlZCA9IHJlcXVpcmUoJ01lc2hBZ2VudCcpLmlzQ29udHJvbENoYW5uZWxDb25uZWN0ZWQ7DQogICAgfQ0KICAgIGNhdGNoIChlKQ0KICAgIHsNCiAgICB9DQoNCiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgcHJveHkgc2V0dGluZ3MgaWYgdGhlIGFnZW50IGlzIG5vdCBjb25uZWN0ZWQsIGJlY2F1c2Ugd2hlbiB0aGUgYWdlbnQNCiAgICAvLyBjb25uZWN0cywgaXQgYXV0b21hdGljYWxseSBjb25maWd1cmVzIHRoZSBwcm94eSBmb3IgSmF2YVNjcmlwdC4NCiAgICBpZiAoIWFnZW50Q29ubmVjdGVkKQ0KICAgIHsNCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOw0KICAgICAgICAgICAgaWYgKHJlZy5RdWVyeUtleShyZWcuSEtFWS5DdXJyZW50VXNlciwgJ1NvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxJbnRlcm5ldCBTZXR0aW5ncycsICdQcm94eUVuYWJsZScpID09IDEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHByb3h5VXJpID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkN1cnJlbnRVc2VyLCAnU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEludGVybmV0IFNldHRpbmdzJywgJ1Byb3h5U2VydmVyJyk7DQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSByZXF1aXJlKCdodHRwJykucGFyc2VVcmkoJ2h0dHA6Ly8nICsgcHJveHlVcmkpOw0KDQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Byb3h5ID0+ICcgKyBwcm94eVVyaSk7DQogICAgICAgICAgICAgICAgcmVxdWlyZSgnZ2xvYmFsLXR1bm5lbCcpLmluaXRpYWxpemUob3B0aW9ucyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB2YXIgcmVxT3B0aW9ucyA9IHJlcXVpcmUoJ2h0dHAnKS5wYXJzZVVyaShyZW1vdGVVcmkpOw0KICAgIGlmICh3Z2V0b3B0aW9ucykNCiAgICB7DQogICAgICAgIGZvciAodmFyIGlucHV0T3B0aW9uIGluIHdnZXRvcHRpb25zKSB7DQogICAgICAgICAgICByZXFPcHRpb25zW2lucHV0T3B0aW9uXSA9IHdnZXRvcHRpb25zW2lucHV0T3B0aW9uXTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXQuX3RvdGFsQnl0ZXMgPSAwOw0KICAgIHJldC5fcmVxdWVzdCA9IGh0dHAuZ2V0KHJlcU9wdGlvbnMpOw0KICAgIHJldC5fbG9jYWxGaWxlUGF0aCA9IGxvY2FsRmlsZVBhdGg7DQogICAgcmV0Ll9yZXF1ZXN0LnByb21pc2UgPSByZXQ7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7IHRoaXMucHJvbWlzZS5fcmVqKGUpOyB9KTsNCiAgICByZXQuX3JlcXVlc3Qub24oJ2Fib3J0JywgZnVuY3Rpb24gKCkgeyB0aGlzLnByb21pc2UuZW1pdCgnYWJvcnQnKTsgfSk7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uIChpbXNnKQ0KICAgIHsNCiAgICAgICAgaWYoaW1zZy5zdGF0dXNDb2RlICE9IDIwMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ1NlcnZlciByZXNwb25zZWQgd2l0aCBTdGF0dXMgQ29kZTogJyArIGltc2cuc3RhdHVzQ29kZSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9maWxlID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSh0aGlzLnByb21pc2UuX2xvY2FsRmlsZVBhdGgsIHsgZmxhZ3M6ICd3YicgfSk7DQogICAgICAgICAgICAgICAgdGhpcy5fc2hhID0gcmVxdWlyZSgnU0hBMzg0U3RyZWFtJykuY3JlYXRlKCk7DQogICAgICAgICAgICAgICAgdGhpcy5fc2hhLnByb21pc2UgPSB0aGlzLnByb21pc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKGUpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuX3NoYS5vbignaGFzaCcsIGZ1bmN0aW9uIChoKSB7IHRoaXMucHJvbWlzZS5fcmVzKGgudG9TdHJpbmcoJ2hleCcpKTsgfSk7DQogICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvciA9IG5ldyB3cml0YWJsZSgNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjaHVuaywgY2FsbGJhY2spDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fdG90YWxCeXRlcyArPSBjaHVuay5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuZW1pdCgnYnl0ZXMnLCB0aGlzLnByb21pc2UuX3RvdGFsQnl0ZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgZmluYWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvci5wcm9taXNlID0gdGhpcy5wcm9taXNlOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX2ZpbGUpOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX2FjY3VtdWxhdG9yKTsNCiAgICAgICAgICAgIGltc2cucGlwZSh0aGlzLl9zaGEpOw0KICAgICAgICB9DQogICAgfSk7DQogICAgcmV0LnByb2dyZXNzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX3RvdGFsQnl0ZXMpOyB9Ow0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSB3Z2V0Ow0KDQoNCv==', 'base64').toString());");
duk_peval_string_noresult(ctx, "Object.defineProperty(this, 'wget', {get: function() { return(require('wget'));}});");
duk_peval_string_noresult(ctx, "Object.defineProperty(process, 'arch', {get: function() {return( require('os').arch());}});");
// default_route: Refer to modules/default_route.js
duk_peval_string_noresult(ctx, "addModule('default_route', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KZnVuY3Rpb24gd2luZG93c19kZWZhdWx0Um91dGUoKQ0Kew0KICAgIHZhciByZXQgPSBudWxsOw0KICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOw0KICAgIElQID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0lwaGxwYXBpLmRsbCcpOw0KICAgIElQLkNyZWF0ZU1ldGhvZCgnR2V0SXBGb3J3YXJkVGFibGUnKTsNCg0KICAgIHZhciBzaXplID0gR00uQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgdmFyIHJlc3VsdCA9IElQLkdldElwRm9yd2FyZFRhYmxlKDAsIHNpemUsIDEpOw0KICAgIGlmKHJlc3VsdC5WYWwgPT0gMTIyKQ0KICAgIHsNCiAgICAgICAgdmFyIHRhYmxlID0gR00uQ3JlYXRlVmFyaWFibGUoc2l6ZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsNCiAgICAgICAgcmVzdWx0ID0gSVAuR2V0SXBGb3J3YXJkVGFibGUodGFibGUsIHNpemUsIDEpOw0KICAgICAgICBpZihyZXN1bHQuVmFsID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gdGFibGUuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICAgICAgICAgIHZhciByb3c7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8ZW50cmllczsrK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcm93ID0gdGFibGUuRGVyZWYoNCArIChpICogNTYpLCA1Nik7DQogICAgICAgICAgICAgICAgaWYgKHJvdy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID09IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IFJvdXRlDQogICAgICAgICAgICAgICAgICAgIGlmICghcmV0IHx8IHJldC5tZXRyaWMgPiByb3cuRGVyZWYoMzYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgaW50ZXJmYWNlOiByb3cuRGVyZWYoMTYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCksIG1ldHJpYzogcm93LkRlcmVmKDM2LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIH07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBsaW51eF9kZWZhdWx0Um91dGUoKQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpcCByb3V0ZSB8IGdyZXAgZGVmYXVsdCB8IGF3ayBcJ3sgaWYoICQxPT0iZGVmYXVsdCIgJiYgJDQ9PSJkZXYiICkgeyBwcmludCAkNTsgfSB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IG51bGwgOiB7IGludGVyZmFjZTogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCksIG1ldHJpYzogMSB9KTsNCn0NCg0KZnVuY3Rpb24gYnNkX2RlZmF1bHRSb3V0ZSgpDQp7DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ25ldHN0YXQgLXJuIC1mIGluZXQgfCBncmVwIGRlZmF1bHQgfCBhd2sgXCd7IHByaW50ICRORiB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IG51bGwgOiB7IGludGVyZmFjZTogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCksIG1ldHJpYzogMSB9KTsNCn0NCg0Kc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQp7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd3NfZGVmYXVsdFJvdXRlOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGludXhfZGVmYXVsdFJvdXRlOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdmcmVlYnNkJzoNCiAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGJzZF9kZWZhdWx0Um91dGU7DQogICAgICAgIGJyZWFrOw0KfQ0KDQo=', 'base64').toString());");
// agent-instaler: Refer to modules/agent-installer.js
duk_peval_string_noresult(ctx, "addModule('agent-installer', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGluc3RhbGxTZXJ2aWNlKHBhcmFtcykNCnsNCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLi4uSW5zdGFsbGluZyBzZXJ2aWNlJyk7DQogICAgdHJ5DQogICAgew0KICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmluc3RhbGxTZXJ2aWNlKA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWU6IHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnLA0KICAgICAgICAgICAgICAgIHRhcmdldDogcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2hBZ2VudCcgOiAnbWVzaGFnZW50JywNCiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgYmFja2dyb3VuZCBzZXJ2aWNlJywNCiAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogcHJvY2Vzcy5leGVjUGF0aCwNCiAgICAgICAgICAgICAgICBzdGFydFR5cGU6ICdBVVRPX1NUQVJUJywNCiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgfQ0KICAgIGNhdGNoKHNpZSkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXSAnICsgc2llKTsNCiAgICAgICAgcHJvY2Vzcy5leGl0KCk7DQogICAgfQ0KICAgIHZhciBzdmMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybT09J3dpbjMyJz8nTWVzaCBBZ2VudCc6J21lc2hhZ2VudCcpOw0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgIHsNCiAgICAgICAgc3ZjLmxvYWQoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IHNldHRpbmcgdXAgbGF1bmNoIGFnZW50Li4uJyk7DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmluc3RhbGxMYXVuY2hBZ2VudCgNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtZXNoYWdlbnQnLA0KICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogc3ZjLmFwcExvY2F0aW9uKCksDQogICAgICAgICAgICAgICAgICAgIHN0YXJ0VHlwZTogJ0FVVE9fU1RBUlQnLA0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9uVHlwZXM6IFsnTG9naW5XaW5kb3cnXSwNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogWycta3ZtMSddDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKHNpZSkNCiAgICAgICAgew0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRVJST1JdICcgKyBzaWUpOw0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgew0KICAgICAgICB2YXIgbG9jID0gc3ZjLmFwcExvY2F0aW9uKCk7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBXcml0aW5nIGZpcmV3YWxsIHJ1bGVzIGZvciBNZXNoIEFnZW50IFNlcnZpY2UuLi4nKTsNCg0KICAgICAgICB2YXIgcnVsZSA9IA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lOiAnTWVzaCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMgKFRDUC0xKScsDQogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLA0KICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVENQJywNCiAgICAgICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTAsDQogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgTWFuYWdlbWVudCBUcmFmZmljJywNCiAgICAgICAgICAgICAgICBFZGdlVHJhdmVyc2FsUG9saWN5OiAnYWxsb3cnLA0KICAgICAgICAgICAgICAgIEVuYWJsZWQ6IHRydWUNCiAgICAgICAgICAgIH07DQogICAgICAgIHJlcXVpcmUoJ3dpbi1maXJld2FsbCcpLmFkZEZpcmV3YWxsUnVsZShydWxlKTsNCg0KICAgICAgICBydWxlID0gDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgRGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IE1hbmFnZW1lbnQgVHJhZmZpYyAoVENQLTIpJywNCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdpbmJvdW5kJywNCiAgICAgICAgICAgICAgICBQcm9ncmFtOiBsb2MsDQogICAgICAgICAgICAgICAgUHJvdG9jb2w6ICdUQ1AnLA0KICAgICAgICAgICAgICAgIFByb2ZpbGU6ICdQdWJsaWMsIFByaXZhdGUsIERvbWFpbicsDQogICAgICAgICAgICAgICAgTG9jYWxQb3J0OiAxNjk5MSwNCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogJ01lc2ggQ2VudHJhbCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMnLA0KICAgICAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICAgICAgRW5hYmxlZDogdHJ1ZQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOyANCg0KICAgICAgICBydWxlID0NCiAgICAgICAgew0KICAgICAgICAgICAgRGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IFBlZXItdG8tUGVlciBUcmFmZmljIChVRFAtMSknLA0KICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICBQcm9ncmFtOiBsb2MsDQogICAgICAgICAgICBQcm90b2NvbDogJ1VEUCcsDQogICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgTG9jYWxQb3J0OiAxNjk5MCwNCiAgICAgICAgICAgIERlc2NyaXB0aW9uOiAnTWVzaCBDZW50cmFsIEFnZW50IFBlZXItdG8tUGVlciBUcmFmZmljJywNCiAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICBFbmFibGVkOiB0cnVlDQogICAgICAgIH07DQogICAgICAgIHJlcXVpcmUoJ3dpbi1maXJld2FsbCcpLmFkZEZpcmV3YWxsUnVsZShydWxlKTsNCg0KICAgICAgICBydWxlID0NCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMgKFVEUC0yKScsDQogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLA0KICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVURQJywNCiAgICAgICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTEsDQogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMnLA0KICAgICAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICAgICAgRW5hYmxlZDogdHJ1ZQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOw0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgfQ0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBTdGFydGluZyBzZXJ2aWNlLi4uJyk7DQogICAgdHJ5DQogICAgew0KICAgICAgICBzdmMuc3RhcnQoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbT0tdXG4nKTsNCiAgICB9DQogICAgY2F0Y2goZWUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgIH0NCg0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpIHsgc3ZjLmNsb3NlKCk7IH0NCiAgICBwcm9jZXNzLmV4aXQoKTsNCn0NCg0KZnVuY3Rpb24gdW5pbnN0YWxsU2VydmljZTMocGFyYW1zKQ0Kew0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFVuaW5zdGFsbGluZyBsYXVuY2ggYWdlbnQuLi4nKTsNCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBsYXVuY2hhZ2VudCA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0TGF1bmNoQWdlbnQoJ21lc2hhZ2VudCcpOw0KICAgICAgICAgICAgbGF1bmNoYWdlbnQudW5sb2FkKCk7DQogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMobGF1bmNoYWdlbnQucGxpc3QpOw0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRE9ORV1cbicpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChlKQ0KICAgICAgICB7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChwYXJhbXMgIT0gbnVsbCkNCiAgICB7DQogICAgICAgIGluc3RhbGxTZXJ2aWNlKHBhcmFtcyk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHByb2Nlc3MuZXhpdCgpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gdW5pbnN0YWxsU2VydmljZTIocGFyYW1zKQ0Kew0KICAgIHZhciBzZWNvbmRhcnlhZ2VudCA9IGZhbHNlOw0KDQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFVuaW5zdGFsbGluZyBwcmV2aW91cyBpbnN0YWxsYXRpb24uLi4nKTsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIudW5pbnN0YWxsU2VydmljZShwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnTWVzaCBBZ2VudCcgOiAnbWVzaGFnZW50Jyk7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsNCiAgICB9DQogICAgY2F0Y2ggKGUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgIH0NCg0KICAgIC8vIENoZWNrIGZvciBzZWNvbmRhcnkgYWdlbnQNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBDaGVja2luZyBmb3Igc2Vjb25kYXJ5IGFnZW50Li4uJyk7DQogICAgICAgIHZhciBzID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKCdtZXNoYWdlbnREaWFnbm9zdGljJyk7DQogICAgICAgIHZhciBsb2MgPSBzLmFwcExvY2F0aW9uKCk7DQogICAgICAgIHMuY2xvc2UoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRk9VTkRdXG4nKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgICAgIC0+IFVuaW5zdGFsbGluZyBzZWNvbmRhcnkgYWdlbnQuLi4nKTsNCiAgICAgICAgc2Vjb25kYXJ5YWdlbnQgPSB0cnVlOw0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci51bmluc3RhbGxTZXJ2aWNlKCdtZXNoYWdlbnREaWFnbm9zdGljJyk7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgIH0NCiAgICB9DQogICAgY2F0Y2ggKGUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtOT05FXVxuJyk7DQogICAgfQ0KDQogICAgaWYoc2Vjb25kYXJ5YWdlbnQpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgICAgLT4gcmVtb3Zpbmcgc2Vjb25kYXJ5IGFnZW50IGZyb20gdGFzayBzY2hlZHVsZXIuLi4nKTsNCiAgICAgICAgdmFyIHAgPSByZXF1aXJlKCd0YXNrLXNjaGVkdWxlcicpLmRlbGV0ZSgnbWVzaGFnZW50RGlhZ25vc3RpYy9wZXJpb2RpY1N0YXJ0Jyk7DQogICAgICAgIHAuX3BhcmFtcyA9IHBhcmFtczsNCiAgICAgICAgcC50aGVuKGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsNCiAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UzKHRoaXMuX3BhcmFtcyk7DQogICAgICAgIH0sIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlMyh0aGlzLl9wYXJhbXMpOw0KICAgICAgICB9KTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgdW5pbnN0YWxsU2VydmljZTMocGFyYW1zKTsNCiAgICB9DQp9DQpmdW5jdGlvbiB1bmluc3RhbGxTZXJ2aWNlKHBhcmFtcykNCnsNCiAgICB2YXIgc3ZjID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnKTsNCiAgICBpZiAoc3ZjLmlzUnVubmluZygpKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFN0b3BwaW5nIFNlcnZpY2UuLi4nKTsNCiAgICAgICAgaWYocHJvY2Vzcy5wbGF0Zm9ybT09J3dpbjMyJykNCiAgICAgICAgew0KICAgICAgICAgICAgc3ZjLnN0b3AoKS50aGVuKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbU1RPUFBFRF1cbicpOw0KICAgICAgICAgICAgICAgIHN2Yy5jbG9zZSgpOw0KICAgICAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHRoaXMuX3BhcmFtcyk7DQogICAgICAgICAgICB9LCBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgICAgICAgICAgc3ZjLmNsb3NlKCk7DQogICAgICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIodGhpcy5fcGFyYW1zKTsNCiAgICAgICAgICAgIH0pLnBhcmVudFByb21pc2UuX3BhcmFtcyA9IHBhcmFtczsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN2Yy51bmxvYWQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzdmMuc3RvcCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbU1RPUFBFRF1cbicpOw0KICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIocGFyYW1zKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKSB7IHN2Yy5jbG9zZSgpOyB9DQogICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHBhcmFtcyk7DQogICAgfQ0KfQ0KZnVuY3Rpb24gc2VydmljZUV4aXN0cyhsb2MsIHBhcmFtcykNCnsNCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtGT1VORDogJyArIGxvYyArICddXG4nKTsNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgLT4gQ2hlY2tpbmcgZmlyZXdhbGwgcnVsZXMgZm9yIHByZXZpb3VzIGluc3RhbGxhdGlvbi4uLicpOw0KICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5yZW1vdmVGaXJld2FsbFJ1bGUoeyBwcm9ncmFtOiBsb2MgfSkudGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBTVUNDRVNTDQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtERUxFVEVEXVxuJyk7DQogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHRoaXMuX3BhcmFtcyk7DQogICAgICAgIH0sIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEZBSUxFRA0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTm8gUnVsZXMgRm91bmRdXG4nKTsNCiAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UodGhpcy5fcGFyYW1zKTsNCiAgICAgICAgfSkucGFyZW50UHJvbWlzZS5fcGFyYW1zID0gcGFyYW1zOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHBhcmFtcyk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBmdWxsVW5pbnN0YWxsKCkNCnsNCiAgICBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkRJU0FCTEVEKTsNCg0KICAgIHRyeQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4uLkNoZWNraW5nIGZvciBwcmV2aW91cyBpbnN0YWxsYXRpb24nKTsNCiAgICAgICAgdmFyIHMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2ggQWdlbnQnIDogJ21lc2hhZ2VudCcpOw0KICAgICAgICB2YXIgbG9jID0gcy5hcHBMb2NhdGlvbigpOw0KICAgICAgICBzLmNsb3NlKCk7DQogICAgfQ0KICAgIGNhdGNoIChlKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTk9ORV1cbicpOw0KICAgICAgICBwcm9jZXNzLmV4aXQoKTsNCiAgICB9DQogICAgc2VydmljZUV4aXN0cyhsb2MsIG51bGwpOw0KfQ0KDQpmdW5jdGlvbiBmdWxsSW5zdGFsbChqc29uU3RyaW5nKQ0Kew0KICAgIGNvbnNvbGUuc2V0RGVzdGluYXRpb24oY29uc29sZS5EZXN0aW5hdGlvbnMuRElTQUJMRUQpOw0KICAgIHZhciBwYXJtcyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7DQoNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuLi5DaGVja2luZyBmb3IgcHJldmlvdXMgaW5zdGFsbGF0aW9uJyk7DQogICAgICAgIHZhciBzID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnKTsNCiAgICAgICAgdmFyIGxvYyA9IHMuYXBwTG9jYXRpb24oKTsNCiAgICAgICAgcy5jbG9zZSgpOw0KICAgIH0NCiAgICBjYXRjaCAoZSkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW05PTkVdXG4nKTsNCiAgICAgICAgaW5zdGFsbFNlcnZpY2UocGFybXMpOw0KICAgICAgICByZXR1cm47DQogICAgfQ0KICAgIHNlcnZpY2VFeGlzdHMobG9jLCBwYXJtcyk7DQp9DQoNCg0KbW9kdWxlLmV4cG9ydHMgPQ0KICAgIHsNCiAgICAgICAgZnVsbEluc3RhbGw6IGZ1bGxJbnN0YWxsLA0KICAgICAgICBmdWxsVW5pbnN0YWxsOiBmdWxsVW5pbnN0YWxsDQogICAgfTs=', 'base64').toString());");
#ifdef __APPLE__
duk_peval_string_noresult(ctx, "addModule('mac-powerutil', Buffer.from('LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIHBvd2VydXRpbCgpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ21hYy1wb3dlcnV0aWwnOwoKICAgIHRoaXMuc2xlZXAgPSBmdW5jdGlvbiBzbGVlcCgpCiAgICB7DQogICAgICAgIHZhciBjaGlsZDsNCiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnb3Nhc2NyaXB0IC1lIFwndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gc2xlZXBcJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3NsZWVwKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0nKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0KICAgIHRoaXMucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKQogICAgew0KICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2h1dGRvd24gLXIgbm93XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHRocm93ICgncmVzdGFydCgpIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtJyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9CiAgICB0aGlzLnNodXRkb3duID0gZnVuY3Rpb24gc2h1dGRvd24oKQogICAgew0KICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgIHN3aXRjaCAocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NodXRkb3duIC1oIG5vd1xuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3NodXRkb3duKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0nKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgcG93ZXJ1dGlsKCk7', 'base64').toString());");
#endif
}
void ILibDuktape_ChainViewer_PostSelect(void* object, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset)
{
duk_context *ctx = (duk_context*)((void**)((ILibTransport*)object)->ChainLink.ExtraMemoryPtr)[0];
void *hptr = ((void**)((ILibTransport*)object)->ChainLink.ExtraMemoryPtr)[1];
ILibDuktape_EventEmitter_SetupEmit(ctx, hptr, "PostSelect"); // [emit][this][name]
duk_push_int(ctx, slct); // [emit][this][name][select]
char *m = ILibChain_GetMetaDataFromDescriptorSet(Duktape_GetChain(ctx), readset, writeset, errorset);
duk_push_string(ctx, m);
if (duk_pcall_method(ctx, 3) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "ChainViewer.emit('PostSelect'): Error "); }
duk_pop(ctx);
}
extern void ILibPrependToChain(void *Chain, void *object);
void ILibDuktape_ChainViewer_Push(duk_context *ctx, void *chain)
{
duk_push_object(ctx); // [viewer]
ILibTransport *t = (ILibTransport*)ILibChain_Link_Allocate(sizeof(ILibTransport), 2*sizeof(void*));
t->ChainLink.MetaData = "ILibDuktape_ChainViewer";
t->ChainLink.PostSelectHandler = ILibDuktape_ChainViewer_PostSelect;
((void**)t->ChainLink.ExtraMemoryPtr)[0] = ctx;
((void**)t->ChainLink.ExtraMemoryPtr)[1] = duk_get_heapptr(ctx, -1);
ILibDuktape_EventEmitter *emitter = ILibDuktape_EventEmitter_Create(ctx);
ILibDuktape_EventEmitter_CreateEventEx(emitter, "PostSelect");
ILibPrependToChain(chain, (void*)t);
}
duk_ret_t ILibDuktape_httpHeaders(duk_context *ctx)
{
ILibHTTPPacket *packet = NULL;
packetheader_field_node *node;
int headersOnly = duk_get_top(ctx) > 1 ? (duk_require_boolean(ctx, 1) ? 1 : 0) : 0;
duk_size_t bufferLen;
char *buffer = (char*)Duktape_GetBuffer(ctx, 0, &bufferLen);
packet = ILibParsePacketHeader(buffer, 0, (int)bufferLen);
if (packet == NULL) { return(ILibDuktape_Error(ctx, "http-headers(): Error parsing data")); }
if (headersOnly == 0)
{
duk_push_object(ctx);
if (packet->Directive != NULL)
{
duk_push_lstring(ctx, packet->Directive, packet->DirectiveLength);
duk_put_prop_string(ctx, -2, "method");
duk_push_lstring(ctx, packet->DirectiveObj, packet->DirectiveObjLength);
duk_put_prop_string(ctx, -2, "url");
}
else
{
duk_push_int(ctx, packet->StatusCode);
duk_put_prop_string(ctx, -2, "statusCode");
duk_push_lstring(ctx, packet->StatusData, packet->StatusDataLength);
duk_put_prop_string(ctx, -2, "statusMessage");
}
if (packet->VersionLength == 3)
{
duk_push_object(ctx);
duk_push_lstring(ctx, packet->Version, 1);
duk_put_prop_string(ctx, -2, "major");
duk_push_lstring(ctx, packet->Version + 2, 1);
duk_put_prop_string(ctx, -2, "minor");
duk_put_prop_string(ctx, -2, "version");
}
}
duk_push_object(ctx); // headers
node = packet->FirstField;
while (node != NULL)
{
duk_push_lstring(ctx, node->Field, node->FieldLength); // [str]
duk_get_prop_string(ctx, -1, "toLowerCase"); // [str][toLower]
duk_swap_top(ctx, -2); // [toLower][this]
duk_call_method(ctx, 0); // [result]
duk_push_lstring(ctx, node->FieldData, node->FieldDataLength);
duk_put_prop(ctx, -3);
node = node->NextField;
}
if (headersOnly == 0)
{
duk_put_prop_string(ctx, -2, "headers");
}
ILibDestructPacket(packet);
return(1);
}
void ILibDuktape_httpHeaders_PUSH(duk_context *ctx, void *chain)
{
duk_push_c_function(ctx, ILibDuktape_httpHeaders, DUK_VARARGS);
}
void ILibDuktape_DescriptorEvents_PreSelect(void* object, fd_set *readset, fd_set *writeset, fd_set *errorset, int* blocktime)
{
duk_context *ctx = (duk_context*)((void**)((ILibChain_Link*)object)->ExtraMemoryPtr)[0];
void *h = ((void**)((ILibChain_Link*)object)->ExtraMemoryPtr)[1];
if (h == NULL || ctx == NULL) { return; }
int i = duk_get_top(ctx);
int fd;
duk_push_heapptr(ctx, h); // [obj]
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Table); // [obj][table]
duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY); // [obj][table][enum]
while (duk_next(ctx, -1, 1)) // [obj][table][enum][FD][emitter]
{
fd = (int)duk_to_int(ctx, -2);
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Options); // [obj][table][enum][FD][emitter][options]
if (Duktape_GetBooleanProperty(ctx, -1, "readset", 0)) { FD_SET(fd, readset); }
if (Duktape_GetBooleanProperty(ctx, -1, "writeset", 0)) { FD_SET(fd, writeset); }
if (Duktape_GetBooleanProperty(ctx, -1, "errorset", 0)) { FD_SET(fd, errorset); }
duk_pop_3(ctx); // [obj][table][enum]
}
duk_set_top(ctx, i);
}
void ILibDuktape_DescriptorEvents_PostSelect(void* object, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset)
{
duk_context *ctx = (duk_context*)((void**)((ILibChain_Link*)object)->ExtraMemoryPtr)[0];
void *h = ((void**)((ILibChain_Link*)object)->ExtraMemoryPtr)[1];
if (h == NULL || ctx == NULL) { return; }
int i = duk_get_top(ctx);
int fd;
duk_push_array(ctx); // [array]
duk_push_heapptr(ctx, h); // [array][obj]
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Table); // [array][obj][table]
duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY); // [array][obj][table][enum]
while (duk_next(ctx, -1, 1)) // [array][obj][table][enum][FD][emitter]
{
fd = (int)duk_to_int(ctx, -2);
if (FD_ISSET(fd, readset) || FD_ISSET(fd, writeset) || FD_ISSET(fd, errorset))
{
duk_put_prop_index(ctx, -6, (duk_uarridx_t)duk_get_length(ctx, -6)); // [array][obj][table][enum][FD]
duk_pop(ctx); // [array][obj][table][enum]
}
else
{
duk_pop_2(ctx); // [array][obj][table][enum]
}
}
duk_pop_3(ctx); // [array]
while (duk_get_length(ctx, -1) > 0)
{
duk_get_prop_string(ctx, -1, "pop"); // [array][pop]
duk_dup(ctx, -2); // [array][pop][this]
if (duk_pcall_method(ctx, 0) == 0) // [array][emitter]
{
if ((fd = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_DescriptorEvents_FD, -1)) != -1)
{
if (FD_ISSET(fd, readset))
{
ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "readset"); // [array][emitter][emit][this][readset]
duk_push_int(ctx, fd); // [array][emitter][emit][this][readset][fd]
duk_pcall_method(ctx, 2); duk_pop(ctx); // [array][emitter]
}
if (FD_ISSET(fd, writeset))
{
ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "writeset"); // [array][emitter][emit][this][writeset]
duk_push_int(ctx, fd); // [array][emitter][emit][this][writeset][fd]
duk_pcall_method(ctx, 2); duk_pop(ctx); // [array][emitter]
}
if (FD_ISSET(fd, errorset))
{
ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "errorset"); // [array][emitter][emit][this][errorset]
duk_push_int(ctx, fd); // [array][emitter][emit][this][errorset][fd]
duk_pcall_method(ctx, 2); duk_pop(ctx); // [array][emitter]
}
}
}
duk_pop(ctx); // [array]
}
duk_set_top(ctx, i);
}
duk_ret_t ILibDuktape_DescriptorEvents_Remove(duk_context *ctx)
{
if (!duk_is_number(ctx, 0)) { return(ILibDuktape_Error(ctx, "Invalid Descriptor")); }
ILibForceUnBlockChain(Duktape_GetChain(ctx));
duk_push_this(ctx); // [obj]
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Table); // [obj][table]
duk_dup(ctx, 0); // [obj][table][key]
duk_del_prop(ctx, -2); // [obj][table]
return(0);
}
#ifdef WIN32
void ILibDuktape_DescriptorEvents_WaitHandle_EventThread(void *chain, void *user)
{
if (!ILibMemory_CanaryOK((void*)user)) { return; }
ILibDuktape_DescriptorEvents_WindowsWaitHandle *v = (ILibDuktape_DescriptorEvents_WindowsWaitHandle*)user;
UnregisterWait(v->waitHandle); v->waitHandle = NULL;
ILibDuktape_EventEmitter_SetupEmit(v->ctx, v->object, "signaled"); // [emit][this][signaled]
if (duk_pcall_method(v->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(v->ctx, "WaitHandleAPC Error "); }
duk_pop(v->ctx);
}
void __stdcall ILibDuktape_DescriptorEvents_WaitHandleSignaled(void *user, BOOLEAN TimerOrWaitFired)
{
if (!ILibMemory_CanaryOK(user)) { return; }
ILibDuktape_DescriptorEvents_WindowsWaitHandle *v = (ILibDuktape_DescriptorEvents_WindowsWaitHandle*)user;
Duktape_RunOnEventLoop(v->chain, duk_ctx_nonce(v->ctx), v->ctx, ILibDuktape_DescriptorEvents_WaitHandle_EventThread, NULL, user);
}
#endif
duk_ret_t ILibDuktape_DescriptorEvents_Add(duk_context *ctx)
{
#ifdef WIN32
if (duk_is_object(ctx, 0) && duk_has_prop_string(ctx, 0, "_ptr"))
{
HANDLE h = (HANDLE)Duktape_GetPointerProperty(ctx, 0, "_ptr");
if (h != NULL)
{
duk_push_object(ctx); // [value]
ILibDuktape_DescriptorEvents_WindowsWaitHandle *v = (ILibDuktape_DescriptorEvents_WindowsWaitHandle*)Duktape_PushBuffer(ctx, sizeof(ILibDuktape_DescriptorEvents_WindowsWaitHandle));
duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_WaitHandle);
ILibDuktape_EventEmitter *e = ILibDuktape_EventEmitter_Create(ctx);
ILibDuktape_EventEmitter_CreateEventEx(e, "signaled");
v->ctx = ctx;
v->object = duk_get_heapptr(ctx, -1);
v->chain = Duktape_GetChain(ctx);
v->eventThread = ILibChain_GetMicrostackThreadHandle(v->chain);
if (RegisterWaitForSingleObject(&(v->waitHandle), h, ILibDuktape_DescriptorEvents_WaitHandleSignaled, (void*)v, INFINITE, WT_EXECUTEINPERSISTENTTHREAD | WT_EXECUTEONLYONCE) == 0)
{
return(ILibDuktape_Error(ctx, "Error(%d) Calling RegisterWaitForSingleObject() ", GetLastError()));
}
return(1);
}
}
#endif
if (!duk_is_number(ctx, 0)) { return(ILibDuktape_Error(ctx, "Invalid Descriptor")); }
ILibForceUnBlockChain(Duktape_GetChain(ctx));
duk_push_this(ctx); // [obj]
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Table); // [obj][table]
duk_push_object(ctx); // [obj][table][value]
duk_dup(ctx, 0); // [obj][table][value][key]
duk_dup(ctx, -2); // [obj][table][value][key][value]
ILibDuktape_EventEmitter *e = ILibDuktape_EventEmitter_Create(ctx);
ILibDuktape_EventEmitter_CreateEventEx(e, "readset");
ILibDuktape_EventEmitter_CreateEventEx(e, "writeset");
ILibDuktape_EventEmitter_CreateEventEx(e, "errorset");
duk_dup(ctx, 0); // [obj][table][value][key][value][FD]
duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_FD); // [obj][table][value][key][value]
duk_dup(ctx, 1); duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_Options);
duk_put_prop(ctx, -4); // [obj][table][value]
return(1);
}
duk_ret_t ILibDuktape_DescriptorEvents_Finalizer(duk_context *ctx)
{
ILibChain_Link *link = (ILibChain_Link*)Duktape_GetPointerProperty(ctx, 0, ILibDuktape_DescriptorEvents_ChainLink);
void *chain = Duktape_GetChain(ctx);
link->PreSelectHandler = NULL;
link->PostSelectHandler = NULL;
((void**)link->ExtraMemoryPtr)[0] = NULL;
((void**)link->ExtraMemoryPtr)[1] = NULL;
if (ILibIsChainBeingDestroyed(chain) == 0)
{
ILibChain_SafeRemove(chain, link);
}
return(0);
}
void ILibDuktape_DescriptorEvents_Push(duk_context *ctx, void *chain)
{
ILibChain_Link *link = (ILibChain_Link*)ILibChain_Link_Allocate(sizeof(ILibChain_Link), 2 * sizeof(void*));
link->MetaData = "ILibDuktape_DescriptorEvents";
link->PreSelectHandler = ILibDuktape_DescriptorEvents_PreSelect;
link->PostSelectHandler = ILibDuktape_DescriptorEvents_PostSelect;
duk_push_object(ctx);
duk_push_pointer(ctx, link); duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_ChainLink);
duk_push_object(ctx); duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_Table);
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_DescriptorEvents_Finalizer);
((void**)link->ExtraMemoryPtr)[0] = ctx;
((void**)link->ExtraMemoryPtr)[1] = duk_get_heapptr(ctx, -1);
ILibDuktape_CreateInstanceMethod(ctx, "addDescriptor", ILibDuktape_DescriptorEvents_Add, 2);
ILibDuktape_CreateInstanceMethod(ctx, "removeDescriptor", ILibDuktape_DescriptorEvents_Remove, 1);
ILibAddToChain(chain, link);
}
duk_ret_t ILibDuktape_Polyfills_filehash(duk_context *ctx)
{
char *hash = duk_push_fixed_buffer(ctx, UTIL_SHA384_HASHSIZE);
duk_push_buffer_object(ctx, -1, 0, UTIL_SHA384_HASHSIZE, DUK_BUFOBJ_NODEJS_BUFFER);
if (GenerateSHA384FileHash((char*)duk_require_string(ctx, 0), hash) == 0)
{
return(1);
}
else
{
return(ILibDuktape_Error(ctx, "Error generating FileHash "));
}
}
duk_ret_t ILibDuktape_Polyfills_ipv4From(duk_context *ctx)
{
int v = duk_require_int(ctx, 0);
ILibDuktape_IPV4AddressToOptions(ctx, v);
duk_get_prop_string(ctx, -1, "host");
return(1);
}
duk_ret_t ILibDuktape_Polyfills_global(duk_context *ctx)
{
duk_push_global_object(ctx);
return(1);
}
duk_ret_t ILibDuktape_Polyfills_isBuffer(duk_context *ctx)
{
duk_push_boolean(ctx, duk_is_buffer_data(ctx, 0));
return(1);
}
void ILibDuktape_uuidv4_Push(duk_context *ctx, void *chain)
{
duk_push_object(ctx);
char uuid[] = "module.exports = function uuidv4()\
{\
var b = Buffer.alloc(16);\
b.randomFill();\
var v = b.readUInt16BE(6) & 0xF1F;\
v |= (4 << 12);\
v |= (4 << 5);\
b.writeUInt16BE(v, 6);\
var ret = b.slice(0, 4).toString('hex') + '-' + b.slice(4, 6).toString('hex') + '-' + b.slice(6, 8).toString('hex') + '-' + b.slice(8, 10).toString('hex') + '-' + b.slice(10).toString('hex');\
ret = '{' + ret.toLowerCase() + '}';\
return (ret);\
};";
ILibDuktape_ModSearch_AddHandler_AlsoIncludeJS(ctx, uuid, sizeof(uuid) - 1);
}
void ILibDuktape_Polyfills_Init(duk_context *ctx)
{
ILibDuktape_ModSearch_AddHandler(ctx, "queue", ILibDuktape_Queue_Push);
ILibDuktape_ModSearch_AddHandler(ctx, "DynamicBuffer", ILibDuktape_DynamicBuffer_Push);
ILibDuktape_ModSearch_AddHandler(ctx, "stream", ILibDuktape_Stream_Init);
ILibDuktape_ModSearch_AddHandler(ctx, "http-headers", ILibDuktape_httpHeaders_PUSH);
#ifndef MICROSTACK_NOTLS
ILibDuktape_ModSearch_AddHandler(ctx, "pkcs7", ILibDuktape_PKCS7_Push);
#endif
#ifndef MICROSTACK_NOTLS
ILibDuktape_ModSearch_AddHandler(ctx, "bignum", ILibDuktape_bignum_Push);
ILibDuktape_ModSearch_AddHandler(ctx, "dataGenerator", ILibDuktape_dataGenerator_Push);
#endif
ILibDuktape_ModSearch_AddHandler(ctx, "ChainViewer", ILibDuktape_ChainViewer_Push);
ILibDuktape_ModSearch_AddHandler(ctx, "DescriptorEvents", ILibDuktape_DescriptorEvents_Push);
ILibDuktape_ModSearch_AddHandler(ctx, "uuid/v4", ILibDuktape_uuidv4_Push);
// Global Polyfills
duk_push_global_object(ctx); // [g]
ILibDuktape_WriteID(ctx, "Global");
ILibDuktape_Polyfills_Array(ctx);
ILibDuktape_Polyfills_String(ctx);
ILibDuktape_Polyfills_Buffer(ctx);
ILibDuktape_Polyfills_Console(ctx);
ILibDuktape_Polyfills_byte_ordering(ctx);
ILibDuktape_Polyfills_timer(ctx);
ILibDuktape_Polyfills_object(ctx);
ILibDuktape_CreateInstanceMethod(ctx, "addModuleObject", ILibDuktape_Polyfills_addModuleObject, 2);
ILibDuktape_CreateInstanceMethod(ctx, "addModule", ILibDuktape_Polyfills_addModule, 2);
ILibDuktape_CreateInstanceMethod(ctx, "getJSModule", ILibDuktape_Polyfills_getJSModule, 1);
ILibDuktape_CreateInstanceMethod(ctx, "_debugCrash", ILibDuktape_Polyfills_debugCrash, 0);
ILibDuktape_CreateInstanceMethod(ctx, "_debugGC", ILibDuktape_Polyfills_debugGC, 0);
ILibDuktape_CreateInstanceMethod(ctx, "_debug", ILibDuktape_Polyfills_debug, 0);
ILibDuktape_CreateInstanceMethod(ctx, "getSHA384FileHash", ILibDuktape_Polyfills_filehash, 1);
ILibDuktape_CreateInstanceMethod(ctx, "_ipv4From", ILibDuktape_Polyfills_ipv4From, 1);
ILibDuktape_CreateInstanceMethod(ctx, "_isBuffer", ILibDuktape_Polyfills_isBuffer, 1);
#ifndef MICROSTACK_NOTLS
ILibDuktape_CreateInstanceMethod(ctx, "crc32c", ILibDuktape_Polyfills_crc32c, DUK_VARARGS);
#endif
ILibDuktape_CreateEventWithGetter(ctx, "global", ILibDuktape_Polyfills_global);
duk_pop(ctx); // ...
ILibDuktape_Debugger_Init(ctx, 9091);
}
#ifdef __DOXY__
/*!
\brief String
*/
class String
{
public:
/*!
\brief Finds a String within another String
\param str \<String\> Substring to search for
\return <Integer> Index of where the string was found. -1 if not found
*/
Integer indexOf(str);
/*!
\brief Extracts a String from a String.
\param startIndex <Integer> Starting index to extract
\param length <Integer> Number of characters to extract
\return \<String\> extracted String
*/
String substr(startIndex, length);
/*!
\brief Extracts a String from a String.
\param startIndex <Integer> Starting index to extract
\param endIndex <Integer> Ending index to extract
\return \<String\> extracted String
*/
String splice(startIndex, endIndex);
/*!
\brief Split String into substrings
\param str \<String\> Delimiter to split on
\return Array of Tokens
*/
Array<String> split(str);
/*!
\brief Determines if a String starts with the given substring
\param str \<String\> substring
\return <boolean> True, if this String starts with the given substring
*/
boolean startsWith(str);
};
/*!
\brief Instances of the Buffer class are similar to arrays of integers but correspond to fixed-sized, raw memory allocations.
*/
class Buffer
{
public:
/*!
\brief Create a new Buffer instance of the specified number of bytes
\param size <integer>
\return \<Buffer\> new Buffer instance
*/
Buffer(size);
/*!
\brief Returns the amount of memory allocated in bytes
*/
integer length;
/*!
\brief Creates a new Buffer instance from an encoded String
\param str \<String\> encoded String
\param encoding \<String\> Encoding. Can be either 'base64' or 'hex'
\return \<Buffer\> new Buffer instance
*/
static Buffer from(str, encoding);
/*!
\brief Decodes Buffer to a String
\param encoding \<String\> Optional. Can be either 'base64' or 'hex'. If not specified, will just encode as an ANSI string
\param start <integer> Optional. Starting offset. <b>Default:</b> 0
\param end <integer> Optional. Ending offset (not inclusive) <b>Default:</b> buffer length
\return \<String\> Encoded String
*/
String toString([encoding[, start[, end]]]);
/*!
\brief Returns a new Buffer that references the same memory as the original, but offset and cropped by the start and end indices.
\param start <integer> Where the new Buffer will start. <b>Default:</b> 0
\param end <integer> Where the new Buffer will end. (Not inclusive) <b>Default:</b> buffer length
\return \<Buffer\>
*/
Buffer slice([start[, end]]);
};
/*!
\brief Console
*/
class Console
{
public:
/*!
\brief Serializes the input parameters to the Console Display
\param args <any>
*/
void log(...args);
};
/*!
\brief Global Timer Methods
*/
class Timers
{
public:
/*!
\brief Schedules the "immediate" execution of the callback after I/O events' callbacks.
\param callback <func> Function to call at the end of the event loop
\param args <any> Optional arguments to pass when the callback is called
\return Immediate for use with clearImmediate().
*/
Immediate setImmediate(callback[, ...args]);
/*!
\brief Schedules execution of a one-time callback after delay milliseconds.
\param callback <func> Function to call when the timeout elapses
\param args <any> Optional arguments to pass when the callback is called
\return Timeout for use with clearTimeout().
*/
Timeout setTimeout(callback, delay[, ...args]);
/*!
\brief Schedules repeated execution of callback every delay milliseconds.
\param callback <func> Function to call when the timer elapses
\param args <any> Optional arguments to pass when the callback is called
\return Timeout for use with clearInterval().
*/
Timeout setInterval(callback, delay[, ...args]);
/*!
\brief Cancels a Timeout returned by setTimeout()
\param timeout Timeout
*/
void clearTimeout(timeout);
/*!
\brief Cancels a Timeout returned by setInterval()
\param interval Timeout
*/
void clearInterval(interval);
/*!
\brief Cancels an Immediate returned by setImmediate()
\param immediate Immediate
*/
void clearImmediate(immediate);
/*!
\brief Scheduled Timer
*/
class Timeout
{
public:
};
/*!
\implements Timeout
\brief Scheduled Immediate
*/
class Immediate
{
public:
};
};
/*!
\brief Global methods for byte ordering manipulation
*/
class BytesOrdering
{
public:
/*!
\brief Converts 2 bytes from network order to host order
\param buffer \<Buffer\> bytes to convert
\param offset <integer> offset to start
\return <integer> host order value
*/
static integer ntohs(buffer, offset);
/*!
\brief Converts 4 bytes from network order to host order
\param buffer \<Buffer\> bytes to convert
\param offset <integer> offset to start
\return <integer> host order value
*/
static integer ntohl(buffer, offset);
/*!
\brief Writes 2 bytes in network order
\param buffer \<Buffer\> Buffer to write to
\param offset <integer> offset to start writing
\param val <integer> host order value to write
*/
static void htons(buffer, offset, val);
/*!
\brief Writes 4 bytes in network order
\param buffer \<Buffer\> Buffer to write to
\param offset <integer> offset to start writing
\param val <integer> host order value to write
*/
static void htonl(buffer, offset, val);
};
#endif