tedious 16.4.1 → 16.6.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.
Files changed (109) hide show
  1. package/benchmarks/bulk-load/iterable.js +1 -1
  2. package/benchmarks/common.js +2 -4
  3. package/benchmarks/package-lock.json +21173 -0
  4. package/benchmarks/package.json +11 -0
  5. package/benchmarks/query/call-tvp.js +1 -1
  6. package/benchmarks/query/insert-varbinary.js +1 -1
  7. package/benchmarks/query/select-many-rows.js +1 -1
  8. package/benchmarks/query/select-nvarchar.js +1 -1
  9. package/benchmarks/query/select-varbinary.js +1 -1
  10. package/benchmarks/request/rpcrequest-payload-tvp.js +2 -2
  11. package/benchmarks/request/rpcrequest-payload-varbinary.js +2 -2
  12. package/benchmarks/token-parser/colmetadata-token.js +4 -2
  13. package/benchmarks/token-parser/done-token.js +5 -2
  14. package/benchmarks/token-parser/simple-tokens.js +8 -2
  15. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +1 -8
  16. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js.map +1 -1
  17. package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +1 -8
  18. package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js.map +1 -1
  19. package/lib/always-encrypted/cek-entry.js +1 -7
  20. package/lib/always-encrypted/cek-entry.js.map +1 -1
  21. package/lib/always-encrypted/keystore-provider-azure-key-vault.js +1 -8
  22. package/lib/always-encrypted/keystore-provider-azure-key-vault.js.map +1 -1
  23. package/lib/always-encrypted/symmetric-key.js +1 -2
  24. package/lib/always-encrypted/symmetric-key.js.map +1 -1
  25. package/lib/bulk-load-payload.js +1 -3
  26. package/lib/bulk-load-payload.js.map +1 -1
  27. package/lib/bulk-load.js +15 -23
  28. package/lib/bulk-load.js.map +1 -1
  29. package/lib/collation.js +1 -7
  30. package/lib/collation.js.map +1 -1
  31. package/lib/connection.js +22 -28
  32. package/lib/connection.js.map +1 -1
  33. package/lib/debug.js +1 -4
  34. package/lib/debug.js.map +1 -1
  35. package/lib/errors/abort-error.js +1 -2
  36. package/lib/errors/abort-error.js.map +1 -1
  37. package/lib/errors/timeout-error.js +1 -2
  38. package/lib/errors/timeout-error.js.map +1 -1
  39. package/lib/errors.js +1 -10
  40. package/lib/errors.js.map +1 -1
  41. package/lib/incoming-message-stream.js +1 -4
  42. package/lib/incoming-message-stream.js.map +1 -1
  43. package/lib/login7-payload.js +1 -23
  44. package/lib/login7-payload.js.map +1 -1
  45. package/lib/message-io.js +1 -8
  46. package/lib/message-io.js.map +1 -1
  47. package/lib/message.js +1 -4
  48. package/lib/message.js.map +1 -1
  49. package/lib/metadata-parser.js +361 -241
  50. package/lib/metadata-parser.js.map +1 -1
  51. package/lib/ntlm-payload.js +1 -2
  52. package/lib/ntlm-payload.js.map +1 -1
  53. package/lib/outgoing-message-stream.js +1 -5
  54. package/lib/outgoing-message-stream.js.map +1 -1
  55. package/lib/packet.js +1 -2
  56. package/lib/packet.js.map +1 -1
  57. package/lib/prelogin-payload.js +1 -11
  58. package/lib/prelogin-payload.js.map +1 -1
  59. package/lib/request.js +13 -19
  60. package/lib/request.js.map +1 -1
  61. package/lib/rpcrequest-payload.js +1 -6
  62. package/lib/rpcrequest-payload.js.map +1 -1
  63. package/lib/sqlbatch-payload.js +1 -4
  64. package/lib/sqlbatch-payload.js.map +1 -1
  65. package/lib/token/colmetadata-token-parser.js +103 -74
  66. package/lib/token/colmetadata-token-parser.js.map +1 -1
  67. package/lib/token/done-token-parser.js +52 -40
  68. package/lib/token/done-token-parser.js.map +1 -1
  69. package/lib/token/env-change-token-parser.js +110 -81
  70. package/lib/token/env-change-token-parser.js.map +1 -1
  71. package/lib/token/feature-ext-ack-parser.js +30 -22
  72. package/lib/token/feature-ext-ack-parser.js.map +1 -1
  73. package/lib/token/fedauth-info-parser.js +47 -30
  74. package/lib/token/fedauth-info-parser.js.map +1 -1
  75. package/lib/token/handler.js +3 -13
  76. package/lib/token/handler.js.map +1 -1
  77. package/lib/token/helpers.js +205 -0
  78. package/lib/token/helpers.js.map +1 -0
  79. package/lib/token/infoerror-token-parser.js +69 -36
  80. package/lib/token/infoerror-token-parser.js.map +1 -1
  81. package/lib/token/loginack-token-parser.js +59 -31
  82. package/lib/token/loginack-token-parser.js.map +1 -1
  83. package/lib/token/nbcrow-token-parser.js +60 -23
  84. package/lib/token/nbcrow-token-parser.js.map +1 -1
  85. package/lib/token/order-token-parser.js +22 -20
  86. package/lib/token/order-token-parser.js.map +1 -1
  87. package/lib/token/returnstatus-token-parser.js +9 -5
  88. package/lib/token/returnstatus-token-parser.js.map +1 -1
  89. package/lib/token/returnvalue-token-parser.js +79 -22
  90. package/lib/token/returnvalue-token-parser.js.map +1 -1
  91. package/lib/token/row-token-parser.js +50 -20
  92. package/lib/token/row-token-parser.js.map +1 -1
  93. package/lib/token/sspi-token-parser.js +14 -5
  94. package/lib/token/sspi-token-parser.js.map +1 -1
  95. package/lib/token/stream-parser.js +289 -330
  96. package/lib/token/stream-parser.js.map +1 -1
  97. package/lib/token/token-stream-parser.js +1 -4
  98. package/lib/token/token-stream-parser.js.map +1 -1
  99. package/lib/token/token.js +2 -88
  100. package/lib/token/token.js.map +1 -1
  101. package/lib/tracking-buffer/writable-tracking-buffer.js +1 -7
  102. package/lib/tracking-buffer/writable-tracking-buffer.js.map +1 -1
  103. package/lib/transaction.js +1 -4
  104. package/lib/transaction.js.map +1 -1
  105. package/lib/value-parser.js +655 -438
  106. package/lib/value-parser.js.map +1 -1
  107. package/package.json +1 -1
  108. package/benchmarks/bulk-load/stream.js +0 -62
  109. package/benchmarks/bulk-load/sync.js +0 -59
