@aneoconsultingfr/armonik.api.angular 3.4.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 (68) hide show
  1. package/README.md +24 -0
  2. package/esm2020/aneoconsultingfr-armonik.api.angular.mjs +5 -0
  3. package/esm2020/lib/generated/applications-common.pb.mjs +964 -0
  4. package/esm2020/lib/generated/applications-service.pb.mjs +2 -0
  5. package/esm2020/lib/generated/applications-service.pbconf.mjs +13 -0
  6. package/esm2020/lib/generated/applications-service.pbsc.mjs +104 -0
  7. package/esm2020/lib/generated/auth-common.pb.mjs +318 -0
  8. package/esm2020/lib/generated/auth-service.pb.mjs +2 -0
  9. package/esm2020/lib/generated/auth-service.pbconf.mjs +13 -0
  10. package/esm2020/lib/generated/auth-service.pbsc.mjs +74 -0
  11. package/esm2020/lib/generated/objects.pb.mjs +2705 -0
  12. package/esm2020/lib/generated/partitions-common.pb.mjs +1169 -0
  13. package/esm2020/lib/generated/partitions-service.pb.mjs +2 -0
  14. package/esm2020/lib/generated/partitions-service.pbconf.mjs +13 -0
  15. package/esm2020/lib/generated/partitions-service.pbsc.mjs +104 -0
  16. package/esm2020/lib/generated/result-status.pb.mjs +15 -0
  17. package/esm2020/lib/generated/results-common.pb.mjs +1167 -0
  18. package/esm2020/lib/generated/results-service.pb.mjs +2 -0
  19. package/esm2020/lib/generated/results-service.pbconf.mjs +13 -0
  20. package/esm2020/lib/generated/results-service.pbsc.mjs +104 -0
  21. package/esm2020/lib/generated/session-status.pb.mjs +13 -0
  22. package/esm2020/lib/generated/sessions-common.pb.mjs +1683 -0
  23. package/esm2020/lib/generated/sessions-service.pb.mjs +2 -0
  24. package/esm2020/lib/generated/sessions-service.pbconf.mjs +13 -0
  25. package/esm2020/lib/generated/sessions-service.pbsc.mjs +164 -0
  26. package/esm2020/lib/generated/task-status.pb.mjs +21 -0
  27. package/esm2020/lib/generated/tasks-common.pb.mjs +2398 -0
  28. package/esm2020/lib/generated/tasks-service.pb.mjs +2 -0
  29. package/esm2020/lib/generated/tasks-service.pbconf.mjs +13 -0
  30. package/esm2020/lib/generated/tasks-service.pbsc.mjs +194 -0
  31. package/esm2020/lib/index.mjs +16 -0
  32. package/esm2020/public-api.mjs +5 -0
  33. package/fesm2015/aneoconsultingfr-armonik.api.angular.mjs +11173 -0
  34. package/fesm2015/aneoconsultingfr-armonik.api.angular.mjs.map +1 -0
  35. package/fesm2020/aneoconsultingfr-armonik.api.angular.mjs +11161 -0
  36. package/fesm2020/aneoconsultingfr-armonik.api.angular.mjs.map +1 -0
  37. package/index.d.ts +5 -0
  38. package/lib/generated/applications-common.pb.d.ts +568 -0
  39. package/lib/generated/applications-service.pb.d.ts +1 -0
  40. package/lib/generated/applications-service.pbconf.d.ts +6 -0
  41. package/lib/generated/applications-service.pbsc.d.ts +54 -0
  42. package/lib/generated/auth-common.pb.d.ts +214 -0
  43. package/lib/generated/auth-service.pb.d.ts +1 -0
  44. package/lib/generated/auth-service.pbconf.d.ts +6 -0
  45. package/lib/generated/auth-service.pbsc.d.ts +38 -0
  46. package/lib/generated/objects.pb.d.ts +1673 -0
  47. package/lib/generated/partitions-common.pb.d.ts +671 -0
  48. package/lib/generated/partitions-service.pb.d.ts +1 -0
  49. package/lib/generated/partitions-service.pbconf.d.ts +6 -0
  50. package/lib/generated/partitions-service.pbsc.d.ts +54 -0
  51. package/lib/generated/result-status.pb.d.ts +7 -0
  52. package/lib/generated/results-common.pb.d.ts +664 -0
  53. package/lib/generated/results-service.pb.d.ts +1 -0
  54. package/lib/generated/results-service.pbconf.d.ts +6 -0
  55. package/lib/generated/results-service.pbsc.d.ts +54 -0
  56. package/lib/generated/session-status.pb.d.ts +5 -0
  57. package/lib/generated/sessions-common.pb.d.ts +965 -0
  58. package/lib/generated/sessions-service.pb.d.ts +1 -0
  59. package/lib/generated/sessions-service.pbconf.d.ts +6 -0
  60. package/lib/generated/sessions-service.pbsc.d.ts +86 -0
  61. package/lib/generated/task-status.pb.d.ts +13 -0
  62. package/lib/generated/tasks-common.pb.d.ts +1328 -0
  63. package/lib/generated/tasks-service.pb.d.ts +1 -0
  64. package/lib/generated/tasks-service.pbconf.d.ts +6 -0
  65. package/lib/generated/tasks-service.pbsc.d.ts +102 -0
  66. package/lib/index.d.ts +15 -0
  67. package/package.json +52 -0
  68. package/public-api.d.ts +1 -0
