oxygen-cli 1.33.6 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getAuthenticateMethods = getAuthenticateMethods;
|
|
7
|
+
exports.createBasicMessage = createBasicMessage;
|
|
8
|
+
|
|
9
|
+
require("source-map-support/register");
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Returns a list of authentication methods
|
|
13
|
+
* @param response param
|
|
14
|
+
* @return an array of lower-case authentication methods
|
|
15
|
+
*/
|
|
16
|
+
function getAuthenticateMethods(response) {
|
|
17
|
+
var _response$headers, _response$headers$www;
|
|
18
|
+
|
|
19
|
+
return response === null || response === void 0 ? void 0 : (_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : (_response$headers$www = _response$headers['www-authenticate']) === null || _response$headers$www === void 0 ? void 0 : _response$headers$www.split(',').map(i => i.trim().toLowerCase());
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns the basic auth header
|
|
23
|
+
* @param user the username
|
|
24
|
+
* @param pwd the password
|
|
25
|
+
* @return the basic auth header
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
function createBasicMessage(user, pwd) {
|
|
30
|
+
return 'Basic ' + Buffer.from(user + ':' + pwd, 'utf8').toString('base64');
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwL250bG0tdXRpbC5qcyJdLCJuYW1lcyI6WyJnZXRBdXRoZW50aWNhdGVNZXRob2RzIiwicmVzcG9uc2UiLCJoZWFkZXJzIiwic3BsaXQiLCJtYXAiLCJpIiwidHJpbSIsInRvTG93ZXJDYXNlIiwiY3JlYXRlQmFzaWNNZXNzYWdlIiwidXNlciIsInB3ZCIsIkJ1ZmZlciIsImZyb20iLCJ0b1N0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxzQkFBVCxDQUFnQ0MsUUFBaEMsRUFBMEM7QUFBQTs7QUFDN0MsU0FBT0EsUUFBUCxhQUFPQSxRQUFQLDRDQUFPQSxRQUFRLENBQUVDLE9BQWpCLCtFQUFPLGtCQUFvQixrQkFBcEIsQ0FBUCwwREFBTyxzQkFBeUNDLEtBQXpDLENBQStDLEdBQS9DLEVBQW9EQyxHQUFwRCxDQUF5REMsQ0FBRCxJQUFPQSxDQUFDLENBQUNDLElBQUYsR0FBU0MsV0FBVCxFQUEvRCxDQUFQO0FBQ0g7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNDLGtCQUFULENBQTRCQyxJQUE1QixFQUFrQ0MsR0FBbEMsRUFBdUM7QUFDMUMsU0FBTyxXQUFXQyxNQUFNLENBQUNDLElBQVAsQ0FBWUgsSUFBSSxHQUFHLEdBQVAsR0FBYUMsR0FBekIsRUFBOEIsTUFBOUIsRUFBc0NHLFFBQXRDLENBQStDLFFBQS9DLENBQWxCO0FBQ0giLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUmV0dXJucyBhIGxpc3Qgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kc1xyXG4gKiBAcGFyYW0gcmVzcG9uc2UgcGFyYW1cclxuICogQHJldHVybiBhbiBhcnJheSBvZiBsb3dlci1jYXNlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGVNZXRob2RzKHJlc3BvbnNlKSB7XHJcbiAgICByZXR1cm4gcmVzcG9uc2U/LmhlYWRlcnM/Llsnd3d3LWF1dGhlbnRpY2F0ZSddPy5zcGxpdCgnLCcpLm1hcCgoaSkgPT4gaS50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiYXNpYyBhdXRoIGhlYWRlclxyXG4gKiBAcGFyYW0gdXNlciB0aGUgdXNlcm5hbWVcclxuICogQHBhcmFtIHB3ZCB0aGUgcGFzc3dvcmRcclxuICogQHJldHVybiB0aGUgYmFzaWMgYXV0aCBoZWFkZXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNpY01lc3NhZ2UodXNlciwgcHdkKSB7XHJcbiAgICByZXR1cm4gJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbSh1c2VyICsgJzonICsgcHdkLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcclxufSJdfQ==
|
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("source-map-support/register");
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Copyright (c) 2013 Sam Decrock https://github.com/SamDecrock/
|
|
7
|
+
* All rights reserved.
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the MIT license found in the
|
|
10
|
+
* LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/* eslint-disable */
|
|
14
|
+
var crypto = require('crypto');
|
|
15
|
+
|
|
16
|
+
var jsmd4 = require("js-md4");
|
|
17
|
+
|
|
18
|
+
var desjs = require("des.js");
|
|
19
|
+
|
|
20
|
+
var flags = {
|
|
21
|
+
NTLM_NegotiateUnicode: 0x00000001,
|
|
22
|
+
NTLM_NegotiateOEM: 0x00000002,
|
|
23
|
+
NTLM_RequestTarget: 0x00000004,
|
|
24
|
+
NTLM_Unknown9: 0x00000008,
|
|
25
|
+
NTLM_NegotiateSign: 0x00000010,
|
|
26
|
+
NTLM_NegotiateSeal: 0x00000020,
|
|
27
|
+
NTLM_NegotiateDatagram: 0x00000040,
|
|
28
|
+
NTLM_NegotiateLanManagerKey: 0x00000080,
|
|
29
|
+
NTLM_Unknown8: 0x00000100,
|
|
30
|
+
NTLM_NegotiateNTLM: 0x00000200,
|
|
31
|
+
NTLM_NegotiateNTOnly: 0x00000400,
|
|
32
|
+
NTLM_Anonymous: 0x00000800,
|
|
33
|
+
NTLM_NegotiateOemDomainSupplied: 0x00001000,
|
|
34
|
+
NTLM_NegotiateOemWorkstationSupplied: 0x00002000,
|
|
35
|
+
NTLM_Unknown6: 0x00004000,
|
|
36
|
+
NTLM_NegotiateAlwaysSign: 0x00008000,
|
|
37
|
+
NTLM_TargetTypeDomain: 0x00010000,
|
|
38
|
+
NTLM_TargetTypeServer: 0x00020000,
|
|
39
|
+
NTLM_TargetTypeShare: 0x00040000,
|
|
40
|
+
NTLM_NegotiateExtendedSecurity: 0x00080000,
|
|
41
|
+
NTLM_NegotiateIdentify: 0x00100000,
|
|
42
|
+
NTLM_Unknown5: 0x00200000,
|
|
43
|
+
NTLM_RequestNonNTSessionKey: 0x00400000,
|
|
44
|
+
NTLM_NegotiateTargetInfo: 0x00800000,
|
|
45
|
+
NTLM_Unknown4: 0x01000000,
|
|
46
|
+
NTLM_NegotiateVersion: 0x02000000,
|
|
47
|
+
NTLM_Unknown3: 0x04000000,
|
|
48
|
+
NTLM_Unknown2: 0x08000000,
|
|
49
|
+
NTLM_Unknown1: 0x10000000,
|
|
50
|
+
NTLM_Negotiate128: 0x20000000,
|
|
51
|
+
NTLM_NegotiateKeyExchange: 0x40000000,
|
|
52
|
+
NTLM_Negotiate56: 0x80000000
|
|
53
|
+
};
|
|
54
|
+
var typeflags = {
|
|
55
|
+
NTLM_TYPE1_FLAGS: flags.NTLM_NegotiateUnicode + flags.NTLM_NegotiateOEM + flags.NTLM_RequestTarget + flags.NTLM_NegotiateNTLM + flags.NTLM_NegotiateOemDomainSupplied + flags.NTLM_NegotiateOemWorkstationSupplied + flags.NTLM_NegotiateAlwaysSign + flags.NTLM_NegotiateExtendedSecurity + flags.NTLM_NegotiateVersion + flags.NTLM_Negotiate128 + flags.NTLM_Negotiate56,
|
|
56
|
+
NTLM_TYPE2_FLAGS: flags.NTLM_NegotiateUnicode + flags.NTLM_RequestTarget + flags.NTLM_NegotiateNTLM + flags.NTLM_NegotiateAlwaysSign + flags.NTLM_NegotiateExtendedSecurity + flags.NTLM_NegotiateTargetInfo + flags.NTLM_NegotiateVersion + flags.NTLM_Negotiate128 + flags.NTLM_Negotiate56
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
function createType1Message(options) {
|
|
60
|
+
if (!options.domain) options.domain = '';
|
|
61
|
+
if (!options.workstation) options.workstation = '';
|
|
62
|
+
var domain = escape(options.domain.toUpperCase());
|
|
63
|
+
var workstation = escape(options.workstation.toUpperCase());
|
|
64
|
+
var protocol = 'NTLMSSP\0';
|
|
65
|
+
var BODY_LENGTH = 40;
|
|
66
|
+
var type1flags = typeflags.NTLM_TYPE1_FLAGS;
|
|
67
|
+
if (!domain || domain === '') type1flags = type1flags - flags.NTLM_NegotiateOemDomainSupplied;
|
|
68
|
+
var pos = 0;
|
|
69
|
+
var buf = Buffer.alloc(BODY_LENGTH + domain.length + workstation.length);
|
|
70
|
+
buf.write(protocol, pos, protocol.length);
|
|
71
|
+
pos += protocol.length; // protocol
|
|
72
|
+
|
|
73
|
+
buf.writeUInt32LE(1, pos);
|
|
74
|
+
pos += 4; // type 1
|
|
75
|
+
|
|
76
|
+
buf.writeUInt32LE(type1flags, pos);
|
|
77
|
+
pos += 4; // TYPE1 flag
|
|
78
|
+
|
|
79
|
+
buf.writeUInt16LE(domain.length, pos);
|
|
80
|
+
pos += 2; // domain length
|
|
81
|
+
|
|
82
|
+
buf.writeUInt16LE(domain.length, pos);
|
|
83
|
+
pos += 2; // domain max length
|
|
84
|
+
|
|
85
|
+
buf.writeUInt32LE(BODY_LENGTH + workstation.length, pos);
|
|
86
|
+
pos += 4; // domain buffer offset
|
|
87
|
+
|
|
88
|
+
buf.writeUInt16LE(workstation.length, pos);
|
|
89
|
+
pos += 2; // workstation length
|
|
90
|
+
|
|
91
|
+
buf.writeUInt16LE(workstation.length, pos);
|
|
92
|
+
pos += 2; // workstation max length
|
|
93
|
+
|
|
94
|
+
buf.writeUInt32LE(BODY_LENGTH, pos);
|
|
95
|
+
pos += 4; // workstation buffer offset
|
|
96
|
+
|
|
97
|
+
buf.writeUInt8(5, pos);
|
|
98
|
+
pos += 1; //ProductMajorVersion
|
|
99
|
+
|
|
100
|
+
buf.writeUInt8(1, pos);
|
|
101
|
+
pos += 1; //ProductMinorVersion
|
|
102
|
+
|
|
103
|
+
buf.writeUInt16LE(2600, pos);
|
|
104
|
+
pos += 2; //ProductBuild
|
|
105
|
+
|
|
106
|
+
buf.writeUInt8(0, pos);
|
|
107
|
+
pos += 1; //VersionReserved1
|
|
108
|
+
|
|
109
|
+
buf.writeUInt8(0, pos);
|
|
110
|
+
pos += 1; //VersionReserved2
|
|
111
|
+
|
|
112
|
+
buf.writeUInt8(0, pos);
|
|
113
|
+
pos += 1; //VersionReserved3
|
|
114
|
+
|
|
115
|
+
buf.writeUInt8(15, pos);
|
|
116
|
+
pos += 1; //NTLMRevisionCurrent
|
|
117
|
+
// length checks is to fix issue #46 and possibly #57
|
|
118
|
+
|
|
119
|
+
if (workstation.length != 0) buf.write(workstation, pos, workstation.length, 'ascii');
|
|
120
|
+
pos += workstation.length; // workstation string
|
|
121
|
+
|
|
122
|
+
if (domain.length != 0) buf.write(domain, pos, domain.length, 'ascii');
|
|
123
|
+
pos += domain.length; // domain string
|
|
124
|
+
|
|
125
|
+
return 'NTLM ' + buf.toString('base64');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function parseType2Message(rawmsg) {
|
|
129
|
+
var match = rawmsg.match(/NTLM (.+)?/);
|
|
130
|
+
|
|
131
|
+
if (!match || !match[1]) {
|
|
132
|
+
throw new Error("Couldn't find NTLM in the message type2 coming from the server");
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
var buf = Buffer.from(match[1], 'base64');
|
|
136
|
+
var msg = {};
|
|
137
|
+
msg.signature = buf.slice(0, 8);
|
|
138
|
+
msg.type = buf.readInt16LE(8);
|
|
139
|
+
|
|
140
|
+
if (msg.type != 2) {
|
|
141
|
+
throw new Error("Server didn't return a type 2 message");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
msg.targetNameLen = buf.readInt16LE(12);
|
|
145
|
+
msg.targetNameMaxLen = buf.readInt16LE(14);
|
|
146
|
+
msg.targetNameOffset = buf.readInt32LE(16);
|
|
147
|
+
msg.targetName = buf.slice(msg.targetNameOffset, msg.targetNameOffset + msg.targetNameMaxLen);
|
|
148
|
+
msg.negotiateFlags = buf.readInt32LE(20);
|
|
149
|
+
msg.serverChallenge = buf.slice(24, 32);
|
|
150
|
+
msg.reserved = buf.slice(32, 40);
|
|
151
|
+
|
|
152
|
+
if (msg.negotiateFlags & flags.NTLM_NegotiateTargetInfo) {
|
|
153
|
+
msg.targetInfoLen = buf.readInt16LE(40);
|
|
154
|
+
msg.targetInfoMaxLen = buf.readInt16LE(42);
|
|
155
|
+
msg.targetInfoOffset = buf.readInt32LE(44);
|
|
156
|
+
msg.targetInfo = buf.slice(msg.targetInfoOffset, msg.targetInfoOffset + msg.targetInfoLen);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return msg;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function createType3Message(msg2, options) {
|
|
163
|
+
if (!options.domain) options.domain = '';
|
|
164
|
+
if (!options.workstation) options.workstation = '';
|
|
165
|
+
if (!options.username) options.username = '';
|
|
166
|
+
if (!options.password) options.password = '';
|
|
167
|
+
var nonce = msg2.serverChallenge;
|
|
168
|
+
var username = options.username;
|
|
169
|
+
var password = options.password;
|
|
170
|
+
var lm_password = options.lm_password;
|
|
171
|
+
var nt_password = options.nt_password;
|
|
172
|
+
var negotiateFlags = msg2.negotiateFlags;
|
|
173
|
+
var isUnicode = negotiateFlags & flags.NTLM_NegotiateUnicode;
|
|
174
|
+
var isNegotiateExtendedSecurity = negotiateFlags & flags.NTLM_NegotiateExtendedSecurity;
|
|
175
|
+
var BODY_LENGTH = 72;
|
|
176
|
+
var domainName = escape(options.domain.toUpperCase());
|
|
177
|
+
var workstation = escape(options.workstation.toUpperCase());
|
|
178
|
+
var workstationBytes, domainNameBytes, usernameBytes, encryptedRandomSessionKeyBytes;
|
|
179
|
+
var encryptedRandomSessionKey = "";
|
|
180
|
+
|
|
181
|
+
if (isUnicode) {
|
|
182
|
+
workstationBytes = Buffer.from(workstation, 'utf16le');
|
|
183
|
+
domainNameBytes = Buffer.from(domainName, 'utf16le');
|
|
184
|
+
usernameBytes = Buffer.from(username, 'utf16le');
|
|
185
|
+
encryptedRandomSessionKeyBytes = Buffer.from(encryptedRandomSessionKey, 'utf16le');
|
|
186
|
+
} else {
|
|
187
|
+
workstationBytes = Buffer.from(workstation, 'ascii');
|
|
188
|
+
domainNameBytes = Buffer.from(domainName, 'ascii');
|
|
189
|
+
usernameBytes = Buffer.from(username, 'ascii');
|
|
190
|
+
encryptedRandomSessionKeyBytes = Buffer.from(encryptedRandomSessionKey, 'ascii');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
var lmChallengeResponse = calc_resp(lm_password != null ? lm_password : create_LM_hashed_password_v1(password), nonce);
|
|
194
|
+
var ntChallengeResponse = calc_resp(nt_password != null ? nt_password : create_NT_hashed_password_v1(password), nonce);
|
|
195
|
+
|
|
196
|
+
if (isNegotiateExtendedSecurity) {
|
|
197
|
+
/*
|
|
198
|
+
* NTLMv2 extended security is enabled. While this technically can mean NTLMv2 extended security with NTLMv1 protocol,
|
|
199
|
+
* servers that support extended security likely also support NTLMv2, so use NTLMv2.
|
|
200
|
+
* This is also how curl implements NTLMv2 "detection".
|
|
201
|
+
* By using NTLMv2, this supports communication with servers that forbid the use of NTLMv1 (e.g. via windows policies)
|
|
202
|
+
*
|
|
203
|
+
* However, the target info is needed to construct the NTLMv2 response so if it can't be negotiated,
|
|
204
|
+
* fall back to NTLMv1 with NTLMv2 extended security.
|
|
205
|
+
*/
|
|
206
|
+
var pwhash = nt_password != null ? nt_password : create_NT_hashed_password_v1(password);
|
|
207
|
+
var clientChallenge = "";
|
|
208
|
+
|
|
209
|
+
for (var i = 0; i < 8; i++) {
|
|
210
|
+
clientChallenge += String.fromCharCode(Math.floor(Math.random() * 256));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
var clientChallengeBytes = Buffer.from(clientChallenge, 'ascii');
|
|
214
|
+
var challenges = msg2.targetInfo ? calc_ntlmv2_resp(pwhash, username, domainName, msg2.targetInfo, nonce, clientChallengeBytes) : ntlm2sr_calc_resp(pwhash, nonce, clientChallengeBytes);
|
|
215
|
+
lmChallengeResponse = challenges.lmChallengeResponse;
|
|
216
|
+
ntChallengeResponse = challenges.ntChallengeResponse;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
var signature = 'NTLMSSP\0';
|
|
220
|
+
var pos = 0;
|
|
221
|
+
var buf = Buffer.alloc(BODY_LENGTH + domainNameBytes.length + usernameBytes.length + workstationBytes.length + lmChallengeResponse.length + ntChallengeResponse.length + encryptedRandomSessionKeyBytes.length);
|
|
222
|
+
buf.write(signature, pos, signature.length);
|
|
223
|
+
pos += signature.length;
|
|
224
|
+
buf.writeUInt32LE(3, pos);
|
|
225
|
+
pos += 4; // type 1
|
|
226
|
+
|
|
227
|
+
buf.writeUInt16LE(lmChallengeResponse.length, pos);
|
|
228
|
+
pos += 2; // LmChallengeResponseLen
|
|
229
|
+
|
|
230
|
+
buf.writeUInt16LE(lmChallengeResponse.length, pos);
|
|
231
|
+
pos += 2; // LmChallengeResponseMaxLen
|
|
232
|
+
|
|
233
|
+
buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length + usernameBytes.length + workstationBytes.length, pos);
|
|
234
|
+
pos += 4; // LmChallengeResponseOffset
|
|
235
|
+
|
|
236
|
+
buf.writeUInt16LE(ntChallengeResponse.length, pos);
|
|
237
|
+
pos += 2; // NtChallengeResponseLen
|
|
238
|
+
|
|
239
|
+
buf.writeUInt16LE(ntChallengeResponse.length, pos);
|
|
240
|
+
pos += 2; // NtChallengeResponseMaxLen
|
|
241
|
+
|
|
242
|
+
buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length + usernameBytes.length + workstationBytes.length + lmChallengeResponse.length, pos);
|
|
243
|
+
pos += 4; // NtChallengeResponseOffset
|
|
244
|
+
|
|
245
|
+
buf.writeUInt16LE(domainNameBytes.length, pos);
|
|
246
|
+
pos += 2; // DomainNameLen
|
|
247
|
+
|
|
248
|
+
buf.writeUInt16LE(domainNameBytes.length, pos);
|
|
249
|
+
pos += 2; // DomainNameMaxLen
|
|
250
|
+
|
|
251
|
+
buf.writeUInt32LE(BODY_LENGTH, pos);
|
|
252
|
+
pos += 4; // DomainNameOffset
|
|
253
|
+
|
|
254
|
+
buf.writeUInt16LE(usernameBytes.length, pos);
|
|
255
|
+
pos += 2; // UserNameLen
|
|
256
|
+
|
|
257
|
+
buf.writeUInt16LE(usernameBytes.length, pos);
|
|
258
|
+
pos += 2; // UserNameMaxLen
|
|
259
|
+
|
|
260
|
+
buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length, pos);
|
|
261
|
+
pos += 4; // UserNameOffset
|
|
262
|
+
|
|
263
|
+
buf.writeUInt16LE(workstationBytes.length, pos);
|
|
264
|
+
pos += 2; // WorkstationLen
|
|
265
|
+
|
|
266
|
+
buf.writeUInt16LE(workstationBytes.length, pos);
|
|
267
|
+
pos += 2; // WorkstationMaxLen
|
|
268
|
+
|
|
269
|
+
buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length + usernameBytes.length, pos);
|
|
270
|
+
pos += 4; // WorkstationOffset
|
|
271
|
+
|
|
272
|
+
buf.writeUInt16LE(encryptedRandomSessionKeyBytes.length, pos);
|
|
273
|
+
pos += 2; // EncryptedRandomSessionKeyLen
|
|
274
|
+
|
|
275
|
+
buf.writeUInt16LE(encryptedRandomSessionKeyBytes.length, pos);
|
|
276
|
+
pos += 2; // EncryptedRandomSessionKeyMaxLen
|
|
277
|
+
|
|
278
|
+
buf.writeUInt32LE(BODY_LENGTH + domainNameBytes.length + usernameBytes.length + workstationBytes.length + lmChallengeResponse.length + ntChallengeResponse.length, pos);
|
|
279
|
+
pos += 4; // EncryptedRandomSessionKeyOffset
|
|
280
|
+
// Fix #98
|
|
281
|
+
|
|
282
|
+
var flagsToWrite = isUnicode ? typeflags.NTLM_TYPE2_FLAGS : typeflags.NTLM_TYPE2_FLAGS - flags.NTLM_NegotiateUnicode;
|
|
283
|
+
buf.writeUInt32LE(flagsToWrite, pos);
|
|
284
|
+
pos += 4; // NegotiateFlags
|
|
285
|
+
|
|
286
|
+
buf.writeUInt8(5, pos);
|
|
287
|
+
pos++; // ProductMajorVersion
|
|
288
|
+
|
|
289
|
+
buf.writeUInt8(1, pos);
|
|
290
|
+
pos++; // ProductMinorVersion
|
|
291
|
+
|
|
292
|
+
buf.writeUInt16LE(2600, pos);
|
|
293
|
+
pos += 2; // ProductBuild
|
|
294
|
+
|
|
295
|
+
buf.writeUInt8(0, pos);
|
|
296
|
+
pos++; // VersionReserved1
|
|
297
|
+
|
|
298
|
+
buf.writeUInt8(0, pos);
|
|
299
|
+
pos++; // VersionReserved2
|
|
300
|
+
|
|
301
|
+
buf.writeUInt8(0, pos);
|
|
302
|
+
pos++; // VersionReserved3
|
|
303
|
+
|
|
304
|
+
buf.writeUInt8(15, pos);
|
|
305
|
+
pos++; // NTLMRevisionCurrent
|
|
306
|
+
|
|
307
|
+
domainNameBytes.copy(buf, pos);
|
|
308
|
+
pos += domainNameBytes.length;
|
|
309
|
+
usernameBytes.copy(buf, pos);
|
|
310
|
+
pos += usernameBytes.length;
|
|
311
|
+
workstationBytes.copy(buf, pos);
|
|
312
|
+
pos += workstationBytes.length;
|
|
313
|
+
lmChallengeResponse.copy(buf, pos);
|
|
314
|
+
pos += lmChallengeResponse.length;
|
|
315
|
+
ntChallengeResponse.copy(buf, pos);
|
|
316
|
+
pos += ntChallengeResponse.length;
|
|
317
|
+
encryptedRandomSessionKeyBytes.copy(buf, pos);
|
|
318
|
+
pos += encryptedRandomSessionKeyBytes.length;
|
|
319
|
+
return 'NTLM ' + buf.toString('base64');
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function create_LM_hashed_password_v1(password) {
|
|
323
|
+
// fix the password length to 14 bytes
|
|
324
|
+
password = password.toUpperCase();
|
|
325
|
+
var passwordBytes = Buffer.from(password, 'ascii');
|
|
326
|
+
var passwordBytesPadded = Buffer.alloc(14);
|
|
327
|
+
passwordBytesPadded.fill("\0");
|
|
328
|
+
var sourceEnd = 14;
|
|
329
|
+
if (passwordBytes.length < 14) sourceEnd = passwordBytes.length;
|
|
330
|
+
passwordBytes.copy(passwordBytesPadded, 0, 0, sourceEnd); // split into 2 parts of 7 bytes:
|
|
331
|
+
|
|
332
|
+
var firstPart = passwordBytesPadded.slice(0, 7);
|
|
333
|
+
var secondPart = passwordBytesPadded.slice(7);
|
|
334
|
+
|
|
335
|
+
function encrypt(buf) {
|
|
336
|
+
var key = insertZerosEvery7Bits(buf);
|
|
337
|
+
var des = desjs.DES.create({
|
|
338
|
+
type: 'encrypt',
|
|
339
|
+
key: key
|
|
340
|
+
});
|
|
341
|
+
var magicKey = Buffer.from('KGS!@#$%', 'ascii'); // page 57 in [MS-NLMP]
|
|
342
|
+
|
|
343
|
+
var encrypted = des.update(magicKey);
|
|
344
|
+
return Buffer.from(encrypted);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
var firstPartEncrypted = encrypt(firstPart);
|
|
348
|
+
var secondPartEncrypted = encrypt(secondPart);
|
|
349
|
+
return Buffer.concat([firstPartEncrypted, secondPartEncrypted]);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function insertZerosEvery7Bits(buf) {
|
|
353
|
+
var binaryArray = bytes2binaryArray(buf);
|
|
354
|
+
var newBinaryArray = [];
|
|
355
|
+
|
|
356
|
+
for (var i = 0; i < binaryArray.length; i++) {
|
|
357
|
+
newBinaryArray.push(binaryArray[i]);
|
|
358
|
+
|
|
359
|
+
if ((i + 1) % 7 === 0) {
|
|
360
|
+
newBinaryArray.push(0);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return binaryArray2bytes(newBinaryArray);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function bytes2binaryArray(buf) {
|
|
368
|
+
var hex2binary = {
|
|
369
|
+
0: [0, 0, 0, 0],
|
|
370
|
+
1: [0, 0, 0, 1],
|
|
371
|
+
2: [0, 0, 1, 0],
|
|
372
|
+
3: [0, 0, 1, 1],
|
|
373
|
+
4: [0, 1, 0, 0],
|
|
374
|
+
5: [0, 1, 0, 1],
|
|
375
|
+
6: [0, 1, 1, 0],
|
|
376
|
+
7: [0, 1, 1, 1],
|
|
377
|
+
8: [1, 0, 0, 0],
|
|
378
|
+
9: [1, 0, 0, 1],
|
|
379
|
+
A: [1, 0, 1, 0],
|
|
380
|
+
B: [1, 0, 1, 1],
|
|
381
|
+
C: [1, 1, 0, 0],
|
|
382
|
+
D: [1, 1, 0, 1],
|
|
383
|
+
E: [1, 1, 1, 0],
|
|
384
|
+
F: [1, 1, 1, 1]
|
|
385
|
+
};
|
|
386
|
+
var hexString = buf.toString('hex').toUpperCase();
|
|
387
|
+
var array = [];
|
|
388
|
+
|
|
389
|
+
for (var i = 0; i < hexString.length; i++) {
|
|
390
|
+
var hexchar = hexString.charAt(i);
|
|
391
|
+
array = array.concat(hex2binary[hexchar]);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return array;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
function binaryArray2bytes(array) {
|
|
398
|
+
var binary2hex = {
|
|
399
|
+
'0000': 0,
|
|
400
|
+
'0001': 1,
|
|
401
|
+
'0010': 2,
|
|
402
|
+
'0011': 3,
|
|
403
|
+
'0100': 4,
|
|
404
|
+
'0101': 5,
|
|
405
|
+
'0110': 6,
|
|
406
|
+
'0111': 7,
|
|
407
|
+
'1000': 8,
|
|
408
|
+
'1001': 9,
|
|
409
|
+
'1010': 'A',
|
|
410
|
+
'1011': 'B',
|
|
411
|
+
'1100': 'C',
|
|
412
|
+
'1101': 'D',
|
|
413
|
+
'1110': 'E',
|
|
414
|
+
'1111': 'F'
|
|
415
|
+
};
|
|
416
|
+
var bufArray = [];
|
|
417
|
+
|
|
418
|
+
for (var i = 0; i < array.length; i += 8) {
|
|
419
|
+
if (i + 7 > array.length) break;
|
|
420
|
+
var binString1 = '' + array[i] + '' + array[i + 1] + '' + array[i + 2] + '' + array[i + 3];
|
|
421
|
+
var binString2 = '' + array[i + 4] + '' + array[i + 5] + '' + array[i + 6] + '' + array[i + 7];
|
|
422
|
+
var hexchar1 = binary2hex[binString1];
|
|
423
|
+
var hexchar2 = binary2hex[binString2];
|
|
424
|
+
var buf = Buffer.from(hexchar1 + '' + hexchar2, 'hex');
|
|
425
|
+
bufArray.push(buf);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return Buffer.concat(bufArray);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function create_NT_hashed_password_v1(password) {
|
|
432
|
+
var buf = Buffer.from(password, 'utf16le');
|
|
433
|
+
var md4 = jsmd4.create();
|
|
434
|
+
md4.update(buf);
|
|
435
|
+
return Buffer.from(md4.digest());
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function calc_resp(password_hash, server_challenge) {
|
|
439
|
+
// padding with zeros to make the hash 21 bytes long
|
|
440
|
+
var passHashPadded = Buffer.alloc(21);
|
|
441
|
+
passHashPadded.fill("\0");
|
|
442
|
+
password_hash.copy(passHashPadded, 0, 0, password_hash.length);
|
|
443
|
+
var resArray = [];
|
|
444
|
+
var des = desjs.DES.create({
|
|
445
|
+
type: 'encrypt',
|
|
446
|
+
key: insertZerosEvery7Bits(passHashPadded.slice(0, 7))
|
|
447
|
+
});
|
|
448
|
+
resArray.push(Buffer.from(des.update(server_challenge.slice(0, 8))));
|
|
449
|
+
des = desjs.DES.create({
|
|
450
|
+
type: 'encrypt',
|
|
451
|
+
key: insertZerosEvery7Bits(passHashPadded.slice(7, 14))
|
|
452
|
+
});
|
|
453
|
+
resArray.push(Buffer.from(des.update(server_challenge.slice(0, 8))));
|
|
454
|
+
des = desjs.DES.create({
|
|
455
|
+
type: 'encrypt',
|
|
456
|
+
key: insertZerosEvery7Bits(passHashPadded.slice(14, 21))
|
|
457
|
+
});
|
|
458
|
+
resArray.push(Buffer.from(des.update(server_challenge.slice(0, 8))));
|
|
459
|
+
return Buffer.concat(resArray);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function hmac_md5(key, data) {
|
|
463
|
+
var hmac = crypto.createHmac('md5', key);
|
|
464
|
+
hmac.update(data);
|
|
465
|
+
return hmac.digest();
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
function ntlm2sr_calc_resp(responseKeyNT, serverChallenge, clientChallenge) {
|
|
469
|
+
// padding with zeros to make the hash 16 bytes longer
|
|
470
|
+
var lmChallengeResponse = Buffer.alloc(clientChallenge.length + 16);
|
|
471
|
+
lmChallengeResponse.fill("\0");
|
|
472
|
+
clientChallenge.copy(lmChallengeResponse, 0, 0, clientChallenge.length);
|
|
473
|
+
var buf = Buffer.concat([serverChallenge, clientChallenge]);
|
|
474
|
+
var md5 = crypto.createHash('md5');
|
|
475
|
+
md5.update(buf);
|
|
476
|
+
var sess = md5.digest();
|
|
477
|
+
var ntChallengeResponse = calc_resp(responseKeyNT, sess.slice(0, 8));
|
|
478
|
+
return {
|
|
479
|
+
lmChallengeResponse: lmChallengeResponse,
|
|
480
|
+
ntChallengeResponse: ntChallengeResponse
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function calc_ntlmv2_resp(pwhash, username, domain, targetInfo, serverChallenge, clientChallenge) {
|
|
485
|
+
var responseKeyNTLM = NTOWFv2(pwhash, username, domain);
|
|
486
|
+
var lmV2ChallengeResponse = Buffer.concat([hmac_md5(responseKeyNTLM, Buffer.concat([serverChallenge, clientChallenge])), clientChallenge]); // 11644473600000 = diff between 1970 and 1601
|
|
487
|
+
|
|
488
|
+
var now = Date.now();
|
|
489
|
+
var timestamp = (BigInt(now) + BigInt(11644473600000)) * BigInt(10000); // we need BigInt to be able to write it to a buffer
|
|
490
|
+
|
|
491
|
+
var timestampBuffer = Buffer.alloc(8);
|
|
492
|
+
timestampBuffer.writeBigUInt64LE(timestamp);
|
|
493
|
+
var zero32Bit = Buffer.alloc(4, 0);
|
|
494
|
+
var temp = Buffer.concat([// Version
|
|
495
|
+
Buffer.from([0x01, 0x01, 0x00, 0x00]), zero32Bit, timestampBuffer, clientChallenge, zero32Bit, targetInfo, zero32Bit]);
|
|
496
|
+
var proofString = hmac_md5(responseKeyNTLM, Buffer.concat([serverChallenge, temp]));
|
|
497
|
+
var ntV2ChallengeResponse = Buffer.concat([proofString, temp]);
|
|
498
|
+
return {
|
|
499
|
+
lmChallengeResponse: lmV2ChallengeResponse,
|
|
500
|
+
ntChallengeResponse: ntV2ChallengeResponse
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function NTOWFv2(pwhash, user, domain) {
|
|
505
|
+
return hmac_md5(pwhash, Buffer.from(user.toUpperCase() + domain, 'utf16le'));
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
exports.createType1Message = createType1Message;
|
|
509
|
+
exports.parseType2Message = parseType2Message;
|
|
510
|
+
exports.createType3Message = createType3Message;
|
|
511
|
+
exports.create_NT_hashed_password = create_NT_hashed_password_v1;
|
|
512
|
+
exports.create_LM_hashed_password = create_LM_hashed_password_v1;
|
|
513
|
+
/* eslint-enable */
|
|
514
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwL250bG0uanMiXSwibmFtZXMiOlsiY3J5cHRvIiwicmVxdWlyZSIsImpzbWQ0IiwiZGVzanMiLCJmbGFncyIsIk5UTE1fTmVnb3RpYXRlVW5pY29kZSIsIk5UTE1fTmVnb3RpYXRlT0VNIiwiTlRMTV9SZXF1ZXN0VGFyZ2V0IiwiTlRMTV9Vbmtub3duOSIsIk5UTE1fTmVnb3RpYXRlU2lnbiIsIk5UTE1fTmVnb3RpYXRlU2VhbCIsIk5UTE1fTmVnb3RpYXRlRGF0YWdyYW0iLCJOVExNX05lZ290aWF0ZUxhbk1hbmFnZXJLZXkiLCJOVExNX1Vua25vd244IiwiTlRMTV9OZWdvdGlhdGVOVExNIiwiTlRMTV9OZWdvdGlhdGVOVE9ubHkiLCJOVExNX0Fub255bW91cyIsIk5UTE1fTmVnb3RpYXRlT2VtRG9tYWluU3VwcGxpZWQiLCJOVExNX05lZ290aWF0ZU9lbVdvcmtzdGF0aW9uU3VwcGxpZWQiLCJOVExNX1Vua25vd242IiwiTlRMTV9OZWdvdGlhdGVBbHdheXNTaWduIiwiTlRMTV9UYXJnZXRUeXBlRG9tYWluIiwiTlRMTV9UYXJnZXRUeXBlU2VydmVyIiwiTlRMTV9UYXJnZXRUeXBlU2hhcmUiLCJOVExNX05lZ290aWF0ZUV4dGVuZGVkU2VjdXJpdHkiLCJOVExNX05lZ290aWF0ZUlkZW50aWZ5IiwiTlRMTV9Vbmtub3duNSIsIk5UTE1fUmVxdWVzdE5vbk5UU2Vzc2lvbktleSIsIk5UTE1fTmVnb3RpYXRlVGFyZ2V0SW5mbyIsIk5UTE1fVW5rbm93bjQiLCJOVExNX05lZ290aWF0ZVZlcnNpb24iLCJOVExNX1Vua25vd24zIiwiTlRMTV9Vbmtub3duMiIsIk5UTE1fVW5rbm93bjEiLCJOVExNX05lZ290aWF0ZTEyOCIsIk5UTE1fTmVnb3RpYXRlS2V5RXhjaGFuZ2UiLCJOVExNX05lZ290aWF0ZTU2IiwidHlwZWZsYWdzIiwiTlRMTV9UWVBFMV9GTEFHUyIsIk5UTE1fVFlQRTJfRkxBR1MiLCJjcmVhdGVUeXBlMU1lc3NhZ2UiLCJvcHRpb25zIiwiZG9tYWluIiwid29ya3N0YXRpb24iLCJlc2NhcGUiLCJ0b1VwcGVyQ2FzZSIsInByb3RvY29sIiwiQk9EWV9MRU5HVEgiLCJ0eXBlMWZsYWdzIiwicG9zIiwiYnVmIiwiQnVmZmVyIiwiYWxsb2MiLCJsZW5ndGgiLCJ3cml0ZSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVSW50OCIsInRvU3RyaW5nIiwicGFyc2VUeXBlMk1lc3NhZ2UiLCJyYXdtc2ciLCJtYXRjaCIsIkVycm9yIiwiZnJvbSIsIm1zZyIsInNpZ25hdHVyZSIsInNsaWNlIiwidHlwZSIsInJlYWRJbnQxNkxFIiwidGFyZ2V0TmFtZUxlbiIsInRhcmdldE5hbWVNYXhMZW4iLCJ0YXJnZXROYW1lT2Zmc2V0IiwicmVhZEludDMyTEUiLCJ0YXJnZXROYW1lIiwibmVnb3RpYXRlRmxhZ3MiLCJzZXJ2ZXJDaGFsbGVuZ2UiLCJyZXNlcnZlZCIsInRhcmdldEluZm9MZW4iLCJ0YXJnZXRJbmZvTWF4TGVuIiwidGFyZ2V0SW5mb09mZnNldCIsInRhcmdldEluZm8iLCJjcmVhdGVUeXBlM01lc3NhZ2UiLCJtc2cyIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsIm5vbmNlIiwibG1fcGFzc3dvcmQiLCJudF9wYXNzd29yZCIsImlzVW5pY29kZSIsImlzTmVnb3RpYXRlRXh0ZW5kZWRTZWN1cml0eSIsImRvbWFpbk5hbWUiLCJ3b3Jrc3RhdGlvbkJ5dGVzIiwiZG9tYWluTmFtZUJ5dGVzIiwidXNlcm5hbWVCeXRlcyIsImVuY3J5cHRlZFJhbmRvbVNlc3Npb25LZXlCeXRlcyIsImVuY3J5cHRlZFJhbmRvbVNlc3Npb25LZXkiLCJsbUNoYWxsZW5nZVJlc3BvbnNlIiwiY2FsY19yZXNwIiwiY3JlYXRlX0xNX2hhc2hlZF9wYXNzd29yZF92MSIsIm50Q2hhbGxlbmdlUmVzcG9uc2UiLCJjcmVhdGVfTlRfaGFzaGVkX3Bhc3N3b3JkX3YxIiwicHdoYXNoIiwiY2xpZW50Q2hhbGxlbmdlIiwiaSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImNsaWVudENoYWxsZW5nZUJ5dGVzIiwiY2hhbGxlbmdlcyIsImNhbGNfbnRsbXYyX3Jlc3AiLCJudGxtMnNyX2NhbGNfcmVzcCIsImZsYWdzVG9Xcml0ZSIsImNvcHkiLCJwYXNzd29yZEJ5dGVzIiwicGFzc3dvcmRCeXRlc1BhZGRlZCIsImZpbGwiLCJzb3VyY2VFbmQiLCJmaXJzdFBhcnQiLCJzZWNvbmRQYXJ0IiwiZW5jcnlwdCIsImtleSIsImluc2VydFplcm9zRXZlcnk3Qml0cyIsImRlcyIsIkRFUyIsImNyZWF0ZSIsIm1hZ2ljS2V5IiwiZW5jcnlwdGVkIiwidXBkYXRlIiwiZmlyc3RQYXJ0RW5jcnlwdGVkIiwic2Vjb25kUGFydEVuY3J5cHRlZCIsImNvbmNhdCIsImJpbmFyeUFycmF5IiwiYnl0ZXMyYmluYXJ5QXJyYXkiLCJuZXdCaW5hcnlBcnJheSIsInB1c2giLCJiaW5hcnlBcnJheTJieXRlcyIsImhleDJiaW5hcnkiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJoZXhTdHJpbmciLCJhcnJheSIsImhleGNoYXIiLCJjaGFyQXQiLCJiaW5hcnkyaGV4IiwiYnVmQXJyYXkiLCJiaW5TdHJpbmcxIiwiYmluU3RyaW5nMiIsImhleGNoYXIxIiwiaGV4Y2hhcjIiLCJtZDQiLCJkaWdlc3QiLCJwYXNzd29yZF9oYXNoIiwic2VydmVyX2NoYWxsZW5nZSIsInBhc3NIYXNoUGFkZGVkIiwicmVzQXJyYXkiLCJobWFjX21kNSIsImRhdGEiLCJobWFjIiwiY3JlYXRlSG1hYyIsInJlc3BvbnNlS2V5TlQiLCJtZDUiLCJjcmVhdGVIYXNoIiwic2VzcyIsInJlc3BvbnNlS2V5TlRMTSIsIk5UT1dGdjIiLCJsbVYyQ2hhbGxlbmdlUmVzcG9uc2UiLCJub3ciLCJEYXRlIiwidGltZXN0YW1wIiwiQmlnSW50IiwidGltZXN0YW1wQnVmZmVyIiwid3JpdGVCaWdVSW50NjRMRSIsInplcm8zMkJpdCIsInRlbXAiLCJwcm9vZlN0cmluZyIsIm50VjJDaGFsbGVuZ2VSZXNwb25zZSIsInVzZXIiLCJleHBvcnRzIiwiY3JlYXRlX05UX2hhc2hlZF9wYXNzd29yZCIsImNyZWF0ZV9MTV9oYXNoZWRfcGFzc3dvcmQiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBLElBQUlBLE1BQU0sR0FBR0MsT0FBTyxDQUFDLFFBQUQsQ0FBcEI7O0FBQ0EsSUFBSUMsS0FBSyxHQUFHRCxPQUFPLENBQUMsUUFBRCxDQUFuQjs7QUFDQSxJQUFJRSxLQUFLLEdBQUdGLE9BQU8sQ0FBQyxRQUFELENBQW5COztBQUVBLElBQUlHLEtBQUssR0FBRztBQUNYQyxFQUFBQSxxQkFBcUIsRUFBbUIsVUFEN0I7QUFFWEMsRUFBQUEsaUJBQWlCLEVBQXVCLFVBRjdCO0FBR1hDLEVBQUFBLGtCQUFrQixFQUFzQixVQUg3QjtBQUlYQyxFQUFBQSxhQUFhLEVBQTJCLFVBSjdCO0FBS1hDLEVBQUFBLGtCQUFrQixFQUFzQixVQUw3QjtBQU1YQyxFQUFBQSxrQkFBa0IsRUFBc0IsVUFON0I7QUFPWEMsRUFBQUEsc0JBQXNCLEVBQWtCLFVBUDdCO0FBUVhDLEVBQUFBLDJCQUEyQixFQUFhLFVBUjdCO0FBU1hDLEVBQUFBLGFBQWEsRUFBMkIsVUFUN0I7QUFVWEMsRUFBQUEsa0JBQWtCLEVBQXNCLFVBVjdCO0FBV1hDLEVBQUFBLG9CQUFvQixFQUFvQixVQVg3QjtBQVlYQyxFQUFBQSxjQUFjLEVBQTBCLFVBWjdCO0FBYVhDLEVBQUFBLCtCQUErQixFQUFTLFVBYjdCO0FBY1hDLEVBQUFBLG9DQUFvQyxFQUFJLFVBZDdCO0FBZVhDLEVBQUFBLGFBQWEsRUFBMkIsVUFmN0I7QUFnQlhDLEVBQUFBLHdCQUF3QixFQUFnQixVQWhCN0I7QUFpQlhDLEVBQUFBLHFCQUFxQixFQUFtQixVQWpCN0I7QUFrQlhDLEVBQUFBLHFCQUFxQixFQUFtQixVQWxCN0I7QUFtQlhDLEVBQUFB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bUJBQW1CLEVBQUUyRSxxQkFEZjtBQUVOeEUsSUFBQUEsbUJBQW1CLEVBQUVrRjtBQUZmLEdBQVA7QUFJSDs7QUFFRCxTQUFTWCxPQUFULENBQWlCckUsTUFBakIsRUFBeUJpRixJQUF6QixFQUErQjVJLE1BQS9CLEVBQXNDO0FBQ3JDLFNBQU91SCxRQUFRLENBQUM1RCxNQUFELEVBQVNsRCxNQUFNLENBQUNZLElBQVAsQ0FBWXVILElBQUksQ0FBQ3pJLFdBQUwsS0FBcUJILE1BQWpDLEVBQXlDLFNBQXpDLENBQVQsQ0FBZjtBQUNBOztBQUVENkksT0FBTyxDQUFDL0ksa0JBQVIsR0FBNkJBLGtCQUE3QjtBQUNBK0ksT0FBTyxDQUFDNUgsaUJBQVIsR0FBNEJBLGlCQUE1QjtBQUNBNEgsT0FBTyxDQUFDdEcsa0JBQVIsR0FBNkJBLGtCQUE3QjtBQUNBc0csT0FBTyxDQUFDQyx5QkFBUixHQUFvQ3BGLDRCQUFwQztBQUNBbUYsT0FBTyxDQUFDRSx5QkFBUixHQUFvQ3ZGLDRCQUFwQztBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMyBTYW0gRGVjcm9jayBodHRwczovL2dpdGh1Yi5jb20vU2FtRGVjcm9jay9cclxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICpcclxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXHJcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cclxuICovXHJcbi8qIGVzbGludC1kaXNhYmxlICovXHJcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcclxudmFyIGpzbWQ0ID0gcmVxdWlyZShcImpzLW1kNFwiKTtcclxudmFyIGRlc2pzID0gcmVxdWlyZShcImRlcy5qc1wiKTtcclxuXHJcbnZhciBmbGFncyA9IHtcclxuXHROVExNX05lZ290aWF0ZVVuaWNvZGUgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDAwMSxcclxuXHROVExNX05lZ290aWF0ZU9FTSAgICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDAwMixcclxuXHROVExNX1JlcXVlc3RUYXJnZXQgICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDAwNCxcclxuXHROVExNX1Vua25vd245ICAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDAwOCxcclxuXHROVExNX05lZ290aWF0ZVNpZ24gICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDAxMCxcclxuXHROVExNX05lZ290aWF0ZVNlYWwgICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDAyMCxcclxuXHROVExNX05lZ290aWF0ZURhdGFncmFtICAgICAgICAgICAgICAgOiAgMHgwMDAwMDA0MCxcclxuXHROVExNX05lZ290aWF0ZUxhbk1hbmFnZXJLZXkgICAgICAgICAgOiAgMHgwMDAwMDA4MCxcclxuXHROVExNX1Vua25vd244ICAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDEwMCxcclxuXHROVExNX05lZ290aWF0ZU5UTE0gICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDIwMCxcclxuXHROVExNX05lZ290aWF0ZU5UT25seSAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDQwMCxcclxuXHROVExNX0Fub255bW91cyAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwMDgwMCxcclxuXHROVExNX05lZ290aWF0ZU9lbURvbWFpblN1cHBsaWVkICAgICAgOiAgMHgwMDAwMTAwMCxcclxuXHROVExNX05lZ290aWF0ZU9lbVdvcmtzdGF0aW9uU3VwcGxpZWQgOiAgMHgwMDAwMjAwMCxcclxuXHROVExNX1Vua25vd242ICAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgwMDAwNDAwMCxcclxuXHROVExNX05lZ290aWF0ZUFsd2F5c1NpZ24gICAgICAgICAgICAgOiAgMHgwMDAwODAwMCxcclxuXHROVExNX1RhcmdldFR5cGVEb21haW4gICAgICAgICAgICAgICAgOiAgMHgwMDAxMDAwMCxcclxuXHROVExNX1RhcmdldFR5cGVTZXJ2ZXIgICAgICAgICAgICAgICAgOiAgMHgwMDAyMDAwMCxcclxuXHROVExNX1RhcmdldFR5cGVTaGFyZSAgICAgICAgICAgICAgICAgOiAgMHgwMDA0MDAwMCxcclxuXHROVExNX05lZ290aWF0ZUV4dGVuZGVkU2VjdXJpdHkgICAgICAgOiAgMHgwMDA4MDAwMCxcclxuXHROVExNX05lZ290aWF0ZUlkZW50aWZ5ICAgICAgICAgICAgICAgOiAgMHgwMDEwMDAwMCxcclxuXHROVExNX1Vua25vd241ICAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgwMDIwMDAwMCxcclxuXHROVExNX1JlcXVlc3ROb25OVFNlc3Npb25LZXkgICAgICAgICAgOiAgMHgwMDQwMDAwMCxcclxuXHROVExNX05lZ290aWF0ZVRhcmdldEluZm8gICAgICAgICAgICAgOiAgMHgwMDgwMDAwMCxcclxuXHROVExNX1Vua25vd240ICAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgwMTAwMDAwMCxcclxuXHROVExNX05lZ290aWF0ZVZlcnNpb24gICAgICAgICAgICAgICAgOiAgMHgwMjAwMDAwMCxcclxuXHROVExNX1Vua25vd24zICAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgwNDAwMDAwMCxcclxuXHROVExNX1Vua25vd24yICAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgwODAwMDAwMCxcclxuXHROVExNX1Vua25vd24xICAgICAgICAgICAgICAgICAgICAgICAgOiAgMHgxMDAwMDAwMCxcclxuXHROVExNX05lZ290aWF0ZTEyOCAgICAgICAgICAgICAgICAgICAgOiAgMHgyMDAwMDAwMCxcclxuXHROVExNX05lZ290aWF0ZUtleUV4Y2hhbmdlICAgICAgICAgICAgOiAgMHg0MDAwMDAwMCxcclxuXHROVExNX05lZ290aWF0ZTU2ICAgICAgICAgICAgICAgICAgICAgOiAgMHg4MDAwMDAwMFxyXG59O1xyXG52YXIgdHlwZWZsYWdzID0ge1xyXG5cdE5UTE1fVFlQRTFfRkxBR1MgOiBcdCAgZmxhZ3MuTlRMTV9OZWdvdGlhdGVVbmljb2RlXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVPRU1cclxuXHRcdFx0XHRcdFx0KyBmbGFncy5OVExNX1JlcXVlc3RUYXJnZXRcclxuXHRcdFx0XHRcdFx0KyBmbGFncy5OVExNX05lZ290aWF0ZU5UTE1cclxuXHRcdFx0XHRcdFx0KyBmbGFncy5OVExNX05lZ290aWF0ZU9lbURvbWFpblN1cHBsaWVkXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVPZW1Xb3Jrc3RhdGlvblN1cHBsaWVkXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVBbHdheXNTaWduXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVFeHRlbmRlZFNlY3VyaXR5XHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVWZXJzaW9uXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGUxMjhcclxuXHRcdFx0XHRcdFx0KyBmbGFncy5OVExNX05lZ290aWF0ZTU2LFxyXG5cclxuXHROVExNX1RZUEUyX0ZMQUdTIDogICAgZmxhZ3MuTlRMTV9OZWdvdGlhdGVVbmljb2RlXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9SZXF1ZXN0VGFyZ2V0XHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVOVExNXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVBbHdheXNTaWduXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVFeHRlbmRlZFNlY3VyaXR5XHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVUYXJnZXRJbmZvXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGVWZXJzaW9uXHJcblx0XHRcdFx0XHRcdCsgZmxhZ3MuTlRMTV9OZWdvdGlhdGUxMjhcclxuXHRcdFx0XHRcdFx0KyBmbGFncy5OVExNX05lZ290aWF0ZTU2XHJcbn07XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVUeXBlMU1lc3NhZ2Uob3B0aW9ucyl7XHJcblx0aWYoIW9wdGlvbnMuZG9tYWluKSBvcHRpb25zLmRvbWFpbiA9ICcnO1xyXG5cdGlmKCFvcHRpb25zLndvcmtzdGF0aW9uKSBvcHRpb25zLndvcmtzdGF0aW9uID0gJyc7XHJcblxyXG5cdHZhciBkb21haW4gPSBlc2NhcGUob3B0aW9ucy5kb21haW4udG9VcHBlckNhc2UoKSk7XHJcblx0dmFyIHdvcmtzdGF0aW9uID0gZXNjYXBlKG9wdGlvbnMud29ya3N0YXRpb24udG9VcHBlckNhc2UoKSk7XHJcblx0dmFyIHByb3RvY29sID0gJ05UTE1TU1BcXDAnO1xyXG5cclxuXHR2YXIgQk9EWV9MRU5HVEggPSA0MDtcclxuXHJcblx0dmFyIHR5cGUxZmxhZ3MgPSB0eXBlZmxhZ3MuTlRMTV9UWVBFMV9GTEFHUztcclxuXHRpZighZG9tYWluIHx8IGRvbWFpbiA9PT0gJycpXHJcblx0XHR0eXBlMWZsYWdzID0gdHlwZTFmbGFncyAtIGZsYWdzLk5UTE1fTmVnb3RpYXRlT2VtRG9tYWluU3VwcGxpZWQ7XHJcblxyXG5cdHZhciBwb3MgPSAwO1xyXG5cdHZhciBidWYgPSBCdWZmZXIuYWxsb2MoQk9EWV9MRU5HVEggKyBkb21haW4ubGVuZ3RoICsgd29ya3N0YXRpb24ubGVuZ3RoKTtcclxuXHJcblxyXG5cdGJ1Zi53cml0ZShwcm90b2NvbCwgcG9zLCBwcm90b2NvbC5sZW5ndGgpOyBwb3MgKz0gcHJvdG9jb2wubGVuZ3RoOyAvLyBwcm90b2NvbFxyXG5cdGJ1Zi53cml0ZVVJbnQzMkxFKDEsIHBvcyk7IHBvcyArPSA0OyAgICAgICAgICAvLyB0eXBlIDFcclxuXHRidWYud3JpdGVVSW50MzJMRSh0eXBlMWZsYWdzLCBwb3MpOyBwb3MgKz0gNDsgLy8gVFlQRTEgZmxhZ1xyXG5cclxuXHRidWYud3JpdGVVSW50MTZMRShkb21haW4ubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gZG9tYWluIGxlbmd0aFxyXG5cdGJ1Zi53cml0ZVVJbnQxNkxFKGRvbWFpbi5sZW5ndGgsIHBvcyk7IHBvcyArPSAyOyAvLyBkb21haW4gbWF4IGxlbmd0aFxyXG5cdGJ1Zi53cml0ZVVJbnQzMkxFKEJPRFlfTEVOR1RIICsgd29ya3N0YXRpb24ubGVuZ3RoLCBwb3MpOyBwb3MgKz0gNDsgLy8gZG9tYWluIGJ1ZmZlciBvZmZzZXRcclxuXHJcblx0YnVmLndyaXRlVUludDE2TEUod29ya3N0YXRpb24ubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gd29ya3N0YXRpb24gbGVuZ3RoXHJcblx0YnVmLndyaXRlVUludDE2TEUod29ya3N0YXRpb24ubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gd29ya3N0YXRpb24gbWF4IGxlbmd0aFxyXG5cdGJ1Zi53cml0ZVVJbnQzMkxFKEJPRFlfTEVOR1RILCBwb3MpOyBwb3MgKz0gNDsgLy8gd29ya3N0YXRpb24gYnVmZmVyIG9mZnNldFxyXG5cclxuXHRidWYud3JpdGVVSW50OCg1LCBwb3MpOyBwb3MgKz0gMTsgICAgICAvL1Byb2R1Y3RNYWpvclZlcnNpb25cclxuXHRidWYud3JpdGVVSW50OCgxLCBwb3MpOyBwb3MgKz0gMTsgICAgICAvL1Byb2R1Y3RNaW5vclZlcnNpb25cclxuXHRidWYud3JpdGVVSW50MTZMRSgyNjAwLCBwb3MpOyBwb3MgKz0gMjsgLy9Qcm9kdWN0QnVpbGRcclxuXHJcblx0YnVmLndyaXRlVUludDgoMCAsIHBvcyk7IHBvcyArPSAxOyAvL1ZlcnNpb25SZXNlcnZlZDFcclxuXHRidWYud3JpdGVVSW50OCgwICwgcG9zKTsgcG9zICs9IDE7IC8vVmVyc2lvblJlc2VydmVkMlxyXG5cdGJ1Zi53cml0ZVVJbnQ4KDAgLCBwb3MpOyBwb3MgKz0gMTsgLy9WZXJzaW9uUmVzZXJ2ZWQzXHJcblx0YnVmLndyaXRlVUludDgoMTUsIHBvcyk7IHBvcyArPSAxOyAvL05UTE1SZXZpc2lvbkN1cnJlbnRcclxuXHJcblxyXG5cdC8vIGxlbmd0aCBjaGVja3MgaXMgdG8gZml4IGlzc3VlICM0NiBhbmQgcG9zc2libHkgIzU3XHJcblx0aWYod29ya3N0YXRpb24ubGVuZ3RoICE9MCkgYnVmLndyaXRlKHdvcmtzdGF0aW9uLCBwb3MsIHdvcmtzdGF0aW9uLmxlbmd0aCwgJ2FzY2lpJyk7IHBvcyArPSB3b3Jrc3RhdGlvbi5sZW5ndGg7IC8vIHdvcmtzdGF0aW9uIHN0cmluZ1xyXG5cdGlmKGRvbWFpbi5sZW5ndGggIT0wKSAgICAgIGJ1Zi53cml0ZShkb21haW4gICAgICwgcG9zLCBkb21haW4ubGVuZ3RoICAgICAsICdhc2NpaScpOyBwb3MgKz0gZG9tYWluLmxlbmd0aDsgLy8gZG9tYWluIHN0cmluZ1xyXG5cclxuXHRyZXR1cm4gJ05UTE0gJyArIGJ1Zi50b1N0cmluZygnYmFzZTY0Jyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlVHlwZTJNZXNzYWdlKHJhd21zZyl7XHJcblx0dmFyIG1hdGNoID0gcmF3bXNnLm1hdGNoKC9OVExNICguKyk/Lyk7XHJcblx0aWYoIW1hdGNoIHx8ICFtYXRjaFsxXSkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBOVExNIGluIHRoZSBtZXNzYWdlIHR5cGUyIGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXJcIik7XHJcblx0fVxyXG5cclxuXHR2YXIgYnVmID0gQnVmZmVyLmZyb20obWF0Y2hbMV0sICdiYXNlNjQnKTtcclxuXHJcblx0dmFyIG1zZyA9IHt9O1xyXG5cclxuXHRtc2cuc2lnbmF0dXJlID0gYnVmLnNsaWNlKDAsIDgpO1xyXG5cdG1zZy50eXBlID0gYnVmLnJlYWRJbnQxNkxFKDgpO1xyXG5cclxuXHRpZihtc2cudHlwZSAhPSAyKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTZXJ2ZXIgZGlkbid0IHJldHVybiBhIHR5cGUgMiBtZXNzYWdlXCIpO1xyXG5cdH1cclxuXHJcblx0bXNnLnRhcmdldE5hbWVMZW4gPSBidWYucmVhZEludDE2TEUoMTIpO1xyXG5cdG1zZy50YXJnZXROYW1lTWF4TGVuID0gYnVmLnJlYWRJbnQxNkxFKDE0KTtcclxuXHRtc2cudGFyZ2V0TmFtZU9mZnNldCA9IGJ1Zi5yZWFkSW50MzJMRSgxNik7XHJcblx0bXNnLnRhcmdldE5hbWUgID0gYnVmLnNsaWNlKG1zZy50YXJnZXROYW1lT2Zmc2V0LCBtc2cudGFyZ2V0TmFtZU9mZnNldCArIG1zZy50YXJnZXROYW1lTWF4TGVuKTtcclxuXHJcbiAgICBtc2cubmVnb3RpYXRlRmxhZ3MgPSBidWYucmVhZEludDMyTEUoMjApO1xyXG4gICAgbXNnLnNlcnZlckNoYWxsZW5nZSA9IGJ1Zi5zbGljZSgyNCwgMzIpO1xyXG4gICAgbXNnLnJlc2VydmVkID0gYnVmLnNsaWNlKDMyLCA0MCk7XHJcblxyXG4gICAgaWYobXNnLm5lZ290aWF0ZUZsYWdzICYgZmxhZ3MuTlRMTV9OZWdvdGlhdGVUYXJnZXRJbmZvKXtcclxuICAgIFx0bXNnLnRhcmdldEluZm9MZW4gPSBidWYucmVhZEludDE2TEUoNDApO1xyXG4gICAgXHRtc2cudGFyZ2V0SW5mb01heExlbiA9IGJ1Zi5yZWFkSW50MTZMRSg0Mik7XHJcbiAgICBcdG1zZy50YXJnZXRJbmZvT2Zmc2V0ID0gYnVmLnJlYWRJbnQzMkxFKDQ0KTtcclxuICAgIFx0bXNnLnRhcmdldEluZm8gPSBidWYuc2xpY2UobXNnLnRhcmdldEluZm9PZmZzZXQsIG1zZy50YXJnZXRJbmZvT2Zmc2V0ICsgbXNnLnRhcmdldEluZm9MZW4pO1xyXG4gICAgfVxyXG5cdHJldHVybiBtc2c7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVR5cGUzTWVzc2FnZShtc2cyLCBvcHRpb25zKXtcclxuXHRpZighb3B0aW9ucy5kb21haW4pIG9wdGlvbnMuZG9tYWluID0gJyc7XHJcblx0aWYoIW9wdGlvbnMud29ya3N0YXRpb24pIG9wdGlvbnMud29ya3N0YXRpb24gPSAnJztcclxuXHRpZighb3B0aW9ucy51c2VybmFtZSkgb3B0aW9ucy51c2VybmFtZSA9ICcnO1xyXG5cdGlmKCFvcHRpb25zLnBhc3N3b3JkKSBvcHRpb25zLnBhc3N3b3JkID0gJyc7XHJcblxyXG5cdHZhciBub25jZSA9IG1zZzIuc2VydmVyQ2hhbGxlbmdlO1xyXG5cdHZhciB1c2VybmFtZSA9IG9wdGlvbnMudXNlcm5hbWU7XHJcblx0dmFyIHBhc3N3b3JkID0gb3B0aW9ucy5wYXNzd29yZDtcclxuXHR2YXIgbG1fcGFzc3dvcmQgPSBvcHRpb25zLmxtX3Bhc3N3b3JkO1xyXG5cdHZhciBudF9wYXNzd29yZCA9IG9wdGlvbnMubnRfcGFzc3dvcmQ7XHJcblx0dmFyIG5lZ290aWF0ZUZsYWdzID0gbXNnMi5uZWdvdGlhdGVGbGFncztcclxuXHJcblx0dmFyIGlzVW5pY29kZSA9IG5lZ290aWF0ZUZsYWdzICYgZmxhZ3MuTlRMTV9OZWdvdGlhdGVVbmljb2RlO1xyXG5cdHZhciBpc05lZ290aWF0ZUV4dGVuZGVkU2VjdXJpdHkgPSBuZWdvdGlhdGVGbGFncyAmIGZsYWdzLk5UTE1fTmVnb3RpYXRlRXh0ZW5kZWRTZWN1cml0eTtcclxuXHJcblx0dmFyIEJPRFlfTEVOR1RIID0gNzI7XHJcblxyXG5cdHZhciBkb21haW5OYW1lID0gZXNjYXBlKG9wdGlvbnMuZG9tYWluLnRvVXBwZXJDYXNlKCkpO1xyXG5cdHZhciB3b3Jrc3RhdGlvbiA9IGVzY2FwZShvcHRpb25zLndvcmtzdGF0aW9uLnRvVXBwZXJDYXNlKCkpO1xyXG5cclxuXHR2YXIgd29ya3N0YXRpb25CeXRlcywgZG9tYWluTmFtZUJ5dGVzLCB1c2VybmFtZUJ5dGVzLCBlbmNyeXB0ZWRSYW5kb21TZXNzaW9uS2V5Qnl0ZXM7XHJcblxyXG5cdHZhciBlbmNyeXB0ZWRSYW5kb21TZXNzaW9uS2V5ID0gXCJcIjtcclxuXHRpZihpc1VuaWNvZGUpe1xyXG5cdFx0d29ya3N0YXRpb25CeXRlcyA9IEJ1ZmZlci5mcm9tKHdvcmtzdGF0aW9uLCAndXRmMTZsZScpO1xyXG5cdFx0ZG9tYWluTmFtZUJ5dGVzID0gQnVmZmVyLmZyb20oZG9tYWluTmFtZSwgJ3V0ZjE2bGUnKTtcclxuXHRcdHVzZXJuYW1lQnl0ZXMgPSBCdWZmZXIuZnJvbSh1c2VybmFtZSwgJ3V0ZjE2bGUnKTtcclxuXHRcdGVuY3J5cHRlZFJhbmRvbVNlc3Npb25LZXlCeXRlcyA9IEJ1ZmZlci5mcm9tKGVuY3J5cHRlZFJhbmRvbVNlc3Npb25LZXksICd1dGYxNmxlJyk7XHJcblx0fWVsc2V7XHJcblx0XHR3b3Jrc3RhdGlvbkJ5dGVzID0gQnVmZmVyLmZyb20od29ya3N0YXRpb24sICdhc2NpaScpO1xyXG5cdFx0ZG9tYWluTmFtZUJ5dGVzID0gQnVmZmVyLmZyb20oZG9tYWluTmFtZSwgJ2FzY2lpJyk7XHJcblx0XHR1c2VybmFtZUJ5dGVzID0gQnVmZmVyLmZyb20odXNlcm5hbWUsICdhc2NpaScpO1xyXG5cdFx0ZW5jcnlwdGVkUmFuZG9tU2Vzc2lvbktleUJ5dGVzID0gQnVmZmVyLmZyb20oZW5jcnlwdGVkUmFuZG9tU2Vzc2lvbktleSwgJ2FzY2lpJyk7XHJcblx0fVxyXG5cclxuXHR2YXIgbG1DaGFsbGVuZ2VSZXNwb25zZSA9IGNhbGNfcmVzcCgobG1fcGFzc3dvcmQhPW51bGwpP2xtX3Bhc3N3b3JkOmNyZWF0ZV9MTV9oYXNoZWRfcGFzc3dvcmRfdjEocGFzc3dvcmQpLCBub25jZSk7XHJcblx0dmFyIG50Q2hhbGxlbmdlUmVzcG9uc2UgPSBjYWxjX3Jlc3AoKG50X3Bhc3N3b3JkIT1udWxsKT9udF9wYXNzd29yZDpjcmVhdGVfTlRfaGFzaGVkX3Bhc3N3b3JkX3YxKHBhc3N3b3JkKSwgbm9uY2UpO1xyXG5cclxuXHRpZihpc05lZ290aWF0ZUV4dGVuZGVkU2VjdXJpdHkpe1xyXG5cdFx0LypcclxuXHRcdCAqIE5UTE12MiBleHRlbmRlZCBzZWN1cml0eSBpcyBlbmFibGVkLiBXaGlsZSB0aGlzIHRlY2huaWNhbGx5IGNhbiBtZWFuIE5UTE12MiBleHRlbmRlZCBzZWN1cml0eSB3aXRoIE5UTE12MSBwcm90b2NvbCxcclxuXHRcdCAqIHNlcnZlcnMgdGhhdCBzdXBwb3J0IGV4dGVuZGVkIHNlY3VyaXR5IGxpa2VseSBhbHNvIHN1cHBvcnQgTlRMTXYyLCBzbyB1c2UgTlRMTXYyLlxyXG5cdFx0ICogVGhpcyBpcyBhbHNvIGhvdyBjdXJsIGltcGxlbWVudHMgTlRMTXYyIFwiZGV0ZWN0aW9uXCIuXHJcblx0XHQgKiBCeSB1c2luZyBOVExNdjIsIHRoaXMgc3VwcG9ydHMgY29tbXVuaWNhdGlvbiB3aXRoIHNlcnZlcnMgdGhhdCBmb3JiaWQgdGhlIHVzZSBvZiBOVExNdjEgKGUuZy4gdmlhIHdpbmRvd3MgcG9saWNpZXMpXHJcblx0XHQgKlxyXG5cdFx0ICogSG93ZXZlciwgdGhlIHRhcmdldCBpbmZvIGlzIG5lZWRlZCB0byBjb25zdHJ1Y3QgdGhlIE5UTE12MiByZXNwb25zZSBzbyBpZiBpdCBjYW4ndCBiZSBuZWdvdGlhdGVkLFxyXG5cdFx0ICogZmFsbCBiYWNrIHRvIE5UTE12MSB3aXRoIE5UTE12MiBleHRlbmRlZCBzZWN1cml0eS5cclxuXHRcdCAqL1xyXG5cdFx0dmFyIHB3aGFzaCA9IChudF9wYXNzd29yZCE9bnVsbCk/bnRfcGFzc3dvcmQ6Y3JlYXRlX05UX2hhc2hlZF9wYXNzd29yZF92MShwYXNzd29yZCk7XHJcblx0XHR2YXIgY2xpZW50Q2hhbGxlbmdlID0gXCJcIjtcclxuXHQgXHRmb3IodmFyIGk9MDsgaSA8IDg7IGkrKyl7XHJcblx0IFx0XHRjbGllbnRDaGFsbGVuZ2UgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjI1NikgKTtcclxuXHQgICBcdH1cclxuXHQgICBcdHZhciBjbGllbnRDaGFsbGVuZ2VCeXRlcyA9IEJ1ZmZlci5mcm9tKGNsaWVudENoYWxsZW5nZSwgJ2FzY2lpJyk7XHJcblx0XHR2YXIgY2hhbGxlbmdlcyA9IG1zZzIudGFyZ2V0SW5mb1xyXG5cdFx0XHQ/IGNhbGNfbnRsbXYyX3Jlc3AocHdoYXNoLCB1c2VybmFtZSwgZG9tYWluTmFtZSwgbXNnMi50YXJnZXRJbmZvLCBub25jZSwgY2xpZW50Q2hhbGxlbmdlQnl0ZXMpXHJcblx0XHRcdDogbnRsbTJzcl9jYWxjX3Jlc3AocHdoYXNoLCBub25jZSwgY2xpZW50Q2hhbGxlbmdlQnl0ZXMpO1xyXG5cdCAgICBsbUNoYWxsZW5nZVJlc3BvbnNlID0gY2hhbGxlbmdlcy5sbUNoYWxsZW5nZVJlc3BvbnNlO1xyXG5cdCAgICBudENoYWxsZW5nZVJlc3BvbnNlID0gY2hhbGxlbmdlcy5udENoYWxsZW5nZVJlc3BvbnNlO1xyXG5cdH1cclxuXHJcblx0dmFyIHNpZ25hdHVyZSA9ICdOVExNU1NQXFwwJztcclxuXHJcblx0dmFyIHBvcyA9IDA7XHJcblx0dmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyhCT0RZX0xFTkdUSCArIGRvbWFpbk5hbWVCeXRlcy5sZW5ndGggKyB1c2VybmFtZUJ5dGVzLmxlbmd0aCArIHdvcmtzdGF0aW9uQnl0ZXMubGVuZ3RoICsgbG1DaGFsbGVuZ2VSZXNwb25zZS5sZW5ndGggKyBudENoYWxsZW5nZVJlc3BvbnNlLmxlbmd0aCArIGVuY3J5cHRlZFJhbmRvbVNlc3Npb25LZXlCeXRlcy5sZW5ndGgpO1xyXG5cclxuXHRidWYud3JpdGUoc2lnbmF0dXJlLCBwb3MsIHNpZ25hdHVyZS5sZW5ndGgpOyBwb3MgKz0gc2lnbmF0dXJlLmxlbmd0aDtcclxuXHRidWYud3JpdGVVSW50MzJMRSgzLCBwb3MpOyBwb3MgKz0gNDsgICAgICAgICAgLy8gdHlwZSAxXHJcblxyXG5cdGJ1Zi53cml0ZVVJbnQxNkxFKGxtQ2hhbGxlbmdlUmVzcG9uc2UubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gTG1DaGFsbGVuZ2VSZXNwb25zZUxlblxyXG5cdGJ1Zi53cml0ZVVJbnQxNkxFKGxtQ2hhbGxlbmdlUmVzcG9uc2UubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gTG1DaGFsbGVuZ2VSZXNwb25zZU1heExlblxyXG5cdGJ1Zi53cml0ZVVJbnQzMkxFKEJPRFlfTEVOR1RIICsgZG9tYWluTmFtZUJ5dGVzLmxlbmd0aCArIHVzZXJuYW1lQnl0ZXMubGVuZ3RoICsgd29ya3N0YXRpb25CeXRlcy5sZW5ndGgsIHBvcyk7IHBvcyArPSA0OyAvLyBMbUNoYWxsZW5nZVJlc3BvbnNlT2Zmc2V0XHJcblxyXG5cdGJ1Zi53cml0ZVVJbnQxNkxFKG50Q2hhbGxlbmdlUmVzcG9uc2UubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gTnRDaGFsbGVuZ2VSZXNwb25zZUxlblxyXG5cdGJ1Zi53cml0ZVVJbnQxNkxFKG50Q2hhbGxlbmdlUmVzcG9uc2UubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gTnRDaGFsbGVuZ2VSZXNwb25zZU1heExlblxyXG5cdGJ1Zi53cml0ZVVJbnQzMkxFKEJPRFlfTEVOR1RIICsgZG9tYWluTmFtZUJ5dGVzLmxlbmd0aCArIHVzZXJuYW1lQnl0ZXMubGVuZ3RoICsgd29ya3N0YXRpb25CeXRlcy5sZW5ndGggKyBsbUNoYWxsZW5nZVJlc3BvbnNlLmxlbmd0aCwgcG9zKTsgcG9zICs9IDQ7IC8vIE50Q2hhbGxlbmdlUmVzcG9uc2VPZmZzZXRcclxuXHJcblx0YnVmLndyaXRlVUludDE2TEUoZG9tYWluTmFtZUJ5dGVzLmxlbmd0aCwgcG9zKTsgcG9zICs9IDI7IC8vIERvbWFpbk5hbWVMZW5cclxuXHRidWYud3JpdGVVSW50MTZMRShkb21haW5OYW1lQnl0ZXMubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gRG9tYWluTmFtZU1heExlblxyXG5cdGJ1Zi53cml0ZVVJbnQzMkxFKEJPRFlfTEVOR1RILCBwb3MpOyBwb3MgKz0gNDsgXHRcdFx0ICAvLyBEb21haW5OYW1lT2Zmc2V0XHJcblxyXG5cdGJ1Zi53cml0ZVVJbnQxNkxFKHVzZXJuYW1lQnl0ZXMubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gVXNlck5hbWVMZW5cclxuXHRidWYud3JpdGVVSW50MTZMRSh1c2VybmFtZUJ5dGVzLmxlbmd0aCwgcG9zKTsgcG9zICs9IDI7IC8vIFVzZXJOYW1lTWF4TGVuXHJcblx0YnVmLndyaXRlVUludDMyTEUoQk9EWV9MRU5HVEggKyBkb21haW5OYW1lQnl0ZXMubGVuZ3RoLCBwb3MpOyBwb3MgKz0gNDsgLy8gVXNlck5hbWVPZmZzZXRcclxuXHJcblx0YnVmLndyaXRlVUludDE2TEUod29ya3N0YXRpb25CeXRlcy5sZW5ndGgsIHBvcyk7IHBvcyArPSAyOyAvLyBXb3Jrc3RhdGlvbkxlblxyXG5cdGJ1Zi53cml0ZVVJbnQxNkxFKHdvcmtzdGF0aW9uQnl0ZXMubGVuZ3RoLCBwb3MpOyBwb3MgKz0gMjsgLy8gV29ya3N0YXRpb25NYXhMZW5cclxuXHRidWYud3JpdGVVSW50MzJMRShCT0RZX0xFTkdUSCArIGRvbWFpbk5hbWVCeXRlcy5sZW5ndGggKyB1c2VybmFtZUJ5dGVzLmxlbmd0aCwgcG9zKTsgcG9zICs9IDQ7IC8vIFdvcmtzdGF0aW9uT2Zmc2V0XHJcblxyXG5cdGJ1Zi53cml0ZVVJbnQxNkxFKGVuY3J5cHRlZFJhbmRvbVNlc3Npb25LZXlCeXRlcy5sZW5ndGgsIHBvcyk7IHBvcyArPSAyOyAvLyBFbmNyeXB0ZWRSYW5kb21TZXNzaW9uS2V5TGVuXHJcblx0YnVmLndyaXRlVUludDE2TEUoZW5jcnlwdGVkUmFuZG9tU2Vzc2lvbktleUJ5dGVzLmxlbmd0aCwgcG9zKTsgcG9zICs9IDI7IC8vIEVuY3J5cHRlZFJhbmRvbVNlc3Npb25LZXlNYXhMZW5cclxuXHRidWYud3JpdGVVSW50MzJMRShCT0RZX0xFTkdUSCArIGRvbWFpbk5hbWVCeXRlcy5sZW5ndGggKyB1c2VybmFtZUJ5dGVzLmxlbmd0aCArIHdvcmtzdGF0aW9uQnl0ZXMubGVuZ3RoICsgbG1DaGFsbGVuZ2VSZXNwb25zZS5sZW5ndGggKyBudENoYWxsZW5nZVJlc3BvbnNlLmxlbmd0aCwgcG9zKTsgcG9zICs9IDQ7IC8vIEVuY3J5cHRlZFJhbmRvbVNlc3Npb25LZXlPZmZzZXRcclxuXHJcblx0Ly8gRml4ICM5OFxyXG5cdHZhciBmbGFnc1RvV3JpdGUgPSBpc1VuaWNvZGVcclxuXHQgICAgPyB0eXBlZmxhZ3MuTlRMTV9UWVBFMl9GTEFHU1xyXG5cdCAgICA6IHR5cGVmbGFncy5OVExNX1RZUEUyX0ZMQUdTIC0gZmxhZ3MuTlRMTV9OZWdvdGlhdGVVbmljb2RlO1xyXG5cdGJ1Zi53cml0ZVVJbnQzMkxFKGZsYWdzVG9Xcml0ZSAsIHBvcyk7IHBvcyArPSA0OyAvLyBOZWdvdGlhdGVGbGFnc1xyXG5cclxuXHRidWYud3JpdGVVSW50OCg1LCBwb3MpOyBwb3MrKzsgLy8gUHJvZHVjdE1ham9yVmVyc2lvblxyXG5cdGJ1Zi53cml0ZVVJbnQ4KDEsIHBvcyk7IHBvcysrOyAvLyBQcm9kdWN0TWlub3JWZXJzaW9uXHJcblx0YnVmLndyaXRlVUludDE2TEUoMjYwMCwgcG9zKTsgcG9zICs9IDI7IC8vIFByb2R1Y3RCdWlsZFxyXG5cdGJ1Zi53cml0ZVVJbnQ4KDAsIHBvcyk7IHBvcysrOyAvLyBWZXJzaW9uUmVzZXJ2ZWQxXHJcblx0YnVmLndyaXRlVUludDgoMCwgcG9zKTsgcG9zKys7IC8vIFZlcnNpb25SZXNlcnZlZDJcclxuXHRidWYud3JpdGVVSW50OCgwLCBwb3MpOyBwb3MrKzsgLy8gVmVyc2lvblJlc2VydmVkM1xyXG5cdGJ1Zi53cml0ZVVJbnQ4KDE1LCBwb3MpOyBwb3MrKzsgLy8gTlRMTVJldmlzaW9uQ3VycmVudFxyXG5cclxuXHRkb21haW5OYW1lQnl0ZXMuY29weShidWYsIHBvcyk7IHBvcyArPSBkb21haW5OYW1lQnl0ZXMubGVuZ3RoO1xyXG5cdHVzZXJuYW1lQnl0ZXMuY29weShidWYsIHBvcyk7IHBvcyArPSB1c2VybmFtZUJ5dGVzLmxlbmd0aDtcclxuXHR3b3Jrc3RhdGlvbkJ5dGVzLmNvcHkoYnVmLCBwb3MpOyBwb3MgKz0gd29ya3N0YXRpb25CeXRlcy5sZW5ndGg7XHJcblx0bG1DaGFsbGVuZ2VSZXNwb25zZS5jb3B5KGJ1ZiwgcG9zKTsgcG9zICs9IGxtQ2hhbGxlbmdlUmVzcG9uc2UubGVuZ3RoO1xyXG5cdG50Q2hhbGxlbmdlUmVzcG9uc2UuY29weShidWYsIHBvcyk7IHBvcyArPSBudENoYWxsZW5nZVJlc3BvbnNlLmxlbmd0aDtcclxuXHRlbmNyeXB0ZWRSYW5kb21TZXNzaW9uS2V5Qnl0ZXMuY29weShidWYsIHBvcyk7IHBvcyArPSBlbmNyeXB0ZWRSYW5kb21TZXNzaW9uS2V5Qnl0ZXMubGVuZ3RoO1xyXG5cclxuXHRyZXR1cm4gJ05UTE0gJyArIGJ1Zi50b1N0cmluZygnYmFzZTY0Jyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZV9MTV9oYXNoZWRfcGFzc3dvcmRfdjEocGFzc3dvcmQpe1xyXG5cdC8vIGZpeCB0aGUgcGFzc3dvcmQgbGVuZ3RoIHRvIDE0IGJ5dGVzXHJcblx0cGFzc3dvcmQgPSBwYXNzd29yZC50b1VwcGVyQ2FzZSgpO1xyXG5cdHZhciBwYXNzd29yZEJ5dGVzID0gQnVmZmVyLmZyb20ocGFzc3dvcmQsICdhc2NpaScpO1xyXG5cclxuXHR2YXIgcGFzc3dvcmRCeXRlc1BhZGRlZCA9IEJ1ZmZlci5hbGxvYygxNCk7XHJcblx0cGFzc3dvcmRCeXRlc1BhZGRlZC5maWxsKFwiXFwwXCIpO1xyXG5cdHZhciBzb3VyY2VFbmQgPSAxNDtcclxuXHRpZihwYXNzd29yZEJ5dGVzLmxlbmd0aCA8IDE0KSBzb3VyY2VFbmQgPSBwYXNzd29yZEJ5dGVzLmxlbmd0aDtcclxuXHRwYXNzd29yZEJ5dGVzLmNvcHkocGFzc3dvcmRCeXRlc1BhZGRlZCwgMCwgMCwgc291cmNlRW5kKTtcclxuXHJcblx0Ly8gc3BsaXQgaW50byAyIHBhcnRzIG9mIDcgYnl0ZXM6XHJcblx0dmFyIGZpcnN0UGFydCA9IHBhc3N3b3JkQnl0ZXNQYWRkZWQuc2xpY2UoMCw3KTtcclxuXHR2YXIgc2Vjb25kUGFydCA9IHBhc3N3b3JkQnl0ZXNQYWRkZWQuc2xpY2UoNyk7XHJcblxyXG5cdGZ1bmN0aW9uIGVuY3J5cHQoYnVmKXtcclxuXHRcdHZhciBrZXkgPSBpbnNlcnRaZXJvc0V2ZXJ5N0JpdHMoYnVmKTtcclxuXHRcdHZhciBkZXMgPSBkZXNqcy5ERVMuY3JlYXRlKHt0eXBlOiAnZW5jcnlwdCcsIGtleToga2V5fSk7XHJcblx0XHR2YXIgbWFnaWNLZXkgPSBCdWZmZXIuZnJvbSgnS0dTIUAjJCUnLCAnYXNjaWknKTsgLy8gcGFnZSA1NyBpbiBbTVMtTkxNUF1cclxuXHRcdHZhciBlbmNyeXB0ZWQgPSBkZXMudXBkYXRlKG1hZ2ljS2V5KTtcclxuXHRcdHJldHVybiBCdWZmZXIuZnJvbShlbmNyeXB0ZWQpO1xyXG5cdH1cclxuXHJcblx0dmFyIGZpcnN0UGFydEVuY3J5cHRlZCA9IGVuY3J5cHQoZmlyc3RQYXJ0KTtcclxuXHR2YXIgc2Vjb25kUGFydEVuY3J5cHRlZCA9IGVuY3J5cHQoc2Vjb25kUGFydCk7XHJcblxyXG5cdHJldHVybiBCdWZmZXIuY29uY2F0KFtmaXJzdFBhcnRFbmNyeXB0ZWQsIHNlY29uZFBhcnRFbmNyeXB0ZWRdKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5zZXJ0WmVyb3NFdmVyeTdCaXRzKGJ1Zil7XHJcblx0dmFyIGJpbmFyeUFycmF5ID0gYnl0ZXMyYmluYXJ5QXJyYXkoYnVmKTtcclxuXHR2YXIgbmV3QmluYXJ5QXJyYXkgPSBbXTtcclxuXHRmb3IodmFyIGk9MDsgaTxiaW5hcnlBcnJheS5sZW5ndGg7IGkrKyl7XHJcblx0XHRuZXdCaW5hcnlBcnJheS5wdXNoKGJpbmFyeUFycmF5W2ldKTtcclxuXHJcblx0XHRpZigoaSsxKSU3ID09PSAwKXtcclxuXHRcdFx0bmV3QmluYXJ5QXJyYXkucHVzaCgwKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGJpbmFyeUFycmF5MmJ5dGVzKG5ld0JpbmFyeUFycmF5KTtcclxufVxyXG5cclxuZnVuY3Rpb24gYnl0ZXMyYmluYXJ5QXJyYXkoYnVmKXtcclxuXHR2YXIgaGV4MmJpbmFyeSA9IHtcclxuXHRcdDA6IFswLDAsMCwwXSxcclxuXHRcdDE6IFswLDAsMCwxXSxcclxuXHRcdDI6IFswLDAsMSwwXSxcclxuXHRcdDM6IFswLDAsMSwxXSxcclxuXHRcdDQ6IFswLDEsMCwwXSxcclxuXHRcdDU6IFswLDEsMCwxXSxcclxuXHRcdDY6IFswLDEsMSwwXSxcclxuXHRcdDc6IFswLDEsMSwxXSxcclxuXHRcdDg6IFsxLDAsMCwwXSxcclxuXHRcdDk6IFsxLDAsMCwxXSxcclxuXHRcdEE6IFsxLDAsMSwwXSxcclxuXHRcdEI6IFsxLDAsMSwxXSxcclxuXHRcdEM6IFsxLDEsMCwwXSxcclxuXHRcdEQ6IFsxLDEsMCwxXSxcclxuXHRcdEU6IFsxLDEsMSwwXSxcclxuXHRcdEY6IFsxLDEsMSwxXVxyXG5cdH07XHJcblxyXG5cdHZhciBoZXhTdHJpbmcgPSBidWYudG9TdHJpbmcoJ2hleCcpLnRvVXBwZXJDYXNlKCk7XHJcblx0dmFyIGFycmF5ID0gW107XHJcblx0Zm9yKHZhciBpPTA7IGk8aGV4U3RyaW5nLmxlbmd0aDsgaSsrKXtcclxuICAgXHRcdHZhciBoZXhjaGFyID0gaGV4U3RyaW5nLmNoYXJBdChpKTtcclxuICAgXHRcdGFycmF5ID0gYXJyYXkuY29uY2F0KGhleDJiaW5hcnlbaGV4Y2hhcl0pO1xyXG4gICBcdH1cclxuICAgXHRyZXR1cm4gYXJyYXk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJpbmFyeUFycmF5MmJ5dGVzKGFycmF5KXtcclxuXHR2YXIgYmluYXJ5MmhleCA9IHtcclxuXHRcdCcwMDAwJzogMCxcclxuXHRcdCcwMDAxJzogMSxcclxuXHRcdCcwMDEwJzogMixcclxuXHRcdCcwMDExJzogMyxcclxuXHRcdCcwMTAwJzogNCxcclxuXHRcdCcwMTAxJzogNSxcclxuXHRcdCcwMTEwJzogNixcclxuXHRcdCcwMTExJzogNyxcclxuXHRcdCcxMDAwJzogOCxcclxuXHRcdCcxMDAxJzogOSxcclxuXHRcdCcxMDEwJzogJ0EnLFxyXG5cdFx0JzEwMTEnOiAnQicsXHJcblx0XHQnMTEwMCc6ICdDJyxcclxuXHRcdCcxMTAxJzogJ0QnLFxyXG5cdFx0JzExMTAnOiAnRScsXHJcblx0XHQnMTExMSc6ICdGJ1xyXG5cdH07XHJcblxyXG4gXHR2YXIgYnVmQXJyYXkgPSBbXTtcclxuXHJcblx0Zm9yKHZhciBpPTA7IGk8YXJyYXkubGVuZ3RoOyBpICs9OCApe1xyXG5cdFx0aWYoKGkrNykgPiBhcnJheS5sZW5ndGgpXHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdHZhciBiaW5TdHJpbmcxID0gJycgKyBhcnJheVtpXSArICcnICsgYXJyYXlbaSsxXSArICcnICsgYXJyYXlbaSsyXSArICcnICsgYXJyYXlbaSszXTtcclxuXHRcdHZhciBiaW5TdHJpbmcyID0gJycgKyBhcnJheVtpKzRdICsgJycgKyBhcnJheVtpKzVdICsgJycgKyBhcnJheVtpKzZdICsgJycgKyBhcnJheVtpKzddO1xyXG4gICBcdFx0dmFyIGhleGNoYXIxID0gYmluYXJ5MmhleFtiaW5TdHJpbmcxXTtcclxuICAgXHRcdHZhciBoZXhjaGFyMiA9IGJpbmFyeTJoZXhbYmluU3RyaW5nMl07XHJcblxyXG4gICBcdFx0dmFyIGJ1ZiA9IEJ1ZmZlci5mcm9tKGhleGNoYXIxICsgJycgKyBoZXhjaGFyMiwgJ2hleCcpO1xyXG4gICBcdFx0YnVmQXJyYXkucHVzaChidWYpO1xyXG4gICBcdH1cclxuXHJcbiAgIFx0cmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmQXJyYXkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVfTlRfaGFzaGVkX3Bhc3N3b3JkX3YxKHBhc3N3b3JkKXtcclxuXHR2YXIgYnVmID0gQnVmZmVyLmZyb20ocGFzc3dvcmQsICd1dGYxNmxlJyk7XHJcblx0dmFyIG1kNCA9IGpzbWQ0LmNyZWF0ZSgpO1xyXG5cdG1kNC51cGRhdGUoYnVmKTtcclxuXHRyZXR1cm4gQnVmZmVyLmZyb20obWQ0LmRpZ2VzdCgpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY19yZXNwKHBhc3N3b3JkX2hhc2gsIHNlcnZlcl9jaGFsbGVuZ2Upe1xyXG4gICAgLy8gcGFkZGluZyB3aXRoIHplcm9zIHRvIG1ha2UgdGhlIGhhc2ggMjEgYnl0ZXMgbG9uZ1xyXG4gICAgdmFyIHBhc3NIYXNoUGFkZGVkID0gQnVmZmVyLmFsbG9jKDIxKTtcclxuICAgIHBhc3NIYXNoUGFkZGVkLmZpbGwoXCJcXDBcIik7XHJcbiAgICBwYXNzd29yZF9oYXNoLmNvcHkocGFzc0hhc2hQYWRkZWQsIDAsIDAsIHBhc3N3b3JkX2hhc2gubGVuZ3RoKTtcclxuXHJcbiAgICB2YXIgcmVzQXJyYXkgPSBbXTtcclxuXHJcblx0dmFyIGRlcyA9IGRlc2pzLkRFUy5jcmVhdGUoe3R5cGU6ICdlbmNyeXB0Jywga2V5OiBpbnNlcnRaZXJvc0V2ZXJ5N0JpdHMocGFzc0hhc2hQYWRkZWQuc2xpY2UoMCw3KSl9KTtcclxuXHRyZXNBcnJheS5wdXNoKCBCdWZmZXIuZnJvbShkZXMudXBkYXRlKHNlcnZlcl9jaGFsbGVuZ2Uuc2xpY2UoMCw4KSkpICk7XHJcblxyXG5cdGRlcyA9IGRlc2pzLkRFUy5jcmVhdGUoe3R5cGU6ICdlbmNyeXB0Jywga2V5OiBpbnNlcnRaZXJvc0V2ZXJ5N0JpdHMocGFzc0hhc2hQYWRkZWQuc2xpY2UoNywxNCkpfSk7XHJcblx0cmVzQXJyYXkucHVzaCggQnVmZmVyLmZyb20oZGVzLnVwZGF0ZShzZXJ2ZXJfY2hhbGxlbmdlLnNsaWNlKDAsOCkpKSApO1xyXG5cclxuXHRkZXMgPSBkZXNqcy5ERVMuY3JlYXRlKHt0eXBlOiAnZW5jcnlwdCcsIGtleTogaW5zZXJ0WmVyb3NFdmVyeTdCaXRzKHBhc3NIYXNoUGFkZGVkLnNsaWNlKDE0LDIxKSl9KTtcclxuXHRyZXNBcnJheS5wdXNoKCBCdWZmZXIuZnJvbShkZXMudXBkYXRlKHNlcnZlcl9jaGFsbGVuZ2Uuc2xpY2UoMCw4KSkpICk7XHJcblxyXG4gICBcdHJldHVybiBCdWZmZXIuY29uY2F0KHJlc0FycmF5KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaG1hY19tZDUoa2V5LCBkYXRhKXtcclxuXHR2YXIgaG1hYyA9IGNyeXB0by5jcmVhdGVIbWFjKCdtZDUnLCBrZXkpO1xyXG5cdGhtYWMudXBkYXRlKGRhdGEpO1xyXG5cdHJldHVybiBobWFjLmRpZ2VzdCgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBudGxtMnNyX2NhbGNfcmVzcChyZXNwb25zZUtleU5ULCBzZXJ2ZXJDaGFsbGVuZ2UsIGNsaWVudENoYWxsZW5nZSl7XHJcblx0Ly8gcGFkZGluZyB3aXRoIHplcm9zIHRvIG1ha2UgdGhlIGhhc2ggMTYgYnl0ZXMgbG9uZ2VyXHJcbiAgICB2YXIgbG1DaGFsbGVuZ2VSZXNwb25zZSA9IEJ1ZmZlci5hbGxvYyhjbGllbnRDaGFsbGVuZ2UubGVuZ3RoICsgMTYpO1xyXG4gICAgbG1DaGFsbGVuZ2VSZXNwb25zZS5maWxsKFwiXFwwXCIpO1xyXG4gICAgY2xpZW50Q2hhbGxlbmdlLmNvcHkobG1DaGFsbGVuZ2VSZXNwb25zZSwgMCwgMCwgY2xpZW50Q2hhbGxlbmdlLmxlbmd0aCk7XHJcblxyXG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQoW3NlcnZlckNoYWxsZW5nZSwgY2xpZW50Q2hhbGxlbmdlXSk7XHJcbiAgICB2YXIgbWQ1ID0gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpO1xyXG4gICAgbWQ1LnVwZGF0ZShidWYpO1xyXG4gICAgdmFyIHNlc3MgPSBtZDUuZGlnZXN0KCk7XHJcbiAgICB2YXIgbnRDaGFsbGVuZ2VSZXNwb25zZSA9IGNhbGNfcmVzcChyZXNwb25zZUtleU5ULCBzZXNzLnNsaWNlKDAsOCkpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICBcdGxtQ2hhbGxlbmdlUmVzcG9uc2U6IGxtQ2hhbGxlbmdlUmVzcG9uc2UsXHJcbiAgICBcdG50Q2hhbGxlbmdlUmVzcG9uc2U6IG50Q2hhbGxlbmdlUmVzcG9uc2VcclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGNfbnRsbXYyX3Jlc3AocHdoYXNoLCB1c2VybmFtZSwgZG9tYWluLCB0YXJnZXRJbmZvLCBzZXJ2ZXJDaGFsbGVuZ2UsIGNsaWVudENoYWxsZW5nZSl7XHJcblx0dmFyIHJlc3BvbnNlS2V5TlRMTSA9IE5UT1dGdjIocHdoYXNoLCB1c2VybmFtZSwgZG9tYWluKTtcclxuXHJcblx0dmFyIGxtVjJDaGFsbGVuZ2VSZXNwb25zZSA9IEJ1ZmZlci5jb25jYXQoW1xyXG5cdFx0aG1hY19tZDUocmVzcG9uc2VLZXlOVExNLCBCdWZmZXIuY29uY2F0KFtzZXJ2ZXJDaGFsbGVuZ2UsIGNsaWVudENoYWxsZW5nZV0pKSxcclxuXHRcdGNsaWVudENoYWxsZW5nZVxyXG5cdF0pO1xyXG5cclxuXHQvLyAxMTY0NDQ3MzYwMDAwMCA9IGRpZmYgYmV0d2VlbiAxOTcwIGFuZCAxNjAxXHJcblx0dmFyIG5vdyA9IERhdGUubm93KCk7XHJcblx0dmFyIHRpbWVzdGFtcCA9ICgoQmlnSW50KG5vdykgKyBCaWdJbnQoMTE2NDQ0NzM2MDAwMDApKSAqIEJpZ0ludCgxMDAwMCkpOyAgLy8gd2UgbmVlZCBCaWdJbnQgdG8gYmUgYWJsZSB0byB3cml0ZSBpdCB0byBhIGJ1ZmZlclxyXG5cdHZhciB0aW1lc3RhbXBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XHJcblx0dGltZXN0YW1wQnVmZmVyLndyaXRlQmlnVUludDY0TEUodGltZXN0YW1wKTtcclxuXHJcblx0dmFyIHplcm8zMkJpdCA9IEJ1ZmZlci5hbGxvYyg0LCAwKVxyXG5cdHZhciB0ZW1wID0gQnVmZmVyLmNvbmNhdChbXHJcblx0XHQvLyBWZXJzaW9uXHJcblx0XHRCdWZmZXIuZnJvbShbMHgwMSwgMHgwMSwgMHgwMCwgMHgwMF0pLFxyXG5cdFx0emVybzMyQml0LFxyXG5cdFx0dGltZXN0YW1wQnVmZmVyLFxyXG5cdFx0Y2xpZW50Q2hhbGxlbmdlLFxyXG5cdFx0emVybzMyQml0LFxyXG5cdFx0dGFyZ2V0SW5mbyxcclxuXHRcdHplcm8zMkJpdFxyXG5cdF0pO1xyXG5cdHZhciBwcm9vZlN0cmluZyA9IGhtYWNfbWQ1KHJlc3BvbnNlS2V5TlRMTSwgQnVmZmVyLmNvbmNhdChbc2VydmVyQ2hhbGxlbmdlLCB0ZW1wXSkpO1xyXG5cdHZhciBudFYyQ2hhbGxlbmdlUmVzcG9uc2UgPSBCdWZmZXIuY29uY2F0KFtwcm9vZlN0cmluZywgdGVtcF0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICBcdGxtQ2hhbGxlbmdlUmVzcG9uc2U6IGxtVjJDaGFsbGVuZ2VSZXNwb25zZSxcclxuICAgIFx0bnRDaGFsbGVuZ2VSZXNwb25zZTogbnRWMkNoYWxsZW5nZVJlc3BvbnNlXHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBOVE9XRnYyKHB3aGFzaCwgdXNlciwgZG9tYWluKXtcclxuXHRyZXR1cm4gaG1hY19tZDUocHdoYXNoLCBCdWZmZXIuZnJvbSh1c2VyLnRvVXBwZXJDYXNlKCkgKyBkb21haW4sICd1dGYxNmxlJykpO1xyXG59XHJcblxyXG5leHBvcnRzLmNyZWF0ZVR5cGUxTWVzc2FnZSA9IGNyZWF0ZVR5cGUxTWVzc2FnZTtcclxuZXhwb3J0cy5wYXJzZVR5cGUyTWVzc2FnZSA9IHBhcnNlVHlwZTJNZXNzYWdlO1xyXG5leHBvcnRzLmNyZWF0ZVR5cGUzTWVzc2FnZSA9IGNyZWF0ZVR5cGUzTWVzc2FnZTtcclxuZXhwb3J0cy5jcmVhdGVfTlRfaGFzaGVkX3Bhc3N3b3JkID0gY3JlYXRlX05UX2hhc2hlZF9wYXNzd29yZF92MTtcclxuZXhwb3J0cy5jcmVhdGVfTE1faGFzaGVkX3Bhc3N3b3JkID0gY3JlYXRlX0xNX2hhc2hlZF9wYXNzd29yZF92MTtcclxuLyogZXNsaW50LWVuYWJsZSAqL1xyXG4iXX0=
|
|
@@ -19,6 +19,14 @@ var _helper = _interopRequireDefault(require("../errors/helper"));
|
|
|
19
19
|
|
|
20
20
|
var _utils = _interopRequireDefault(require("./utils"));
|
|
21
21
|
|
|
22
|
+
var _ntlmUtil = require("./module-http/ntlm-util");
|
|
23
|
+
|
|
24
|
+
var ntlm = _interopRequireWildcard(require("./module-http/ntlm"));
|
|
25
|
+
|
|
26
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
27
|
+
|
|
28
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
29
|
+
|
|
22
30
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
31
|
|
|
24
32
|
/*
|
|
@@ -34,6 +42,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
34
42
|
* @name http
|
|
35
43
|
* @description Provides methods for working with HTTP(S)
|
|
36
44
|
*/
|
|
45
|
+
const http = require('http');
|
|
46
|
+
|
|
47
|
+
const https = require('https');
|
|
48
|
+
|
|
37
49
|
const MODULE_NAME = 'http';
|
|
38
50
|
const RESPONSE_TIMEOUT = 1000 * 60; // in ms
|
|
39
51
|
|
|
@@ -64,7 +76,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
64
76
|
this._alwaysInitialized = true;
|
|
65
77
|
this._lastResponse = null;
|
|
66
78
|
this._baseUrl = null;
|
|
67
|
-
this._userHttpOptions = {};
|
|
79
|
+
this._userHttpOptions = {};
|
|
80
|
+
this._username = undefined;
|
|
81
|
+
this._password = undefined;
|
|
82
|
+
this._domain = undefined; // pre-initialize the module
|
|
68
83
|
|
|
69
84
|
this._isInitialized = true;
|
|
70
85
|
}
|
|
@@ -103,6 +118,27 @@ class HttpModule extends _OxygenModule.default {
|
|
|
103
118
|
this._userHttpOptions.decompress = false; // decompress=true in default options so we override it
|
|
104
119
|
}
|
|
105
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* @summary Sets user credentials for NTLM authentication process
|
|
123
|
+
* @function setNtlmUser
|
|
124
|
+
* @param {String} username - NTLM username.
|
|
125
|
+
* @param {String} password - NTLM password.
|
|
126
|
+
* @param {String=} domain - NTLM domain name, if applicable.
|
|
127
|
+
* In addition to the options listed in the linked document, 'deflateRaw' option can be used when server returns Deflate-compressed stream without headers.
|
|
128
|
+
*/
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
setNtlmUser(username, password, domain = undefined) {
|
|
132
|
+
// If username was passed as undefined, then remove previously defined NTLM credentials
|
|
133
|
+
if (username == undefined) {
|
|
134
|
+
this._username = this._password = this._domain = undefined;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
this._username = username;
|
|
139
|
+
this._password = password;
|
|
140
|
+
this._domain = domain;
|
|
141
|
+
}
|
|
106
142
|
/**
|
|
107
143
|
* @summary Sets proxy url to be used for connections with the service.
|
|
108
144
|
* @function setProxy
|
|
@@ -482,6 +518,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
482
518
|
}
|
|
483
519
|
|
|
484
520
|
_getContentType(headers = {}) {
|
|
521
|
+
if (!headers) {
|
|
522
|
+
return undefined;
|
|
523
|
+
}
|
|
524
|
+
|
|
485
525
|
const contentType = headers['content-type'];
|
|
486
526
|
|
|
487
527
|
if (!contentType) {
|
|
@@ -498,7 +538,7 @@ class HttpModule extends _OxygenModule.default {
|
|
|
498
538
|
}
|
|
499
539
|
|
|
500
540
|
_getContentLength(headers = {}) {
|
|
501
|
-
if (!headers['content-length']) {
|
|
541
|
+
if (!headers || !headers['content-length']) {
|
|
502
542
|
return undefined;
|
|
503
543
|
}
|
|
504
544
|
|
|
@@ -557,7 +597,7 @@ class HttpModule extends _OxygenModule.default {
|
|
|
557
597
|
return dataResolver;
|
|
558
598
|
}
|
|
559
599
|
|
|
560
|
-
async _httpRequestSync(httpOpts) {
|
|
600
|
+
async _httpRequestSync(httpOpts, withAuth = false) {
|
|
561
601
|
if (this._extra.http) {
|
|
562
602
|
delete this._extra.http;
|
|
563
603
|
} //this._addRequestExtra(httpOpts);
|
|
@@ -605,6 +645,14 @@ class HttpModule extends _OxygenModule.default {
|
|
|
605
645
|
}
|
|
606
646
|
} catch (e) {
|
|
607
647
|
result = e;
|
|
648
|
+
|
|
649
|
+
if (e.response && e.response.statusCode && e.response.statusCode === 401 && !withAuth) {
|
|
650
|
+
const authReqResult = await this._handleNtlmAuthorization(httpOpts, e.response);
|
|
651
|
+
|
|
652
|
+
if (authReqResult) {
|
|
653
|
+
result = authReqResult;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
608
656
|
}
|
|
609
657
|
|
|
610
658
|
if (result instanceof Error) {
|
|
@@ -656,7 +704,72 @@ class HttpModule extends _OxygenModule.default {
|
|
|
656
704
|
return result;
|
|
657
705
|
}
|
|
658
706
|
|
|
707
|
+
async _handleNtlmAuthorization(httpOpts, response) {
|
|
708
|
+
var _authMethods;
|
|
709
|
+
|
|
710
|
+
if (!this._username) {
|
|
711
|
+
return undefined;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
let authMethods = (0, _ntlmUtil.getAuthenticateMethods)(response);
|
|
715
|
+
const optsWithAuth = { ...httpOpts
|
|
716
|
+
};
|
|
717
|
+
|
|
718
|
+
if (response.statusCode === 401 && (_authMethods = authMethods) !== null && _authMethods !== void 0 && _authMethods.some(m => m.startsWith('basic'))) {
|
|
719
|
+
optsWithAuth.headers['Authorization'] = (0, _ntlmUtil.createBasicMessage)(this._username || '', this._password || '');
|
|
720
|
+
return await this._httpRequestSync(optsWithAuth, true);
|
|
721
|
+
} // Is https?
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
const reqUrl = require('url').parse(optsWithAuth.url);
|
|
725
|
+
|
|
726
|
+
const isHttps = reqUrl.protocol === 'https:'; // Setup keep-alive agent (otherwise we will get HTTP 401 for message type 3)
|
|
727
|
+
|
|
728
|
+
const keepaliveAgent = isHttps ? new https.Agent({
|
|
729
|
+
keepAlive: true
|
|
730
|
+
}) : new http.Agent({
|
|
731
|
+
keepAlive: true
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
if (isHttps) {
|
|
735
|
+
optsWithAuth.agent = {
|
|
736
|
+
https: keepaliveAgent
|
|
737
|
+
};
|
|
738
|
+
} else {
|
|
739
|
+
optsWithAuth.agent = {
|
|
740
|
+
http: keepaliveAgent
|
|
741
|
+
};
|
|
742
|
+
} // Send Type 1 message
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
const ntlmOpts = {
|
|
746
|
+
username: this._username,
|
|
747
|
+
password: this._password,
|
|
748
|
+
domain: '',
|
|
749
|
+
workstation: '',
|
|
750
|
+
url: optsWithAuth.url
|
|
751
|
+
};
|
|
752
|
+
optsWithAuth.headers['Authorization'] = ntlm.createType1Message(ntlmOpts);
|
|
753
|
+
optsWithAuth.headers['Connection'] = 'keep-alive';
|
|
754
|
+
optsWithAuth.throwHttpErrors = false;
|
|
755
|
+
let type1MsgResponse = await (0, _got.default)(optsWithAuth);
|
|
756
|
+
authMethods = (0, _ntlmUtil.getAuthenticateMethods)(type1MsgResponse); // Parse Type 2 response
|
|
757
|
+
|
|
758
|
+
if (type1MsgResponse.statusCode === 401 && authMethods.length > 0 && authMethods[0].startsWith('ntlm')) {
|
|
759
|
+
const type2Msg = ntlm.parseType2Message(type1MsgResponse.headers['www-authenticate']);
|
|
760
|
+
optsWithAuth.followRedirect = false;
|
|
761
|
+
optsWithAuth.headers['Connection'] = 'close';
|
|
762
|
+
optsWithAuth.headers['Authorization'] = ntlm.createType3Message(type2Msg, ntlmOpts);
|
|
763
|
+
} else {
|
|
764
|
+
return response;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
optsWithAuth.throwHttpErrors = true; // Send Type 3 message
|
|
768
|
+
|
|
769
|
+
return await this._httpRequestSync(optsWithAuth, true);
|
|
770
|
+
}
|
|
771
|
+
|
|
659
772
|
}
|
|
660
773
|
|
|
661
774
|
exports.default = HttpModule;
|
|
662
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbIk1PRFVMRV9OQU1FIiwiUkVTUE9OU0VfVElNRU9VVCIsIkRBRkFVTFRfSFRUUDIiLCJERUZBVUxUX0hUVFBfT1BUSU9OUyIsImRlY29tcHJlc3MiLCJyZXNwb25zZVR5cGUiLCJ0aW1lb3V0IiwibG9va3VwIiwiY29ubmVjdCIsInNlY3VyZUNvbm5lY3QiLCJzb2NrZXQiLCJzZW5kIiwicmVzcG9uc2UiLCJodHRwMiIsImh0dHBzIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZG5zTG9va3VwSXBWZXJzaW9uIiwiQ09OVEVOVF9UWVBFX0hFQURFUiIsIkhUVFBfTUVUSE9EUyIsIkh0dHBNb2R1bGUiLCJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfYWx3YXlzSW5pdGlhbGl6ZWQiLCJfbGFzdFJlc3BvbnNlIiwiX2Jhc2VVcmwiLCJfdXNlckh0dHBPcHRpb25zIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwibmV3Rm9ybURhdGEiLCJGb3JtRGF0YSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsInNldFByb3h5IiwidXJsIiwiYm9vdHN0cmFwIiwicmVxdWlyZSIsInBhcnNlIiwicGFyc2VkVXJsIiwiaG9zdG5hbWUiLCJPeEVycm9yIiwiZXJySGVscGVyIiwiZXJyb3JDb2RlIiwiSFRUUF9FUlJPUiIsInBvcnQiLCJwcm90b2NvbCIsImdsb2JhbCIsIkdMT0JBTF9BR0VOVCIsIkhUVFBfUFJPWFkiLCJnZXQiLCJoZWFkZXJzIiwiaHR0cE9wdHMiLCJtZXRob2QiLCJfaHR0cFJlcXVlc3RTeW5jIiwicG9zdCIsImRhdGEiLCJpc0Zvcm1EYXRhIiwicmVzb2x2ZWREYXRhIiwiX3Jlc29sdmVEYXRhIiwicHV0IiwicGF0Y2giLCJkZWxldGUiLCJnZXRSZXNwb25zZSIsImdldFJlc3BvbnNlQm9keSIsImJvZHkiLCJnZXRSZXNwb25zZUhlYWRlcnMiLCJnZXRSZXNwb25zZVVybCIsImFzc2VydFRleHQiLCJwYXR0ZXJuIiwiQVNTRVJUX0VSUk9SIiwicmVzcENvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwibW9kVXRpbHMiLCJtYXRjaFBhdHRlcm4iLCJhc3NlcnRSZXNwb25zZVRpbWUiLCJtYXhUaW1lIiwiRXJyb3IiLCJhc3NlcnRIZWFkZXIiLCJoZWFkZXJOYW1lIiwiaGVhZGVyVmFsdWVQYXR0ZXJuIiwibGVuZ3RoIiwidG9Mb3dlckNhc2UiLCJhY3R1YWxIZWFkZXJWYWx1ZSIsImFzc2VydENvb2tpZSIsImNvb2tpZU5hbWUiLCJjb29raWVWYWx1ZVBhdHRlcm4iLCJhc3NlcnRTdGF0dXMiLCJjb2RlTGlzdCIsIkFycmF5IiwiaXNBcnJheSIsInN0YXR1c0NvZGUiLCJpbmNsdWRlcyIsImFzc2VydFN0YXR1c09rIiwidHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsInNsaWNlIiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJnZXRTdGVwRGlzcGxheU5hbWUiLCJtZXRob2ROYW1lIiwibWV0aG9kQXJncyIsInJldHZhbCIsImVycm9yIiwidW5kZWZpbmVkIiwiX2V4dHJhIiwiaHR0cCIsInJlcXVlc3QiLCJ0b1VwcGVyQ2FzZSIsInBhdGgiLCJfYWRkUmVxdWVzdEV4dHJhIiwidXBkYXRlZE9wdGlvbnMiLCJVUkwiLCJyZXFFeHRyYSIsInBhdGhuYW1lIiwic2VhcmNoIiwiaGFzaCIsInF1ZXJ5UGFyYW1zIiwiX2dldFF1ZXJ5UGFyYW1zIiwic2VhcmNoUGFyYW1zIiwiY29udGVudFR5cGUiLCJfZ2V0Q29udGVudFR5cGUiLCJjb250ZW50TGVuZ3RoIiwiX2dldENvbnRlbnRMZW5ndGgiLCJmb3JtIiwiZm9ybURhdGEiLCJqc29uIiwiT2JqZWN0IiwiY29udGVudCIsIm1hdGNoIiwibGVuZ3RoQXNTdHIiLCJwYXJzZUludCIsImZyb20iLCJrZXlzIiwicmVkdWNlIiwicmVjb3JkIiwia2V5IiwidmFsdWVzIiwiZ2V0QWxsIiwiam9pbiIsIl9hZGRSZXNwb25zZUV4dHJhIiwicmVzRXh0cmEiLCJyZWRpcmVjdFVybHMiLCJzdGF0dXNUZXh0Iiwic3RhdHVzTWVzc2FnZSIsInZlcnNpb24iLCJodHRwVmVyc2lvbiIsInRpbWluZ3MiLCJwaGFzZXMiLCJkYXRhUmVzb2x2ZXIiLCJhc3NlcnRDaXJjdWxhciIsInJlc3VsdCIsImhvb2tzIiwiYmVmb3JlUmVxdWVzdCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiZSIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJyYXdCb2R5IiwidXBncmFkZSIsInJlcXVlc3RVcmwiLCJpc0Zyb21DYWNoZSIsImlwIiwicmV0cnlDb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBYUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQVFBLE1BQU1BLFdBQVcsR0FBRyxNQUFwQjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLE9BQU8sRUFBaEMsQyxDQUFzQzs7QUFDdEMsTUFBTUMsYUFBYSxHQUFHLEtBQXRCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUc7QUFDekJDLEVBQUFBLFVBQVUsRUFBRSxJQURhO0FBRXpCQyxFQUFBQSxZQUFZLEVBQUUsTUFGVztBQUd6QkMsRUFBQUEsT0FBTyxFQUFFO0FBQ0xDLElBQUFBLE1BQU0sRUFBRSxJQURIO0FBRUxDLElBQUFBLE9BQU8sRUFBRSxHQUZKO0FBR0xDLElBQUFBLGFBQWEsRUFBRSxHQUhWO0FBSUxDLElBQUFBLE1BQU0sRUFBRSxNQUpIO0FBS0xDLElBQUFBLElBQUksRUFBRSxNQUxEO0FBTUxDLElBQUFBLFFBQVEsRUFBRVg7QUFOTCxHQUhnQjtBQVd6QlksRUFB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Q29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgaHR0cFxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEhUVFAoUylcclxuICovXHJcbmltcG9ydCBnb3QgZnJvbSAnZ290JztcclxuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdodHRwJztcclxuY29uc3QgUkVTUE9OU0VfVElNRU9VVCA9IDEwMDAgKiA2MDsgICAvLyBpbiBtc1xyXG5jb25zdCBEQUZBVUxUX0hUVFAyID0gZmFsc2U7XHJcbmNvbnN0IERFRkFVTFRfSFRUUF9PUFRJT05TID0ge1xyXG4gICAgZGVjb21wcmVzczogdHJ1ZSxcclxuICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgdGltZW91dDoge1xyXG4gICAgICAgIGxvb2t1cDogMTAwMCxcclxuICAgICAgICBjb25uZWN0OiA1MDAsXHJcbiAgICAgICAgc2VjdXJlQ29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNvY2tldDogMTAwMDAwLFxyXG4gICAgICAgIHNlbmQ6IDEwMDAwMCxcclxuICAgICAgICByZXNwb25zZTogUkVTUE9OU0VfVElNRU9VVFxyXG4gICAgfSxcclxuICAgIGh0dHAyOiBEQUZBVUxUX0hUVFAyLFxyXG4gICAgaHR0cHM6IHtcclxuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgZG5zTG9va3VwSXBWZXJzaW9uOiAnaXB2NCdcclxufTtcclxuY29uc3QgQ09OVEVOVF9UWVBFX0hFQURFUiA9ICdjb250ZW50LXR5cGUnO1xyXG5jb25zdCBIVFRQX01FVEhPRFMgPSBbXHJcbiAgICAnZ2V0JyxcclxuICAgICdwb3N0JyxcclxuICAgICdwYXRjaCdcclxuXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gcHJlLWluaXRpYWxpemUgdGhlIG1vZHVsZVxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIG1vZHVsZSBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gbmFtZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcImh0dHBcIi5cclxuICAgICAqL1xyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgbmV3IEZvcm1EYXRhIG9iamVjdFxyXG4gICAgICogQGZ1bmN0aW9uIG5ld0Zvcm1EYXRhXHJcbiAgICAgKiBAcmV0dXJuIHtGb3JtRGF0YX0gbmV3IEZvcm1EYXRhIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbmV3Rm9ybURhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB1c2VyIGRlZmluZWQgSFRUUCBvcHRpb25zIChzdWNoIGFzIHByb3h5LCBkZWNvbXByZXNzIGFuZCBldGMuKVxyXG4gICAgICogQGZ1bmN0aW9uIHNldE9wdGlvbnNcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gSFRUUCByZXF1ZXN0IG9wdGlvbnMgb2JqZWN0LCBzZWUgW1JlcXVlc3QgT3B0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9nb3QvYmxvYi9tYWluL2RvY3VtZW50YXRpb24vMi1vcHRpb25zLm1kKS4gXHJcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gdGhlIGxpbmtlZCBkb2N1bWVudCwgJ2RlZmxhdGVSYXcnIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBzZXRPcHRpb25zKG9wdHMpIHtcclxuICAgICAgICB0aGlzLl91c2VySHR0cE9wdGlvbnMgPSBvcHRzO1xyXG4gICAgICAgIGlmIChvcHRzLmRlZmxhdGVSYXcpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zLmRlY29tcHJlc3MgPSBmYWxzZTsgICAgIC8vIGRlY29tcHJlc3M9dHJ1ZSBpbiBkZWZhdWx0IG9wdGlvbnMgc28gd2Ugb3ZlcnJpZGUgaXRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBTZXRzIHByb3h5IHVybCB0byBiZSB1c2VkIGZvciBjb25uZWN0aW9ucyB3aXRoIHRoZSBzZXJ2aWNlLlxyXG4gICAgICogQGZ1bmN0aW9uIHNldFByb3h5XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gUHJveHkgc2VydmVyIFVSTC4gTm90IHBhc3NpbmcgdGhpcyBhcmd1bWVudCB3aWxsIHJlc2V0IHRoZSBwcm94eSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgc2V0UHJveHkodXJsKSB7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgICAgICBib290c3RyYXBcclxuICAgICAgICAgICAgfSA9IHJlcXVpcmUoJ2dsb2JhbC1hZ2VudCcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBwYXJzZSB9ID0gcmVxdWlyZSgndXJsJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IHBhcnNlKHVybCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5ob3N0bmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnSG9zdG5hbWUgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucG9ydCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnUG9ydCBpbiB1bmRlZmluZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5wcm90b2NvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnUHJvdG9jb2wgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJvb3RzdHJhcCgpO1xyXG4gICAgICAgICAgICBnbG9iYWwuR0xPQkFMX0FHRU5ULkhUVFBfUFJPWFkgPSB1cmw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBHRVRcclxuICAgICAqIEBmdW5jdGlvbiBnZXRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogLy8gQmFzaWMgdXNhZ2UgZXhhbXBsZTpcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KFxyXG4gICAgICogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb3h5Z2VuaHEvb3h5Z2VuLWlkZS9yZWxlYXNlcycsIFxyXG4gICAgICoge1xyXG4gICAgICogICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUnLFxyXG4gICAgICogICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0OyBydjo4Ni4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94Lzg2LjAnXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICpcclxuICAgICAqIC8vIElmIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLCBgZGVmbGF0ZVJhd2AgY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyB0aGUgY29udGVudC5cclxuICAgICAqIGh0dHAuc2V0T3B0aW9ucyh7XHJcbiAgICAgKiAgIGRlZmxhdGVSYXc6IHRydWVcclxuICAgICAqIH0pO1xyXG4gICAgICogdmFyIHJlc3BvbnNlID0gaHR0cC5nZXQoJ2h0dHBzOi8vRk9PLkJBUicpO1xyXG4gICAgICogbG9nLmluZm8ocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldCh1cmwsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge31cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQT1NUXHJcbiAgICAgKiBAZnVuY3Rpb24gcG9zdFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IGlzRm9ybURhdGEgLSBJbmRpY2F0ZXMgaWYgXCJkYXRhXCIgcGFyYW1ldGVyIGlzIG9mIFVSTC1lbmNvZGVkIGZvcm0gdHlwZS5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwb3N0KHVybCwgZGF0YSwgaGVhZGVycywgaXNGb3JtRGF0YSA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSwgaGVhZGVycywgaXNGb3JtRGF0YSk7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUFVUXHJcbiAgICAgKiBAZnVuY3Rpb24gcHV0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHB1dCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQQVRDSFxyXG4gICAgICogQGZ1bmN0aW9uIHBhdGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHBhdGNoKHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgREVMRVRFXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZSh1cmwsIGhlYWRlcnMsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2Ugb2JqZWN0XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIGJvZHlcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUJvZHlcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VCb2R5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UgJiYgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIGhlYWRlcnNcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnNcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2UgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VIZWFkZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIFVSTFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlVXJsXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIFVSTC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBQYXR0ZXJuIHRvIGFzc2VydC5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0VGV4dChwYXR0ZXJuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnUmVzcG9uc2UgYm9keSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwQ29udGVudCA9IHR5cGVvZiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA9PT0gJ3N0cmluZycgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KTtcclxuICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihyZXNwQ29udGVudCwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHJlc3BvbnNlIGNvbnRlbnQgdG8gbWF0Y2g6IFwiJHtwYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHtyZXNwQ29udGVudH1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCByZXNwb25zZSB0aW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0UmVzcG9uc2VUaW1lXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VGltZSAtIE1heGltdW0gcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFJlc3BvbnNlVGltZShtYXhUaW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGhlYWRlciBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0SGVhZGVyXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyTmFtZSAtIEEgSFRUUCBoZWFkZXIgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaGVhZGVyVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBoZWFkZXIgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0SGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlUGF0dGVybiA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWhlYWRlck5hbWUgfHwgdHlwZW9mIGhlYWRlck5hbWUgIT09ICdzdHJpbmcnIHx8IGhlYWRlck5hbWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgICAgICBpZiAoIWhlYWRlcnNbaGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB0byBiZSBwcmVzZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlYWRlclZhbHVlUGF0dGVybiAmJiB0eXBlb2YgaGVhZGVyVmFsdWVQYXR0ZXJuID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxIZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKGFjdHVhbEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZVBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHZhbHVlIHRvIG1hdGNoOiBcIiR7aGVhZGVyVmFsdWVQYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHthY3R1YWxIZWFkZXJWYWx1ZX1cImApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgY29va2llIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRDb29raWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb29raWVOYW1lIC0gQSBIVFRQIGNvb2tpZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjb29raWVWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGNvb2tpZSB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWVQYXR0ZXJuKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB0aGUgbGFzdCBIVFRQIHJlc3BvbnNlJ3Mgc3RhdHVzIGNvZGVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfEFycmF5fSBjb2RlTGlzdCAtIEEgc2luZ2xlIHN0YXR1cyBjb2RlIG9yIGEgbGlzdCBvZiBjb2Rlcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzKGNvZGVMaXN0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UgfHwgIWNvZGVMaXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UgZ290IGEgc2luZ2xlIHZhbHVlLCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXlcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29kZUxpc3QpKSB7XHJcbiAgICAgICAgICAgIGNvZGVMaXN0ID0gW2NvZGVMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHRoaXMuX2xhc3RSZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgIGlmICghY29kZUxpc3QuaW5jbHVkZXMoc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHN0YXR1cyB0byBiZTogXCIke2NvZGVMaXN0fVwiIGJ1dCBnb3Q6IFwiJHtzdGF0dXNDb2RlfVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IEhUVFAgMjAwIE9LIHN0YXR1c1xyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c09rXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1c09rKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2VydFN0YXR1cygyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGlmICghbmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZSB1c2VyIHBhc3NlZCBhIGNvbXBsZXggb2JqZWN0IGJ5IG1pc3Rha2VcclxuICAgICAgICBuYW1lID0gbmFtZS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICAvLyBsaW1pdCB0aGUgbmFtZSBsZW5ndGggKHNpbmNlIHdlIGNhbid0IHN0b3JlIHZhbHVlcyBsYXJnZXIgdGhhbiA1MTJCIGluIHRoZSBkYXRhYmFzZSlcclxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCA1MTIpO1xyXG5cclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0ZXBEaXNwbGF5TmFtZShtZXRob2ROYW1lLCBtZXRob2RBcmdzLCByZXR2YWwsIGVycm9yKSB7XHJcbiAgICAgICAgaWYgKCFIVFRQX01FVEhPRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9leHRyYSB8fCAhdGhpcy5fZXh0cmEuaHR0cCB8fCAhdGhpcy5fZXh0cmEuaHR0cC5yZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgJHttZXRob2ROYW1lLnRvVXBwZXJDYXNlKCl9ICR7dGhpcy5fZXh0cmEuaHR0cC5yZXF1ZXN0LnBhdGh9YDtcclxuICAgIH1cclxuXHJcbiAgICBfYWRkUmVxdWVzdEV4dHJhKHJlcXVlc3QsIHVwZGF0ZWRPcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XHJcbiAgICAgICAgY29uc3QgcmVxRXh0cmEgPSB7XHJcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXHJcbiAgICAgICAgICAgIHBhdGg6IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gLFxyXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5fZ2V0UXVlcnlQYXJhbXModXJsLnNlYXJjaFBhcmFtcyksXHJcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHVwZGF0ZWRPcHRpb25zLmhlYWRlcnMsXHJcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLl9nZXRDb250ZW50VHlwZSh1cGRhdGVkT3B0aW9ucy5oZWFkZXJzKSxcclxuICAgICAgICAgICAgY29udGVudExlbmd0aDogdGhpcy5fZ2V0Q29udGVudExlbmd0aCh1cGRhdGVkT3B0aW9ucy5oZWFkZXJzKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LmZvcm0pIHtcclxuICAgICAgICAgICAgcmVxRXh0cmEuZm9ybURhdGEgPSByZXF1ZXN0LmZvcm07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlcXVlc3QuanNvbikge1xyXG4gICAgICAgICAgICByZXFFeHRyYS5jb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJztcclxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuanNvbiBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudCA9IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuanNvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXFFeHRyYS5jb250ZW50ID0gcmVxdWVzdC5qc29uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlcXVlc3QuYm9keSkge1xyXG4gICAgICAgICAgICByZXFFeHRyYS5jb250ZW50ID0gcmVxdWVzdC5ib2R5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9leHRyYS5odHRwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXh0cmEuaHR0cC5yZXF1ZXN0ID0gcmVxRXh0cmE7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldENvbnRlbnRUeXBlKGhlYWRlcnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVyc1snY29udGVudC10eXBlJ107XHJcbiAgICAgICAgaWYgKCFjb250ZW50VHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtYXRjaCA9IGNvbnRlbnRUeXBlLm1hdGNoKC9eKC4rPykoO3wkKS8pO1xyXG4gICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2gubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF0Y2hbMV07XHJcbiAgICB9XHJcblxyXG4gICAgX2dldENvbnRlbnRMZW5ndGgoaGVhZGVycyA9IHt9KSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzWydjb250ZW50LWxlbmd0aCddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxlbmd0aEFzU3RyID0gaGVhZGVyc1snY29udGVudC1sZW5ndGgnXTtcclxuICAgICAgICByZXR1cm4gcGFyc2VJbnQobGVuZ3RoQXNTdHIpO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRRdWVyeVBhcmFtcyhzZWFyY2hQYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSggc2VhcmNoUGFyYW1zLmtleXMoKSApLnJlZHVjZSggKCByZWNvcmQsIGtleSApID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gc2VhcmNoUGFyYW1zLmdldEFsbChrZXkpO1xyXG4gICAgICAgICAgICByZXR1cm4geyAuLi5yZWNvcmQsIFsga2V5IF06IHZhbHVlcy5sZW5ndGggPiAxID8gdmFsdWVzLmpvaW4oJywnKSA6IHZhbHVlc1swXSB9O1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBfYWRkUmVzcG9uc2VFeHRyYShyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IHJlc0V4dHJhID0ge1xyXG4gICAgICAgICAgICB1cmw6IHJlc3BvbnNlLnJlZGlyZWN0VXJscyAmJiByZXNwb25zZS5yZWRpcmVjdFVybHMubGVuZ3RoICYmIHJlc3BvbnNlLnJlZGlyZWN0VXJsc1swXSxcclxuICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSxcclxuICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IHRoaXMuX2dldENvbnRlbnRUeXBlKHJlc3BvbnNlLmhlYWRlcnMpLFxyXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB0aGlzLl9nZXRDb250ZW50TGVuZ3RoKHJlc3BvbnNlLmhlYWRlcnMpLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzLFxyXG4gICAgICAgICAgICB2ZXJzaW9uOiByZXNwb25zZS5odHRwVmVyc2lvbixcclxuICAgICAgICAgICAgY29udGVudDogcmVzcG9uc2UuYm9keSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghdGhpcy5fZXh0cmEuaHR0cCkge1xyXG4gICAgICAgICAgICB0aGlzLl9leHRyYS5odHRwID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2V4dHJhLmh0dHAucmVzcG9uc2UgPSByZXNFeHRyYTtcclxuICAgICAgICBpZiAocmVzcG9uc2UudGltaW5ncyAmJiByZXNwb25zZS50aW1pbmdzLnBoYXNlcykge1xyXG4gICAgICAgICAgICB0aGlzLl9leHRyYS5odHRwLnRpbWluZ3MgPSB7IC4uLnJlc3BvbnNlLnRpbWluZ3MucGhhc2VzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBfcmVzb2x2ZURhdGEoZGF0YSwgaGVhZGVycywgaXNGb3JtRGF0YSA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVJlc29sdmVyID0ge307XHJcblxyXG4gICAgICAgIGlmIChpc0Zvcm1EYXRhKSB7XHJcbiAgICAgICAgICAgIGRhdGFSZXNvbHZlci5mb3JtID0gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XHJcbiAgICAgICAgICAgIGRhdGFSZXNvbHZlci5ib2R5ID0gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICBtb2RVdGlscy5hc3NlcnRDaXJjdWxhcihkYXRhKTtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmpzb24gPSBkYXRhO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFSZXNvbHZlci5ib2R5ID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhUmVzb2x2ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cykge1xyXG4gICAgICAgIGlmICh0aGlzLl9leHRyYS5odHRwKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9leHRyYS5odHRwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3RoaXMuX2FkZFJlcXVlc3RFeHRyYShodHRwT3B0cyk7XHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZ290KHsgLi4uaHR0cE9wdHMsIGhvb2tzOiB7XHJcbiAgICAgICAgICAgICAgICBiZWZvcmVSZXF1ZXN0OiBbXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9PiB7IHRoaXMuX2FkZFJlcXVlc3RFeHRyYShodHRwT3B0cywgb3B0aW9ucyk7IH1cclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIH19KTtcclxuICAgICAgICAgICAgaWYgKGh0dHBPcHRzLmRlZmxhdGVSYXcgJiYgcmVzdWx0LmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PT0gJ2RlZmxhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVjb21wID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KCk7XHJcbiAgICAgICAgICAgICAgICBkZWNvbXAud3JpdGUocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0gJiYgcmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gSlNPTi5wYXJzZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJzaW5nIGZhaWxzIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXSAmJiByZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNwb25zZSAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlLmJvZHlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gcmVzdWx0LnJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IEpTT04ucGFyc2UoYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gcmVzdWx0LnJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLmhlYWRlcnMgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnN0YXR1c0NvZGUgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnN0YXR1c01lc3NhZ2UgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcmF3Qm9keTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnJhd0JvZHkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIGh0dHBWZXJzaW9uOiByZXN1bHQuaHR0cFZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQuaGVhZGVycyxcclxuICAgICAgICAgICAgICAgIHVwZ3JhZGU6IHJlc3VsdC51cGdyYWRlLFxyXG4gICAgICAgICAgICAgICAgdXJsOiByZXN1bHQudXJsLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiByZXN1bHQubWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1c0NvZGUsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXN1bHQuc3RhdHVzTWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHRpbWluZ3M6IHJlc3VsdC50aW1pbmdzLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdFVybDogcmVzdWx0LnJlcXVlc3RVcmwsXHJcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVybHM6IHJlc3VsdC5yZWRpcmVjdFVybHMsXHJcbiAgICAgICAgICAgICAgICBpc0Zyb21DYWNoZTogcmVzdWx0LmlzRnJvbUNhY2hlLFxyXG4gICAgICAgICAgICAgICAgaXA6IHJlc3VsdC5pcCxcclxuICAgICAgICAgICAgICAgIHJldHJ5Q291bnQ6IHJlc3VsdC5yZXRyeUNvdW50LFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVzdWx0LmJvZHlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYWRkUmVzcG9uc2VFeHRyYShyZXN1bHQpO1xyXG4gICAgICAgIC8vIHN0b3JlIGxhc3QgcmVzcG9uc2UgdG8gYWxsb3cgZnVydGhlciBhc3NlcnRpb25zIGFuZCB2YWxpZGF0aW9uc1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IHJlc3VsdDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufSJdfQ==
|
|
775
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbImh0dHAiLCJyZXF1aXJlIiwiaHR0cHMiLCJNT0RVTEVfTkFNRSIsIlJFU1BPTlNFX1RJTUVPVVQiLCJEQUZBVUxUX0hUVFAyIiwiREVGQVVMVF9IVFRQX09QVElPTlMiLCJkZWNvbXByZXNzIiwicmVzcG9uc2VUeXBlIiwidGltZW91dCIsImxvb2t1cCIsImNvbm5lY3QiLCJzZWN1cmVDb25uZWN0Iiwic29ja2V0Iiwic2VuZCIsInJlc3BvbnNlIiwiaHR0cDIiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJkbnNMb29rdXBJcFZlcnNpb24iLCJDT05URU5UX1RZUEVfSEVBREVSIiwiSFRUUF9NRVRIT0RTIiwiSHR0cE1vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9hbHdheXNJbml0aWFsaXplZCIsIl9sYXN0UmVzcG9uc2UiLCJfYmFzZVVybCIsIl91c2VySHR0cE9wdGlvbnMiLCJfdXNlcm5hbWUiLCJ1bmRlZmluZWQiLCJfcGFzc3dvcmQiLCJfZG9tYWluIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwibmV3Rm9ybURhdGEiLCJGb3JtRGF0YSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsInNldE50bG1Vc2VyIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImRvbWFpbiIsInNldFByb3h5IiwidXJsIiwiYm9vdHN0cmFwIiwicGFyc2UiLCJwYXJzZWRVcmwiLCJob3N0bmFtZSIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJIVFRQX0VSUk9SIiwicG9ydCIsInByb3RvY29sIiwiZ2xvYmFsIiwiR0xPQkFMX0FHRU5UIiwiSFRUUF9QUk9YWSIsImdldCIsImhlYWRlcnMiLCJodHRwT3B0cyIsIm1ldGhvZCIsIl9odHRwUmVxdWVzdFN5bmMiLCJwb3N0IiwiZGF0YSIsImlzRm9ybURhdGEiLCJyZXNvbHZlZERhdGEiLCJfcmVzb2x2ZURhdGEiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSIsImdldFJlc3BvbnNlIiwiZ2V0UmVzcG9uc2VCb2R5IiwiYm9keSIsImdldFJlc3BvbnNlSGVhZGVycyIsImdldFJlc3BvbnNlVXJsIiwiYXNzZXJ0VGV4dCIsInBhdHRlcm4iLCJBU1NFUlRfRVJST1IiLCJyZXNwQ29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtb2RVdGlscyIsIm1hdGNoUGF0dGVybiIsImFzc2VydFJlc3BvbnNlVGltZSIsIm1heFRpbWUiLCJFcnJvciIsImFzc2VydEhlYWRlciIsImhlYWRlck5hbWUiLCJoZWFkZXJWYWx1ZVBhdHRlcm4iLCJsZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsImFjdHVhbEhlYWRlclZhbHVlIiwiYXNzZXJ0Q29va2llIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlUGF0dGVybiIsImFzc2VydFN0YXR1cyIsImNvZGVMaXN0IiwiQXJyYXkiLCJpc0FycmF5Iiwic3RhdHVzQ29kZSIsImluY2x1ZGVzIiwiYXNzZXJ0U3RhdHVzT2siLCJ0cmFuc2FjdGlvbiIsInRvU3RyaW5nIiwic2xpY2UiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImdldFN0ZXBEaXNwbGF5TmFtZSIsIm1ldGhvZE5hbWUiLCJtZXRob2RBcmdzIiwicmV0dmFsIiwiZXJyb3IiLCJfZXh0cmEiLCJyZXF1ZXN0IiwidG9VcHBlckNhc2UiLCJwYXRoIiwiX2FkZFJlcXVlc3RFeHRyYSIsInVwZGF0ZWRPcHRpb25zIiwiVVJMIiwicmVxRXh0cmEiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJxdWVyeVBhcmFtcyIsIl9nZXRRdWVyeVBhcmFtcyIsInNlYXJjaFBhcmFtcyIsImNvbnRlbnRUeXBlIiwiX2dldENvbnRlbnRUeXBlIiwiY29udGVudExlbmd0aCIsIl9nZXRDb250ZW50TGVuZ3RoIiwiZm9ybSIsImZvcm1EYXRhIiwianNvbiIsIk9iamVjdCIsImNvbnRlbnQiLCJtYXRjaCIsImxlbmd0aEFzU3RyIiwicGFyc2VJbnQiLCJmcm9tIiwia2V5cyIsInJlZHVjZSIsInJlY29yZCIsImtleSIsInZhbHVlcyIsImdldEFsbCIsImpvaW4iLCJfYWRkUmVzcG9uc2VFeHRyYSIsInJlc0V4dHJhIiwicmVkaXJlY3RVcmxzIiwic3RhdHVzVGV4dCIsInN0YXR1c01lc3NhZ2UiLCJ2ZXJzaW9uIiwiaHR0cFZlcnNpb24iLCJ0aW1pbmdzIiwicGhhc2VzIiwiZGF0YVJlc29sdmVyIiwiYXNzZXJ0Q2lyY3VsYXIiLCJ3aXRoQXV0aCIsInJlc3VsdCIsImhvb2tzIiwiYmVmb3JlUmVxdWVzdCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiZSIsImF1dGhSZXFSZXN1bHQiLCJfaGFuZGxlTnRsbUF1dGhvcml6YXRpb24iLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwicmF3Qm9keSIsInVwZ3JhZGUiLCJyZXF1ZXN0VXJsIiwiaXNGcm9tQ2FjaGUiLCJpcCIsInJldHJ5Q291bnQiLCJhdXRoTWV0aG9kcyIsIm9wdHNXaXRoQXV0aCIsInNvbWUiLCJtIiwic3RhcnRzV2l0aCIsInJlcVVybCIsImlzSHR0cHMiLCJrZWVwYWxpdmVBZ2VudCIsIkFnZW50Iiwia2VlcEFsaXZlIiwiYWdlbnQiLCJudGxtT3B0cyIsIndvcmtzdGF0aW9uIiwibnRsbSIsImNyZWF0ZVR5cGUxTWVzc2FnZSIsInRocm93SHR0cEVycm9ycyIsInR5cGUxTXNnUmVzcG9uc2UiLCJ0eXBlMk1zZyIsInBhcnNlVHlwZTJNZXNzYWdlIiwiZm9sbG93UmVkaXJlY3QiLCJjcmVhdGVUeXBlM01lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOzs7Ozs7OztBQXZCQTtBQUNBO0FBQ0E7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R0FBK0IsS0FBL0I7QUFDQSxRQUFJQyxnQkFBZ0IsR0FBRyxNQUFNLGtCQUFJZixZQUFKLENBQTdCO0FBQ0FELElBQUFBLFdBQVcsR0FBRyxzQ0FBdUJnQixnQkFBdkIsQ0FBZCxDQWxDK0MsQ0FtQy9DOztBQUNBLFFBQUlBLGdCQUFnQixDQUFDaEcsVUFBakIsS0FBZ0MsR0FBaEMsSUFBdUNnRixXQUFXLENBQUMxRixNQUFaLEdBQXFCLENBQTVELElBQ0cwRixXQUFXLENBQUMsQ0FBRCxDQUFYLENBQWVJLFVBQWYsQ0FBMEIsTUFBMUIsQ0FEUCxFQUMwQztBQUN0QyxZQUFNYSxRQUFRLEdBQUdKLElBQUksQ0FBQ0ssaUJBQUwsQ0FBdUJGLGdCQUFnQixDQUFDekksT0FBakIsQ0FBeUIsa0JBQXpCLENBQXZCLENBQWpCO0FBQ0EwSCxNQUFBQSxZQUFZLENBQUNrQixjQUFiLEdBQThCLEtBQTlCO0FBQ0FsQixNQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLFlBQXJCLElBQXFDLE9BQXJDO0FBQ0EwSCxNQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLGVBQXJCLElBQ0lzSSxJQUFJLENBQUNPLGtCQUFMLENBQXdCSCxRQUF4QixFQUFrQ04sUUFBbEMsQ0FESjtBQUVILEtBUEQsTUFRSztBQUNELGFBQU90TCxRQUFQO0FBQ0g7O0FBQ0Q0SyxJQUFBQSxZQUFZLENBQUNjLGVBQWIsR0FBK0IsSUFBL0IsQ0EvQytDLENBZ0QvQzs7QUFDQSxXQUFPLE1BQU0sS0FBS3JJLGdCQUFMLENBQXNCdUgsWUFBdEIsRUFBb0MsSUFBcEMsQ0FBYjtBQUNIOztBQXRuQmdEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgaHR0cFxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEhUVFAoUylcclxuICovXHJcbmltcG9ydCBnb3QgZnJvbSAnZ290JztcclxuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRBdXRoZW50aWNhdGVNZXRob2RzLFxyXG4gICAgY3JlYXRlQmFzaWNNZXNzYWdlLFxyXG59IGZyb20gJy4vbW9kdWxlLWh0dHAvbnRsbS11dGlsJztcclxuaW1wb3J0ICogYXMgbnRsbSBmcm9tICcuL21vZHVsZS1odHRwL250bG0nO1xyXG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xyXG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdodHRwJztcclxuY29uc3QgUkVTUE9OU0VfVElNRU9VVCA9IDEwMDAgKiA2MDsgICAvLyBpbiBtc1xyXG5jb25zdCBEQUZBVUxUX0hUVFAyID0gZmFsc2U7XHJcbmNvbnN0IERFRkFVTFRfSFRUUF9PUFRJT05TID0ge1xyXG4gICAgZGVjb21wcmVzczogdHJ1ZSxcclxuICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgdGltZW91dDoge1xyXG4gICAgICAgIGxvb2t1cDogMTAwMCxcclxuICAgICAgICBjb25uZWN0OiA1MDAsXHJcbiAgICAgICAgc2VjdXJlQ29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNvY2tldDogMTAwMDAwLFxyXG4gICAgICAgIHNlbmQ6IDEwMDAwMCxcclxuICAgICAgICByZXNwb25zZTogUkVTUE9OU0VfVElNRU9VVFxyXG4gICAgfSxcclxuICAgIGh0dHAyOiBEQUZBVUxUX0hUVFAyLFxyXG4gICAgaHR0cHM6IHtcclxuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgZG5zTG9va3VwSXBWZXJzaW9uOiAnaXB2NCdcclxufTtcclxuY29uc3QgQ09OVEVOVF9UWVBFX0hFQURFUiA9ICdjb250ZW50LXR5cGUnO1xyXG5jb25zdCBIVFRQX01FVEhPRFMgPSBbXHJcbiAgICAnZ2V0JyxcclxuICAgICdwb3N0JyxcclxuICAgICdwYXRjaCdcclxuXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZG9tYWluID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIC8vIHByZS1pbml0aWFsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxyXG4gICAgICogQGZ1bmN0aW9uIG5hbWVcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29uc3RhbnQgdmFsdWUgXCJodHRwXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIG5ldyBGb3JtRGF0YSBvYmplY3RcclxuICAgICAqIEBmdW5jdGlvbiBuZXdGb3JtRGF0YVxyXG4gICAgICogQHJldHVybiB7Rm9ybURhdGF9IG5ldyBGb3JtRGF0YSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIG5ld0Zvcm1EYXRhKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBkZWZpbmVkIEhUVFAgb3B0aW9ucyAoc3VjaCBhcyBwcm94eSwgZGVjb21wcmVzcyBhbmQgZXRjLilcclxuICAgICAqIEBmdW5jdGlvbiBzZXRPcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEhUVFAgcmVxdWVzdCBvcHRpb25zIG9iamVjdCwgc2VlIFtSZXF1ZXN0IE9wdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZ290L2Jsb2IvbWFpbi9kb2N1bWVudGF0aW9uLzItb3B0aW9ucy5tZCkuIFxyXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgc2V0T3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcclxuICAgICAgICBpZiAob3B0cy5kZWZsYXRlUmF3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5kZWNvbXByZXNzID0gZmFsc2U7ICAgICAvLyBkZWNvbXByZXNzPXRydWUgaW4gZGVmYXVsdCBvcHRpb25zIHNvIHdlIG92ZXJyaWRlIGl0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB1c2VyIGNyZWRlbnRpYWxzIGZvciBOVExNIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3NcclxuICAgICAqIEBmdW5jdGlvbiBzZXROdGxtVXNlclxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVzZXJuYW1lIC0gTlRMTSB1c2VybmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzd29yZCAtIE5UTE0gcGFzc3dvcmQuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGRvbWFpbiAtIE5UTE0gZG9tYWluIG5hbWUsIGlmIGFwcGxpY2FibGUuXHJcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gdGhlIGxpbmtlZCBkb2N1bWVudCwgJ2RlZmxhdGVSYXcnIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBzZXROdGxtVXNlcih1c2VybmFtZSwgcGFzc3dvcmQsIGRvbWFpbiA9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vIElmIHVzZXJuYW1lIHdhcyBwYXNzZWQgYXMgdW5kZWZpbmVkLCB0aGVuIHJlbW92ZSBwcmV2aW91c2x5IGRlZmluZWQgTlRMTSBjcmVkZW50aWFsc1xyXG4gICAgICAgIGlmICh1c2VybmFtZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSB0aGlzLl9wYXNzd29yZCA9IHRoaXMuX2RvbWFpbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl91c2VybmFtZSA9IHVzZXJuYW1lO1xyXG4gICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7XHJcbiAgICAgICAgdGhpcy5fZG9tYWluID0gZG9tYWluO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBwcm94eSB1cmwgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgd2l0aCB0aGUgc2VydmljZS5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFByb3h5IHNlcnZlciBVUkwuIE5vdCBwYXNzaW5nIHRoaXMgYXJndW1lbnQgd2lsbCByZXNldCB0aGUgcHJveHkgc2V0dGluZ3MuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3h5KHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwXHJcbiAgICAgICAgICAgIH0gPSByZXF1aXJlKCdnbG9iYWwtYWdlbnQnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHJlcXVpcmUoJ3VybCcpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBwYXJzZSh1cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwuaG9zdG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ0hvc3RuYW1lIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1BvcnQgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucHJvdG9jb2wpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1Byb3RvY29sIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBib290c3RyYXAoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5HTE9CQUxfQUdFTlQuSFRUUF9QUk9YWSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgR0VUXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIEJhc2ljIHVzYWdlIGV4YW1wbGU6XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldChcclxuICAgICAqICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL294eWdlbmhxL294eWdlbi1pZGUvcmVsZWFzZXMnLCBcclxuICAgICAqIHtcclxuICAgICAqICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlJyxcclxuICAgICAqICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84Ni4wJ1xyXG4gICAgICogfSk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqXHJcbiAgICAgKiAvLyBJZiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycywgYGRlZmxhdGVSYXdgIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGNvbnRlbnQuXHJcbiAgICAgKiBodHRwLnNldE9wdGlvbnMoe1xyXG4gICAgICogICBkZWZsYXRlUmF3OiB0cnVlXHJcbiAgICAgKiB9KTtcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KCdodHRwczovL0ZPTy5CQVInKTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXQodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUE9TVFxyXG4gICAgICogQGZ1bmN0aW9uIHBvc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW49fSBpc0Zvcm1EYXRhIC0gSW5kaWNhdGVzIGlmIFwiZGF0YVwiIHBhcmFtZXRlciBpcyBvZiBVUkwtZW5jb2RlZCBmb3JtIHR5cGUuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIGlzRm9ybURhdGEgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEsIGhlYWRlcnMsIGlzRm9ybURhdGEpO1xyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBVVFxyXG4gICAgICogQGZ1bmN0aW9uIHB1dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwdXQodXJsLCBkYXRhLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUEFUQ0hcclxuICAgICAqIEBmdW5jdGlvbiBwYXRjaFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwYXRjaCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIERFTEVURVxyXG4gICAgICogQGZ1bmN0aW9uIGRlbGV0ZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkZWxldGUodXJsLCBoZWFkZXJzLCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSk7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIG9iamVjdFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgbGFzdCByZXNwb25zZSBib2R5XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VCb2R5XHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlQm9keSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlICYmIHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5ID8gdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyByZXNwb25zZSBoZWFkZXJzXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VIZWFkZXJzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlSGVhZGVycygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZS5oZWFkZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyByZXNwb25zZSBVUkxcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZVVybFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBSZXNwb25zZSBVUkwuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlVXJsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLnVybDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBpcyBwcmVzZW50IGluIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFRleHRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXR0ZXJuIC0gUGF0dGVybiB0byBhc3NlcnQuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFRleHQocGF0dGVybikge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgJ1Jlc3BvbnNlIGJvZHkgaXMgZW1wdHknKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcENvbnRlbnQgPSB0eXBlb2YgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPT09ICdzdHJpbmcnID8gdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgOiBKU09OLnN0cmluZ2lmeSh0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSk7XHJcbiAgICAgICAgaWYgKCFtb2RVdGlscy5tYXRjaFBhdHRlcm4ocmVzcENvbnRlbnQsIHBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCByZXNwb25zZSBjb250ZW50IHRvIG1hdGNoOiBcIiR7cGF0dGVybn1cIiBidXQgZ290OiBcIiR7cmVzcENvbnRlbnR9XCJgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgcmVzcG9uc2UgdGltZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFJlc3BvbnNlVGltZVxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1heFRpbWUgLSBNYXhpbXVtIHJlc3BvbnNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRSZXNwb25zZVRpbWUobWF4VGltZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgSFRUUCBoZWFkZXIgaXMgcHJlc2VudGVkIGluIHRoZSByZXNwb25zZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydEhlYWRlclxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlck5hbWUgLSBBIEhUVFAgaGVhZGVyIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGhlYWRlclZhbHVlUGF0dGVybiAtIEFuIG9wdGlvbmFsIEhUVFAgaGVhZGVyIHZhbHVlIHBhdHRlcm4uXHJcbiAgICAgKi9cclxuICAgIGFzc2VydEhlYWRlcihoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZVBhdHRlcm4gPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJOYW1lIHx8IHR5cGVvZiBoZWFkZXJOYW1lICE9PSAnc3RyaW5nJyB8fCBoZWFkZXJOYW1lLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGVhZGVyTmFtZSA9IGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzW2hlYWRlck5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnRXhwZWN0ZWQgSFRUUCBoZWFkZXIgXCIke2hlYWRlck5hbWV9XCIgdG8gYmUgcHJlc2VudCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChoZWFkZXJWYWx1ZVBhdHRlcm4gJiYgdHlwZW9mIGhlYWRlclZhbHVlUGF0dGVybiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0dWFsSGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlck5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihhY3R1YWxIZWFkZXJWYWx1ZSwgaGVhZGVyVmFsdWVQYXR0ZXJuKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB2YWx1ZSB0byBtYXRjaDogXCIke2hlYWRlclZhbHVlUGF0dGVybn1cIiBidXQgZ290OiBcIiR7YWN0dWFsSGVhZGVyVmFsdWV9XCJgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGNvb2tpZSBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0Q29va2llXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29va2llTmFtZSAtIEEgSFRUUCBjb29raWUgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gY29va2llVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBjb29raWUgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0Q29va2llKGNvb2tpZU5hbWUsIGNvb2tpZVZhbHVlUGF0dGVybikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgdGhlIGxhc3QgSFRUUCByZXNwb25zZSdzIHN0YXR1cyBjb2RlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcnxBcnJheX0gY29kZUxpc3QgLSBBIHNpbmdsZSBzdGF0dXMgY29kZSBvciBhIGxpc3Qgb2YgY29kZXMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1cyhjb2RlTGlzdCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlIHx8ICFjb2RlTGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHdlIGdvdCBhIHNpbmdsZSB2YWx1ZSwgdGhlbiBjb252ZXJ0IGl0IHRvIGFuIGFycmF5XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvZGVMaXN0KSkge1xyXG4gICAgICAgICAgICBjb2RlTGlzdCA9IFtjb2RlTGlzdF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSB0aGlzLl9sYXN0UmVzcG9uc2Uuc3RhdHVzQ29kZTtcclxuICAgICAgICBpZiAoIWNvZGVMaXN0LmluY2x1ZGVzKHN0YXR1c0NvZGUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCBzdGF0dXMgdG8gYmU6IFwiJHtjb2RlTGlzdH1cIiBidXQgZ290OiBcIiR7c3RhdHVzQ29kZX1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBIVFRQIDIwMCBPSyBzdGF0dXNcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNPa1xyXG4gICAgICovXHJcbiAgICBhc3NlcnRTdGF0dXNPaygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRTdGF0dXMoMjAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdHJhbnNhY3Rpb24gd2lsbCBwZXJzaXN0IHRpbGwgYSBuZXcgb25lIGlzIG9wZW5lZC4gVHJhbnNhY3Rpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKG5hbWUpIHtcclxuICAgICAgICBpZiAoIW5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBqdXN0IGluIGNhc2UgdXNlciBwYXNzZWQgYSBjb21wbGV4IG9iamVjdCBieSBtaXN0YWtlXHJcbiAgICAgICAgbmFtZSA9IG5hbWUudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgLy8gbGltaXQgdGhlIG5hbWUgbGVuZ3RoIChzaW5jZSB3ZSBjYW4ndCBzdG9yZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gNTEyQiBpbiB0aGUgZGF0YWJhc2UpXHJcbiAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgNTEyKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGVwRGlzcGxheU5hbWUobWV0aG9kTmFtZSwgbWV0aG9kQXJncywgcmV0dmFsLCBlcnJvcikge1xyXG4gICAgICAgIGlmICghSFRUUF9NRVRIT0RTLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fZXh0cmEgfHwgIXRoaXMuX2V4dHJhLmh0dHAgfHwgIXRoaXMuX2V4dHJhLmh0dHAucmVxdWVzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7bWV0aG9kTmFtZS50b1VwcGVyQ2FzZSgpfSAke3RoaXMuX2V4dHJhLmh0dHAucmVxdWVzdC5wYXRofWA7XHJcbiAgICB9XHJcblxyXG4gICAgX2FkZFJlcXVlc3RFeHRyYShyZXF1ZXN0LCB1cGRhdGVkT3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xyXG4gICAgICAgIGNvbnN0IHJlcUV4dHJhID0ge1xyXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICBwYXRoOiBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofSR7dXJsLmhhc2h9YCxcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMuX2dldFF1ZXJ5UGFyYW1zKHVybC5zZWFyY2hQYXJhbXMpLFxyXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB1cGRhdGVkT3B0aW9ucy5oZWFkZXJzLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUodXBkYXRlZE9wdGlvbnMuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2dldENvbnRlbnRMZW5ndGgodXBkYXRlZE9wdGlvbnMuaGVhZGVycyksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAocmVxdWVzdC5mb3JtKSB7XHJcbiAgICAgICAgICAgIHJlcUV4dHJhLmZvcm1EYXRhID0gcmVxdWVzdC5mb3JtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXF1ZXN0Lmpzb24pIHtcclxuICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbic7XHJcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0Lmpzb24gaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Lmpzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudCA9IHJlcXVlc3QuanNvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXF1ZXN0LmJvZHkpIHtcclxuICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudCA9IHJlcXVlc3QuYm9keTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZXh0cmEuaHR0cCkge1xyXG4gICAgICAgICAgICB0aGlzLl9leHRyYS5odHRwID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2V4dHJhLmh0dHAucmVxdWVzdCA9IHJlcUV4dHJhO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRDb250ZW50VHlwZShoZWFkZXJzID0ge30pIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzWydjb250ZW50LXR5cGUnXTtcclxuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gY29udGVudFR5cGUubWF0Y2goL14oLis/KSg7fCQpLyk7XHJcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaC5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXRjaFsxXTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0Q29udGVudExlbmd0aChoZWFkZXJzID0ge30pIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnMgfHwgIWhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoQXNTdHIgPSBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludChsZW5ndGhBc1N0cik7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFF1ZXJ5UGFyYW1zKHNlYXJjaFBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKCBzZWFyY2hQYXJhbXMua2V5cygpICkucmVkdWNlKCAoIHJlY29yZCwga2V5ICkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBzZWFyY2hQYXJhbXMuZ2V0QWxsKGtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnJlY29yZCwgWyBrZXkgXTogdmFsdWVzLmxlbmd0aCA+IDEgPyB2YWx1ZXMuam9pbignLCcpIDogdmFsdWVzWzBdIH07XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIF9hZGRSZXNwb25zZUV4dHJhKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzRXh0cmEgPSB7XHJcbiAgICAgICAgICAgIHVybDogcmVzcG9uc2UucmVkaXJlY3RVcmxzICYmIHJlc3BvbnNlLnJlZGlyZWN0VXJscy5sZW5ndGggJiYgcmVzcG9uc2UucmVkaXJlY3RVcmxzWzBdLFxyXG4gICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2dldENvbnRlbnRMZW5ndGgocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXHJcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3BvbnNlLmh0dHBWZXJzaW9uLFxyXG4gICAgICAgICAgICBjb250ZW50OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCF0aGlzLl9leHRyYS5odHRwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXh0cmEuaHR0cC5yZXNwb25zZSA9IHJlc0V4dHJhO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS50aW1pbmdzICYmIHJlc3BvbnNlLnRpbWluZ3MucGhhc2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAudGltaW5ncyA9IHsgLi4ucmVzcG9uc2UudGltaW5ncy5waGFzZXMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIF9yZXNvbHZlRGF0YShkYXRhLCBoZWFkZXJzLCBpc0Zvcm1EYXRhID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBkYXRhUmVzb2x2ZXIgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKGlzRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmZvcm0gPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIG1vZFV0aWxzLmFzc2VydENpcmN1bGFyKGRhdGEpO1xyXG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuanNvbiA9IGRhdGE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZXNvbHZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzLCB3aXRoQXV0aCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4dHJhLmh0dHApIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V4dHJhLmh0dHA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzKTtcclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBnb3QoeyAuLi5odHRwT3B0cywgaG9va3M6IHtcclxuICAgICAgICAgICAgICAgIGJlZm9yZVJlcXVlc3Q6IFtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0+IHsgdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzLCBvcHRpb25zKTsgfVxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfX0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGh0dHBPcHRzLmRlZmxhdGVSYXcgJiYgcmVzdWx0LmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PT0gJ2RlZmxhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVjb21wID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KCk7XHJcbiAgICAgICAgICAgICAgICBkZWNvbXAud3JpdGUocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0gJiYgcmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gSlNPTi5wYXJzZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJzaW5nIGZhaWxzIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXSAmJiByZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gZTtcclxuICAgICAgICAgICAgaWYgKGUucmVzcG9uc2UgJiYgZS5yZXNwb25zZS5zdGF0dXNDb2RlICYmIGUucmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmICF3aXRoQXV0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aFJlcVJlc3VsdCA9IGF3YWl0IHRoaXMuX2hhbmRsZU50bG1BdXRob3JpemF0aW9uKGh0dHBPcHRzLCBlLnJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRoUmVxUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXV0aFJlcVJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgIGxldCBib2R5ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlICYmXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UuYm9keVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UuaGVhZGVycyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzQ29kZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICByYXdCb2R5OiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UucmF3Qm9keSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgaHR0cFZlcnNpb246IHJlc3VsdC5odHRwVmVyc2lvbixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgdXBncmFkZTogcmVzdWx0LnVwZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IHJlc3VsdC51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgdGltaW5nczogcmVzdWx0LnRpbWluZ3MsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiByZXN1bHQucmVxdWVzdFVybCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJsczogcmVzdWx0LnJlZGlyZWN0VXJscyxcclxuICAgICAgICAgICAgICAgIGlzRnJvbUNhY2hlOiByZXN1bHQuaXNGcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICBpcDogcmVzdWx0LmlwLFxyXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogcmVzdWx0LnJldHJ5Q291bnQsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hZGRSZXNwb25zZUV4dHJhKHJlc3VsdCk7XHJcbiAgICAgICAgLy8gc3RvcmUgbGFzdCByZXNwb25zZSB0byBhbGxvdyBmdXJ0aGVyIGFzc2VydGlvbnMgYW5kIHZhbGlkYXRpb25zXHJcbiAgICAgICAgdGhpcy5fbGFzdFJlc3BvbnNlID0gcmVzdWx0O1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVOdGxtQXV0aG9yaXphdGlvbihodHRwT3B0cywgcmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3VzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhdXRoTWV0aG9kcyA9IGdldEF1dGhlbnRpY2F0ZU1ldGhvZHMocmVzcG9uc2UpO1xyXG4gICAgICAgIGNvbnN0IG9wdHNXaXRoQXV0aCA9IHsgLi4uaHR0cE9wdHMgfTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmIGF1dGhNZXRob2RzPy5zb21lKG0gPT4gbS5zdGFydHNXaXRoKCdiYXNpYycpKSkge1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gY3JlYXRlQmFzaWNNZXNzYWdlKHRoaXMuX3VzZXJuYW1lIHx8ICcnLCB0aGlzLl9wYXNzd29yZCB8fCAnJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMob3B0c1dpdGhBdXRoLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSXMgaHR0cHM/XHJcbiAgICAgICAgY29uc3QgcmVxVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2Uob3B0c1dpdGhBdXRoLnVybCk7XHJcbiAgICAgICAgY29uc3QgaXNIdHRwcyA9IHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XHJcbiAgICAgICAgLy8gU2V0dXAga2VlcC1hbGl2ZSBhZ2VudCAob3RoZXJ3aXNlIHdlIHdpbGwgZ2V0IEhUVFAgNDAxIGZvciBtZXNzYWdlIHR5cGUgMylcclxuICAgICAgICBjb25zdCBrZWVwYWxpdmVBZ2VudCA9IGlzSHR0cHMgPyBuZXcgaHR0cHMuQWdlbnQoe2tlZXBBbGl2ZTogdHJ1ZX0pXHJcbiAgICAgICAgICAgIDogbmV3IGh0dHAuQWdlbnQoe2tlZXBBbGl2ZTogdHJ1ZX0pO1xyXG4gICAgICAgIGlmIChpc0h0dHBzKSB7XHJcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5hZ2VudCA9IHsgaHR0cHM6IGtlZXBhbGl2ZUFnZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguYWdlbnQgPSB7IGh0dHA6IGtlZXBhbGl2ZUFnZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlbmQgVHlwZSAxIG1lc3NhZ2VcclxuICAgICAgICBjb25zdCBudGxtT3B0cyA9IHtcclxuICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMuX3VzZXJuYW1lLFxyXG4gICAgICAgICAgICBwYXNzd29yZDogdGhpcy5fcGFzc3dvcmQsXHJcbiAgICAgICAgICAgIGRvbWFpbjogJycsXHJcbiAgICAgICAgICAgIHdvcmtzdGF0aW9uOiAnJyxcclxuICAgICAgICAgICAgdXJsOiBvcHRzV2l0aEF1dGgudXJsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBvcHRzV2l0aEF1dGguaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gbnRsbS5jcmVhdGVUeXBlMU1lc3NhZ2UobnRsbU9wdHMpO1xyXG4gICAgICAgIG9wdHNXaXRoQXV0aC5oZWFkZXJzWydDb25uZWN0aW9uJ10gPSAna2VlcC1hbGl2ZSc7XHJcbiAgICAgICAgb3B0c1dpdGhBdXRoLnRocm93SHR0cEVycm9ycyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB0eXBlMU1zZ1Jlc3BvbnNlID0gYXdhaXQgZ290KG9wdHNXaXRoQXV0aCk7XHJcbiAgICAgICAgYXV0aE1ldGhvZHMgPSBnZXRBdXRoZW50aWNhdGVNZXRob2RzKHR5cGUxTXNnUmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIFBhcnNlIFR5cGUgMiByZXNwb25zZVxyXG4gICAgICAgIGlmICh0eXBlMU1zZ1Jlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSAmJiBhdXRoTWV0aG9kcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICYmIGF1dGhNZXRob2RzWzBdLnN0YXJ0c1dpdGgoJ250bG0nKSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlMk1zZyA9IG50bG0ucGFyc2VUeXBlMk1lc3NhZ2UodHlwZTFNc2dSZXNwb25zZS5oZWFkZXJzWyd3d3ctYXV0aGVudGljYXRlJ10pO1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguZm9sbG93UmVkaXJlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgb3B0c1dpdGhBdXRoLmhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7XHJcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPVxyXG4gICAgICAgICAgICAgICAgbnRsbS5jcmVhdGVUeXBlM01lc3NhZ2UodHlwZTJNc2csIG50bG1PcHRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0c1dpdGhBdXRoLnRocm93SHR0cEVycm9ycyA9IHRydWU7XHJcbiAgICAgICAgLy8gU2VuZCBUeXBlIDMgbWVzc2FnZVxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMob3B0c1dpdGhBdXRoLCB0cnVlKTtcclxuICAgIH1cclxufSJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oxygen-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.34.0",
|
|
4
4
|
"description": "Automation framework for testing modern applications",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"cucumber": "6.0.5",
|
|
73
73
|
"deasync": "0.1.28",
|
|
74
74
|
"decache": "4.6.2",
|
|
75
|
+
"des.js": "^1.1.0",
|
|
75
76
|
"download": "8.0.0",
|
|
76
77
|
"easyxml": "2.0.1",
|
|
77
78
|
"ejs": "3.1.9",
|
|
@@ -86,6 +87,7 @@
|
|
|
86
87
|
"imap-simple": "5.1.0",
|
|
87
88
|
"is-glob": "4.0.3",
|
|
88
89
|
"jimp": "0.16.3",
|
|
90
|
+
"js-md4": "^0.3.2",
|
|
89
91
|
"junit-report-builder": "3.0.1",
|
|
90
92
|
"lodash": "4.17.21",
|
|
91
93
|
"mailparser": "3.5.0",
|