From a70fe75883833984f8bcf3c2cc101e083360ee62 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Sun, 26 Apr 2020 16:30:22 -0700 Subject: [PATCH] Fixed bug where last storage record was ommited on linux --- microscript/ILibDuktape_Polyfills.c | 6 +++--- modules/identifiers.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 48d8a01..59344a0 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2217,9 +2217,9 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('agent-installer', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGluc3RhbGxTZXJ2aWNlKHBhcmFtcykNCnsNCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLi4uSW5zdGFsbGluZyBzZXJ2aWNlJyk7DQogICAgdHJ5DQogICAgew0KICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmluc3RhbGxTZXJ2aWNlKA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWU6IHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnLA0KICAgICAgICAgICAgICAgIHRhcmdldDogcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2hBZ2VudCcgOiAnbWVzaGFnZW50JywNCiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgYmFja2dyb3VuZCBzZXJ2aWNlJywNCiAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogcHJvY2Vzcy5leGVjUGF0aCwNCiAgICAgICAgICAgICAgICBzdGFydFR5cGU6ICdBVVRPX1NUQVJUJywNCiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgfQ0KICAgIGNhdGNoKHNpZSkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXSAnICsgc2llKTsNCiAgICAgICAgcHJvY2Vzcy5leGl0KCk7DQogICAgfQ0KICAgIHZhciBzdmMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybT09J3dpbjMyJz8nTWVzaCBBZ2VudCc6J21lc2hhZ2VudCcpOw0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgIHsNCiAgICAgICAgc3ZjLmxvYWQoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IHNldHRpbmcgdXAgbGF1bmNoIGFnZW50Li4uJyk7DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmluc3RhbGxMYXVuY2hBZ2VudCgNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtZXNoYWdlbnQnLA0KICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogc3ZjLmFwcExvY2F0aW9uKCksDQogICAgICAgICAgICAgICAgICAgIHN0YXJ0VHlwZTogJ0FVVE9fU1RBUlQnLA0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9uVHlwZXM6IFsnTG9naW5XaW5kb3cnXSwNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogWycta3ZtMSddDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKHNpZSkNCiAgICAgICAgew0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRVJST1JdICcgKyBzaWUpOw0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgew0KICAgICAgICB2YXIgbG9jID0gc3ZjLmFwcExvY2F0aW9uKCk7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBXcml0aW5nIGZpcmV3YWxsIHJ1bGVzIGZvciBNZXNoIEFnZW50IFNlcnZpY2UuLi4nKTsNCg0KICAgICAgICB2YXIgcnVsZSA9IA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lOiAnTWVzaCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMgKFRDUC0xKScsDQogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLA0KICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVENQJywNCiAgICAgICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTAsDQogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgTWFuYWdlbWVudCBUcmFmZmljJywNCiAgICAgICAgICAgICAgICBFZGdlVHJhdmVyc2FsUG9saWN5OiAnYWxsb3cnLA0KICAgICAgICAgICAgICAgIEVuYWJsZWQ6IHRydWUNCiAgICAgICAgICAgIH07DQogICAgICAgIHJlcXVpcmUoJ3dpbi1maXJld2FsbCcpLmFkZEZpcmV3YWxsUnVsZShydWxlKTsNCg0KICAgICAgICBydWxlID0gDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgRGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IE1hbmFnZW1lbnQgVHJhZmZpYyAoVENQLTIpJywNCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdpbmJvdW5kJywNCiAgICAgICAgICAgICAgICBQcm9ncmFtOiBsb2MsDQogICAgICAgICAgICAgICAgUHJvdG9jb2w6ICdUQ1AnLA0KICAgICAgICAgICAgICAgIFByb2ZpbGU6ICdQdWJsaWMsIFByaXZhdGUsIERvbWFpbicsDQogICAgICAgICAgICAgICAgTG9jYWxQb3J0OiAxNjk5MSwNCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogJ01lc2ggQ2VudHJhbCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMnLA0KICAgICAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICAgICAgRW5hYmxlZDogdHJ1ZQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOyANCg0KICAgICAgICBydWxlID0NCiAgICAgICAgew0KICAgICAgICAgICAgRGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IFBlZXItdG8tUGVlciBUcmFmZmljIChVRFAtMSknLA0KICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICBQcm9ncmFtOiBsb2MsDQogICAgICAgICAgICBQcm90b2NvbDogJ1VEUCcsDQogICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgTG9jYWxQb3J0OiAxNjk5MCwNCiAgICAgICAgICAgIERlc2NyaXB0aW9uOiAnTWVzaCBDZW50cmFsIEFnZW50IFBlZXItdG8tUGVlciBUcmFmZmljJywNCiAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICBFbmFibGVkOiB0cnVlDQogICAgICAgIH07DQogICAgICAgIHJlcXVpcmUoJ3dpbi1maXJld2FsbCcpLmFkZEZpcmV3YWxsUnVsZShydWxlKTsNCg0KICAgICAgICBydWxlID0NCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMgKFVEUC0yKScsDQogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLA0KICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVURQJywNCiAgICAgICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTEsDQogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMnLA0KICAgICAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICAgICAgRW5hYmxlZDogdHJ1ZQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOw0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgfQ0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBTdGFydGluZyBzZXJ2aWNlLi4uJyk7DQogICAgdHJ5DQogICAgew0KICAgICAgICBzdmMuc3RhcnQoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbT0tdXG4nKTsNCiAgICB9DQogICAgY2F0Y2goZWUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgIH0NCg0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpIHsgc3ZjLmNsb3NlKCk7IH0NCiAgICBwcm9jZXNzLmV4aXQoKTsNCn0NCg0KZnVuY3Rpb24gdW5pbnN0YWxsU2VydmljZTMocGFyYW1zKQ0Kew0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFVuaW5zdGFsbGluZyBsYXVuY2ggYWdlbnQuLi4nKTsNCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBsYXVuY2hhZ2VudCA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0TGF1bmNoQWdlbnQoJ21lc2hhZ2VudCcpOw0KICAgICAgICAgICAgbGF1bmNoYWdlbnQudW5sb2FkKCk7DQogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMobGF1bmNoYWdlbnQucGxpc3QpOw0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRE9ORV1cbicpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChlKQ0KICAgICAgICB7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChwYXJhbXMgIT0gbnVsbCkNCiAgICB7DQogICAgICAgIGluc3RhbGxTZXJ2aWNlKHBhcmFtcyk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHByb2Nlc3MuZXhpdCgpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gdW5pbnN0YWxsU2VydmljZTIocGFyYW1zKQ0Kew0KICAgIHZhciBzZWNvbmRhcnlhZ2VudCA9IGZhbHNlOw0KDQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFVuaW5zdGFsbGluZyBwcmV2aW91cyBpbnN0YWxsYXRpb24uLi4nKTsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIudW5pbnN0YWxsU2VydmljZShwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnTWVzaCBBZ2VudCcgOiAnbWVzaGFnZW50Jyk7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsNCiAgICB9DQogICAgY2F0Y2ggKGUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgIH0NCg0KICAgIC8vIENoZWNrIGZvciBzZWNvbmRhcnkgYWdlbnQNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBDaGVja2luZyBmb3Igc2Vjb25kYXJ5IGFnZW50Li4uJyk7DQogICAgICAgIHZhciBzID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKCdtZXNoYWdlbnREaWFnbm9zdGljJyk7DQogICAgICAgIHZhciBsb2MgPSBzLmFwcExvY2F0aW9uKCk7DQogICAgICAgIHMuY2xvc2UoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRk9VTkRdXG4nKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgICAgIC0+IFVuaW5zdGFsbGluZyBzZWNvbmRhcnkgYWdlbnQuLi4nKTsNCiAgICAgICAgc2Vjb25kYXJ5YWdlbnQgPSB0cnVlOw0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci51bmluc3RhbGxTZXJ2aWNlKCdtZXNoYWdlbnREaWFnbm9zdGljJyk7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgIH0NCiAgICB9DQogICAgY2F0Y2ggKGUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtOT05FXVxuJyk7DQogICAgfQ0KDQogICAgaWYoc2Vjb25kYXJ5YWdlbnQpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgICAgLT4gcmVtb3Zpbmcgc2Vjb25kYXJ5IGFnZW50IGZyb20gdGFzayBzY2hlZHVsZXIuLi4nKTsNCiAgICAgICAgdmFyIHAgPSByZXF1aXJlKCd0YXNrLXNjaGVkdWxlcicpLmRlbGV0ZSgnbWVzaGFnZW50RGlhZ25vc3RpYy9wZXJpb2RpY1N0YXJ0Jyk7DQogICAgICAgIHAuX3BhcmFtcyA9IHBhcmFtczsNCiAgICAgICAgcC50aGVuKGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsNCiAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UzKHRoaXMuX3BhcmFtcyk7DQogICAgICAgIH0sIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlMyh0aGlzLl9wYXJhbXMpOw0KICAgICAgICB9KTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgdW5pbnN0YWxsU2VydmljZTMocGFyYW1zKTsNCiAgICB9DQp9DQpmdW5jdGlvbiB1bmluc3RhbGxTZXJ2aWNlKHBhcmFtcykNCnsNCiAgICB2YXIgc3ZjID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnKTsNCiAgICBpZiAoc3ZjLmlzUnVubmluZygpKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFN0b3BwaW5nIFNlcnZpY2UuLi4nKTsNCiAgICAgICAgaWYocHJvY2Vzcy5wbGF0Zm9ybT09J3dpbjMyJykNCiAgICAgICAgew0KICAgICAgICAgICAgc3ZjLnN0b3AoKS50aGVuKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbU1RPUFBFRF1cbicpOw0KICAgICAgICAgICAgICAgIHN2Yy5jbG9zZSgpOw0KICAgICAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHRoaXMuX3BhcmFtcyk7DQogICAgICAgICAgICB9LCBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgICAgICAgICAgc3ZjLmNsb3NlKCk7DQogICAgICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIodGhpcy5fcGFyYW1zKTsNCiAgICAgICAgICAgIH0pLnBhcmVudFByb21pc2UuX3BhcmFtcyA9IHBhcmFtczsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN2Yy51bmxvYWQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzdmMuc3RvcCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbU1RPUFBFRF1cbicpOw0KICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIocGFyYW1zKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKSB7IHN2Yy5jbG9zZSgpOyB9DQogICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHBhcmFtcyk7DQogICAgfQ0KfQ0KZnVuY3Rpb24gc2VydmljZUV4aXN0cyhsb2MsIHBhcmFtcykNCnsNCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtGT1VORDogJyArIGxvYyArICddXG4nKTsNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgLT4gQ2hlY2tpbmcgZmlyZXdhbGwgcnVsZXMgZm9yIHByZXZpb3VzIGluc3RhbGxhdGlvbi4uLicpOw0KICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5yZW1vdmVGaXJld2FsbFJ1bGUoeyBwcm9ncmFtOiBsb2MgfSkudGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBTVUNDRVNTDQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtERUxFVEVEXVxuJyk7DQogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHRoaXMuX3BhcmFtcyk7DQogICAgICAgIH0sIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEZBSUxFRA0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTm8gUnVsZXMgRm91bmRdXG4nKTsNCiAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UodGhpcy5fcGFyYW1zKTsNCiAgICAgICAgfSkucGFyZW50UHJvbWlzZS5fcGFyYW1zID0gcGFyYW1zOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHBhcmFtcyk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBmdWxsVW5pbnN0YWxsKCkNCnsNCiAgICBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkRJU0FCTEVEKTsNCg0KICAgIHRyeQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4uLkNoZWNraW5nIGZvciBwcmV2aW91cyBpbnN0YWxsYXRpb24nKTsNCiAgICAgICAgdmFyIHMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2ggQWdlbnQnIDogJ21lc2hhZ2VudCcpOw0KICAgICAgICB2YXIgbG9jID0gcy5hcHBMb2NhdGlvbigpOw0KICAgICAgICBzLmNsb3NlKCk7DQogICAgfQ0KICAgIGNhdGNoIChlKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTk9ORV1cbicpOw0KICAgICAgICBwcm9jZXNzLmV4aXQoKTsNCiAgICB9DQogICAgc2VydmljZUV4aXN0cyhsb2MsIG51bGwpOw0KfQ0KDQpmdW5jdGlvbiBmdWxsSW5zdGFsbChqc29uU3RyaW5nKQ0Kew0KICAgIGNvbnNvbGUuc2V0RGVzdGluYXRpb24oY29uc29sZS5EZXN0aW5hdGlvbnMuRElTQUJMRUQpOw0KICAgIHZhciBwYXJtcyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7DQoNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuLi5DaGVja2luZyBmb3IgcHJldmlvdXMgaW5zdGFsbGF0aW9uJyk7DQogICAgICAgIHZhciBzID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnKTsNCiAgICAgICAgdmFyIGxvYyA9IHMuYXBwTG9jYXRpb24oKTsNCiAgICAgICAgcy5jbG9zZSgpOw0KICAgIH0NCiAgICBjYXRjaCAoZSkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW05PTkVdXG4nKTsNCiAgICAgICAgaW5zdGFsbFNlcnZpY2UocGFybXMpOw0KICAgICAgICByZXR1cm47DQogICAgfQ0KICAgIHNlcnZpY2VFeGlzdHMobG9jLCBwYXJtcyk7DQp9DQoNCg0KbW9kdWxlLmV4cG9ydHMgPQ0KICAgIHsNCiAgICAgICAgZnVsbEluc3RhbGw6IGZ1bGxJbnN0YWxsLA0KICAgICAgICBmdWxsVW5pbnN0YWxsOiBmdWxsVW5pbnN0YWxsDQogICAgfTs=', 'base64').toString());"); // identifer: Refer to modules/identifers.js - char *_identifiers = ILibMemory_Allocate(32530, 0, NULL, NULL); - memcpy_s(_identifiers + 0, 18588, "LyoNCkNvcHlyaWdodCAyMDE5LTIwMjAgSW50ZWwgQ29ycG9yYXRpb24NCg0KTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCg0KICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQpsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiovDQoNCmZ1bmN0aW9uIHRyaW1JZGVudGlmaWVycyh2YWwpDQp7DQogICAgZm9yKHZhciB2IGluIHZhbCkNCiAgICB7DQogICAgICAgIGlmICghdmFsW3ZdIHx8IHZhbFt2XSA9PSAnTm9uZScgfHwgdmFsW3ZdID09ICcnKSB7IGRlbGV0ZSB2YWxbdl07IH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGxpbnV4X2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgaWRlbnRpZmllcnMgPSB7fTsNCiAgICB2YXIgcmV0ID0ge307DQogICAgdmFyIHZhbHVlcyA9IHt9Ow0KICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvc3lzL2NsYXNzL2RtaS9pZCcpKSB7IHRocm93ICgndGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIERNSSBzdGF0aXN0aWNzJyk7IH0NCiAgICB2YXIgZW50cmllcyA9IHJlcXVpcmUoJ2ZzJykucmVhZGRpclN5bmMoJy9zeXMvY2xhc3MvZG1pL2lkJyk7DQogICAgZm9yKHZhciBpIGluIGVudHJpZXMpDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLmlzRmlsZSgpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXRbZW50cmllc1tpXV0gPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLnRvU3RyaW5nKCkudHJpbSgpOw0KDQogICAgICAgICAgICBpZiAocmV0W2VudHJpZXNbaV1dID09ICdOb25lJykgeyBkZWxldGUgcmV0W2VudHJpZXNbaV1dO30NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZGVudGlmaWVyc1snYmlvc19kYXRlJ10gPSByZXRbJ2Jpb3NfZGF0ZSddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlbmRvciddID0gcmV0WydiaW9zX3ZlbmRvciddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlcnNpb24nXSA9IHJldFsnYmlvc192ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX25hbWUnXSA9IHJldFsnYm9hcmRfbmFtZSddOw0KICAgIGlkZW50aWZpZXJzWydib2FyZF9zZXJpYWwnXSA9IHJldFsnYm9hcmRfc2VyaWFsJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX3ZlbmRvciddID0gcmV0Wydib2FyZF92ZW5kb3InXTsNCiAgICBpZGVudGlmaWVyc1snYm9hcmRfdmVyc2lvbiddID0gcmV0Wydib2FyZF92ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ3Byb2R1Y3RfdXVpZCddID0gcmV0Wydwcm9kdWN0X3V1aWQnXTsNCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Byb2MvY3B1aW5mbyB8IGdyZXAgIm1vZGVsIG5hbWUiIHwgJyArICJ0ciAnXFxuJyAnOicgfCBhd2sgLUY6ICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIGlkZW50aWZpZXJzWydjcHVfbmFtZSddID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCg0KICAgIC8vIEZldGNoIEdQVSBpbmZvDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoImxzcGNpIHwgZ3JlcCAnIFZHQSAnIHwgdHIgJ1xcbicgJ2AnIHwgYXdrICd7IGE9c3BsaXQoJDAsbGluZXMiICsgJywiYCIpOyBwcmludGYgIlsiOyBmb3IoaT0xO2k8YTsrK2kpIHsgc3BsaXQobGluZXNbaV0sZ3B1LCJyOiAiKTsgcHJpbnRmICIlc1xcIiVzXFwiIiwgKGk9PTE/IiI6IiwiKSxncHVbMl07IH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHRyeSB7IGlkZW50aWZpZXJzWydncHVfbmFtZSddID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0gY2F0Y2ggKHh4KSB7IH0NCg0KICAgIC8vIEZldGNoIFN0b3JhZ2UgSW5mbw0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCJsc2h3IC1jbGFzcyBkaXNrIHwgdHIgJ1xcbicgJ2AnIHwgYXdrICciICsgJ3sgbGVuPXNwbGl0KCQwLGxpbmVzLCIqIik7IHByaW50ZiAiWyI7IGZvcihpPTI7aTxsZW47KytpKSB7IG1vZGVsPSIiOyBjYXB0aW9uPSIiOyBzaXplPSIiOyBjbGVuPXNwbGl0KGxpbmVzW2ldLGl0ZW0sImAiKTsgZm9yKGo9MjtqPGNsZW47KytqKSB7IHNwbGl0KGl0ZW1bal0sdG9rZW5zLCI6Iik7IHNwbGl0KHRva2Vuc1sxXSxrZXksIiAiKTsgaWYoa2V5WzFdPT0iZGVzY3JpcHRpb24iKSB7IGNhcHRpb249c3Vic3RyKHRva2Vuc1syXSwyKTsgfSBpZihrZXlbMV09PSJwcm9kdWN0IikgeyBtb2RlbD1zdWJzdHIodG9rZW5zWzJdLDIpOyB9IGlmKGtleVsxXT09InNpemUiKSB7IHNpemU9c3Vic3RyKHRva2Vuc1syXSwyKTsgIH0gfSBpZihtb2RlbD09IiIpIHsgbW9kZWw9Y2FwdGlvbjsgfSBwcmludGYgIiVze1xcIkNhcHRpb25cXCI6XFwiJXNcXCIsXFwiTW9kZWxcXCI6XFwiJXNcXCIsXFwiU2l6ZVxcIjpcXCIlc1xcIn0iLChpPT0yPyIiOiIsIiksY2FwdGlvbixtb2RlbCxzaXplOyAgfSBwcmludGYgIl0iOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgdHJ5IHsgaWRlbnRpZmllcnNbJ3N0b3JhZ2VfZGV2aWNlcyddID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0gY2F0Y2ggKHh4KSB7IH0NCg0KICAgIHZhbHVlcy5pZGVudGlmaWVycyA9IGlkZW50aWZpZXJzOw0KICAgIHZhbHVlcy5saW51eCA9IHJldDsNCiAgICB0cmltSWRlbnRpZmllcnModmFsdWVzLmlkZW50aWZpZXJzKTsNCiAgICByZXR1cm4gKHZhbHVlcyk7DQp9DQoNCmZ1bmN0aW9uIHdpbmRvd3Nfd21pY19yZXN1bHRzKHN0cikNCnsNCiAgICB2YXIgbGluZXMgPSBzdHIudHJpbSgpLnNwbGl0KCdcclxuJyk7DQogICAgdmFyIGtleXMgPSBsaW5lc1swXS5zcGxpdCgnLCcpOw0KICAgIHZhciBpLCBrZXksIGtleXZhbDsNCiAgICB2YXIgdG9rZW5zOw0KICAgIHZhciByZXN1bHQgPSBbXTsNCg0KICAgIGZvciAoaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkNCiAgICB7DQogICAgICAgIHZhciBvYmogPSB7fTsNCiAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJywnKTsNCiAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBrZXlzLmxlbmd0aDsgKytrZXkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh0b2tlbnNba2V5XS50cmltKCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2JqW2tleXNba2V5XS50cmltKCldID0gdG9rZW5zW2tleV0udHJpbSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGRlbGV0ZSBvYmouTm9kZTsNCiAgICAgICAgcmVzdWx0LnB1c2gob2JqKTsNCiAgICB9DQogICAgcmV0dXJuIChyZXN1bHQpOw0KfQ0KDQoNCmZ1bmN0aW9uIHdpbmRvd3NfaWRlbnRpZmllcnMoKQ0Kew0KICAgIHZhciByZXQgPSB7IHdpbmRvd3M6IHt9fTsgdmFsdWVzID0ge307IHZhciBpdGVtczsgdmFyIGk7IHZhciBpdGVtOw0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnYmlvcycsICdnZXQnLCAnL1ZBTFVFJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIGl0ZW1zID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXHJcclxuJyk7DQogICAgZm9yKGkgaW4gaXRlbXMpDQogICAgew0KICAgICAgICBpdGVtID0gaXRlbXNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgdmFsdWVzW2l0ZW1bMF1dID0gaXRlbVsxXTsNCiAgICB9DQoNCiAgICByZXRbJ2lkZW50aWZpZXJzJ10gPSB7fTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2Jpb3NfZGF0ZSddID0gdmFsdWVzWydSZWxlYXNlRGF0ZSddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYmlvc192ZW5kb3InXSA9IHZhbHVlc1snTWFudWZhY3R1cmVyJ107DQogICAgcmV0WydpZGVudGlmaWVycyddWydiaW9zX3ZlcnNpb24nXSA9IHZhbHVlc1snU01CSU9TQklPU1ZlcnNpb24nXTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdCQVNFQk9BUkQnLCAnZ2V0JywgJy9WQUxVRSddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBpdGVtcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xyXHJcbicpOw0KICAgIGZvciAoaSBpbiBpdGVtcykNCiAgICB7DQogICAgICAgIGl0ZW0gPSBpdGVtc1tpXS5zcGxpdCgnPScpOw0KICAgICAgICB2YWx1ZXNbaXRlbVswXV0gPSBpdGVtWzFdOw0KICAgIH0NCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX25hbWUnXSA9IHZhbHVlc1snUHJvZHVjdCddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYm9hcmRfc2VyaWFsJ10gPSB2YWx1ZXNbJ1NlcmlhbE51bWJlciddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYm9hcmRfdmVuZG9yJ10gPSB2YWx1ZXNbJ01hbnVmYWN0dXJlciddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYm9hcmRfdmVyc2lvbiddID0gdmFsdWVzWydWZXJzaW9uJ107DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnQ1NQcm9kdWN0JywgJ2dldCcsICcvVkFMVUUnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICB2YXIgaXRlbXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcclxyXG4nKTsNCiAgICBmb3IgKGkgaW4gaXRlbXMpDQogICAgew0KICAgICAgICBpdGVtID0gaXRlbXNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgdmFsdWVzW2l0ZW1bMF1dID0gaXRlbVsxXTsNCiAgICB9DQogICAgcmV0WydpZGVudGlmaWVycyddWydwcm9kdWN0X3V1aWQnXSA9IHZhbHVlc1snVVVJRCddOw0KICAgIHRyaW1JZGVudGlmaWVycyhyZXQuaWRlbnRpZmllcnMpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ01FTU9SWUNISVAnLCAnTElTVCcsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5tZW1vcnkgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdPUycsICdHRVQnLCAnL0ZPUk1BVDpDU1YnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LndpbmRvd3Mub3NpbmZvID0gd2luZG93c193bWljX3Jlc3VsdHMoY2hpbGQuc3Rkb3V0LnN0cilbMF07DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnUEFSVElUSU9OJywgJ0xJU1QnLCAnL0ZPUk1BVDpDU1YnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LndpbmRvd3MucGFydGl0aW9ucyA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ0NQVScsICdMSVNUJywgJ0JSSUVGJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLmNwdSA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ1BBVEgnLCAnV2luMzJfVmlkZW9Db250cm9sbGVyJywgJ0dFVCcsICdOYW1lLEN1cnJlbnRIb3Jpem9udGFsUmVzb2x1dGlvbixDdXJyZW50VmVydGljYWxSZXNvbHV0aW9uJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLmdwdSA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ2Rpc2tkcml2ZScsICdMSVNUJywgJ0JSSUVGJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLmRyaXZlcyA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOw0KDQogICAgLy8gSW5zZXJ0IEdQVSBuYW1lcw0KICAgIHJldC5pZGVudGlmaWVycy5ncHVfbmFtZSA9IFtdOw0KICAgIGZvciAodmFyIGdwdWluZm8gaW4gcmV0LndpbmRvd3MuZ3B1KQ0KICAgIHsNCiAgICAgICAgaWYgKHJldC53aW5kb3dzLmdwdVtncHVpbmZvXS5OYW1lKSB7IHJldC5pZGVudGlmaWVycy5ncHVfbmFtZS5wdXNoKHJldC53aW5kb3dzLmdwdVtncHVpbmZvXS5OYW1lKTsgfQ0KICAgIH0NCg0KICAgIC8vIEluc2VydCBTdG9yYWdlIERldmljZXMNCiAgICByZXQuaWRlbnRpZmllcnMuc3RvcmFnZV9kZXZpY2VzID0gW107DQogICAgZm9yICh2YXIgZHYgaW4gcmV0LndpbmRvd3MuZHJpdmVzKQ0KICAgIHsNCiAgICAgICAgcmV0LmlkZW50aWZpZXJzLnN0b3JhZ2VfZGV2aWNlcy5wdXNoKHsgQ2FwdGlvbjogcmV0LndpbmRvd3MuZHJpdmVzW2R2XS5DYXB0aW9uLCBNb2RlbDogcmV0LndpbmRvd3MuZHJpdmVzW2R2XS5Nb2RlbCwgU2l6ZTogcmV0LndpbmRvd3MuZHJpdmVzW2R2XS5TaXplIH0pOw0KICAgIH0NCg0KICAgIHRyeSB7IHJldC5pZGVudGlmaWVycy5jcHVfbmFtZSA9IHJldC53aW5kb3dzLmNwdVswXS5OYW1lOyB9IGNhdGNoICh4KSB7IH0NCiAgICByZXR1cm4gKHJldCk7DQp9DQpmdW5jdGlvbiBtYWNvc19pZGVudGlmaWVycygpDQp7DQogICAgdmFyIHJldCA9IHsgaWRlbnRpZmllcnM6IHt9IH07DQogICAgdmFyIGNoaWxkOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2UgfCBncmVwIGJvYXJkLWlkIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfbmFtZSA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2UgfCBncmVwIElPUGxhdGZvcm1TZXJpYWxOdW1iZXIgfCBhd2sgLUY9IFwneyBzcGxpdCgkMiwgcmVzLCAiXFwiIik7IHByaW50IHJlc1syXTsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC5pZGVudGlmaWVycy5ib2FyZF9zZXJpYWwgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBtYW51ZmFjdHVyZXIgfCBhd2sgLUY9IFwneyBzcGxpdCgkMiwgcmVzLCAiXFwiIik7IHByaW50IHJlc1syXTsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC5pZGVudGlmaWVycy5ib2FyZF92ZW5kb3IgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCB2ZXJzaW9uIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfdmVyc2lvbiA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2UgfCBncmVwIElPUGxhdGZvcm1VVUlEIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMucHJvZHVjdF91dWlkID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICB0cmltSWRlbnRpZmllcnMocmV0LmlkZW50aWZpZXJzKTsNCiAgICByZXR1cm4gKHJldCk7DQp9DQoNCnN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0Kew0KICAgIGNhc2UgJ2xpbnV4JzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7IF9PYmplY3RJRDogJ2lkZW50aWZpZXJzJywgZ2V0OiBsaW51eF9pZGVudGlmaWVycyB9Ow0KICAgICAgICBicmVhazsNCiAgICBjYXNlICd3aW4zMic6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBfT2JqZWN0SUQ6ICdpZGVudGlmaWVycycsIGdldDogd2luZG93c19pZGVudGlmaWVycyB9Ow0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgX09iamVjdElEOiAnaWRlbnRpZmllcnMnLCBnZXQ6IG1hY29zX2lkZW50aWZpZXJzIH07DQogICAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBnZXQ6IGZ1bmN0aW9uICgpIHsgdGhyb3cgKCdVbnN1cHBvcnRlZCBQbGF0Zm9ybScpOyB9IH07DQogICAgICAgIGJyZWFrOw0KfQ0KbW9kdWxlLmV4cG9ydHMuaXNEb2NrZXIgPSBmdW5jdGlvbiBpc0RvY2tlcigpDQp7DQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ2xpbnV4JykgeyByZXR1cm4gKGZhbHNlKTsgfQ0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvcHJvYy9zZWxmL2Nncm91cCB8IHRyICdcbicgJ2AnIHwgYXdrIC1GJ2AnICd7IHNw", 16000); - memcpy_s(_identifiers + 16000, 2588, "bGl0KCQxLCByZXMsICIgKyAnIi8iKTsgaWYocmVzWzJdPT0iZG9ja2VyIil7cHJpbnQgIjEiO30gfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ciAhPSAnJyk7DQp9Ow0KbW9kdWxlLmV4cG9ydHMuaXNWTSA9IGZ1bmN0aW9uIGlzVk0oKQ0Kew0KICAgIHZhciByZXQgPSBmYWxzZTsNCiAgICB2YXIgaWQgPSB0aGlzLmdldCgpOw0KICAgIGlmIChpZC5saW51eCAmJiBpZC5saW51eC5zeXNfdmVuZG9yKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoIChpZC5saW51eC5zeXNfdmVuZG9yKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdWTXdhcmUsIEluYy4nOg0KICAgICAgICAgICAgY2FzZSAnUUVNVSc6DQogICAgICAgICAgICBjYXNlICdYZW4nOg0KICAgICAgICAgICAgICAgIHJldCA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChpZC5pZGVudGlmaWVycy5iaW9zX3ZlbmRvcikNCiAgICB7DQogICAgICAgIHN3aXRjaChpZC5pZGVudGlmaWVycy5iaW9zX3ZlbmRvcikNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnVk13YXJlLCBJbmMuJzoNCiAgICAgICAgICAgIGNhc2UgJ1hlbic6DQogICAgICAgICAgICBjYXNlICdTZWFCSU9TJzoNCiAgICAgICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaWQuaWRlbnRpZmllcnMuYm9hcmRfdmVuZG9yICYmIGlkLmlkZW50aWZpZXJzLmJvYXJkX3ZlbmRvciA9PSAnVk13YXJlLCBJbmMuJykgeyByZXQgPSB0cnVlOyB9DQogICAgaWYgKGlkLmlkZW50aWZpZXJzLmJvYXJkX25hbWUpDQogICAgew0KICAgICAgICBzd2l0Y2ggKGlkLmlkZW50aWZpZXJzLmJvYXJkX25hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgJ1ZpcnR1YWxCb3gnOg0KICAgICAgICAgICAgY2FzZSAnVmlydHVhbCBNYWNoaW5lJzoNCiAgICAgICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgJiYgIXJldCkNCiAgICB7DQogICAgICAgIGZvcih2YXIgaSBpbiBpZC5pZGVudGlmaWVycy5ncHVfbmFtZSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYoaWQuaWRlbnRpZmllcnMuZ3B1X25hbWVbaV0uc3RhcnRzV2l0aCgnVk13YXJlICcpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldCA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGlmICghcmV0KSB7IHJldCA9IHRoaXMuaXNEb2NrZXIoKTsgfQ0KICAgIHJldHVybiAocmV0KTsNCn07DQoNCg0KLy8gYmlvc19kYXRlID0gQklPUy0+UmVsZWFzZURhdGUNCi8vIGJpb3NfdmVuZG9yID0gQklPUy0+TWFudWZhY3R1cmVyDQovLyBiaW9zX3ZlcnNpb24gPSBCSU9TLT5TTUJJT1NCSU9TVmVyc2lvbg0KLy8gYm9hcmRfbmFtZSA9IEJBU0VCT0FSRC0+UHJvZHVjdCA9IGlvcmVnL2JvYXJkLWlkDQovLyBib2FyZF9zZXJpYWwgPSBCQVNFQk9BUkQtPlNlcmlhbE51bWJlciA9IGlvcmVnL3NlcmlhbC1udW1iZXIgfCBpb3JlZy9JT1BsYXRmb3JtU2VyaWFsTnVtYmVyDQovLyBib2FyZF92ZW5kb3IgPSBCQVNFQk9BUkQtPk1hbnVmYWN0dXJlciA9IGlvcmVnL21hbnVmYWN0dXJlcg0KLy8gYm9hcmRfdmVyc2lvbiA9IEJBU0VCT0FSRC0+VmVyc2lvbg0KDQo=", 2588); + char *_identifiers = ILibMemory_Allocate(32531, 0, NULL, NULL); + memcpy_s(_identifiers + 0, 18588, "LyoNCkNvcHlyaWdodCAyMDE5LTIwMjAgSW50ZWwgQ29ycG9yYXRpb24NCg0KTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCg0KICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQpsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiovDQoNCmZ1bmN0aW9uIHRyaW1JZGVudGlmaWVycyh2YWwpDQp7DQogICAgZm9yKHZhciB2IGluIHZhbCkNCiAgICB7DQogICAgICAgIGlmICghdmFsW3ZdIHx8IHZhbFt2XSA9PSAnTm9uZScgfHwgdmFsW3ZdID09ICcnKSB7IGRlbGV0ZSB2YWxbdl07IH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGxpbnV4X2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgaWRlbnRpZmllcnMgPSB7fTsNCiAgICB2YXIgcmV0ID0ge307DQogICAgdmFyIHZhbHVlcyA9IHt9Ow0KICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvc3lzL2NsYXNzL2RtaS9pZCcpKSB7IHRocm93ICgndGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIERNSSBzdGF0aXN0aWNzJyk7IH0NCiAgICB2YXIgZW50cmllcyA9IHJlcXVpcmUoJ2ZzJykucmVhZGRpclN5bmMoJy9zeXMvY2xhc3MvZG1pL2lkJyk7DQogICAgZm9yKHZhciBpIGluIGVudHJpZXMpDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLmlzRmlsZSgpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXRbZW50cmllc1tpXV0gPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLnRvU3RyaW5nKCkudHJpbSgpOw0KDQogICAgICAgICAgICBpZiAocmV0W2VudHJpZXNbaV1dID09ICdOb25lJykgeyBkZWxldGUgcmV0W2VudHJpZXNbaV1dO30NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZGVudGlmaWVyc1snYmlvc19kYXRlJ10gPSByZXRbJ2Jpb3NfZGF0ZSddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlbmRvciddID0gcmV0WydiaW9zX3ZlbmRvciddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlcnNpb24nXSA9IHJldFsnYmlvc192ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX25hbWUnXSA9IHJldFsnYm9hcmRfbmFtZSddOw0KICAgIGlkZW50aWZpZXJzWydib2FyZF9zZXJpYWwnXSA9IHJldFsnYm9hcmRfc2VyaWFsJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX3ZlbmRvciddID0gcmV0Wydib2FyZF92ZW5kb3InXTsNCiAgICBpZGVudGlmaWVyc1snYm9hcmRfdmVyc2lvbiddID0gcmV0Wydib2FyZF92ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ3Byb2R1Y3RfdXVpZCddID0gcmV0Wydwcm9kdWN0X3V1aWQnXTsNCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Byb2MvY3B1aW5mbyB8IGdyZXAgIm1vZGVsIG5hbWUiIHwgJyArICJ0ciAnXFxuJyAnOicgfCBhd2sgLUY6ICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIGlkZW50aWZpZXJzWydjcHVfbmFtZSddID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCg0KICAgIC8vIEZldGNoIEdQVSBpbmZvDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoImxzcGNpIHwgZ3JlcCAnIFZHQSAnIHwgdHIgJ1xcbicgJ2AnIHwgYXdrICd7IGE9c3BsaXQoJDAsbGluZXMiICsgJywiYCIpOyBwcmludGYgIlsiOyBmb3IoaT0xO2k8YTsrK2kpIHsgc3BsaXQobGluZXNbaV0sZ3B1LCJyOiAiKTsgcHJpbnRmICIlc1xcIiVzXFwiIiwgKGk9PTE/IiI6IiwiKSxncHVbMl07IH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHRyeSB7IGlkZW50aWZpZXJzWydncHVfbmFtZSddID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0gY2F0Y2ggKHh4KSB7IH0NCg0KICAgIC8vIEZldGNoIFN0b3JhZ2UgSW5mbw0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCJsc2h3IC1jbGFzcyBkaXNrIHwgdHIgJ1xcbicgJ2AnIHwgYXdrICciICsgJ3sgbGVuPXNwbGl0KCQwLGxpbmVzLCIqIik7IHByaW50ZiAiWyI7IGZvcihpPTI7aTw9bGVuOysraSkgeyBtb2RlbD0iIjsgY2FwdGlvbj0iIjsgc2l6ZT0iIjsgY2xlbj1zcGxpdChsaW5lc1tpXSxpdGVtLCJgIik7IGZvcihqPTI7ajxjbGVuOysraikgeyBzcGxpdChpdGVtW2pdLHRva2VucywiOiIpOyBzcGxpdCh0b2tlbnNbMV0sa2V5LCIgIik7IGlmKGtleVsxXT09ImRlc2NyaXB0aW9uIikgeyBjYXB0aW9uPXN1YnN0cih0b2tlbnNbMl0sMik7IH0gaWYoa2V5WzFdPT0icHJvZHVjdCIpIHsgbW9kZWw9c3Vic3RyKHRva2Vuc1syXSwyKTsgfSBpZihrZXlbMV09PSJzaXplIikgeyBzaXplPXN1YnN0cih0b2tlbnNbMl0sMik7ICB9IH0gaWYobW9kZWw9PSIiKSB7IG1vZGVsPWNhcHRpb247IH0gcHJpbnRmICIlc3tcXCJDYXB0aW9uXFwiOlxcIiVzXFwiLFxcIk1vZGVsXFwiOlxcIiVzXFwiLFxcIlNpemVcXCI6XFwiJXNcXCJ9IiwoaT09Mj8iIjoiLCIpLGNhcHRpb24sbW9kZWwsc2l6ZTsgIH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHRyeSB7IGlkZW50aWZpZXJzWydzdG9yYWdlX2RldmljZXMnXSA9IEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOyB9IGNhdGNoICh4eCkgeyB9DQoNCiAgICB2YWx1ZXMuaWRlbnRpZmllcnMgPSBpZGVudGlmaWVyczsNCiAgICB2YWx1ZXMubGludXggPSByZXQ7DQogICAgdHJpbUlkZW50aWZpZXJzKHZhbHVlcy5pZGVudGlmaWVycyk7DQogICAgcmV0dXJuICh2YWx1ZXMpOw0KfQ0KDQpmdW5jdGlvbiB3aW5kb3dzX3dtaWNfcmVzdWx0cyhzdHIpDQp7DQogICAgdmFyIGxpbmVzID0gc3RyLnRyaW0oKS5zcGxpdCgnXHJcbicpOw0KICAgIHZhciBrZXlzID0gbGluZXNbMF0uc3BsaXQoJywnKTsNCiAgICB2YXIgaSwga2V5LCBrZXl2YWw7DQogICAgdmFyIHRva2VuczsNCiAgICB2YXIgcmVzdWx0ID0gW107DQoNCiAgICBmb3IgKGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpDQogICAgew0KICAgICAgICB2YXIgb2JqID0ge307DQogICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcsJyk7DQogICAgICAgIGZvciAoa2V5ID0gMDsga2V5IDwga2V5cy5sZW5ndGg7ICsra2V5KQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAodG9rZW5zW2tleV0udHJpbSgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialtrZXlzW2tleV0udHJpbSgpXSA9IHRva2Vuc1trZXldLnRyaW0oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBkZWxldGUgb2JqLk5vZGU7DQogICAgICAgIHJlc3VsdC5wdXNoKG9iaik7DQogICAgfQ0KICAgIHJldHVybiAocmVzdWx0KTsNCn0NCg0KDQpmdW5jdGlvbiB3aW5kb3dzX2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgcmV0ID0geyB3aW5kb3dzOiB7fX07IHZhbHVlcyA9IHt9OyB2YXIgaXRlbXM7IHZhciBpOyB2YXIgaXRlbTsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ2Jpb3MnLCAnZ2V0JywgJy9WQUxVRSddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBpdGVtcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xyXHJcbicpOw0KICAgIGZvcihpIGluIGl0ZW1zKQ0KICAgIHsNCiAgICAgICAgaXRlbSA9IGl0ZW1zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgIHZhbHVlc1tpdGVtWzBdXSA9IGl0ZW1bMV07DQogICAgfQ0KDQogICAgcmV0WydpZGVudGlmaWVycyddID0ge307DQogICAgcmV0WydpZGVudGlmaWVycyddWydiaW9zX2RhdGUnXSA9IHZhbHVlc1snUmVsZWFzZURhdGUnXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2Jpb3NfdmVuZG9yJ10gPSB2YWx1ZXNbJ01hbnVmYWN0dXJlciddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYmlvc192ZXJzaW9uJ10gPSB2YWx1ZXNbJ1NNQklPU0JJT1NWZXJzaW9uJ107DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnQkFTRUJPQVJEJywgJ2dldCcsICcvVkFMVUUnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICB2YXIgaXRlbXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcclxyXG4nKTsNCiAgICBmb3IgKGkgaW4gaXRlbXMpDQogICAgew0KICAgICAgICBpdGVtID0gaXRlbXNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgdmFsdWVzW2l0ZW1bMF1dID0gaXRlbVsxXTsNCiAgICB9DQogICAgcmV0WydpZGVudGlmaWVycyddWydib2FyZF9uYW1lJ10gPSB2YWx1ZXNbJ1Byb2R1Y3QnXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3NlcmlhbCddID0gdmFsdWVzWydTZXJpYWxOdW1iZXInXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3ZlbmRvciddID0gdmFsdWVzWydNYW51ZmFjdHVyZXInXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3ZlcnNpb24nXSA9IHZhbHVlc1snVmVyc2lvbiddOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ0NTUHJvZHVjdCcsICdnZXQnLCAnL1ZBTFVFJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIGl0ZW1zID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXHJcclxuJyk7DQogICAgZm9yIChpIGluIGl0ZW1zKQ0KICAgIHsNCiAgICAgICAgaXRlbSA9IGl0ZW1zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgIHZhbHVlc1tpdGVtWzBdXSA9IGl0ZW1bMV07DQogICAgfQ0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsncHJvZHVjdF91dWlkJ10gPSB2YWx1ZXNbJ1VVSUQnXTsNCiAgICB0cmltSWRlbnRpZmllcnMocmV0LmlkZW50aWZpZXJzKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdNRU1PUllDSElQJywgJ0xJU1QnLCAnL0ZPUk1BVDpDU1YnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LndpbmRvd3MubWVtb3J5ID0gd2luZG93c193bWljX3Jlc3VsdHMoY2hpbGQuc3Rkb3V0LnN0cik7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnT1MnLCAnR0VUJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLm9zaW5mbyA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpWzBdOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ1BBUlRJVElPTicsICdMSVNUJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLnBhcnRpdGlvbnMgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdDUFUnLCAnTElTVCcsICdCUklFRicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5jcHUgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdQQVRIJywgJ1dpbjMyX1ZpZGVvQ29udHJvbGxlcicsICdHRVQnLCAnTmFtZSxDdXJyZW50SG9yaXpvbnRhbFJlc29sdXRpb24sQ3VycmVudFZlcnRpY2FsUmVzb2x1dGlvbicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5ncHUgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdkaXNrZHJpdmUnLCAnTElTVCcsICdCUklFRicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5kcml2ZXMgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIC8vIEluc2VydCBHUFUgbmFtZXMNCiAgICByZXQuaWRlbnRpZmllcnMuZ3B1X25hbWUgPSBbXTsNCiAgICBmb3IgKHZhciBncHVpbmZvIGluIHJldC53aW5kb3dzLmdwdSkNCiAgICB7DQogICAgICAgIGlmIChyZXQud2luZG93cy5ncHVbZ3B1aW5mb10uTmFtZSkgeyByZXQuaWRlbnRpZmllcnMuZ3B1X25hbWUucHVzaChyZXQud2luZG93cy5ncHVbZ3B1aW5mb10uTmFtZSk7IH0NCiAgICB9DQoNCiAgICAvLyBJbnNlcnQgU3RvcmFnZSBEZXZpY2VzDQogICAgcmV0LmlkZW50aWZpZXJzLnN0b3JhZ2VfZGV2aWNlcyA9IFtdOw0KICAgIGZvciAodmFyIGR2IGluIHJldC53aW5kb3dzLmRyaXZlcykNCiAgICB7DQogICAgICAgIHJldC5pZGVudGlmaWVycy5zdG9yYWdlX2RldmljZXMucHVzaCh7IENhcHRpb246IHJldC53aW5kb3dzLmRyaXZlc1tkdl0uQ2FwdGlvbiwgTW9kZWw6IHJldC53aW5kb3dzLmRyaXZlc1tkdl0uTW9kZWwsIFNpemU6IHJldC53aW5kb3dzLmRyaXZlc1tkdl0uU2l6ZSB9KTsNCiAgICB9DQoNCiAgICB0cnkgeyByZXQuaWRlbnRpZmllcnMuY3B1X25hbWUgPSByZXQud2luZG93cy5jcHVbMF0uTmFtZTsgfSBjYXRjaCAoeCkgeyB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KZnVuY3Rpb24gbWFjb3NfaWRlbnRpZmllcnMoKQ0Kew0KICAgIHZhciByZXQgPSB7IGlkZW50aWZpZXJzOiB7fSB9Ow0KICAgIHZhciBjaGlsZDsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBib2FyZC1pZCB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLmJvYXJkX25hbWUgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBJT1BsYXRmb3JtU2VyaWFsTnVtYmVyIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfc2VyaWFsID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgbWFudWZhY3R1cmVyIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfdmVuZG9yID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgdmVyc2lvbiB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLmJvYXJkX3ZlcnNpb24gPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBJT1BsYXRmb3JtVVVJRCB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLnByb2R1Y3RfdXVpZCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgdHJpbUlkZW50aWZpZXJzKHJldC5pZGVudGlmaWVycyk7DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCnsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBfT2JqZWN0SUQ6ICdpZGVudGlmaWVycycsIGdldDogbGludXhfaWRlbnRpZmllcnMgfTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgX09iamVjdElEOiAnaWRlbnRpZmllcnMnLCBnZXQ6IHdpbmRvd3NfaWRlbnRpZmllcnMgfTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7IF9PYmplY3RJRDogJ2lkZW50aWZpZXJzJywgZ2V0OiBtYWNvc19pZGVudGlmaWVycyB9Ow0KICAgICAgICBicmVhazsNCiAgICBkZWZhdWx0Og0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHRocm93ICgnVW5zdXBwb3J0ZWQgUGxhdGZvcm0nKTsgfSB9Ow0KICAgICAgICBicmVhazsNCn0NCm1vZHVsZS5leHBvcnRzLmlzRG9ja2VyID0gZnVuY3Rpb24gaXNEb2NrZXIoKQ0Kew0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9ICdsaW51eCcpIHsgcmV0dXJuIChmYWxzZSk7IH0NCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Byb2Mvc2VsZi9jZ3JvdXAgfCB0ciAnXG4nICdgJyB8IGF3ayAtRidgJyAneyBz", 16000); + memcpy_s(_identifiers + 16000, 2588, "cGxpdCgkMSwgcmVzLCAiICsgJyIvIik7IGlmKHJlc1syXT09ImRvY2tlciIpe3ByaW50ICIxIjt9IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIgIT0gJycpOw0KfTsNCm1vZHVsZS5leHBvcnRzLmlzVk0gPSBmdW5jdGlvbiBpc1ZNKCkNCnsNCiAgICB2YXIgcmV0ID0gZmFsc2U7DQogICAgdmFyIGlkID0gdGhpcy5nZXQoKTsNCiAgICBpZiAoaWQubGludXggJiYgaWQubGludXguc3lzX3ZlbmRvcikNCiAgICB7DQogICAgICAgIHN3aXRjaCAoaWQubGludXguc3lzX3ZlbmRvcikNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnVk13YXJlLCBJbmMuJzoNCiAgICAgICAgICAgIGNhc2UgJ1FFTVUnOg0KICAgICAgICAgICAgY2FzZSAnWGVuJzoNCiAgICAgICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaWQuaWRlbnRpZmllcnMuYmlvc192ZW5kb3IpDQogICAgew0KICAgICAgICBzd2l0Y2goaWQuaWRlbnRpZmllcnMuYmlvc192ZW5kb3IpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgJ1ZNd2FyZSwgSW5jLic6DQogICAgICAgICAgICBjYXNlICdYZW4nOg0KICAgICAgICAgICAgY2FzZSAnU2VhQklPUyc6DQogICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKGlkLmlkZW50aWZpZXJzLmJvYXJkX3ZlbmRvciAmJiBpZC5pZGVudGlmaWVycy5ib2FyZF92ZW5kb3IgPT0gJ1ZNd2FyZSwgSW5jLicpIHsgcmV0ID0gdHJ1ZTsgfQ0KICAgIGlmIChpZC5pZGVudGlmaWVycy5ib2FyZF9uYW1lKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoIChpZC5pZGVudGlmaWVycy5ib2FyZF9uYW1lKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdWaXJ0dWFsQm94JzoNCiAgICAgICAgICAgIGNhc2UgJ1ZpcnR1YWwgTWFjaGluZSc6DQogICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInICYmICFyZXQpDQogICAgew0KICAgICAgICBmb3IodmFyIGkgaW4gaWQuaWRlbnRpZmllcnMuZ3B1X25hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKGlkLmlkZW50aWZpZXJzLmdwdV9uYW1lW2ldLnN0YXJ0c1dpdGgoJ1ZNd2FyZSAnKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICBpZiAoIXJldCkgeyByZXQgPSB0aGlzLmlzRG9ja2VyKCk7IH0NCiAgICByZXR1cm4gKHJldCk7DQp9Ow0KDQoNCi8vIGJpb3NfZGF0ZSA9IEJJT1MtPlJlbGVhc2VEYXRlDQovLyBiaW9zX3ZlbmRvciA9IEJJT1MtPk1hbnVmYWN0dXJlcg0KLy8gYmlvc192ZXJzaW9uID0gQklPUy0+U01CSU9TQklPU1ZlcnNpb24NCi8vIGJvYXJkX25hbWUgPSBCQVNFQk9BUkQtPlByb2R1Y3QgPSBpb3JlZy9ib2FyZC1pZA0KLy8gYm9hcmRfc2VyaWFsID0gQkFTRUJPQVJELT5TZXJpYWxOdW1iZXIgPSBpb3JlZy9zZXJpYWwtbnVtYmVyIHwgaW9yZWcvSU9QbGF0Zm9ybVNlcmlhbE51bWJlcg0KLy8gYm9hcmRfdmVuZG9yID0gQkFTRUJPQVJELT5NYW51ZmFjdHVyZXIgPSBpb3JlZy9tYW51ZmFjdHVyZXINCi8vIGJvYXJkX3ZlcnNpb24gPSBCQVNFQk9BUkQtPlZlcnNpb24NCg0K", 2588); ILibBase64DecodeEx((unsigned char*)_identifiers, 18588, (unsigned char*)_identifiers + 18588); duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "identifiers"); duk_push_string(ctx, _identifiers + 18588); duk_pcall_method(ctx, 2); duk_pop(ctx); diff --git a/modules/identifiers.js b/modules/identifiers.js index 3b494ef..1018cd5 100644 --- a/modules/identifiers.js +++ b/modules/identifiers.js @@ -64,7 +64,7 @@ function linux_identifiers() // Fetch Storage Info var child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); - child.stdin.write("lshw -class disk | tr '\\n' '`' | awk '" + '{ len=split($0,lines,"*"); printf "["; for(i=2;i