@@ -0,0 +1,2705 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ // @ts-nocheck
4
+ //
5
+ // THIS IS A GENERATED FILE
6
+ // DO NOT MODIFY IT! YOUR CHANGES WILL BE LOST
7
+ import { uint8ArrayToBase64 } from '@ngx-grpc/common';
8
+ import { BinaryReader, BinaryWriter } from 'google-protobuf';
9
+ import * as googleProtobuf000 from '@ngx-grpc/well-known-types';
10
+ import * as armonikApiGrpcV1Task_status001 from './task-status.pb';
11
+ /**
12
+ * Message implementation for armonik.api.grpc.v1.Empty
13
+ */
14
+ export class Empty {
15
+ /**
16
+ * Deserialize binary data to message
17
+ * @param instance message instance
18
+ */
19
+ static deserializeBinary(bytes) {
20
+ const instance = new Empty();
21
+ Empty.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
22
+ return instance;
23
+ }
24
+ /**
25
+ * Check all the properties and set default protobuf values if necessary
26
+ * @param _instance message instance
27
+ */
28
+ static refineValues(_instance) { }
29
+ /**
30
+ * Deserializes / reads binary message into message instance using provided binary reader
31
+ * @param _instance message instance
32
+ * @param _reader binary reader instance
33
+ */
34
+ static deserializeBinaryFromReader(_instance, _reader) {
35
+ while (_reader.nextField()) {
36
+ if (_reader.isEndGroup())
37
+ break;
38
+ switch (_reader.getFieldNumber()) {
39
+ default:
40
+ _reader.skipField();
41
+ }
42
+ }
43
+ Empty.refineValues(_instance);
44
+ }
45
+ /**
46
+ * Serializes a message to binary format using provided binary reader
47
+ * @param _instance message instance
48
+ * @param _writer binary writer instance
49
+ */
50
+ static serializeBinaryToWriter(_instance, _writer) { }
51
+ /**
52
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
53
+ * @param _value initial values object or instance of Empty to deeply clone from
54
+ */
55
+ constructor(_value) {
56
+ _value = _value || {};
57
+ Empty.refineValues(this);
58
+ }
59
+ /**
60
+ * Serialize message to binary data
61
+ * @param instance message instance
62
+ */
63
+ serializeBinary() {
64
+ const writer = new BinaryWriter();
65
+ Empty.serializeBinaryToWriter(this, writer);
66
+ return writer.getResultBuffer();
67
+ }
68
+ /**
69
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
70
+ */
71
+ toObject() {
72
+ return {};
73
+ }
74
+ /**
75
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
76
+ */
77
+ toJSON() {
78
+ return this.toObject();
79
+ }
80
+ /**
81
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
82
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
83
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
84
+ */
85
+ toProtobufJSON(
86
+ // @ts-ignore
87
+ options) {
88
+ return {};
89
+ }
90
+ }
91
+ Empty.id = 'armonik.api.grpc.v1.Empty';
92
+ /**
93
+ * Message implementation for armonik.api.grpc.v1.TaskOptions
94
+ */
95
+ export class TaskOptions {
96
+ /**
97
+ * Deserialize binary data to message
98
+ * @param instance message instance
99
+ */
100
+ static deserializeBinary(bytes) {
101
+ const instance = new TaskOptions();
102
+ TaskOptions.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
103
+ return instance;
104
+ }
105
+ /**
106
+ * Check all the properties and set default protobuf values if necessary
107
+ * @param _instance message instance
108
+ */
109
+ static refineValues(_instance) {
110
+ _instance.options = _instance.options || {};
111
+ _instance.maxDuration = _instance.maxDuration || undefined;
112
+ _instance.maxRetries = _instance.maxRetries || 0;
113
+ _instance.priority = _instance.priority || 0;
114
+ _instance.partitionId = _instance.partitionId || '';
115
+ _instance.applicationName = _instance.applicationName || '';
116
+ _instance.applicationVersion = _instance.applicationVersion || '';
117
+ _instance.applicationNamespace = _instance.applicationNamespace || '';
118
+ _instance.applicationService = _instance.applicationService || '';
119
+ _instance.engineType = _instance.engineType || '';
120
+ }
121
+ /**
122
+ * Deserializes / reads binary message into message instance using provided binary reader
123
+ * @param _instance message instance
124
+ * @param _reader binary reader instance
125
+ */
126
+ static deserializeBinaryFromReader(_instance, _reader) {
127
+ while (_reader.nextField()) {
128
+ if (_reader.isEndGroup())
129
+ break;
130
+ switch (_reader.getFieldNumber()) {
131
+ case 1:
132
+ const msg_1 = {};
133
+ _reader.readMessage(msg_1, TaskOptions.OptionsEntry.deserializeBinaryFromReader);
134
+ _instance.options = _instance.options || {};
135
+ _instance.options[msg_1.key] = msg_1.value;
136
+ break;
137
+ case 2:
138
+ _instance.maxDuration = new googleProtobuf000.Duration();
139
+ _reader.readMessage(_instance.maxDuration, googleProtobuf000.Duration.deserializeBinaryFromReader);
140
+ break;
141
+ case 3:
142
+ _instance.maxRetries = _reader.readInt32();
143
+ break;
144
+ case 4:
145
+ _instance.priority = _reader.readInt32();
146
+ break;
147
+ case 5:
148
+ _instance.partitionId = _reader.readString();
149
+ break;
150
+ case 6:
151
+ _instance.applicationName = _reader.readString();
152
+ break;
153
+ case 7:
154
+ _instance.applicationVersion = _reader.readString();
155
+ break;
156
+ case 8:
157
+ _instance.applicationNamespace = _reader.readString();
158
+ break;
159
+ case 9:
160
+ _instance.applicationService = _reader.readString();
161
+ break;
162
+ case 10:
163
+ _instance.engineType = _reader.readString();
164
+ break;
165
+ default:
166
+ _reader.skipField();
167
+ }
168
+ }
169
+ TaskOptions.refineValues(_instance);
170
+ }
171
+ /**
172
+ * Serializes a message to binary format using provided binary reader
173
+ * @param _instance message instance
174
+ * @param _writer binary writer instance
175
+ */
176
+ static serializeBinaryToWriter(_instance, _writer) {
177
+ if (!!_instance.options) {
178
+ const keys_1 = Object.keys(_instance.options);
179
+ if (keys_1.length) {
180
+ const repeated_1 = keys_1
181
+ .map(key => ({ key: key, value: _instance.options[key] }))
182
+ .reduce((r, v) => [...r, v], []);
183
+ _writer.writeRepeatedMessage(1, repeated_1, TaskOptions.OptionsEntry.serializeBinaryToWriter);
184
+ }
185
+ }
186
+ if (_instance.maxDuration) {
187
+ _writer.writeMessage(2, _instance.maxDuration, googleProtobuf000.Duration.serializeBinaryToWriter);
188
+ }
189
+ if (_instance.maxRetries) {
190
+ _writer.writeInt32(3, _instance.maxRetries);
191
+ }
192
+ if (_instance.priority) {
193
+ _writer.writeInt32(4, _instance.priority);
194
+ }
195
+ if (_instance.partitionId) {
196
+ _writer.writeString(5, _instance.partitionId);
197
+ }
198
+ if (_instance.applicationName) {
199
+ _writer.writeString(6, _instance.applicationName);
200
+ }
201
+ if (_instance.applicationVersion) {
202
+ _writer.writeString(7, _instance.applicationVersion);
203
+ }
204
+ if (_instance.applicationNamespace) {
205
+ _writer.writeString(8, _instance.applicationNamespace);
206
+ }
207
+ if (_instance.applicationService) {
208
+ _writer.writeString(9, _instance.applicationService);
209
+ }
210
+ if (_instance.engineType) {
211
+ _writer.writeString(10, _instance.engineType);
212
+ }
213
+ }
214
+ /**
215
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
216
+ * @param _value initial values object or instance of TaskOptions to deeply clone from
217
+ */
218
+ constructor(_value) {
219
+ _value = _value || {};
220
+ (this.options = _value.options
221
+ ? Object.keys(_value.options).reduce((r, k) => ({ ...r, [k]: _value.options[k] }), {})
222
+ : {}),
223
+ (this.maxDuration = _value.maxDuration
224
+ ? new googleProtobuf000.Duration(_value.maxDuration)
225
+ : undefined);
226
+ this.maxRetries = _value.maxRetries;
227
+ this.priority = _value.priority;
228
+ this.partitionId = _value.partitionId;
229
+ this.applicationName = _value.applicationName;
230
+ this.applicationVersion = _value.applicationVersion;
231
+ this.applicationNamespace = _value.applicationNamespace;
232
+ this.applicationService = _value.applicationService;
233
+ this.engineType = _value.engineType;
234
+ TaskOptions.refineValues(this);
235
+ }
236
+ get options() {
237
+ return this._options;
238
+ }
239
+ set options(value) {
240
+ this._options = value;
241
+ }
242
+ get maxDuration() {
243
+ return this._maxDuration;
244
+ }
245
+ set maxDuration(value) {
246
+ this._maxDuration = value;
247
+ }
248
+ get maxRetries() {
249
+ return this._maxRetries;
250
+ }
251
+ set maxRetries(value) {
252
+ this._maxRetries = value;
253
+ }
254
+ get priority() {
255
+ return this._priority;
256
+ }
257
+ set priority(value) {
258
+ this._priority = value;
259
+ }
260
+ get partitionId() {
261
+ return this._partitionId;
262
+ }
263
+ set partitionId(value) {
264
+ this._partitionId = value;
265
+ }
266
+ get applicationName() {
267
+ return this._applicationName;
268
+ }
269
+ set applicationName(value) {
270
+ this._applicationName = value;
271
+ }
272
+ get applicationVersion() {
273
+ return this._applicationVersion;
274
+ }
275
+ set applicationVersion(value) {
276
+ this._applicationVersion = value;
277
+ }
278
+ get applicationNamespace() {
279
+ return this._applicationNamespace;
280
+ }
281
+ set applicationNamespace(value) {
282
+ this._applicationNamespace = value;
283
+ }
284
+ get applicationService() {
285
+ return this._applicationService;
286
+ }
287
+ set applicationService(value) {
288
+ this._applicationService = value;
289
+ }
290
+ get engineType() {
291
+ return this._engineType;
292
+ }
293
+ set engineType(value) {
294
+ this._engineType = value;
295
+ }
296
+ /**
297
+ * Serialize message to binary data
298
+ * @param instance message instance
299
+ */
300
+ serializeBinary() {
301
+ const writer = new BinaryWriter();
302
+ TaskOptions.serializeBinaryToWriter(this, writer);
303
+ return writer.getResultBuffer();
304
+ }
305
+ /**
306
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
307
+ */
308
+ toObject() {
309
+ return {
310
+ options: this.options
311
+ ? Object.keys(this.options).reduce((r, k) => ({ ...r, [k]: this.options[k] }), {})
312
+ : {},
313
+ maxDuration: this.maxDuration ? this.maxDuration.toObject() : undefined,
314
+ maxRetries: this.maxRetries,
315
+ priority: this.priority,
316
+ partitionId: this.partitionId,
317
+ applicationName: this.applicationName,
318
+ applicationVersion: this.applicationVersion,
319
+ applicationNamespace: this.applicationNamespace,
320
+ applicationService: this.applicationService,
321
+ engineType: this.engineType
322
+ };
323
+ }
324
+ /**
325
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
326
+ */
327
+ toJSON() {
328
+ return this.toObject();
329
+ }
330
+ /**
331
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
332
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
333
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
334
+ */
335
+ toProtobufJSON(
336
+ // @ts-ignore
337
+ options) {
338
+ return {
339
+ options: this.options
340
+ ? Object.keys(this.options).reduce((r, k) => ({ ...r, [k]: this.options[k] }), {})
341
+ : {},
342
+ maxDuration: this.maxDuration
343
+ ? this.maxDuration.toProtobufJSON(options)
344
+ : null,
345
+ maxRetries: this.maxRetries,
346
+ priority: this.priority,
347
+ partitionId: this.partitionId,
348
+ applicationName: this.applicationName,
349
+ applicationVersion: this.applicationVersion,
350
+ applicationNamespace: this.applicationNamespace,
351
+ applicationService: this.applicationService,
352
+ engineType: this.engineType
353
+ };
354
+ }
355
+ }
356
+ TaskOptions.id = 'armonik.api.grpc.v1.TaskOptions';
357
+ (function (TaskOptions) {
358
+ /**
359
+ * Message implementation for armonik.api.grpc.v1.TaskOptions.OptionsEntry
360
+ */
361
+ class OptionsEntry {
362
+ /**
363
+ * Deserialize binary data to message
364
+ * @param instance message instance
365
+ */
366
+ static deserializeBinary(bytes) {
367
+ const instance = new OptionsEntry();
368
+ OptionsEntry.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
369
+ return instance;
370
+ }
371
+ /**
372
+ * Check all the properties and set default protobuf values if necessary
373
+ * @param _instance message instance
374
+ */
375
+ static refineValues(_instance) {
376
+ _instance.key = _instance.key || '';
377
+ _instance.value = _instance.value || '';
378
+ }
379
+ /**
380
+ * Deserializes / reads binary message into message instance using provided binary reader
381
+ * @param _instance message instance
382
+ * @param _reader binary reader instance
383
+ */
384
+ static deserializeBinaryFromReader(_instance, _reader) {
385
+ while (_reader.nextField()) {
386
+ if (_reader.isEndGroup())
387
+ break;
388
+ switch (_reader.getFieldNumber()) {
389
+ case 1:
390
+ _instance.key = _reader.readString();
391
+ break;
392
+ case 2:
393
+ _instance.value = _reader.readString();
394
+ break;
395
+ default:
396
+ _reader.skipField();
397
+ }
398
+ }
399
+ OptionsEntry.refineValues(_instance);
400
+ }
401
+ /**
402
+ * Serializes a message to binary format using provided binary reader
403
+ * @param _instance message instance
404
+ * @param _writer binary writer instance
405
+ */
406
+ static serializeBinaryToWriter(_instance, _writer) {
407
+ if (_instance.key) {
408
+ _writer.writeString(1, _instance.key);
409
+ }
410
+ if (_instance.value) {
411
+ _writer.writeString(2, _instance.value);
412
+ }
413
+ }
414
+ /**
415
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
416
+ * @param _value initial values object or instance of OptionsEntry to deeply clone from
417
+ */
418
+ constructor(_value) {
419
+ _value = _value || {};
420
+ this.key = _value.key;
421
+ this.value = _value.value;
422
+ OptionsEntry.refineValues(this);
423
+ }
424
+ get key() {
425
+ return this._key;
426
+ }
427
+ set key(value) {
428
+ this._key = value;
429
+ }
430
+ get value() {
431
+ return this._value;
432
+ }
433
+ set value(value) {
434
+ this._value = value;
435
+ }
436
+ /**
437
+ * Serialize message to binary data
438
+ * @param instance message instance
439
+ */
440
+ serializeBinary() {
441
+ const writer = new BinaryWriter();
442
+ OptionsEntry.serializeBinaryToWriter(this, writer);
443
+ return writer.getResultBuffer();
444
+ }
445
+ /**
446
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
447
+ */
448
+ toObject() {
449
+ return {
450
+ key: this.key,
451
+ value: this.value
452
+ };
453
+ }
454
+ /**
455
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
456
+ */
457
+ toJSON() {
458
+ return this.toObject();
459
+ }
460
+ /**
461
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
462
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
463
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
464
+ */
465
+ toProtobufJSON(
466
+ // @ts-ignore
467
+ options) {
468
+ return {
469
+ key: this.key,
470
+ value: this.value
471
+ };
472
+ }
473
+ }
474
+ OptionsEntry.id = 'armonik.api.grpc.v1.TaskOptions.OptionsEntry';
475
+ TaskOptions.OptionsEntry = OptionsEntry;
476
+ })(TaskOptions || (TaskOptions = {}));
477
+ /**
478
+ * Message implementation for armonik.api.grpc.v1.Session
479
+ */
480
+ export class Session {
481
+ /**
482
+ * Deserialize binary data to message
483
+ * @param instance message instance
484
+ */
485
+ static deserializeBinary(bytes) {
486
+ const instance = new Session();
487
+ Session.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
488
+ return instance;
489
+ }
490
+ /**
491
+ * Check all the properties and set default protobuf values if necessary
492
+ * @param _instance message instance
493
+ */
494
+ static refineValues(_instance) {
495
+ _instance.id = _instance.id || '';
496
+ }
497
+ /**
498
+ * Deserializes / reads binary message into message instance using provided binary reader
499
+ * @param _instance message instance
500
+ * @param _reader binary reader instance
501
+ */
502
+ static deserializeBinaryFromReader(_instance, _reader) {
503
+ while (_reader.nextField()) {
504
+ if (_reader.isEndGroup())
505
+ break;
506
+ switch (_reader.getFieldNumber()) {
507
+ case 1:
508
+ _instance.id = _reader.readString();
509
+ break;
510
+ default:
511
+ _reader.skipField();
512
+ }
513
+ }
514
+ Session.refineValues(_instance);
515
+ }
516
+ /**
517
+ * Serializes a message to binary format using provided binary reader
518
+ * @param _instance message instance
519
+ * @param _writer binary writer instance
520
+ */
521
+ static serializeBinaryToWriter(_instance, _writer) {
522
+ if (_instance.id) {
523
+ _writer.writeString(1, _instance.id);
524
+ }
525
+ }
526
+ /**
527
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
528
+ * @param _value initial values object or instance of Session to deeply clone from
529
+ */
530
+ constructor(_value) {
531
+ _value = _value || {};
532
+ this.id = _value.id;
533
+ Session.refineValues(this);
534
+ }
535
+ get id() {
536
+ return this._id;
537
+ }
538
+ set id(value) {
539
+ this._id = value;
540
+ }
541
+ /**
542
+ * Serialize message to binary data
543
+ * @param instance message instance
544
+ */
545
+ serializeBinary() {
546
+ const writer = new BinaryWriter();
547
+ Session.serializeBinaryToWriter(this, writer);
548
+ return writer.getResultBuffer();
549
+ }
550
+ /**
551
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
552
+ */
553
+ toObject() {
554
+ return {
555
+ id: this.id
556
+ };
557
+ }
558
+ /**
559
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
560
+ */
561
+ toJSON() {
562
+ return this.toObject();
563
+ }
564
+ /**
565
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
566
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
567
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
568
+ */
569
+ toProtobufJSON(
570
+ // @ts-ignore
571
+ options) {
572
+ return {
573
+ id: this.id
574
+ };
575
+ }
576
+ }
577
+ Session.id = 'armonik.api.grpc.v1.Session';
578
+ /**
579
+ * Message implementation for armonik.api.grpc.v1.Configuration
580
+ */
581
+ export class Configuration {
582
+ /**
583
+ * Deserialize binary data to message
584
+ * @param instance message instance
585
+ */
586
+ static deserializeBinary(bytes) {
587
+ const instance = new Configuration();
588
+ Configuration.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
589
+ return instance;
590
+ }
591
+ /**
592
+ * Check all the properties and set default protobuf values if necessary
593
+ * @param _instance message instance
594
+ */
595
+ static refineValues(_instance) {
596
+ _instance.dataChunkMaxSize = _instance.dataChunkMaxSize || 0;
597
+ }
598
+ /**
599
+ * Deserializes / reads binary message into message instance using provided binary reader
600
+ * @param _instance message instance
601
+ * @param _reader binary reader instance
602
+ */
603
+ static deserializeBinaryFromReader(_instance, _reader) {
604
+ while (_reader.nextField()) {
605
+ if (_reader.isEndGroup())
606
+ break;
607
+ switch (_reader.getFieldNumber()) {
608
+ case 1:
609
+ _instance.dataChunkMaxSize = _reader.readInt32();
610
+ break;
611
+ default:
612
+ _reader.skipField();
613
+ }
614
+ }
615
+ Configuration.refineValues(_instance);
616
+ }
617
+ /**
618
+ * Serializes a message to binary format using provided binary reader
619
+ * @param _instance message instance
620
+ * @param _writer binary writer instance
621
+ */
622
+ static serializeBinaryToWriter(_instance, _writer) {
623
+ if (_instance.dataChunkMaxSize) {
624
+ _writer.writeInt32(1, _instance.dataChunkMaxSize);
625
+ }
626
+ }
627
+ /**
628
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
629
+ * @param _value initial values object or instance of Configuration to deeply clone from
630
+ */
631
+ constructor(_value) {
632
+ _value = _value || {};
633
+ this.dataChunkMaxSize = _value.dataChunkMaxSize;
634
+ Configuration.refineValues(this);
635
+ }
636
+ get dataChunkMaxSize() {
637
+ return this._dataChunkMaxSize;
638
+ }
639
+ set dataChunkMaxSize(value) {
640
+ this._dataChunkMaxSize = value;
641
+ }
642
+ /**
643
+ * Serialize message to binary data
644
+ * @param instance message instance
645
+ */
646
+ serializeBinary() {
647
+ const writer = new BinaryWriter();
648
+ Configuration.serializeBinaryToWriter(this, writer);
649
+ return writer.getResultBuffer();
650
+ }
651
+ /**
652
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
653
+ */
654
+ toObject() {
655
+ return {
656
+ dataChunkMaxSize: this.dataChunkMaxSize
657
+ };
658
+ }
659
+ /**
660
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
661
+ */
662
+ toJSON() {
663
+ return this.toObject();
664
+ }
665
+ /**
666
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
667
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
668
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
669
+ */
670
+ toProtobufJSON(
671
+ // @ts-ignore
672
+ options) {
673
+ return {
674
+ dataChunkMaxSize: this.dataChunkMaxSize
675
+ };
676
+ }
677
+ }
678
+ Configuration.id = 'armonik.api.grpc.v1.Configuration';
679
+ /**
680
+ * Message implementation for armonik.api.grpc.v1.Output
681
+ */
682
+ export class Output {
683
+ /**
684
+ * Deserialize binary data to message
685
+ * @param instance message instance
686
+ */
687
+ static deserializeBinary(bytes) {
688
+ const instance = new Output();
689
+ Output.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
690
+ return instance;
691
+ }
692
+ /**
693
+ * Check all the properties and set default protobuf values if necessary
694
+ * @param _instance message instance
695
+ */
696
+ static refineValues(_instance) { }
697
+ /**
698
+ * Deserializes / reads binary message into message instance using provided binary reader
699
+ * @param _instance message instance
700
+ * @param _reader binary reader instance
701
+ */
702
+ static deserializeBinaryFromReader(_instance, _reader) {
703
+ while (_reader.nextField()) {
704
+ if (_reader.isEndGroup())
705
+ break;
706
+ switch (_reader.getFieldNumber()) {
707
+ case 2:
708
+ _instance.ok = new Empty();
709
+ _reader.readMessage(_instance.ok, Empty.deserializeBinaryFromReader);
710
+ break;
711
+ case 3:
712
+ _instance.error = new Output.Error();
713
+ _reader.readMessage(_instance.error, Output.Error.deserializeBinaryFromReader);
714
+ break;
715
+ default:
716
+ _reader.skipField();
717
+ }
718
+ }
719
+ Output.refineValues(_instance);
720
+ }
721
+ /**
722
+ * Serializes a message to binary format using provided binary reader
723
+ * @param _instance message instance
724
+ * @param _writer binary writer instance
725
+ */
726
+ static serializeBinaryToWriter(_instance, _writer) {
727
+ if (_instance.ok) {
728
+ _writer.writeMessage(2, _instance.ok, Empty.serializeBinaryToWriter);
729
+ }
730
+ if (_instance.error) {
731
+ _writer.writeMessage(3, _instance.error, Output.Error.serializeBinaryToWriter);
732
+ }
733
+ }
734
+ /**
735
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
736
+ * @param _value initial values object or instance of Output to deeply clone from
737
+ */
738
+ constructor(_value) {
739
+ this._type = Output.TypeCase.none;
740
+ _value = _value || {};
741
+ this.ok = _value.ok ? new Empty(_value.ok) : undefined;
742
+ this.error = _value.error ? new Output.Error(_value.error) : undefined;
743
+ Output.refineValues(this);
744
+ }
745
+ get ok() {
746
+ return this._ok;
747
+ }
748
+ set ok(value) {
749
+ if (value !== undefined && value !== null) {
750
+ this._error = undefined;
751
+ this._type = Output.TypeCase.ok;
752
+ }
753
+ this._ok = value;
754
+ }
755
+ get error() {
756
+ return this._error;
757
+ }
758
+ set error(value) {
759
+ if (value !== undefined && value !== null) {
760
+ this._ok = undefined;
761
+ this._type = Output.TypeCase.error;
762
+ }
763
+ this._error = value;
764
+ }
765
+ get type() {
766
+ return this._type;
767
+ }
768
+ /**
769
+ * Serialize message to binary data
770
+ * @param instance message instance
771
+ */
772
+ serializeBinary() {
773
+ const writer = new BinaryWriter();
774
+ Output.serializeBinaryToWriter(this, writer);
775
+ return writer.getResultBuffer();
776
+ }
777
+ /**
778
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
779
+ */
780
+ toObject() {
781
+ return {
782
+ ok: this.ok ? this.ok.toObject() : undefined,
783
+ error: this.error ? this.error.toObject() : undefined
784
+ };
785
+ }
786
+ /**
787
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
788
+ */
789
+ toJSON() {
790
+ return this.toObject();
791
+ }
792
+ /**
793
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
794
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
795
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
796
+ */
797
+ toProtobufJSON(
798
+ // @ts-ignore
799
+ options) {
800
+ return {
801
+ ok: this.ok ? this.ok.toProtobufJSON(options) : null,
802
+ error: this.error ? this.error.toProtobufJSON(options) : null
803
+ };
804
+ }
805
+ }
806
+ Output.id = 'armonik.api.grpc.v1.Output';
807
+ (function (Output) {
808
+ let TypeCase;
809
+ (function (TypeCase) {
810
+ TypeCase[TypeCase["none"] = 0] = "none";
811
+ TypeCase[TypeCase["ok"] = 1] = "ok";
812
+ TypeCase[TypeCase["error"] = 2] = "error";
813
+ })(TypeCase = Output.TypeCase || (Output.TypeCase = {}));
814
+ /**
815
+ * Message implementation for armonik.api.grpc.v1.Output.Error
816
+ */
817
+ class Error {
818
+ /**
819
+ * Deserialize binary data to message
820
+ * @param instance message instance
821
+ */
822
+ static deserializeBinary(bytes) {
823
+ const instance = new Error();
824
+ Error.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
825
+ return instance;
826
+ }
827
+ /**
828
+ * Check all the properties and set default protobuf values if necessary
829
+ * @param _instance message instance
830
+ */
831
+ static refineValues(_instance) {
832
+ _instance.details = _instance.details || '';
833
+ }
834
+ /**
835
+ * Deserializes / reads binary message into message instance using provided binary reader
836
+ * @param _instance message instance
837
+ * @param _reader binary reader instance
838
+ */
839
+ static deserializeBinaryFromReader(_instance, _reader) {
840
+ while (_reader.nextField()) {
841
+ if (_reader.isEndGroup())
842
+ break;
843
+ switch (_reader.getFieldNumber()) {
844
+ case 1:
845
+ _instance.details = _reader.readString();
846
+ break;
847
+ default:
848
+ _reader.skipField();
849
+ }
850
+ }
851
+ Error.refineValues(_instance);
852
+ }
853
+ /**
854
+ * Serializes a message to binary format using provided binary reader
855
+ * @param _instance message instance
856
+ * @param _writer binary writer instance
857
+ */
858
+ static serializeBinaryToWriter(_instance, _writer) {
859
+ if (_instance.details) {
860
+ _writer.writeString(1, _instance.details);
861
+ }
862
+ }
863
+ /**
864
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
865
+ * @param _value initial values object or instance of Error to deeply clone from
866
+ */
867
+ constructor(_value) {
868
+ _value = _value || {};
869
+ this.details = _value.details;
870
+ Error.refineValues(this);
871
+ }
872
+ get details() {
873
+ return this._details;
874
+ }
875
+ set details(value) {
876
+ this._details = value;
877
+ }
878
+ /**
879
+ * Serialize message to binary data
880
+ * @param instance message instance
881
+ */
882
+ serializeBinary() {
883
+ const writer = new BinaryWriter();
884
+ Error.serializeBinaryToWriter(this, writer);
885
+ return writer.getResultBuffer();
886
+ }
887
+ /**
888
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
889
+ */
890
+ toObject() {
891
+ return {
892
+ details: this.details
893
+ };
894
+ }
895
+ /**
896
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
897
+ */
898
+ toJSON() {
899
+ return this.toObject();
900
+ }
901
+ /**
902
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
903
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
904
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
905
+ */
906
+ toProtobufJSON(
907
+ // @ts-ignore
908
+ options) {
909
+ return {
910
+ details: this.details
911
+ };
912
+ }
913
+ }
914
+ Error.id = 'armonik.api.grpc.v1.Output.Error';
915
+ Output.Error = Error;
916
+ })(Output || (Output = {}));
917
+ /**
918
+ * Message implementation for armonik.api.grpc.v1.TaskRequest
919
+ */
920
+ export class TaskRequest {
921
+ /**
922
+ * Deserialize binary data to message
923
+ * @param instance message instance
924
+ */
925
+ static deserializeBinary(bytes) {
926
+ const instance = new TaskRequest();
927
+ TaskRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
928
+ return instance;
929
+ }
930
+ /**
931
+ * Check all the properties and set default protobuf values if necessary
932
+ * @param _instance message instance
933
+ */
934
+ static refineValues(_instance) {
935
+ _instance.expectedOutputKeys = _instance.expectedOutputKeys || [];
936
+ _instance.dataDependencies = _instance.dataDependencies || [];
937
+ _instance.payload = _instance.payload || new Uint8Array();
938
+ }
939
+ /**
940
+ * Deserializes / reads binary message into message instance using provided binary reader
941
+ * @param _instance message instance
942
+ * @param _reader binary reader instance
943
+ */
944
+ static deserializeBinaryFromReader(_instance, _reader) {
945
+ while (_reader.nextField()) {
946
+ if (_reader.isEndGroup())
947
+ break;
948
+ switch (_reader.getFieldNumber()) {
949
+ case 1:
950
+ (_instance.expectedOutputKeys =
951
+ _instance.expectedOutputKeys || []).push(_reader.readString());
952
+ break;
953
+ case 2:
954
+ (_instance.dataDependencies = _instance.dataDependencies || []).push(_reader.readString());
955
+ break;
956
+ case 3:
957
+ _instance.payload = _reader.readBytes();
958
+ break;
959
+ default:
960
+ _reader.skipField();
961
+ }
962
+ }
963
+ TaskRequest.refineValues(_instance);
964
+ }
965
+ /**
966
+ * Serializes a message to binary format using provided binary reader
967
+ * @param _instance message instance
968
+ * @param _writer binary writer instance
969
+ */
970
+ static serializeBinaryToWriter(_instance, _writer) {
971
+ if (_instance.expectedOutputKeys && _instance.expectedOutputKeys.length) {
972
+ _writer.writeRepeatedString(1, _instance.expectedOutputKeys);
973
+ }
974
+ if (_instance.dataDependencies && _instance.dataDependencies.length) {
975
+ _writer.writeRepeatedString(2, _instance.dataDependencies);
976
+ }
977
+ if (_instance.payload && _instance.payload.length) {
978
+ _writer.writeBytes(3, _instance.payload);
979
+ }
980
+ }
981
+ /**
982
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
983
+ * @param _value initial values object or instance of TaskRequest to deeply clone from
984
+ */
985
+ constructor(_value) {
986
+ _value = _value || {};
987
+ this.expectedOutputKeys = (_value.expectedOutputKeys || []).slice();
988
+ this.dataDependencies = (_value.dataDependencies || []).slice();
989
+ this.payload = _value.payload;
990
+ TaskRequest.refineValues(this);
991
+ }
992
+ get expectedOutputKeys() {
993
+ return this._expectedOutputKeys;
994
+ }
995
+ set expectedOutputKeys(value) {
996
+ this._expectedOutputKeys = value;
997
+ }
998
+ get dataDependencies() {
999
+ return this._dataDependencies;
1000
+ }
1001
+ set dataDependencies(value) {
1002
+ this._dataDependencies = value;
1003
+ }
1004
+ get payload() {
1005
+ return this._payload;
1006
+ }
1007
+ set payload(value) {
1008
+ this._payload = value;
1009
+ }
1010
+ /**
1011
+ * Serialize message to binary data
1012
+ * @param instance message instance
1013
+ */
1014
+ serializeBinary() {
1015
+ const writer = new BinaryWriter();
1016
+ TaskRequest.serializeBinaryToWriter(this, writer);
1017
+ return writer.getResultBuffer();
1018
+ }
1019
+ /**
1020
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1021
+ */
1022
+ toObject() {
1023
+ return {
1024
+ expectedOutputKeys: (this.expectedOutputKeys || []).slice(),
1025
+ dataDependencies: (this.dataDependencies || []).slice(),
1026
+ payload: this.payload ? this.payload.subarray(0) : new Uint8Array()
1027
+ };
1028
+ }
1029
+ /**
1030
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1031
+ */
1032
+ toJSON() {
1033
+ return this.toObject();
1034
+ }
1035
+ /**
1036
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1037
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1038
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1039
+ */
1040
+ toProtobufJSON(
1041
+ // @ts-ignore
1042
+ options) {
1043
+ return {
1044
+ expectedOutputKeys: (this.expectedOutputKeys || []).slice(),
1045
+ dataDependencies: (this.dataDependencies || []).slice(),
1046
+ payload: this.payload ? uint8ArrayToBase64(this.payload) : ''
1047
+ };
1048
+ }
1049
+ }
1050
+ TaskRequest.id = 'armonik.api.grpc.v1.TaskRequest';
1051
+ /**
1052
+ * Message implementation for armonik.api.grpc.v1.InitKeyedDataStream
1053
+ */
1054
+ export class InitKeyedDataStream {
1055
+ /**
1056
+ * Deserialize binary data to message
1057
+ * @param instance message instance
1058
+ */
1059
+ static deserializeBinary(bytes) {
1060
+ const instance = new InitKeyedDataStream();
1061
+ InitKeyedDataStream.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1062
+ return instance;
1063
+ }
1064
+ /**
1065
+ * Check all the properties and set default protobuf values if necessary
1066
+ * @param _instance message instance
1067
+ */
1068
+ static refineValues(_instance) { }
1069
+ /**
1070
+ * Deserializes / reads binary message into message instance using provided binary reader
1071
+ * @param _instance message instance
1072
+ * @param _reader binary reader instance
1073
+ */
1074
+ static deserializeBinaryFromReader(_instance, _reader) {
1075
+ while (_reader.nextField()) {
1076
+ if (_reader.isEndGroup())
1077
+ break;
1078
+ switch (_reader.getFieldNumber()) {
1079
+ case 1:
1080
+ _instance.key = _reader.readString();
1081
+ break;
1082
+ case 2:
1083
+ _instance.lastResult = _reader.readBool();
1084
+ break;
1085
+ default:
1086
+ _reader.skipField();
1087
+ }
1088
+ }
1089
+ InitKeyedDataStream.refineValues(_instance);
1090
+ }
1091
+ /**
1092
+ * Serializes a message to binary format using provided binary reader
1093
+ * @param _instance message instance
1094
+ * @param _writer binary writer instance
1095
+ */
1096
+ static serializeBinaryToWriter(_instance, _writer) {
1097
+ if (_instance.key || _instance.key === '') {
1098
+ _writer.writeString(1, _instance.key);
1099
+ }
1100
+ if (_instance.lastResult || _instance.lastResult === false) {
1101
+ _writer.writeBool(2, _instance.lastResult);
1102
+ }
1103
+ }
1104
+ /**
1105
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1106
+ * @param _value initial values object or instance of InitKeyedDataStream to deeply clone from
1107
+ */
1108
+ constructor(_value) {
1109
+ this._type = InitKeyedDataStream.TypeCase.none;
1110
+ _value = _value || {};
1111
+ this.key = _value.key;
1112
+ this.lastResult = _value.lastResult;
1113
+ InitKeyedDataStream.refineValues(this);
1114
+ }
1115
+ get key() {
1116
+ return this._key;
1117
+ }
1118
+ set key(value) {
1119
+ if (value !== undefined && value !== null) {
1120
+ this._lastResult = undefined;
1121
+ this._type = InitKeyedDataStream.TypeCase.key;
1122
+ }
1123
+ this._key = value;
1124
+ }
1125
+ get lastResult() {
1126
+ return this._lastResult;
1127
+ }
1128
+ set lastResult(value) {
1129
+ if (value !== undefined && value !== null) {
1130
+ this._key = undefined;
1131
+ this._type = InitKeyedDataStream.TypeCase.lastResult;
1132
+ }
1133
+ this._lastResult = value;
1134
+ }
1135
+ get type() {
1136
+ return this._type;
1137
+ }
1138
+ /**
1139
+ * Serialize message to binary data
1140
+ * @param instance message instance
1141
+ */
1142
+ serializeBinary() {
1143
+ const writer = new BinaryWriter();
1144
+ InitKeyedDataStream.serializeBinaryToWriter(this, writer);
1145
+ return writer.getResultBuffer();
1146
+ }
1147
+ /**
1148
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1149
+ */
1150
+ toObject() {
1151
+ return {
1152
+ key: this.key,
1153
+ lastResult: this.lastResult
1154
+ };
1155
+ }
1156
+ /**
1157
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1158
+ */
1159
+ toJSON() {
1160
+ return this.toObject();
1161
+ }
1162
+ /**
1163
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1164
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1165
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1166
+ */
1167
+ toProtobufJSON(
1168
+ // @ts-ignore
1169
+ options) {
1170
+ return {
1171
+ key: this.key === null || this.key === undefined ? null : this.key,
1172
+ lastResult: this.lastResult
1173
+ };
1174
+ }
1175
+ }
1176
+ InitKeyedDataStream.id = 'armonik.api.grpc.v1.InitKeyedDataStream';
1177
+ (function (InitKeyedDataStream) {
1178
+ let TypeCase;
1179
+ (function (TypeCase) {
1180
+ TypeCase[TypeCase["none"] = 0] = "none";
1181
+ TypeCase[TypeCase["key"] = 1] = "key";
1182
+ TypeCase[TypeCase["lastResult"] = 2] = "lastResult";
1183
+ })(TypeCase = InitKeyedDataStream.TypeCase || (InitKeyedDataStream.TypeCase = {}));
1184
+ })(InitKeyedDataStream || (InitKeyedDataStream = {}));
1185
+ /**
1186
+ * Message implementation for armonik.api.grpc.v1.DataChunk
1187
+ */
1188
+ export class DataChunk {
1189
+ /**
1190
+ * Deserialize binary data to message
1191
+ * @param instance message instance
1192
+ */
1193
+ static deserializeBinary(bytes) {
1194
+ const instance = new DataChunk();
1195
+ DataChunk.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1196
+ return instance;
1197
+ }
1198
+ /**
1199
+ * Check all the properties and set default protobuf values if necessary
1200
+ * @param _instance message instance
1201
+ */
1202
+ static refineValues(_instance) { }
1203
+ /**
1204
+ * Deserializes / reads binary message into message instance using provided binary reader
1205
+ * @param _instance message instance
1206
+ * @param _reader binary reader instance
1207
+ */
1208
+ static deserializeBinaryFromReader(_instance, _reader) {
1209
+ while (_reader.nextField()) {
1210
+ if (_reader.isEndGroup())
1211
+ break;
1212
+ switch (_reader.getFieldNumber()) {
1213
+ case 1:
1214
+ _instance.data = _reader.readBytes();
1215
+ break;
1216
+ case 2:
1217
+ _instance.dataComplete = _reader.readBool();
1218
+ break;
1219
+ default:
1220
+ _reader.skipField();
1221
+ }
1222
+ }
1223
+ DataChunk.refineValues(_instance);
1224
+ }
1225
+ /**
1226
+ * Serializes a message to binary format using provided binary reader
1227
+ * @param _instance message instance
1228
+ * @param _writer binary writer instance
1229
+ */
1230
+ static serializeBinaryToWriter(_instance, _writer) {
1231
+ if (_instance.data && _instance.data.length) {
1232
+ _writer.writeBytes(1, _instance.data);
1233
+ }
1234
+ if (_instance.dataComplete || _instance.dataComplete === false) {
1235
+ _writer.writeBool(2, _instance.dataComplete);
1236
+ }
1237
+ }
1238
+ /**
1239
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1240
+ * @param _value initial values object or instance of DataChunk to deeply clone from
1241
+ */
1242
+ constructor(_value) {
1243
+ this._type = DataChunk.TypeCase.none;
1244
+ _value = _value || {};
1245
+ this.data = _value.data;
1246
+ this.dataComplete = _value.dataComplete;
1247
+ DataChunk.refineValues(this);
1248
+ }
1249
+ get data() {
1250
+ return this._data;
1251
+ }
1252
+ set data(value) {
1253
+ if (value !== undefined && value !== null) {
1254
+ this._dataComplete = undefined;
1255
+ this._type = DataChunk.TypeCase.data;
1256
+ }
1257
+ this._data = value;
1258
+ }
1259
+ get dataComplete() {
1260
+ return this._dataComplete;
1261
+ }
1262
+ set dataComplete(value) {
1263
+ if (value !== undefined && value !== null) {
1264
+ this._data = undefined;
1265
+ this._type = DataChunk.TypeCase.dataComplete;
1266
+ }
1267
+ this._dataComplete = value;
1268
+ }
1269
+ get type() {
1270
+ return this._type;
1271
+ }
1272
+ /**
1273
+ * Serialize message to binary data
1274
+ * @param instance message instance
1275
+ */
1276
+ serializeBinary() {
1277
+ const writer = new BinaryWriter();
1278
+ DataChunk.serializeBinaryToWriter(this, writer);
1279
+ return writer.getResultBuffer();
1280
+ }
1281
+ /**
1282
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1283
+ */
1284
+ toObject() {
1285
+ return {
1286
+ data: this.data ? this.data.subarray(0) : new Uint8Array(),
1287
+ dataComplete: this.dataComplete
1288
+ };
1289
+ }
1290
+ /**
1291
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1292
+ */
1293
+ toJSON() {
1294
+ return this.toObject();
1295
+ }
1296
+ /**
1297
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1298
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1299
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1300
+ */
1301
+ toProtobufJSON(
1302
+ // @ts-ignore
1303
+ options) {
1304
+ return {
1305
+ data: this.data ? uint8ArrayToBase64(this.data) : '',
1306
+ dataComplete: this.dataComplete
1307
+ };
1308
+ }
1309
+ }
1310
+ DataChunk.id = 'armonik.api.grpc.v1.DataChunk';
1311
+ (function (DataChunk) {
1312
+ let TypeCase;
1313
+ (function (TypeCase) {
1314
+ TypeCase[TypeCase["none"] = 0] = "none";
1315
+ TypeCase[TypeCase["data"] = 1] = "data";
1316
+ TypeCase[TypeCase["dataComplete"] = 2] = "dataComplete";
1317
+ })(TypeCase = DataChunk.TypeCase || (DataChunk.TypeCase = {}));
1318
+ })(DataChunk || (DataChunk = {}));
1319
+ /**
1320
+ * Message implementation for armonik.api.grpc.v1.TaskRequestHeader
1321
+ */
1322
+ export class TaskRequestHeader {
1323
+ /**
1324
+ * Deserialize binary data to message
1325
+ * @param instance message instance
1326
+ */
1327
+ static deserializeBinary(bytes) {
1328
+ const instance = new TaskRequestHeader();
1329
+ TaskRequestHeader.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1330
+ return instance;
1331
+ }
1332
+ /**
1333
+ * Check all the properties and set default protobuf values if necessary
1334
+ * @param _instance message instance
1335
+ */
1336
+ static refineValues(_instance) {
1337
+ _instance.expectedOutputKeys = _instance.expectedOutputKeys || [];
1338
+ _instance.dataDependencies = _instance.dataDependencies || [];
1339
+ }
1340
+ /**
1341
+ * Deserializes / reads binary message into message instance using provided binary reader
1342
+ * @param _instance message instance
1343
+ * @param _reader binary reader instance
1344
+ */
1345
+ static deserializeBinaryFromReader(_instance, _reader) {
1346
+ while (_reader.nextField()) {
1347
+ if (_reader.isEndGroup())
1348
+ break;
1349
+ switch (_reader.getFieldNumber()) {
1350
+ case 1:
1351
+ (_instance.expectedOutputKeys =
1352
+ _instance.expectedOutputKeys || []).push(_reader.readString());
1353
+ break;
1354
+ case 2:
1355
+ (_instance.dataDependencies = _instance.dataDependencies || []).push(_reader.readString());
1356
+ break;
1357
+ default:
1358
+ _reader.skipField();
1359
+ }
1360
+ }
1361
+ TaskRequestHeader.refineValues(_instance);
1362
+ }
1363
+ /**
1364
+ * Serializes a message to binary format using provided binary reader
1365
+ * @param _instance message instance
1366
+ * @param _writer binary writer instance
1367
+ */
1368
+ static serializeBinaryToWriter(_instance, _writer) {
1369
+ if (_instance.expectedOutputKeys && _instance.expectedOutputKeys.length) {
1370
+ _writer.writeRepeatedString(1, _instance.expectedOutputKeys);
1371
+ }
1372
+ if (_instance.dataDependencies && _instance.dataDependencies.length) {
1373
+ _writer.writeRepeatedString(2, _instance.dataDependencies);
1374
+ }
1375
+ }
1376
+ /**
1377
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1378
+ * @param _value initial values object or instance of TaskRequestHeader to deeply clone from
1379
+ */
1380
+ constructor(_value) {
1381
+ _value = _value || {};
1382
+ this.expectedOutputKeys = (_value.expectedOutputKeys || []).slice();
1383
+ this.dataDependencies = (_value.dataDependencies || []).slice();
1384
+ TaskRequestHeader.refineValues(this);
1385
+ }
1386
+ get expectedOutputKeys() {
1387
+ return this._expectedOutputKeys;
1388
+ }
1389
+ set expectedOutputKeys(value) {
1390
+ this._expectedOutputKeys = value;
1391
+ }
1392
+ get dataDependencies() {
1393
+ return this._dataDependencies;
1394
+ }
1395
+ set dataDependencies(value) {
1396
+ this._dataDependencies = value;
1397
+ }
1398
+ /**
1399
+ * Serialize message to binary data
1400
+ * @param instance message instance
1401
+ */
1402
+ serializeBinary() {
1403
+ const writer = new BinaryWriter();
1404
+ TaskRequestHeader.serializeBinaryToWriter(this, writer);
1405
+ return writer.getResultBuffer();
1406
+ }
1407
+ /**
1408
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1409
+ */
1410
+ toObject() {
1411
+ return {
1412
+ expectedOutputKeys: (this.expectedOutputKeys || []).slice(),
1413
+ dataDependencies: (this.dataDependencies || []).slice()
1414
+ };
1415
+ }
1416
+ /**
1417
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1418
+ */
1419
+ toJSON() {
1420
+ return this.toObject();
1421
+ }
1422
+ /**
1423
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1424
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1425
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1426
+ */
1427
+ toProtobufJSON(
1428
+ // @ts-ignore
1429
+ options) {
1430
+ return {
1431
+ expectedOutputKeys: (this.expectedOutputKeys || []).slice(),
1432
+ dataDependencies: (this.dataDependencies || []).slice()
1433
+ };
1434
+ }
1435
+ }
1436
+ TaskRequestHeader.id = 'armonik.api.grpc.v1.TaskRequestHeader';
1437
+ /**
1438
+ * Message implementation for armonik.api.grpc.v1.InitTaskRequest
1439
+ */
1440
+ export class InitTaskRequest {
1441
+ /**
1442
+ * Deserialize binary data to message
1443
+ * @param instance message instance
1444
+ */
1445
+ static deserializeBinary(bytes) {
1446
+ const instance = new InitTaskRequest();
1447
+ InitTaskRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1448
+ return instance;
1449
+ }
1450
+ /**
1451
+ * Check all the properties and set default protobuf values if necessary
1452
+ * @param _instance message instance
1453
+ */
1454
+ static refineValues(_instance) { }
1455
+ /**
1456
+ * Deserializes / reads binary message into message instance using provided binary reader
1457
+ * @param _instance message instance
1458
+ * @param _reader binary reader instance
1459
+ */
1460
+ static deserializeBinaryFromReader(_instance, _reader) {
1461
+ while (_reader.nextField()) {
1462
+ if (_reader.isEndGroup())
1463
+ break;
1464
+ switch (_reader.getFieldNumber()) {
1465
+ case 1:
1466
+ _instance.header = new TaskRequestHeader();
1467
+ _reader.readMessage(_instance.header, TaskRequestHeader.deserializeBinaryFromReader);
1468
+ break;
1469
+ case 2:
1470
+ _instance.lastTask = _reader.readBool();
1471
+ break;
1472
+ default:
1473
+ _reader.skipField();
1474
+ }
1475
+ }
1476
+ InitTaskRequest.refineValues(_instance);
1477
+ }
1478
+ /**
1479
+ * Serializes a message to binary format using provided binary reader
1480
+ * @param _instance message instance
1481
+ * @param _writer binary writer instance
1482
+ */
1483
+ static serializeBinaryToWriter(_instance, _writer) {
1484
+ if (_instance.header) {
1485
+ _writer.writeMessage(1, _instance.header, TaskRequestHeader.serializeBinaryToWriter);
1486
+ }
1487
+ if (_instance.lastTask || _instance.lastTask === false) {
1488
+ _writer.writeBool(2, _instance.lastTask);
1489
+ }
1490
+ }
1491
+ /**
1492
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1493
+ * @param _value initial values object or instance of InitTaskRequest to deeply clone from
1494
+ */
1495
+ constructor(_value) {
1496
+ this._type = InitTaskRequest.TypeCase.none;
1497
+ _value = _value || {};
1498
+ this.header = _value.header
1499
+ ? new TaskRequestHeader(_value.header)
1500
+ : undefined;
1501
+ this.lastTask = _value.lastTask;
1502
+ InitTaskRequest.refineValues(this);
1503
+ }
1504
+ get header() {
1505
+ return this._header;
1506
+ }
1507
+ set header(value) {
1508
+ if (value !== undefined && value !== null) {
1509
+ this._lastTask = undefined;
1510
+ this._type = InitTaskRequest.TypeCase.header;
1511
+ }
1512
+ this._header = value;
1513
+ }
1514
+ get lastTask() {
1515
+ return this._lastTask;
1516
+ }
1517
+ set lastTask(value) {
1518
+ if (value !== undefined && value !== null) {
1519
+ this._header = undefined;
1520
+ this._type = InitTaskRequest.TypeCase.lastTask;
1521
+ }
1522
+ this._lastTask = value;
1523
+ }
1524
+ get type() {
1525
+ return this._type;
1526
+ }
1527
+ /**
1528
+ * Serialize message to binary data
1529
+ * @param instance message instance
1530
+ */
1531
+ serializeBinary() {
1532
+ const writer = new BinaryWriter();
1533
+ InitTaskRequest.serializeBinaryToWriter(this, writer);
1534
+ return writer.getResultBuffer();
1535
+ }
1536
+ /**
1537
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1538
+ */
1539
+ toObject() {
1540
+ return {
1541
+ header: this.header ? this.header.toObject() : undefined,
1542
+ lastTask: this.lastTask
1543
+ };
1544
+ }
1545
+ /**
1546
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1547
+ */
1548
+ toJSON() {
1549
+ return this.toObject();
1550
+ }
1551
+ /**
1552
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1553
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1554
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1555
+ */
1556
+ toProtobufJSON(
1557
+ // @ts-ignore
1558
+ options) {
1559
+ return {
1560
+ header: this.header ? this.header.toProtobufJSON(options) : null,
1561
+ lastTask: this.lastTask
1562
+ };
1563
+ }
1564
+ }
1565
+ InitTaskRequest.id = 'armonik.api.grpc.v1.InitTaskRequest';
1566
+ (function (InitTaskRequest) {
1567
+ let TypeCase;
1568
+ (function (TypeCase) {
1569
+ TypeCase[TypeCase["none"] = 0] = "none";
1570
+ TypeCase[TypeCase["header"] = 1] = "header";
1571
+ TypeCase[TypeCase["lastTask"] = 2] = "lastTask";
1572
+ })(TypeCase = InitTaskRequest.TypeCase || (InitTaskRequest.TypeCase = {}));
1573
+ })(InitTaskRequest || (InitTaskRequest = {}));
1574
+ /**
1575
+ * Message implementation for armonik.api.grpc.v1.TaskId
1576
+ */
1577
+ export class TaskId {
1578
+ /**
1579
+ * Deserialize binary data to message
1580
+ * @param instance message instance
1581
+ */
1582
+ static deserializeBinary(bytes) {
1583
+ const instance = new TaskId();
1584
+ TaskId.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1585
+ return instance;
1586
+ }
1587
+ /**
1588
+ * Check all the properties and set default protobuf values if necessary
1589
+ * @param _instance message instance
1590
+ */
1591
+ static refineValues(_instance) {
1592
+ _instance.session = _instance.session || '';
1593
+ _instance.task = _instance.task || '';
1594
+ }
1595
+ /**
1596
+ * Deserializes / reads binary message into message instance using provided binary reader
1597
+ * @param _instance message instance
1598
+ * @param _reader binary reader instance
1599
+ */
1600
+ static deserializeBinaryFromReader(_instance, _reader) {
1601
+ while (_reader.nextField()) {
1602
+ if (_reader.isEndGroup())
1603
+ break;
1604
+ switch (_reader.getFieldNumber()) {
1605
+ case 1:
1606
+ _instance.session = _reader.readString();
1607
+ break;
1608
+ case 2:
1609
+ _instance.task = _reader.readString();
1610
+ break;
1611
+ default:
1612
+ _reader.skipField();
1613
+ }
1614
+ }
1615
+ TaskId.refineValues(_instance);
1616
+ }
1617
+ /**
1618
+ * Serializes a message to binary format using provided binary reader
1619
+ * @param _instance message instance
1620
+ * @param _writer binary writer instance
1621
+ */
1622
+ static serializeBinaryToWriter(_instance, _writer) {
1623
+ if (_instance.session) {
1624
+ _writer.writeString(1, _instance.session);
1625
+ }
1626
+ if (_instance.task) {
1627
+ _writer.writeString(2, _instance.task);
1628
+ }
1629
+ }
1630
+ /**
1631
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1632
+ * @param _value initial values object or instance of TaskId to deeply clone from
1633
+ */
1634
+ constructor(_value) {
1635
+ _value = _value || {};
1636
+ this.session = _value.session;
1637
+ this.task = _value.task;
1638
+ TaskId.refineValues(this);
1639
+ }
1640
+ get session() {
1641
+ return this._session;
1642
+ }
1643
+ set session(value) {
1644
+ this._session = value;
1645
+ }
1646
+ get task() {
1647
+ return this._task;
1648
+ }
1649
+ set task(value) {
1650
+ this._task = value;
1651
+ }
1652
+ /**
1653
+ * Serialize message to binary data
1654
+ * @param instance message instance
1655
+ */
1656
+ serializeBinary() {
1657
+ const writer = new BinaryWriter();
1658
+ TaskId.serializeBinaryToWriter(this, writer);
1659
+ return writer.getResultBuffer();
1660
+ }
1661
+ /**
1662
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1663
+ */
1664
+ toObject() {
1665
+ return {
1666
+ session: this.session,
1667
+ task: this.task
1668
+ };
1669
+ }
1670
+ /**
1671
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1672
+ */
1673
+ toJSON() {
1674
+ return this.toObject();
1675
+ }
1676
+ /**
1677
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1678
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1679
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1680
+ */
1681
+ toProtobufJSON(
1682
+ // @ts-ignore
1683
+ options) {
1684
+ return {
1685
+ session: this.session,
1686
+ task: this.task
1687
+ };
1688
+ }
1689
+ }
1690
+ TaskId.id = 'armonik.api.grpc.v1.TaskId';
1691
+ /**
1692
+ * Message implementation for armonik.api.grpc.v1.TaskIdList
1693
+ */
1694
+ export class TaskIdList {
1695
+ /**
1696
+ * Deserialize binary data to message
1697
+ * @param instance message instance
1698
+ */
1699
+ static deserializeBinary(bytes) {
1700
+ const instance = new TaskIdList();
1701
+ TaskIdList.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1702
+ return instance;
1703
+ }
1704
+ /**
1705
+ * Check all the properties and set default protobuf values if necessary
1706
+ * @param _instance message instance
1707
+ */
1708
+ static refineValues(_instance) {
1709
+ _instance.taskIds = _instance.taskIds || [];
1710
+ }
1711
+ /**
1712
+ * Deserializes / reads binary message into message instance using provided binary reader
1713
+ * @param _instance message instance
1714
+ * @param _reader binary reader instance
1715
+ */
1716
+ static deserializeBinaryFromReader(_instance, _reader) {
1717
+ while (_reader.nextField()) {
1718
+ if (_reader.isEndGroup())
1719
+ break;
1720
+ switch (_reader.getFieldNumber()) {
1721
+ case 1:
1722
+ (_instance.taskIds = _instance.taskIds || []).push(_reader.readString());
1723
+ break;
1724
+ default:
1725
+ _reader.skipField();
1726
+ }
1727
+ }
1728
+ TaskIdList.refineValues(_instance);
1729
+ }
1730
+ /**
1731
+ * Serializes a message to binary format using provided binary reader
1732
+ * @param _instance message instance
1733
+ * @param _writer binary writer instance
1734
+ */
1735
+ static serializeBinaryToWriter(_instance, _writer) {
1736
+ if (_instance.taskIds && _instance.taskIds.length) {
1737
+ _writer.writeRepeatedString(1, _instance.taskIds);
1738
+ }
1739
+ }
1740
+ /**
1741
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1742
+ * @param _value initial values object or instance of TaskIdList to deeply clone from
1743
+ */
1744
+ constructor(_value) {
1745
+ _value = _value || {};
1746
+ this.taskIds = (_value.taskIds || []).slice();
1747
+ TaskIdList.refineValues(this);
1748
+ }
1749
+ get taskIds() {
1750
+ return this._taskIds;
1751
+ }
1752
+ set taskIds(value) {
1753
+ this._taskIds = value;
1754
+ }
1755
+ /**
1756
+ * Serialize message to binary data
1757
+ * @param instance message instance
1758
+ */
1759
+ serializeBinary() {
1760
+ const writer = new BinaryWriter();
1761
+ TaskIdList.serializeBinaryToWriter(this, writer);
1762
+ return writer.getResultBuffer();
1763
+ }
1764
+ /**
1765
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1766
+ */
1767
+ toObject() {
1768
+ return {
1769
+ taskIds: (this.taskIds || []).slice()
1770
+ };
1771
+ }
1772
+ /**
1773
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1774
+ */
1775
+ toJSON() {
1776
+ return this.toObject();
1777
+ }
1778
+ /**
1779
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1780
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1781
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1782
+ */
1783
+ toProtobufJSON(
1784
+ // @ts-ignore
1785
+ options) {
1786
+ return {
1787
+ taskIds: (this.taskIds || []).slice()
1788
+ };
1789
+ }
1790
+ }
1791
+ TaskIdList.id = 'armonik.api.grpc.v1.TaskIdList';
1792
+ /**
1793
+ * Message implementation for armonik.api.grpc.v1.StatusCount
1794
+ */
1795
+ export class StatusCount {
1796
+ /**
1797
+ * Deserialize binary data to message
1798
+ * @param instance message instance
1799
+ */
1800
+ static deserializeBinary(bytes) {
1801
+ const instance = new StatusCount();
1802
+ StatusCount.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1803
+ return instance;
1804
+ }
1805
+ /**
1806
+ * Check all the properties and set default protobuf values if necessary
1807
+ * @param _instance message instance
1808
+ */
1809
+ static refineValues(_instance) {
1810
+ _instance.status = _instance.status || 0;
1811
+ _instance.count = _instance.count || 0;
1812
+ }
1813
+ /**
1814
+ * Deserializes / reads binary message into message instance using provided binary reader
1815
+ * @param _instance message instance
1816
+ * @param _reader binary reader instance
1817
+ */
1818
+ static deserializeBinaryFromReader(_instance, _reader) {
1819
+ while (_reader.nextField()) {
1820
+ if (_reader.isEndGroup())
1821
+ break;
1822
+ switch (_reader.getFieldNumber()) {
1823
+ case 1:
1824
+ _instance.status = _reader.readEnum();
1825
+ break;
1826
+ case 2:
1827
+ _instance.count = _reader.readInt32();
1828
+ break;
1829
+ default:
1830
+ _reader.skipField();
1831
+ }
1832
+ }
1833
+ StatusCount.refineValues(_instance);
1834
+ }
1835
+ /**
1836
+ * Serializes a message to binary format using provided binary reader
1837
+ * @param _instance message instance
1838
+ * @param _writer binary writer instance
1839
+ */
1840
+ static serializeBinaryToWriter(_instance, _writer) {
1841
+ if (_instance.status) {
1842
+ _writer.writeEnum(1, _instance.status);
1843
+ }
1844
+ if (_instance.count) {
1845
+ _writer.writeInt32(2, _instance.count);
1846
+ }
1847
+ }
1848
+ /**
1849
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1850
+ * @param _value initial values object or instance of StatusCount to deeply clone from
1851
+ */
1852
+ constructor(_value) {
1853
+ _value = _value || {};
1854
+ this.status = _value.status;
1855
+ this.count = _value.count;
1856
+ StatusCount.refineValues(this);
1857
+ }
1858
+ get status() {
1859
+ return this._status;
1860
+ }
1861
+ set status(value) {
1862
+ this._status = value;
1863
+ }
1864
+ get count() {
1865
+ return this._count;
1866
+ }
1867
+ set count(value) {
1868
+ this._count = value;
1869
+ }
1870
+ /**
1871
+ * Serialize message to binary data
1872
+ * @param instance message instance
1873
+ */
1874
+ serializeBinary() {
1875
+ const writer = new BinaryWriter();
1876
+ StatusCount.serializeBinaryToWriter(this, writer);
1877
+ return writer.getResultBuffer();
1878
+ }
1879
+ /**
1880
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1881
+ */
1882
+ toObject() {
1883
+ return {
1884
+ status: this.status,
1885
+ count: this.count
1886
+ };
1887
+ }
1888
+ /**
1889
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1890
+ */
1891
+ toJSON() {
1892
+ return this.toObject();
1893
+ }
1894
+ /**
1895
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1896
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1897
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1898
+ */
1899
+ toProtobufJSON(
1900
+ // @ts-ignore
1901
+ options) {
1902
+ return {
1903
+ status: armonikApiGrpcV1Task_status001.TaskStatus[this.status === null || this.status === undefined ? 0 : this.status],
1904
+ count: this.count
1905
+ };
1906
+ }
1907
+ }
1908
+ StatusCount.id = 'armonik.api.grpc.v1.StatusCount';
1909
+ /**
1910
+ * Message implementation for armonik.api.grpc.v1.Count
1911
+ */
1912
+ export class Count {
1913
+ /**
1914
+ * Deserialize binary data to message
1915
+ * @param instance message instance
1916
+ */
1917
+ static deserializeBinary(bytes) {
1918
+ const instance = new Count();
1919
+ Count.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1920
+ return instance;
1921
+ }
1922
+ /**
1923
+ * Check all the properties and set default protobuf values if necessary
1924
+ * @param _instance message instance
1925
+ */
1926
+ static refineValues(_instance) {
1927
+ _instance.values = _instance.values || [];
1928
+ }
1929
+ /**
1930
+ * Deserializes / reads binary message into message instance using provided binary reader
1931
+ * @param _instance message instance
1932
+ * @param _reader binary reader instance
1933
+ */
1934
+ static deserializeBinaryFromReader(_instance, _reader) {
1935
+ while (_reader.nextField()) {
1936
+ if (_reader.isEndGroup())
1937
+ break;
1938
+ switch (_reader.getFieldNumber()) {
1939
+ case 1:
1940
+ const messageInitializer1 = new StatusCount();
1941
+ _reader.readMessage(messageInitializer1, StatusCount.deserializeBinaryFromReader);
1942
+ (_instance.values = _instance.values || []).push(messageInitializer1);
1943
+ break;
1944
+ default:
1945
+ _reader.skipField();
1946
+ }
1947
+ }
1948
+ Count.refineValues(_instance);
1949
+ }
1950
+ /**
1951
+ * Serializes a message to binary format using provided binary reader
1952
+ * @param _instance message instance
1953
+ * @param _writer binary writer instance
1954
+ */
1955
+ static serializeBinaryToWriter(_instance, _writer) {
1956
+ if (_instance.values && _instance.values.length) {
1957
+ _writer.writeRepeatedMessage(1, _instance.values, StatusCount.serializeBinaryToWriter);
1958
+ }
1959
+ }
1960
+ /**
1961
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1962
+ * @param _value initial values object or instance of Count to deeply clone from
1963
+ */
1964
+ constructor(_value) {
1965
+ _value = _value || {};
1966
+ this.values = (_value.values || []).map(m => new StatusCount(m));
1967
+ Count.refineValues(this);
1968
+ }
1969
+ get values() {
1970
+ return this._values;
1971
+ }
1972
+ set values(value) {
1973
+ this._values = value;
1974
+ }
1975
+ /**
1976
+ * Serialize message to binary data
1977
+ * @param instance message instance
1978
+ */
1979
+ serializeBinary() {
1980
+ const writer = new BinaryWriter();
1981
+ Count.serializeBinaryToWriter(this, writer);
1982
+ return writer.getResultBuffer();
1983
+ }
1984
+ /**
1985
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1986
+ */
1987
+ toObject() {
1988
+ return {
1989
+ values: (this.values || []).map(m => m.toObject())
1990
+ };
1991
+ }
1992
+ /**
1993
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1994
+ */
1995
+ toJSON() {
1996
+ return this.toObject();
1997
+ }
1998
+ /**
1999
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2000
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2001
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2002
+ */
2003
+ toProtobufJSON(
2004
+ // @ts-ignore
2005
+ options) {
2006
+ return {
2007
+ values: (this.values || []).map(m => m.toProtobufJSON(options))
2008
+ };
2009
+ }
2010
+ }
2011
+ Count.id = 'armonik.api.grpc.v1.Count';
2012
+ /**
2013
+ * Message implementation for armonik.api.grpc.v1.ResultRequest
2014
+ */
2015
+ export class ResultRequest {
2016
+ /**
2017
+ * Deserialize binary data to message
2018
+ * @param instance message instance
2019
+ */
2020
+ static deserializeBinary(bytes) {
2021
+ const instance = new ResultRequest();
2022
+ ResultRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2023
+ return instance;
2024
+ }
2025
+ /**
2026
+ * Check all the properties and set default protobuf values if necessary
2027
+ * @param _instance message instance
2028
+ */
2029
+ static refineValues(_instance) {
2030
+ _instance.session = _instance.session || '';
2031
+ _instance.resultId = _instance.resultId || '';
2032
+ }
2033
+ /**
2034
+ * Deserializes / reads binary message into message instance using provided binary reader
2035
+ * @param _instance message instance
2036
+ * @param _reader binary reader instance
2037
+ */
2038
+ static deserializeBinaryFromReader(_instance, _reader) {
2039
+ while (_reader.nextField()) {
2040
+ if (_reader.isEndGroup())
2041
+ break;
2042
+ switch (_reader.getFieldNumber()) {
2043
+ case 1:
2044
+ _instance.session = _reader.readString();
2045
+ break;
2046
+ case 2:
2047
+ _instance.resultId = _reader.readString();
2048
+ break;
2049
+ default:
2050
+ _reader.skipField();
2051
+ }
2052
+ }
2053
+ ResultRequest.refineValues(_instance);
2054
+ }
2055
+ /**
2056
+ * Serializes a message to binary format using provided binary reader
2057
+ * @param _instance message instance
2058
+ * @param _writer binary writer instance
2059
+ */
2060
+ static serializeBinaryToWriter(_instance, _writer) {
2061
+ if (_instance.session) {
2062
+ _writer.writeString(1, _instance.session);
2063
+ }
2064
+ if (_instance.resultId) {
2065
+ _writer.writeString(2, _instance.resultId);
2066
+ }
2067
+ }
2068
+ /**
2069
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2070
+ * @param _value initial values object or instance of ResultRequest to deeply clone from
2071
+ */
2072
+ constructor(_value) {
2073
+ _value = _value || {};
2074
+ this.session = _value.session;
2075
+ this.resultId = _value.resultId;
2076
+ ResultRequest.refineValues(this);
2077
+ }
2078
+ get session() {
2079
+ return this._session;
2080
+ }
2081
+ set session(value) {
2082
+ this._session = value;
2083
+ }
2084
+ get resultId() {
2085
+ return this._resultId;
2086
+ }
2087
+ set resultId(value) {
2088
+ this._resultId = value;
2089
+ }
2090
+ /**
2091
+ * Serialize message to binary data
2092
+ * @param instance message instance
2093
+ */
2094
+ serializeBinary() {
2095
+ const writer = new BinaryWriter();
2096
+ ResultRequest.serializeBinaryToWriter(this, writer);
2097
+ return writer.getResultBuffer();
2098
+ }
2099
+ /**
2100
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2101
+ */
2102
+ toObject() {
2103
+ return {
2104
+ session: this.session,
2105
+ resultId: this.resultId
2106
+ };
2107
+ }
2108
+ /**
2109
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2110
+ */
2111
+ toJSON() {
2112
+ return this.toObject();
2113
+ }
2114
+ /**
2115
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2116
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2117
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2118
+ */
2119
+ toProtobufJSON(
2120
+ // @ts-ignore
2121
+ options) {
2122
+ return {
2123
+ session: this.session,
2124
+ resultId: this.resultId
2125
+ };
2126
+ }
2127
+ }
2128
+ ResultRequest.id = 'armonik.api.grpc.v1.ResultRequest';
2129
+ /**
2130
+ * Message implementation for armonik.api.grpc.v1.TaskOutputRequest
2131
+ */
2132
+ export class TaskOutputRequest {
2133
+ /**
2134
+ * Deserialize binary data to message
2135
+ * @param instance message instance
2136
+ */
2137
+ static deserializeBinary(bytes) {
2138
+ const instance = new TaskOutputRequest();
2139
+ TaskOutputRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2140
+ return instance;
2141
+ }
2142
+ /**
2143
+ * Check all the properties and set default protobuf values if necessary
2144
+ * @param _instance message instance
2145
+ */
2146
+ static refineValues(_instance) {
2147
+ _instance.session = _instance.session || '';
2148
+ _instance.taskId = _instance.taskId || '';
2149
+ }
2150
+ /**
2151
+ * Deserializes / reads binary message into message instance using provided binary reader
2152
+ * @param _instance message instance
2153
+ * @param _reader binary reader instance
2154
+ */
2155
+ static deserializeBinaryFromReader(_instance, _reader) {
2156
+ while (_reader.nextField()) {
2157
+ if (_reader.isEndGroup())
2158
+ break;
2159
+ switch (_reader.getFieldNumber()) {
2160
+ case 1:
2161
+ _instance.session = _reader.readString();
2162
+ break;
2163
+ case 2:
2164
+ _instance.taskId = _reader.readString();
2165
+ break;
2166
+ default:
2167
+ _reader.skipField();
2168
+ }
2169
+ }
2170
+ TaskOutputRequest.refineValues(_instance);
2171
+ }
2172
+ /**
2173
+ * Serializes a message to binary format using provided binary reader
2174
+ * @param _instance message instance
2175
+ * @param _writer binary writer instance
2176
+ */
2177
+ static serializeBinaryToWriter(_instance, _writer) {
2178
+ if (_instance.session) {
2179
+ _writer.writeString(1, _instance.session);
2180
+ }
2181
+ if (_instance.taskId) {
2182
+ _writer.writeString(2, _instance.taskId);
2183
+ }
2184
+ }
2185
+ /**
2186
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2187
+ * @param _value initial values object or instance of TaskOutputRequest to deeply clone from
2188
+ */
2189
+ constructor(_value) {
2190
+ _value = _value || {};
2191
+ this.session = _value.session;
2192
+ this.taskId = _value.taskId;
2193
+ TaskOutputRequest.refineValues(this);
2194
+ }
2195
+ get session() {
2196
+ return this._session;
2197
+ }
2198
+ set session(value) {
2199
+ this._session = value;
2200
+ }
2201
+ get taskId() {
2202
+ return this._taskId;
2203
+ }
2204
+ set taskId(value) {
2205
+ this._taskId = value;
2206
+ }
2207
+ /**
2208
+ * Serialize message to binary data
2209
+ * @param instance message instance
2210
+ */
2211
+ serializeBinary() {
2212
+ const writer = new BinaryWriter();
2213
+ TaskOutputRequest.serializeBinaryToWriter(this, writer);
2214
+ return writer.getResultBuffer();
2215
+ }
2216
+ /**
2217
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2218
+ */
2219
+ toObject() {
2220
+ return {
2221
+ session: this.session,
2222
+ taskId: this.taskId
2223
+ };
2224
+ }
2225
+ /**
2226
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2227
+ */
2228
+ toJSON() {
2229
+ return this.toObject();
2230
+ }
2231
+ /**
2232
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2233
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2234
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2235
+ */
2236
+ toProtobufJSON(
2237
+ // @ts-ignore
2238
+ options) {
2239
+ return {
2240
+ session: this.session,
2241
+ taskId: this.taskId
2242
+ };
2243
+ }
2244
+ }
2245
+ TaskOutputRequest.id = 'armonik.api.grpc.v1.TaskOutputRequest';
2246
+ /**
2247
+ * Message implementation for armonik.api.grpc.v1.Error
2248
+ */
2249
+ export class Error {
2250
+ /**
2251
+ * Deserialize binary data to message
2252
+ * @param instance message instance
2253
+ */
2254
+ static deserializeBinary(bytes) {
2255
+ const instance = new Error();
2256
+ Error.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2257
+ return instance;
2258
+ }
2259
+ /**
2260
+ * Check all the properties and set default protobuf values if necessary
2261
+ * @param _instance message instance
2262
+ */
2263
+ static refineValues(_instance) {
2264
+ _instance.taskStatus = _instance.taskStatus || 0;
2265
+ _instance.detail = _instance.detail || '';
2266
+ }
2267
+ /**
2268
+ * Deserializes / reads binary message into message instance using provided binary reader
2269
+ * @param _instance message instance
2270
+ * @param _reader binary reader instance
2271
+ */
2272
+ static deserializeBinaryFromReader(_instance, _reader) {
2273
+ while (_reader.nextField()) {
2274
+ if (_reader.isEndGroup())
2275
+ break;
2276
+ switch (_reader.getFieldNumber()) {
2277
+ case 1:
2278
+ _instance.taskStatus = _reader.readEnum();
2279
+ break;
2280
+ case 2:
2281
+ _instance.detail = _reader.readString();
2282
+ break;
2283
+ default:
2284
+ _reader.skipField();
2285
+ }
2286
+ }
2287
+ Error.refineValues(_instance);
2288
+ }
2289
+ /**
2290
+ * Serializes a message to binary format using provided binary reader
2291
+ * @param _instance message instance
2292
+ * @param _writer binary writer instance
2293
+ */
2294
+ static serializeBinaryToWriter(_instance, _writer) {
2295
+ if (_instance.taskStatus) {
2296
+ _writer.writeEnum(1, _instance.taskStatus);
2297
+ }
2298
+ if (_instance.detail) {
2299
+ _writer.writeString(2, _instance.detail);
2300
+ }
2301
+ }
2302
+ /**
2303
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2304
+ * @param _value initial values object or instance of Error to deeply clone from
2305
+ */
2306
+ constructor(_value) {
2307
+ _value = _value || {};
2308
+ this.taskStatus = _value.taskStatus;
2309
+ this.detail = _value.detail;
2310
+ Error.refineValues(this);
2311
+ }
2312
+ get taskStatus() {
2313
+ return this._taskStatus;
2314
+ }
2315
+ set taskStatus(value) {
2316
+ this._taskStatus = value;
2317
+ }
2318
+ get detail() {
2319
+ return this._detail;
2320
+ }
2321
+ set detail(value) {
2322
+ this._detail = value;
2323
+ }
2324
+ /**
2325
+ * Serialize message to binary data
2326
+ * @param instance message instance
2327
+ */
2328
+ serializeBinary() {
2329
+ const writer = new BinaryWriter();
2330
+ Error.serializeBinaryToWriter(this, writer);
2331
+ return writer.getResultBuffer();
2332
+ }
2333
+ /**
2334
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2335
+ */
2336
+ toObject() {
2337
+ return {
2338
+ taskStatus: this.taskStatus,
2339
+ detail: this.detail
2340
+ };
2341
+ }
2342
+ /**
2343
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2344
+ */
2345
+ toJSON() {
2346
+ return this.toObject();
2347
+ }
2348
+ /**
2349
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2350
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2351
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2352
+ */
2353
+ toProtobufJSON(
2354
+ // @ts-ignore
2355
+ options) {
2356
+ return {
2357
+ taskStatus: armonikApiGrpcV1Task_status001.TaskStatus[this.taskStatus === null || this.taskStatus === undefined
2358
+ ? 0
2359
+ : this.taskStatus],
2360
+ detail: this.detail
2361
+ };
2362
+ }
2363
+ }
2364
+ Error.id = 'armonik.api.grpc.v1.Error';
2365
+ /**
2366
+ * Message implementation for armonik.api.grpc.v1.TaskError
2367
+ */
2368
+ export class TaskError {
2369
+ /**
2370
+ * Deserialize binary data to message
2371
+ * @param instance message instance
2372
+ */
2373
+ static deserializeBinary(bytes) {
2374
+ const instance = new TaskError();
2375
+ TaskError.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2376
+ return instance;
2377
+ }
2378
+ /**
2379
+ * Check all the properties and set default protobuf values if necessary
2380
+ * @param _instance message instance
2381
+ */
2382
+ static refineValues(_instance) {
2383
+ _instance.taskId = _instance.taskId || '';
2384
+ _instance.errors = _instance.errors || [];
2385
+ }
2386
+ /**
2387
+ * Deserializes / reads binary message into message instance using provided binary reader
2388
+ * @param _instance message instance
2389
+ * @param _reader binary reader instance
2390
+ */
2391
+ static deserializeBinaryFromReader(_instance, _reader) {
2392
+ while (_reader.nextField()) {
2393
+ if (_reader.isEndGroup())
2394
+ break;
2395
+ switch (_reader.getFieldNumber()) {
2396
+ case 1:
2397
+ _instance.taskId = _reader.readString();
2398
+ break;
2399
+ case 2:
2400
+ const messageInitializer2 = new Error();
2401
+ _reader.readMessage(messageInitializer2, Error.deserializeBinaryFromReader);
2402
+ (_instance.errors = _instance.errors || []).push(messageInitializer2);
2403
+ break;
2404
+ default:
2405
+ _reader.skipField();
2406
+ }
2407
+ }
2408
+ TaskError.refineValues(_instance);
2409
+ }
2410
+ /**
2411
+ * Serializes a message to binary format using provided binary reader
2412
+ * @param _instance message instance
2413
+ * @param _writer binary writer instance
2414
+ */
2415
+ static serializeBinaryToWriter(_instance, _writer) {
2416
+ if (_instance.taskId) {
2417
+ _writer.writeString(1, _instance.taskId);
2418
+ }
2419
+ if (_instance.errors && _instance.errors.length) {
2420
+ _writer.writeRepeatedMessage(2, _instance.errors, Error.serializeBinaryToWriter);
2421
+ }
2422
+ }
2423
+ /**
2424
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2425
+ * @param _value initial values object or instance of TaskError to deeply clone from
2426
+ */
2427
+ constructor(_value) {
2428
+ _value = _value || {};
2429
+ this.taskId = _value.taskId;
2430
+ this.errors = (_value.errors || []).map(m => new Error(m));
2431
+ TaskError.refineValues(this);
2432
+ }
2433
+ get taskId() {
2434
+ return this._taskId;
2435
+ }
2436
+ set taskId(value) {
2437
+ this._taskId = value;
2438
+ }
2439
+ get errors() {
2440
+ return this._errors;
2441
+ }
2442
+ set errors(value) {
2443
+ this._errors = value;
2444
+ }
2445
+ /**
2446
+ * Serialize message to binary data
2447
+ * @param instance message instance
2448
+ */
2449
+ serializeBinary() {
2450
+ const writer = new BinaryWriter();
2451
+ TaskError.serializeBinaryToWriter(this, writer);
2452
+ return writer.getResultBuffer();
2453
+ }
2454
+ /**
2455
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2456
+ */
2457
+ toObject() {
2458
+ return {
2459
+ taskId: this.taskId,
2460
+ errors: (this.errors || []).map(m => m.toObject())
2461
+ };
2462
+ }
2463
+ /**
2464
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2465
+ */
2466
+ toJSON() {
2467
+ return this.toObject();
2468
+ }
2469
+ /**
2470
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2471
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2472
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2473
+ */
2474
+ toProtobufJSON(
2475
+ // @ts-ignore
2476
+ options) {
2477
+ return {
2478
+ taskId: this.taskId,
2479
+ errors: (this.errors || []).map(m => m.toProtobufJSON(options))
2480
+ };
2481
+ }
2482
+ }
2483
+ TaskError.id = 'armonik.api.grpc.v1.TaskError';
2484
+ /**
2485
+ * Message implementation for armonik.api.grpc.v1.TaskList
2486
+ */
2487
+ export class TaskList {
2488
+ /**
2489
+ * Deserialize binary data to message
2490
+ * @param instance message instance
2491
+ */
2492
+ static deserializeBinary(bytes) {
2493
+ const instance = new TaskList();
2494
+ TaskList.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2495
+ return instance;
2496
+ }
2497
+ /**
2498
+ * Check all the properties and set default protobuf values if necessary
2499
+ * @param _instance message instance
2500
+ */
2501
+ static refineValues(_instance) {
2502
+ _instance.taskIds = _instance.taskIds || [];
2503
+ }
2504
+ /**
2505
+ * Deserializes / reads binary message into message instance using provided binary reader
2506
+ * @param _instance message instance
2507
+ * @param _reader binary reader instance
2508
+ */
2509
+ static deserializeBinaryFromReader(_instance, _reader) {
2510
+ while (_reader.nextField()) {
2511
+ if (_reader.isEndGroup())
2512
+ break;
2513
+ switch (_reader.getFieldNumber()) {
2514
+ case 1:
2515
+ const messageInitializer1 = new TaskId();
2516
+ _reader.readMessage(messageInitializer1, TaskId.deserializeBinaryFromReader);
2517
+ (_instance.taskIds = _instance.taskIds || []).push(messageInitializer1);
2518
+ break;
2519
+ default:
2520
+ _reader.skipField();
2521
+ }
2522
+ }
2523
+ TaskList.refineValues(_instance);
2524
+ }
2525
+ /**
2526
+ * Serializes a message to binary format using provided binary reader
2527
+ * @param _instance message instance
2528
+ * @param _writer binary writer instance
2529
+ */
2530
+ static serializeBinaryToWriter(_instance, _writer) {
2531
+ if (_instance.taskIds && _instance.taskIds.length) {
2532
+ _writer.writeRepeatedMessage(1, _instance.taskIds, TaskId.serializeBinaryToWriter);
2533
+ }
2534
+ }
2535
+ /**
2536
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2537
+ * @param _value initial values object or instance of TaskList to deeply clone from
2538
+ */
2539
+ constructor(_value) {
2540
+ _value = _value || {};
2541
+ this.taskIds = (_value.taskIds || []).map(m => new TaskId(m));
2542
+ TaskList.refineValues(this);
2543
+ }
2544
+ get taskIds() {
2545
+ return this._taskIds;
2546
+ }
2547
+ set taskIds(value) {
2548
+ this._taskIds = value;
2549
+ }
2550
+ /**
2551
+ * Serialize message to binary data
2552
+ * @param instance message instance
2553
+ */
2554
+ serializeBinary() {
2555
+ const writer = new BinaryWriter();
2556
+ TaskList.serializeBinaryToWriter(this, writer);
2557
+ return writer.getResultBuffer();
2558
+ }
2559
+ /**
2560
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2561
+ */
2562
+ toObject() {
2563
+ return {
2564
+ taskIds: (this.taskIds || []).map(m => m.toObject())
2565
+ };
2566
+ }
2567
+ /**
2568
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2569
+ */
2570
+ toJSON() {
2571
+ return this.toObject();
2572
+ }
2573
+ /**
2574
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2575
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2576
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2577
+ */
2578
+ toProtobufJSON(
2579
+ // @ts-ignore
2580
+ options) {
2581
+ return {
2582
+ taskIds: (this.taskIds || []).map(m => m.toProtobufJSON(options))
2583
+ };
2584
+ }
2585
+ }
2586
+ TaskList.id = 'armonik.api.grpc.v1.TaskList';
2587
+ /**
2588
+ * Message implementation for armonik.api.grpc.v1.TaskIdWithStatus
2589
+ */
2590
+ export class TaskIdWithStatus {
2591
+ /**
2592
+ * Deserialize binary data to message
2593
+ * @param instance message instance
2594
+ */
2595
+ static deserializeBinary(bytes) {
2596
+ const instance = new TaskIdWithStatus();
2597
+ TaskIdWithStatus.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2598
+ return instance;
2599
+ }
2600
+ /**
2601
+ * Check all the properties and set default protobuf values if necessary
2602
+ * @param _instance message instance
2603
+ */
2604
+ static refineValues(_instance) {
2605
+ _instance.taskId = _instance.taskId || undefined;
2606
+ _instance.status = _instance.status || 0;
2607
+ }
2608
+ /**
2609
+ * Deserializes / reads binary message into message instance using provided binary reader
2610
+ * @param _instance message instance
2611
+ * @param _reader binary reader instance
2612
+ */
2613
+ static deserializeBinaryFromReader(_instance, _reader) {
2614
+ while (_reader.nextField()) {
2615
+ if (_reader.isEndGroup())
2616
+ break;
2617
+ switch (_reader.getFieldNumber()) {
2618
+ case 1:
2619
+ _instance.taskId = new TaskId();
2620
+ _reader.readMessage(_instance.taskId, TaskId.deserializeBinaryFromReader);
2621
+ break;
2622
+ case 2:
2623
+ _instance.status = _reader.readEnum();
2624
+ break;
2625
+ default:
2626
+ _reader.skipField();
2627
+ }
2628
+ }
2629
+ TaskIdWithStatus.refineValues(_instance);
2630
+ }
2631
+ /**
2632
+ * Serializes a message to binary format using provided binary reader
2633
+ * @param _instance message instance
2634
+ * @param _writer binary writer instance
2635
+ */
2636
+ static serializeBinaryToWriter(_instance, _writer) {
2637
+ if (_instance.taskId) {
2638
+ _writer.writeMessage(1, _instance.taskId, TaskId.serializeBinaryToWriter);
2639
+ }
2640
+ if (_instance.status) {
2641
+ _writer.writeEnum(2, _instance.status);
2642
+ }
2643
+ }
2644
+ /**
2645
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2646
+ * @param _value initial values object or instance of TaskIdWithStatus to deeply clone from
2647
+ */
2648
+ constructor(_value) {
2649
+ _value = _value || {};
2650
+ this.taskId = _value.taskId ? new TaskId(_value.taskId) : undefined;
2651
+ this.status = _value.status;
2652
+ TaskIdWithStatus.refineValues(this);
2653
+ }
2654
+ get taskId() {
2655
+ return this._taskId;
2656
+ }
2657
+ set taskId(value) {
2658
+ this._taskId = value;
2659
+ }
2660
+ get status() {
2661
+ return this._status;
2662
+ }
2663
+ set status(value) {
2664
+ this._status = value;
2665
+ }
2666
+ /**
2667
+ * Serialize message to binary data
2668
+ * @param instance message instance
2669
+ */
2670
+ serializeBinary() {
2671
+ const writer = new BinaryWriter();
2672
+ TaskIdWithStatus.serializeBinaryToWriter(this, writer);
2673
+ return writer.getResultBuffer();
2674
+ }
2675
+ /**
2676
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2677
+ */
2678
+ toObject() {
2679
+ return {
2680
+ taskId: this.taskId ? this.taskId.toObject() : undefined,
2681
+ status: this.status
2682
+ };
2683
+ }
2684
+ /**
2685
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2686
+ */
2687
+ toJSON() {
2688
+ return this.toObject();
2689
+ }
2690
+ /**
2691
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2692
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2693
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2694
+ */
2695
+ toProtobufJSON(
2696
+ // @ts-ignore
2697
+ options) {
2698
+ return {
2699
+ taskId: this.taskId ? this.taskId.toProtobufJSON(options) : null,
2700
+ status: armonikApiGrpcV1Task_status001.TaskStatus[this.status === null || this.status === undefined ? 0 : this.status]
2701
+ };
2702
+ }
2703
+ }
2704
+ TaskIdWithStatus.id = 'armonik.api.grpc.v1.TaskIdWithStatus';
2705
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0cy5wYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZW9jb25zdWx0aW5nZnIvYXJtb25pay5hcGkuYW5ndWxhci9zcmMvbGliL2dlbmVyYXRlZC9vYmplY3RzLnBiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsY0FBYztBQUNkLEVBQUU7QUFDRiwyQkFBMkI7QUFDM0IsOENBQThDO0FBQzlDLE9BQU8sRUFJTCxrQkFBa0IsRUFDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxpQkFBaUIsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEtBQUssOEJBQThCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sS0FBSztJQUdoQjs7O09BR0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBaUI7UUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM3QixLQUFLLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckUsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBZ0IsSUFBRyxDQUFDO0lBRXhDOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsMkJBQTJCLENBQUMsU0FBZ0IsRUFBRSxPQUFxQjtRQUN4RSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUMxQixJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQUUsTUFBTTtZQUVoQyxRQUFRLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRTtnQkFDaEM7b0JBQ0UsT0FB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dUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkQsT0FBTyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUN4RCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWM7SUFDWixhQUFhO0lBQ2IsT0FBK0I7UUFFL0IsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNoRSxNQUFNLEVBQ0osOEJBQThCLENBQUMsVUFBVSxDQUN2QyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNwRTtTQUNKLENBQUM7SUFDSixDQUFDOztBQWpKTSxtQkFBRSxHQUFHLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuLy9cbi8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRVxuLy8gRE8gTk9UIE1PRElGWSBJVCEgWU9VUiBDSEFOR0VTIFdJTEwgQkUgTE9TVFxuaW1wb3J0IHtcbiAgR3JwY01lc3NhZ2UsXG4gIFJlY3Vyc2l2ZVBhcnRpYWwsXG4gIFRvUHJvdG9idWZKU09OT3B0aW9ucyxcbiAgdWludDhBcnJheVRvQmFzZTY0XG59IGZyb20gJ0BuZ3gtZ3JwYy9jb21tb24nO1xuaW1wb3J0IHsgQmluYXJ5UmVhZGVyLCBCaW5hcnlXcml0ZXIsIEJ5dGVTb3VyY2UgfSBmcm9tICdnb29nbGUtcHJvdG9idWYnO1xuaW1wb3J0ICogYXMgZ29vZ2xlUHJvdG9idWYwMDAgZnJvbSAnQG5neC1ncnBjL3dlbGwta25vd24tdHlwZXMnO1xuaW1wb3J0ICogYXMgYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAxIGZyb20gJy4vdGFzay1zdGF0dXMucGInO1xuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLkVtcHR5XG4gKi9cbmV4cG9ydCBjbGFzcyBFbXB0eSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEuRW1wdHknO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRW1wdHkpIHt9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKF9pbnN0YW5jZTogRW1wdHksIF9yZWFkZXI6IEJpbmFyeVJlYWRlcikge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRW1wdHkucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoX2luc3RhbmNlOiBFbXB0eSwgX3dyaXRlcjogQmluYXJ5V3JpdGVyKSB7fVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgRW1wdHkgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RW1wdHkuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIEVtcHR5LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBFbXB0eS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBFbXB0eS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBFbXB0eS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEVtcHR5IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBFbXB0eVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7fVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBFbXB0eVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7fVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuVGFza09wdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tPcHRpb25zIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrT3B0aW9ucyc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRhc2tPcHRpb25zKCk7XG4gICAgVGFza09wdGlvbnMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBUYXNrT3B0aW9ucykge1xuICAgIF9pbnN0YW5jZS5vcHRpb25zID0gX2luc3RhbmNlLm9wdGlvbnMgfHwge307XG4gICAgX2luc3RhbmNlLm1heER1cmF0aW9uID0gX2luc3RhbmNlLm1heER1cmF0aW9uIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UubWF4UmV0cmllcyA9IF9pbnN0YW5jZS5tYXhSZXRyaWVzIHx8IDA7XG4gICAgX2luc3RhbmNlLnByaW9yaXR5ID0gX2luc3RhbmNlLnByaW9yaXR5IHx8IDA7XG4gICAgX2luc3RhbmNlLnBhcnRpdGlvbklkID0gX2luc3RhbmNlLnBhcnRpdGlvbklkIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5hcHBsaWNhdGlvbk5hbWUgPSBfaW5zdGFuY2UuYXBwbGljYXRpb25OYW1lIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5hcHBsaWNhdGlvblZlcnNpb24gPSBfaW5zdGFuY2UuYXBwbGljYXRpb25WZXJzaW9uIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5hcHBsaWNhdGlvbk5hbWVzcGFjZSA9IF9pbnN0YW5jZS5hcHBsaWNhdGlvbk5hbWVzcGFjZSB8fCAnJztcbiAgICBfaW5zdGFuY2UuYXBwbGljYXRpb25TZXJ2aWNlID0gX2luc3RhbmNlLmFwcGxpY2F0aW9uU2VydmljZSB8fCAnJztcbiAgICBfaW5zdGFuY2UuZW5naW5lVHlwZSA9IF9pbnN0YW5jZS5lbmdpbmVUeXBlIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogVGFza09wdGlvbnMsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbXNnXzEgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1zZ18xLFxuICAgICAgICAgICAgVGFza09wdGlvbnMuT3B0aW9uc0VudHJ5LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgX2luc3RhbmNlLm9wdGlvbnMgPSBfaW5zdGFuY2Uub3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICBfaW5zdGFuY2Uub3B0aW9uc1ttc2dfMS5rZXldID0gbXNnXzEudmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubWF4RHVyYXRpb24gPSBuZXcgZ29vZ2xlUHJvdG9idWYwMDAuRHVyYXRpb24oKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLm1heER1cmF0aW9uLFxuICAgICAgICAgICAgZ29vZ2xlUHJvdG9idWYwMDAuRHVyYXRpb24uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9pbnN0YW5jZS5tYXhSZXRyaWVzID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9pbnN0YW5jZS5wcmlvcml0eSA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFydGl0aW9uSWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS5hcHBsaWNhdGlvbk5hbWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9pbnN0YW5jZS5hcHBsaWNhdGlvblZlcnNpb24gPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIF9pbnN0YW5jZS5hcHBsaWNhdGlvbk5hbWVzcGFjZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgX2luc3RhbmNlLmFwcGxpY2F0aW9uU2VydmljZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIF9pbnN0YW5jZS5lbmdpbmVUeXBlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBUYXNrT3B0aW9ucy5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFRhc2tPcHRpb25zLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoISFfaW5zdGFuY2Uub3B0aW9ucykge1xuICAgICAgY29uc3Qga2V5c18xID0gT2JqZWN0LmtleXMoX2luc3RhbmNlLm9wdGlvbnMgYXMgYW55KTtcblxuICAgICAgaWYgKGtleXNfMS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVwZWF0ZWRfMSA9IGtleXNfMVxuICAgICAgICAgIC5tYXAoa2V5ID0+ICh7IGtleToga2V5LCB2YWx1ZTogKF9pbnN0YW5jZS5vcHRpb25zIGFzIGFueSlba2V5XSB9KSlcbiAgICAgICAgICAucmVkdWNlKChyLCB2KSA9PiBbLi4uciwgdl0sIFtdIGFzIGFueVtdKTtcblxuICAgICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAgIDEsXG4gICAgICAgICAgcmVwZWF0ZWRfMSxcbiAgICAgICAgICBUYXNrT3B0aW9ucy5PcHRpb25zRW50cnkuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5tYXhEdXJhdGlvbikge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDIsXG4gICAgICAgIF9pbnN0YW5jZS5tYXhEdXJhdGlvbiBhcyBhbnksXG4gICAgICAgIGdvb2dsZVByb3RvYnVmMDAwLkR1cmF0aW9uLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm1heFJldHJpZXMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMigzLCBfaW5zdGFuY2UubWF4UmV0cmllcyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UucHJpb3JpdHkpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig0LCBfaW5zdGFuY2UucHJpb3JpdHkpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnBhcnRpdGlvbklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDUsIF9pbnN0YW5jZS5wYXJ0aXRpb25JZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuYXBwbGljYXRpb25OYW1lKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDYsIF9pbnN0YW5jZS5hcHBsaWNhdGlvbk5hbWUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmFwcGxpY2F0aW9uVmVyc2lvbikge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg3LCBfaW5zdGFuY2UuYXBwbGljYXRpb25WZXJzaW9uKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5hcHBsaWNhdGlvbk5hbWVzcGFjZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg4LCBfaW5zdGFuY2UuYXBwbGljYXRpb25OYW1lc3BhY2UpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmFwcGxpY2F0aW9uU2VydmljZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg5LCBfaW5zdGFuY2UuYXBwbGljYXRpb25TZXJ2aWNlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbmdpbmVUeXBlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEwLCBfaW5zdGFuY2UuZW5naW5lVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb3B0aW9uczogeyBbcHJvcDogc3RyaW5nXTogc3RyaW5nIH07XG4gIHByaXZhdGUgX21heER1cmF0aW9uPzogZ29vZ2xlUHJvdG9idWYwMDAuRHVyYXRpb247XG4gIHByaXZhdGUgX21heFJldHJpZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcHJpb3JpdHk6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcGFydGl0aW9uSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfYXBwbGljYXRpb25OYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX2FwcGxpY2F0aW9uVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF9hcHBsaWNhdGlvbk5hbWVzcGFjZTogc3RyaW5nO1xuICBwcml2YXRlIF9hcHBsaWNhdGlvblNlcnZpY2U6IHN0cmluZztcbiAgcHJpdmF0ZSBfZW5naW5lVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVGFza09wdGlvbnMgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VGFza09wdGlvbnMuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICh0aGlzLm9wdGlvbnMgPSBfdmFsdWUhLm9wdGlvbnNcbiAgICAgID8gT2JqZWN0LmtleXMoX3ZhbHVlIS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgICAgICAgKHIsIGspID0+ICh7IC4uLnIsIFtrXTogX3ZhbHVlIS5vcHRpb25zIVtrXSB9KSxcbiAgICAgICAgICB7fVxuICAgICAgICApXG4gICAgICA6IHt9KSxcbiAgICAgICh0aGlzLm1heER1cmF0aW9uID0gX3ZhbHVlLm1heER1cmF0aW9uXG4gICAgICAgID8gbmV3IGdvb2dsZVByb3RvYnVmMDAwLkR1cmF0aW9uKF92YWx1ZS5tYXhEdXJhdGlvbilcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgIHRoaXMubWF4UmV0cmllcyA9IF92YWx1ZS5tYXhSZXRyaWVzO1xuICAgIHRoaXMucHJpb3JpdHkgPSBfdmFsdWUucHJpb3JpdHk7XG4gICAgdGhpcy5wYXJ0aXRpb25JZCA9IF92YWx1ZS5wYXJ0aXRpb25JZDtcbiAgICB0aGlzLmFwcGxpY2F0aW9uTmFtZSA9IF92YWx1ZS5hcHBsaWNhdGlvbk5hbWU7XG4gICAgdGhpcy5hcHBsaWNhdGlvblZlcnNpb24gPSBfdmFsdWUuYXBwbGljYXRpb25WZXJzaW9uO1xuICAgIHRoaXMuYXBwbGljYXRpb25OYW1lc3BhY2UgPSBfdmFsdWUuYXBwbGljYXRpb25OYW1lc3BhY2U7XG4gICAgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UgPSBfdmFsdWUuYXBwbGljYXRpb25TZXJ2aWNlO1xuICAgIHRoaXMuZW5naW5lVHlwZSA9IF92YWx1ZS5lbmdpbmVUeXBlO1xuICAgIFRhc2tPcHRpb25zLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgb3B0aW9ucygpOiB7IFtwcm9wOiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH1cbiAgc2V0IG9wdGlvbnModmFsdWU6IHsgW3Byb3A6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHZhbHVlO1xuICB9XG4gIGdldCBtYXhEdXJhdGlvbigpOiBnb29nbGVQcm90b2J1ZjAwMC5EdXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21heER1cmF0aW9uO1xuICB9XG4gIHNldCBtYXhEdXJhdGlvbih2YWx1ZTogZ29vZ2xlUHJvdG9idWYwMDAuRHVyYXRpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9tYXhEdXJhdGlvbiA9IHZhbHVlO1xuICB9XG4gIGdldCBtYXhSZXRyaWVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heFJldHJpZXM7XG4gIH1cbiAgc2V0IG1heFJldHJpZXModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heFJldHJpZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcHJpb3JpdHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpb3JpdHk7XG4gIH1cbiAgc2V0IHByaW9yaXR5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wcmlvcml0eSA9IHZhbHVlO1xuICB9XG4gIGdldCBwYXJ0aXRpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJ0aXRpb25JZDtcbiAgfVxuICBzZXQgcGFydGl0aW9uSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BhcnRpdGlvbklkID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGFwcGxpY2F0aW9uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbk5hbWU7XG4gIH1cbiAgc2V0IGFwcGxpY2F0aW9uTmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXBwbGljYXRpb25OYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGFwcGxpY2F0aW9uVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvblZlcnNpb247XG4gIH1cbiAgc2V0IGFwcGxpY2F0aW9uVmVyc2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXBwbGljYXRpb25WZXJzaW9uID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGFwcGxpY2F0aW9uTmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9uTmFtZXNwYWNlO1xuICB9XG4gIHNldCBhcHBsaWNhdGlvbk5hbWVzcGFjZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXBwbGljYXRpb25OYW1lc3BhY2UgPSB2YWx1ZTtcbiAgfVxuICBnZXQgYXBwbGljYXRpb25TZXJ2aWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9uU2VydmljZTtcbiAgfVxuICBzZXQgYXBwbGljYXRpb25TZXJ2aWNlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hcHBsaWNhdGlvblNlcnZpY2UgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZW5naW5lVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9lbmdpbmVUeXBlO1xuICB9XG4gIHNldCBlbmdpbmVUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9lbmdpbmVUeXBlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgVGFza09wdGlvbnMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogVGFza09wdGlvbnMuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnNcbiAgICAgICAgPyBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMpLnJlZHVjZShcbiAgICAgICAgICAgIChyLCBrKSA9PiAoeyAuLi5yLCBba106IHRoaXMub3B0aW9ucyFba10gfSksXG4gICAgICAgICAgICB7fVxuICAgICAgICAgIClcbiAgICAgICAgOiB7fSxcbiAgICAgIG1heER1cmF0aW9uOiB0aGlzLm1heER1cmF0aW9uID8gdGhpcy5tYXhEdXJhdGlvbi50b09iamVjdCgpIDogdW5kZWZpbmVkLFxuICAgICAgbWF4UmV0cmllczogdGhpcy5tYXhSZXRyaWVzLFxuICAgICAgcHJpb3JpdHk6IHRoaXMucHJpb3JpdHksXG4gICAgICBwYXJ0aXRpb25JZDogdGhpcy5wYXJ0aXRpb25JZCxcbiAgICAgIGFwcGxpY2F0aW9uTmFtZTogdGhpcy5hcHBsaWNhdGlvbk5hbWUsXG4gICAgICBhcHBsaWNhdGlvblZlcnNpb246IHRoaXMuYXBwbGljYXRpb25WZXJzaW9uLFxuICAgICAgYXBwbGljYXRpb25OYW1lc3BhY2U6IHRoaXMuYXBwbGljYXRpb25OYW1lc3BhY2UsXG4gICAgICBhcHBsaWNhdGlvblNlcnZpY2U6IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLFxuICAgICAgZW5naW5lVHlwZTogdGhpcy5lbmdpbmVUeXBlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogVGFza09wdGlvbnMuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnNcbiAgICAgICAgPyBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMpLnJlZHVjZShcbiAgICAgICAgICAgIChyLCBrKSA9PiAoeyAuLi5yLCBba106IHRoaXMub3B0aW9ucyFba10gfSksXG4gICAgICAgICAgICB7fVxuICAgICAgICAgIClcbiAgICAgICAgOiB7fSxcbiAgICAgIG1heER1cmF0aW9uOiB0aGlzLm1heER1cmF0aW9uXG4gICAgICAgID8gdGhpcy5tYXhEdXJhdGlvbi50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGwsXG4gICAgICBtYXhSZXRyaWVzOiB0aGlzLm1heFJldHJpZXMsXG4gICAgICBwcmlvcml0eTogdGhpcy5wcmlvcml0eSxcbiAgICAgIHBhcnRpdGlvbklkOiB0aGlzLnBhcnRpdGlvbklkLFxuICAgICAgYXBwbGljYXRpb25OYW1lOiB0aGlzLmFwcGxpY2F0aW9uTmFtZSxcbiAgICAgIGFwcGxpY2F0aW9uVmVyc2lvbjogdGhpcy5hcHBsaWNhdGlvblZlcnNpb24sXG4gICAgICBhcHBsaWNhdGlvbk5hbWVzcGFjZTogdGhpcy5hcHBsaWNhdGlvbk5hbWVzcGFjZSxcbiAgICAgIGFwcGxpY2F0aW9uU2VydmljZTogdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UsXG4gICAgICBlbmdpbmVUeXBlOiB0aGlzLmVuZ2luZVR5cGVcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFRhc2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBUYXNrT3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgb3B0aW9uczogeyBbcHJvcDogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgbWF4RHVyYXRpb24/OiBnb29nbGVQcm90b2J1ZjAwMC5EdXJhdGlvbi5Bc09iamVjdDtcbiAgICBtYXhSZXRyaWVzOiBudW1iZXI7XG4gICAgcHJpb3JpdHk6IG51bWJlcjtcbiAgICBwYXJ0aXRpb25JZDogc3RyaW5nO1xuICAgIGFwcGxpY2F0aW9uTmFtZTogc3RyaW5nO1xuICAgIGFwcGxpY2F0aW9uVmVyc2lvbjogc3RyaW5nO1xuICAgIGFwcGxpY2F0aW9uTmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgYXBwbGljYXRpb25TZXJ2aWNlOiBzdHJpbmc7XG4gICAgZW5naW5lVHlwZTogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFRhc2tPcHRpb25zXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBvcHRpb25zOiB7IFtwcm9wOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICBtYXhEdXJhdGlvbjogZ29vZ2xlUHJvdG9idWYwMDAuRHVyYXRpb24uQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIG1heFJldHJpZXM6IG51bWJlcjtcbiAgICBwcmlvcml0eTogbnVtYmVyO1xuICAgIHBhcnRpdGlvbklkOiBzdHJpbmc7XG4gICAgYXBwbGljYXRpb25OYW1lOiBzdHJpbmc7XG4gICAgYXBwbGljYXRpb25WZXJzaW9uOiBzdHJpbmc7XG4gICAgYXBwbGljYXRpb25OYW1lc3BhY2U6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvblNlcnZpY2U6IHN0cmluZztcbiAgICBlbmdpbmVUeXBlOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrT3B0aW9ucy5PcHRpb25zRW50cnlcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBPcHRpb25zRW50cnkgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEuVGFza09wdGlvbnMuT3B0aW9uc0VudHJ5JztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgT3B0aW9uc0VudHJ5KCk7XG4gICAgICBPcHRpb25zRW50cnkuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IE9wdGlvbnNFbnRyeSkge1xuICAgICAgX2luc3RhbmNlLmtleSA9IF9pbnN0YW5jZS5rZXkgfHwgJyc7XG4gICAgICBfaW5zdGFuY2UudmFsdWUgPSBfaW5zdGFuY2UudmFsdWUgfHwgJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIF9pbnN0YW5jZTogT3B0aW9uc0VudHJ5LFxuICAgICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICAgKSB7XG4gICAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgX2luc3RhbmNlLmtleSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2luc3RhbmNlLnZhbHVlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBPcHRpb25zRW50cnkucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogT3B0aW9uc0VudHJ5LFxuICAgICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICAgKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLmtleSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5rZXkpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS52YWx1ZSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfa2V5OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIE9wdGlvbnNFbnRyeSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8T3B0aW9uc0VudHJ5LkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy5rZXkgPSBfdmFsdWUua2V5O1xuICAgICAgdGhpcy52YWx1ZSA9IF92YWx1ZS52YWx1ZTtcbiAgICAgIE9wdGlvbnNFbnRyeS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gICAgfVxuICAgIGdldCBrZXkoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9rZXk7XG4gICAgfVxuICAgIHNldCBrZXkodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fa2V5ID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgT3B0aW9uc0VudHJ5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IE9wdGlvbnNFbnRyeS5Bc09iamVjdCB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IHRoaXMua2V5LFxuICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICAgKi9cbiAgICB0b1Byb3RvYnVmSlNPTihcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgICApOiBPcHRpb25zRW50cnkuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiB0aGlzLmtleSxcbiAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgT3B0aW9uc0VudHJ5IHtcbiAgICAvKipcbiAgICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgT3B0aW9uc0VudHJ5XG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICBrZXk6IHN0cmluZztcbiAgICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgT3B0aW9uc0VudHJ5XG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICBrZXk6IHN0cmluZztcbiAgICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5TZXNzaW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5TZXNzaW9uJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgU2Vzc2lvbigpO1xuICAgIFNlc3Npb24uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBTZXNzaW9uKSB7XG4gICAgX2luc3RhbmNlLmlkID0gX2luc3RhbmNlLmlkIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogU2Vzc2lvbixcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UuaWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFNlc3Npb24ucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoX2luc3RhbmNlOiBTZXNzaW9uLCBfd3JpdGVyOiBCaW5hcnlXcml0ZXIpIHtcbiAgICBpZiAoX2luc3RhbmNlLmlkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5pZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFNlc3Npb24gdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8U2Vzc2lvbi5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5pZCA9IF92YWx1ZS5pZDtcbiAgICBTZXNzaW9uLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cbiAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFNlc3Npb24uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogU2Vzc2lvbi5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogU2Vzc2lvbi5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBTZXNzaW9uIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBTZXNzaW9uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFNlc3Npb25cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLkNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLkNvbmZpZ3VyYXRpb24nO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgQ29uZmlndXJhdGlvbi5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENvbmZpZ3VyYXRpb24pIHtcbiAgICBfaW5zdGFuY2UuZGF0YUNodW5rTWF4U2l6ZSA9IF9pbnN0YW5jZS5kYXRhQ2h1bmtNYXhTaXplIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDb25maWd1cmF0aW9uLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5kYXRhQ2h1bmtNYXhTaXplID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIENvbmZpZ3VyYXRpb24ucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBDb25maWd1cmF0aW9uLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmRhdGFDaHVua01heFNpemUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMigxLCBfaW5zdGFuY2UuZGF0YUNodW5rTWF4U2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGF0YUNodW5rTWF4U2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQ29uZmlndXJhdGlvbiB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDb25maWd1cmF0aW9uLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmRhdGFDaHVua01heFNpemUgPSBfdmFsdWUuZGF0YUNodW5rTWF4U2l6ZTtcbiAgICBDb25maWd1cmF0aW9uLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZGF0YUNodW5rTWF4U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhQ2h1bmtNYXhTaXplO1xuICB9XG4gIHNldCBkYXRhQ2h1bmtNYXhTaXplKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kYXRhQ2h1bmtNYXhTaXplID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ29uZmlndXJhdGlvbi5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDb25maWd1cmF0aW9uLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YUNodW5rTWF4U2l6ZTogdGhpcy5kYXRhQ2h1bmtNYXhTaXplXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ29uZmlndXJhdGlvbi5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGFDaHVua01heFNpemU6IHRoaXMuZGF0YUNodW5rTWF4U2l6ZVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ29uZmlndXJhdGlvblxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZGF0YUNodW5rTWF4U2l6ZTogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENvbmZpZ3VyYXRpb25cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGRhdGFDaHVua01heFNpemU6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuT3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBPdXRwdXQgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLk91dHB1dCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE91dHB1dCgpO1xuICAgIE91dHB1dC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoaW5zdGFuY2UsIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IE91dHB1dCkge31cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoX2luc3RhbmNlOiBPdXRwdXQsIF9yZWFkZXI6IEJpbmFyeVJlYWRlcikge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLm9rID0gbmV3IEVtcHR5KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShfaW5zdGFuY2Uub2ssIEVtcHR5LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UuZXJyb3IgPSBuZXcgT3V0cHV0LkVycm9yKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5lcnJvcixcbiAgICAgICAgICAgIE91dHB1dC5FcnJvci5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgT3V0cHV0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKF9pbnN0YW5jZTogT3V0cHV0LCBfd3JpdGVyOiBCaW5hcnlXcml0ZXIpIHtcbiAgICBpZiAoX2luc3RhbmNlLm9rKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMixcbiAgICAgICAgX2luc3RhbmNlLm9rIGFzIGFueSxcbiAgICAgICAgRW1wdHkuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZXJyb3IpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2UuZXJyb3IgYXMgYW55LFxuICAgICAgICBPdXRwdXQuRXJyb3Iuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb2s/OiBFbXB0eTtcbiAgcHJpdmF0ZSBfZXJyb3I/OiBPdXRwdXQuRXJyb3I7XG5cbiAgcHJpdmF0ZSBfdHlwZTogT3V0cHV0LlR5cGVDYXNlID0gT3V0cHV0LlR5cGVDYXNlLm5vbmU7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBPdXRwdXQgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8T3V0cHV0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLm9rID0gX3ZhbHVlLm9rID8gbmV3IEVtcHR5KF92YWx1ZS5vaykgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lcnJvciA9IF92YWx1ZS5lcnJvciA/IG5ldyBPdXRwdXQuRXJyb3IoX3ZhbHVlLmVycm9yKSA6IHVuZGVmaW5lZDtcbiAgICBPdXRwdXQucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBvaygpOiBFbXB0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX29rO1xuICB9XG4gIHNldCBvayh2YWx1ZTogRW1wdHkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90eXBlID0gT3V0cHV0LlR5cGVDYXNlLm9rO1xuICAgIH1cbiAgICB0aGlzLl9vayA9IHZhbHVlO1xuICB9XG4gIGdldCBlcnJvcigpOiBPdXRwdXQuRXJyb3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgfVxuICBzZXQgZXJyb3IodmFsdWU6IE91dHB1dC5FcnJvciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9vayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3R5cGUgPSBPdXRwdXQuVHlwZUNhc2UuZXJyb3I7XG4gICAgfVxuICAgIHRoaXMuX2Vycm9yID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgT3V0cHV0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IE91dHB1dC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiB0aGlzLm9rID8gdGhpcy5vay50b09iamVjdCgpIDogdW5kZWZpbmVkLFxuICAgICAgZXJyb3I6IHRoaXMuZXJyb3IgPyB0aGlzLmVycm9yLnRvT2JqZWN0KCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBPdXRwdXQuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBvazogdGhpcy5vayA/IHRoaXMub2sudG9Qcm90b2J1ZkpTT04ob3B0aW9ucykgOiBudWxsLFxuICAgICAgZXJyb3I6IHRoaXMuZXJyb3IgPyB0aGlzLmVycm9yLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpIDogbnVsbFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgT3V0cHV0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBPdXRwdXRcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIG9rPzogRW1wdHkuQXNPYmplY3Q7XG4gICAgZXJyb3I/OiBPdXRwdXQuRXJyb3IuQXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgT3V0cHV0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBvazogRW1wdHkuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIGVycm9yOiBPdXRwdXQuRXJyb3IuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICB9XG4gIGV4cG9ydCBlbnVtIFR5cGVDYXNlIHtcbiAgICBub25lID0gMCxcbiAgICBvayA9IDEsXG4gICAgZXJyb3IgPSAyXG4gIH1cbiAgLyoqXG4gICAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuT3V0cHV0LkVycm9yXG4gICAqL1xuICBleHBvcnQgY2xhc3MgRXJyb3IgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEuT3V0cHV0LkVycm9yJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRXJyb3IoKTtcbiAgICAgIEVycm9yLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBFcnJvcikge1xuICAgICAgX2luc3RhbmNlLmRldGFpbHMgPSBfaW5zdGFuY2UuZGV0YWlscyB8fCAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBFcnJvcixcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5kZXRhaWxzID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBFcnJvci5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKF9pbnN0YW5jZTogRXJyb3IsIF93cml0ZXI6IEJpbmFyeVdyaXRlcikge1xuICAgICAgaWYgKF9pbnN0YW5jZS5kZXRhaWxzKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLmRldGFpbHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGFpbHM6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEVycm9yIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxFcnJvci5Bc09iamVjdD4pIHtcbiAgICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICAgIHRoaXMuZGV0YWlscyA9IF92YWx1ZS5kZXRhaWxzO1xuICAgICAgRXJyb3IucmVmaW5lVmFsdWVzKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgZGV0YWlscygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbHM7XG4gICAgfVxuICAgIHNldCBkZXRhaWxzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuX2RldGFpbHMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgRXJyb3Iuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogRXJyb3IuQXNPYmplY3Qge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGV0YWlsczogdGhpcy5kZXRhaWxzXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IEVycm9yLkFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldGFpbHM6IHRoaXMuZGV0YWlsc1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IG1vZHVsZSBFcnJvciB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEVycm9yXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICBkZXRhaWxzOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRXJyb3JcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICAgIGRldGFpbHM6IHN0cmluZztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLlRhc2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBUYXNrUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEuVGFza1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUYXNrUmVxdWVzdCgpO1xuICAgIFRhc2tSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogVGFza1JlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UuZXhwZWN0ZWRPdXRwdXRLZXlzID0gX2luc3RhbmNlLmV4cGVjdGVkT3V0cHV0S2V5cyB8fCBbXTtcbiAgICBfaW5zdGFuY2UuZGF0YURlcGVuZGVuY2llcyA9IF9pbnN0YW5jZS5kYXRhRGVwZW5kZW5jaWVzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5wYXlsb2FkID0gX2luc3RhbmNlLnBheWxvYWQgfHwgbmV3IFVpbnQ4QXJyYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFRhc2tSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIChfaW5zdGFuY2UuZXhwZWN0ZWRPdXRwdXRLZXlzID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5leHBlY3RlZE91dHB1dEtleXMgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgKF9pbnN0YW5jZS5kYXRhRGVwZW5kZW5jaWVzID0gX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UucGF5bG9hZCA9IF9yZWFkZXIucmVhZEJ5dGVzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBUYXNrUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFRhc2tSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmV4cGVjdGVkT3V0cHV0S2V5cyAmJiBfaW5zdGFuY2UuZXhwZWN0ZWRPdXRwdXRLZXlzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKDEsIF9pbnN0YW5jZS5leHBlY3RlZE91dHB1dEtleXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMgJiYgX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoMiwgX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnBheWxvYWQgJiYgX2luc3RhbmNlLnBheWxvYWQubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQnl0ZXMoMywgX2luc3RhbmNlLnBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2V4cGVjdGVkT3V0cHV0S2V5czogc3RyaW5nW107XG4gIHByaXZhdGUgX2RhdGFEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBwcml2YXRlIF9wYXlsb2FkOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVGFza1JlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VGFza1JlcXVlc3QuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZXhwZWN0ZWRPdXRwdXRLZXlzID0gKF92YWx1ZS5leHBlY3RlZE91dHB1dEtleXMgfHwgW10pLnNsaWNlKCk7XG4gICAgdGhpcy5kYXRhRGVwZW5kZW5jaWVzID0gKF92YWx1ZS5kYXRhRGVwZW5kZW5jaWVzIHx8IFtdKS5zbGljZSgpO1xuICAgIHRoaXMucGF5bG9hZCA9IF92YWx1ZS5wYXlsb2FkO1xuICAgIFRhc2tSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZXhwZWN0ZWRPdXRwdXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwZWN0ZWRPdXRwdXRLZXlzO1xuICB9XG4gIHNldCBleHBlY3RlZE91dHB1dEtleXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhwZWN0ZWRPdXRwdXRLZXlzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGRhdGFEZXBlbmRlbmNpZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhRGVwZW5kZW5jaWVzO1xuICB9XG4gIHNldCBkYXRhRGVwZW5kZW5jaWVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2RhdGFEZXBlbmRlbmNpZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcGF5bG9hZCgpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgfVxuICBzZXQgcGF5bG9hZCh2YWx1ZTogVWludDhBcnJheSkge1xuICAgIHRoaXMuX3BheWxvYWQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBUYXNrUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBUYXNrUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGVjdGVkT3V0cHV0S2V5czogKHRoaXMuZXhwZWN0ZWRPdXRwdXRLZXlzIHx8IFtdKS5zbGljZSgpLFxuICAgICAgZGF0YURlcGVuZGVuY2llczogKHRoaXMuZGF0YURlcGVuZGVuY2llcyB8fCBbXSkuc2xpY2UoKSxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCA/IHRoaXMucGF5bG9hZC5zdWJhcnJheSgwKSA6IG5ldyBVaW50OEFycmF5KClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBUYXNrUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGVjdGVkT3V0cHV0S2V5czogKHRoaXMuZXhwZWN0ZWRPdXRwdXRLZXlzIHx8IFtdKS5zbGljZSgpLFxuICAgICAgZGF0YURlcGVuZGVuY2llczogKHRoaXMuZGF0YURlcGVuZGVuY2llcyB8fCBbXSkuc2xpY2UoKSxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCA/IHVpbnQ4QXJyYXlUb0Jhc2U2NCh0aGlzLnBheWxvYWQpIDogJydcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFRhc2tSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBUYXNrUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZXhwZWN0ZWRPdXRwdXRLZXlzOiBzdHJpbmdbXTtcbiAgICBkYXRhRGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgICBwYXlsb2FkOiBVaW50OEFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFRhc2tSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBleHBlY3RlZE91dHB1dEtleXM6IHN0cmluZ1tdO1xuICAgIGRhdGFEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICAgIHBheWxvYWQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuSW5pdEtleWVkRGF0YVN0cmVhbVxuICovXG5leHBvcnQgY2xhc3MgSW5pdEtleWVkRGF0YVN0cmVhbSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEuSW5pdEtleWVkRGF0YVN0cmVhbSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEluaXRLZXllZERhdGFTdHJlYW0oKTtcbiAgICBJbml0S2V5ZWREYXRhU3RyZWFtLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogSW5pdEtleWVkRGF0YVN0cmVhbSkge31cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBJbml0S2V5ZWREYXRhU3RyZWFtLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5rZXkgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5sYXN0UmVzdWx0ID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgSW5pdEtleWVkRGF0YVN0cmVhbS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEluaXRLZXllZERhdGFTdHJlYW0sXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2Uua2V5IHx8IF9pbnN0YW5jZS5rZXkgPT09ICcnKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5rZXkpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmxhc3RSZXN1bHQgfHwgX2luc3RhbmNlLmxhc3RSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgyLCBfaW5zdGFuY2UubGFzdFJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfa2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xhc3RSZXN1bHQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfdHlwZTogSW5pdEtleWVkRGF0YVN0cmVhbS5UeXBlQ2FzZSA9XG4gICAgSW5pdEtleWVkRGF0YVN0cmVhbS5UeXBlQ2FzZS5ub25lO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgSW5pdEtleWVkRGF0YVN0cmVhbSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxJbml0S2V5ZWREYXRhU3RyZWFtLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmtleSA9IF92YWx1ZS5rZXk7XG4gICAgdGhpcy5sYXN0UmVzdWx0ID0gX3ZhbHVlLmxhc3RSZXN1bHQ7XG4gICAgSW5pdEtleWVkRGF0YVN0cmVhbS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9rZXk7XG4gIH1cbiAgc2V0IGtleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2xhc3RSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90eXBlID0gSW5pdEtleWVkRGF0YVN0cmVhbS5UeXBlQ2FzZS5rZXk7XG4gICAgfVxuICAgIHRoaXMuX2tleSA9IHZhbHVlO1xuICB9XG4gIGdldCBsYXN0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sYXN0UmVzdWx0O1xuICB9XG4gIHNldCBsYXN0UmVzdWx0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3R5cGUgPSBJbml0S2V5ZWREYXRhU3RyZWFtLlR5cGVDYXNlLmxhc3RSZXN1bHQ7XG4gICAgfVxuICAgIHRoaXMuX2xhc3RSZXN1bHQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBJbml0S2V5ZWREYXRhU3RyZWFtLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEluaXRLZXllZERhdGFTdHJlYW0uQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHRoaXMua2V5LFxuICAgICAgbGFzdFJlc3VsdDogdGhpcy5sYXN0UmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogSW5pdEtleWVkRGF0YVN0cmVhbS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogdGhpcy5rZXkgPT09IG51bGwgfHwgdGhpcy5rZXkgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB0aGlzLmtleSxcbiAgICAgIGxhc3RSZXN1bHQ6IHRoaXMubGFzdFJlc3VsdFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgSW5pdEtleWVkRGF0YVN0cmVhbSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgSW5pdEtleWVkRGF0YVN0cmVhbVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgbGFzdFJlc3VsdDogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBJbml0S2V5ZWREYXRhU3RyZWFtXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBrZXk6IHN0cmluZyB8IG51bGw7XG4gICAgbGFzdFJlc3VsdDogYm9vbGVhbjtcbiAgfVxuICBleHBvcnQgZW51bSBUeXBlQ2FzZSB7XG4gICAgbm9uZSA9IDAsXG4gICAga2V5ID0gMSxcbiAgICBsYXN0UmVzdWx0ID0gMlxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5EYXRhQ2h1bmtcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaHVuayBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEuRGF0YUNodW5rJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGF0YUNodW5rKCk7XG4gICAgRGF0YUNodW5rLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRGF0YUNodW5rKSB7fVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IERhdGFDaHVuayxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UuZGF0YSA9IF9yZWFkZXIucmVhZEJ5dGVzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuZGF0YUNvbXBsZXRlID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRGF0YUNodW5rLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKF9pbnN0YW5jZTogRGF0YUNodW5rLCBfd3JpdGVyOiBCaW5hcnlXcml0ZXIpIHtcbiAgICBpZiAoX2luc3RhbmNlLmRhdGEgJiYgX2luc3RhbmNlLmRhdGEubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQnl0ZXMoMSwgX2luc3RhbmNlLmRhdGEpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmRhdGFDb21wbGV0ZSB8fCBfaW5zdGFuY2UuZGF0YUNvbXBsZXRlID09PSBmYWxzZSkge1xuICAgICAgX3dyaXRlci53cml0ZUJvb2woMiwgX2luc3RhbmNlLmRhdGFDb21wbGV0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDhBcnJheTtcbiAgcHJpdmF0ZSBfZGF0YUNvbXBsZXRlOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX3R5cGU6IERhdGFDaHVuay5UeXBlQ2FzZSA9IERhdGFDaHVuay5UeXBlQ2FzZS5ub25lO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgRGF0YUNodW5rIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPERhdGFDaHVuay5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5kYXRhID0gX3ZhbHVlLmRhdGE7XG4gICAgdGhpcy5kYXRhQ29tcGxldGUgPSBfdmFsdWUuZGF0YUNvbXBsZXRlO1xuICAgIERhdGFDaHVuay5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGRhdGEoKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cbiAgc2V0IGRhdGEodmFsdWU6IFVpbnQ4QXJyYXkpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZGF0YUNvbXBsZXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdHlwZSA9IERhdGFDaHVuay5UeXBlQ2FzZS5kYXRhO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGRhdGFDb21wbGV0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YUNvbXBsZXRlO1xuICB9XG4gIHNldCBkYXRhQ29tcGxldGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3R5cGUgPSBEYXRhQ2h1bmsuVHlwZUNhc2UuZGF0YUNvbXBsZXRlO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhQ29tcGxldGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBEYXRhQ2h1bmsuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogRGF0YUNodW5rLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogdGhpcy5kYXRhID8gdGhpcy5kYXRhLnN1YmFycmF5KDApIDogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgIGRhdGFDb21wbGV0ZTogdGhpcy5kYXRhQ29tcGxldGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBEYXRhQ2h1bmsuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiB0aGlzLmRhdGEgPyB1aW50OEFycmF5VG9CYXNlNjQodGhpcy5kYXRhKSA6ICcnLFxuICAgICAgZGF0YUNvbXBsZXRlOiB0aGlzLmRhdGFDb21wbGV0ZVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgRGF0YUNodW5rIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBEYXRhQ2h1bmtcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGRhdGE6IFVpbnQ4QXJyYXk7XG4gICAgZGF0YUNvbXBsZXRlOiBib29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIERhdGFDaHVua1xuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZGF0YTogc3RyaW5nO1xuICAgIGRhdGFDb21wbGV0ZTogYm9vbGVhbjtcbiAgfVxuICBleHBvcnQgZW51bSBUeXBlQ2FzZSB7XG4gICAgbm9uZSA9IDAsXG4gICAgZGF0YSA9IDEsXG4gICAgZGF0YUNvbXBsZXRlID0gMlxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrUmVxdWVzdEhlYWRlclxuICovXG5leHBvcnQgY2xhc3MgVGFza1JlcXVlc3RIZWFkZXIgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLlRhc2tSZXF1ZXN0SGVhZGVyJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVGFza1JlcXVlc3RIZWFkZXIoKTtcbiAgICBUYXNrUmVxdWVzdEhlYWRlci5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFRhc2tSZXF1ZXN0SGVhZGVyKSB7XG4gICAgX2luc3RhbmNlLmV4cGVjdGVkT3V0cHV0S2V5cyA9IF9pbnN0YW5jZS5leHBlY3RlZE91dHB1dEtleXMgfHwgW107XG4gICAgX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMgPSBfaW5zdGFuY2UuZGF0YURlcGVuZGVuY2llcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFRhc2tSZXF1ZXN0SGVhZGVyLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIChfaW5zdGFuY2UuZXhwZWN0ZWRPdXRwdXRLZXlzID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5leHBlY3RlZE91dHB1dEtleXMgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgKF9pbnN0YW5jZS5kYXRhRGVwZW5kZW5jaWVzID0gX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBUYXNrUmVxdWVzdEhlYWRlci5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFRhc2tSZXF1ZXN0SGVhZGVyLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmV4cGVjdGVkT3V0cHV0S2V5cyAmJiBfaW5zdGFuY2UuZXhwZWN0ZWRPdXRwdXRLZXlzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKDEsIF9pbnN0YW5jZS5leHBlY3RlZE91dHB1dEtleXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMgJiYgX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoMiwgX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2V4cGVjdGVkT3V0cHV0S2V5czogc3RyaW5nW107XG4gIHByaXZhdGUgX2RhdGFEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVGFza1JlcXVlc3RIZWFkZXIgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VGFza1JlcXVlc3RIZWFkZXIuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZXhwZWN0ZWRPdXRwdXRLZXlzID0gKF92YWx1ZS5leHBlY3RlZE91dHB1dEtleXMgfHwgW10pLnNsaWNlKCk7XG4gICAgdGhpcy5kYXRhRGVwZW5kZW5jaWVzID0gKF92YWx1ZS5kYXRhRGVwZW5kZW5jaWVzIHx8IFtdKS5zbGljZSgpO1xuICAgIFRhc2tSZXF1ZXN0SGVhZGVyLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZXhwZWN0ZWRPdXRwdXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwZWN0ZWRPdXRwdXRLZXlzO1xuICB9XG4gIHNldCBleHBlY3RlZE91dHB1dEtleXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhwZWN0ZWRPdXRwdXRLZXlzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGRhdGFEZXBlbmRlbmNpZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhRGVwZW5kZW5jaWVzO1xuICB9XG4gIHNldCBkYXRhRGVwZW5kZW5jaWVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2RhdGFEZXBlbmRlbmNpZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBUYXNrUmVxdWVzdEhlYWRlci5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBUYXNrUmVxdWVzdEhlYWRlci5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGVjdGVkT3V0cHV0S2V5czogKHRoaXMuZXhwZWN0ZWRPdXRwdXRLZXlzIHx8IFtdKS5zbGljZSgpLFxuICAgICAgZGF0YURlcGVuZGVuY2llczogKHRoaXMuZGF0YURlcGVuZGVuY2llcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFRhc2tSZXF1ZXN0SGVhZGVyLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXhwZWN0ZWRPdXRwdXRLZXlzOiAodGhpcy5leHBlY3RlZE91dHB1dEtleXMgfHwgW10pLnNsaWNlKCksXG4gICAgICBkYXRhRGVwZW5kZW5jaWVzOiAodGhpcy5kYXRhRGVwZW5kZW5jaWVzIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBUYXNrUmVxdWVzdEhlYWRlciB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVGFza1JlcXVlc3RIZWFkZXJcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGV4cGVjdGVkT3V0cHV0S2V5czogc3RyaW5nW107XG4gICAgZGF0YURlcGVuZGVuY2llczogc3RyaW5nW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgVGFza1JlcXVlc3RIZWFkZXJcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGV4cGVjdGVkT3V0cHV0S2V5czogc3RyaW5nW107XG4gICAgZGF0YURlcGVuZGVuY2llczogc3RyaW5nW107XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLkluaXRUYXNrUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgSW5pdFRhc2tSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5Jbml0VGFza1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBJbml0VGFza1JlcXVlc3QoKTtcbiAgICBJbml0VGFza1JlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBJbml0VGFza1JlcXVlc3QpIHt9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogSW5pdFRhc2tSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5oZWFkZXIgPSBuZXcgVGFza1JlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLmhlYWRlcixcbiAgICAgICAgICAgIFRhc2tSZXF1ZXN0SGVhZGVyLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubGFzdFRhc2sgPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBJbml0VGFza1JlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBJbml0VGFza1JlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuaGVhZGVyKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLmhlYWRlciBhcyBhbnksXG4gICAgICAgIFRhc2tSZXF1ZXN0SGVhZGVyLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmxhc3RUYXNrIHx8IF9pbnN0YW5jZS5sYXN0VGFzayA9PT0gZmFsc2UpIHtcbiAgICAgIF93cml0ZXIud3JpdGVCb29sKDIsIF9pbnN0YW5jZS5sYXN0VGFzayk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGVhZGVyPzogVGFza1JlcXVlc3RIZWFkZXI7XG4gIHByaXZhdGUgX2xhc3RUYXNrOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX3R5cGU6IEluaXRUYXNrUmVxdWVzdC5UeXBlQ2FzZSA9IEluaXRUYXNrUmVxdWVzdC5UeXBlQ2FzZS5ub25lO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgSW5pdFRhc2tSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPEluaXRUYXNrUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5oZWFkZXIgPSBfdmFsdWUuaGVhZGVyXG4gICAgICA/IG5ldyBUYXNrUmVxdWVzdEhlYWRlcihfdmFsdWUuaGVhZGVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5sYXN0VGFzayA9IF92YWx1ZS5sYXN0VGFzaztcbiAgICBJbml0VGFza1JlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBoZWFkZXIoKTogVGFza1JlcXVlc3RIZWFkZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXI7XG4gIH1cbiAgc2V0IGhlYWRlcih2YWx1ZTogVGFza1JlcXVlc3RIZWFkZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fbGFzdFRhc2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90eXBlID0gSW5pdFRhc2tSZXF1ZXN0LlR5cGVDYXNlLmhlYWRlcjtcbiAgICB9XG4gICAgdGhpcy5faGVhZGVyID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxhc3RUYXNrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sYXN0VGFzaztcbiAgfVxuICBzZXQgbGFzdFRhc2sodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5faGVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdHlwZSA9IEluaXRUYXNrUmVxdWVzdC5UeXBlQ2FzZS5sYXN0VGFzaztcbiAgICB9XG4gICAgdGhpcy5fbGFzdFRhc2sgPSB2YWx1ZTtcbiAgfVxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBJbml0VGFza1JlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogSW5pdFRhc2tSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlciA/IHRoaXMuaGVhZGVyLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBsYXN0VGFzazogdGhpcy5sYXN0VGFza1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEluaXRUYXNrUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcjogdGhpcy5oZWFkZXIgPyB0aGlzLmhlYWRlci50b1Byb3RvYnVmSlNPTihvcHRpb25zKSA6IG51bGwsXG4gICAgICBsYXN0VGFzazogdGhpcy5sYXN0VGFza1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgSW5pdFRhc2tSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBJbml0VGFza1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGhlYWRlcj86IFRhc2tSZXF1ZXN0SGVhZGVyLkFzT2JqZWN0O1xuICAgIGxhc3RUYXNrOiBib29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEluaXRUYXNrUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgaGVhZGVyOiBUYXNrUmVxdWVzdEhlYWRlci5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgbGFzdFRhc2s6IGJvb2xlYW47XG4gIH1cbiAgZXhwb3J0IGVudW0gVHlwZUNhc2Uge1xuICAgIG5vbmUgPSAwLFxuICAgIGhlYWRlciA9IDEsXG4gICAgbGFzdFRhc2sgPSAyXG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLlRhc2tJZFxuICovXG5leHBvcnQgY2xhc3MgVGFza0lkIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrSWQnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUYXNrSWQoKTtcbiAgICBUYXNrSWQuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBUYXNrSWQpIHtcbiAgICBfaW5zdGFuY2Uuc2Vzc2lvbiA9IF9pbnN0YW5jZS5zZXNzaW9uIHx8ICcnO1xuICAgIF9pbnN0YW5jZS50YXNrID0gX2luc3RhbmNlLnRhc2sgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoX2luc3RhbmNlOiBUYXNrSWQsIF9yZWFkZXI6IEJpbmFyeVJlYWRlcikge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLnNlc3Npb24gPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS50YXNrID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBUYXNrSWQucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoX2luc3RhbmNlOiBUYXNrSWQsIF93cml0ZXI6IEJpbmFyeVdyaXRlcikge1xuICAgIGlmIChfaW5zdGFuY2Uuc2Vzc2lvbikge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2Uuc2Vzc2lvbik7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudGFzaykge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UudGFzayk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2Vzc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF90YXNrOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBUYXNrSWQgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VGFza0lkLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb24gPSBfdmFsdWUuc2Vzc2lvbjtcbiAgICB0aGlzLnRhc2sgPSBfdmFsdWUudGFzaztcbiAgICBUYXNrSWQucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBzZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb247XG4gIH1cbiAgc2V0IHNlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb24gPSB2YWx1ZTtcbiAgfVxuICBnZXQgdGFzaygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YXNrO1xuICB9XG4gIHNldCB0YXNrKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YXNrID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgVGFza0lkLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFRhc2tJZC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIHRhc2s6IHRoaXMudGFza1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFRhc2tJZC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIHRhc2s6IHRoaXMudGFza1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgVGFza0lkIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBUYXNrSWRcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHNlc3Npb246IHN0cmluZztcbiAgICB0YXNrOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgVGFza0lkXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXNzaW9uOiBzdHJpbmc7XG4gICAgdGFzazogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrSWRMaXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBUYXNrSWRMaXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrSWRMaXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVGFza0lkTGlzdCgpO1xuICAgIFRhc2tJZExpc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBUYXNrSWRMaXN0KSB7XG4gICAgX2luc3RhbmNlLnRhc2tJZHMgPSBfaW5zdGFuY2UudGFza0lkcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFRhc2tJZExpc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgKF9pbnN0YW5jZS50YXNrSWRzID0gX2luc3RhbmNlLnRhc2tJZHMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBUYXNrSWRMaXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKF9pbnN0YW5jZTogVGFza0lkTGlzdCwgX3dyaXRlcjogQmluYXJ5V3JpdGVyKSB7XG4gICAgaWYgKF9pbnN0YW5jZS50YXNrSWRzICYmIF9pbnN0YW5jZS50YXNrSWRzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKDEsIF9pbnN0YW5jZS50YXNrSWRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90YXNrSWRzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFRhc2tJZExpc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VGFza0lkTGlzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy50YXNrSWRzID0gKF92YWx1ZS50YXNrSWRzIHx8IFtdKS5zbGljZSgpO1xuICAgIFRhc2tJZExpc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCB0YXNrSWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdGFza0lkcztcbiAgfVxuICBzZXQgdGFza0lkcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl90YXNrSWRzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgVGFza0lkTGlzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBUYXNrSWRMaXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFza0lkczogKHRoaXMudGFza0lkcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFRhc2tJZExpc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICB0YXNrSWRzOiAodGhpcy50YXNrSWRzIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBUYXNrSWRMaXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBUYXNrSWRMaXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICB0YXNrSWRzOiBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBUYXNrSWRMaXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICB0YXNrSWRzOiBzdHJpbmdbXTtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuU3RhdHVzQ291bnRcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXR1c0NvdW50IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5TdGF0dXNDb3VudCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFN0YXR1c0NvdW50KCk7XG4gICAgU3RhdHVzQ291bnQuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBTdGF0dXNDb3VudCkge1xuICAgIF9pbnN0YW5jZS5zdGF0dXMgPSBfaW5zdGFuY2Uuc3RhdHVzIHx8IDA7XG4gICAgX2luc3RhbmNlLmNvdW50ID0gX2luc3RhbmNlLmNvdW50IHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBTdGF0dXNDb3VudCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3RhdHVzID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLmNvdW50ID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFN0YXR1c0NvdW50LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogU3RhdHVzQ291bnQsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2Uuc3RhdHVzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlRW51bSgxLCBfaW5zdGFuY2Uuc3RhdHVzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5jb3VudCkge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDIsIF9pbnN0YW5jZS5jb3VudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDEuVGFza1N0YXR1cztcbiAgcHJpdmF0ZSBfY291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFN0YXR1c0NvdW50IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFN0YXR1c0NvdW50LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnN0YXR1cyA9IF92YWx1ZS5zdGF0dXM7XG4gICAgdGhpcy5jb3VudCA9IF92YWx1ZS5jb3VudDtcbiAgICBTdGF0dXNDb3VudC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHN0YXR1cygpOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDEuVGFza1N0YXR1cyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgfVxuICBzZXQgc3RhdHVzKHZhbHVlOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDEuVGFza1N0YXR1cykge1xuICAgIHRoaXMuX3N0YXR1cyA9IHZhbHVlO1xuICB9XG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jb3VudDtcbiAgfVxuICBzZXQgY291bnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2NvdW50ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgU3RhdHVzQ291bnQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogU3RhdHVzQ291bnQuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgY291bnQ6IHRoaXMuY291bnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBTdGF0dXNDb3VudC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czpcbiAgICAgICAgYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAxLlRhc2tTdGF0dXNbXG4gICAgICAgICAgdGhpcy5zdGF0dXMgPT09IG51bGwgfHwgdGhpcy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLnN0YXR1c1xuICAgICAgICBdLFxuICAgICAgY291bnQ6IHRoaXMuY291bnRcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFN0YXR1c0NvdW50IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBTdGF0dXNDb3VudFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgc3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDEuVGFza1N0YXR1cztcbiAgICBjb3VudDogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFN0YXR1c0NvdW50XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBjb3VudDogbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5Db3VudFxuICovXG5leHBvcnQgY2xhc3MgQ291bnQgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLkNvdW50JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ291bnQoKTtcbiAgICBDb3VudC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoaW5zdGFuY2UsIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENvdW50KSB7XG4gICAgX2luc3RhbmNlLnZhbHVlcyA9IF9pbnN0YW5jZS52YWx1ZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoX2luc3RhbmNlOiBDb3VudCwgX3JlYWRlcjogQmluYXJ5UmVhZGVyKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIxID0gbmV3IFN0YXR1c0NvdW50KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjEsXG4gICAgICAgICAgICBTdGF0dXNDb3VudC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UudmFsdWVzID0gX2luc3RhbmNlLnZhbHVlcyB8fCBbXSkucHVzaChtZXNzYWdlSW5pdGlhbGl6ZXIxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIENvdW50LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKF9pbnN0YW5jZTogQ291bnQsIF93cml0ZXI6IEJpbmFyeVdyaXRlcikge1xuICAgIGlmIChfaW5zdGFuY2UudmFsdWVzICYmIF9pbnN0YW5jZS52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAxLFxuICAgICAgICBfaW5zdGFuY2UudmFsdWVzIGFzIGFueSxcbiAgICAgICAgU3RhdHVzQ291bnQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdmFsdWVzPzogU3RhdHVzQ291bnRbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENvdW50IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPENvdW50LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnZhbHVlcyA9IChfdmFsdWUudmFsdWVzIHx8IFtdKS5tYXAobSA9PiBuZXcgU3RhdHVzQ291bnQobSkpO1xuICAgIENvdW50LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgdmFsdWVzKCk6IFN0YXR1c0NvdW50W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cbiAgc2V0IHZhbHVlcyh2YWx1ZTogU3RhdHVzQ291bnRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENvdW50LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENvdW50LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWVzOiAodGhpcy52YWx1ZXMgfHwgW10pLm1hcChtID0+IG0udG9PYmplY3QoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBDb3VudC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlczogKHRoaXMudmFsdWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ291bnQge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENvdW50XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICB2YWx1ZXM/OiBTdGF0dXNDb3VudC5Bc09iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENvdW50XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICB2YWx1ZXM6IFN0YXR1c0NvdW50LkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5SZXN1bHRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5SZXN1bHRSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUmVzdWx0UmVxdWVzdCgpO1xuICAgIFJlc3VsdFJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBSZXN1bHRSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnNlc3Npb24gPSBfaW5zdGFuY2Uuc2Vzc2lvbiB8fCAnJztcbiAgICBfaW5zdGFuY2UucmVzdWx0SWQgPSBfaW5zdGFuY2UucmVzdWx0SWQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBSZXN1bHRSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5zZXNzaW9uID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0SWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFJlc3VsdFJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBSZXN1bHRSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnNlc3Npb24pIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnNlc3Npb24pO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlc3VsdElkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5yZXN1bHRJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2Vzc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF9yZXN1bHRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgUmVzdWx0UmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxSZXN1bHRSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb24gPSBfdmFsdWUuc2Vzc2lvbjtcbiAgICB0aGlzLnJlc3VsdElkID0gX3ZhbHVlLnJlc3VsdElkO1xuICAgIFJlc3VsdFJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBzZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb247XG4gIH1cbiAgc2V0IHNlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb24gPSB2YWx1ZTtcbiAgfVxuICBnZXQgcmVzdWx0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzdWx0SWQ7XG4gIH1cbiAgc2V0IHJlc3VsdElkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZXN1bHRJZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFJlc3VsdFJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogUmVzdWx0UmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogUmVzdWx0UmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBSZXN1bHRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBSZXN1bHRSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBzZXNzaW9uOiBzdHJpbmc7XG4gICAgcmVzdWx0SWQ6IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBSZXN1bHRSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXNzaW9uOiBzdHJpbmc7XG4gICAgcmVzdWx0SWQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuVGFza091dHB1dFJlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tPdXRwdXRSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrT3V0cHV0UmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRhc2tPdXRwdXRSZXF1ZXN0KCk7XG4gICAgVGFza091dHB1dFJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBUYXNrT3V0cHV0UmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5zZXNzaW9uID0gX2luc3RhbmNlLnNlc3Npb24gfHwgJyc7XG4gICAgX2luc3RhbmNlLnRhc2tJZCA9IF9pbnN0YW5jZS50YXNrSWQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBUYXNrT3V0cHV0UmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc2Vzc2lvbiA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLnRhc2tJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgVGFza091dHB1dFJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBUYXNrT3V0cHV0UmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5zZXNzaW9uKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5zZXNzaW9uKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50YXNrSWQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLnRhc2tJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2Vzc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF90YXNrSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFRhc2tPdXRwdXRSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFRhc2tPdXRwdXRSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb24gPSBfdmFsdWUuc2Vzc2lvbjtcbiAgICB0aGlzLnRhc2tJZCA9IF92YWx1ZS50YXNrSWQ7XG4gICAgVGFza091dHB1dFJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBzZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb247XG4gIH1cbiAgc2V0IHNlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb24gPSB2YWx1ZTtcbiAgfVxuICBnZXQgdGFza0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tJZDtcbiAgfVxuICBzZXQgdGFza0lkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YXNrSWQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBUYXNrT3V0cHV0UmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBUYXNrT3V0cHV0UmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIHRhc2tJZDogdGhpcy50YXNrSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBUYXNrT3V0cHV0UmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIHRhc2tJZDogdGhpcy50YXNrSWRcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFRhc2tPdXRwdXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBUYXNrT3V0cHV0UmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgc2Vzc2lvbjogc3RyaW5nO1xuICAgIHRhc2tJZDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFRhc2tPdXRwdXRSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXNzaW9uOiBzdHJpbmc7XG4gICAgdGFza0lkOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLkVycm9yXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvciBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEuRXJyb3InO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBFcnJvcigpO1xuICAgIEVycm9yLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRXJyb3IpIHtcbiAgICBfaW5zdGFuY2UudGFza1N0YXR1cyA9IF9pbnN0YW5jZS50YXNrU3RhdHVzIHx8IDA7XG4gICAgX2luc3RhbmNlLmRldGFpbCA9IF9pbnN0YW5jZS5kZXRhaWwgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoX2luc3RhbmNlOiBFcnJvciwgX3JlYWRlcjogQmluYXJ5UmVhZGVyKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UudGFza1N0YXR1cyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5kZXRhaWwgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEVycm9yLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKF9pbnN0YW5jZTogRXJyb3IsIF93cml0ZXI6IEJpbmFyeVdyaXRlcikge1xuICAgIGlmIChfaW5zdGFuY2UudGFza1N0YXR1cykge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oMSwgX2luc3RhbmNlLnRhc2tTdGF0dXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmRldGFpbCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UuZGV0YWlsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90YXNrU3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDEuVGFza1N0YXR1cztcbiAgcHJpdmF0ZSBfZGV0YWlsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBFcnJvciB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxFcnJvci5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy50YXNrU3RhdHVzID0gX3ZhbHVlLnRhc2tTdGF0dXM7XG4gICAgdGhpcy5kZXRhaWwgPSBfdmFsdWUuZGV0YWlsO1xuICAgIEVycm9yLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgdGFza1N0YXR1cygpOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDEuVGFza1N0YXR1cyB7XG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tTdGF0dXM7XG4gIH1cbiAgc2V0IHRhc2tTdGF0dXModmFsdWU6IGFybW9uaWtBcGlHcnBjVjFUYXNrX3N0YXR1czAwMS5UYXNrU3RhdHVzKSB7XG4gICAgdGhpcy5fdGFza1N0YXR1cyA9IHZhbHVlO1xuICB9XG4gIGdldCBkZXRhaWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGV0YWlsO1xuICB9XG4gIHNldCBkZXRhaWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RldGFpbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIEVycm9yLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEVycm9yLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFza1N0YXR1czogdGhpcy50YXNrU3RhdHVzLFxuICAgICAgZGV0YWlsOiB0aGlzLmRldGFpbFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEVycm9yLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFza1N0YXR1czpcbiAgICAgICAgYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAxLlRhc2tTdGF0dXNbXG4gICAgICAgICAgdGhpcy50YXNrU3RhdHVzID09PSBudWxsIHx8IHRoaXMudGFza1N0YXR1cyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy50YXNrU3RhdHVzXG4gICAgICAgIF0sXG4gICAgICBkZXRhaWw6IHRoaXMuZGV0YWlsXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBFcnJvciB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgRXJyb3JcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHRhc2tTdGF0dXM6IGFybW9uaWtBcGlHcnBjVjFUYXNrX3N0YXR1czAwMS5UYXNrU3RhdHVzO1xuICAgIGRldGFpbDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVycm9yXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICB0YXNrU3RhdHVzOiBzdHJpbmc7XG4gICAgZGV0YWlsOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLlRhc2tFcnJvclxuICovXG5leHBvcnQgY2xhc3MgVGFza0Vycm9yIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrRXJyb3InO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUYXNrRXJyb3IoKTtcbiAgICBUYXNrRXJyb3IuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBUYXNrRXJyb3IpIHtcbiAgICBfaW5zdGFuY2UudGFza0lkID0gX2luc3RhbmNlLnRhc2tJZCB8fCAnJztcbiAgICBfaW5zdGFuY2UuZXJyb3JzID0gX2luc3RhbmNlLmVycm9ycyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFRhc2tFcnJvcixcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UudGFza0lkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIyID0gbmV3IEVycm9yKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjIsXG4gICAgICAgICAgICBFcnJvci5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UuZXJyb3JzID0gX2luc3RhbmNlLmVycm9ycyB8fCBbXSkucHVzaChtZXNzYWdlSW5pdGlhbGl6ZXIyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFRhc2tFcnJvci5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihfaW5zdGFuY2U6IFRhc2tFcnJvciwgX3dyaXRlcjogQmluYXJ5V3JpdGVyKSB7XG4gICAgaWYgKF9pbnN0YW5jZS50YXNrSWQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnRhc2tJZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZXJyb3JzICYmIF9pbnN0YW5jZS5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAyLFxuICAgICAgICBfaW5zdGFuY2UuZXJyb3JzIGFzIGFueSxcbiAgICAgICAgRXJyb3Iuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGFza0lkOiBzdHJpbmc7XG4gIHByaXZhdGUgX2Vycm9ycz86IEVycm9yW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBUYXNrRXJyb3IgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VGFza0Vycm9yLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnRhc2tJZCA9IF92YWx1ZS50YXNrSWQ7XG4gICAgdGhpcy5lcnJvcnMgPSAoX3ZhbHVlLmVycm9ycyB8fCBbXSkubWFwKG0gPT4gbmV3IEVycm9yKG0pKTtcbiAgICBUYXNrRXJyb3IucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCB0YXNrSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFza0lkO1xuICB9XG4gIHNldCB0YXNrSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Rhc2tJZCA9IHZhbHVlO1xuICB9XG4gIGdldCBlcnJvcnMoKTogRXJyb3JbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9ycztcbiAgfVxuICBzZXQgZXJyb3JzKHZhbHVlOiBFcnJvcltdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZXJyb3JzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgVGFza0Vycm9yLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFRhc2tFcnJvci5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhc2tJZDogdGhpcy50YXNrSWQsXG4gICAgICBlcnJvcnM6ICh0aGlzLmVycm9ycyB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFRhc2tFcnJvci5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhc2tJZDogdGhpcy50YXNrSWQsXG4gICAgICBlcnJvcnM6ICh0aGlzLmVycm9ycyB8fCBbXSkubWFwKG0gPT4gbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKSlcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFRhc2tFcnJvciB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVGFza0Vycm9yXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICB0YXNrSWQ6IHN0cmluZztcbiAgICBlcnJvcnM/OiBFcnJvci5Bc09iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFRhc2tFcnJvclxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgdGFza0lkOiBzdHJpbmc7XG4gICAgZXJyb3JzOiBFcnJvci5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuVGFza0xpc3RcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tMaXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5UYXNrTGlzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRhc2tMaXN0KCk7XG4gICAgVGFza0xpc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBUYXNrTGlzdCkge1xuICAgIF9pbnN0YW5jZS50YXNrSWRzID0gX2luc3RhbmNlLnRhc2tJZHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBUYXNrTGlzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIxID0gbmV3IFRhc2tJZCgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxLFxuICAgICAgICAgICAgVGFza0lkLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS50YXNrSWRzID0gX2luc3RhbmNlLnRhc2tJZHMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFRhc2tMaXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKF9pbnN0YW5jZTogVGFza0xpc3QsIF93cml0ZXI6IEJpbmFyeVdyaXRlcikge1xuICAgIGlmIChfaW5zdGFuY2UudGFza0lkcyAmJiBfaW5zdGFuY2UudGFza0lkcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS50YXNrSWRzIGFzIGFueSxcbiAgICAgICAgVGFza0lkLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Rhc2tJZHM/OiBUYXNrSWRbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFRhc2tMaXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFRhc2tMaXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnRhc2tJZHMgPSAoX3ZhbHVlLnRhc2tJZHMgfHwgW10pLm1hcChtID0+IG5ldyBUYXNrSWQobSkpO1xuICAgIFRhc2tMaXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgdGFza0lkcygpOiBUYXNrSWRbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tJZHM7XG4gIH1cbiAgc2V0IHRhc2tJZHModmFsdWU6IFRhc2tJZFtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdGFza0lkcyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFRhc2tMaXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFRhc2tMaXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFza0lkczogKHRoaXMudGFza0lkcyB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFRhc2tMaXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFza0lkczogKHRoaXMudGFza0lkcyB8fCBbXSkubWFwKG0gPT4gbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKSlcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFRhc2tMaXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBUYXNrTGlzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgdGFza0lkcz86IFRhc2tJZC5Bc09iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFRhc2tMaXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICB0YXNrSWRzOiBUYXNrSWQuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLlRhc2tJZFdpdGhTdGF0dXNcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tJZFdpdGhTdGF0dXMgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLlRhc2tJZFdpdGhTdGF0dXMnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUYXNrSWRXaXRoU3RhdHVzKCk7XG4gICAgVGFza0lkV2l0aFN0YXR1cy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFRhc2tJZFdpdGhTdGF0dXMpIHtcbiAgICBfaW5zdGFuY2UudGFza0lkID0gX2luc3RhbmNlLnRhc2tJZCB8fCB1bmRlZmluZWQ7XG4gICAgX2luc3RhbmNlLnN0YXR1cyA9IF9pbnN0YW5jZS5zdGF0dXMgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFRhc2tJZFdpdGhTdGF0dXMsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLnRhc2tJZCA9IG5ldyBUYXNrSWQoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnRhc2tJZCxcbiAgICAgICAgICAgIFRhc2tJZC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLnN0YXR1cyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFRhc2tJZFdpdGhTdGF0dXMucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBUYXNrSWRXaXRoU3RhdHVzLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnRhc2tJZCkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS50YXNrSWQgYXMgYW55LFxuICAgICAgICBUYXNrSWQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3RhdHVzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlRW51bSgyLCBfaW5zdGFuY2Uuc3RhdHVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90YXNrSWQ/OiBUYXNrSWQ7XG4gIHByaXZhdGUgX3N0YXR1czogYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAxLlRhc2tTdGF0dXM7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBUYXNrSWRXaXRoU3RhdHVzIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFRhc2tJZFdpdGhTdGF0dXMuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMudGFza0lkID0gX3ZhbHVlLnRhc2tJZCA/IG5ldyBUYXNrSWQoX3ZhbHVlLnRhc2tJZCkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdGF0dXMgPSBfdmFsdWUuc3RhdHVzO1xuICAgIFRhc2tJZFdpdGhTdGF0dXMucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCB0YXNrSWQoKTogVGFza0lkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGFza0lkO1xuICB9XG4gIHNldCB0YXNrSWQodmFsdWU6IFRhc2tJZCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Rhc2tJZCA9IHZhbHVlO1xuICB9XG4gIGdldCBzdGF0dXMoKTogYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAxLlRhc2tTdGF0dXMge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cbiAgc2V0IHN0YXR1cyh2YWx1ZTogYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAxLlRhc2tTdGF0dXMpIHtcbiAgICB0aGlzLl9zdGF0dXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBUYXNrSWRXaXRoU3RhdHVzLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFRhc2tJZFdpdGhTdGF0dXMuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICB0YXNrSWQ6IHRoaXMudGFza0lkID8gdGhpcy50YXNrSWQudG9PYmplY3QoKSA6IHVuZGVmaW5lZCxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBUYXNrSWRXaXRoU3RhdHVzLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFza0lkOiB0aGlzLnRhc2tJZCA/IHRoaXMudGFza0lkLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpIDogbnVsbCxcbiAgICAgIHN0YXR1czpcbiAgICAgICAgYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAxLlRhc2tTdGF0dXNbXG4gICAgICAgICAgdGhpcy5zdGF0dXMgPT09IG51bGwgfHwgdGhpcy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLnN0YXR1c1xuICAgICAgICBdXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBUYXNrSWRXaXRoU3RhdHVzIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBUYXNrSWRXaXRoU3RhdHVzXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICB0YXNrSWQ/OiBUYXNrSWQuQXNPYmplY3Q7XG4gICAgc3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDEuVGFza1N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBUYXNrSWRXaXRoU3RhdHVzXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICB0YXNrSWQ6IFRhc2tJZC5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gIH1cbn1cbiJdfQ==