ultipa 6.0.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/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/client.d.ts +194 -0
- package/dist/client.js +390 -0
- package/dist/config.d.ts +65 -0
- package/dist/config.js +135 -0
- package/dist/connection.d.ts +30 -0
- package/dist/connection.js +190 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.js +237 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +88 -0
- package/dist/printers.d.ts +33 -0
- package/dist/printers.js +312 -0
- package/dist/proto/gqldb.proto +632 -0
- package/dist/response.d.ts +256 -0
- package/dist/response.js +723 -0
- package/dist/services/admin-service.d.ts +40 -0
- package/dist/services/admin-service.js +115 -0
- package/dist/services/bulk-import-service.d.ts +35 -0
- package/dist/services/bulk-import-service.js +108 -0
- package/dist/services/converters.d.ts +57 -0
- package/dist/services/converters.js +254 -0
- package/dist/services/data-service.d.ts +44 -0
- package/dist/services/data-service.js +206 -0
- package/dist/services/graph-service.d.ts +32 -0
- package/dist/services/graph-service.js +127 -0
- package/dist/services/health-service.d.ts +50 -0
- package/dist/services/health-service.js +78 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.js +30 -0
- package/dist/services/query-service.d.ts +39 -0
- package/dist/services/query-service.js +112 -0
- package/dist/services/service-context.d.ts +39 -0
- package/dist/services/service-context.js +73 -0
- package/dist/services/session-service.d.ts +24 -0
- package/dist/services/session-service.js +66 -0
- package/dist/services/transaction-service.d.ts +33 -0
- package/dist/services/transaction-service.js +100 -0
- package/dist/services.d.ts +28 -0
- package/dist/services.js +122 -0
- package/dist/session.d.ts +45 -0
- package/dist/session.js +75 -0
- package/dist/transaction.d.ts +42 -0
- package/dist/transaction.js +89 -0
- package/dist/types/bulk_import.d.ts +53 -0
- package/dist/types/bulk_import.js +6 -0
- package/dist/types/data_types.d.ts +116 -0
- package/dist/types/data_types.js +122 -0
- package/dist/types/enums.d.ts +59 -0
- package/dist/types/enums.js +67 -0
- package/dist/types/graph_models.d.ts +54 -0
- package/dist/types/graph_models.js +6 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.js +36 -0
- package/dist/types/metadata.d.ts +60 -0
- package/dist/types/metadata.js +6 -0
- package/dist/types/schema.d.ts +31 -0
- package/dist/types/schema.js +6 -0
- package/dist/types/typed_value.d.ts +25 -0
- package/dist/types/typed_value.js +1176 -0
- package/dist/types/wrappers.d.ts +23 -0
- package/dist/types/wrappers.js +39 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +24 -0
- package/package.json +50 -0
|
@@ -0,0 +1,1176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TypedValue encoding and decoding for GQLDB Node.js driver.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createTypedValue = createTypedValue;
|
|
7
|
+
exports.typedValueToJS = typedValueToJS;
|
|
8
|
+
exports.formatValue = formatValue;
|
|
9
|
+
exports.fromString = fromString;
|
|
10
|
+
exports.createParameter = createParameter;
|
|
11
|
+
const enums_1 = require("./enums");
|
|
12
|
+
const wrappers_1 = require("./wrappers");
|
|
13
|
+
const data_types_1 = require("./data_types");
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Binary Format Helpers
|
|
16
|
+
// =============================================================================
|
|
17
|
+
/** Encode a length-prefixed string: [len:2 uint16LE][utf8 bytes] */
|
|
18
|
+
function encodeString(s) {
|
|
19
|
+
const strBuf = Buffer.from(s, 'utf-8');
|
|
20
|
+
const result = Buffer.alloc(2 + strBuf.length);
|
|
21
|
+
result.writeUInt16LE(strBuf.length, 0);
|
|
22
|
+
strBuf.copy(result, 2);
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
/** Decode a length-prefixed string. Returns [string, bytesConsumed]. */
|
|
26
|
+
function decodeString(data, offset) {
|
|
27
|
+
if (offset + 2 > data.length)
|
|
28
|
+
return ['', 0];
|
|
29
|
+
const len = data.readUInt16LE(offset);
|
|
30
|
+
if (offset + 2 + len > data.length)
|
|
31
|
+
return ['', 0];
|
|
32
|
+
return [data.slice(offset + 2, offset + 2 + len).toString('utf-8'), 2 + len];
|
|
33
|
+
}
|
|
34
|
+
/** Encode a TypedValueEntry: [type:1][isNull:1][dataLen:4 uint32LE][data] */
|
|
35
|
+
function encodeTypedValueEntry(tv) {
|
|
36
|
+
const result = Buffer.alloc(6 + tv.data.length);
|
|
37
|
+
result.writeUInt8(tv.type, 0);
|
|
38
|
+
result.writeUInt8(tv.isNull ? 1 : 0, 1);
|
|
39
|
+
result.writeUInt32LE(tv.data.length, 2);
|
|
40
|
+
if (tv.data.length > 0) {
|
|
41
|
+
tv.data.copy(result, 6);
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
/** Decode a TypedValueEntry. Returns [TypedValue, bytesConsumed]. */
|
|
46
|
+
function decodeTypedValueEntry(data, offset) {
|
|
47
|
+
if (offset + 6 > data.length) {
|
|
48
|
+
return [{ type: enums_1.PropertyType.NULL, data: Buffer.alloc(0), isNull: true }, 0];
|
|
49
|
+
}
|
|
50
|
+
const type = data.readUInt8(offset);
|
|
51
|
+
const isNull = data.readUInt8(offset + 1) !== 0;
|
|
52
|
+
const dataLen = data.readUInt32LE(offset + 2);
|
|
53
|
+
if (offset + 6 + dataLen > data.length) {
|
|
54
|
+
return [{ type: enums_1.PropertyType.NULL, data: Buffer.alloc(0), isNull: true }, 0];
|
|
55
|
+
}
|
|
56
|
+
const tvData = data.slice(offset + 6, offset + 6 + dataLen);
|
|
57
|
+
return [{ type, data: tvData, isNull }, 6 + dataLen];
|
|
58
|
+
}
|
|
59
|
+
/** Decode binary properties: [count:2][keyLen:2][key][TVE]... */
|
|
60
|
+
function decodePropertiesBinary(data, offset) {
|
|
61
|
+
if (offset + 2 > data.length)
|
|
62
|
+
return [{}, 0];
|
|
63
|
+
const count = data.readUInt16LE(offset);
|
|
64
|
+
let pos = offset + 2;
|
|
65
|
+
const result = {};
|
|
66
|
+
for (let i = 0; i < count; i++) {
|
|
67
|
+
const [key, keyLen] = decodeString(data, pos);
|
|
68
|
+
if (keyLen === 0)
|
|
69
|
+
break;
|
|
70
|
+
pos += keyLen;
|
|
71
|
+
const [tv, tvLen] = decodeTypedValueEntry(data, pos);
|
|
72
|
+
if (tvLen === 0)
|
|
73
|
+
break;
|
|
74
|
+
pos += tvLen;
|
|
75
|
+
result[key] = typedValueToJS(tv);
|
|
76
|
+
}
|
|
77
|
+
return [result, pos - offset];
|
|
78
|
+
}
|
|
79
|
+
// =============================================================================
|
|
80
|
+
// Encoding: JS → TypedValue
|
|
81
|
+
// =============================================================================
|
|
82
|
+
/** Create a TypedValue from a JavaScript value */
|
|
83
|
+
function createTypedValue(value) {
|
|
84
|
+
if (value === null || value === undefined) {
|
|
85
|
+
return { type: enums_1.PropertyType.NULL, data: Buffer.alloc(0), isNull: true };
|
|
86
|
+
}
|
|
87
|
+
// Pass-through: if already a TypedValue, return directly
|
|
88
|
+
if (typeof value === 'object' && 'type' in value && 'data' in value && 'isNull' in value && value.data instanceof Buffer) {
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
if (typeof value === 'boolean') {
|
|
92
|
+
const data = Buffer.alloc(1);
|
|
93
|
+
data.writeUInt8(value ? 1 : 0, 0);
|
|
94
|
+
return { type: enums_1.PropertyType.BOOL, data, isNull: false };
|
|
95
|
+
}
|
|
96
|
+
// Handle explicit type wrappers
|
|
97
|
+
if (value instanceof wrappers_1.Int32) {
|
|
98
|
+
const data = Buffer.alloc(4);
|
|
99
|
+
data.writeInt32LE(value.value, 0);
|
|
100
|
+
return { type: enums_1.PropertyType.INT32, data, isNull: false };
|
|
101
|
+
}
|
|
102
|
+
if (value instanceof wrappers_1.UInt32) {
|
|
103
|
+
const data = Buffer.alloc(4);
|
|
104
|
+
data.writeUInt32LE(value.value, 0);
|
|
105
|
+
return { type: enums_1.PropertyType.UINT32, data, isNull: false };
|
|
106
|
+
}
|
|
107
|
+
if (value instanceof wrappers_1.Float32) {
|
|
108
|
+
const data = Buffer.alloc(4);
|
|
109
|
+
data.writeFloatLE(value.value, 0);
|
|
110
|
+
return { type: enums_1.PropertyType.FLOAT, data, isNull: false };
|
|
111
|
+
}
|
|
112
|
+
if (value instanceof wrappers_1.UInt64) {
|
|
113
|
+
const data = Buffer.alloc(8);
|
|
114
|
+
data.writeBigUInt64LE(value.value, 0);
|
|
115
|
+
return { type: enums_1.PropertyType.UINT64, data, isNull: false };
|
|
116
|
+
}
|
|
117
|
+
if (typeof value === 'number') {
|
|
118
|
+
// Use isSafeInteger to avoid issues with large floats like Number.MAX_VALUE
|
|
119
|
+
// which appear as integers due to precision loss
|
|
120
|
+
if (Number.isSafeInteger(value)) {
|
|
121
|
+
const data = Buffer.alloc(8);
|
|
122
|
+
data.writeBigInt64LE(BigInt(value), 0);
|
|
123
|
+
return { type: enums_1.PropertyType.INT64, data, isNull: false };
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const data = Buffer.alloc(8);
|
|
127
|
+
data.writeDoubleLE(value, 0);
|
|
128
|
+
return { type: enums_1.PropertyType.DOUBLE, data, isNull: false };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (typeof value === 'bigint') {
|
|
132
|
+
const data = Buffer.alloc(8);
|
|
133
|
+
// Check if value fits in signed INT64 range
|
|
134
|
+
const INT64_MIN = BigInt('-9223372036854775808');
|
|
135
|
+
const INT64_MAX = BigInt('9223372036854775807');
|
|
136
|
+
if (value >= INT64_MIN && value <= INT64_MAX) {
|
|
137
|
+
data.writeBigInt64LE(value, 0);
|
|
138
|
+
return { type: enums_1.PropertyType.INT64, data, isNull: false };
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Value is outside INT64 range, use UINT64
|
|
142
|
+
data.writeBigUInt64LE(value, 0);
|
|
143
|
+
return { type: enums_1.PropertyType.UINT64, data, isNull: false };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (typeof value === 'string') {
|
|
147
|
+
return { type: enums_1.PropertyType.STRING, data: Buffer.from(value, 'utf-8'), isNull: false };
|
|
148
|
+
}
|
|
149
|
+
if (Buffer.isBuffer(value)) {
|
|
150
|
+
return { type: enums_1.PropertyType.BLOB, data: value, isNull: false };
|
|
151
|
+
}
|
|
152
|
+
if (value instanceof Date) {
|
|
153
|
+
const unixSeconds = BigInt(Math.floor(value.getTime() / 1000));
|
|
154
|
+
const nanos = (value.getTime() % 1000) * 1_000_000;
|
|
155
|
+
const data = Buffer.alloc(12);
|
|
156
|
+
data.writeBigInt64LE(unixSeconds, 0);
|
|
157
|
+
data.writeUInt32LE(nanos < 0 ? nanos + 1_000_000_000 : nanos, 8);
|
|
158
|
+
return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
|
|
159
|
+
}
|
|
160
|
+
if ((0, data_types_1.isGqldbTimestamp)(value)) {
|
|
161
|
+
const unixSeconds = BigInt(Math.floor(Date.UTC(value.year, value.month - 1, value.day, value.hour, value.minute, value.second) / 1000));
|
|
162
|
+
const data = Buffer.alloc(12);
|
|
163
|
+
data.writeBigInt64LE(unixSeconds, 0);
|
|
164
|
+
data.writeUInt32LE(value.nanosecond, 8);
|
|
165
|
+
return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
|
|
166
|
+
}
|
|
167
|
+
if (Array.isArray(value)) {
|
|
168
|
+
return encodeList(value);
|
|
169
|
+
}
|
|
170
|
+
// Check for new types before generic object handling
|
|
171
|
+
if ((0, data_types_1.isPoint)(value)) {
|
|
172
|
+
const data = Buffer.alloc(16);
|
|
173
|
+
data.writeDoubleLE(value.longitude, 0);
|
|
174
|
+
data.writeDoubleLE(value.latitude, 8);
|
|
175
|
+
return { type: enums_1.PropertyType.POINT, data, isNull: false };
|
|
176
|
+
}
|
|
177
|
+
if ((0, data_types_1.isPoint3D)(value)) {
|
|
178
|
+
const data = Buffer.alloc(24);
|
|
179
|
+
data.writeDoubleLE(value.x, 0);
|
|
180
|
+
data.writeDoubleLE(value.y, 8);
|
|
181
|
+
data.writeDoubleLE(value.z, 16);
|
|
182
|
+
return { type: enums_1.PropertyType.POINT3D, data, isNull: false };
|
|
183
|
+
}
|
|
184
|
+
if ((0, data_types_1.isGqldbDecimal)(value)) {
|
|
185
|
+
return { type: enums_1.PropertyType.DECIMAL, data: Buffer.from(value.value, 'utf-8'), isNull: false };
|
|
186
|
+
}
|
|
187
|
+
if ((0, data_types_1.isGqldbLocalDateTime)(value)) {
|
|
188
|
+
const data = Buffer.alloc(11);
|
|
189
|
+
data.writeUInt16LE(value.year, 0);
|
|
190
|
+
data.writeUInt8(value.month, 2);
|
|
191
|
+
data.writeUInt8(value.day, 3);
|
|
192
|
+
data.writeUInt8(value.hour, 4);
|
|
193
|
+
data.writeUInt8(value.minute, 5);
|
|
194
|
+
data.writeUInt8(value.second, 6);
|
|
195
|
+
data.writeUInt32LE(value.nanosecond, 7);
|
|
196
|
+
return { type: enums_1.PropertyType.LOCAL_DATETIME, data, isNull: false };
|
|
197
|
+
}
|
|
198
|
+
if ((0, data_types_1.isGqldbDate)(value)) {
|
|
199
|
+
const data = Buffer.alloc(8);
|
|
200
|
+
data.writeUInt16LE(value.year, 0);
|
|
201
|
+
data.writeUInt8(value.month, 2);
|
|
202
|
+
data.writeUInt8(value.day, 3);
|
|
203
|
+
// bytes 4-7 are padding (zeros)
|
|
204
|
+
return { type: enums_1.PropertyType.DATE, data, isNull: false };
|
|
205
|
+
}
|
|
206
|
+
if ((0, data_types_1.isGqldbZonedDateTime)(value)) {
|
|
207
|
+
const data = Buffer.alloc(13);
|
|
208
|
+
data.writeUInt16LE(value.year, 0);
|
|
209
|
+
data.writeUInt8(value.month, 2);
|
|
210
|
+
data.writeUInt8(value.day, 3);
|
|
211
|
+
data.writeUInt8(value.hour, 4);
|
|
212
|
+
data.writeUInt8(value.minute, 5);
|
|
213
|
+
data.writeUInt8(value.second, 6);
|
|
214
|
+
data.writeUInt32LE(value.nanosecond, 7);
|
|
215
|
+
data.writeInt16LE(value.offsetMinutes, 11);
|
|
216
|
+
return { type: enums_1.PropertyType.ZONED_DATETIME, data, isNull: false };
|
|
217
|
+
}
|
|
218
|
+
if ((0, data_types_1.isGqldbZonedTime)(value)) {
|
|
219
|
+
const data = Buffer.alloc(10);
|
|
220
|
+
data.writeUInt8(value.hour, 0);
|
|
221
|
+
data.writeUInt8(value.minute, 1);
|
|
222
|
+
data.writeUInt8(value.second, 2);
|
|
223
|
+
// byte 3 is padding
|
|
224
|
+
data.writeUInt32LE(value.nanosecond, 4);
|
|
225
|
+
data.writeInt16LE(value.offsetMinutes, 8);
|
|
226
|
+
return { type: enums_1.PropertyType.ZONED_TIME, data, isNull: false };
|
|
227
|
+
}
|
|
228
|
+
if ((0, data_types_1.isGqldbLocalTime)(value)) {
|
|
229
|
+
const data = Buffer.alloc(8);
|
|
230
|
+
data.writeUInt8(value.hour, 0);
|
|
231
|
+
data.writeUInt8(value.minute, 1);
|
|
232
|
+
data.writeUInt8(value.second, 2);
|
|
233
|
+
// byte 3 is padding
|
|
234
|
+
data.writeUInt32LE(value.nanosecond, 4);
|
|
235
|
+
return { type: enums_1.PropertyType.LOCAL_TIME, data, isNull: false };
|
|
236
|
+
}
|
|
237
|
+
if ((0, data_types_1.isYearToMonth)(value)) {
|
|
238
|
+
const data = Buffer.alloc(4);
|
|
239
|
+
data.writeInt32LE(value.months, 0);
|
|
240
|
+
return { type: enums_1.PropertyType.YEAR_TO_MONTH, data, isNull: false };
|
|
241
|
+
}
|
|
242
|
+
if ((0, data_types_1.isDayToSecond)(value)) {
|
|
243
|
+
const data = Buffer.alloc(12);
|
|
244
|
+
data.writeBigUInt64LE(BigInt(value.seconds), 0);
|
|
245
|
+
data.writeUInt32LE(value.nanoseconds, 8);
|
|
246
|
+
return { type: enums_1.PropertyType.DAY_TO_SECOND, data, isNull: false };
|
|
247
|
+
}
|
|
248
|
+
if ((0, data_types_1.isVector)(value)) {
|
|
249
|
+
const data = Buffer.alloc(4 + value.values.length * 4);
|
|
250
|
+
data.writeUInt32LE(value.values.length, 0);
|
|
251
|
+
for (let i = 0; i < value.values.length; i++) {
|
|
252
|
+
data.writeFloatLE(value.values[i], 4 + i * 4);
|
|
253
|
+
}
|
|
254
|
+
return { type: enums_1.PropertyType.VECTOR, data, isNull: false };
|
|
255
|
+
}
|
|
256
|
+
if ((0, data_types_1.isGqldbSet)(value)) {
|
|
257
|
+
return encodeSet(value);
|
|
258
|
+
}
|
|
259
|
+
if (typeof value === 'object') {
|
|
260
|
+
return encodeMap(value);
|
|
261
|
+
}
|
|
262
|
+
throw new Error(`Unsupported type: ${typeof value}`);
|
|
263
|
+
}
|
|
264
|
+
// =============================================================================
|
|
265
|
+
// Decoding: TypedValue → JS
|
|
266
|
+
// =============================================================================
|
|
267
|
+
/** Convert a TypedValue to a JavaScript value */
|
|
268
|
+
function typedValueToJS(tv) {
|
|
269
|
+
if (tv.isNull || tv.type === enums_1.PropertyType.NULL) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
switch (tv.type) {
|
|
273
|
+
case enums_1.PropertyType.BOOL:
|
|
274
|
+
return tv.data.length >= 1 && tv.data.readUInt8(0) !== 0;
|
|
275
|
+
case enums_1.PropertyType.INT32:
|
|
276
|
+
return tv.data.length >= 4 ? tv.data.readInt32LE(0) : 0;
|
|
277
|
+
case enums_1.PropertyType.UINT32:
|
|
278
|
+
return tv.data.length >= 4 ? tv.data.readUInt32LE(0) : 0;
|
|
279
|
+
case enums_1.PropertyType.INT64: {
|
|
280
|
+
if (tv.data.length < 8)
|
|
281
|
+
return 0;
|
|
282
|
+
const bigVal = tv.data.readBigInt64LE(0);
|
|
283
|
+
// Return regular number if value fits in safe integer range
|
|
284
|
+
if (bigVal >= BigInt(Number.MIN_SAFE_INTEGER) && bigVal <= BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
285
|
+
return Number(bigVal);
|
|
286
|
+
}
|
|
287
|
+
return bigVal;
|
|
288
|
+
}
|
|
289
|
+
case enums_1.PropertyType.UINT64: {
|
|
290
|
+
if (tv.data.length < 8)
|
|
291
|
+
return 0;
|
|
292
|
+
const bigVal = tv.data.readBigUInt64LE(0);
|
|
293
|
+
// Return regular number if value fits in safe integer range
|
|
294
|
+
if (bigVal <= BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
295
|
+
return Number(bigVal);
|
|
296
|
+
}
|
|
297
|
+
return bigVal;
|
|
298
|
+
}
|
|
299
|
+
case enums_1.PropertyType.FLOAT:
|
|
300
|
+
return tv.data.length >= 4 ? tv.data.readFloatLE(0) : 0;
|
|
301
|
+
case enums_1.PropertyType.DOUBLE:
|
|
302
|
+
return tv.data.length >= 8 ? tv.data.readDoubleLE(0) : 0;
|
|
303
|
+
case enums_1.PropertyType.STRING:
|
|
304
|
+
case enums_1.PropertyType.TEXT:
|
|
305
|
+
return tv.data.toString('utf-8');
|
|
306
|
+
case enums_1.PropertyType.BLOB:
|
|
307
|
+
return tv.data;
|
|
308
|
+
case enums_1.PropertyType.TIMESTAMP:
|
|
309
|
+
if (tv.data.length >= 12) {
|
|
310
|
+
const secs = Number(tv.data.readBigInt64LE(0));
|
|
311
|
+
const nanos = tv.data.readUInt32LE(8);
|
|
312
|
+
const d = new Date(secs * 1000 + Math.floor(nanos / 1_000_000));
|
|
313
|
+
return (0, data_types_1.createTimestamp)(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), nanos);
|
|
314
|
+
}
|
|
315
|
+
return (0, data_types_1.createTimestamp)(0, 0, 0, 0, 0, 0, 0);
|
|
316
|
+
case enums_1.PropertyType.DATE:
|
|
317
|
+
if (tv.data.length >= 4) {
|
|
318
|
+
return {
|
|
319
|
+
year: tv.data.readUInt16LE(0),
|
|
320
|
+
month: tv.data.readUInt8(2),
|
|
321
|
+
day: tv.data.readUInt8(3),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
return { year: 0, month: 0, day: 0 };
|
|
325
|
+
case enums_1.PropertyType.LOCAL_TIME:
|
|
326
|
+
if (tv.data.length >= 8) {
|
|
327
|
+
return {
|
|
328
|
+
hour: tv.data.readUInt8(0),
|
|
329
|
+
minute: tv.data.readUInt8(1),
|
|
330
|
+
second: tv.data.readUInt8(2),
|
|
331
|
+
nanosecond: tv.data.readUInt32LE(4),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
return { hour: 0, minute: 0, second: 0, nanosecond: 0 };
|
|
335
|
+
case enums_1.PropertyType.ZONED_TIME:
|
|
336
|
+
if (tv.data.length >= 10) {
|
|
337
|
+
return {
|
|
338
|
+
hour: tv.data.readUInt8(0),
|
|
339
|
+
minute: tv.data.readUInt8(1),
|
|
340
|
+
second: tv.data.readUInt8(2),
|
|
341
|
+
nanosecond: tv.data.readUInt32LE(4),
|
|
342
|
+
offsetMinutes: tv.data.readInt16LE(8),
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
return { hour: 0, minute: 0, second: 0, nanosecond: 0, offsetMinutes: 0 };
|
|
346
|
+
case enums_1.PropertyType.ZONED_DATETIME:
|
|
347
|
+
if (tv.data.length >= 13) {
|
|
348
|
+
return {
|
|
349
|
+
year: tv.data.readUInt16LE(0),
|
|
350
|
+
month: tv.data.readUInt8(2),
|
|
351
|
+
day: tv.data.readUInt8(3),
|
|
352
|
+
hour: tv.data.readUInt8(4),
|
|
353
|
+
minute: tv.data.readUInt8(5),
|
|
354
|
+
second: tv.data.readUInt8(6),
|
|
355
|
+
nanosecond: tv.data.readUInt32LE(7),
|
|
356
|
+
offsetMinutes: tv.data.readInt16LE(11),
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
return { year: 0, month: 0, day: 0, hour: 0, minute: 0, second: 0, nanosecond: 0, offsetMinutes: 0 };
|
|
360
|
+
case enums_1.PropertyType.LOCAL_DATETIME:
|
|
361
|
+
case enums_1.PropertyType.DATETIME:
|
|
362
|
+
if (tv.data.length >= 11) {
|
|
363
|
+
return (0, data_types_1.createLocalDateTime)(tv.data.readUInt16LE(0), // year
|
|
364
|
+
tv.data.readUInt8(2), // month
|
|
365
|
+
tv.data.readUInt8(3), // day
|
|
366
|
+
tv.data.readUInt8(4), // hour
|
|
367
|
+
tv.data.readUInt8(5), // minute
|
|
368
|
+
tv.data.readUInt8(6), // second
|
|
369
|
+
tv.data.readUInt32LE(7));
|
|
370
|
+
}
|
|
371
|
+
return (0, data_types_1.createLocalDateTime)(0, 0, 0, 0, 0, 0, 0);
|
|
372
|
+
case enums_1.PropertyType.YEAR_TO_MONTH:
|
|
373
|
+
if (tv.data.length >= 4) {
|
|
374
|
+
return { months: tv.data.readInt32LE(0) };
|
|
375
|
+
}
|
|
376
|
+
return { months: 0 };
|
|
377
|
+
case enums_1.PropertyType.DAY_TO_SECOND:
|
|
378
|
+
if (tv.data.length >= 12) {
|
|
379
|
+
return {
|
|
380
|
+
seconds: Number(tv.data.readBigUInt64LE(0)),
|
|
381
|
+
nanoseconds: tv.data.readUInt32LE(8),
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
return { seconds: 0, nanoseconds: 0 };
|
|
385
|
+
case enums_1.PropertyType.POINT:
|
|
386
|
+
if (tv.data.length >= 16) {
|
|
387
|
+
return {
|
|
388
|
+
longitude: tv.data.readDoubleLE(0),
|
|
389
|
+
latitude: tv.data.readDoubleLE(8),
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
return { latitude: 0, longitude: 0 };
|
|
393
|
+
case enums_1.PropertyType.POINT3D:
|
|
394
|
+
if (tv.data.length >= 24) {
|
|
395
|
+
return {
|
|
396
|
+
x: tv.data.readDoubleLE(0),
|
|
397
|
+
y: tv.data.readDoubleLE(8),
|
|
398
|
+
z: tv.data.readDoubleLE(16),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
return { x: 0, y: 0, z: 0 };
|
|
402
|
+
case enums_1.PropertyType.DECIMAL:
|
|
403
|
+
return { value: tv.data.toString('utf-8') };
|
|
404
|
+
case enums_1.PropertyType.VECTOR:
|
|
405
|
+
if (tv.data.length >= 4) {
|
|
406
|
+
const dim = tv.data.readUInt32LE(0);
|
|
407
|
+
if (tv.data.length >= 4 + dim * 4) {
|
|
408
|
+
const values = [];
|
|
409
|
+
for (let i = 0; i < dim; i++) {
|
|
410
|
+
values.push(tv.data.readFloatLE(4 + i * 4));
|
|
411
|
+
}
|
|
412
|
+
return { values };
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return { values: [] };
|
|
416
|
+
case enums_1.PropertyType.LIST:
|
|
417
|
+
return decodeList(tv.data);
|
|
418
|
+
case enums_1.PropertyType.SET:
|
|
419
|
+
return new Set(decodeList(tv.data));
|
|
420
|
+
case enums_1.PropertyType.MAP:
|
|
421
|
+
case enums_1.PropertyType.RECORD:
|
|
422
|
+
return decodeMap(tv.data);
|
|
423
|
+
case enums_1.PropertyType.TABLE:
|
|
424
|
+
return decodeTable(tv.data);
|
|
425
|
+
case enums_1.PropertyType.NODE:
|
|
426
|
+
return decodeNode(tv.data);
|
|
427
|
+
case enums_1.PropertyType.EDGE:
|
|
428
|
+
return decodeEdge(tv.data);
|
|
429
|
+
case enums_1.PropertyType.PATH:
|
|
430
|
+
return decodePath(tv.data);
|
|
431
|
+
case enums_1.PropertyType.ERROR:
|
|
432
|
+
return decodeError(tv.data);
|
|
433
|
+
default:
|
|
434
|
+
return tv.data;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// =============================================================================
|
|
438
|
+
// Decode: Complex Types
|
|
439
|
+
// =============================================================================
|
|
440
|
+
/**
|
|
441
|
+
* Decode a node from binary format.
|
|
442
|
+
* Format: [idLen:2][id][labelCount:2][labelLen:2][label]...[properties_binary]
|
|
443
|
+
*/
|
|
444
|
+
function decodeNode(data) {
|
|
445
|
+
let offset = 0;
|
|
446
|
+
// Decode ID
|
|
447
|
+
const [id, idLen] = decodeString(data, offset);
|
|
448
|
+
if (idLen === 0)
|
|
449
|
+
return { id: '', labels: [], properties: {} };
|
|
450
|
+
offset += idLen;
|
|
451
|
+
// Decode labels
|
|
452
|
+
if (offset + 2 > data.length)
|
|
453
|
+
return { id, labels: [], properties: {} };
|
|
454
|
+
const labelCount = data.readUInt16LE(offset);
|
|
455
|
+
offset += 2;
|
|
456
|
+
const labels = [];
|
|
457
|
+
for (let i = 0; i < labelCount; i++) {
|
|
458
|
+
const [label, labelLen] = decodeString(data, offset);
|
|
459
|
+
if (labelLen === 0)
|
|
460
|
+
break;
|
|
461
|
+
labels.push(label);
|
|
462
|
+
offset += labelLen;
|
|
463
|
+
}
|
|
464
|
+
// Decode properties
|
|
465
|
+
const [properties] = decodePropertiesBinary(data, offset);
|
|
466
|
+
return { id, labels, properties };
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Decode an edge from binary format.
|
|
470
|
+
* Format: [idLen:2][id][labelLen:2][label][fromLen:2][from][toLen:2][to][properties_binary]
|
|
471
|
+
*/
|
|
472
|
+
function decodeEdge(data) {
|
|
473
|
+
let offset = 0;
|
|
474
|
+
const [id, idLen] = decodeString(data, offset);
|
|
475
|
+
if (idLen === 0)
|
|
476
|
+
return { id: '', label: '', fromNodeId: '', toNodeId: '', properties: {} };
|
|
477
|
+
offset += idLen;
|
|
478
|
+
const [label, labelLen] = decodeString(data, offset);
|
|
479
|
+
if (labelLen === 0)
|
|
480
|
+
return { id, label: '', fromNodeId: '', toNodeId: '', properties: {} };
|
|
481
|
+
offset += labelLen;
|
|
482
|
+
const [fromNodeId, fromLen] = decodeString(data, offset);
|
|
483
|
+
if (fromLen === 0)
|
|
484
|
+
return { id, label, fromNodeId: '', toNodeId: '', properties: {} };
|
|
485
|
+
offset += fromLen;
|
|
486
|
+
const [toNodeId, toLen] = decodeString(data, offset);
|
|
487
|
+
if (toLen === 0)
|
|
488
|
+
return { id, label, fromNodeId, toNodeId: '', properties: {} };
|
|
489
|
+
offset += toLen;
|
|
490
|
+
const [properties] = decodePropertiesBinary(data, offset);
|
|
491
|
+
return { id, label, fromNodeId, toNodeId, properties };
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Decode a path from binary format.
|
|
495
|
+
* Format: [nodeCount:2][nodeLen:4][nodeData]...[edgeCount:2][edgeLen:4][edgeData]...
|
|
496
|
+
*/
|
|
497
|
+
function decodePath(data) {
|
|
498
|
+
let offset = 0;
|
|
499
|
+
// Decode nodes
|
|
500
|
+
if (offset + 2 > data.length)
|
|
501
|
+
return { nodes: [], edges: [] };
|
|
502
|
+
const nodeCount = data.readUInt16LE(offset);
|
|
503
|
+
offset += 2;
|
|
504
|
+
const nodes = [];
|
|
505
|
+
for (let i = 0; i < nodeCount; i++) {
|
|
506
|
+
if (offset + 4 > data.length)
|
|
507
|
+
break;
|
|
508
|
+
const nodeLen = data.readUInt32LE(offset);
|
|
509
|
+
offset += 4;
|
|
510
|
+
if (offset + nodeLen > data.length)
|
|
511
|
+
break;
|
|
512
|
+
const nodeData = data.slice(offset, offset + nodeLen);
|
|
513
|
+
nodes.push(decodeNode(nodeData));
|
|
514
|
+
offset += nodeLen;
|
|
515
|
+
}
|
|
516
|
+
// Decode edges
|
|
517
|
+
if (offset + 2 > data.length)
|
|
518
|
+
return { nodes, edges: [] };
|
|
519
|
+
const edgeCount = data.readUInt16LE(offset);
|
|
520
|
+
offset += 2;
|
|
521
|
+
const edges = [];
|
|
522
|
+
for (let i = 0; i < edgeCount; i++) {
|
|
523
|
+
if (offset + 4 > data.length)
|
|
524
|
+
break;
|
|
525
|
+
const edgeLen = data.readUInt32LE(offset);
|
|
526
|
+
offset += 4;
|
|
527
|
+
if (offset + edgeLen > data.length)
|
|
528
|
+
break;
|
|
529
|
+
const edgeData = data.slice(offset, offset + edgeLen);
|
|
530
|
+
edges.push(decodeEdge(edgeData));
|
|
531
|
+
offset += edgeLen;
|
|
532
|
+
}
|
|
533
|
+
return { nodes, edges };
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Decode a list from binary format.
|
|
537
|
+
* Format: [count:2 uint16LE][TypedValueEntry]...
|
|
538
|
+
*/
|
|
539
|
+
function decodeList(data) {
|
|
540
|
+
if (data.length < 2)
|
|
541
|
+
return [];
|
|
542
|
+
const count = data.readUInt16LE(0);
|
|
543
|
+
let offset = 2;
|
|
544
|
+
const result = [];
|
|
545
|
+
for (let i = 0; i < count; i++) {
|
|
546
|
+
const [tv, tvLen] = decodeTypedValueEntry(data, offset);
|
|
547
|
+
if (tvLen === 0)
|
|
548
|
+
break;
|
|
549
|
+
result.push(typedValueToJS(tv));
|
|
550
|
+
offset += tvLen;
|
|
551
|
+
}
|
|
552
|
+
return result;
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Decode a map from binary format.
|
|
556
|
+
* Format: [count:2][keyLen:2][key][TVE]...
|
|
557
|
+
*/
|
|
558
|
+
function decodeMap(data) {
|
|
559
|
+
const [result] = decodePropertiesBinary(data, 0);
|
|
560
|
+
return result;
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Decode a table from binary format.
|
|
564
|
+
* Format: [colCount:2][colLen:2][col]...[rowCount:2][cellCount:2][TVE]...
|
|
565
|
+
*/
|
|
566
|
+
function decodeTable(data) {
|
|
567
|
+
let offset = 0;
|
|
568
|
+
// Decode columns
|
|
569
|
+
if (offset + 2 > data.length)
|
|
570
|
+
return { columns: [], rows: [] };
|
|
571
|
+
const colCount = data.readUInt16LE(offset);
|
|
572
|
+
offset += 2;
|
|
573
|
+
const columns = [];
|
|
574
|
+
for (let i = 0; i < colCount; i++) {
|
|
575
|
+
const [col, colLen] = decodeString(data, offset);
|
|
576
|
+
if (colLen === 0)
|
|
577
|
+
break;
|
|
578
|
+
columns.push(col);
|
|
579
|
+
offset += colLen;
|
|
580
|
+
}
|
|
581
|
+
// Decode rows
|
|
582
|
+
if (offset + 2 > data.length)
|
|
583
|
+
return { columns, rows: [] };
|
|
584
|
+
const rowCount = data.readUInt16LE(offset);
|
|
585
|
+
offset += 2;
|
|
586
|
+
const rows = [];
|
|
587
|
+
for (let i = 0; i < rowCount; i++) {
|
|
588
|
+
if (offset + 2 > data.length)
|
|
589
|
+
break;
|
|
590
|
+
const cellCount = data.readUInt16LE(offset);
|
|
591
|
+
offset += 2;
|
|
592
|
+
const row = [];
|
|
593
|
+
for (let j = 0; j < cellCount; j++) {
|
|
594
|
+
const [tv, tvLen] = decodeTypedValueEntry(data, offset);
|
|
595
|
+
if (tvLen === 0)
|
|
596
|
+
break;
|
|
597
|
+
row.push(typedValueToJS(tv));
|
|
598
|
+
offset += tvLen;
|
|
599
|
+
}
|
|
600
|
+
rows.push(row);
|
|
601
|
+
}
|
|
602
|
+
return { columns, rows };
|
|
603
|
+
}
|
|
604
|
+
function decodeError(data) {
|
|
605
|
+
try {
|
|
606
|
+
const json = data.toString('utf-8');
|
|
607
|
+
const errData = JSON.parse(json);
|
|
608
|
+
return {
|
|
609
|
+
code: typeof errData.code === 'number' ? errData.code : 0,
|
|
610
|
+
message: typeof errData.message === 'string' ? errData.message : json,
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
catch {
|
|
614
|
+
// If not valid JSON, treat as plain message
|
|
615
|
+
return { code: 0, message: data.toString('utf-8') };
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
// =============================================================================
|
|
619
|
+
// Encode: Complex Types
|
|
620
|
+
// =============================================================================
|
|
621
|
+
/**
|
|
622
|
+
* Encode a list in binary format.
|
|
623
|
+
* Format: [count:2 uint16LE][TypedValueEntry]...
|
|
624
|
+
*/
|
|
625
|
+
function encodeList(values) {
|
|
626
|
+
const parts = [];
|
|
627
|
+
// Write count
|
|
628
|
+
const countBuf = Buffer.alloc(2);
|
|
629
|
+
countBuf.writeUInt16LE(values.length, 0);
|
|
630
|
+
parts.push(countBuf);
|
|
631
|
+
for (const v of values) {
|
|
632
|
+
const tv = createTypedValue(v);
|
|
633
|
+
parts.push(encodeTypedValueEntry(tv));
|
|
634
|
+
}
|
|
635
|
+
return { type: enums_1.PropertyType.LIST, data: Buffer.concat(parts), isNull: false };
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Encode a map in binary format.
|
|
639
|
+
* Format: [count:2][keyLen:2][key][TVE]...
|
|
640
|
+
*/
|
|
641
|
+
function encodeMap(m) {
|
|
642
|
+
const parts = [];
|
|
643
|
+
const entries = Object.entries(m);
|
|
644
|
+
// Write count
|
|
645
|
+
const countBuf = Buffer.alloc(2);
|
|
646
|
+
countBuf.writeUInt16LE(entries.length, 0);
|
|
647
|
+
parts.push(countBuf);
|
|
648
|
+
for (const [k, v] of entries) {
|
|
649
|
+
// Write key (length-prefixed)
|
|
650
|
+
parts.push(encodeString(k));
|
|
651
|
+
// Write value as TVE
|
|
652
|
+
const tv = createTypedValue(v);
|
|
653
|
+
parts.push(encodeTypedValueEntry(tv));
|
|
654
|
+
}
|
|
655
|
+
return { type: enums_1.PropertyType.MAP, data: Buffer.concat(parts), isNull: false };
|
|
656
|
+
}
|
|
657
|
+
/**
|
|
658
|
+
* Encode a set in binary format (same as list).
|
|
659
|
+
*/
|
|
660
|
+
function encodeSet(set) {
|
|
661
|
+
const values = Array.from(set);
|
|
662
|
+
const parts = [];
|
|
663
|
+
// Write count
|
|
664
|
+
const countBuf = Buffer.alloc(2);
|
|
665
|
+
countBuf.writeUInt16LE(values.length, 0);
|
|
666
|
+
parts.push(countBuf);
|
|
667
|
+
for (const v of values) {
|
|
668
|
+
const tv = createTypedValue(v);
|
|
669
|
+
parts.push(encodeTypedValueEntry(tv));
|
|
670
|
+
}
|
|
671
|
+
return { type: enums_1.PropertyType.SET, data: Buffer.concat(parts), isNull: false };
|
|
672
|
+
}
|
|
673
|
+
// =============================================================================
|
|
674
|
+
// Format & Parse: TypedValue ↔ String
|
|
675
|
+
// =============================================================================
|
|
676
|
+
/** Pad a number to a fixed width with leading zeros */
|
|
677
|
+
function pad(n, width) {
|
|
678
|
+
return n.toString().padStart(width, '0');
|
|
679
|
+
}
|
|
680
|
+
/** Format nanoseconds, trimming trailing zeros. Returns empty string if zero. */
|
|
681
|
+
function formatNanos(nanos) {
|
|
682
|
+
if (nanos === 0)
|
|
683
|
+
return '';
|
|
684
|
+
const s = nanos.toString().padStart(9, '0');
|
|
685
|
+
return '.' + s.replace(/0+$/, '');
|
|
686
|
+
}
|
|
687
|
+
/** Format an offset in minutes as "+HH:MM" or "-HH:MM" */
|
|
688
|
+
function formatOffset(offsetMinutes) {
|
|
689
|
+
const sign = offsetMinutes < 0 ? '-' : '+';
|
|
690
|
+
const abs = Math.abs(offsetMinutes);
|
|
691
|
+
const h = Math.floor(abs / 60);
|
|
692
|
+
const m = abs % 60;
|
|
693
|
+
return `${sign}${pad(h, 2)}:${pad(m, 2)}`;
|
|
694
|
+
}
|
|
695
|
+
/** Serialize a TypedValue to its canonical string representation */
|
|
696
|
+
function formatValue(tv) {
|
|
697
|
+
if (tv.isNull || tv.type === enums_1.PropertyType.NULL) {
|
|
698
|
+
return '';
|
|
699
|
+
}
|
|
700
|
+
switch (tv.type) {
|
|
701
|
+
case enums_1.PropertyType.BOOL:
|
|
702
|
+
return tv.data.length >= 1 && tv.data.readUInt8(0) !== 0 ? 'true' : 'false';
|
|
703
|
+
case enums_1.PropertyType.INT32:
|
|
704
|
+
return tv.data.length >= 4 ? tv.data.readInt32LE(0).toString() : '0';
|
|
705
|
+
case enums_1.PropertyType.UINT32:
|
|
706
|
+
return tv.data.length >= 4 ? tv.data.readUInt32LE(0).toString() : '0';
|
|
707
|
+
case enums_1.PropertyType.INT64: {
|
|
708
|
+
if (tv.data.length < 8)
|
|
709
|
+
return '0';
|
|
710
|
+
return tv.data.readBigInt64LE(0).toString();
|
|
711
|
+
}
|
|
712
|
+
case enums_1.PropertyType.UINT64: {
|
|
713
|
+
if (tv.data.length < 8)
|
|
714
|
+
return '0';
|
|
715
|
+
return tv.data.readBigUInt64LE(0).toString();
|
|
716
|
+
}
|
|
717
|
+
case enums_1.PropertyType.FLOAT:
|
|
718
|
+
return tv.data.length >= 4 ? tv.data.readFloatLE(0).toString() : '0';
|
|
719
|
+
case enums_1.PropertyType.DOUBLE:
|
|
720
|
+
return tv.data.length >= 8 ? tv.data.readDoubleLE(0).toString() : '0';
|
|
721
|
+
case enums_1.PropertyType.STRING:
|
|
722
|
+
case enums_1.PropertyType.TEXT:
|
|
723
|
+
return tv.data.toString('utf-8');
|
|
724
|
+
case enums_1.PropertyType.DECIMAL:
|
|
725
|
+
return tv.data.toString('utf-8');
|
|
726
|
+
case enums_1.PropertyType.DATE: {
|
|
727
|
+
if (tv.data.length < 4)
|
|
728
|
+
return '0000-00-00';
|
|
729
|
+
const y = tv.data.readUInt16LE(0);
|
|
730
|
+
const m = tv.data.readUInt8(2);
|
|
731
|
+
const d = tv.data.readUInt8(3);
|
|
732
|
+
return `${pad(y, 4)}-${pad(m, 2)}-${pad(d, 2)}`;
|
|
733
|
+
}
|
|
734
|
+
case enums_1.PropertyType.LOCAL_TIME: {
|
|
735
|
+
if (tv.data.length < 8)
|
|
736
|
+
return '00:00:00';
|
|
737
|
+
const h = tv.data.readUInt8(0);
|
|
738
|
+
const m = tv.data.readUInt8(1);
|
|
739
|
+
const s = tv.data.readUInt8(2);
|
|
740
|
+
const ns = tv.data.readUInt32LE(4);
|
|
741
|
+
return `${pad(h, 2)}:${pad(m, 2)}:${pad(s, 2)}${formatNanos(ns)}`;
|
|
742
|
+
}
|
|
743
|
+
case enums_1.PropertyType.ZONED_TIME: {
|
|
744
|
+
if (tv.data.length < 10)
|
|
745
|
+
return '00:00:00+00:00';
|
|
746
|
+
const h = tv.data.readUInt8(0);
|
|
747
|
+
const m = tv.data.readUInt8(1);
|
|
748
|
+
const s = tv.data.readUInt8(2);
|
|
749
|
+
const ns = tv.data.readUInt32LE(4);
|
|
750
|
+
const off = tv.data.readInt16LE(8);
|
|
751
|
+
return `${pad(h, 2)}:${pad(m, 2)}:${pad(s, 2)}${formatNanos(ns)}${formatOffset(off)}`;
|
|
752
|
+
}
|
|
753
|
+
case enums_1.PropertyType.LOCAL_DATETIME:
|
|
754
|
+
case enums_1.PropertyType.DATETIME: {
|
|
755
|
+
if (tv.data.length < 11)
|
|
756
|
+
return '0000-00-00 00:00:00';
|
|
757
|
+
const y = tv.data.readUInt16LE(0);
|
|
758
|
+
const mo = tv.data.readUInt8(2);
|
|
759
|
+
const d = tv.data.readUInt8(3);
|
|
760
|
+
const h = tv.data.readUInt8(4);
|
|
761
|
+
const mi = tv.data.readUInt8(5);
|
|
762
|
+
const s = tv.data.readUInt8(6);
|
|
763
|
+
const ns = tv.data.readUInt32LE(7);
|
|
764
|
+
return `${pad(y, 4)}-${pad(mo, 2)}-${pad(d, 2)} ${pad(h, 2)}:${pad(mi, 2)}:${pad(s, 2)}${formatNanos(ns)}`;
|
|
765
|
+
}
|
|
766
|
+
case enums_1.PropertyType.ZONED_DATETIME: {
|
|
767
|
+
if (tv.data.length < 13)
|
|
768
|
+
return '0000-00-00 00:00:00+00:00';
|
|
769
|
+
const y = tv.data.readUInt16LE(0);
|
|
770
|
+
const mo = tv.data.readUInt8(2);
|
|
771
|
+
const d = tv.data.readUInt8(3);
|
|
772
|
+
const h = tv.data.readUInt8(4);
|
|
773
|
+
const mi = tv.data.readUInt8(5);
|
|
774
|
+
const s = tv.data.readUInt8(6);
|
|
775
|
+
const ns = tv.data.readUInt32LE(7);
|
|
776
|
+
const off = tv.data.readInt16LE(11);
|
|
777
|
+
return `${pad(y, 4)}-${pad(mo, 2)}-${pad(d, 2)} ${pad(h, 2)}:${pad(mi, 2)}:${pad(s, 2)}${formatNanos(ns)}${formatOffset(off)}`;
|
|
778
|
+
}
|
|
779
|
+
case enums_1.PropertyType.TIMESTAMP: {
|
|
780
|
+
if (tv.data.length < 12)
|
|
781
|
+
return '0000-00-00 00:00:00';
|
|
782
|
+
const secs = Number(tv.data.readBigInt64LE(0));
|
|
783
|
+
const ns = tv.data.readUInt32LE(8);
|
|
784
|
+
const dt = new Date(secs * 1000 + Math.floor(ns / 1_000_000));
|
|
785
|
+
const y = dt.getUTCFullYear();
|
|
786
|
+
const mo = dt.getUTCMonth() + 1;
|
|
787
|
+
const d = dt.getUTCDate();
|
|
788
|
+
const h = dt.getUTCHours();
|
|
789
|
+
const mi = dt.getUTCMinutes();
|
|
790
|
+
const s = dt.getUTCSeconds();
|
|
791
|
+
return `${pad(y, 4)}-${pad(mo, 2)}-${pad(d, 2)} ${pad(h, 2)}:${pad(mi, 2)}:${pad(s, 2)}${formatNanos(ns)}`;
|
|
792
|
+
}
|
|
793
|
+
case enums_1.PropertyType.YEAR_TO_MONTH: {
|
|
794
|
+
if (tv.data.length < 4)
|
|
795
|
+
return 'P0M';
|
|
796
|
+
const totalMonths = tv.data.readInt32LE(0);
|
|
797
|
+
if (totalMonths === 0)
|
|
798
|
+
return 'P0M';
|
|
799
|
+
const negative = totalMonths < 0;
|
|
800
|
+
const abs = Math.abs(totalMonths);
|
|
801
|
+
const years = Math.floor(abs / 12);
|
|
802
|
+
const months = abs % 12;
|
|
803
|
+
let result = negative ? '-P' : 'P';
|
|
804
|
+
if (years > 0)
|
|
805
|
+
result += `${years}Y`;
|
|
806
|
+
if (months > 0)
|
|
807
|
+
result += `${months}M`;
|
|
808
|
+
// If only years and no months, that's fine (e.g. "P2Y")
|
|
809
|
+
return result;
|
|
810
|
+
}
|
|
811
|
+
case enums_1.PropertyType.DAY_TO_SECOND: {
|
|
812
|
+
if (tv.data.length < 12)
|
|
813
|
+
return 'PT0S';
|
|
814
|
+
const totalSec = Number(tv.data.readBigUInt64LE(0));
|
|
815
|
+
const nanos = tv.data.readUInt32LE(8);
|
|
816
|
+
if (totalSec === 0 && nanos === 0)
|
|
817
|
+
return 'PT0S';
|
|
818
|
+
const days = Math.floor(totalSec / 86400);
|
|
819
|
+
const rem = totalSec % 86400;
|
|
820
|
+
const hours = Math.floor(rem / 3600);
|
|
821
|
+
const rem2 = rem % 3600;
|
|
822
|
+
const mins = Math.floor(rem2 / 60);
|
|
823
|
+
const secs = rem2 % 60;
|
|
824
|
+
let result = 'P';
|
|
825
|
+
if (days > 0)
|
|
826
|
+
result += `${days}D`;
|
|
827
|
+
if (hours > 0 || mins > 0 || secs > 0 || nanos > 0) {
|
|
828
|
+
result += 'T';
|
|
829
|
+
if (hours > 0)
|
|
830
|
+
result += `${hours}H`;
|
|
831
|
+
if (mins > 0)
|
|
832
|
+
result += `${mins}M`;
|
|
833
|
+
if (secs > 0 || nanos > 0) {
|
|
834
|
+
if (nanos > 0) {
|
|
835
|
+
const fracStr = nanos.toString().padStart(9, '0').replace(/0+$/, '');
|
|
836
|
+
result += `${secs}.${fracStr}S`;
|
|
837
|
+
}
|
|
838
|
+
else {
|
|
839
|
+
result += `${secs}S`;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
return result;
|
|
844
|
+
}
|
|
845
|
+
default:
|
|
846
|
+
return tv.data.toString('utf-8');
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
/** Parse an offset string like "+05:30" or "-08:00" into minutes */
|
|
850
|
+
function parseOffset(s) {
|
|
851
|
+
const sign = s[0] === '-' ? -1 : 1;
|
|
852
|
+
const parts = s.substring(1).split(':');
|
|
853
|
+
return sign * (parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10));
|
|
854
|
+
}
|
|
855
|
+
/** Parse a string into a TypedValue for the given target type */
|
|
856
|
+
function fromString(s, targetType) {
|
|
857
|
+
if (s === '') {
|
|
858
|
+
return { type: targetType, data: Buffer.alloc(0), isNull: true };
|
|
859
|
+
}
|
|
860
|
+
switch (targetType) {
|
|
861
|
+
case enums_1.PropertyType.BOOL: {
|
|
862
|
+
const val = s.toLowerCase() === 'true';
|
|
863
|
+
const data = Buffer.alloc(1);
|
|
864
|
+
data.writeUInt8(val ? 1 : 0, 0);
|
|
865
|
+
return { type: enums_1.PropertyType.BOOL, data, isNull: false };
|
|
866
|
+
}
|
|
867
|
+
case enums_1.PropertyType.INT32: {
|
|
868
|
+
const data = Buffer.alloc(4);
|
|
869
|
+
data.writeInt32LE(parseInt(s, 10), 0);
|
|
870
|
+
return { type: enums_1.PropertyType.INT32, data, isNull: false };
|
|
871
|
+
}
|
|
872
|
+
case enums_1.PropertyType.UINT32: {
|
|
873
|
+
const data = Buffer.alloc(4);
|
|
874
|
+
data.writeUInt32LE(parseInt(s, 10) >>> 0, 0);
|
|
875
|
+
return { type: enums_1.PropertyType.UINT32, data, isNull: false };
|
|
876
|
+
}
|
|
877
|
+
case enums_1.PropertyType.INT64: {
|
|
878
|
+
const data = Buffer.alloc(8);
|
|
879
|
+
data.writeBigInt64LE(BigInt(s), 0);
|
|
880
|
+
return { type: enums_1.PropertyType.INT64, data, isNull: false };
|
|
881
|
+
}
|
|
882
|
+
case enums_1.PropertyType.UINT64: {
|
|
883
|
+
const data = Buffer.alloc(8);
|
|
884
|
+
data.writeBigUInt64LE(BigInt(s), 0);
|
|
885
|
+
return { type: enums_1.PropertyType.UINT64, data, isNull: false };
|
|
886
|
+
}
|
|
887
|
+
case enums_1.PropertyType.FLOAT: {
|
|
888
|
+
const data = Buffer.alloc(4);
|
|
889
|
+
data.writeFloatLE(parseFloat(s), 0);
|
|
890
|
+
return { type: enums_1.PropertyType.FLOAT, data, isNull: false };
|
|
891
|
+
}
|
|
892
|
+
case enums_1.PropertyType.DOUBLE: {
|
|
893
|
+
const data = Buffer.alloc(8);
|
|
894
|
+
data.writeDoubleLE(parseFloat(s), 0);
|
|
895
|
+
return { type: enums_1.PropertyType.DOUBLE, data, isNull: false };
|
|
896
|
+
}
|
|
897
|
+
case enums_1.PropertyType.STRING:
|
|
898
|
+
case enums_1.PropertyType.TEXT:
|
|
899
|
+
return { type: targetType, data: Buffer.from(s, 'utf-8'), isNull: false };
|
|
900
|
+
case enums_1.PropertyType.DECIMAL:
|
|
901
|
+
return { type: enums_1.PropertyType.DECIMAL, data: Buffer.from(s, 'utf-8'), isNull: false };
|
|
902
|
+
case enums_1.PropertyType.DATE: {
|
|
903
|
+
// "yyyy-MM-dd"
|
|
904
|
+
const parts = s.split('-');
|
|
905
|
+
const data = Buffer.alloc(8);
|
|
906
|
+
data.writeUInt16LE(parseInt(parts[0], 10), 0);
|
|
907
|
+
data.writeUInt8(parseInt(parts[1], 10), 2);
|
|
908
|
+
data.writeUInt8(parseInt(parts[2], 10), 3);
|
|
909
|
+
return { type: enums_1.PropertyType.DATE, data, isNull: false };
|
|
910
|
+
}
|
|
911
|
+
case enums_1.PropertyType.LOCAL_TIME: {
|
|
912
|
+
// "HH:mm:ss[.nnnnnnnnn]" — strip any trailing offset or Z, keep local time only
|
|
913
|
+
const cleaned = removeOffset(s);
|
|
914
|
+
const { hour, minute, second, nanosecond } = parseTimeString(cleaned);
|
|
915
|
+
const data = Buffer.alloc(8);
|
|
916
|
+
data.writeUInt8(hour, 0);
|
|
917
|
+
data.writeUInt8(minute, 1);
|
|
918
|
+
data.writeUInt8(second, 2);
|
|
919
|
+
data.writeUInt32LE(nanosecond, 4);
|
|
920
|
+
return { type: enums_1.PropertyType.LOCAL_TIME, data, isNull: false };
|
|
921
|
+
}
|
|
922
|
+
case enums_1.PropertyType.ZONED_TIME: {
|
|
923
|
+
// "HH:mm:ss[.n]+HH:MM"
|
|
924
|
+
const { timePart, offsetPart } = splitTimeAndOffset(s);
|
|
925
|
+
const { hour, minute, second, nanosecond } = parseTimeString(timePart);
|
|
926
|
+
const offMin = parseOffset(offsetPart);
|
|
927
|
+
const data = Buffer.alloc(10);
|
|
928
|
+
data.writeUInt8(hour, 0);
|
|
929
|
+
data.writeUInt8(minute, 1);
|
|
930
|
+
data.writeUInt8(second, 2);
|
|
931
|
+
data.writeUInt32LE(nanosecond, 4);
|
|
932
|
+
data.writeInt16LE(offMin, 8);
|
|
933
|
+
return { type: enums_1.PropertyType.ZONED_TIME, data, isNull: false };
|
|
934
|
+
}
|
|
935
|
+
case enums_1.PropertyType.LOCAL_DATETIME:
|
|
936
|
+
case enums_1.PropertyType.DATETIME: {
|
|
937
|
+
// "yyyy-MM-dd HH:mm:ss[.n]" — strip any trailing offset or Z, keep local time only
|
|
938
|
+
// Normalize T separator to space
|
|
939
|
+
const cleaned = removeOffset(s.replace('T', ' '));
|
|
940
|
+
const spaceIdx = cleaned.indexOf(' ');
|
|
941
|
+
const datePart = cleaned.substring(0, spaceIdx);
|
|
942
|
+
const timePart = cleaned.substring(spaceIdx + 1);
|
|
943
|
+
const dp = datePart.split('-');
|
|
944
|
+
const { hour, minute, second, nanosecond } = parseTimeString(timePart);
|
|
945
|
+
const data = Buffer.alloc(11);
|
|
946
|
+
data.writeUInt16LE(parseInt(dp[0], 10), 0);
|
|
947
|
+
data.writeUInt8(parseInt(dp[1], 10), 2);
|
|
948
|
+
data.writeUInt8(parseInt(dp[2], 10), 3);
|
|
949
|
+
data.writeUInt8(hour, 4);
|
|
950
|
+
data.writeUInt8(minute, 5);
|
|
951
|
+
data.writeUInt8(second, 6);
|
|
952
|
+
data.writeUInt32LE(nanosecond, 7);
|
|
953
|
+
return { type: targetType, data, isNull: false };
|
|
954
|
+
}
|
|
955
|
+
case enums_1.PropertyType.ZONED_DATETIME: {
|
|
956
|
+
// "yyyy-MM-dd HH:mm:ss[.n]+HH:MM" — also supports T separator, Z suffix, space-separated offset
|
|
957
|
+
const norm = normalizeOffset(s.replace('T', ' '));
|
|
958
|
+
const spaceIdx = norm.indexOf(' ');
|
|
959
|
+
const datePart = norm.substring(0, spaceIdx);
|
|
960
|
+
const rest = norm.substring(spaceIdx + 1);
|
|
961
|
+
const { timePart, offsetPart } = splitTimeAndOffset(rest);
|
|
962
|
+
const dp = datePart.split('-');
|
|
963
|
+
const { hour, minute, second, nanosecond } = parseTimeString(timePart);
|
|
964
|
+
const offMin = parseOffset(offsetPart);
|
|
965
|
+
const data = Buffer.alloc(13);
|
|
966
|
+
data.writeUInt16LE(parseInt(dp[0], 10), 0);
|
|
967
|
+
data.writeUInt8(parseInt(dp[1], 10), 2);
|
|
968
|
+
data.writeUInt8(parseInt(dp[2], 10), 3);
|
|
969
|
+
data.writeUInt8(hour, 4);
|
|
970
|
+
data.writeUInt8(minute, 5);
|
|
971
|
+
data.writeUInt8(second, 6);
|
|
972
|
+
data.writeUInt32LE(nanosecond, 7);
|
|
973
|
+
data.writeInt16LE(offMin, 11);
|
|
974
|
+
return { type: enums_1.PropertyType.ZONED_DATETIME, data, isNull: false };
|
|
975
|
+
}
|
|
976
|
+
case enums_1.PropertyType.TIMESTAMP: {
|
|
977
|
+
// Support epoch seconds like "1715169600" or "yyyy-MM-dd HH:mm:ss[.n]"
|
|
978
|
+
if (/^\d+$/.test(s)) {
|
|
979
|
+
// Epoch seconds
|
|
980
|
+
const epoch = parseInt(s, 10);
|
|
981
|
+
const data = Buffer.alloc(12);
|
|
982
|
+
data.writeBigInt64LE(BigInt(epoch), 0);
|
|
983
|
+
data.writeUInt32LE(0, 8);
|
|
984
|
+
return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
|
|
985
|
+
}
|
|
986
|
+
// "yyyy-MM-dd HH:mm:ss[.n]" or "yyyy-MM-ddTHH:mm:ss[.n][+-]HH:MM" / "[+-]HHMM" / "Z"
|
|
987
|
+
// Also supports space-separated offset: "2024-06-15 14:30:00 +08:00"
|
|
988
|
+
// Normalize T separator to space
|
|
989
|
+
const normalized = s.replace('T', ' ');
|
|
990
|
+
// Check for Z suffix → treat as +00:00
|
|
991
|
+
const hasZ = normalized.endsWith('Z') || normalized.endsWith('z');
|
|
992
|
+
// Normalize space-separated offsets: " +08:00" → "+08:00"
|
|
993
|
+
// Also normalize Z to +00:00
|
|
994
|
+
let processed = normalized;
|
|
995
|
+
if (hasZ) {
|
|
996
|
+
processed = normalized.slice(0, -1) + '+00:00';
|
|
997
|
+
}
|
|
998
|
+
else {
|
|
999
|
+
// Collapse space before offset (only in last ~10 chars to avoid date hyphens)
|
|
1000
|
+
const spaceOffMatch = processed.match(/^(.+?)\s+([+-]\d{2}:?\d{2})$/);
|
|
1001
|
+
if (spaceOffMatch) {
|
|
1002
|
+
processed = spaceOffMatch[1] + spaceOffMatch[2];
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
const sepIdx = processed.indexOf(' ');
|
|
1006
|
+
const datePart = processed.substring(0, sepIdx);
|
|
1007
|
+
const rest = processed.substring(sepIdx + 1);
|
|
1008
|
+
// Check for timezone offset: +HH:MM, -HH:MM, +HHMM, -HHMM at the end
|
|
1009
|
+
const offsetMatch = rest.match(/([+-])(\d{2}):?(\d{2})$/);
|
|
1010
|
+
if (offsetMatch) {
|
|
1011
|
+
const timePart = rest.substring(0, offsetMatch.index);
|
|
1012
|
+
const sign = offsetMatch[1] === '-' ? -1 : 1;
|
|
1013
|
+
const offHours = parseInt(offsetMatch[2], 10);
|
|
1014
|
+
const offMins = parseInt(offsetMatch[3], 10);
|
|
1015
|
+
const offsetTotalMinutes = sign * (offHours * 60 + offMins);
|
|
1016
|
+
const dp = datePart.split('-');
|
|
1017
|
+
const { hour, minute, second, nanosecond } = parseTimeString(timePart);
|
|
1018
|
+
// Convert to UTC by subtracting the offset
|
|
1019
|
+
const d = new Date(Date.UTC(parseInt(dp[0], 10), parseInt(dp[1], 10) - 1, parseInt(dp[2], 10), hour, minute - offsetTotalMinutes, second));
|
|
1020
|
+
const unixSecs = BigInt(Math.floor(d.getTime() / 1000));
|
|
1021
|
+
const data = Buffer.alloc(12);
|
|
1022
|
+
data.writeBigInt64LE(unixSecs, 0);
|
|
1023
|
+
data.writeUInt32LE(nanosecond, 8);
|
|
1024
|
+
return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
|
|
1025
|
+
}
|
|
1026
|
+
// No offset — treat as local datetime (convert to UTC using Date.UTC)
|
|
1027
|
+
const dp = datePart.split('-');
|
|
1028
|
+
const { hour, minute, second, nanosecond } = parseTimeString(rest);
|
|
1029
|
+
const d = new Date(Date.UTC(parseInt(dp[0], 10), parseInt(dp[1], 10) - 1, parseInt(dp[2], 10), hour, minute, second));
|
|
1030
|
+
const unixSecs = BigInt(Math.floor(d.getTime() / 1000));
|
|
1031
|
+
const data = Buffer.alloc(12);
|
|
1032
|
+
data.writeBigInt64LE(unixSecs, 0);
|
|
1033
|
+
data.writeUInt32LE(nanosecond, 8);
|
|
1034
|
+
return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
|
|
1035
|
+
}
|
|
1036
|
+
case enums_1.PropertyType.YEAR_TO_MONTH: {
|
|
1037
|
+
// ISO-8601: "P2Y5M", "P0M", "-P1Y5M"
|
|
1038
|
+
const negative = s.startsWith('-');
|
|
1039
|
+
const body = negative ? s.substring(2) : s.substring(1); // skip P or -P
|
|
1040
|
+
let years = 0;
|
|
1041
|
+
let months = 0;
|
|
1042
|
+
const ym = body.match(/(\d+)Y/);
|
|
1043
|
+
if (ym)
|
|
1044
|
+
years = parseInt(ym[1], 10);
|
|
1045
|
+
const mm = body.match(/(\d+)M/);
|
|
1046
|
+
if (mm)
|
|
1047
|
+
months = parseInt(mm[1], 10);
|
|
1048
|
+
const total = (years * 12 + months) * (negative ? -1 : 1);
|
|
1049
|
+
const data = Buffer.alloc(4);
|
|
1050
|
+
data.writeInt32LE(total, 0);
|
|
1051
|
+
return { type: enums_1.PropertyType.YEAR_TO_MONTH, data, isNull: false };
|
|
1052
|
+
}
|
|
1053
|
+
case enums_1.PropertyType.DAY_TO_SECOND: {
|
|
1054
|
+
// ISO-8601: "P3DT4H", "PT0S", "P1DT2H3M4.12S"
|
|
1055
|
+
const body = s.substring(1); // skip P
|
|
1056
|
+
let days = 0;
|
|
1057
|
+
let hours = 0;
|
|
1058
|
+
let mins = 0;
|
|
1059
|
+
let secs = 0;
|
|
1060
|
+
let nanos = 0;
|
|
1061
|
+
const tIdx = body.indexOf('T');
|
|
1062
|
+
const datePart2 = tIdx >= 0 ? body.substring(0, tIdx) : body;
|
|
1063
|
+
const timePart2 = tIdx >= 0 ? body.substring(tIdx + 1) : '';
|
|
1064
|
+
const dm = datePart2.match(/(\d+)D/);
|
|
1065
|
+
if (dm)
|
|
1066
|
+
days = parseInt(dm[1], 10);
|
|
1067
|
+
if (timePart2) {
|
|
1068
|
+
const hm = timePart2.match(/(\d+)H/);
|
|
1069
|
+
if (hm)
|
|
1070
|
+
hours = parseInt(hm[1], 10);
|
|
1071
|
+
const minm = timePart2.match(/(\d+)M/);
|
|
1072
|
+
if (minm)
|
|
1073
|
+
mins = parseInt(minm[1], 10);
|
|
1074
|
+
const sm = timePart2.match(/([\d.]+)S/);
|
|
1075
|
+
if (sm) {
|
|
1076
|
+
const secStr = sm[1];
|
|
1077
|
+
const dotIdx = secStr.indexOf('.');
|
|
1078
|
+
if (dotIdx >= 0) {
|
|
1079
|
+
secs = parseInt(secStr.substring(0, dotIdx), 10);
|
|
1080
|
+
const frac = secStr.substring(dotIdx + 1);
|
|
1081
|
+
nanos = parseInt(frac.padEnd(9, '0').substring(0, 9), 10);
|
|
1082
|
+
}
|
|
1083
|
+
else {
|
|
1084
|
+
secs = parseInt(secStr, 10);
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
const totalSeconds = days * 86400 + hours * 3600 + mins * 60 + secs;
|
|
1089
|
+
const data = Buffer.alloc(12);
|
|
1090
|
+
data.writeBigUInt64LE(BigInt(totalSeconds), 0);
|
|
1091
|
+
data.writeUInt32LE(nanos, 8);
|
|
1092
|
+
return { type: enums_1.PropertyType.DAY_TO_SECOND, data, isNull: false };
|
|
1093
|
+
}
|
|
1094
|
+
default:
|
|
1095
|
+
return { type: targetType, data: Buffer.from(s, 'utf-8'), isNull: false };
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
/** Parse "HH:mm:ss[.nnnnnnnnn]" into components */
|
|
1099
|
+
function parseTimeString(s) {
|
|
1100
|
+
const dotIdx = s.indexOf('.');
|
|
1101
|
+
let timePortion;
|
|
1102
|
+
let nanosecond = 0;
|
|
1103
|
+
if (dotIdx >= 0) {
|
|
1104
|
+
timePortion = s.substring(0, dotIdx);
|
|
1105
|
+
const frac = s.substring(dotIdx + 1);
|
|
1106
|
+
nanosecond = parseInt(frac.padEnd(9, '0').substring(0, 9), 10);
|
|
1107
|
+
}
|
|
1108
|
+
else {
|
|
1109
|
+
timePortion = s;
|
|
1110
|
+
}
|
|
1111
|
+
const parts = timePortion.split(':');
|
|
1112
|
+
return {
|
|
1113
|
+
hour: parseInt(parts[0], 10),
|
|
1114
|
+
minute: parseInt(parts[1], 10),
|
|
1115
|
+
second: parseInt(parts[2], 10),
|
|
1116
|
+
nanosecond,
|
|
1117
|
+
};
|
|
1118
|
+
}
|
|
1119
|
+
/** Split "HH:mm:ss[.n]+HH:MM" or "HH:mm:ss[.n]-HH:MM" into timePart and offsetPart.
|
|
1120
|
+
* Also supports Z suffix (treated as +00:00) and space-separated offsets like "14:30:00 +08:00". */
|
|
1121
|
+
function splitTimeAndOffset(s) {
|
|
1122
|
+
const normalized = normalizeOffset(s);
|
|
1123
|
+
// Find the last '+' or '-' that indicates offset (skip the one at position 0 if present)
|
|
1124
|
+
// Offset is always in the format +HH:MM or -HH:MM at the end
|
|
1125
|
+
// Search for + or - that is followed by exactly DD:DD pattern at end
|
|
1126
|
+
const match = normalized.match(/^(.+?)([+-]\d{2}:\d{2})$/);
|
|
1127
|
+
if (match) {
|
|
1128
|
+
return { timePart: match[1], offsetPart: match[2] };
|
|
1129
|
+
}
|
|
1130
|
+
return { timePart: normalized, offsetPart: '+00:00' };
|
|
1131
|
+
}
|
|
1132
|
+
/**
|
|
1133
|
+
* Remove trailing timezone offset or Z suffix from a datetime/time string.
|
|
1134
|
+
* Only looks in the last ~10 characters to avoid matching date hyphens like "1993-05-06".
|
|
1135
|
+
* Returns the clean local time/datetime string.
|
|
1136
|
+
*/
|
|
1137
|
+
function removeOffset(s) {
|
|
1138
|
+
// Handle Z suffix
|
|
1139
|
+
if (s.endsWith('Z') || s.endsWith('z')) {
|
|
1140
|
+
return s.slice(0, -1);
|
|
1141
|
+
}
|
|
1142
|
+
// Handle space-separated offset: " +HH:MM" or " -HH:MM"
|
|
1143
|
+
const spaceOffMatch = s.match(/^(.+?)\s+[+-]\d{2}:?\d{2}$/);
|
|
1144
|
+
if (spaceOffMatch) {
|
|
1145
|
+
return spaceOffMatch[1];
|
|
1146
|
+
}
|
|
1147
|
+
// Handle attached offset: "+HH:MM" or "-HH:MM" or "+HHMM" or "-HHMM" at end
|
|
1148
|
+
// Only match in the last 10 chars to avoid date hyphens
|
|
1149
|
+
const tail = s.length > 10 ? s.substring(s.length - 10) : s;
|
|
1150
|
+
const offMatch = tail.match(/[+-]\d{2}:?\d{2}$/);
|
|
1151
|
+
if (offMatch) {
|
|
1152
|
+
return s.substring(0, s.length - offMatch[0].length);
|
|
1153
|
+
}
|
|
1154
|
+
return s;
|
|
1155
|
+
}
|
|
1156
|
+
/**
|
|
1157
|
+
* Normalize a string's trailing offset: collapse space before offset, convert Z to +00:00.
|
|
1158
|
+
* Only looks in the last ~10 characters to avoid matching date hyphens.
|
|
1159
|
+
*/
|
|
1160
|
+
function normalizeOffset(s) {
|
|
1161
|
+
// Handle Z suffix → +00:00
|
|
1162
|
+
if (s.endsWith('Z') || s.endsWith('z')) {
|
|
1163
|
+
return s.slice(0, -1) + '+00:00';
|
|
1164
|
+
}
|
|
1165
|
+
// Handle space-separated offset: " +HH:MM" or " -HH:MM"
|
|
1166
|
+
const spaceOffMatch = s.match(/^(.+?)\s+([+-]\d{2}:\d{2})$/);
|
|
1167
|
+
if (spaceOffMatch) {
|
|
1168
|
+
return spaceOffMatch[1] + spaceOffMatch[2];
|
|
1169
|
+
}
|
|
1170
|
+
return s;
|
|
1171
|
+
}
|
|
1172
|
+
/** Create a parameter from name and value */
|
|
1173
|
+
function createParameter(name, value) {
|
|
1174
|
+
return { name, value: createTypedValue(value) };
|
|
1175
|
+
}
|
|
1176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRfdmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvdHlwZWRfdmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOztBQTBISCw0Q0ErTUM7QUFRRCx3Q0E4TUM7QUF1U0Qsa0NBMEpDO0FBV0QsZ0NBOFFDO0FBeUZELDBDQUVDO0FBbDFDRCxtQ0FBdUM7QUFDdkMseUNBQTREO0FBQzVELDZDQThCc0I7QUFZdEIsZ0ZBQWdGO0FBQ2hGLHdCQUF3QjtBQUN4QixnRkFBZ0Y7QUFFaEYsb0VBQW9FO0FBQ3BFLFNBQVMsWUFBWSxDQUFDLENBQVM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLFNBQVMsWUFBWSxDQUFDLElBQVksRUFBRSxNQUFjO0lBQ2hELElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRCxPQUFPLENB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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFDRCx3REFBd0Q7SUFDeEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzdELElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsT0FBTyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFTRCw2Q0FBNkM7QUFDN0MsU0FBZ0IsZUFBZSxDQUFDLElBQVksRUFBRSxLQUFVO0lBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUeXBlZFZhbHVlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBmb3IgR1FMREIgTm9kZS5qcyBkcml2ZXIuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgUHJvcGVydHlUeXBlIH0gZnJvbSAnLi9lbnVtcyc7XHJcbmltcG9ydCB7IEludDMyLCBVSW50MzIsIEZsb2F0MzIsIFVJbnQ2NCB9IGZyb20gJy4vd3JhcHBlcnMnO1xyXG5pbXBvcnQge1xyXG4gIFBvaW50LFxyXG4gIFBvaW50M0QsXHJcbiAgR3FsZGJEZWNpbWFsLFxyXG4gIEdxbGRiVGltZXN0YW1wLFxyXG4gIEdxbGRiTG9jYWxEYXRlVGltZSxcclxuICBHcWxkYkRhdGUsXHJcbiAgR3FsZGJab25lZERhdGVUaW1lLFxyXG4gIEdxbGRiTG9jYWxUaW1lLFxyXG4gIEdxbGRiWm9uZWRUaW1lLFxyXG4gIEdxbGRiVGFibGUsXHJcbiAgWWVhclRvTW9udGgsXHJcbiAgRGF5VG9TZWNvbmQsXHJcbiAgVmVjdG9yLFxyXG4gIGlzUG9pbnQsXHJcbiAgaXNQb2ludDNELFxyXG4gIGlzR3FsZGJEZWNpbWFsLFxyXG4gIGlzR3FsZGJUaW1lc3RhbXAsXHJcbiAgaXNHcWxkYkxvY2FsRGF0ZVRpbWUsXHJcbiAgaXNHcWxkYkRhdGUsXHJcbiAgaXNHcWxkYlpvbmVkRGF0ZVRpbWUsXHJcbiAgaXNHcWxkYkxvY2FsVGltZSxcclxuICBpc0dxbGRiWm9uZWRUaW1lLFxyXG4gIGlzWWVhclRvTW9udGgsXHJcbiAgaXNEYXlUb1NlY29uZCxcclxuICBpc1ZlY3RvcixcclxuICBpc0dxbGRiU2V0LFxyXG4gIHRpbWVzdGFtcEZyb21EYXRlLFxyXG4gIGNyZWF0ZVRpbWVzdGFtcCxcclxuICBjcmVhdGVMb2NhbERhdGVUaW1lLFxyXG59IGZyb20gJy4vZGF0YV90eXBlcyc7XHJcbmltcG9ydCB7IEdxbGRiTm9kZSwgR3FsZGJFZGdlLCBHcWxkYlBhdGgsIEdxbGRiRXJyb3IgfSBmcm9tICcuL2dyYXBoX21vZGVscyc7XHJcblxyXG5cclxuLyoqIFJlcHJlc2VudHMgYSB0eXBlZCB2YWx1ZSBmb3Igd2lyZSB0cmFuc21pc3Npb24gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUeXBlZFZhbHVlIHtcclxuICB0eXBlOiBQcm9wZXJ0eVR5cGU7XHJcbiAgZGF0YTogQnVmZmVyO1xyXG4gIGlzTnVsbDogYm9vbGVhbjtcclxufVxyXG5cclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbi8vIEJpbmFyeSBGb3JtYXQgSGVscGVyc1xyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuLyoqIEVuY29kZSBhIGxlbmd0aC1wcmVmaXhlZCBzdHJpbmc6IFtsZW46MiB1aW50MTZMRV1bdXRmOCBieXRlc10gKi9cclxuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHM6IHN0cmluZyk6IEJ1ZmZlciB7XHJcbiAgY29uc3Qgc3RyQnVmID0gQnVmZmVyLmZyb20ocywgJ3V0Zi04Jyk7XHJcbiAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmFsbG9jKDIgKyBzdHJCdWYubGVuZ3RoKTtcclxuICByZXN1bHQud3JpdGVVSW50MTZMRShzdHJCdWYubGVuZ3RoLCAwKTtcclxuICBzdHJCdWYuY29weShyZXN1bHQsIDIpO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKiBEZWNvZGUgYSBsZW5ndGgtcHJlZml4ZWQgc3RyaW5nLiBSZXR1cm5zIFtzdHJpbmcsIGJ5dGVzQ29uc3VtZWRdLiAqL1xyXG5mdW5jdGlvbiBkZWNvZGVTdHJpbmcoZGF0YTogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFtzdHJpbmcsIG51bWJlcl0ge1xyXG4gIGlmIChvZmZzZXQgKyAyID4gZGF0YS5sZW5ndGgpIHJldHVybiBbJycsIDBdO1xyXG4gIGNvbnN0IGxlbiA9IGRhdGEucmVhZFVJbnQxNkxFKG9mZnNldCk7XHJcbiAgaWYgKG9mZnNldCArIDIgKyBsZW4gPiBkYXRhLmxlbmd0aCkgcmV0dXJuIFsnJywgMF07XHJcbiAgcmV0dXJuIFtkYXRhLnNsaWNlKG9mZnNldCArIDIsIG9mZnNldCArIDIgKyBsZW4pLnRvU3RyaW5nKCd1dGYtOCcpLCAyICsgbGVuXTtcclxufVxyXG5cclxuLyoqIEVuY29kZSBhIFR5cGVkVmFsdWVFbnRyeTogW3R5cGU6MV1baXNOdWxsOjFdW2RhdGFMZW46NCB1aW50MzJMRV1bZGF0YV0gKi9cclxuZnVuY3Rpb24gZW5jb2RlVHlwZWRWYWx1ZUVudHJ5KHR2OiBUeXBlZFZhbHVlKTogQnVmZmVyIHtcclxuICBjb25zdCByZXN1bHQgPSBCdWZmZXIuYWxsb2MoNiArIHR2LmRhdGEubGVuZ3RoKTtcclxuICByZXN1bHQud3JpdGVVSW50OCh0di50eXBlLCAwKTtcclxuICByZXN1bHQud3JpdGVVSW50OCh0di5pc051bGwgPyAxIDogMCwgMSk7XHJcbiAgcmVzdWx0LndyaXRlVUludDMyTEUodHYuZGF0YS5sZW5ndGgsIDIpO1xyXG4gIGlmICh0di5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgIHR2LmRhdGEuY29weShyZXN1bHQsIDYpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKiogRGVjb2RlIGEgVHlwZWRWYWx1ZUVudHJ5LiBSZXR1cm5zIFtUeXBlZFZhbHVlLCBieXRlc0NvbnN1bWVkXS4gKi9cclxuZnVuY3Rpb24gZGVjb2RlVHlwZWRWYWx1ZUVudHJ5KGRhdGE6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBbVHlwZWRWYWx1ZSwgbnVtYmVyXSB7XHJcbiAgaWYgKG9mZnNldCArIDYgPiBkYXRhLmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIFt7IHR5cGU6IFByb3BlcnR5VHlwZS5OVUxMLCBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIGlzTnVsbDogdHJ1ZSB9LCAwXTtcclxuICB9XHJcbiAgY29uc3QgdHlwZSA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCkgYXMgUHJvcGVydHlUeXBlO1xyXG4gIGNvbnN0IGlzTnVsbCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCArIDEpICE9PSAwO1xyXG4gIGNvbnN0IGRhdGFMZW4gPSBkYXRhLnJlYWRVSW50MzJMRShvZmZzZXQgKyAyKTtcclxuICBpZiAob2Zmc2V0ICsgNiArIGRhdGFMZW4gPiBkYXRhLmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIFt7IHR5cGU6IFByb3BlcnR5VHlwZS5OVUxMLCBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIGlzTnVsbDogdHJ1ZSB9LCAwXTtcclxuICB9XHJcbiAgY29uc3QgdHZEYXRhID0gZGF0YS5zbGljZShvZmZzZXQgKyA2LCBvZmZzZXQgKyA2ICsgZGF0YUxlbik7XHJcbiAgcmV0dXJuIFt7IHR5cGUsIGRhdGE6IHR2RGF0YSwgaXNOdWxsIH0sIDYgKyBkYXRhTGVuXTtcclxufVxyXG5cclxuLyoqIERlY29kZSBiaW5hcnkgcHJvcGVydGllczogW2NvdW50OjJdW2tleUxlbjoyXVtrZXldW1RWRV0uLi4gKi9cclxuZnVuY3Rpb24gZGVjb2RlUHJvcGVydGllc0JpbmFyeShkYXRhOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogW1JlY29yZDxzdHJpbmcsIGFueT4sIG51bWJlcl0ge1xyXG4gIGlmIChvZmZzZXQgKyAyID4gZGF0YS5sZW5ndGgpIHJldHVybiBbe30sIDBdO1xyXG4gIGNvbnN0IGNvdW50ID0gZGF0YS5yZWFkVUludDE2TEUob2Zmc2V0KTtcclxuICBsZXQgcG9zID0gb2Zmc2V0ICsgMjtcclxuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICBjb25zdCBba2V5LCBrZXlMZW5dID0gZGVjb2RlU3RyaW5nKGRhdGEsIHBvcyk7XHJcbiAgICBpZiAoa2V5TGVuID09PSAwKSBicmVhaztcclxuICAgIHBvcyArPSBrZXlMZW47XHJcblxyXG4gICAgY29uc3QgW3R2LCB0dkxlbl0gPSBkZWNvZGVUeXBlZFZhbHVlRW50cnkoZGF0YSwgcG9zKTtcclxuICAgIGlmICh0dkxlbiA9PT0gMCkgYnJlYWs7XHJcbiAgICBwb3MgKz0gdHZMZW47XHJcblxyXG4gICAgcmVzdWx0W2tleV0gPSB0eXBlZFZhbHVlVG9KUyh0dik7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gW3Jlc3VsdCwgcG9zIC0gb2Zmc2V0XTtcclxufVxyXG5cclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbi8vIEVuY29kaW5nOiBKUyDihpIgVHlwZWRWYWx1ZVxyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuLyoqIENyZWF0ZSBhIFR5cGVkVmFsdWUgZnJvbSBhIEphdmFTY3JpcHQgdmFsdWUgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR5cGVkVmFsdWUodmFsdWU6IGFueSk6IFR5cGVkVmFsdWUge1xyXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuTlVMTCwgZGF0YTogQnVmZmVyLmFsbG9jKDApLCBpc051bGw6IHRydWUgfTtcclxuICB9XHJcblxyXG4gIC8vIFBhc3MtdGhyb3VnaDogaWYgYWxyZWFkeSBhIFR5cGVkVmFsdWUsIHJldHVybiBkaXJlY3RseVxyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiB2YWx1ZSAmJiAnZGF0YScgaW4gdmFsdWUgJiYgJ2lzTnVsbCcgaW4gdmFsdWUgJiYgdmFsdWUuZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xyXG4gICAgcmV0dXJuIHZhbHVlIGFzIFR5cGVkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMSk7XHJcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUgPyAxIDogMCwgMCk7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuQk9PTCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIGV4cGxpY2l0IHR5cGUgd3JhcHBlcnNcclxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnQzMikge1xyXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg0KTtcclxuICAgIGRhdGEud3JpdGVJbnQzMkxFKHZhbHVlLnZhbHVlLCAwKTtcclxuICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5JTlQzMiwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVUludDMyKSB7XHJcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDQpO1xyXG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKHZhbHVlLnZhbHVlLCAwKTtcclxuICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5VSU5UMzIsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcblxyXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0MzIpIHtcclxuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoNCk7XHJcbiAgICBkYXRhLndyaXRlRmxvYXRMRSh2YWx1ZS52YWx1ZSwgMCk7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuRkxPQVQsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcblxyXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVJbnQ2NCkge1xyXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcclxuICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRSh2YWx1ZS52YWx1ZSwgMCk7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVUlOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgfVxyXG5cclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgLy8gVXNlIGlzU2FmZUludGVnZXIgdG8gYXZvaWQgaXNzdWVzIHdpdGggbGFyZ2UgZmxvYXRzIGxpa2UgTnVtYmVyLk1BWF9WQUxVRVxyXG4gICAgLy8gd2hpY2ggYXBwZWFyIGFzIGludGVnZXJzIGR1ZSB0byBwcmVjaXNpb24gbG9zc1xyXG4gICAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgpO1xyXG4gICAgICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQodmFsdWUpLCAwKTtcclxuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLklOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgpO1xyXG4gICAgICBkYXRhLndyaXRlRG91YmxlTEUodmFsdWUsIDApO1xyXG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuRE9VQkxFLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xyXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcclxuICAgIC8vIENoZWNrIGlmIHZhbHVlIGZpdHMgaW4gc2lnbmVkIElOVDY0IHJhbmdlXHJcbiAgICBjb25zdCBJTlQ2NF9NSU4gPSBCaWdJbnQoJy05MjIzMzcyMDM2ODU0Nzc1ODA4Jyk7XHJcbiAgICBjb25zdCBJTlQ2NF9NQVggPSBCaWdJbnQoJzkyMjMzNzIwMzY4NTQ3NzU4MDcnKTtcclxuICAgIGlmICh2YWx1ZSA+PSBJTlQ2NF9NSU4gJiYgdmFsdWUgPD0gSU5UNjRfTUFYKSB7XHJcbiAgICAgIGRhdGEud3JpdGVCaWdJbnQ2NExFKHZhbHVlLCAwKTtcclxuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLklOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBWYWx1ZSBpcyBvdXRzaWRlIElOVDY0IHJhbmdlLCB1c2UgVUlOVDY0XHJcbiAgICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRSh2YWx1ZSwgMCk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5VSU5UNjQsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuU1RSSU5HLCBkYXRhOiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ3V0Zi04JyksIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcblxyXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuQkxPQiwgZGF0YTogdmFsdWUsIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcblxyXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgIGNvbnN0IHVuaXhTZWNvbmRzID0gQmlnSW50KE1hdGguZmxvb3IodmFsdWUuZ2V0VGltZSgpIC8gMTAwMCkpO1xyXG4gICAgY29uc3QgbmFub3MgPSAodmFsdWUuZ2V0VGltZSgpICUgMTAwMCkgKiAxXzAwMF8wMDA7XHJcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEyKTtcclxuICAgIGRhdGEud3JpdGVCaWdJbnQ2NExFKHVuaXhTZWNvbmRzLCAwKTtcclxuICAgIGRhdGEud3JpdGVVSW50MzJMRShuYW5vcyA8IDAgPyBuYW5vcyArIDFfMDAwXzAwMF8wMDAgOiBuYW5vcywgOCk7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVElNRVNUQU1QLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgfVxyXG5cclxuICBpZiAoaXNHcWxkYlRpbWVzdGFtcCh2YWx1ZSkpIHtcclxuICAgIGNvbnN0IHVuaXhTZWNvbmRzID0gQmlnSW50KE1hdGguZmxvb3IoXHJcbiAgICAgIERhdGUuVVRDKHZhbHVlLnllYXIsIHZhbHVlLm1vbnRoIC0gMSwgdmFsdWUuZGF5LCB2YWx1ZS5ob3VyLCB2YWx1ZS5taW51dGUsIHZhbHVlLnNlY29uZCkgLyAxMDAwXHJcbiAgICApKTtcclxuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTIpO1xyXG4gICAgZGF0YS53cml0ZUJpZ0ludDY0TEUodW5peFNlY29uZHMsIDApO1xyXG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKHZhbHVlLm5hbm9zZWNvbmQsIDgpO1xyXG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlRJTUVTVEFNUCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICByZXR1cm4gZW5jb2RlTGlzdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBmb3IgbmV3IHR5cGVzIGJlZm9yZSBnZW5lcmljIG9iamVjdCBoYW5kbGluZ1xyXG4gIGlmIChpc1BvaW50KHZhbHVlKSkge1xyXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxNik7XHJcbiAgICBkYXRhLndyaXRlRG91YmxlTEUodmFsdWUubG9uZ2l0dWRlLCAwKTtcclxuICAgIGRhdGEud3JpdGVEb3VibGVMRSh2YWx1ZS5sYXRpdHVkZSwgOCk7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuUE9JTlQsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcblxyXG4gIGlmIChpc1BvaW50M0QodmFsdWUpKSB7XHJcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDI0KTtcclxuICAgIGRhdGEud3JpdGVEb3VibGVMRSh2YWx1ZS54LCAwKTtcclxuICAgIGRhdGEud3JpdGVEb3VibGVMRSh2YWx1ZS55LCA4KTtcclxuICAgIGRhdGEud3JpdGVEb3VibGVMRSh2YWx1ZS56LCAxNik7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuUE9JTlQzRCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzR3FsZGJEZWNpbWFsKHZhbHVlKSkge1xyXG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLkRFQ0lNQUwsIGRhdGE6IEJ1ZmZlci5mcm9tKHZhbHVlLnZhbHVlLCAndXRmLTgnKSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzR3FsZGJMb2NhbERhdGVUaW1lKHZhbHVlKSkge1xyXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMSk7XHJcbiAgICBkYXRhLndyaXRlVUludDE2TEUodmFsdWUueWVhciwgMCk7XHJcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUubW9udGgsIDIpO1xyXG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLmRheSwgMyk7XHJcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUuaG91ciwgNCk7XHJcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUubWludXRlLCA1KTtcclxuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5zZWNvbmQsIDYpO1xyXG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKHZhbHVlLm5hbm9zZWNvbmQsIDcpO1xyXG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLkxPQ0FMX0RBVEVUSU1FLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgfVxyXG5cclxuICBpZiAoaXNHcWxkYkRhdGUodmFsdWUpKSB7XHJcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgpO1xyXG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKHZhbHVlLnllYXIsIDApO1xyXG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLm1vbnRoLCAyKTtcclxuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5kYXksIDMpO1xyXG4gICAgLy8gYnl0ZXMgNC03IGFyZSBwYWRkaW5nICh6ZXJvcylcclxuICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5EQVRFLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgfVxyXG5cclxuICBpZiAoaXNHcWxkYlpvbmVkRGF0ZVRpbWUodmFsdWUpKSB7XHJcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEzKTtcclxuICAgIGRhdGEud3JpdGVVSW50MTZMRSh2YWx1ZS55ZWFyLCAwKTtcclxuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5tb250aCwgMik7XHJcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUuZGF5LCAzKTtcclxuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5ob3VyLCA0KTtcclxuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5taW51dGUsIDUpO1xyXG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLnNlY29uZCwgNik7XHJcbiAgICBkYXRhLndyaXRlVUludDMyTEUodmFsdWUubmFub3NlY29uZCwgNyk7XHJcbiAgICBkYXRhLndyaXRlSW50MTZMRSh2YWx1ZS5vZmZzZXRNaW51dGVzLCAxMSk7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuWk9ORURfREFURVRJTUUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcblxyXG4gIGlmIChpc0dxbGRiWm9uZWRUaW1lKHZhbHVlKSkge1xyXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMCk7XHJcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUuaG91ciwgMCk7XHJcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUubWludXRlLCAxKTtcclxuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5zZWNvbmQsIDIpO1xyXG4gICAgLy8gYnl0ZSAzIGlzIHBhZGRpbmdcclxuICAgIGRhdGEud3JpdGVVSW50MzJMRSh2YWx1ZS5uYW5vc2Vjb25kLCA0KTtcclxuICAgIGRhdGEud3JpdGVJbnQxNkxFKHZhbHVlLm9mZnNldE1pbnV0ZXMsIDgpO1xyXG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlpPTkVEX1RJTUUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcblxyXG4gIGlmIChpc0dxbGRiTG9jYWxUaW1lKHZhbHVlKSkge1xyXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcclxuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5ob3VyLCAwKTtcclxuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5taW51dGUsIDEpO1xyXG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLnNlY29uZCwgMik7XHJcbiAgICAvLyBieXRlIDMgaXMgcGFkZGluZ1xyXG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKHZhbHVlLm5hbm9zZWNvbmQsIDQpO1xyXG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLkxPQ0FMX1RJTUUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcblxyXG4gIGlmIChpc1llYXJUb01vbnRoKHZhbHVlKSkge1xyXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg0KTtcclxuICAgIGRhdGEud3JpdGVJbnQzMkxFKHZhbHVlLm1vbnRocywgMCk7XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuWUVBUl9UT19NT05USCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzRGF5VG9TZWNvbmQodmFsdWUpKSB7XHJcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEyKTtcclxuICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRShCaWdJbnQodmFsdWUuc2Vjb25kcyksIDApO1xyXG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKHZhbHVlLm5hbm9zZWNvbmRzLCA4KTtcclxuICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5EQVlfVE9fU0VDT05ELCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgfVxyXG5cclxuICBpZiAoaXNWZWN0b3IodmFsdWUpKSB7XHJcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDQgKyB2YWx1ZS52YWx1ZXMubGVuZ3RoICogNCk7XHJcbiAgICBkYXRhLndyaXRlVUludDMyTEUodmFsdWUudmFsdWVzLmxlbmd0aCwgMCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLnZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBkYXRhLndyaXRlRmxvYXRMRSh2YWx1ZS52YWx1ZXNbaV0sIDQgKyBpICogNCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVkVDVE9SLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgfVxyXG5cclxuICBpZiAoaXNHcWxkYlNldCh2YWx1ZSkpIHtcclxuICAgIHJldHVybiBlbmNvZGVTZXQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgIHJldHVybiBlbmNvZGVNYXAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XHJcbiAgfVxyXG5cclxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZW9mIHZhbHVlfWApO1xyXG59XHJcblxyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLy8gRGVjb2Rpbmc6IFR5cGVkVmFsdWUg4oaSIEpTXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vKiogQ29udmVydCBhIFR5cGVkVmFsdWUgdG8gYSBKYXZhU2NyaXB0IHZhbHVlICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlZFZhbHVlVG9KUyh0djogVHlwZWRWYWx1ZSk6IGFueSB7XHJcbiAgaWYgKHR2LmlzTnVsbCB8fCB0di50eXBlID09PSBQcm9wZXJ0eVR5cGUuTlVMTCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBzd2l0Y2ggKHR2LnR5cGUpIHtcclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkJPT0w6XHJcbiAgICAgIHJldHVybiB0di5kYXRhLmxlbmd0aCA+PSAxICYmIHR2LmRhdGEucmVhZFVJbnQ4KDApICE9PSAwO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLklOVDMyOlxyXG4gICAgICByZXR1cm4gdHYuZGF0YS5sZW5ndGggPj0gNCA/IHR2LmRhdGEucmVhZEludDMyTEUoMCkgOiAwO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlVJTlQzMjpcclxuICAgICAgcmV0dXJuIHR2LmRhdGEubGVuZ3RoID49IDQgPyB0di5kYXRhLnJlYWRVSW50MzJMRSgwKSA6IDA7XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuSU5UNjQ6IHtcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoIDwgOCkgcmV0dXJuIDA7XHJcbiAgICAgIGNvbnN0IGJpZ1ZhbCA9IHR2LmRhdGEucmVhZEJpZ0ludDY0TEUoMCk7XHJcbiAgICAgIC8vIFJldHVybiByZWd1bGFyIG51bWJlciBpZiB2YWx1ZSBmaXRzIGluIHNhZmUgaW50ZWdlciByYW5nZVxyXG4gICAgICBpZiAoYmlnVmFsID49IEJpZ0ludChOdW1iZXIuTUlOX1NBRkVfSU5URUdFUikgJiYgYmlnVmFsIDw9IEJpZ0ludChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKGJpZ1ZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGJpZ1ZhbDtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5VSU5UNjQ6IHtcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoIDwgOCkgcmV0dXJuIDA7XHJcbiAgICAgIGNvbnN0IGJpZ1ZhbCA9IHR2LmRhdGEucmVhZEJpZ1VJbnQ2NExFKDApO1xyXG4gICAgICAvLyBSZXR1cm4gcmVndWxhciBudW1iZXIgaWYgdmFsdWUgZml0cyBpbiBzYWZlIGludGVnZXIgcmFuZ2VcclxuICAgICAgaWYgKGJpZ1ZhbCA8PSBCaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcihiaWdWYWwpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBiaWdWYWw7XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuRkxPQVQ6XHJcbiAgICAgIHJldHVybiB0di5kYXRhLmxlbmd0aCA+PSA0ID8gdHYuZGF0YS5yZWFkRmxvYXRMRSgwKSA6IDA7XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuRE9VQkxFOlxyXG4gICAgICByZXR1cm4gdHYuZGF0YS5sZW5ndGggPj0gOCA/IHR2LmRhdGEucmVhZERvdWJsZUxFKDApIDogMDtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5TVFJJTkc6XHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5URVhUOlxyXG4gICAgICByZXR1cm4gdHYuZGF0YS50b1N0cmluZygndXRmLTgnKTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5CTE9COlxyXG4gICAgICByZXR1cm4gdHYuZGF0YTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5USU1FU1RBTVA6XHJcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA+PSAxMikge1xyXG4gICAgICAgIGNvbnN0IHNlY3MgPSBOdW1iZXIodHYuZGF0YS5yZWFkQmlnSW50NjRMRSgwKSk7XHJcbiAgICAgICAgY29uc3QgbmFub3MgPSB0di5kYXRhLnJlYWRVSW50MzJMRSg4KTtcclxuICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoc2VjcyAqIDEwMDAgKyBNYXRoLmZsb29yKG5hbm9zIC8gMV8wMDBfMDAwKSk7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVRpbWVzdGFtcChcclxuICAgICAgICAgIGQuZ2V0VVRDRnVsbFllYXIoKSxcclxuICAgICAgICAgIGQuZ2V0VVRDTW9udGgoKSArIDEsXHJcbiAgICAgICAgICBkLmdldFVUQ0RhdGUoKSxcclxuICAgICAgICAgIGQuZ2V0VVRDSG91cnMoKSxcclxuICAgICAgICAgIGQuZ2V0VVRDTWludXRlcygpLFxyXG4gICAgICAgICAgZC5nZXRVVENTZWNvbmRzKCksXHJcbiAgICAgICAgICBuYW5vcyxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjcmVhdGVUaW1lc3RhbXAoMCwgMCwgMCwgMCwgMCwgMCwgMCk7XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuREFURTpcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgeWVhcjogdHYuZGF0YS5yZWFkVUludDE2TEUoMCksXHJcbiAgICAgICAgICBtb250aDogdHYuZGF0YS5yZWFkVUludDgoMiksXHJcbiAgICAgICAgICBkYXk6IHR2LmRhdGEucmVhZFVJbnQ4KDMpLFxyXG4gICAgICAgIH0gYXMgR3FsZGJEYXRlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IHllYXI6IDAsIG1vbnRoOiAwLCBkYXk6IDAgfSBhcyBHcWxkYkRhdGU7XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuTE9DQUxfVElNRTpcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaG91cjogdHYuZGF0YS5yZWFkVUludDgoMCksXHJcbiAgICAgICAgICBtaW51dGU6IHR2LmRhdGEucmVhZFVJbnQ4KDEpLFxyXG4gICAgICAgICAgc2Vjb25kOiB0di5kYXRhLnJlYWRVSW50OCgyKSxcclxuICAgICAgICAgIG5hbm9zZWNvbmQ6IHR2LmRhdGEucmVhZFVJbnQzMkxFKDQpLFxyXG4gICAgICAgIH0gYXMgR3FsZGJMb2NhbFRpbWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG5hbm9zZWNvbmQ6IDAgfSBhcyBHcWxkYkxvY2FsVGltZTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5aT05FRF9USU1FOlxyXG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPj0gMTApIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaG91cjogdHYuZGF0YS5yZWFkVUludDgoMCksXHJcbiAgICAgICAgICBtaW51dGU6IHR2LmRhdGEucmVhZFVJbnQ4KDEpLFxyXG4gICAgICAgICAgc2Vjb25kOiB0di5kYXRhLnJlYWRVSW50OCgyKSxcclxuICAgICAgICAgIG5hbm9zZWNvbmQ6IHR2LmRhdGEucmVhZFVJbnQzMkxFKDQpLFxyXG4gICAgICAgICAgb2Zmc2V0TWludXRlczogdHYuZGF0YS5yZWFkSW50MTZMRSg4KSxcclxuICAgICAgICB9IGFzIEdxbGRiWm9uZWRUaW1lO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBuYW5vc2Vjb25kOiAwLCBvZmZzZXRNaW51dGVzOiAwIH0gYXMgR3FsZGJab25lZFRpbWU7XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuWk9ORURfREFURVRJTUU6XHJcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA+PSAxMykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB5ZWFyOiB0di5kYXRhLnJlYWRVSW50MTZMRSgwKSxcclxuICAgICAgICAgIG1vbnRoOiB0di5kYXRhLnJlYWRVSW50OCgyKSxcclxuICAgICAgICAgIGRheTogdHYuZGF0YS5yZWFkVUludDgoMyksXHJcbiAgICAgICAgICBob3VyOiB0di5kYXRhLnJlYWRVSW50OCg0KSxcclxuICAgICAgICAgIG1pbnV0ZTogdHYuZGF0YS5yZWFkVUludDgoNSksXHJcbiAgICAgICAgICBzZWNvbmQ6IHR2LmRhdGEucmVhZFVJbnQ4KDYpLFxyXG4gICAgICAgICAgbmFub3NlY29uZDogdHYuZGF0YS5yZWFkVUludDMyTEUoNyksXHJcbiAgICAgICAgICBvZmZzZXRNaW51dGVzOiB0di5kYXRhLnJlYWRJbnQxNkxFKDExKSxcclxuICAgICAgICB9IGFzIEdxbGRiWm9uZWREYXRlVGltZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4geyB5ZWFyOiAwLCBtb250aDogMCwgZGF5OiAwLCBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbmFub3NlY29uZDogMCwgb2Zmc2V0TWludXRlczogMCB9IGFzIEdxbGRiWm9uZWREYXRlVGltZTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5MT0NBTF9EQVRFVElNRTpcclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRBVEVUSU1FOlxyXG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPj0gMTEpIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxEYXRlVGltZShcclxuICAgICAgICAgIHR2LmRhdGEucmVhZFVJbnQxNkxFKDApLCAgIC8vIHllYXJcclxuICAgICAgICAgIHR2LmRhdGEucmVhZFVJbnQ4KDIpLCAgICAgIC8vIG1vbnRoXHJcbiAgICAgICAgICB0di5kYXRhLnJlYWRVSW50OCgzKSwgICAgICAvLyBkYXlcclxuICAgICAgICAgIHR2LmRhdGEucmVhZFVJbnQ4KDQpLCAgICAgIC8vIGhvdXJcclxuICAgICAgICAgIHR2LmRhdGEucmVhZFVJbnQ4KDUpLCAgICAgIC8vIG1pbnV0ZVxyXG4gICAgICAgICAgdHYuZGF0YS5yZWFkVUludDgoNiksICAgICAgLy8gc2Vjb25kXHJcbiAgICAgICAgICB0di5kYXRhLnJlYWRVSW50MzJMRSg3KSwgICAvLyBuYW5vc2Vjb25kXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY3JlYXRlTG9jYWxEYXRlVGltZSgwLCAwLCAwLCAwLCAwLCAwLCAwKTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5ZRUFSX1RPX01PTlRIOlxyXG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPj0gNCkge1xyXG4gICAgICAgIHJldHVybiB7IG1vbnRoczogdHYuZGF0YS5yZWFkSW50MzJMRSgwKSB9IGFzIFllYXJUb01vbnRoO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IG1vbnRoczogMCB9IGFzIFllYXJUb01vbnRoO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRBWV9UT19TRUNPTkQ6XHJcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA+PSAxMikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzZWNvbmRzOiBOdW1iZXIodHYuZGF0YS5yZWFkQmlnVUludDY0TEUoMCkpLFxyXG4gICAgICAgICAgbmFub3NlY29uZHM6IHR2LmRhdGEucmVhZFVJbnQzMkxFKDgpLFxyXG4gICAgICAgIH0gYXMgRGF5VG9TZWNvbmQ7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHsgc2Vjb25kczogMCwgbmFub3NlY29uZHM6IDAgfSBhcyBEYXlUb1NlY29uZDtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5QT0lOVDpcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDE2KSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxvbmdpdHVkZTogdHYuZGF0YS5yZWFkRG91YmxlTEUoMCksXHJcbiAgICAgICAgICBsYXRpdHVkZTogdHYuZGF0YS5yZWFkRG91YmxlTEUoOCksXHJcbiAgICAgICAgfSBhcyBQb2ludDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4geyBsYXRpdHVkZTogMCwgbG9uZ2l0dWRlOiAwIH0gYXMgUG9pbnQ7XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuUE9JTlQzRDpcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDI0KSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHg6IHR2LmRhdGEucmVhZERvdWJsZUxFKDApLFxyXG4gICAgICAgICAgeTogdHYuZGF0YS5yZWFkRG91YmxlTEUoOCksXHJcbiAgICAgICAgICB6OiB0di5kYXRhLnJlYWREb3VibGVMRSgxNiksXHJcbiAgICAgICAgfSBhcyBQb2ludDNEO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IHg6IDAsIHk6IDAsIHo6IDAgfSBhcyBQb2ludDNEO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRFQ0lNQUw6XHJcbiAgICAgIHJldHVybiB7IHZhbHVlOiB0di5kYXRhLnRvU3RyaW5nKCd1dGYtOCcpIH0gYXMgR3FsZGJEZWNpbWFsO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlZFQ1RPUjpcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDQpIHtcclxuICAgICAgICBjb25zdCBkaW0gPSB0di5kYXRhLnJlYWRVSW50MzJMRSgwKTtcclxuICAgICAgICBpZiAodHYuZGF0YS5sZW5ndGggPj0gNCArIGRpbSAqIDQpIHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltOyBpKyspIHtcclxuICAgICAgICAgICAgdmFsdWVzLnB1c2godHYuZGF0YS5yZWFkRmxvYXRMRSg0ICsgaSAqIDQpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB7IHZhbHVlcyB9IGFzIFZlY3RvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBbXSB9IGFzIFZlY3RvcjtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5MSVNUOlxyXG4gICAgICByZXR1cm4gZGVjb2RlTGlzdCh0di5kYXRhKTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5TRVQ6XHJcbiAgICAgIHJldHVybiBuZXcgU2V0KGRlY29kZUxpc3QodHYuZGF0YSkpO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLk1BUDpcclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlJFQ09SRDpcclxuICAgICAgcmV0dXJuIGRlY29kZU1hcCh0di5kYXRhKTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5UQUJMRTpcclxuICAgICAgcmV0dXJuIGRlY29kZVRhYmxlKHR2LmRhdGEpO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLk5PREU6XHJcbiAgICAgIHJldHVybiBkZWNvZGVOb2RlKHR2LmRhdGEpO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkVER0U6XHJcbiAgICAgIHJldHVybiBkZWNvZGVFZGdlKHR2LmRhdGEpO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlBBVEg6XHJcbiAgICAgIHJldHVybiBkZWNvZGVQYXRoKHR2LmRhdGEpO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkVSUk9SOlxyXG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3IodHYuZGF0YSk7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIHR2LmRhdGE7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLy8gRGVjb2RlOiBDb21wbGV4IFR5cGVzXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vKipcclxuICogRGVjb2RlIGEgbm9kZSBmcm9tIGJpbmFyeSBmb3JtYXQuXHJcbiAqIEZvcm1hdDogW2lkTGVuOjJdW2lkXVtsYWJlbENvdW50OjJdW2xhYmVsTGVuOjJdW2xhYmVsXS4uLltwcm9wZXJ0aWVzX2JpbmFyeV1cclxuICovXHJcbmZ1bmN0aW9uIGRlY29kZU5vZGUoZGF0YTogQnVmZmVyKTogR3FsZGJOb2RlIHtcclxuICBsZXQgb2Zmc2V0ID0gMDtcclxuXHJcbiAgLy8gRGVjb2RlIElEXHJcbiAgY29uc3QgW2lkLCBpZExlbl0gPSBkZWNvZGVTdHJpbmcoZGF0YSwgb2Zmc2V0KTtcclxuICBpZiAoaWRMZW4gPT09IDApIHJldHVybiB7IGlkOiAnJywgbGFiZWxzOiBbXSwgcHJvcGVydGllczoge30gfTtcclxuICBvZmZzZXQgKz0gaWRMZW47XHJcblxyXG4gIC8vIERlY29kZSBsYWJlbHNcclxuICBpZiAob2Zmc2V0ICsgMiA+IGRhdGEubGVuZ3RoKSByZXR1cm4geyBpZCwgbGFiZWxzOiBbXSwgcHJvcGVydGllczoge30gfTtcclxuICBjb25zdCBsYWJlbENvdW50ID0gZGF0YS5yZWFkVUludDE2TEUob2Zmc2V0KTtcclxuICBvZmZzZXQgKz0gMjtcclxuXHJcbiAgY29uc3QgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxDb3VudDsgaSsrKSB7XHJcbiAgICBjb25zdCBbbGFiZWwsIGxhYmVsTGVuXSA9IGRlY29kZVN0cmluZyhkYXRhLCBvZmZzZXQpO1xyXG4gICAgaWYgKGxhYmVsTGVuID09PSAwKSBicmVhaztcclxuICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcclxuICAgIG9mZnNldCArPSBsYWJlbExlbjtcclxuICB9XHJcblxyXG4gIC8vIERlY29kZSBwcm9wZXJ0aWVzXHJcbiAgY29uc3QgW3Byb3BlcnRpZXNdID0gZGVjb2RlUHJvcGVydGllc0JpbmFyeShkYXRhLCBvZmZzZXQpO1xyXG5cclxuICByZXR1cm4geyBpZCwgbGFiZWxzLCBwcm9wZXJ0aWVzIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvZGUgYW4gZWRnZSBmcm9tIGJpbmFyeSBmb3JtYXQuXHJcbiAqIEZvcm1hdDogW2lkTGVuOjJdW2lkXVtsYWJlbExlbjoyXVtsYWJlbF1bZnJvbUxlbjoyXVtmcm9tXVt0b0xlbjoyXVt0b11bcHJvcGVydGllc19iaW5hcnldXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWNvZGVFZGdlKGRhdGE6IEJ1ZmZlcik6IEdxbGRiRWRnZSB7XHJcbiAgbGV0IG9mZnNldCA9IDA7XHJcblxyXG4gIGNvbnN0IFtpZCwgaWRMZW5dID0gZGVjb2RlU3RyaW5nKGRhdGEsIG9mZnNldCk7XHJcbiAgaWYgKGlkTGVuID09PSAwKSByZXR1cm4geyBpZDogJycsIGxhYmVsOiAnJywgZnJvbU5vZGVJZDogJycsIHRvTm9kZUlkOiAnJywgcHJvcGVydGllczoge30gfTtcclxuICBvZmZzZXQgKz0gaWRMZW47XHJcblxyXG4gIGNvbnN0IFtsYWJlbCwgbGFiZWxMZW5dID0gZGVjb2RlU3RyaW5nKGRhdGEsIG9mZnNldCk7XHJcbiAgaWYgKGxhYmVsTGVuID09PSAwKSByZXR1cm4geyBpZCwgbGFiZWw6ICcnLCBmcm9tTm9kZUlkOiAnJywgdG9Ob2RlSWQ6ICcnLCBwcm9wZXJ0aWVzOiB7fSB9O1xyXG4gIG9mZnNldCArPSBsYWJlbExlbjtcclxuXHJcbiAgY29uc3QgW2Zyb21Ob2RlSWQsIGZyb21MZW5dID0gZGVjb2RlU3RyaW5nKGRhdGEsIG9mZnNldCk7XHJcbiAgaWYgKGZyb21MZW4gPT09IDApIHJldHVybiB7IGlkLCBsYWJlbCwgZnJvbU5vZGVJZDogJycsIHRvTm9kZUlkOiAnJywgcHJvcGVydGllczoge30gfTtcclxuICBvZmZzZXQgKz0gZnJvbUxlbjtcclxuXHJcbiAgY29uc3QgW3RvTm9kZUlkLCB0b0xlbl0gPSBkZWNvZGVTdHJpbmcoZGF0YSwgb2Zmc2V0KTtcclxuICBpZiAodG9MZW4gPT09IDApIHJldHVybiB7IGlkLCBsYWJlbCwgZnJvbU5vZGVJZCwgdG9Ob2RlSWQ6ICcnLCBwcm9wZXJ0aWVzOiB7fSB9O1xyXG4gIG9mZnNldCArPSB0b0xlbjtcclxuXHJcbiAgY29uc3QgW3Byb3BlcnRpZXNdID0gZGVjb2RlUHJvcGVydGllc0JpbmFyeShkYXRhLCBvZmZzZXQpO1xyXG5cclxuICByZXR1cm4geyBpZCwgbGFiZWwsIGZyb21Ob2RlSWQsIHRvTm9kZUlkLCBwcm9wZXJ0aWVzIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvZGUgYSBwYXRoIGZyb20gYmluYXJ5IGZvcm1hdC5cclxuICogRm9ybWF0OiBbbm9kZUNvdW50OjJdW25vZGVMZW46NF1bbm9kZURhdGFdLi4uW2VkZ2VDb3VudDoyXVtlZGdlTGVuOjRdW2VkZ2VEYXRhXS4uLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVjb2RlUGF0aChkYXRhOiBCdWZmZXIpOiBHcWxkYlBhdGgge1xyXG4gIGxldCBvZmZzZXQgPSAwO1xyXG5cclxuICAvLyBEZWNvZGUgbm9kZXNcclxuICBpZiAob2Zmc2V0ICsgMiA+IGRhdGEubGVuZ3RoKSByZXR1cm4geyBub2RlczogW10sIGVkZ2VzOiBbXSB9O1xyXG4gIGNvbnN0IG5vZGVDb3VudCA9IGRhdGEucmVhZFVJbnQxNkxFKG9mZnNldCk7XHJcbiAgb2Zmc2V0ICs9IDI7XHJcblxyXG4gIGNvbnN0IG5vZGVzOiBHcWxkYk5vZGVbXSA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZUNvdW50OyBpKyspIHtcclxuICAgIGlmIChvZmZzZXQgKyA0ID4gZGF0YS5sZW5ndGgpIGJyZWFrO1xyXG4gICAgY29uc3Qgbm9kZUxlbiA9IGRhdGEucmVhZFVJbnQzMkxFKG9mZnNldCk7XHJcbiAgICBvZmZzZXQgKz0gNDtcclxuXHJcbiAgICBpZiAob2Zmc2V0ICsgbm9kZUxlbiA+IGRhdGEubGVuZ3RoKSBicmVhaztcclxuICAgIGNvbnN0IG5vZGVEYXRhID0gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIG5vZGVMZW4pO1xyXG4gICAgbm9kZXMucHVzaChkZWNvZGVOb2RlKG5vZGVEYXRhKSk7XHJcbiAgICBvZmZzZXQgKz0gbm9kZUxlbjtcclxuICB9XHJcblxyXG4gIC8vIERlY29kZSBlZGdlc1xyXG4gIGlmIChvZmZzZXQgKyAyID4gZGF0YS5sZW5ndGgpIHJldHVybiB7IG5vZGVzLCBlZGdlczogW10gfTtcclxuICBjb25zdCBlZGdlQ291bnQgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xyXG4gIG9mZnNldCArPSAyO1xyXG5cclxuICBjb25zdCBlZGdlczogR3FsZGJFZGdlW10gPSBbXTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVkZ2VDb3VudDsgaSsrKSB7XHJcbiAgICBpZiAob2Zmc2V0ICsgNCA+IGRhdGEubGVuZ3RoKSBicmVhaztcclxuICAgIGNvbnN0IGVkZ2VMZW4gPSBkYXRhLnJlYWRVSW50MzJMRShvZmZzZXQpO1xyXG4gICAgb2Zmc2V0ICs9IDQ7XHJcblxyXG4gICAgaWYgKG9mZnNldCArIGVkZ2VMZW4gPiBkYXRhLmxlbmd0aCkgYnJlYWs7XHJcbiAgICBjb25zdCBlZGdlRGF0YSA9IGRhdGEuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBlZGdlTGVuKTtcclxuICAgIGVkZ2VzLnB1c2goZGVjb2RlRWRnZShlZGdlRGF0YSkpO1xyXG4gICAgb2Zmc2V0ICs9IGVkZ2VMZW47XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyBub2RlcywgZWRnZXMgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIERlY29kZSBhIGxpc3QgZnJvbSBiaW5hcnkgZm9ybWF0LlxyXG4gKiBGb3JtYXQ6IFtjb3VudDoyIHVpbnQxNkxFXVtUeXBlZFZhbHVlRW50cnldLi4uXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWNvZGVMaXN0KGRhdGE6IEJ1ZmZlcik6IGFueVtdIHtcclxuICBpZiAoZGF0YS5sZW5ndGggPCAyKSByZXR1cm4gW107XHJcblxyXG4gIGNvbnN0IGNvdW50ID0gZGF0YS5yZWFkVUludDE2TEUoMCk7XHJcbiAgbGV0IG9mZnNldCA9IDI7XHJcbiAgY29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgIGNvbnN0IFt0diwgdHZMZW5dID0gZGVjb2RlVHlwZWRWYWx1ZUVudHJ5KGRhdGEsIG9mZnNldCk7XHJcbiAgICBpZiAodHZMZW4gPT09IDApIGJyZWFrO1xyXG4gICAgcmVzdWx0LnB1c2godHlwZWRWYWx1ZVRvSlModHYpKTtcclxuICAgIG9mZnNldCArPSB0dkxlbjtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvZGUgYSBtYXAgZnJvbSBiaW5hcnkgZm9ybWF0LlxyXG4gKiBGb3JtYXQ6IFtjb3VudDoyXVtrZXlMZW46Ml1ba2V5XVtUVkVdLi4uXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWNvZGVNYXAoZGF0YTogQnVmZmVyKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgY29uc3QgW3Jlc3VsdF0gPSBkZWNvZGVQcm9wZXJ0aWVzQmluYXJ5KGRhdGEsIDApO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvZGUgYSB0YWJsZSBmcm9tIGJpbmFyeSBmb3JtYXQuXHJcbiAqIEZvcm1hdDogW2NvbENvdW50OjJdW2NvbExlbjoyXVtjb2xdLi4uW3Jvd0NvdW50OjJdW2NlbGxDb3VudDoyXVtUVkVdLi4uXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWNvZGVUYWJsZShkYXRhOiBCdWZmZXIpOiBHcWxkYlRhYmxlIHtcclxuICBsZXQgb2Zmc2V0ID0gMDtcclxuXHJcbiAgLy8gRGVjb2RlIGNvbHVtbnNcclxuICBpZiAob2Zmc2V0ICsgMiA+IGRhdGEubGVuZ3RoKSByZXR1cm4geyBjb2x1bW5zOiBbXSwgcm93czogW10gfTtcclxuICBjb25zdCBjb2xDb3VudCA9IGRhdGEucmVhZFVJbnQxNkxFKG9mZnNldCk7XHJcbiAgb2Zmc2V0ICs9IDI7XHJcblxyXG4gIGNvbnN0IGNvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKSB7XHJcbiAgICBjb25zdCBbY29sLCBjb2xMZW5dID0gZGVjb2RlU3RyaW5nKGRhdGEsIG9mZnNldCk7XHJcbiAgICBpZiAoY29sTGVuID09PSAwKSBicmVhaztcclxuICAgIGNvbHVtbnMucHVzaChjb2wpO1xyXG4gICAgb2Zmc2V0ICs9IGNvbExlbjtcclxuICB9XHJcblxyXG4gIC8vIERlY29kZSByb3dzXHJcbiAgaWYgKG9mZnNldCArIDIgPiBkYXRhLmxlbmd0aCkgcmV0dXJuIHsgY29sdW1ucywgcm93czogW10gfTtcclxuICBjb25zdCByb3dDb3VudCA9IGRhdGEucmVhZFVJbnQxNkxFKG9mZnNldCk7XHJcbiAgb2Zmc2V0ICs9IDI7XHJcblxyXG4gIGNvbnN0IHJvd3M6IGFueVtdW10gPSBbXTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHtcclxuICAgIGlmIChvZmZzZXQgKyAyID4gZGF0YS5sZW5ndGgpIGJyZWFrO1xyXG4gICAgY29uc3QgY2VsbENvdW50ID0gZGF0YS5yZWFkVUludDE2TEUob2Zmc2V0KTtcclxuICAgIG9mZnNldCArPSAyO1xyXG5cclxuICAgIGNvbnN0IHJvdzogYW55W10gPSBbXTtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2VsbENvdW50OyBqKyspIHtcclxuICAgICAgY29uc3QgW3R2LCB0dkxlbl0gPSBkZWNvZGVUeXBlZFZhbHVlRW50cnkoZGF0YSwgb2Zmc2V0KTtcclxuICAgICAgaWYgKHR2TGVuID09PSAwKSBicmVhaztcclxuICAgICAgcm93LnB1c2godHlwZWRWYWx1ZVRvSlModHYpKTtcclxuICAgICAgb2Zmc2V0ICs9IHR2TGVuO1xyXG4gICAgfVxyXG4gICAgcm93cy5wdXNoKHJvdyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyBjb2x1bW5zLCByb3dzIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlY29kZUVycm9yKGRhdGE6IEJ1ZmZlcik6IEdxbGRiRXJyb3Ige1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBqc29uID0gZGF0YS50b1N0cmluZygndXRmLTgnKTtcclxuICAgIGNvbnN0IGVyckRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY29kZTogdHlwZW9mIGVyckRhdGEuY29kZSA9PT0gJ251bWJlcicgPyBlcnJEYXRhLmNvZGUgOiAwLFxyXG4gICAgICBtZXNzYWdlOiB0eXBlb2YgZXJyRGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGVyckRhdGEubWVzc2FnZSA6IGpzb24sXHJcbiAgICB9O1xyXG4gIH0gY2F0Y2gge1xyXG4gICAgLy8gSWYgbm90IHZhbGlkIEpTT04sIHRyZWF0IGFzIHBsYWluIG1lc3NhZ2VcclxuICAgIHJldHVybiB7IGNvZGU6IDAsIG1lc3NhZ2U6IGRhdGEudG9TdHJpbmcoJ3V0Zi04JykgfTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4vLyBFbmNvZGU6IENvbXBsZXggVHlwZXNcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbi8qKlxyXG4gKiBFbmNvZGUgYSBsaXN0IGluIGJpbmFyeSBmb3JtYXQuXHJcbiAqIEZvcm1hdDogW2NvdW50OjIgdWludDE2TEVdW1R5cGVkVmFsdWVFbnRyeV0uLi5cclxuICovXHJcbmZ1bmN0aW9uIGVuY29kZUxpc3QodmFsdWVzOiBhbnlbXSk6IFR5cGVkVmFsdWUge1xyXG4gIGNvbnN0IHBhcnRzOiBCdWZmZXJbXSA9IFtdO1xyXG5cclxuICAvLyBXcml0ZSBjb3VudFxyXG4gIGNvbnN0IGNvdW50QnVmID0gQnVmZmVyLmFsbG9jKDIpO1xyXG4gIGNvdW50QnVmLndyaXRlVUludDE2TEUodmFsdWVzLmxlbmd0aCwgMCk7XHJcbiAgcGFydHMucHVzaChjb3VudEJ1Zik7XHJcblxyXG4gIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHtcclxuICAgIGNvbnN0IHR2ID0gY3JlYXRlVHlwZWRWYWx1ZSh2KTtcclxuICAgIHBhcnRzLnB1c2goZW5jb2RlVHlwZWRWYWx1ZUVudHJ5KHR2KSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuTElTVCwgZGF0YTogQnVmZmVyLmNvbmNhdChwYXJ0cyksIGlzTnVsbDogZmFsc2UgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEVuY29kZSBhIG1hcCBpbiBiaW5hcnkgZm9ybWF0LlxyXG4gKiBGb3JtYXQ6IFtjb3VudDoyXVtrZXlMZW46Ml1ba2V5XVtUVkVdLi4uXHJcbiAqL1xyXG5mdW5jdGlvbiBlbmNvZGVNYXAobTogUmVjb3JkPHN0cmluZywgYW55Pik6IFR5cGVkVmFsdWUge1xyXG4gIGNvbnN0IHBhcnRzOiBCdWZmZXJbXSA9IFtdO1xyXG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhtKTtcclxuXHJcbiAgLy8gV3JpdGUgY291bnRcclxuICBjb25zdCBjb3VudEJ1ZiA9IEJ1ZmZlci5hbGxvYygyKTtcclxuICBjb3VudEJ1Zi53cml0ZVVJbnQxNkxFKGVudHJpZXMubGVuZ3RoLCAwKTtcclxuICBwYXJ0cy5wdXNoKGNvdW50QnVmKTtcclxuXHJcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgZW50cmllcykge1xyXG4gICAgLy8gV3JpdGUga2V5IChsZW5ndGgtcHJlZml4ZWQpXHJcbiAgICBwYXJ0cy5wdXNoKGVuY29kZVN0cmluZyhrKSk7XHJcblxyXG4gICAgLy8gV3JpdGUgdmFsdWUgYXMgVFZFXHJcbiAgICBjb25zdCB0diA9IGNyZWF0ZVR5cGVkVmFsdWUodik7XHJcbiAgICBwYXJ0cy5wdXNoKGVuY29kZVR5cGVkVmFsdWVFbnRyeSh0dikpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLk1BUCwgZGF0YTogQnVmZmVyLmNvbmNhdChwYXJ0cyksIGlzTnVsbDogZmFsc2UgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEVuY29kZSBhIHNldCBpbiBiaW5hcnkgZm9ybWF0IChzYW1lIGFzIGxpc3QpLlxyXG4gKi9cclxuZnVuY3Rpb24gZW5jb2RlU2V0KHNldDogU2V0PGFueT4pOiBUeXBlZFZhbHVlIHtcclxuICBjb25zdCB2YWx1ZXMgPSBBcnJheS5mcm9tKHNldCk7XHJcbiAgY29uc3QgcGFydHM6IEJ1ZmZlcltdID0gW107XHJcblxyXG4gIC8vIFdyaXRlIGNvdW50XHJcbiAgY29uc3QgY291bnRCdWYgPSBCdWZmZXIuYWxsb2MoMik7XHJcbiAgY291bnRCdWYud3JpdGVVSW50MTZMRSh2YWx1ZXMubGVuZ3RoLCAwKTtcclxuICBwYXJ0cy5wdXNoKGNvdW50QnVmKTtcclxuXHJcbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykge1xyXG4gICAgY29uc3QgdHYgPSBjcmVhdGVUeXBlZFZhbHVlKHYpO1xyXG4gICAgcGFydHMucHVzaChlbmNvZGVUeXBlZFZhbHVlRW50cnkodHYpKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5TRVQsIGRhdGE6IEJ1ZmZlci5jb25jYXQocGFydHMpLCBpc051bGw6IGZhbHNlIH07XHJcbn1cclxuXHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4vLyBGb3JtYXQgJiBQYXJzZTogVHlwZWRWYWx1ZSDihpQgU3RyaW5nXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vKiogUGFkIGEgbnVtYmVyIHRvIGEgZml4ZWQgd2lkdGggd2l0aCBsZWFkaW5nIHplcm9zICovXHJcbmZ1bmN0aW9uIHBhZChuOiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIHJldHVybiBuLnRvU3RyaW5nKCkucGFkU3RhcnQod2lkdGgsICcwJyk7XHJcbn1cclxuXHJcbi8qKiBGb3JtYXQgbmFub3NlY29uZHMsIHRyaW1taW5nIHRyYWlsaW5nIHplcm9zLiBSZXR1cm5zIGVtcHR5IHN0cmluZyBpZiB6ZXJvLiAqL1xyXG5mdW5jdGlvbiBmb3JtYXROYW5vcyhuYW5vczogbnVtYmVyKTogc3RyaW5nIHtcclxuICBpZiAobmFub3MgPT09IDApIHJldHVybiAnJztcclxuICBjb25zdCBzID0gbmFub3MudG9TdHJpbmcoKS5wYWRTdGFydCg5LCAnMCcpO1xyXG4gIHJldHVybiAnLicgKyBzLnJlcGxhY2UoLzArJC8sICcnKTtcclxufVxyXG5cclxuLyoqIEZvcm1hdCBhbiBvZmZzZXQgaW4gbWludXRlcyBhcyBcIitISDpNTVwiIG9yIFwiLUhIOk1NXCIgKi9cclxuZnVuY3Rpb24gZm9ybWF0T2Zmc2V0KG9mZnNldE1pbnV0ZXM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3Qgc2lnbiA9IG9mZnNldE1pbnV0ZXMgPCAwID8gJy0nIDogJysnO1xyXG4gIGNvbnN0IGFicyA9IE1hdGguYWJzKG9mZnNldE1pbnV0ZXMpO1xyXG4gIGNvbnN0IGggPSBNYXRoLmZsb29yKGFicyAvIDYwKTtcclxuICBjb25zdCBtID0gYWJzICUgNjA7XHJcbiAgcmV0dXJuIGAke3NpZ259JHtwYWQoaCwgMil9OiR7cGFkKG0sIDIpfWA7XHJcbn1cclxuXHJcbi8qKiBTZXJpYWxpemUgYSBUeXBlZFZhbHVlIHRvIGl0cyBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh0djogVHlwZWRWYWx1ZSk6IHN0cmluZyB7XHJcbiAgaWYgKHR2LmlzTnVsbCB8fCB0di50eXBlID09PSBQcm9wZXJ0eVR5cGUuTlVMTCkge1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgc3dpdGNoICh0di50eXBlKSB7XHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5CT09MOlxyXG4gICAgICByZXR1cm4gdHYuZGF0YS5sZW5ndGggPj0gMSAmJiB0di5kYXRhLnJlYWRVSW50OCgwKSAhPT0gMCA/ICd0cnVlJyA6ICdmYWxzZSc7XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuSU5UMzI6XHJcbiAgICAgIHJldHVybiB0di5kYXRhLmxlbmd0aCA+PSA0ID8gdHYuZGF0YS5yZWFkSW50MzJMRSgwKS50b1N0cmluZygpIDogJzAnO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlVJTlQzMjpcclxuICAgICAgcmV0dXJuIHR2LmRhdGEubGVuZ3RoID49IDQgPyB0di5kYXRhLnJlYWRVSW50MzJMRSgwKS50b1N0cmluZygpIDogJzAnO1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLklOVDY0OiB7XHJcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDgpIHJldHVybiAnMCc7XHJcbiAgICAgIHJldHVybiB0di5kYXRhLnJlYWRCaWdJbnQ2NExFKDApLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuVUlOVDY0OiB7XHJcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDgpIHJldHVybiAnMCc7XHJcbiAgICAgIHJldHVybiB0di5kYXRhLnJlYWRCaWdVSW50NjRMRSgwKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkZMT0FUOlxyXG4gICAgICByZXR1cm4gdHYuZGF0YS5sZW5ndGggPj0gNCA/IHR2LmRhdGEucmVhZEZsb2F0TEUoMCkudG9TdHJpbmcoKSA6ICcwJztcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5ET1VCTEU6XHJcbiAgICAgIHJldHVybiB0di5kYXRhLmxlbmd0aCA+PSA4ID8gdHYuZGF0YS5yZWFkRG91YmxlTEUoMCkudG9TdHJpbmcoKSA6ICcwJztcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5TVFJJTkc6XHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5URVhUOlxyXG4gICAgICByZXR1cm4gdHYuZGF0YS50b1N0cmluZygndXRmLTgnKTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5ERUNJTUFMOlxyXG4gICAgICByZXR1cm4gdHYuZGF0YS50b1N0cmluZygndXRmLTgnKTtcclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5EQVRFOiB7XHJcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDQpIHJldHVybiAnMDAwMC0wMC0wMCc7XHJcbiAgICAgIGNvbnN0IHkgPSB0di5kYXRhLnJlYWRVSW50MTZMRSgwKTtcclxuICAgICAgY29uc3QgbSA9IHR2LmRhdGEucmVhZFVJbnQ4KDIpO1xyXG4gICAgICBjb25zdCBkID0gdHYuZGF0YS5yZWFkVUludDgoMyk7XHJcbiAgICAgIHJldHVybiBgJHtwYWQoeSwgNCl9LSR7cGFkKG0sIDIpfS0ke3BhZChkLCAyKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkxPQ0FMX1RJTUU6IHtcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoIDwgOCkgcmV0dXJuICcwMDowMDowMCc7XHJcbiAgICAgIGNvbnN0IGggPSB0di5kYXRhLnJlYWRVSW50OCgwKTtcclxuICAgICAgY29uc3QgbSA9IHR2LmRhdGEucmVhZFVJbnQ4KDEpO1xyXG4gICAgICBjb25zdCBzID0gdHYuZGF0YS5yZWFkVUludDgoMik7XHJcbiAgICAgIGNvbnN0IG5zID0gdHYuZGF0YS5yZWFkVUludDMyTEUoNCk7XHJcbiAgICAgIHJldHVybiBgJHtwYWQoaCwgMil9OiR7cGFkKG0sIDIpfToke3BhZChzLCAyKX0ke2Zvcm1hdE5hbm9zKG5zKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlpPTkVEX1RJTUU6IHtcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoIDwgMTApIHJldHVybiAnMDA6MDA6MDArMDA6MDAnO1xyXG4gICAgICBjb25zdCBoID0gdHYuZGF0YS5yZWFkVUludDgoMCk7XHJcbiAgICAgIGNvbnN0IG0gPSB0di5kYXRhLnJlYWRVSW50OCgxKTtcclxuICAgICAgY29uc3QgcyA9IHR2LmRhdGEucmVhZFVJbnQ4KDIpO1xyXG4gICAgICBjb25zdCBucyA9IHR2LmRhdGEucmVhZFVJbnQzMkxFKDQpO1xyXG4gICAgICBjb25zdCBvZmYgPSB0di5kYXRhLnJlYWRJbnQxNkxFKDgpO1xyXG4gICAgICByZXR1cm4gYCR7cGFkKGgsIDIpfToke3BhZChtLCAyKX06JHtwYWQocywgMil9JHtmb3JtYXROYW5vcyhucyl9JHtmb3JtYXRPZmZzZXQob2ZmKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkxPQ0FMX0RBVEVUSU1FOlxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuREFURVRJTUU6IHtcclxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoIDwgMTEpIHJldHVybiAnMDAwMC0wMC0wMCAwMDowMDowMCc7XHJcbiAgICAgIGNvbnN0IHkgPSB0di5kYXRhLnJlYWRVSW50MTZMRSgwKTtcclxuICAgICAgY29uc3QgbW8gPSB0di5kYXRhLnJlYWRVSW50OCgyKTtcclxuICAgICAgY29uc3QgZCA9IHR2LmRhdGEucmVhZFVJbnQ4KDMpO1xyXG4gICAgICBjb25zdCBoID0gdHYuZGF0YS5yZWFkVUludDgoNCk7XHJcbiAgICAgIGNvbnN0IG1pID0gdHYuZGF0YS5yZWFkVUludDgoNSk7XHJcbiAgICAgIGNvbnN0IHMgPSB0di5kYXRhLnJlYWRVSW50OCg2KTtcclxuICAgICAgY29uc3QgbnMgPSB0di5kYXRhLnJlYWRVSW50MzJMRSg3KTtcclxuICAgICAgcmV0dXJuIGAke3BhZCh5LCA0KX0tJHtwYWQobW8sIDIpfS0ke3BhZChkLCAyKX0gJHtwYWQoaCwgMil9OiR7cGFkKG1pLCAyKX06JHtwYWQocywgMil9JHtmb3JtYXROYW5vcyhucyl9YDtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5aT05FRF9EQVRFVElNRToge1xyXG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPCAxMykgcmV0dXJuICcwMDAwLTAwLTAwIDAwOjAwOjAwKzAwOjAwJztcclxuICAgICAgY29uc3QgeSA9IHR2LmRhdGEucmVhZFVJbnQxNkxFKDApO1xyXG4gICAgICBjb25zdCBtbyA9IHR2LmRhdGEucmVhZFVJbnQ4KDIpO1xyXG4gICAgICBjb25zdCBkID0gdHYuZGF0YS5yZWFkVUludDgoMyk7XHJcbiAgICAgIGNvbnN0IGggPSB0di5kYXRhLnJlYWRVSW50OCg0KTtcclxuICAgICAgY29uc3QgbWkgPSB0di5kYXRhLnJlYWRVSW50OCg1KTtcclxuICAgICAgY29uc3QgcyA9IHR2LmRhdGEucmVhZFVJbnQ4KDYpO1xyXG4gICAgICBjb25zdCBucyA9IHR2LmRhdGEucmVhZFVJbnQzMkxFKDcpO1xyXG4gICAgICBjb25zdCBvZmYgPSB0di5kYXRhLnJlYWRJbnQxNkxFKDExKTtcclxuICAgICAgcmV0dXJuIGAke3BhZCh5LCA0KX0tJHtwYWQobW8sIDIpfS0ke3BhZChkLCAyKX0gJHtwYWQoaCwgMil9OiR7cGFkKG1pLCAyKX06JHtwYWQocywgMil9JHtmb3JtYXROYW5vcyhucyl9JHtmb3JtYXRPZmZzZXQob2ZmKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlRJTUVTVEFNUDoge1xyXG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPCAxMikgcmV0dXJuICcwMDAwLTAwLTAwIDAwOjAwOjAwJztcclxuICAgICAgY29uc3Qgc2VjcyA9IE51bWJlcih0di5kYXRhLnJlYWRCaWdJbnQ2NExFKDApKTtcclxuICAgICAgY29uc3QgbnMgPSB0di5kYXRhLnJlYWRVSW50MzJMRSg4KTtcclxuICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShzZWNzICogMTAwMCArIE1hdGguZmxvb3IobnMgLyAxXzAwMF8wMDApKTtcclxuICAgICAgY29uc3QgeSA9IGR0LmdldFVUQ0Z1bGxZZWFyKCk7XHJcbiAgICAgIGNvbnN0IG1vID0gZHQuZ2V0VVRDTW9udGgoKSArIDE7XHJcbiAgICAgIGNvbnN0IGQgPSBkdC5nZXRVVENEYXRlKCk7XHJcbiAgICAgIGNvbnN0IGggPSBkdC5nZXRVVENIb3VycygpO1xyXG4gICAgICBjb25zdCBtaSA9IGR0LmdldFVUQ01pbnV0ZXMoKTtcclxuICAgICAgY29uc3QgcyA9IGR0LmdldFVUQ1NlY29uZHMoKTtcclxuICAgICAgcmV0dXJuIGAke3BhZCh5LCA0KX0tJHtwYWQobW8sIDIpfS0ke3BhZChkLCAyKX0gJHtwYWQoaCwgMil9OiR7cGFkKG1pLCAyKX06JHtwYWQocywgMil9JHtmb3JtYXROYW5vcyhucyl9YDtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5ZRUFSX1RPX01PTlRIOiB7XHJcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDQpIHJldHVybiAnUDBNJztcclxuICAgICAgY29uc3QgdG90YWxNb250aHMgPSB0di5kYXRhLnJlYWRJbnQzMkxFKDApO1xyXG4gICAgICBpZiAodG90YWxNb250aHMgPT09IDApIHJldHVybiAnUDBNJztcclxuICAgICAgY29uc3QgbmVnYXRpdmUgPSB0b3RhbE1vbnRocyA8IDA7XHJcbiAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzKHRvdGFsTW9udGhzKTtcclxuICAgICAgY29uc3QgeWVhcnMgPSBNYXRoLmZsb29yKGFicyAvIDEyKTtcclxuICAgICAgY29uc3QgbW9udGhzID0gYWJzICUgMTI7XHJcbiAgICAgIGxldCByZXN1bHQgPSBuZWdhdGl2ZSA/ICctUCcgOiAnUCc7XHJcbiAgICAgIGlmICh5ZWFycyA+IDApIHJlc3VsdCArPSBgJHt5ZWFyc31ZYDtcclxuICAgICAgaWYgKG1vbnRocyA+IDApIHJlc3VsdCArPSBgJHttb250aHN9TWA7XHJcbiAgICAgIC8vIElmIG9ubHkgeWVhcnMgYW5kIG5vIG1vbnRocywgdGhhdCdzIGZpbmUgKGUuZy4gXCJQMllcIilcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5EQVlfVE9fU0VDT05EOiB7XHJcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDEyKSByZXR1cm4gJ1BUMFMnO1xyXG4gICAgICBjb25zdCB0b3RhbFNlYyA9IE51bWJlcih0di5kYXRhLnJlYWRCaWdVSW50NjRMRSgwKSk7XHJcbiAgICAgIGNvbnN0IG5hbm9zID0gdHYuZGF0YS5yZWFkVUludDMyTEUoOCk7XHJcbiAgICAgIGlmICh0b3RhbFNlYyA9PT0gMCAmJiBuYW5vcyA9PT0gMCkgcmV0dXJuICdQVDBTJztcclxuXHJcbiAgICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHRvdGFsU2VjIC8gODY0MDApO1xyXG4gICAgICBjb25zdCByZW0gPSB0b3RhbFNlYyAlIDg2NDAwO1xyXG4gICAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IocmVtIC8gMzYwMCk7XHJcbiAgICAgIGNvbnN0IHJlbTIgPSByZW0gJSAzNjAwO1xyXG4gICAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcihyZW0yIC8gNjApO1xyXG4gICAgICBjb25zdCBzZWNzID0gcmVtMiAlIDYwO1xyXG5cclxuICAgICAgbGV0IHJlc3VsdCA9ICdQJztcclxuICAgICAgaWYgKGRheXMgPiAwKSByZXN1bHQgKz0gYCR7ZGF5c31EYDtcclxuICAgICAgaWYgKGhvdXJzID4gMCB8fCBtaW5zID4gMCB8fCBzZWNzID4gMCB8fCBuYW5vcyA+IDApIHtcclxuICAgICAgICByZXN1bHQgKz0gJ1QnO1xyXG4gICAgICAgIGlmIChob3VycyA+IDApIHJlc3VsdCArPSBgJHtob3Vyc31IYDtcclxuICAgICAgICBpZiAobWlucyA+IDApIHJlc3VsdCArPSBgJHttaW5zfU1gO1xyXG4gICAgICAgIGlmIChzZWNzID4gMCB8fCBuYW5vcyA+IDApIHtcclxuICAgICAgICAgIGlmIChuYW5vcyA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZnJhY1N0ciA9IG5hbm9zLnRvU3RyaW5nKCkucGFkU3RhcnQoOSwgJzAnKS5yZXBsYWNlKC8wKyQvLCAnJyk7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBgJHtzZWNzfS4ke2ZyYWNTdHJ9U2A7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gYCR7c2Vjc31TYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gdHYuZGF0YS50b1N0cmluZygndXRmLTgnKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4vKiogUGFyc2UgYW4gb2Zmc2V0IHN0cmluZyBsaWtlIFwiKzA1OjMwXCIgb3IgXCItMDg6MDBcIiBpbnRvIG1pbnV0ZXMgKi9cclxuZnVuY3Rpb24gcGFyc2VPZmZzZXQoczogc3RyaW5nKTogbnVtYmVyIHtcclxuICBjb25zdCBzaWduID0gc1swXSA9PT0gJy0nID8gLTEgOiAxO1xyXG4gIGNvbnN0IHBhcnRzID0gcy5zdWJzdHJpbmcoMSkuc3BsaXQoJzonKTtcclxuICByZXR1cm4gc2lnbiAqIChwYXJzZUludChwYXJ0c1swXSwgMTApICogNjAgKyBwYXJzZUludChwYXJ0c1sxXSwgMTApKTtcclxufVxyXG5cclxuLyoqIFBhcnNlIGEgc3RyaW5nIGludG8gYSBUeXBlZFZhbHVlIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0IHR5cGUgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmcoczogc3RyaW5nLCB0YXJnZXRUeXBlOiBQcm9wZXJ0eVR5cGUpOiBUeXBlZFZhbHVlIHtcclxuICBpZiAocyA9PT0gJycpIHtcclxuICAgIHJldHVybiB7IHR5cGU6IHRhcmdldFR5cGUsIGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgaXNOdWxsOiB0cnVlIH07XHJcbiAgfVxyXG5cclxuICBzd2l0Y2ggKHRhcmdldFR5cGUpIHtcclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkJPT0w6IHtcclxuICAgICAgY29uc3QgdmFsID0gcy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMSk7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50OCh2YWwgPyAxIDogMCwgMCk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5CT09MLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuSU5UMzI6IHtcclxuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg0KTtcclxuICAgICAgZGF0YS53cml0ZUludDMyTEUocGFyc2VJbnQocywgMTApLCAwKTtcclxuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLklOVDMyLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuVUlOVDMyOiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoNCk7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50MzJMRShwYXJzZUludChzLCAxMCkgPj4+IDAsIDApO1xyXG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVUlOVDMyLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuSU5UNjQ6IHtcclxuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcclxuICAgICAgZGF0YS53cml0ZUJpZ0ludDY0TEUoQmlnSW50KHMpLCAwKTtcclxuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLklOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuVUlOVDY0OiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCk7XHJcbiAgICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRShCaWdJbnQocyksIDApO1xyXG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVUlOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuRkxPQVQ6IHtcclxuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg0KTtcclxuICAgICAgZGF0YS53cml0ZUZsb2F0TEUocGFyc2VGbG9hdChzKSwgMCk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5GTE9BVCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRPVUJMRToge1xyXG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgpO1xyXG4gICAgICBkYXRhLndyaXRlRG91YmxlTEUocGFyc2VGbG9hdChzKSwgMCk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5ET1VCTEUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5TVFJJTkc6XHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5URVhUOlxyXG4gICAgICByZXR1cm4geyB0eXBlOiB0YXJnZXRUeXBlLCBkYXRhOiBCdWZmZXIuZnJvbShzLCAndXRmLTgnKSwgaXNOdWxsOiBmYWxzZSB9O1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRFQ0lNQUw6XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5ERUNJTUFMLCBkYXRhOiBCdWZmZXIuZnJvbShzLCAndXRmLTgnKSwgaXNOdWxsOiBmYWxzZSB9O1xyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRBVEU6IHtcclxuICAgICAgLy8gXCJ5eXl5LU1NLWRkXCJcclxuICAgICAgY29uc3QgcGFydHMgPSBzLnNwbGl0KCctJyk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCk7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50MTZMRShwYXJzZUludChwYXJ0c1swXSwgMTApLCAwKTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQ4KHBhcnNlSW50KHBhcnRzWzFdLCAxMCksIDIpO1xyXG4gICAgICBkYXRhLndyaXRlVUludDgocGFyc2VJbnQocGFydHNbMl0sIDEwKSwgMyk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5EQVRFLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuTE9DQUxfVElNRToge1xyXG4gICAgICAvLyBcIkhIOm1tOnNzWy5ubm5ubm5ubm5dXCIg4oCUIHN0cmlwIGFueSB0cmFpbGluZyBvZmZzZXQgb3IgWiwga2VlcCBsb2NhbCB0aW1lIG9ubHlcclxuICAgICAgY29uc3QgY2xlYW5lZCA9IHJlbW92ZU9mZnNldChzKTtcclxuICAgICAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbmFub3NlY29uZCB9ID0gcGFyc2VUaW1lU3RyaW5nKGNsZWFuZWQpO1xyXG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgpO1xyXG4gICAgICBkYXRhLndyaXRlVUludDgoaG91ciwgMCk7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50OChtaW51dGUsIDEpO1xyXG4gICAgICBkYXRhLndyaXRlVUludDgoc2Vjb25kLCAyKTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKG5hbm9zZWNvbmQsIDQpO1xyXG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuTE9DQUxfVElNRSwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlpPTkVEX1RJTUU6IHtcclxuICAgICAgLy8gXCJISDptbTpzc1subl0rSEg6TU1cIlxyXG4gICAgICBjb25zdCB7IHRpbWVQYXJ0LCBvZmZzZXRQYXJ0IH0gPSBzcGxpdFRpbWVBbmRPZmZzZXQocyk7XHJcbiAgICAgIGNvbnN0IHsgaG91ciwgbWludXRlLCBzZWNvbmQsIG5hbm9zZWNvbmQgfSA9IHBhcnNlVGltZVN0cmluZyh0aW1lUGFydCk7XHJcbiAgICAgIGNvbnN0IG9mZk1pbiA9IHBhcnNlT2Zmc2V0KG9mZnNldFBhcnQpO1xyXG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEwKTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQ4KGhvdXIsIDApO1xyXG4gICAgICBkYXRhLndyaXRlVUludDgobWludXRlLCAxKTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQ4KHNlY29uZCwgMik7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50MzJMRShuYW5vc2Vjb25kLCA0KTtcclxuICAgICAgZGF0YS53cml0ZUludDE2TEUob2ZmTWluLCA4KTtcclxuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlpPTkVEX1RJTUUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5MT0NBTF9EQVRFVElNRTpcclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRBVEVUSU1FOiB7XHJcbiAgICAgIC8vIFwieXl5eS1NTS1kZCBISDptbTpzc1subl1cIiDigJQgc3RyaXAgYW55IHRyYWlsaW5nIG9mZnNldCBvciBaLCBrZWVwIGxvY2FsIHRpbWUgb25seVxyXG4gICAgICAvLyBOb3JtYWxpemUgVCBzZXBhcmF0b3IgdG8gc3BhY2VcclxuICAgICAgY29uc3QgY2xlYW5lZCA9IHJlbW92ZU9mZnNldChzLnJlcGxhY2UoJ1QnLCAnICcpKTtcclxuICAgICAgY29uc3Qgc3BhY2VJZHggPSBjbGVhbmVkLmluZGV4T2YoJyAnKTtcclxuICAgICAgY29uc3QgZGF0ZVBhcnQgPSBjbGVhbmVkLnN1YnN0cmluZygwLCBzcGFjZUlkeCk7XHJcbiAgICAgIGNvbnN0IHRpbWVQYXJ0ID0gY2xlYW5lZC5zdWJzdHJpbmcoc3BhY2VJZHggKyAxKTtcclxuICAgICAgY29uc3QgZHAgPSBkYXRlUGFydC5zcGxpdCgnLScpO1xyXG4gICAgICBjb25zdCB7IGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBuYW5vc2Vjb25kIH0gPSBwYXJzZVRpbWVTdHJpbmcodGltZVBhcnQpO1xyXG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDExKTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKHBhcnNlSW50KGRwWzBdLCAxMCksIDApO1xyXG4gICAgICBkYXRhLndyaXRlVUludDgocGFyc2VJbnQoZHBbMV0sIDEwKSwgMik7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50OChwYXJzZUludChkcFsyXSwgMTApLCAzKTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQ4KGhvdXIsIDQpO1xyXG4gICAgICBkYXRhLndyaXRlVUludDgobWludXRlLCA1KTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQ4KHNlY29uZCwgNik7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50MzJMRShuYW5vc2Vjb25kLCA3KTtcclxuICAgICAgcmV0dXJuIHsgdHlwZTogdGFyZ2V0VHlwZSwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlpPTkVEX0RBVEVUSU1FOiB7XHJcbiAgICAgIC8vIFwieXl5eS1NTS1kZCBISDptbTpzc1subl0rSEg6TU1cIiDigJQgYWxzbyBzdXBwb3J0cyBUIHNlcGFyYXRvciwgWiBzdWZmaXgsIHNwYWNlLXNlcGFyYXRlZCBvZmZzZXRcclxuICAgICAgY29uc3Qgbm9ybSA9IG5vcm1hbGl6ZU9mZnNldChzLnJlcGxhY2UoJ1QnLCAnICcpKTtcclxuICAgICAgY29uc3Qgc3BhY2VJZHggPSBub3JtLmluZGV4T2YoJyAnKTtcclxuICAgICAgY29uc3QgZGF0ZVBhcnQgPSBub3JtLnN1YnN0cmluZygwLCBzcGFjZUlkeCk7XHJcbiAgICAgIGNvbnN0IHJlc3QgPSBub3JtLnN1YnN0cmluZyhzcGFjZUlkeCArIDEpO1xyXG4gICAgICBjb25zdCB7IHRpbWVQYXJ0LCBvZmZzZXRQYXJ0IH0gPSBzcGxpdFRpbWVBbmRPZmZzZXQocmVzdCk7XHJcbiAgICAgIGNvbnN0IGRwID0gZGF0ZVBhcnQuc3BsaXQoJy0nKTtcclxuICAgICAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbmFub3NlY29uZCB9ID0gcGFyc2VUaW1lU3RyaW5nKHRpbWVQYXJ0KTtcclxuICAgICAgY29uc3Qgb2ZmTWluID0gcGFyc2VPZmZzZXQob2Zmc2V0UGFydCk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTMpO1xyXG4gICAgICBkYXRhLndyaXRlVUludDE2TEUocGFyc2VJbnQoZHBbMF0sIDEwKSwgMCk7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50OChwYXJzZUludChkcFsxXSwgMTApLCAyKTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQ4KHBhcnNlSW50KGRwWzJdLCAxMCksIDMpO1xyXG4gICAgICBkYXRhLndyaXRlVUludDgoaG91ciwgNCk7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50OChtaW51dGUsIDUpO1xyXG4gICAgICBkYXRhLndyaXRlVUludDgoc2Vjb25kLCA2KTtcclxuICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKG5hbm9zZWNvbmQsIDcpO1xyXG4gICAgICBkYXRhLndyaXRlSW50MTZMRShvZmZNaW4sIDExKTtcclxuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlpPTkVEX0RBVEVUSU1FLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuVElNRVNUQU1QOiB7XHJcbiAgICAgIC8vIFN1cHBvcnQgZXBvY2ggc2Vjb25kcyBsaWtlIFwiMTcxNTE2OTYwMFwiIG9yIFwieXl5eS1NTS1kZCBISDptbTpzc1subl1cIlxyXG4gICAgICBpZiAoL15cXGQrJC8udGVzdChzKSkge1xyXG4gICAgICAgIC8vIEVwb2NoIHNlY29uZHNcclxuICAgICAgICBjb25zdCBlcG9jaCA9IHBhcnNlSW50KHMsIDEwKTtcclxuICAgICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEyKTtcclxuICAgICAgICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQoZXBvY2gpLCAwKTtcclxuICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoMCwgOCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlRJTUVTVEFNUCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFwieXl5eS1NTS1kZCBISDptbTpzc1subl1cIiBvciBcInl5eXktTU0tZGRUSEg6bW06c3NbLm5dWystXUhIOk1NXCIgLyBcIlsrLV1ISE1NXCIgLyBcIlpcIlxyXG4gICAgICAvLyBBbHNvIHN1cHBvcnRzIHNwYWNlLXNlcGFyYXRlZCBvZmZzZXQ6IFwiMjAyNC0wNi0xNSAxNDozMDowMCArMDg6MDBcIlxyXG4gICAgICAvLyBOb3JtYWxpemUgVCBzZXBhcmF0b3IgdG8gc3BhY2VcclxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHMucmVwbGFjZSgnVCcsICcgJyk7XHJcblxyXG4gICAgICAvLyBDaGVjayBmb3IgWiBzdWZmaXgg4oaSIHRyZWF0IGFzICswMDowMFxyXG4gICAgICBjb25zdCBoYXNaID0gbm9ybWFsaXplZC5lbmRzV2l0aCgnWicpIHx8IG5vcm1hbGl6ZWQuZW5kc1dpdGgoJ3onKTtcclxuXHJcbiAgICAgIC8vIE5vcm1hbGl6ZSBzcGFjZS1zZXBhcmF0ZWQgb2Zmc2V0czogXCIgKzA4OjAwXCIg4oaSIFwiKzA4OjAwXCJcclxuICAgICAgLy8gQWxzbyBub3JtYWxpemUgWiB0byArMDA6MDBcclxuICAgICAgbGV0IHByb2Nlc3NlZCA9IG5vcm1hbGl6ZWQ7XHJcbiAgICAgIGlmIChoYXNaKSB7XHJcbiAgICAgICAgcHJvY2Vzc2VkID0gbm9ybWFsaXplZC5zbGljZSgwLCAtMSkgKyAnKzAwOjAwJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBDb2xsYXBzZSBzcGFjZSBiZWZvcmUgb2Zmc2V0IChvbmx5IGluIGxhc3QgfjEwIGNoYXJzIHRvIGF2b2lkIGRhdGUgaHlwaGVucylcclxuICAgICAgICBjb25zdCBzcGFjZU9mZk1hdGNoID0gcHJvY2Vzc2VkLm1hdGNoKC9eKC4rPylcXHMrKFsrLV1cXGR7Mn06P1xcZHsyfSkkLyk7XHJcbiAgICAgICAgaWYgKHNwYWNlT2ZmTWF0Y2gpIHtcclxuICAgICAgICAgIHByb2Nlc3NlZCA9IHNwYWNlT2ZmTWF0Y2hbMV0gKyBzcGFjZU9mZk1hdGNoWzJdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2VwSWR4ID0gcHJvY2Vzc2VkLmluZGV4T2YoJyAnKTtcclxuICAgICAgY29uc3QgZGF0ZVBhcnQgPSBwcm9jZXNzZWQuc3Vic3RyaW5nKDAsIHNlcElkeCk7XHJcbiAgICAgIGNvbnN0IHJlc3QgPSBwcm9jZXNzZWQuc3Vic3RyaW5nKHNlcElkeCArIDEpO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgZm9yIHRpbWV6b25lIG9mZnNldDogK0hIOk1NLCAtSEg6TU0sICtISE1NLCAtSEhNTSBhdCB0aGUgZW5kXHJcbiAgICAgIGNvbnN0IG9mZnNldE1hdGNoID0gcmVzdC5tYXRjaCgvKFsrLV0pKFxcZHsyfSk6PyhcXGR7Mn0pJC8pO1xyXG4gICAgICBpZiAob2Zmc2V0TWF0Y2gpIHtcclxuICAgICAgICBjb25zdCB0aW1lUGFydCA9IHJlc3Quc3Vic3RyaW5nKDAsIG9mZnNldE1hdGNoLmluZGV4ISk7XHJcbiAgICAgICAgY29uc3Qgc2lnbiA9IG9mZnNldE1hdGNoWzFdID09PSAnLScgPyAtMSA6IDE7XHJcbiAgICAgICAgY29uc3Qgb2ZmSG91cnMgPSBwYXJzZUludChvZmZzZXRNYXRjaFsyXSwgMTApO1xyXG4gICAgICAgIGNvbnN0IG9mZk1pbnMgPSBwYXJzZUludChvZmZzZXRNYXRjaFszXSwgMTApO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IHNpZ24gKiAob2ZmSG91cnMgKiA2MCArIG9mZk1pbnMpO1xyXG5cclxuICAgICAgICBjb25zdCBkcCA9IGRhdGVQYXJ0LnNwbGl0KCctJyk7XHJcbiAgICAgICAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbmFub3NlY29uZCB9ID0gcGFyc2VUaW1lU3RyaW5nKHRpbWVQYXJ0KTtcclxuXHJcbiAgICAgICAgLy8gQ29udmVydCB0byBVVEMgYnkgc3VidHJhY3RpbmcgdGhlIG9mZnNldFxyXG4gICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShEYXRlLlVUQyhcclxuICAgICAgICAgIHBhcnNlSW50KGRwWzBdLCAxMCksIHBhcnNlSW50KGRwWzFdLCAxMCkgLSAxLCBwYXJzZUludChkcFsyXSwgMTApLFxyXG4gICAgICAgICAgaG91ciwgbWludXRlIC0gb2Zmc2V0VG90YWxNaW51dGVzLCBzZWNvbmRcclxuICAgICAgICApKTtcclxuXHJcbiAgICAgICAgY29uc3QgdW5peFNlY3MgPSBCaWdJbnQoTWF0aC5mbG9vcihkLmdldFRpbWUoKSAvIDEwMDApKTtcclxuICAgICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEyKTtcclxuICAgICAgICBkYXRhLndyaXRlQmlnSW50NjRMRSh1bml4U2VjcywgMCk7XHJcbiAgICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKG5hbm9zZWNvbmQsIDgpO1xyXG4gICAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5USU1FU1RBTVAsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gTm8gb2Zmc2V0IOKAlCB0cmVhdCBhcyBsb2NhbCBkYXRldGltZSAoY29udmVydCB0byBVVEMgdXNpbmcgRGF0ZS5VVEMpXHJcbiAgICAgIGNvbnN0IGRwID0gZGF0ZVBhcnQuc3BsaXQoJy0nKTtcclxuICAgICAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbmFub3NlY29uZCB9ID0gcGFyc2VUaW1lU3RyaW5nKHJlc3QpO1xyXG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoRGF0ZS5VVEMoXHJcbiAgICAgICAgcGFyc2VJbnQoZHBbMF0sIDEwKSwgcGFyc2VJbnQoZHBbMV0sIDEwKSAtIDEsIHBhcnNlSW50KGRwWzJdLCAxMCksXHJcbiAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmRcclxuICAgICAgKSk7XHJcbiAgICAgIGNvbnN0IHVuaXhTZWNzID0gQmlnSW50KE1hdGguZmxvb3IoZC5nZXRUaW1lKCkgLyAxMDAwKSk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTIpO1xyXG4gICAgICBkYXRhLndyaXRlQmlnSW50NjRMRSh1bml4U2VjcywgMCk7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50MzJMRShuYW5vc2Vjb25kLCA4KTtcclxuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlRJTUVTVEFNUCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgUHJvcGVydHlUeXBlLllFQVJfVE9fTU9OVEg6IHtcclxuICAgICAgLy8gSVNPLTg2MDE6IFwiUDJZNU1cIiwgXCJQME1cIiwgXCItUDFZNU1cIlxyXG4gICAgICBjb25zdCBuZWdhdGl2ZSA9IHMuc3RhcnRzV2l0aCgnLScpO1xyXG4gICAgICBjb25zdCBib2R5ID0gbmVnYXRpdmUgPyBzLnN1YnN0cmluZygyKSA6IHMuc3Vic3RyaW5nKDEpOyAvLyBza2lwIFAgb3IgLVBcclxuICAgICAgbGV0IHllYXJzID0gMDtcclxuICAgICAgbGV0IG1vbnRocyA9IDA7XHJcbiAgICAgIGNvbnN0IHltID0gYm9keS5tYXRjaCgvKFxcZCspWS8pO1xyXG4gICAgICBpZiAoeW0pIHllYXJzID0gcGFyc2VJbnQoeW1bMV0sIDEwKTtcclxuICAgICAgY29uc3QgbW0gPSBib2R5Lm1hdGNoKC8oXFxkKylNLyk7XHJcbiAgICAgIGlmIChtbSkgbW9udGhzID0gcGFyc2VJbnQobW1bMV0sIDEwKTtcclxuICAgICAgY29uc3QgdG90YWwgPSAoeWVhcnMgKiAxMiArIG1vbnRocykgKiAobmVnYXRpdmUgPyAtMSA6IDEpO1xyXG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDQpO1xyXG4gICAgICBkYXRhLndyaXRlSW50MzJMRSh0b3RhbCwgMCk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5ZRUFSX1RPX01PTlRILCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuREFZX1RPX1NFQ09ORDoge1xyXG4gICAgICAvLyBJU08tODYwMTogXCJQM0RUNEhcIiwgXCJQVDBTXCIsIFwiUDFEVDJIM000LjEyU1wiXHJcbiAgICAgIGNvbnN0IGJvZHkgPSBzLnN1YnN0cmluZygxKTsgLy8gc2tpcCBQXHJcbiAgICAgIGxldCBkYXlzID0gMDtcclxuICAgICAgbGV0IGhvdXJzID0gMDtcclxuICAgICAgbGV0IG1pbnMgPSAwO1xyXG4gICAgICBsZXQgc2VjcyA9IDA7XHJcbiAgICAgIGxldCBuYW5vcyA9IDA7XHJcblxyXG4gICAgICBjb25zdCB0SWR4ID0gYm9keS5pbmRleE9mKCdUJyk7XHJcbiAgICAgIGNvbnN0IGRhdGVQYXJ0MiA9IHRJZHggPj0gMCA/IGJvZHkuc3Vic3RyaW5nKDAsIHRJZHgpIDogYm9keTtcclxuICAgICAgY29uc3QgdGltZVBhcnQyID0gdElkeCA+PSAwID8gYm9keS5zdWJzdHJpbmcodElkeCArIDEpIDogJyc7XHJcblxyXG4gICAgICBjb25zdCBkbSA9IGRhdGVQYXJ0Mi5tYXRjaCgvKFxcZCspRC8pO1xyXG4gICAgICBpZiAoZG0pIGRheXMgPSBwYXJzZUludChkbVsxXSwgMTApO1xyXG5cclxuICAgICAgaWYgKHRpbWVQYXJ0Mikge1xyXG4gICAgICAgIGNvbnN0IGhtID0gdGltZVBhcnQyLm1hdGNoKC8oXFxkKylILyk7XHJcbiAgICAgICAgaWYgKGhtKSBob3VycyA9IHBhcnNlSW50KGhtWzFdLCAxMCk7XHJcbiAgICAgICAgY29uc3QgbWlubSA9IHRpbWVQYXJ0Mi5tYXRjaCgvKFxcZCspTS8pO1xyXG4gICAgICAgIGlmIChtaW5tKSBtaW5zID0gcGFyc2VJbnQobWlubVsxXSwgMTApO1xyXG4gICAgICAgIGNvbnN0IHNtID0gdGltZVBhcnQyLm1hdGNoKC8oW1xcZC5dKylTLyk7XHJcbiAgICAgICAgaWYgKHNtKSB7XHJcbiAgICAgICAgICBjb25zdCBzZWNTdHIgPSBzbVsxXTtcclxuICAgICAgICAgIGNvbnN0IGRvdElkeCA9IHNlY1N0ci5pbmRleE9mKCcuJyk7XHJcbiAgICAgICAgICBpZiAoZG90SWR4ID49IDApIHtcclxuICAgICAgICAgICAgc2VjcyA9IHBhcnNlSW50KHNlY1N0ci5zdWJzdHJpbmcoMCwgZG90SWR4KSwgMTApO1xyXG4gICAgICAgICAgICBjb25zdCBmcmFjID0gc2VjU3RyLnN1YnN0cmluZyhkb3RJZHggKyAxKTtcclxuICAgICAgICAgICAgbmFub3MgPSBwYXJzZUludChmcmFjLnBhZEVuZCg5LCAnMCcpLnN1YnN0cmluZygwLCA5KSwgMTApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VjcyA9IHBhcnNlSW50KHNlY1N0ciwgMTApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdG90YWxTZWNvbmRzID0gZGF5cyAqIDg2NDAwICsgaG91cnMgKiAzNjAwICsgbWlucyAqIDYwICsgc2VjcztcclxuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMik7XHJcbiAgICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRShCaWdJbnQodG90YWxTZWNvbmRzKSwgMCk7XHJcbiAgICAgIGRhdGEud3JpdGVVSW50MzJMRShuYW5vcywgOCk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5EQVlfVE9fU0VDT05ELCBkYXRhLCBpc051bGw6IGZhbHNlIH07XHJcbiAgICB9XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIHsgdHlwZTogdGFyZ2V0VHlwZSwgZGF0YTogQnVmZmVyLmZyb20ocywgJ3V0Zi04JyksIGlzTnVsbDogZmFsc2UgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBQYXJzZSBcIkhIOm1tOnNzWy5ubm5ubm5ubm5dXCIgaW50byBjb21wb25lbnRzICovXHJcbmZ1bmN0aW9uIHBhcnNlVGltZVN0cmluZyhzOiBzdHJpbmcpOiB7IGhvdXI6IG51bWJlcjsgbWludXRlOiBudW1iZXI7IHNlY29uZDogbnVtYmVyOyBuYW5vc2Vjb25kOiBudW1iZXIgfSB7XHJcbiAgY29uc3QgZG90SWR4ID0gcy5pbmRleE9mKCcuJyk7XHJcbiAgbGV0IHRpbWVQb3J0aW9uOiBzdHJpbmc7XHJcbiAgbGV0IG5hbm9zZWNvbmQgPSAwO1xyXG5cclxuICBpZiAoZG90SWR4ID49IDApIHtcclxuICAgIHRpbWVQb3J0aW9uID0gcy5zdWJzdHJpbmcoMCwgZG90SWR4KTtcclxuICAgIGNvbnN0IGZyYWMgPSBzLnN1YnN0cmluZyhkb3RJZHggKyAxKTtcclxuICAgIG5hbm9zZWNvbmQgPSBwYXJzZUludChmcmFjLnBhZEVuZCg5LCAnMCcpLnN1YnN0cmluZygwLCA5KSwgMTApO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aW1lUG9ydGlvbiA9IHM7XHJcbiAgfVxyXG5cclxuICBjb25zdCBwYXJ0cyA9IHRpbWVQb3J0aW9uLnNwbGl0KCc6Jyk7XHJcbiAgcmV0dXJuIHtcclxuICAgIGhvdXI6IHBhcnNlSW50KHBhcnRzWzBdLCAxMCksXHJcbiAgICBtaW51dGU6IHBhcnNlSW50KHBhcnRzWzFdLCAxMCksXHJcbiAgICBzZWNvbmQ6IHBhcnNlSW50KHBhcnRzWzJdLCAxMCksXHJcbiAgICBuYW5vc2Vjb25kLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKiBTcGxpdCBcIkhIOm1tOnNzWy5uXStISDpNTVwiIG9yIFwiSEg6bW06c3NbLm5dLUhIOk1NXCIgaW50byB0aW1lUGFydCBhbmQgb2Zmc2V0UGFydC5cclxuICogIEFsc28gc3VwcG9ydHMgWiBzdWZmaXggKHRyZWF0ZWQgYXMgKzAwOjAwKSBhbmQgc3BhY2Utc2VwYXJhdGVkIG9mZnNldHMgbGlrZSBcIjE0OjMwOjAwICswODowMFwiLiAqL1xyXG5mdW5jdGlvbiBzcGxpdFRpbWVBbmRPZmZzZXQoczogc3RyaW5nKTogeyB0aW1lUGFydDogc3RyaW5nOyBvZmZzZXRQYXJ0OiBzdHJpbmcgfSB7XHJcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9mZnNldChzKTtcclxuICAvLyBGaW5kIHRoZSBsYXN0ICcrJyBvciAnLScgdGhhdCBpbmRpY2F0ZXMgb2Zmc2V0IChza2lwIHRoZSBvbmUgYXQgcG9zaXRpb24gMCBpZiBwcmVzZW50KVxyXG4gIC8vIE9mZnNldCBpcyBhbHdheXMgaW4gdGhlIGZvcm1hdCArSEg6TU0gb3IgLUhIOk1NIGF0IHRoZSBlbmRcclxuICAvLyBTZWFyY2ggZm9yICsgb3IgLSB0aGF0IGlzIGZvbGxvd2VkIGJ5IGV4YWN0bHkgREQ6REQgcGF0dGVybiBhdCBlbmRcclxuICBjb25zdCBtYXRjaCA9IG5vcm1hbGl6ZWQubWF0Y2goL14oLis/KShbKy1dXFxkezJ9OlxcZHsyfSkkLyk7XHJcbiAgaWYgKG1hdGNoKSB7XHJcbiAgICByZXR1cm4geyB0aW1lUGFydDogbWF0Y2hbMV0sIG9mZnNldFBhcnQ6IG1hdGNoWzJdIH07XHJcbiAgfVxyXG4gIHJldHVybiB7IHRpbWVQYXJ0OiBub3JtYWxpemVkLCBvZmZzZXRQYXJ0OiAnKzAwOjAwJyB9O1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRyYWlsaW5nIHRpbWV6b25lIG9mZnNldCBvciBaIHN1ZmZpeCBmcm9tIGEgZGF0ZXRpbWUvdGltZSBzdHJpbmcuXHJcbiAqIE9ubHkgbG9va3MgaW4gdGhlIGxhc3QgfjEwIGNoYXJhY3RlcnMgdG8gYXZvaWQgbWF0Y2hpbmcgZGF0ZSBoeXBoZW5zIGxpa2UgXCIxOTkzLTA1LTA2XCIuXHJcbiAqIFJldHVybnMgdGhlIGNsZWFuIGxvY2FsIHRpbWUvZGF0ZXRpbWUgc3RyaW5nLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVtb3ZlT2Zmc2V0KHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgLy8gSGFuZGxlIFogc3VmZml4XHJcbiAgaWYgKHMuZW5kc1dpdGgoJ1onKSB8fCBzLmVuZHNXaXRoKCd6JykpIHtcclxuICAgIHJldHVybiBzLnNsaWNlKDAsIC0xKTtcclxuICB9XHJcbiAgLy8gSGFuZGxlIHNwYWNlLXNlcGFyYXRlZCBvZmZzZXQ6IFwiICtISDpNTVwiIG9yIFwiIC1ISDpNTVwiXHJcbiAgY29uc3Qgc3BhY2VPZmZNYXRjaCA9IHMubWF0Y2goL14oLis/KVxccytbKy1dXFxkezJ9Oj9cXGR7Mn0kLyk7XHJcbiAgaWYgKHNwYWNlT2ZmTWF0Y2gpIHtcclxuICAgIHJldHVybiBzcGFjZU9mZk1hdGNoWzFdO1xyXG4gIH1cclxuICAvLyBIYW5kbGUgYXR0YWNoZWQgb2Zmc2V0OiBcIitISDpNTVwiIG9yIFwiLUhIOk1NXCIgb3IgXCIrSEhNTVwiIG9yIFwiLUhITU1cIiBhdCBlbmRcclxuICAvLyBPbmx5IG1hdGNoIGluIHRoZSBsYXN0IDEwIGNoYXJzIHRvIGF2b2lkIGRhdGUgaHlwaGVuc1xyXG4gIGNvbnN0IHRhaWwgPSBzLmxlbmd0aCA+IDEwID8gcy5zdWJzdHJpbmcocy5sZW5ndGggLSAxMCkgOiBzO1xyXG4gIGNvbnN0IG9mZk1hdGNoID0gdGFpbC5tYXRjaCgvWystXVxcZHsyfTo/XFxkezJ9JC8pO1xyXG4gIGlmIChvZmZNYXRjaCkge1xyXG4gICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIHMubGVuZ3RoIC0gb2ZmTWF0Y2hbMF0ubGVuZ3RoKTtcclxuICB9XHJcbiAgcmV0dXJuIHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxpemUgYSBzdHJpbmcncyB0cmFpbGluZyBvZmZzZXQ6IGNvbGxhcHNlIHNwYWNlIGJlZm9yZSBvZmZzZXQsIGNvbnZlcnQgWiB0byArMDA6MDAuXHJcbiAqIE9ubHkgbG9va3MgaW4gdGhlIGxhc3QgfjEwIGNoYXJhY3RlcnMgdG8gYXZvaWQgbWF0Y2hpbmcgZGF0ZSBoeXBoZW5zLlxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgLy8gSGFuZGxlIFogc3VmZml4IOKGkiArMDA6MDBcclxuICBpZiAocy5lbmRzV2l0aCgnWicpIHx8IHMuZW5kc1dpdGgoJ3onKSkge1xyXG4gICAgcmV0dXJuIHMuc2xpY2UoMCwgLTEpICsgJyswMDowMCc7XHJcbiAgfVxyXG4gIC8vIEhhbmRsZSBzcGFjZS1zZXBhcmF0ZWQgb2Zmc2V0OiBcIiArSEg6TU1cIiBvciBcIiAtSEg6TU1cIlxyXG4gIGNvbnN0IHNwYWNlT2ZmTWF0Y2ggPSBzLm1hdGNoKC9eKC4rPylcXHMrKFsrLV1cXGR7Mn06XFxkezJ9KSQvKTtcclxuICBpZiAoc3BhY2VPZmZNYXRjaCkge1xyXG4gICAgcmV0dXJuIHNwYWNlT2ZmTWF0Y2hbMV0gKyBzcGFjZU9mZk1hdGNoWzJdO1xyXG4gIH1cclxuICByZXR1cm4gcztcclxufVxyXG5cclxuXHJcbi8qKiBQYXJhbWV0ZXIgZm9yIHF1ZXJpZXMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXIge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB2YWx1ZTogVHlwZWRWYWx1ZTtcclxufVxyXG5cclxuLyoqIENyZWF0ZSBhIHBhcmFtZXRlciBmcm9tIG5hbWUgYW5kIHZhbHVlICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbWV0ZXIobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogUGFyYW1ldGVyIHtcclxuICByZXR1cm4geyBuYW1lLCB2YWx1ZTogY3JlYXRlVHlwZWRWYWx1ZSh2YWx1ZSkgfTtcclxufVxyXG4iXX0=
|