From eba7419fc925d8a20cab2029c22c0ad5d510afa1 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Tue, 19 May 2020 01:14:18 -0700 Subject: [PATCH] 1. Set upperbound on number of Windows WaitHandles 2. Fixed Windows_IPC to DisconnectNamedPipe() on connected handled when 'end' is called 3. Fixed Windispatch to terminate on when close is emitted --- microscript/ILibDuktape_Polyfills.c | 4 ++-- microscript/ILibDuktape_net.c | 6 +++++- microstack/ILibParsers.c | 31 ++++++++++++++++------------- modules/promise.js | 6 ++++++ modules/win-dispatcher.js | 3 +++ 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 84c9c09..2097cb3 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2073,7 +2073,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *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());"); + duk_peval_string_noresult(ctx, "addModule('promise', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgcmVmVGFibGUgPSB7fTsNCg0KZnVuY3Rpb24gZXZlbnRfc3dpdGNoZXJfaGVscGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQsIGZvcndhcmQpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAnZXZlbnRfc3dpdGNoZXInOw0KICAgIHRoaXMuZnVuYyA9IGZ1bmN0aW9uIGZ1bmMoKQ0KICAgIHsNCiAgICAgICAgdmFyIGFyZ3MgPSBbXTsNCiAgICAgICAgaWYgKGZ1bmMuZm9yd2FyZCAhPSBudWxsKSB7IGFyZ3MucHVzaChmdW5jLmZvcndhcmQpOyB9DQogICAgICAgIGZvcih2YXIgaSBpbiBhcmd1bWVudHMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAoZnVuYy50YXJnZXQuYXBwbHkoZnVuYy5kZXNpcmVkLCBhcmdzKSk7DQogICAgfTsNCiAgICB0aGlzLmZ1bmMuZGVzaXJlZCA9IGRlc2lyZWRfY2FsbGVlOw0KICAgIHRoaXMuZnVuYy50YXJnZXQgPSB0YXJnZXQ7DQogICAgdGhpcy5mdW5jLmZvcndhcmQgPSBmb3J3YXJkOw0KICAgIHRoaXMuZnVuYy5zZWxmID0gdGhpczsNCn0NCmZ1bmN0aW9uIGV2ZW50X3N3aXRjaGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQpDQp7DQogICAgcmV0dXJuIChuZXcgZXZlbnRfc3dpdGNoZXJfaGVscGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQpKTsNCn0NCg0KZnVuY3Rpb24gZXZlbnRfZm9yd2FyZGVyKHNvdXJjZU9iaiwgc291cmNlTmFtZSwgdGFyZ2V0T2JqLCB0YXJnZXROYW1lKQ0Kew0KICAgIHNvdXJjZU9iai5vbihzb3VyY2VOYW1lLCAgIChuZXcgZXZlbnRfc3dpdGNoZXJfaGVscGVyKHRhcmdldE9iaiwgdGFyZ2V0T2JqLmVtaXQsIHRhcmdldE5hbWUpKS5mdW5jKTsgICAgICANCn0NCg0KZnVuY3Rpb24gUHJvbWlzZShwcm9taXNlRnVuYykNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdwcm9taXNlJzsNCiAgICB0aGlzLnByb21pc2UgPSB0aGlzOw0KICAgIHRoaXMuX2ludGVybmFsID0geyBfT2JqZWN0SUQ6ICdwcm9taXNlLmludGVybmFsJywgcHJvbWlzZTogdGhpcywgZnVuYzogcHJvbWlzZUZ1bmMsIGNvbXBsZXRlZDogZmFsc2UsIGVycm9yczogZmFsc2UsIGNvbXBsZXRlZEFyZ3M6IFtdIH07DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcy5faW50ZXJuYWwpOw0KICAgIHRoaXMuX2ludGVybmFsLm9uKCduZXdMaXN0ZW5lcicsIGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2spDQogICAgew0KICAgICAgICAvL2NvbnNvbGUubG9nKCduZXdMaXN0ZW5lcicsIGV2ZW50TmFtZSwgJ2Vycm9ycy8nICsgdGhpcy5lcnJvcnMgKyAnIGNvbXBsZXRlZC8nICsgdGhpcy5jb21wbGV0ZWQpOw0KICAgICAgICB2YXIgciA9IG51bGw7DQoNCiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PSAncmVzb2x2ZWQnICYmICF0aGlzLmVycm9ycyAmJiB0aGlzLmNvbXBsZXRlZCkNCiAgICAgICAgew0KICAgICAgICAgICAgciA9IGV2ZW50Q2FsbGJhY2suYXBwbHkodGhpcywgdGhpcy5jb21wbGV0ZWRBcmdzKTsNCiAgICAgICAgICAgIGlmKHIhPW51bGwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5lbWl0X3JldHVyblZhbHVlKCdyZXNvbHZlZCcsIHIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChldmVudE5hbWUgPT0gJ3JlamVjdGVkJyAmJiB0aGlzLmVycm9ycyAmJiB0aGlzLmNvbXBsZXRlZCkNCiAgICAgICAgew0KICAgICAgICAgICAgZXZlbnRDYWxsYmFjay5hcHBseSh0aGlzLCB0aGlzLmNvbXBsZXRlZEFyZ3MpOw0KICAgICAgICB9DQogICAgICAgIGlmIChldmVudE5hbWUgPT0gJ3NldHRsZWQnICYmIHRoaXMuY29tcGxldGVkKQ0KICAgICAgICB7DQogICAgICAgICAgICBldmVudENhbGxiYWNrLmFwcGx5KHRoaXMsIFtdKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHRoaXMuX2ludGVybmFsLnJlc29sdmVyID0gZnVuY3Rpb24gX3Jlc29sdmVyKCkNCiAgICB7DQogICAgICAgIGlmIChfcmVzb2x2ZXIuX3NlbGYuY29tcGxldGVkKSB7IHJldHVybjsgfQ0KICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuZXJyb3JzID0gZmFsc2U7DQogICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWQgPSB0cnVlOw0KICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuY29tcGxldGVkQXJncyA9IFtdOw0KICAgICAgICB2YXIgYXJncyA9IFsncmVzb2x2ZWQnXTsNCiAgICAgICAgaWYgKHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSAmJiB0aGlzLmVtaXRfcmV0dXJuVmFsdWUoJ3Jlc29sdmVkJykgIT0gbnVsbCkNCiAgICAgICAgew0KICAgICAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmNvbXBsZXRlZEFyZ3MucHVzaCh0aGlzLmVtaXRfcmV0dXJuVmFsdWUoJ3Jlc29sdmVkJykpOw0KICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSgncmVzb2x2ZWQnKSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3IgKHZhciBhIGluIGFyZ3VtZW50cykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuY29tcGxldGVkQXJncy5wdXNoKGFyZ3VtZW50c1thXSk7DQogICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1thXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmVtaXQuYXBwbHkoX3Jlc29sdmVyLl9zZWxmLCBhcmdzKTsNCiAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmVtaXQoJ3NldHRsZWQnKTsNCiAgICB9Ow0KICAgIHRoaXMuX2ludGVybmFsLnJlamVjdG9yID0gZnVuY3Rpb24gX3JlamVjdG9yKCkNCiAgICB7DQogICAgICAgIGlmIChfcmVqZWN0b3IuX3NlbGYuY29tcGxldGVkKSB7IHJldHVybjsgfQ0KICAgICAgICBfcmVqZWN0b3IuX3NlbGYuZXJyb3JzID0gdHJ1ZTsNCiAgICAgICAgX3JlamVjdG9yLl9zZWxmLmNvbXBsZXRlZCA9IHRydWU7DQogICAgICAgIF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWRBcmdzID0gW107DQogICAgICAgIHZhciBhcmdzID0gWydyZWplY3RlZCddOw0KICAgICAgICBmb3IgKHZhciBhIGluIGFyZ3VtZW50cykNCiAgICAgICAgew0KICAgICAgICAgICAgX3JlamVjdG9yLl9zZWxmLmNvbXBsZXRlZEFyZ3MucHVzaChhcmd1bWVudHNbYV0pOw0KICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1thXSk7DQogICAgICAgIH0NCg0KICAgICAgICBfcmVqZWN0b3IuX3NlbGYuZW1pdC5hcHBseShfcmVqZWN0b3IuX3NlbGYsIGFyZ3MpOw0KICAgICAgICBfcmVqZWN0b3IuX3NlbGYuZW1pdCgnc2V0dGxlZCcpOw0KICAgIH07DQogICAgdGhpcy5jYXRjaCA9IGZ1bmN0aW9uKGZ1bmMpDQogICAgew0KICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdyZWplY3RlZCcsIGV2ZW50X3N3aXRjaGVyKHRoaXMsIGZ1bmMpLmZ1bmMpOw0KICAgIH0NCiAgICB0aGlzLmZpbmFsbHkgPSBmdW5jdGlvbiAoZnVuYykNCiAgICB7DQogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3NldHRsZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCBmdW5jKS5mdW5jKTsNCiAgICB9Ow0KICAgIHRoaXMudGhlbiA9IGZ1bmN0aW9uIChyZXNvbHZlZCwgcmVqZWN0ZWQpDQogICAgew0KICAgICAgICBpZiAocmVzb2x2ZWQpIHsgdGhpcy5faW50ZXJuYWwub25jZSgncmVzb2x2ZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCByZXNvbHZlZCkuZnVuYyk7IH0NCiAgICAgICAgaWYgKHJlamVjdGVkKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdyZWplY3RlZCcsIGV2ZW50X3N3aXRjaGVyKHRoaXMsIHJlamVjdGVkKS5mdW5jKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3JlamVjdGVkJywgZnVuY3Rpb24gKGUpIHsgcHJvY2Vzcy5lbWl0KCd1bmNhdWdodEV4Y2VwdGlvbicsICdwcm9taXNlLnVuaGFuZGxlZFJlamVjdGlvbjogJyArIGUpOyB9KTsNCiAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB2YXIgcmV0VmFsID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIGopIHsgfSk7DQogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3Jlc29sdmVkJywgcmV0VmFsLl9pbnRlcm5hbC5yZXNvbHZlcik7DQogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3JlamVjdGVkJywgcmV0VmFsLl9pbnRlcm5hbC5yZWplY3Rvcik7DQogICAgICAgIHJldFZhbC5wYXJlbnRQcm9taXNlID0gdGhpczsNCiAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgIH07DQoNCiAgICB0aGlzLl9pbnRlcm5hbC5yZXNvbHZlci5fc2VsZiA9IHRoaXMuX2ludGVybmFsOw0KICAgIHRoaXMuX2ludGVybmFsLnJlamVjdG9yLl9zZWxmID0gdGhpcy5faW50ZXJuYWw7Ow0KDQogICAgdHJ5DQogICAgew0KICAgICAgICBwcm9taXNlRnVuYy5jYWxsKHRoaXMsIHRoaXMuX2ludGVybmFsLnJlc29sdmVyLCB0aGlzLl9pbnRlcm5hbC5yZWplY3Rvcik7DQogICAgfQ0KICAgIGNhdGNoKGUpDQogICAgew0KICAgICAgICB0aGlzLl9pbnRlcm5hbC5lcnJvcnMgPSB0cnVlOw0KICAgICAgICB0aGlzLl9pbnRlcm5hbC5jb21wbGV0ZWQgPSB0cnVlOw0KICAgICAgICB0aGlzLl9pbnRlcm5hbC5jb21wbGV0ZWRBcmdzID0gW2VdOw0KICAgICAgICB0aGlzLl9pbnRlcm5hbC5lbWl0KCdyZWplY3RlZCcsIGUpOw0KICAgICAgICB0aGlzLl9pbnRlcm5hbC5lbWl0KCdzZXR0bGVkJyk7DQogICAgfQ0KDQogICAgaWYoIXRoaXMuX2ludGVybmFsLmNvbXBsZXRlZCkNCiAgICB7DQogICAgICAgIC8vIFNhdmUgcmVmZXJlbmNlIG9mIHRoaXMgb2JqZWN0DQogICAgICAgIHJlZlRhYmxlW3RoaXMuX2ludGVybmFsLl9oYXNoQ29kZSgpXSA9IHRoaXMuX2ludGVybmFsOw0KICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdzZXR0bGVkJywgZnVuY3Rpb24gKCkgeyByZWZUYWJsZVt0aGlzLl9oYXNoQ29kZSgpXSA9IG51bGw7IH0pOw0KICAgIH0NCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgImNvbXBsZXRlZCIsIHsNCiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2ludGVybmFsLmNvbXBsZXRlZCk7DQogICAgICAgIH0NCiAgICB9KTsNCn0NCg0KUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZSgpDQp7DQogICAgdmFyIHJldFZhbCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBqKSB7IH0pOw0KICAgIHZhciBhcmdzID0gW107DQogICAgZm9yICh2YXIgaSBpbiBhcmd1bWVudHMpDQogICAgew0KICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsNCiAgICB9DQogICAgcmV0VmFsLl9pbnRlcm5hbC5yZXNvbHZlci5hcHBseShyZXRWYWwuX2ludGVybmFsLCBhcmdzKTsNCiAgICByZXR1cm4gKHJldFZhbCk7DQp9Ow0KUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbiByZWplY3QoKSB7DQogICAgdmFyIHJldFZhbCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBqKSB7IH0pOw0KICAgIHZhciBhcmdzID0gW107DQogICAgZm9yICh2YXIgaSBpbiBhcmd1bWVudHMpIHsNCiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7DQogICAgfQ0KICAgIHJldFZhbC5faW50ZXJuYWwucmVqZWN0b3IuYXBwbHkocmV0VmFsLl9pbnRlcm5hbCwgYXJncyk7DQogICAgcmV0dXJuIChyZXRWYWwpOw0KfTsNClByb21pc2UuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VMaXN0KQ0Kew0KICAgIHZhciByZXQgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopDQogICAgew0KICAgICAgICB0aGlzLl9fcmVqZWN0b3IgPSByZWo7DQogICAgICAgIHRoaXMuX19yZXNvbHZlciA9IHJlczsNCiAgICAgICAgdGhpcy5fX3Byb21pc2VMaXN0ID0gcHJvbWlzZUxpc3Q7DQogICAgICAgIHRoaXMuX19kb25lID0gZmFsc2U7DQogICAgICAgIHRoaXMuX19jb3VudCA9IDA7DQogICAgfSk7DQoNCiAgICBmb3IgKHZhciBpIGluIHByb21pc2VMaXN0KQ0KICAgIHsNCiAgICAgICAgcHJvbWlzZUxpc3RbaV0udGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBTdWNjZXNzDQogICAgICAgICAgICBpZigrK3JldC5fX2NvdW50ID09IHJldC5fX3Byb21pc2VMaXN0Lmxlbmd0aCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQuX19kb25lID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICByZXQuX19yZXNvbHZlcihyZXQuX19wcm9taXNlTGlzdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sIGZ1bmN0aW9uIChhcmcpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEZhaWx1cmUNCiAgICAgICAgICAgIGlmKCFyZXQuX19kb25lKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldC5fX2RvbmUgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHJldC5fX3JlamVjdG9yKGFyZyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCiAgICBpZiAocHJvbWlzZUxpc3QubGVuZ3RoID09IDApDQogICAgew0KICAgICAgICByZXQuX19yZXNvbHZlcihwcm9taXNlTGlzdCk7DQogICAgfQ0KICAgIHJldHVybiAocmV0KTsNCn07DQoNCm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTsNCm1vZHVsZS5leHBvcnRzLmV2ZW50X3N3aXRjaGVyID0gZXZlbnRfc3dpdGNoZXI7DQptb2R1bGUuZXhwb3J0cy5ldmVudF9mb3J3YXJkZXIgPSBldmVudF9mb3J3YXJkZXI7', '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 @@ -2093,7 +2093,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) 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('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGRpc3BhdGNoKG9wdGlvbnMpDQp7DQogICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm1vZHVsZXMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICB2YXIgaXBjSW50ZWdlcg0KICAgIHZhciByZXQgPSB7IG9wdGlvbnM6IG9wdGlvbnMgfTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpLmNyZWF0ZUV2ZW50KCdjb25uZWN0aW9uJyk7DQoNCiAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMyID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjMi5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICByZXQuX2lwYzIub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCg0KICAgIHdoaWxlICh0cnVlKQ0KICAgIHsNCiAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOw0KICAgICAgICANCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5faXBjLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCwgd3JpdGFibGVBbGw6IHRydWUgfSk7DQogICAgICAgICAgICByZXQuX2lwYzIubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoICsgJ0MnLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoICh4KQ0KICAgICAgICB7DQogICAgICAgIH0NCiAgICB9DQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsNCiAgICByZXQuX2lwYzIub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQ0KICAgIHsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NvbnRyb2wgPSBzOw0KICAgICAgICB0aGlzLnBhcmVudC5fY29udHJvbC5fcGFyZW50ID0gdGhpczsNCiAgICAgICAgdGhpcy5wYXJlbnQuaW52b2tlID0gZnVuY3Rpb24gKG1ldGhvZCwgYXJncykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQogICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnaW52b2tlJywgdmFsdWU6IHsgbWV0aG9kOiBtZXRob2QsIGFyZ3M6IGFyZ3MgfSB9KSk7DQogICAgICAgICAgICBoLndyaXRlVUludDMyTEUoZC5sZW5ndGggKyA0KTsNCiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wud3JpdGUoaCk7DQogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGQpOw0KICAgICAgICB9Ow0KICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOw0KICAgIH0pOw0KICAgIHJldC5faXBjLm9uY2UoJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiBvbkNvbm5lY3QocykNCiAgICB7DQogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOw0KICAgICAgICB0aGlzLnBhcmVudC5fY2xpZW50Ll9wYXJlbnQgPSB0aGlzOw0KICAgICAgICB2YXIgZCwgaCA9IEJ1ZmZlci5hbGxvYyg0KTsNCg0KICAgICAgICBmb3IgKHZhciBtIGluIHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsNCiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgcy53cml0ZShoKTsNCiAgICAgICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIH0NCiAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2xhdW5jaCcsIHZhbHVlOiB7IG1vZHVsZTogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubW9kdWxlLCBtZXRob2Q6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1ldGhvZCwgYXJnczogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2guYXJncyB9IH0pKTsNCiAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgIHMud3JpdGUoaCk7DQogICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIHMub25jZSgnZW5kJywgZnVuY3Rpb24gKCkgeyB0aGlzLl9wYXJlbnQuY2xvc2UoKTsgfSk7DQogICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpb24nLCBzKTsNCiAgICB9KTsNCg0KICAgIHZhciBwYXJtcyA9ICcvQyBTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwICc7DQogICAgaWYgKG9wdGlvbnMudXNlcikNCiAgICB7DQogICAgICAgIC8vIFNwZWNpZmllZCBVc2VyDQogICAgICAgIHBhcm1zICs9ICgnL1JVICcgKyBvcHRpb25zLnVzZXIgKyAnICcpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpLnRzaWQgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1JVIFNZU1RFTSAnKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBwYXJtcyArPSAoJy9UUiAiXFwiJyArIHByb2Nlc3MuZXhlY1BhdGggKyAnXFwiIC1iNjRleGVjICcgKyBzdHIgKyAnIicpOw0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgW3Bhcm1zXSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOw0KICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvUlVOIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG5leGl0XHJcbicpOw0KDQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gY29ubmVjdChpcGMpDQp7DQogICAgdmFyIGlwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjOw0KICAgIGdsb2JhbC5pcGMyQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggKyAnQycgfSwgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7DQogICAgICAgICAgICBzd2l0Y2ggKGNtZC5jb21tYW5kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2ludm9rZSc6DQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW1bY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkoZ2xvYmFsLl9wcm94eVN0cmVhbSwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgfSk7DQogICAgfSk7DQogICAgZ2xvYmFsLmlwY0NsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoIH0sIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjTGVuID0gYy5yZWFkVUludDMyTEUoMCk7DQogICAgICAgICAgICBpZiAoY0xlbiA+IGMubGVuZ3RoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMudW5zaGlmdChjKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdhZGRNb2R1bGUnOg0KICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGUoY21kLnZhbHVlLm5hbWUsIGNtZC52YWx1ZS5qcyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2xhdW5jaCc6DQogICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSByZXF1aXJlKGNtZC52YWx1ZS5tb2R1bGUpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtLnBpcGUodGhpcywgeyBlbmQ6IGZhbHNlIH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBpcGUoZ2xvYmFsLl9wcm94eVN0cmVhbSwgeyBlbmQ6IGZhbHNlIH0pOw0KDQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KfQ0KDQptb2R1bGUuZXhwb3J0cyA9IHsgZGlzcGF0Y2g6IGRpc3BhdGNoLCBjb25uZWN0OiBjb25uZWN0IH07DQoNCg==', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGRpc3BhdGNoKG9wdGlvbnMpDQp7DQogICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm1vZHVsZXMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICB2YXIgaXBjSW50ZWdlcg0KICAgIHZhciByZXQgPSB7IG9wdGlvbnM6IG9wdGlvbnMgfTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpLmNyZWF0ZUV2ZW50KCdjb25uZWN0aW9uJyk7DQoNCiAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMyID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjMi5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICByZXQuX2lwYzIub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCg0KICAgIHdoaWxlICh0cnVlKQ0KICAgIHsNCiAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOw0KICAgICAgICANCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5faXBjLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCwgd3JpdGFibGVBbGw6IHRydWUgfSk7DQogICAgICAgICAgICByZXQuX2lwYzIubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoICsgJ0MnLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoICh4KQ0KICAgICAgICB7DQogICAgICAgIH0NCiAgICB9DQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsNCiAgICByZXQuX2lwYzIub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQ0KICAgIHsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NvbnRyb2wgPSBzOw0KICAgICAgICB0aGlzLnBhcmVudC5fY29udHJvbC5fcGFyZW50ID0gdGhpczsNCiAgICAgICAgdGhpcy5wYXJlbnQuaW52b2tlID0gZnVuY3Rpb24gKG1ldGhvZCwgYXJncykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQogICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnaW52b2tlJywgdmFsdWU6IHsgbWV0aG9kOiBtZXRob2QsIGFyZ3M6IGFyZ3MgfSB9KSk7DQogICAgICAgICAgICBoLndyaXRlVUludDMyTEUoZC5sZW5ndGggKyA0KTsNCiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wud3JpdGUoaCk7DQogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGQpOw0KICAgICAgICB9Ow0KICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOw0KICAgIH0pOw0KICAgIHJldC5faXBjLm9uY2UoJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiBvbkNvbm5lY3QocykNCiAgICB7DQogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOw0KICAgICAgICB0aGlzLnBhcmVudC5fY2xpZW50Ll9wYXJlbnQgPSB0aGlzOw0KICAgICAgICB2YXIgZCwgaCA9IEJ1ZmZlci5hbGxvYyg0KTsNCg0KICAgICAgICBmb3IgKHZhciBtIGluIHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsNCiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgcy53cml0ZShoKTsNCiAgICAgICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIH0NCiAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2xhdW5jaCcsIHZhbHVlOiB7IG1vZHVsZTogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubW9kdWxlLCBtZXRob2Q6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1ldGhvZCwgYXJnczogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2guYXJncyB9IH0pKTsNCiAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgIHMud3JpdGUoaCk7DQogICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIHMub25jZSgnZW5kJywgZnVuY3Rpb24gKCkgeyB0aGlzLl9wYXJlbnQuY2xvc2UoKTsgfSk7DQogICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpb24nLCBzKTsNCiAgICB9KTsNCg0KICAgIHZhciBwYXJtcyA9ICcvQyBTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwICc7DQogICAgaWYgKG9wdGlvbnMudXNlcikNCiAgICB7DQogICAgICAgIC8vIFNwZWNpZmllZCBVc2VyDQogICAgICAgIHBhcm1zICs9ICgnL1JVICcgKyBvcHRpb25zLnVzZXIgKyAnICcpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpLnRzaWQgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1JVIFNZU1RFTSAnKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBwYXJtcyArPSAoJy9UUiAiXFwiJyArIHByb2Nlc3MuZXhlY1BhdGggKyAnXFwiIC1iNjRleGVjICcgKyBzdHIgKyAnIicpOw0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgW3Bhcm1zXSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOw0KICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvUlVOIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG5leGl0XHJcbicpOw0KDQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gY29ubmVjdChpcGMpDQp7DQogICAgdmFyIGlwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjOw0KICAgIGdsb2JhbC5pcGMyQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggKyAnQycgfSwgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7DQogICAgICAgICAgICBzd2l0Y2ggKGNtZC5jb21tYW5kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2ludm9rZSc6DQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW1bY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkoZ2xvYmFsLl9wcm94eVN0cmVhbSwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgfSk7DQogICAgfSk7DQogICAgZ2xvYmFsLmlwY0NsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoIH0sIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjTGVuID0gYy5yZWFkVUludDMyTEUoMCk7DQogICAgICAgICAgICBpZiAoY0xlbiA+IGMubGVuZ3RoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMudW5zaGlmdChjKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdhZGRNb2R1bGUnOg0KICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGUoY21kLnZhbHVlLm5hbWUsIGNtZC52YWx1ZS5qcyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2xhdW5jaCc6DQogICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSByZXF1aXJlKGNtZC52YWx1ZS5tb2R1bGUpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtLnBpcGUodGhpcywgeyBlbmQ6IGZhbHNlIH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBpcGUoZ2xvYmFsLl9wcm94eVN0cmVhbSwgeyBlbmQ6IGZhbHNlIH0pOw0KDQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KICAgIGdsb2JhbC5pcGNDbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQogICAgZ2xvYmFsLmlwYzJDbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQp9DQoNCm1vZHVsZS5leHBvcnRzID0geyBkaXNwYXRjaDogZGlzcGF0Y2gsIGNvbm5lY3Q6IGNvbm5lY3QgfTsNCg0K', '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); diff --git a/microscript/ILibDuktape_net.c b/microscript/ILibDuktape_net.c index b48401a..a8b3656 100644 --- a/microscript/ILibDuktape_net.c +++ b/microscript/ILibDuktape_net.c @@ -990,7 +990,11 @@ void ILibDuktape_net_server_IPC_EndSink(ILibDuktape_DuplexStream *stream, void * if (!ILibMemory_CanaryOK(user)) { return; } ILibDuktape_net_WindowsIPC *winIPC = (ILibDuktape_net_WindowsIPC*)user; - if (winIPC->mPipeHandle != NULL) { CloseHandle(winIPC->mPipeHandle); winIPC->mPipeHandle = NULL; } + if (winIPC->mPipeHandle != NULL) + { + if (winIPC->mServer != NULL) { DisconnectNamedPipe(winIPC->mPipeHandle); } + CloseHandle(winIPC->mPipeHandle); winIPC->mPipeHandle = NULL; + } if (winIPC->read_overlapped.hEvent != NULL) { CloseHandle(winIPC->read_overlapped.hEvent); winIPC->read_overlapped.hEvent = NULL; } if (winIPC->write_overlapped.hEvent != NULL) { CloseHandle(winIPC->write_overlapped.hEvent); winIPC->write_overlapped.hEvent = NULL; } diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 80f4a94..ca17d24 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -2167,23 +2167,26 @@ void ILibChain_SetupWindowsWaitObject(HANDLE* waitList, int *waitListCount, stru continue; } } - i = x++; - if (waitList[i] != NULL && waitList[ILibChain_HandleInfoIndex(i)] == NULL) + if (i + 1 < FD_SETSIZE) { - WSACloseEvent(waitList[i]); - } - waitList[i] = (HANDLE)ILibLinkedList_GetDataFromNode(node); - waitList[ILibChain_HandleInfoIndex(i)] = (HANDLE)ILibMemory_Extra(node); - if (((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_sec != 0 || ((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_usec != 0) - { - // Timeout was specified - if (tv2LTtv1(&expirationTime, &(((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration))) + i = x++; + if (waitList[i] != NULL && waitList[ILibChain_HandleInfoIndex(i)] == NULL) { - expirationTime.tv_sec = ((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_sec; - expirationTime.tv_usec = ((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_usec; + WSACloseEvent(waitList[i]); + } + waitList[i] = (HANDLE)ILibLinkedList_GetDataFromNode(node); + waitList[ILibChain_HandleInfoIndex(i)] = (HANDLE)ILibMemory_Extra(node); + if (((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_sec != 0 || ((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_usec != 0) + { + // Timeout was specified + if (tv2LTtv1(&expirationTime, &(((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration))) + { + expirationTime.tv_sec = ((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_sec; + expirationTime.tv_usec = ((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_usec; - // If the expiration happens in the past, we need to set the timeout to zero - if (tv2LTtv1(&expirationTime, ¤tTime)) { expirationTime.tv_sec = currentTime.tv_sec; expirationTime.tv_usec = currentTime.tv_usec; } + // If the expiration happens in the past, we need to set the timeout to zero + if (tv2LTtv1(&expirationTime, ¤tTime)) { expirationTime.tv_sec = currentTime.tv_sec; expirationTime.tv_usec = currentTime.tv_usec; } + } } } node = ILibLinkedList_GetNextNode(node); diff --git a/modules/promise.js b/modules/promise.js index 6f0c614..071b0d1 100644 --- a/modules/promise.js +++ b/modules/promise.js @@ -160,6 +160,12 @@ function Promise(promiseFunc) refTable[this._internal._hashCode()] = this._internal; this._internal.once('settled', function () { refTable[this._hashCode()] = null; }); } + Object.defineProperty(this, "completed", { + get: function () + { + return (this._internal.completed); + } + }); } Promise.resolve = function resolve() diff --git a/modules/win-dispatcher.js b/modules/win-dispatcher.js index cbc23a3..7918036 100644 --- a/modules/win-dispatcher.js +++ b/modules/win-dispatcher.js @@ -137,6 +137,7 @@ function connect(ipc) }); global.ipcClient = require('net').createConnection({ path: ipcPath }, function () { + this.on('close', function () { process.exit(); }); this.on('data', function (c) { var cLen = c.readUInt32LE(0); @@ -165,6 +166,8 @@ function connect(ipc) if (cLen < c.length) { this.unshift(c.slice(cLen)); } }); }); + global.ipcClient.on('error', function () { process.exit(); }); + global.ipc2Client.on('error', function () { process.exit(); }); } module.exports = { dispatch: dispatch, connect: connect };