@@ -18,366 +18,325 @@ var _returnvalueTokenParser = _interopRequireDefault(require("./returnvalue-toke
18
18
  var _rowTokenParser = _interopRequireDefault(require("./row-token-parser"));
19
19
  var _nbcrowTokenParser = _interopRequireDefault(require("./nbcrow-token-parser"));
20
20
  var _sspiTokenParser = _interopRequireDefault(require("./sspi-token-parser"));
21
+ var _helpers = require("./helpers");
21
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
- const tokenParsers = {
23
- [_token.TYPE.DONE]: _doneTokenParser.doneParser,
24
- [_token.TYPE.DONEINPROC]: _doneTokenParser.doneInProcParser,
25
- [_token.TYPE.DONEPROC]: _doneTokenParser.doneProcParser,
26
- [_token.TYPE.ENVCHANGE]: _envChangeTokenParser.default,
27
- [_token.TYPE.ERROR]: _infoerrorTokenParser.errorParser,
28
- [_token.TYPE.FEDAUTHINFO]: _fedauthInfoParser.default,
29
- [_token.TYPE.FEATUREEXTACK]: _featureExtAckParser.default,
30
- [_token.TYPE.INFO]: _infoerrorTokenParser.infoParser,
31
- [_token.TYPE.LOGINACK]: _loginackTokenParser.default,
32
- [_token.TYPE.ORDER]: _orderTokenParser.default,
33
- [_token.TYPE.RETURNSTATUS]: _returnstatusTokenParser.default,
34
- [_token.TYPE.RETURNVALUE]: _returnvalueTokenParser.default,
35
- [_token.TYPE.SSPI]: _sspiTokenParser.default
36
- };
37
- class StreamBuffer {
38
- iterator;
39
- buffer;
40
- position;
41
- constructor(iterable) {
42
- this.iterator = (iterable[Symbol.asyncIterator] || iterable[Symbol.iterator]).call(iterable);
43
- this.buffer = Buffer.alloc(0);
44
- this.position = 0;
45
- }
46
- async waitForChunk() {
47
- const result = await this.iterator.next();
48
- if (result.done) {
49
- throw new Error('unexpected end of data');
50
- }
51
- if (this.position === this.buffer.length) {
52
- this.buffer = result.value;
53
- } else {
54
- this.buffer = Buffer.concat([this.buffer.slice(this.position), result.value]);
55
- }
56
- this.position = 0;
57
- }
58
- }
59
23
  class Parser {
60
24
  debug;
61
25
  colMetadata;
62
26
  options;
63
- suspended;
64
- next;
65
- streamBuffer;
27
+ iterator;
28
+ buffer;
29
+ position;
66
30
  static async *parseTokens(iterable, debug, options, colMetadata = []) {
67
- let token;
68
- const onDoneParsing = t => {
69
- token = t;
70
- };
71
- const streamBuffer = new StreamBuffer(iterable);
72
- const parser = new Parser(streamBuffer, debug, options);
31
+ const parser = new Parser(iterable, debug, options);
73
32
  parser.colMetadata = colMetadata;
74
33
  while (true) {
75
34
  try {
76
- await streamBuffer.waitForChunk();
35
+ await parser.waitForChunk();
77
36
  } catch (err) {
78
- if (streamBuffer.position === streamBuffer.buffer.length) {
37
+ if (parser.position === parser.buffer.length) {
79
38
  return;
80
39
  }
81
40
  throw err;
82
41
  }
83
- if (parser.suspended) {
84
- // Unsuspend and continue from where ever we left off.
85
- parser.suspended = false;
86
- const next = parser.next;
87
- next();
88
-
89
- // Check if a new token was parsed after unsuspension.
90
- if (!parser.suspended && token) {
91
- if (token instanceof _token.ColMetadataToken) {
92
- parser.colMetadata = token.columns;
93
- }
94
- yield token;
95
- }
96
- }
97
- while (!parser.suspended && parser.position + 1 <= parser.buffer.length) {
42
+ while (parser.buffer.length >= parser.position + 1) {
98
43
  const type = parser.buffer.readUInt8(parser.position);
99
44
  parser.position += 1;
100
- if (type === _token.TYPE.COLMETADATA) {
101
- const token = await (0, _colmetadataTokenParser.default)(parser);
102
- parser.colMetadata = token.columns;
45
+ const token = parser.readToken(type);
46
+ if (token !== undefined) {
103
47
  yield token;
104
- } else if (type === _token.TYPE.ROW) {
105
- yield (0, _rowTokenParser.default)(parser);
106
- } else if (type === _token.TYPE.NBCROW) {
107
- yield (0, _nbcrowTokenParser.default)(parser);
108
- } else if (tokenParsers[type]) {
109
- tokenParsers[type](parser, parser.options, onDoneParsing);
110
-
111
- // Check if a new token was parsed after unsuspension.
112
- if (!parser.suspended && token) {
113
- if (token instanceof _token.ColMetadataToken) {
114
- parser.colMetadata = token.columns;
115
- }
116
- yield token;
117
- }
118
- } else {
48
+ }
49
+ }
50
+ }
51
+ }
52
+ readToken(type) {
53
+ switch (type) {
54
+ case _token.TYPE.DONE:
55
+ {
56
+ return this.readDoneToken();
57
+ }
58
+ case _token.TYPE.DONEPROC:
59
+ {
60
+ return this.readDoneProcToken();
61
+ }
62
+ case _token.TYPE.DONEINPROC:
63
+ {
64
+ return this.readDoneInProcToken();
65
+ }
66
+ case _token.TYPE.ERROR:
67
+ {
68
+ return this.readErrorToken();
69
+ }
70
+ case _token.TYPE.INFO:
71
+ {
72
+ return this.readInfoToken();
73
+ }
74
+ case _token.TYPE.ENVCHANGE:
75
+ {
76
+ return this.readEnvChangeToken();
77
+ }
78
+ case _token.TYPE.LOGINACK:
79
+ {
80
+ return this.readLoginAckToken();
81
+ }
82
+ case _token.TYPE.RETURNSTATUS:
83
+ {
84
+ return this.readReturnStatusToken();
85
+ }
86
+ case _token.TYPE.ORDER:
87
+ {
88
+ return this.readOrderToken();
89
+ }
90
+ case _token.TYPE.FEDAUTHINFO:
91
+ {
92
+ return this.readFedAuthInfoToken();
93
+ }
94
+ case _token.TYPE.SSPI:
95
+ {
96
+ return this.readSSPIToken();
97
+ }
98
+ case _token.TYPE.COLMETADATA:
99
+ {
100
+ return this.readColMetadataToken();
101
+ }
102
+ case _token.TYPE.RETURNVALUE:
103
+ {
104
+ return this.readReturnValueToken();
105
+ }
106
+ case _token.TYPE.ROW:
107
+ {
108
+ return this.readRowToken();
109
+ }
110
+ case _token.TYPE.NBCROW:
111
+ {
112
+ return this.readNbcRowToken();
113
+ }
114
+ case _token.TYPE.FEATUREEXTACK:
115
+ {
116
+ return this.readFeatureExtAckToken();
117
+ }
118
+ default:
119
+ {
119
120
  throw new Error('Unknown type: ' + type);
120
121
  }
122
+ }
123
+ }
124
+ readFeatureExtAckToken() {
125
+ let result;
126
+ try {
127
+ result = (0, _featureExtAckParser.default)(this.buffer, this.position, this.options);
128
+ } catch (err) {
129
+ if (err instanceof _helpers.NotEnoughDataError) {
130
+ return this.waitForChunk().then(() => {
131
+ return this.readFeatureExtAckToken();
132
+ });
133
+ }
134
+ throw err;
135
+ }
136
+ this.position = result.offset;
137
+ return result.value;
138
+ }
139
+ async readNbcRowToken() {
140
+ return await (0, _nbcrowTokenParser.default)(this);
141
+ }
142
+ async readReturnValueToken() {
143
+ return await (0, _returnvalueTokenParser.default)(this);
144
+ }
145
+ async readColMetadataToken() {
146
+ const token = await (0, _colmetadataTokenParser.default)(this);
147
+ this.colMetadata = token.columns;
148
+ return token;
149
+ }
150
+ readSSPIToken() {
151
+ let result;
152
+ try {
153
+ result = (0, _sspiTokenParser.default)(this.buffer, this.position, this.options);
154
+ } catch (err) {
155
+ if (err instanceof _helpers.NotEnoughDataError) {
156
+ return this.waitForChunk().then(() => {
157
+ return this.readSSPIToken();
158
+ });
159
+ }
160
+ throw err;
161
+ }
162
+ this.position = result.offset;
163
+ return result.value;
164
+ }
165
+ readFedAuthInfoToken() {
166
+ let result;
167
+ try {
168
+ result = (0, _fedauthInfoParser.default)(this.buffer, this.position, this.options);
169
+ } catch (err) {
170
+ if (err instanceof _helpers.NotEnoughDataError) {
171
+ return this.waitForChunk().then(() => {
172
+ return this.readFedAuthInfoToken();
173
+ });
174
+ }
175
+ throw err;
176
+ }
177
+ this.position = result.offset;
178
+ return result.value;
179
+ }
180
+ readOrderToken() {
181
+ let result;
182
+ try {
183
+ result = (0, _orderTokenParser.default)(this.buffer, this.position, this.options);
184
+ } catch (err) {
185
+ if (err instanceof _helpers.NotEnoughDataError) {
186
+ return this.waitForChunk().then(() => {
187
+ return this.readOrderToken();
188
+ });
189
+ }
190
+ throw err;
191
+ }
192
+ this.position = result.offset;
193
+ return result.value;
194
+ }
195
+ readReturnStatusToken() {
196
+ let result;
197
+ try {
198
+ result = (0, _returnstatusTokenParser.default)(this.buffer, this.position, this.options);
199
+ } catch (err) {
200
+ if (err instanceof _helpers.NotEnoughDataError) {
201
+ return this.waitForChunk().then(() => {
202
+ return this.readReturnStatusToken();
203
+ });
204
+ }
205
+ throw err;
206
+ }
207
+ this.position = result.offset;
208
+ return result.value;
209
+ }
210
+ readLoginAckToken() {
211
+ let result;
212
+ try {
213
+ result = (0, _loginackTokenParser.default)(this.buffer, this.position, this.options);
214
+ } catch (err) {
215
+ if (err instanceof _helpers.NotEnoughDataError) {
216
+ return this.waitForChunk().then(() => {
217
+ return this.readLoginAckToken();
218
+ });
219
+ }
220
+ throw err;
221
+ }
222
+ this.position = result.offset;
223
+ return result.value;
224
+ }
225
+ readEnvChangeToken() {
226
+ let result;
227
+ try {
228
+ result = (0, _envChangeTokenParser.default)(this.buffer, this.position, this.options);
229
+ } catch (err) {
230
+ if (err instanceof _helpers.NotEnoughDataError) {
231
+ return this.waitForChunk().then(() => {
232
+ return this.readEnvChangeToken();
233
+ });
121
234
  }
235
+ throw err;
122
236
  }
237
+ this.position = result.offset;
238
+ return result.value;
239
+ }
240
+ readRowToken() {
241
+ return (0, _rowTokenParser.default)(this);
242
+ }
243
+ readInfoToken() {
244
+ let result;
245
+ try {
246
+ result = (0, _infoerrorTokenParser.infoParser)(this.buffer, this.position, this.options);
247
+ } catch (err) {
248
+ if (err instanceof _helpers.NotEnoughDataError) {
249
+ return this.waitForChunk().then(() => {
250
+ return this.readInfoToken();
251
+ });
252
+ }
253
+ throw err;
254
+ }
255
+ this.position = result.offset;
256
+ return result.value;
257
+ }
258
+ readErrorToken() {
259
+ let result;
260
+ try {
261
+ result = (0, _infoerrorTokenParser.errorParser)(this.buffer, this.position, this.options);
262
+ } catch (err) {
263
+ if (err instanceof _helpers.NotEnoughDataError) {
264
+ return this.waitForChunk().then(() => {
265
+ return this.readErrorToken();
266
+ });
267
+ }
268
+ throw err;
269
+ }
270
+ this.position = result.offset;
271
+ return result.value;
272
+ }
273
+ readDoneInProcToken() {
274
+ let result;
275
+ try {
276
+ result = (0, _doneTokenParser.doneInProcParser)(this.buffer, this.position, this.options);
277
+ } catch (err) {
278
+ if (err instanceof _helpers.NotEnoughDataError) {
279
+ return this.waitForChunk().then(() => {
280
+ return this.readDoneInProcToken();
281
+ });
282
+ }
283
+ throw err;
284
+ }
285
+ this.position = result.offset;
286
+ return result.value;
287
+ }
288
+ readDoneProcToken() {
289
+ let result;
290
+ try {
291
+ result = (0, _doneTokenParser.doneProcParser)(this.buffer, this.position, this.options);
292
+ } catch (err) {
293
+ if (err instanceof _helpers.NotEnoughDataError) {
294
+ return this.waitForChunk().then(() => {
295
+ return this.readDoneProcToken();
296
+ });
297
+ }
298
+ throw err;
299
+ }
300
+ this.position = result.offset;
301
+ return result.value;
302
+ }
303
+ readDoneToken() {
304
+ let result;
305
+ try {
306
+ result = (0, _doneTokenParser.doneParser)(this.buffer, this.position, this.options);
307
+ } catch (err) {
308
+ if (err instanceof _helpers.NotEnoughDataError) {
309
+ return this.waitForChunk().then(() => {
310
+ return this.readDoneToken();
311
+ });
312
+ }
313
+ throw err;
314
+ }
315
+ this.position = result.offset;
316
+ return result.value;
123
317
  }
124
- constructor(streamBuffer, debug, options) {
318
+ constructor(iterable, debug, options) {
125
319
  this.debug = debug;
126
320
  this.colMetadata = [];
127
321
  this.options = options;
128
- this.streamBuffer = streamBuffer;
129
- this.suspended = false;
130
- this.next = undefined;
131
- }
132
- get buffer() {
133
- return this.streamBuffer.buffer;
134
- }
135
- get position() {
136
- return this.streamBuffer.position;
137
- }
138
- set position(value) {
139
- this.streamBuffer.position = value;
140
- }
141
- suspend(next) {
142
- this.suspended = true;
143
- this.next = next;
322
+ this.iterator = (iterable[Symbol.asyncIterator] || iterable[Symbol.iterator]).call(iterable);
323
+ this.buffer = Buffer.alloc(0);
324
+ this.position = 0;
144
325
  }
145
- awaitData(length, callback) {
146
- if (this.position + length <= this.buffer.length) {
147
- callback();
326
+ async waitForChunk() {
327
+ const result = await this.iterator.next();
328
+ if (result.done) {
329
+ throw new Error('unexpected end of data');
330
+ }
331
+ if (this.position === this.buffer.length) {
332
+ this.buffer = result.value;
148
333
  } else {
149
- this.suspend(() => {
150
- this.awaitData(length, callback);
151
- });
334
+ this.buffer = Buffer.concat([this.buffer.slice(this.position), result.value]);
152
335
  }
153
- }
154
- readInt8(callback) {
155
- this.awaitData(1, () => {
156
- const data = this.buffer.readInt8(this.position);
157
- this.position += 1;
158
- callback(data);
159
- });
160
- }
161
- readUInt8(callback) {
162
- this.awaitData(1, () => {
163
- const data = this.buffer.readUInt8(this.position);
164
- this.position += 1;
165
- callback(data);
166
- });
167
- }
168
- readInt16LE(callback) {
169
- this.awaitData(2, () => {
170
- const data = this.buffer.readInt16LE(this.position);
171
- this.position += 2;
172
- callback(data);
173
- });
174
- }
175
- readInt16BE(callback) {
176
- this.awaitData(2, () => {
177
- const data = this.buffer.readInt16BE(this.position);
178
- this.position += 2;
179
- callback(data);
180
- });
181
- }
182
- readUInt16LE(callback) {
183
- this.awaitData(2, () => {
184
- const data = this.buffer.readUInt16LE(this.position);
185
- this.position += 2;
186
- callback(data);
187
- });
188
- }
189
- readUInt16BE(callback) {
190
- this.awaitData(2, () => {
191
- const data = this.buffer.readUInt16BE(this.position);
192
- this.position += 2;
193
- callback(data);
194
- });
195
- }
196
- readInt32LE(callback) {
197
- this.awaitData(4, () => {
198
- const data = this.buffer.readInt32LE(this.position);
199
- this.position += 4;
200
- callback(data);
201
- });
202
- }
203
- readInt32BE(callback) {
204
- this.awaitData(4, () => {
205
- const data = this.buffer.readInt32BE(this.position);
206
- this.position += 4;
207
- callback(data);
208
- });
209
- }
210
- readUInt32LE(callback) {
211
- this.awaitData(4, () => {
212
- const data = this.buffer.readUInt32LE(this.position);
213
- this.position += 4;
214
- callback(data);
215
- });
216
- }
217
- readUInt32BE(callback) {
218
- this.awaitData(4, () => {
219
- const data = this.buffer.readUInt32BE(this.position);
220
- this.position += 4;
221
- callback(data);
222
- });
223
- }
224
- readBigInt64LE(callback) {
225
- this.awaitData(8, () => {
226
- const data = this.buffer.readBigInt64LE(this.position);
227
- this.position += 8;
228
- callback(data);
229
- });
230
- }
231
- readInt64LE(callback) {
232
- this.awaitData(8, () => {
233
- const data = Math.pow(2, 32) * this.buffer.readInt32LE(this.position + 4) + ((this.buffer[this.position + 4] & 0x80) === 0x80 ? 1 : -1) * this.buffer.readUInt32LE(this.position);
234
- this.position += 8;
235
- callback(data);
236
- });
237
- }
238
- readInt64BE(callback) {
239
- this.awaitData(8, () => {
240
- const data = Math.pow(2, 32) * this.buffer.readInt32BE(this.position) + ((this.buffer[this.position] & 0x80) === 0x80 ? 1 : -1) * this.buffer.readUInt32BE(this.position + 4);
241
- this.position += 8;
242
- callback(data);
243
- });
244
- }
245
- readBigUInt64LE(callback) {
246
- this.awaitData(8, () => {
247
- const data = this.buffer.readBigUInt64LE(this.position);
248
- this.position += 8;
249
- callback(data);
250
- });
251
- }
252
- readUInt64LE(callback) {
253
- this.awaitData(8, () => {
254
- const data = Math.pow(2, 32) * this.buffer.readUInt32LE(this.position + 4) + this.buffer.readUInt32LE(this.position);
255
- this.position += 8;
256
- callback(data);
257
- });
258
- }
259
- readUInt64BE(callback) {
260
- this.awaitData(8, () => {
261
- const data = Math.pow(2, 32) * this.buffer.readUInt32BE(this.position) + this.buffer.readUInt32BE(this.position + 4);
262
- this.position += 8;
263
- callback(data);
264
- });
265
- }
266
- readFloatLE(callback) {
267
- this.awaitData(4, () => {
268
- const data = this.buffer.readFloatLE(this.position);
269
- this.position += 4;
270
- callback(data);
271
- });
272
- }
273
- readFloatBE(callback) {
274
- this.awaitData(4, () => {
275
- const data = this.buffer.readFloatBE(this.position);
276
- this.position += 4;
277
- callback(data);
278
- });
279
- }
280
- readDoubleLE(callback) {
281
- this.awaitData(8, () => {
282
- const data = this.buffer.readDoubleLE(this.position);
283
- this.position += 8;
284
- callback(data);
285
- });
286
- }
287
- readDoubleBE(callback) {
288
- this.awaitData(8, () => {
289
- const data = this.buffer.readDoubleBE(this.position);
290
- this.position += 8;
291
- callback(data);
292
- });
293
- }
294
- readUInt24LE(callback) {
295
- this.awaitData(3, () => {
296
- const low = this.buffer.readUInt16LE(this.position);
297
- const high = this.buffer.readUInt8(this.position + 2);
298
- this.position += 3;
299
- callback(low | high << 16);
300
- });
301
- }
302
- readUInt40LE(callback) {
303
- this.awaitData(5, () => {
304
- const low = this.buffer.readUInt32LE(this.position);
305
- const high = this.buffer.readUInt8(this.position + 4);
306
- this.position += 5;
307
- callback(0x100000000 * high + low);
308
- });
309
- }
310
- readUNumeric64LE(callback) {
311
- this.awaitData(8, () => {
312
- const low = this.buffer.readUInt32LE(this.position);
313
- const high = this.buffer.readUInt32LE(this.position + 4);
314
- this.position += 8;
315
- callback(0x100000000 * high + low);
316
- });
317
- }
318
- readUNumeric96LE(callback) {
319
- this.awaitData(12, () => {
320
- const dword1 = this.buffer.readUInt32LE(this.position);
321
- const dword2 = this.buffer.readUInt32LE(this.position + 4);
322
- const dword3 = this.buffer.readUInt32LE(this.position + 8);
323
- this.position += 12;
324
- callback(dword1 + 0x100000000 * dword2 + 0x100000000 * 0x100000000 * dword3);
325
- });
326
- }
327
- readUNumeric128LE(callback) {
328
- this.awaitData(16, () => {
329
- const dword1 = this.buffer.readUInt32LE(this.position);
330
- const dword2 = this.buffer.readUInt32LE(this.position + 4);
331
- const dword3 = this.buffer.readUInt32LE(this.position + 8);
332
- const dword4 = this.buffer.readUInt32LE(this.position + 12);
333
- this.position += 16;
334
- callback(dword1 + 0x100000000 * dword2 + 0x100000000 * 0x100000000 * dword3 + 0x100000000 * 0x100000000 * 0x100000000 * dword4);
335
- });
336
- }
337
-
338
- // Variable length data
339
-
340
- readBuffer(length, callback) {
341
- this.awaitData(length, () => {
342
- const data = this.buffer.slice(this.position, this.position + length);
343
- this.position += length;
344
- callback(data);
345
- });
346
- }
347
-
348
- // Read a Unicode String (BVARCHAR)
349
- readBVarChar(callback) {
350
- this.readUInt8(length => {
351
- this.readBuffer(length * 2, data => {
352
- callback(data.toString('ucs2'));
353
- });
354
- });
355
- }
356
-
357
- // Read a Unicode String (USVARCHAR)
358
- readUsVarChar(callback) {
359
- this.readUInt16LE(length => {
360
- this.readBuffer(length * 2, data => {
361
- callback(data.toString('ucs2'));
362
- });
363
- });
364
- }
365
-
366
- // Read binary data (BVARBYTE)
367
- readBVarByte(callback) {
368
- this.readUInt8(length => {
369
- this.readBuffer(length, callback);
370
- });
371
- }
372
-
373
- // Read binary data (USVARBYTE)
374
- readUsVarByte(callback) {
375
- this.readUInt16LE(length => {
376
- this.readBuffer(length, callback);
377
- });
336
+ this.position = 0;
378
337
  }
379
338
  }
380
339
  var _default = Parser;
381
340
  exports.default = _default;
382
341
  module.exports = Parser;
383
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9rZW4iLCJyZXF1aXJlIiwiX2NvbG1ldGFkYXRhVG9rZW5QYXJzZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2RvbmVUb2tlblBhcnNlciIsIl9lbnZDaGFuZ2VUb2tlblBhcnNlciIsIl9pbmZvZXJyb3JUb2tlblBhcnNlciIsIl9mZWRhdXRoSW5mb1BhcnNlciIsIl9mZWF0dXJlRXh0QWNrUGFyc2VyIiwiX2xvZ2luYWNrVG9rZW5QYXJzZXIiLCJfb3JkZXJUb2tlblBhcnNlciIsIl9yZXR1cm5zdGF0dXNUb2tlblBhcnNlciIsIl9yZXR1cm52YWx1ZVRva2VuUGFyc2VyIiwiX3Jvd1Rva2VuUGFyc2VyIiwiX25iY3Jvd1Rva2VuUGFyc2VyIiwiX3NzcGlUb2tlblBhcnNlciIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwidG9rZW5QYXJzZXJzIiwiVFlQRSIsIkRPTkUiLCJkb25lUGFyc2VyIiwiRE9ORUlOUFJPQyIsImRvbmVJblByb2NQYXJzZXIiLCJET05FUFJPQyIsImRvbmVQcm9jUGFyc2VyIiwiRU5WQ0hBTkdFIiwiZW52Q2hhbmdlUGFyc2VyIiwiRVJST1IiLCJlcnJvclBhcnNlciIsIkZFREFVVEhJTkZPIiwiZmVkQXV0aEluZm9QYXJzZXIiLCJGRUFUVVJFRVhUQUNLIiwiZmVhdHVyZUV4dEFja1BhcnNlciIsIklORk8iLCJpbmZvUGFyc2VyIiwiTE9HSU5BQ0siLCJsb2dpbkFja1BhcnNlciIsIk9SREVSIiwib3JkZXJQYXJzZXIiLCJSRVRVUk5TVEFUVVMiLCJyZXR1cm5TdGF0dXNQYXJzZXIiLCJSRVRVUk5WQUxVRSIsInJldHVyblZhbHVlUGFyc2VyIiwiU1NQSSIsInNzcGlQYXJzZXIiLCJTdHJlYW1CdWZmZXIiLCJpdGVyYXRvciIsImJ1ZmZlciIsInBvc2l0aW9uIiwiY29uc3RydWN0b3IiLCJpdGVyYWJsZSIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJjYWxsIiwiQnVmZmVyIiwiYWxsb2MiLCJ3YWl0Rm9yQ2h1bmsiLCJyZXN1bHQiLCJuZXh0IiwiZG9uZSIsIkVycm9yIiwibGVuZ3RoIiwidmFsdWUiLCJjb25jYXQiLCJzbGljZSIsIlBhcnNlciIsImRlYnVnIiwiY29sTWV0YWRhdGEiLCJvcHRpb25zIiwic3VzcGVuZGVkIiwic3RyZWFtQnVmZmVyIiwicGFyc2VUb2tlbnMiLCJ0b2tlbiIsIm9uRG9uZVBhcnNpbmciLCJ0IiwicGFyc2VyIiwiZXJyIiwiQ29sTWV0YWRhdGFUb2tlbiIsImNvbHVtbnMiLCJ0eXBlIiwicmVhZFVJbnQ4IiwiQ09MTUVUQURBVEEiLCJjb2xNZXRhZGF0YVBhcnNlciIsIlJPVyIsInJvd1BhcnNlciIsIk5CQ1JPVyIsIm5iY1Jvd1BhcnNlciIsInVuZGVmaW5lZCIsInN1c3BlbmQiLCJhd2FpdERhdGEiLCJjYWxsYmFjayIsInJlYWRJbnQ4IiwiZGF0YSIsInJlYWRJbnQxNkxFIiwicmVhZEludDE2QkUiLCJyZWFkVUludDE2TEUiLCJyZWFkVUludDE2QkUiLCJyZWFkSW50MzJMRSIsInJlYWRJbnQzMkJFIiwicmVhZFVJbnQzMkxFIiwicmVhZFVJbnQzMkJFIiwicmVhZEJpZ0ludDY0TEUiLCJyZWFkSW50NjRMRSIsIk1hdGgiLCJwb3ciLCJyZWFkSW50NjRCRSIsInJlYWRCaWdVSW50NjRMRSIsInJlYWRVSW50NjRMRSIsInJlYWRVSW50NjRCRSIsInJlYWRGbG9hdExFIiwicmVhZEZsb2F0QkUiLCJyZWFkRG91YmxlTEUiLCJyZWFkRG91YmxlQkUiLCJyZWFkVUludDI0TEUiLCJsb3ciLCJoaWdoIiwicmVhZFVJbnQ0MExFIiwicmVhZFVOdW1lcmljNjRMRSIsInJlYWRVTnVtZXJpYzk2TEUiLCJkd29yZDEiLCJkd29yZDIiLCJkd29yZDMiLCJyZWFkVU51bWVyaWMxMjhMRSIsImR3b3JkNCIsInJlYWRCdWZmZXIiLCJyZWFkQlZhckNoYXIiLCJ0b1N0cmluZyIsInJlYWRVc1ZhckNoYXIiLCJyZWFkQlZhckJ5dGUiLCJyZWFkVXNWYXJCeXRlIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL3N0cmVhbS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERlYnVnIGZyb20gJy4uL2RlYnVnJztcbmltcG9ydCB7IHR5cGUgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuXG5pbXBvcnQgeyBUWVBFLCBUb2tlbiwgQ29sTWV0YWRhdGFUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5pbXBvcnQgY29sTWV0YWRhdGFQYXJzZXIsIHsgdHlwZSBDb2x1bW5NZXRhZGF0YSB9IGZyb20gJy4vY29sbWV0YWRhdGEtdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IGRvbmVQYXJzZXIsIGRvbmVJblByb2NQYXJzZXIsIGRvbmVQcm9jUGFyc2VyIH0gZnJvbSAnLi9kb25lLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgZW52Q2hhbmdlUGFyc2VyIGZyb20gJy4vZW52LWNoYW5nZS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgZXJyb3JQYXJzZXIsIGluZm9QYXJzZXIgfSBmcm9tICcuL2luZm9lcnJvci10b2tlbi1wYXJzZXInO1xuaW1wb3J0IGZlZEF1dGhJbmZvUGFyc2VyIGZyb20gJy4vZmVkYXV0aC1pbmZvLXBhcnNlcic7XG5pbXBvcnQgZmVhdHVyZUV4dEFja1BhcnNlciBmcm9tICcuL2ZlYXR1cmUtZXh0LWFjay1wYXJzZXInO1xuaW1wb3J0IGxvZ2luQWNrUGFyc2VyIGZyb20gJy4vbG9naW5hY2stdG9rZW4tcGFyc2VyJztcbmltcG9ydCBvcmRlclBhcnNlciBmcm9tICcuL29yZGVyLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgcmV0dXJuU3RhdHVzUGFyc2VyIGZyb20gJy4vcmV0dXJuc3RhdHVzLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgcmV0dXJuVmFsdWVQYXJzZXIgZnJvbSAnLi9yZXR1cm52YWx1ZS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHJvd1BhcnNlciBmcm9tICcuL3Jvdy10b2tlbi1wYXJzZXInO1xuaW1wb3J0IG5iY1Jvd1BhcnNlciBmcm9tICcuL25iY3Jvdy10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHNzcGlQYXJzZXIgZnJvbSAnLi9zc3BpLXRva2VuLXBhcnNlcic7XG5cbmNvbnN0IHRva2VuUGFyc2VycyA9IHtcbiAgW1RZUEUuRE9ORV06IGRvbmVQYXJzZXIsXG4gIFtUWVBFLkRPTkVJTlBST0NdOiBkb25lSW5Qcm9jUGFyc2VyLFxuICBbVFlQRS5ET05FUFJPQ106IGRvbmVQcm9jUGFyc2VyLFxuICBbVFlQRS5FTlZDSEFOR0VdOiBlbnZDaGFuZ2VQYXJzZXIsXG4gIFtUWVBFLkVSUk9SXTogZXJyb3JQYXJzZXIsXG4gIFtUWVBFLkZFREFVVEhJTkZPXTogZmVkQXV0aEluZm9QYXJzZXIsXG4gIFtUWVBFLkZFQVRVUkVFWFRBQ0tdOiBmZWF0dXJlRXh0QWNrUGFyc2VyLFxuICBbVFlQRS5JTkZPXTogaW5mb1BhcnNlcixcbiAgW1RZUEUuTE9HSU5BQ0tdOiBsb2dpbkFja1BhcnNlcixcbiAgW1RZUEUuT1JERVJdOiBvcmRlclBhcnNlcixcbiAgW1RZUEUuUkVUVVJOU1RBVFVTXTogcmV0dXJuU3RhdHVzUGFyc2VyLFxuICBbVFlQRS5SRVRVUk5WQUxVRV06IHJldHVyblZhbHVlUGFyc2VyLFxuICBbVFlQRS5TU1BJXTogc3NwaVBhcnNlclxufTtcblxuZXhwb3J0IHR5cGUgUGFyc2VyT3B0aW9ucyA9IFBpY2s8SW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucywgJ3VzZVVUQycgfCAnbG93ZXJDYXNlR3VpZHMnIHwgJ3Rkc1ZlcnNpb24nIHwgJ3VzZUNvbHVtbk5hbWVzJyB8ICdjb2x1bW5OYW1lUmVwbGFjZXInIHwgJ2NhbWVsQ2FzZUNvbHVtbnMnPjtcblxuY2xhc3MgU3RyZWFtQnVmZmVyIHtcbiAgaXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8QnVmZmVyLCBhbnksIHVuZGVmaW5lZD4gfCBJdGVyYXRvcjxCdWZmZXIsIGFueSwgdW5kZWZpbmVkPjtcbiAgYnVmZmVyOiBCdWZmZXI7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoaXRlcmFibGU6IEFzeW5jSXRlcmFibGU8QnVmZmVyPiB8IEl0ZXJhYmxlPEJ1ZmZlcj4pIHtcbiAgICB0aGlzLml0ZXJhdG9yID0gKChpdGVyYWJsZSBhcyBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4pW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSB8fCAoaXRlcmFibGUgYXMgSXRlcmFibGU8QnVmZmVyPilbU3ltYm9sLml0ZXJhdG9yXSkuY2FsbChpdGVyYWJsZSk7XG5cbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JDaHVuaygpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLml0ZXJhdG9yLm5leHQoKTtcbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBlbmQgb2YgZGF0YScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSB0aGlzLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gcmVzdWx0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zaXRpb24pLCByZXN1bHQudmFsdWVdKTtcbiAgICB9XG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gIH1cbn1cblxuY2xhc3MgUGFyc2VyIHtcbiAgZGVidWc6IERlYnVnO1xuICBjb2xNZXRhZGF0YTogQ29sdW1uTWV0YWRhdGFbXTtcbiAgb3B0aW9uczogUGFyc2VyT3B0aW9ucztcblxuICBzdXNwZW5kZWQ6IGJvb2xlYW47XG4gIG5leHQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgc3RyZWFtQnVmZmVyOiBTdHJlYW1CdWZmZXI7XG5cbiAgc3RhdGljIGFzeW5jICpwYXJzZVRva2VucyhpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHwgSXRlcmFibGU8QnVmZmVyPiwgZGVidWc6IERlYnVnLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjb2xNZXRhZGF0YTogQ29sdW1uTWV0YWRhdGFbXSA9IFtdKSB7XG4gICAgbGV0IHRva2VuOiBUb2tlbiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvbkRvbmVQYXJzaW5nID0gKHQ6IFRva2VuIHwgdW5kZWZpbmVkKSA9PiB7IHRva2VuID0gdDsgfTtcblxuICAgIGNvbnN0IHN0cmVhbUJ1ZmZlciA9IG5ldyBTdHJlYW1CdWZmZXIoaXRlcmFibGUpO1xuXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcihzdHJlYW1CdWZmZXIsIGRlYnVnLCBvcHRpb25zKTtcbiAgICBwYXJzZXIuY29sTWV0YWRhdGEgPSBjb2xNZXRhZGF0YTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdHJlYW1CdWZmZXIud2FpdEZvckNodW5rKCk7XG4gICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgaWYgKHN0cmVhbUJ1ZmZlci5wb3NpdGlvbiA9PT0gc3RyZWFtQnVmZmVyLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJzZXIuc3VzcGVuZGVkKSB7XG4gICAgICAgIC8vIFVuc3VzcGVuZCBhbmQgY29udGludWUgZnJvbSB3aGVyZSBldmVyIHdlIGxlZnQgb2ZmLlxuICAgICAgICBwYXJzZXIuc3VzcGVuZGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwYXJzZXIubmV4dCE7XG5cbiAgICAgICAgbmV4dCgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgbmV3IHRva2VuIHdhcyBwYXJzZWQgYWZ0ZXIgdW5zdXNwZW5zaW9uLlxuICAgICAgICBpZiAoIXBhcnNlci5zdXNwZW5kZWQgJiYgdG9rZW4pIHtcbiAgICAgICAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBDb2xNZXRhZGF0YVRva2VuKSB7XG4gICAgICAgICAgICBwYXJzZXIuY29sTWV0YWRhdGEgPSB0b2tlbi5jb2x1bW5zO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICghcGFyc2VyLnN1c3BlbmRlZCAmJiBwYXJzZXIucG9zaXRpb24gKyAxIDw9IHBhcnNlci5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBwYXJzZXIuYnVmZmVyLnJlYWRVSW50OChwYXJzZXIucG9zaXRpb24pO1xuXG4gICAgICAgIHBhcnNlci5wb3NpdGlvbiArPSAxO1xuXG4gICAgICAgIGlmICh0eXBlID09PSBUWVBFLkNPTE1FVEFEQVRBKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBjb2xNZXRhZGF0YVBhcnNlcihwYXJzZXIpO1xuICAgICAgICAgIHBhcnNlci5jb2xNZXRhZGF0YSA9IHRva2VuLmNvbHVtbnM7XG4gICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVFlQRS5ST1cpIHtcbiAgICAgICAgICB5aWVsZCByb3dQYXJzZXIocGFyc2VyKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBUWVBFLk5CQ1JPVykge1xuICAgICAgICAgIHlpZWxkIG5iY1Jvd1BhcnNlcihwYXJzZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHRva2VuUGFyc2Vyc1t0eXBlXSkge1xuICAgICAgICAgIHRva2VuUGFyc2Vyc1t0eXBlXShwYXJzZXIsIHBhcnNlci5vcHRpb25zLCBvbkRvbmVQYXJzaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGEgbmV3IHRva2VuIHdhcyBwYXJzZWQgYWZ0ZXIgdW5zdXNwZW5zaW9uLlxuICAgICAgICAgIGlmICghcGFyc2VyLnN1c3BlbmRlZCAmJiB0b2tlbikge1xuICAgICAgICAgICAgaWYgKHRva2VuIGluc3RhbmNlb2YgQ29sTWV0YWRhdGFUb2tlbikge1xuICAgICAgICAgICAgICBwYXJzZXIuY29sTWV0YWRhdGEgPSB0b2tlbi5jb2x1bW5zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB0eXBlOiAnICsgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzdHJlYW1CdWZmZXI6IFN0cmVhbUJ1ZmZlciwgZGVidWc6IERlYnVnLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKSB7XG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnO1xuICAgIHRoaXMuY29sTWV0YWRhdGEgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5zdHJlYW1CdWZmZXIgPSBzdHJlYW1CdWZmZXI7XG4gICAgdGhpcy5zdXNwZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLm5leHQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYnVmZmVyKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUJ1ZmZlci5idWZmZXI7XG4gIH1cblxuICBnZXQgcG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtQnVmZmVyLnBvc2l0aW9uO1xuICB9XG5cbiAgc2V0IHBvc2l0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5zdHJlYW1CdWZmZXIucG9zaXRpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIHN1c3BlbmQobmV4dDogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuc3VzcGVuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLm5leHQgPSBuZXh0O1xuICB9XG5cbiAgYXdhaXREYXRhKGxlbmd0aDogbnVtYmVyLCBjYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uICsgbGVuZ3RoIDw9IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdXNwZW5kKCgpID0+IHtcbiAgICAgICAgdGhpcy5hd2FpdERhdGEobGVuZ3RoLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZWFkSW50OChjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDEsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkSW50OCh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gMTtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZFVJbnQ4KGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoMSwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYnVmZmVyLnJlYWRVSW50OCh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gMTtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEludDE2TEUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSgyLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZEludDE2TEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDI7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRJbnQxNkJFKGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoMiwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYnVmZmVyLnJlYWRJbnQxNkJFKHRoaXMucG9zaXRpb24pO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSAyO1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVUludDE2TEUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSgyLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZFVJbnQxNkxFKHRoaXMucG9zaXRpb24pO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSAyO1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVUludDE2QkUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSgyLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZFVJbnQxNkJFKHRoaXMucG9zaXRpb24pO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSAyO1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkSW50MzJMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDQsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkSW50MzJMRSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gNDtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEludDMyQkUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg0LCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZEludDMyQkUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDQ7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRVSW50MzJMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDQsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDQ7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRVSW50MzJCRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDQsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyQkUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDQ7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRCaWdJbnQ2NExFKGNhbGxiYWNrOiAoZGF0YTogYmlnaW50KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoOCwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYnVmZmVyLnJlYWRCaWdJbnQ2NExFKHRoaXMucG9zaXRpb24pO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSA4O1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkSW50NjRMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDgsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBNYXRoLnBvdygyLCAzMikgKiB0aGlzLmJ1ZmZlci5yZWFkSW50MzJMRSh0aGlzLnBvc2l0aW9uICsgNCkgKyAoKHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24gKyA0XSAmIDB4ODApID09PSAweDgwID8gMSA6IC0xKSAqIHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gODtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEludDY0QkUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg4LCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gTWF0aC5wb3coMiwgMzIpICogdGhpcy5idWZmZXIucmVhZEludDMyQkUodGhpcy5wb3NpdGlvbikgKyAoKHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb25dICYgMHg4MCkgPT09IDB4ODAgPyAxIDogLTEpICogdGhpcy5idWZmZXIucmVhZFVJbnQzMkJFKHRoaXMucG9zaXRpb24gKyA0KTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gODtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEJpZ1VJbnQ2NExFKGNhbGxiYWNrOiAoZGF0YTogYmlnaW50KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoOCwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYnVmZmVyLnJlYWRCaWdVSW50NjRMRSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gODtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZFVJbnQ2NExFKGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoOCwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IE1hdGgucG93KDIsIDMyKSAqIHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSh0aGlzLnBvc2l0aW9uICsgNCkgKyB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRVSW50NjRCRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDgsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBNYXRoLnBvdygyLCAzMikgKiB0aGlzLmJ1ZmZlci5yZWFkVUludDMyQkUodGhpcy5wb3NpdGlvbikgKyB0aGlzLmJ1ZmZlci5yZWFkVUludDMyQkUodGhpcy5wb3NpdGlvbiArIDQpO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSA4O1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkRmxvYXRMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDQsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkRmxvYXRMRSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gNDtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEZsb2F0QkUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg0LCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZEZsb2F0QkUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDQ7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWREb3VibGVMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDgsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkRG91YmxlTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWREb3VibGVCRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDgsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkRG91YmxlQkUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRVSW50MjRMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDMsICgpID0+IHtcbiAgICAgIGNvbnN0IGxvdyA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZMRSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGhpZ2ggPSB0aGlzLmJ1ZmZlci5yZWFkVUludDgodGhpcy5wb3NpdGlvbiArIDIpO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDM7XG5cbiAgICAgIGNhbGxiYWNrKGxvdyB8IChoaWdoIDw8IDE2KSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVUludDQwTEUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg1LCAoKSA9PiB7XG4gICAgICBjb25zdCBsb3cgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICBjb25zdCBoaWdoID0gdGhpcy5idWZmZXIucmVhZFVJbnQ4KHRoaXMucG9zaXRpb24gKyA0KTtcblxuICAgICAgdGhpcy5wb3NpdGlvbiArPSA1O1xuXG4gICAgICBjYWxsYmFjaygoMHgxMDAwMDAwMDAgKiBoaWdoKSArIGxvdyk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVU51bWVyaWM2NExFKGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoOCwgKCkgPT4ge1xuICAgICAgY29uc3QgbG93ID0gdGhpcy5idWZmZXIucmVhZFVJbnQzMkxFKHRoaXMucG9zaXRpb24pO1xuICAgICAgY29uc3QgaGlnaCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSh0aGlzLnBvc2l0aW9uICsgNCk7XG5cbiAgICAgIHRoaXMucG9zaXRpb24gKz0gODtcblxuICAgICAgY2FsbGJhY2soKDB4MTAwMDAwMDAwICogaGlnaCkgKyBsb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZFVOdW1lcmljOTZMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDEyLCAoKSA9PiB7XG4gICAgICBjb25zdCBkd29yZDEgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICBjb25zdCBkd29yZDIgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbiArIDQpO1xuICAgICAgY29uc3QgZHdvcmQzID0gdGhpcy5idWZmZXIucmVhZFVJbnQzMkxFKHRoaXMucG9zaXRpb24gKyA4KTtcblxuICAgICAgdGhpcy5wb3NpdGlvbiArPSAxMjtcblxuICAgICAgY2FsbGJhY2soZHdvcmQxICsgKDB4MTAwMDAwMDAwICogZHdvcmQyKSArICgweDEwMDAwMDAwMCAqIDB4MTAwMDAwMDAwICogZHdvcmQzKSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVU51bWVyaWMxMjhMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDE2LCAoKSA9PiB7XG4gICAgICBjb25zdCBkd29yZDEgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICBjb25zdCBkd29yZDIgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbiArIDQpO1xuICAgICAgY29uc3QgZHdvcmQzID0gdGhpcy5idWZmZXIucmVhZFVJbnQzMkxFKHRoaXMucG9zaXRpb24gKyA4KTtcbiAgICAgIGNvbnN0IGR3b3JkNCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSh0aGlzLnBvc2l0aW9uICsgMTIpO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDE2O1xuXG4gICAgICBjYWxsYmFjayhkd29yZDEgKyAoMHgxMDAwMDAwMDAgKiBkd29yZDIpICsgKDB4MTAwMDAwMDAwICogMHgxMDAwMDAwMDAgKiBkd29yZDMpICsgKDB4MTAwMDAwMDAwICogMHgxMDAwMDAwMDAgKiAweDEwMDAwMDAwMCAqIGR3b3JkNCkpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVmFyaWFibGUgbGVuZ3RoIGRhdGFcblxuICByZWFkQnVmZmVyKGxlbmd0aDogbnVtYmVyLCBjYWxsYmFjazogKGRhdGE6IEJ1ZmZlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKGxlbmd0aCwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zaXRpb24sIHRoaXMucG9zaXRpb24gKyBsZW5ndGgpO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFJlYWQgYSBVbmljb2RlIFN0cmluZyAoQlZBUkNIQVIpXG4gIHJlYWRCVmFyQ2hhcihjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHRoaXMucmVhZFVJbnQ4KChsZW5ndGgpID0+IHtcbiAgICAgIHRoaXMucmVhZEJ1ZmZlcihsZW5ndGggKiAyLCAoZGF0YSkgPT4ge1xuICAgICAgICBjYWxsYmFjayhkYXRhLnRvU3RyaW5nKCd1Y3MyJykpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWFkIGEgVW5pY29kZSBTdHJpbmcgKFVTVkFSQ0hBUilcbiAgcmVhZFVzVmFyQ2hhcihjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHRoaXMucmVhZFVJbnQxNkxFKChsZW5ndGgpID0+IHtcbiAgICAgIHRoaXMucmVhZEJ1ZmZlcihsZW5ndGggKiAyLCAoZGF0YSkgPT4ge1xuICAgICAgICBjYWxsYmFjayhkYXRhLnRvU3RyaW5nKCd1Y3MyJykpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWFkIGJpbmFyeSBkYXRhIChCVkFSQllURSlcbiAgcmVhZEJWYXJCeXRlKGNhbGxiYWNrOiAoZGF0YTogQnVmZmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5yZWFkVUludDgoKGxlbmd0aCkgPT4ge1xuICAgICAgdGhpcy5yZWFkQnVmZmVyKGxlbmd0aCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVhZCBiaW5hcnkgZGF0YSAoVVNWQVJCWVRFKVxuICByZWFkVXNWYXJCeXRlKGNhbGxiYWNrOiAoZGF0YTogQnVmZmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5yZWFkVUludDE2TEUoKGxlbmd0aCkgPT4ge1xuICAgICAgdGhpcy5yZWFkQnVmZmVyKGxlbmd0aCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLHFCQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxxQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sa0JBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLG9CQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxvQkFBQSxH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
342
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9rZW4iLCJyZXF1aXJlIiwiX2NvbG1ldGFkYXRhVG9rZW5QYXJzZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2RvbmVUb2tlblBhcnNlciIsIl9lbnZDaGFuZ2VUb2tlblBhcnNlciIsIl9pbmZvZXJyb3JUb2tlblBhcnNlciIsIl9mZWRhdXRoSW5mb1BhcnNlciIsIl9mZWF0dXJlRXh0QWNrUGFyc2VyIiwiX2xvZ2luYWNrVG9rZW5QYXJzZXIiLCJfb3JkZXJUb2tlblBhcnNlciIsIl9yZXR1cm5zdGF0dXNUb2tlblBhcnNlciIsIl9yZXR1cm52YWx1ZVRva2VuUGFyc2VyIiwiX3Jvd1Rva2VuUGFyc2VyIiwiX25iY3Jvd1Rva2VuUGFyc2VyIiwiX3NzcGlUb2tlblBhcnNlciIsIl9oZWxwZXJzIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQYXJzZXIiLCJkZWJ1ZyIsImNvbE1ldGFkYXRhIiwib3B0aW9ucyIsIml0ZXJhdG9yIiwiYnVmZmVyIiwicG9zaXRpb24iLCJwYXJzZVRva2VucyIsIml0ZXJhYmxlIiwicGFyc2VyIiwid2FpdEZvckNodW5rIiwiZXJyIiwibGVuZ3RoIiwidHlwZSIsInJlYWRVSW50OCIsInRva2VuIiwicmVhZFRva2VuIiwidW5kZWZpbmVkIiwiVFlQRSIsIkRPTkUiLCJyZWFkRG9uZVRva2VuIiwiRE9ORVBST0MiLCJyZWFkRG9uZVByb2NUb2tlbiIsIkRPTkVJTlBST0MiLCJyZWFkRG9uZUluUHJvY1Rva2VuIiwiRVJST1IiLCJyZWFkRXJyb3JUb2tlbiIsIklORk8iLCJyZWFkSW5mb1Rva2VuIiwiRU5WQ0hBTkdFIiwicmVhZEVudkNoYW5nZVRva2VuIiwiTE9HSU5BQ0siLCJyZWFkTG9naW5BY2tUb2tlbiIsIlJFVFVSTlNUQVRVUyIsInJlYWRSZXR1cm5TdGF0dXNUb2tlbiIsIk9SREVSIiwicmVhZE9yZGVyVG9rZW4iLCJGRURBVVRISU5GTyIsInJlYWRGZWRBdXRoSW5mb1Rva2VuIiwiU1NQSSIsInJlYWRTU1BJVG9rZW4iLCJDT0xNRVRBREFUQSIsInJlYWRDb2xNZXRhZGF0YVRva2VuIiwiUkVUVVJOVkFMVUUiLCJyZWFkUmV0dXJuVmFsdWVUb2tlbiIsIlJPVyIsInJlYWRSb3dUb2tlbiIsIk5CQ1JPVyIsInJlYWROYmNSb3dUb2tlbiIsIkZFQVRVUkVFWFRBQ0siLCJyZWFkRmVhdHVyZUV4dEFja1Rva2VuIiwiRXJyb3IiLCJyZXN1bHQiLCJmZWF0dXJlRXh0QWNrUGFyc2VyIiwiTm90RW5vdWdoRGF0YUVycm9yIiwidGhlbiIsIm9mZnNldCIsInZhbHVlIiwibmJjUm93UGFyc2VyIiwicmV0dXJuVmFsdWVQYXJzZXIiLCJjb2xNZXRhZGF0YVBhcnNlciIsImNvbHVtbnMiLCJzc3BpUGFyc2VyIiwiZmVkQXV0aEluZm9QYXJzZXIiLCJvcmRlclBhcnNlciIsInJldHVyblN0YXR1c1BhcnNlciIsImxvZ2luQWNrUGFyc2VyIiwiZW52Q2hhbmdlUGFyc2VyIiwicm93UGFyc2VyIiwiaW5mb1BhcnNlciIsImVycm9yUGFyc2VyIiwiZG9uZUluUHJvY1BhcnNlciIsImRvbmVQcm9jUGFyc2VyIiwiZG9uZVBhcnNlciIsImNvbnN0cnVjdG9yIiwiU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsImNhbGwiLCJCdWZmZXIiLCJhbGxvYyIsIm5leHQiLCJkb25lIiwiY29uY2F0Iiwic2xpY2UiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vc3RyZWFtLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGVidWcgZnJvbSAnLi4vZGVidWcnO1xuaW1wb3J0IHsgdHlwZSBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5cbmltcG9ydCB7IFRZUEUsIENvbE1ldGFkYXRhVG9rZW4sIERvbmVQcm9jVG9rZW4sIERvbmVUb2tlbiwgRG9uZUluUHJvY1Rva2VuLCBFcnJvck1lc3NhZ2VUb2tlbiwgSW5mb01lc3NhZ2VUb2tlbiwgUm93VG9rZW4sIHR5cGUgRW52Q2hhbmdlVG9rZW4sIExvZ2luQWNrVG9rZW4sIFJldHVyblN0YXR1c1Rva2VuLCBPcmRlclRva2VuLCBGZWRBdXRoSW5mb1Rva2VuLCBTU1BJVG9rZW4sIFJldHVyblZhbHVlVG9rZW4sIE5CQ1Jvd1Rva2VuLCBGZWF0dXJlRXh0QWNrVG9rZW4sIFRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5cbmltcG9ydCBjb2xNZXRhZGF0YVBhcnNlciwgeyB0eXBlIENvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgZG9uZVBhcnNlciwgZG9uZUluUHJvY1BhcnNlciwgZG9uZVByb2NQYXJzZXIgfSBmcm9tICcuL2RvbmUtdG9rZW4tcGFyc2VyJztcbmltcG9ydCBlbnZDaGFuZ2VQYXJzZXIgZnJvbSAnLi9lbnYtY2hhbmdlLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBlcnJvclBhcnNlciwgaW5mb1BhcnNlciB9IGZyb20gJy4vaW5mb2Vycm9yLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgZmVkQXV0aEluZm9QYXJzZXIgZnJvbSAnLi9mZWRhdXRoLWluZm8tcGFyc2VyJztcbmltcG9ydCBmZWF0dXJlRXh0QWNrUGFyc2VyIGZyb20gJy4vZmVhdHVyZS1leHQtYWNrLXBhcnNlcic7XG5pbXBvcnQgbG9naW5BY2tQYXJzZXIgZnJvbSAnLi9sb2dpbmFjay10b2tlbi1wYXJzZXInO1xuaW1wb3J0IG9yZGVyUGFyc2VyIGZyb20gJy4vb3JkZXItdG9rZW4tcGFyc2VyJztcbmltcG9ydCByZXR1cm5TdGF0dXNQYXJzZXIgZnJvbSAnLi9yZXR1cm5zdGF0dXMtdG9rZW4tcGFyc2VyJztcbmltcG9ydCByZXR1cm5WYWx1ZVBhcnNlciBmcm9tICcuL3JldHVybnZhbHVlLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgcm93UGFyc2VyIGZyb20gJy4vcm93LXRva2VuLXBhcnNlcic7XG5pbXBvcnQgbmJjUm93UGFyc2VyIGZyb20gJy4vbmJjcm93LXRva2VuLXBhcnNlcic7XG5pbXBvcnQgc3NwaVBhcnNlciBmcm9tICcuL3NzcGktdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IE5vdEVub3VnaERhdGFFcnJvciB9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydCB0eXBlIFBhcnNlck9wdGlvbnMgPSBQaWNrPEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMsICd1c2VVVEMnIHwgJ2xvd2VyQ2FzZUd1aWRzJyB8ICd0ZHNWZXJzaW9uJyB8ICd1c2VDb2x1bW5OYW1lcycgfCAnY29sdW1uTmFtZVJlcGxhY2VyJyB8ICdjYW1lbENhc2VDb2x1bW5zJz47XG5cbmNsYXNzIFBhcnNlciB7XG4gIGRlYnVnOiBEZWJ1ZztcbiAgY29sTWV0YWRhdGE6IENvbHVtbk1ldGFkYXRhW107XG4gIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG5cbiAgaXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8QnVmZmVyLCBhbnksIHVuZGVmaW5lZD4gfCBJdGVyYXRvcjxCdWZmZXIsIGFueSwgdW5kZWZpbmVkPjtcbiAgYnVmZmVyOiBCdWZmZXI7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgc3RhdGljIGFzeW5jICpwYXJzZVRva2VucyhpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHwgSXRlcmFibGU8QnVmZmVyPiwgZGVidWc6IERlYnVnLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjb2xNZXRhZGF0YTogQ29sdW1uTWV0YWRhdGFbXSA9IFtdKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcihpdGVyYWJsZSwgZGVidWcsIG9wdGlvbnMpO1xuICAgIHBhcnNlci5jb2xNZXRhZGF0YSA9IGNvbE1ldGFkYXRhO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHBhcnNlci53YWl0Rm9yQ2h1bmsoKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICBpZiAocGFyc2VyLnBvc2l0aW9uID09PSBwYXJzZXIuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHBhcnNlci5idWZmZXIubGVuZ3RoID49IHBhcnNlci5wb3NpdGlvbiArIDEpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlci5idWZmZXIucmVhZFVJbnQ4KHBhcnNlci5wb3NpdGlvbik7XG4gICAgICAgIHBhcnNlci5wb3NpdGlvbiArPSAxO1xuXG4gICAgICAgIGNvbnN0IHRva2VuID0gcGFyc2VyLnJlYWRUb2tlbih0eXBlKTtcbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB5aWVsZCB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlYWRUb2tlbih0eXBlOiBudW1iZXIpOiBUb2tlbiB8IHVuZGVmaW5lZCB8IFByb21pc2U8VG9rZW4gfCB1bmRlZmluZWQ+IHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVFlQRS5ET05FOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWREb25lVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLkRPTkVQUk9DOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWREb25lUHJvY1Rva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5ET05FSU5QUk9DOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWREb25lSW5Qcm9jVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLkVSUk9SOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRFcnJvclRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5JTkZPOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRJbmZvVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLkVOVkNIQU5HRToge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRW52Q2hhbmdlVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLkxPR0lOQUNLOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRMb2dpbkFja1Rva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5SRVRVUk5TVEFUVVM6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFJldHVyblN0YXR1c1Rva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5PUkRFUjoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkT3JkZXJUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuRkVEQVVUSElORk86IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZlZEF1dGhJbmZvVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLlNTUEk6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFNTUElUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuQ09MTUVUQURBVEE6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZENvbE1ldGFkYXRhVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLlJFVFVSTlZBTFVFOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRSZXR1cm5WYWx1ZVRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5ST1c6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFJvd1Rva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5OQkNST1c6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE5iY1Jvd1Rva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5GRUFUVVJFRVhUQUNLOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGZWF0dXJlRXh0QWNrVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZTogJyArIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlYWRGZWF0dXJlRXh0QWNrVG9rZW4oKTogRmVhdHVyZUV4dEFja1Rva2VuIHwgUHJvbWlzZTxGZWF0dXJlRXh0QWNrVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGZlYXR1cmVFeHRBY2tQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZlYXR1cmVFeHRBY2tUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICBhc3luYyByZWFkTmJjUm93VG9rZW4oKTogUHJvbWlzZTxOQkNSb3dUb2tlbj4ge1xuICAgIHJldHVybiBhd2FpdCBuYmNSb3dQYXJzZXIodGhpcyk7XG4gIH1cblxuICBhc3luYyByZWFkUmV0dXJuVmFsdWVUb2tlbigpOiBQcm9taXNlPFJldHVyblZhbHVlVG9rZW4+IHtcbiAgICByZXR1cm4gYXdhaXQgcmV0dXJuVmFsdWVQYXJzZXIodGhpcyk7XG4gIH1cblxuICBhc3luYyByZWFkQ29sTWV0YWRhdGFUb2tlbigpOiBQcm9taXNlPENvbE1ldGFkYXRhVG9rZW4+IHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGNvbE1ldGFkYXRhUGFyc2VyKHRoaXMpO1xuICAgIHRoaXMuY29sTWV0YWRhdGEgPSB0b2tlbi5jb2x1bW5zO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHJlYWRTU1BJVG9rZW4oKTogU1NQSVRva2VuIHwgUHJvbWlzZTxTU1BJVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHNzcGlQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZFNTUElUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkRmVkQXV0aEluZm9Ub2tlbigpOiBGZWRBdXRoSW5mb1Rva2VuIHwgUHJvbWlzZTxGZWRBdXRoSW5mb1Rva2VuPiB7XG4gICAgbGV0IHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBmZWRBdXRoSW5mb1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmVkQXV0aEluZm9Ub2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkT3JkZXJUb2tlbigpOiBPcmRlclRva2VuIHwgUHJvbWlzZTxPcmRlclRva2VuPiB7XG4gICAgbGV0IHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBvcmRlclBhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkT3JkZXJUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkUmV0dXJuU3RhdHVzVG9rZW4oKTogUmV0dXJuU3RhdHVzVG9rZW4gfCBQcm9taXNlPFJldHVyblN0YXR1c1Rva2VuPiB7XG4gICAgbGV0IHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSByZXR1cm5TdGF0dXNQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZFJldHVyblN0YXR1c1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRMb2dpbkFja1Rva2VuKCk6IExvZ2luQWNrVG9rZW4gfCBQcm9taXNlPExvZ2luQWNrVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGxvZ2luQWNrUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRMb2dpbkFja1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRFbnZDaGFuZ2VUb2tlbigpOiBFbnZDaGFuZ2VUb2tlbiB8IHVuZGVmaW5lZCB8IFByb21pc2U8RW52Q2hhbmdlVG9rZW4gfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGVudkNoYW5nZVBhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRW52Q2hhbmdlVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZFJvd1Rva2VuKCk6IFJvd1Rva2VuIHwgUHJvbWlzZTxSb3dUb2tlbj4ge1xuICAgIHJldHVybiByb3dQYXJzZXIodGhpcyk7XG4gIH1cblxuICByZWFkSW5mb1Rva2VuKCk6IEluZm9NZXNzYWdlVG9rZW4gfCBQcm9taXNlPEluZm9NZXNzYWdlVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGluZm9QYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEluZm9Ub2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkRXJyb3JUb2tlbigpOiBFcnJvck1lc3NhZ2VUb2tlbiB8IFByb21pc2U8RXJyb3JNZXNzYWdlVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGVycm9yUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRFcnJvclRva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWREb25lSW5Qcm9jVG9rZW4oKTogRG9uZUluUHJvY1Rva2VuIHwgUHJvbWlzZTxEb25lSW5Qcm9jVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGRvbmVJblByb2NQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVJblByb2NUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkRG9uZVByb2NUb2tlbigpOiBEb25lUHJvY1Rva2VuIHwgUHJvbWlzZTxEb25lUHJvY1Rva2VuPiB7XG4gICAgbGV0IHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBkb25lUHJvY1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRG9uZVByb2NUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkRG9uZVRva2VuKCk6IERvbmVUb2tlbiB8IFByb21pc2U8RG9uZVRva2VuPiB7XG4gICAgbGV0IHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBkb25lUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWREb25lVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoaXRlcmFibGU6IEFzeW5jSXRlcmFibGU8QnVmZmVyPiB8IEl0ZXJhYmxlPEJ1ZmZlcj4sIGRlYnVnOiBEZWJ1Zywgb3B0aW9uczogUGFyc2VyT3B0aW9ucykge1xuICAgIHRoaXMuZGVidWcgPSBkZWJ1ZztcbiAgICB0aGlzLmNvbE1ldGFkYXRhID0gW107XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIHRoaXMuaXRlcmF0b3IgPSAoKGl0ZXJhYmxlIGFzIEFzeW5jSXRlcmFibGU8QnVmZmVyPilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdIHx8IChpdGVyYWJsZSBhcyBJdGVyYWJsZTxCdWZmZXI+KVtTeW1ib2wuaXRlcmF0b3JdKS5jYWxsKGl0ZXJhYmxlKTtcblxuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIHRoaXMucG9zaXRpb24gPSAwO1xuICB9XG5cbiAgYXN5bmMgd2FpdEZvckNodW5rKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaXRlcmF0b3IubmV4dCgpO1xuICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBkYXRhJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT09IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgdGhpcy5idWZmZXIgPSByZXN1bHQudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmNvbmNhdChbdGhpcy5idWZmZXIuc2xpY2UodGhpcy5wb3NpdGlvbiksIHJlc3VsdC52YWx1ZV0pO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSAwO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLHFCQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxxQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sa0JBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLG9CQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJ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