@aneoconsultingfr/armonik.api.angular 3.29.0-edge.13.eb211e2 → 3.29.0-edge.68.23f0ea8b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/aneoconsultingfr-armonik.api.angular.mjs +29 -29
- package/fesm2022/aneoconsultingfr-armonik.api.angular.mjs.map +1 -1
- package/index.d.ts +11699 -3
- package/package.json +6 -8
- package/esm2022/aneoconsultingfr-armonik.api.angular.mjs +0 -5
- package/esm2022/lib/generated/applications-common.pb.mjs +0 -586
- package/esm2022/lib/generated/applications-fields.pb.mjs +0 -231
- package/esm2022/lib/generated/applications-filters.pb.mjs +0 -349
- package/esm2022/lib/generated/applications-service.pb.mjs +0 -2
- package/esm2022/lib/generated/applications-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/applications-service.pbsc.mjs +0 -74
- package/esm2022/lib/generated/auth-common.pb.mjs +0 -318
- package/esm2022/lib/generated/auth-service.pb.mjs +0 -2
- package/esm2022/lib/generated/auth-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/auth-service.pbsc.mjs +0 -74
- package/esm2022/lib/generated/events-common.pb.mjs +0 -1139
- package/esm2022/lib/generated/events-service.pb.mjs +0 -2
- package/esm2022/lib/generated/events-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/events-service.pbsc.mjs +0 -74
- package/esm2022/lib/generated/filters-common.pb.mjs +0 -774
- package/esm2022/lib/generated/health-checks-common.pb.mjs +0 -331
- package/esm2022/lib/generated/health-checks-service.pb.mjs +0 -2
- package/esm2022/lib/generated/health-checks-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/health-checks-service.pbsc.mjs +0 -74
- package/esm2022/lib/generated/objects.pb.mjs +0 -2721
- package/esm2022/lib/generated/partitions-common.pb.mjs +0 -978
- package/esm2022/lib/generated/partitions-fields.pb.mjs +0 -233
- package/esm2022/lib/generated/partitions-filters.pb.mjs +0 -431
- package/esm2022/lib/generated/partitions-service.pb.mjs +0 -2
- package/esm2022/lib/generated/partitions-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/partitions-service.pbsc.mjs +0 -104
- package/esm2022/lib/generated/result-status.pb.mjs +0 -16
- package/esm2022/lib/generated/results-common.pb.mjs +0 -3476
- package/esm2022/lib/generated/results-fields.pb.mjs +0 -238
- package/esm2022/lib/generated/results-filters.pb.mjs +0 -573
- package/esm2022/lib/generated/results-service.pb.mjs +0 -2
- package/esm2022/lib/generated/results-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/results-service.pbsc.mjs +0 -375
- package/esm2022/lib/generated/session-status.pb.mjs +0 -17
- package/esm2022/lib/generated/sessions-common.pb.mjs +0 -2638
- package/esm2022/lib/generated/sessions-fields.pb.mjs +0 -509
- package/esm2022/lib/generated/sessions-filters.pb.mjs +0 -629
- package/esm2022/lib/generated/sessions-service.pb.mjs +0 -2
- package/esm2022/lib/generated/sessions-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/sessions-service.pbsc.mjs +0 -344
- package/esm2022/lib/generated/sort-direction.pb.mjs +0 -13
- package/esm2022/lib/generated/task-status.pb.mjs +0 -24
- package/esm2022/lib/generated/tasks-common.pb.mjs +0 -3383
- package/esm2022/lib/generated/tasks-fields.pb.mjs +0 -518
- package/esm2022/lib/generated/tasks-filters.pb.mjs +0 -629
- package/esm2022/lib/generated/tasks-service.pb.mjs +0 -2
- package/esm2022/lib/generated/tasks-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/tasks-service.pbsc.mjs +0 -254
- package/esm2022/lib/generated/versions-common.pb.mjs +0 -200
- package/esm2022/lib/generated/versions-service.pb.mjs +0 -2
- package/esm2022/lib/generated/versions-service.pbconf.mjs +0 -13
- package/esm2022/lib/generated/versions-service.pbsc.mjs +0 -74
- package/esm2022/lib/index.mjs +0 -35
- package/esm2022/public-api.mjs +0 -5
- package/lib/generated/applications-common.pb.d.ts +0 -331
- package/lib/generated/applications-fields.pb.d.ts +0 -153
- package/lib/generated/applications-filters.pb.d.ts +0 -222
- package/lib/generated/applications-service.pb.d.ts +0 -1
- package/lib/generated/applications-service.pbconf.d.ts +0 -6
- package/lib/generated/applications-service.pbsc.d.ts +0 -38
- package/lib/generated/auth-common.pb.d.ts +0 -214
- package/lib/generated/auth-service.pb.d.ts +0 -1
- package/lib/generated/auth-service.pbconf.d.ts +0 -6
- package/lib/generated/auth-service.pbsc.d.ts +0 -38
- package/lib/generated/events-common.pb.d.ts +0 -612
- package/lib/generated/events-service.pb.d.ts +0 -1
- package/lib/generated/events-service.pbconf.d.ts +0 -6
- package/lib/generated/events-service.pbsc.d.ts +0 -38
- package/lib/generated/filters-common.pb.d.ts +0 -491
- package/lib/generated/health-checks-common.pb.d.ts +0 -220
- package/lib/generated/health-checks-service.pb.d.ts +0 -1
- package/lib/generated/health-checks-service.pbconf.d.ts +0 -6
- package/lib/generated/health-checks-service.pbsc.d.ts +0 -38
- package/lib/generated/objects.pb.d.ts +0 -1678
- package/lib/generated/partitions-common.pb.d.ts +0 -566
- package/lib/generated/partitions-fields.pb.d.ts +0 -155
- package/lib/generated/partitions-filters.pb.d.ts +0 -240
- package/lib/generated/partitions-service.pb.d.ts +0 -1
- package/lib/generated/partitions-service.pbconf.d.ts +0 -6
- package/lib/generated/partitions-service.pbsc.d.ts +0 -54
- package/lib/generated/result-status.pb.d.ts +0 -8
- package/lib/generated/results-common.pb.d.ts +0 -2121
- package/lib/generated/results-fields.pb.d.ts +0 -160
- package/lib/generated/results-filters.pb.d.ts +0 -321
- package/lib/generated/results-service.pb.d.ts +0 -1
- package/lib/generated/results-service.pbconf.d.ts +0 -6
- package/lib/generated/results-service.pbsc.d.ts +0 -199
- package/lib/generated/session-status.pb.d.ts +0 -9
- package/lib/generated/sessions-common.pb.d.ts +0 -1637
- package/lib/generated/sessions-fields.pb.d.ts +0 -323
- package/lib/generated/sessions-filters.pb.d.ts +0 -333
- package/lib/generated/sessions-service.pb.d.ts +0 -1
- package/lib/generated/sessions-service.pbconf.d.ts +0 -6
- package/lib/generated/sessions-service.pbsc.d.ts +0 -182
- package/lib/generated/sort-direction.pb.d.ts +0 -5
- package/lib/generated/task-status.pb.d.ts +0 -16
- package/lib/generated/tasks-common.pb.d.ts +0 -1754
- package/lib/generated/tasks-fields.pb.d.ts +0 -332
- package/lib/generated/tasks-filters.pb.d.ts +0 -333
- package/lib/generated/tasks-service.pb.d.ts +0 -1
- package/lib/generated/tasks-service.pbconf.d.ts +0 -6
- package/lib/generated/tasks-service.pbsc.d.ts +0 -134
- package/lib/generated/versions-common.pb.d.ts +0 -140
- package/lib/generated/versions-service.pb.d.ts +0 -1
- package/lib/generated/versions-service.pbconf.d.ts +0 -6
- package/lib/generated/versions-service.pbsc.d.ts +0 -38
- package/lib/index.d.ts +0 -34
- package/public-api.d.ts +0 -1
|
@@ -1,3476 +0,0 @@
|
|
|
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 armonikApiGrpcV1Result_status001 from './result-status.pb';
|
|
10
|
-
import * as armonikApiGrpcV1Results002 from './results-fields.pb';
|
|
11
|
-
import * as googleProtobuf003 from '@ngx-grpc/well-known-types';
|
|
12
|
-
import * as armonikApiGrpcV1Results004 from './results-filters.pb';
|
|
13
|
-
import * as armonikApiGrpcV1Sort_direction005 from './sort-direction.pb';
|
|
14
|
-
/**
|
|
15
|
-
* Message implementation for armonik.api.grpc.v1.results.ResultRaw
|
|
16
|
-
*/
|
|
17
|
-
export class ResultRaw {
|
|
18
|
-
static { this.id = 'armonik.api.grpc.v1.results.ResultRaw'; }
|
|
19
|
-
/**
|
|
20
|
-
* Deserialize binary data to message
|
|
21
|
-
* @param instance message instance
|
|
22
|
-
*/
|
|
23
|
-
static deserializeBinary(bytes) {
|
|
24
|
-
const instance = new ResultRaw();
|
|
25
|
-
ResultRaw.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
26
|
-
return instance;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Check all the properties and set default protobuf values if necessary
|
|
30
|
-
* @param _instance message instance
|
|
31
|
-
*/
|
|
32
|
-
static refineValues(_instance) {
|
|
33
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
34
|
-
_instance.name = _instance.name || '';
|
|
35
|
-
_instance.ownerTaskId = _instance.ownerTaskId || '';
|
|
36
|
-
_instance.status = _instance.status || 0;
|
|
37
|
-
_instance.createdAt = _instance.createdAt || undefined;
|
|
38
|
-
_instance.completedAt = _instance.completedAt || undefined;
|
|
39
|
-
_instance.resultId = _instance.resultId || '';
|
|
40
|
-
_instance.size = _instance.size || '0';
|
|
41
|
-
_instance.createdBy = _instance.createdBy || '';
|
|
42
|
-
_instance.opaqueId = _instance.opaqueId || new Uint8Array();
|
|
43
|
-
_instance.manualDeletion = _instance.manualDeletion || false;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
47
|
-
* @param _instance message instance
|
|
48
|
-
* @param _reader binary reader instance
|
|
49
|
-
*/
|
|
50
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
51
|
-
while (_reader.nextField()) {
|
|
52
|
-
if (_reader.isEndGroup())
|
|
53
|
-
break;
|
|
54
|
-
switch (_reader.getFieldNumber()) {
|
|
55
|
-
case 1:
|
|
56
|
-
_instance.sessionId = _reader.readString();
|
|
57
|
-
break;
|
|
58
|
-
case 2:
|
|
59
|
-
_instance.name = _reader.readString();
|
|
60
|
-
break;
|
|
61
|
-
case 3:
|
|
62
|
-
_instance.ownerTaskId = _reader.readString();
|
|
63
|
-
break;
|
|
64
|
-
case 4:
|
|
65
|
-
_instance.status = _reader.readEnum();
|
|
66
|
-
break;
|
|
67
|
-
case 5:
|
|
68
|
-
_instance.createdAt = new googleProtobuf003.Timestamp();
|
|
69
|
-
_reader.readMessage(_instance.createdAt, googleProtobuf003.Timestamp.deserializeBinaryFromReader);
|
|
70
|
-
break;
|
|
71
|
-
case 6:
|
|
72
|
-
_instance.completedAt = new googleProtobuf003.Timestamp();
|
|
73
|
-
_reader.readMessage(_instance.completedAt, googleProtobuf003.Timestamp.deserializeBinaryFromReader);
|
|
74
|
-
break;
|
|
75
|
-
case 8:
|
|
76
|
-
_instance.resultId = _reader.readString();
|
|
77
|
-
break;
|
|
78
|
-
case 9:
|
|
79
|
-
_instance.size = _reader.readInt64String();
|
|
80
|
-
break;
|
|
81
|
-
case 10:
|
|
82
|
-
_instance.createdBy = _reader.readString();
|
|
83
|
-
break;
|
|
84
|
-
case 11:
|
|
85
|
-
_instance.opaqueId = _reader.readBytes();
|
|
86
|
-
break;
|
|
87
|
-
case 12:
|
|
88
|
-
_instance.manualDeletion = _reader.readBool();
|
|
89
|
-
break;
|
|
90
|
-
default:
|
|
91
|
-
_reader.skipField();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
ResultRaw.refineValues(_instance);
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Serializes a message to binary format using provided binary reader
|
|
98
|
-
* @param _instance message instance
|
|
99
|
-
* @param _writer binary writer instance
|
|
100
|
-
*/
|
|
101
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
102
|
-
if (_instance.sessionId) {
|
|
103
|
-
_writer.writeString(1, _instance.sessionId);
|
|
104
|
-
}
|
|
105
|
-
if (_instance.name) {
|
|
106
|
-
_writer.writeString(2, _instance.name);
|
|
107
|
-
}
|
|
108
|
-
if (_instance.ownerTaskId) {
|
|
109
|
-
_writer.writeString(3, _instance.ownerTaskId);
|
|
110
|
-
}
|
|
111
|
-
if (_instance.status) {
|
|
112
|
-
_writer.writeEnum(4, _instance.status);
|
|
113
|
-
}
|
|
114
|
-
if (_instance.createdAt) {
|
|
115
|
-
_writer.writeMessage(5, _instance.createdAt, googleProtobuf003.Timestamp.serializeBinaryToWriter);
|
|
116
|
-
}
|
|
117
|
-
if (_instance.completedAt) {
|
|
118
|
-
_writer.writeMessage(6, _instance.completedAt, googleProtobuf003.Timestamp.serializeBinaryToWriter);
|
|
119
|
-
}
|
|
120
|
-
if (_instance.resultId) {
|
|
121
|
-
_writer.writeString(8, _instance.resultId);
|
|
122
|
-
}
|
|
123
|
-
if (_instance.size) {
|
|
124
|
-
_writer.writeInt64String(9, _instance.size);
|
|
125
|
-
}
|
|
126
|
-
if (_instance.createdBy) {
|
|
127
|
-
_writer.writeString(10, _instance.createdBy);
|
|
128
|
-
}
|
|
129
|
-
if (_instance.opaqueId && _instance.opaqueId.length) {
|
|
130
|
-
_writer.writeBytes(11, _instance.opaqueId);
|
|
131
|
-
}
|
|
132
|
-
if (_instance.manualDeletion) {
|
|
133
|
-
_writer.writeBool(12, _instance.manualDeletion);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
138
|
-
* @param _value initial values object or instance of ResultRaw to deeply clone from
|
|
139
|
-
*/
|
|
140
|
-
constructor(_value) {
|
|
141
|
-
_value = _value || {};
|
|
142
|
-
this.sessionId = _value.sessionId;
|
|
143
|
-
this.name = _value.name;
|
|
144
|
-
this.ownerTaskId = _value.ownerTaskId;
|
|
145
|
-
this.status = _value.status;
|
|
146
|
-
this.createdAt = _value.createdAt
|
|
147
|
-
? new googleProtobuf003.Timestamp(_value.createdAt)
|
|
148
|
-
: undefined;
|
|
149
|
-
this.completedAt = _value.completedAt
|
|
150
|
-
? new googleProtobuf003.Timestamp(_value.completedAt)
|
|
151
|
-
: undefined;
|
|
152
|
-
this.resultId = _value.resultId;
|
|
153
|
-
this.size = _value.size;
|
|
154
|
-
this.createdBy = _value.createdBy;
|
|
155
|
-
this.opaqueId = _value.opaqueId;
|
|
156
|
-
this.manualDeletion = _value.manualDeletion;
|
|
157
|
-
ResultRaw.refineValues(this);
|
|
158
|
-
}
|
|
159
|
-
get sessionId() {
|
|
160
|
-
return this._sessionId;
|
|
161
|
-
}
|
|
162
|
-
set sessionId(value) {
|
|
163
|
-
this._sessionId = value;
|
|
164
|
-
}
|
|
165
|
-
get name() {
|
|
166
|
-
return this._name;
|
|
167
|
-
}
|
|
168
|
-
set name(value) {
|
|
169
|
-
this._name = value;
|
|
170
|
-
}
|
|
171
|
-
get ownerTaskId() {
|
|
172
|
-
return this._ownerTaskId;
|
|
173
|
-
}
|
|
174
|
-
set ownerTaskId(value) {
|
|
175
|
-
this._ownerTaskId = value;
|
|
176
|
-
}
|
|
177
|
-
get status() {
|
|
178
|
-
return this._status;
|
|
179
|
-
}
|
|
180
|
-
set status(value) {
|
|
181
|
-
this._status = value;
|
|
182
|
-
}
|
|
183
|
-
get createdAt() {
|
|
184
|
-
return this._createdAt;
|
|
185
|
-
}
|
|
186
|
-
set createdAt(value) {
|
|
187
|
-
this._createdAt = value;
|
|
188
|
-
}
|
|
189
|
-
get completedAt() {
|
|
190
|
-
return this._completedAt;
|
|
191
|
-
}
|
|
192
|
-
set completedAt(value) {
|
|
193
|
-
this._completedAt = value;
|
|
194
|
-
}
|
|
195
|
-
get resultId() {
|
|
196
|
-
return this._resultId;
|
|
197
|
-
}
|
|
198
|
-
set resultId(value) {
|
|
199
|
-
this._resultId = value;
|
|
200
|
-
}
|
|
201
|
-
get size() {
|
|
202
|
-
return this._size;
|
|
203
|
-
}
|
|
204
|
-
set size(value) {
|
|
205
|
-
this._size = value;
|
|
206
|
-
}
|
|
207
|
-
get createdBy() {
|
|
208
|
-
return this._createdBy;
|
|
209
|
-
}
|
|
210
|
-
set createdBy(value) {
|
|
211
|
-
this._createdBy = value;
|
|
212
|
-
}
|
|
213
|
-
get opaqueId() {
|
|
214
|
-
return this._opaqueId;
|
|
215
|
-
}
|
|
216
|
-
set opaqueId(value) {
|
|
217
|
-
this._opaqueId = value;
|
|
218
|
-
}
|
|
219
|
-
get manualDeletion() {
|
|
220
|
-
return this._manualDeletion;
|
|
221
|
-
}
|
|
222
|
-
set manualDeletion(value) {
|
|
223
|
-
this._manualDeletion = value;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Serialize message to binary data
|
|
227
|
-
* @param instance message instance
|
|
228
|
-
*/
|
|
229
|
-
serializeBinary() {
|
|
230
|
-
const writer = new BinaryWriter();
|
|
231
|
-
ResultRaw.serializeBinaryToWriter(this, writer);
|
|
232
|
-
return writer.getResultBuffer();
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
236
|
-
*/
|
|
237
|
-
toObject() {
|
|
238
|
-
return {
|
|
239
|
-
sessionId: this.sessionId,
|
|
240
|
-
name: this.name,
|
|
241
|
-
ownerTaskId: this.ownerTaskId,
|
|
242
|
-
status: this.status,
|
|
243
|
-
createdAt: this.createdAt ? this.createdAt.toObject() : undefined,
|
|
244
|
-
completedAt: this.completedAt ? this.completedAt.toObject() : undefined,
|
|
245
|
-
resultId: this.resultId,
|
|
246
|
-
size: this.size,
|
|
247
|
-
createdBy: this.createdBy,
|
|
248
|
-
opaqueId: this.opaqueId ? this.opaqueId.subarray(0) : new Uint8Array(),
|
|
249
|
-
manualDeletion: this.manualDeletion
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
254
|
-
*/
|
|
255
|
-
toJSON() {
|
|
256
|
-
return this.toObject();
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
260
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
261
|
-
* 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
|
|
262
|
-
*/
|
|
263
|
-
toProtobufJSON(
|
|
264
|
-
// @ts-ignore
|
|
265
|
-
options) {
|
|
266
|
-
return {
|
|
267
|
-
sessionId: this.sessionId,
|
|
268
|
-
name: this.name,
|
|
269
|
-
ownerTaskId: this.ownerTaskId,
|
|
270
|
-
status: armonikApiGrpcV1Result_status001.ResultStatus[this.status === null || this.status === undefined ? 0 : this.status],
|
|
271
|
-
createdAt: this.createdAt ? this.createdAt.toProtobufJSON(options) : null,
|
|
272
|
-
completedAt: this.completedAt
|
|
273
|
-
? this.completedAt.toProtobufJSON(options)
|
|
274
|
-
: null,
|
|
275
|
-
resultId: this.resultId,
|
|
276
|
-
size: this.size,
|
|
277
|
-
createdBy: this.createdBy,
|
|
278
|
-
opaqueId: this.opaqueId ? uint8ArrayToBase64(this.opaqueId) : '',
|
|
279
|
-
manualDeletion: this.manualDeletion
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Message implementation for armonik.api.grpc.v1.results.ListResultsRequest
|
|
285
|
-
*/
|
|
286
|
-
export class ListResultsRequest {
|
|
287
|
-
static { this.id = 'armonik.api.grpc.v1.results.ListResultsRequest'; }
|
|
288
|
-
/**
|
|
289
|
-
* Deserialize binary data to message
|
|
290
|
-
* @param instance message instance
|
|
291
|
-
*/
|
|
292
|
-
static deserializeBinary(bytes) {
|
|
293
|
-
const instance = new ListResultsRequest();
|
|
294
|
-
ListResultsRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
295
|
-
return instance;
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Check all the properties and set default protobuf values if necessary
|
|
299
|
-
* @param _instance message instance
|
|
300
|
-
*/
|
|
301
|
-
static refineValues(_instance) {
|
|
302
|
-
_instance.page = _instance.page || 0;
|
|
303
|
-
_instance.pageSize = _instance.pageSize || 0;
|
|
304
|
-
_instance.filters = _instance.filters || undefined;
|
|
305
|
-
_instance.sort = _instance.sort || undefined;
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
309
|
-
* @param _instance message instance
|
|
310
|
-
* @param _reader binary reader instance
|
|
311
|
-
*/
|
|
312
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
313
|
-
while (_reader.nextField()) {
|
|
314
|
-
if (_reader.isEndGroup())
|
|
315
|
-
break;
|
|
316
|
-
switch (_reader.getFieldNumber()) {
|
|
317
|
-
case 1:
|
|
318
|
-
_instance.page = _reader.readInt32();
|
|
319
|
-
break;
|
|
320
|
-
case 2:
|
|
321
|
-
_instance.pageSize = _reader.readInt32();
|
|
322
|
-
break;
|
|
323
|
-
case 3:
|
|
324
|
-
_instance.filters = new armonikApiGrpcV1Results004.Filters();
|
|
325
|
-
_reader.readMessage(_instance.filters, armonikApiGrpcV1Results004.Filters.deserializeBinaryFromReader);
|
|
326
|
-
break;
|
|
327
|
-
case 4:
|
|
328
|
-
_instance.sort = new ListResultsRequest.Sort();
|
|
329
|
-
_reader.readMessage(_instance.sort, ListResultsRequest.Sort.deserializeBinaryFromReader);
|
|
330
|
-
break;
|
|
331
|
-
default:
|
|
332
|
-
_reader.skipField();
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
ListResultsRequest.refineValues(_instance);
|
|
336
|
-
}
|
|
337
|
-
/**
|
|
338
|
-
* Serializes a message to binary format using provided binary reader
|
|
339
|
-
* @param _instance message instance
|
|
340
|
-
* @param _writer binary writer instance
|
|
341
|
-
*/
|
|
342
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
343
|
-
if (_instance.page) {
|
|
344
|
-
_writer.writeInt32(1, _instance.page);
|
|
345
|
-
}
|
|
346
|
-
if (_instance.pageSize) {
|
|
347
|
-
_writer.writeInt32(2, _instance.pageSize);
|
|
348
|
-
}
|
|
349
|
-
if (_instance.filters) {
|
|
350
|
-
_writer.writeMessage(3, _instance.filters, armonikApiGrpcV1Results004.Filters.serializeBinaryToWriter);
|
|
351
|
-
}
|
|
352
|
-
if (_instance.sort) {
|
|
353
|
-
_writer.writeMessage(4, _instance.sort, ListResultsRequest.Sort.serializeBinaryToWriter);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
358
|
-
* @param _value initial values object or instance of ListResultsRequest to deeply clone from
|
|
359
|
-
*/
|
|
360
|
-
constructor(_value) {
|
|
361
|
-
_value = _value || {};
|
|
362
|
-
this.page = _value.page;
|
|
363
|
-
this.pageSize = _value.pageSize;
|
|
364
|
-
this.filters = _value.filters
|
|
365
|
-
? new armonikApiGrpcV1Results004.Filters(_value.filters)
|
|
366
|
-
: undefined;
|
|
367
|
-
this.sort = _value.sort
|
|
368
|
-
? new ListResultsRequest.Sort(_value.sort)
|
|
369
|
-
: undefined;
|
|
370
|
-
ListResultsRequest.refineValues(this);
|
|
371
|
-
}
|
|
372
|
-
get page() {
|
|
373
|
-
return this._page;
|
|
374
|
-
}
|
|
375
|
-
set page(value) {
|
|
376
|
-
this._page = value;
|
|
377
|
-
}
|
|
378
|
-
get pageSize() {
|
|
379
|
-
return this._pageSize;
|
|
380
|
-
}
|
|
381
|
-
set pageSize(value) {
|
|
382
|
-
this._pageSize = value;
|
|
383
|
-
}
|
|
384
|
-
get filters() {
|
|
385
|
-
return this._filters;
|
|
386
|
-
}
|
|
387
|
-
set filters(value) {
|
|
388
|
-
this._filters = value;
|
|
389
|
-
}
|
|
390
|
-
get sort() {
|
|
391
|
-
return this._sort;
|
|
392
|
-
}
|
|
393
|
-
set sort(value) {
|
|
394
|
-
this._sort = value;
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* Serialize message to binary data
|
|
398
|
-
* @param instance message instance
|
|
399
|
-
*/
|
|
400
|
-
serializeBinary() {
|
|
401
|
-
const writer = new BinaryWriter();
|
|
402
|
-
ListResultsRequest.serializeBinaryToWriter(this, writer);
|
|
403
|
-
return writer.getResultBuffer();
|
|
404
|
-
}
|
|
405
|
-
/**
|
|
406
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
407
|
-
*/
|
|
408
|
-
toObject() {
|
|
409
|
-
return {
|
|
410
|
-
page: this.page,
|
|
411
|
-
pageSize: this.pageSize,
|
|
412
|
-
filters: this.filters ? this.filters.toObject() : undefined,
|
|
413
|
-
sort: this.sort ? this.sort.toObject() : undefined
|
|
414
|
-
};
|
|
415
|
-
}
|
|
416
|
-
/**
|
|
417
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
418
|
-
*/
|
|
419
|
-
toJSON() {
|
|
420
|
-
return this.toObject();
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
424
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
425
|
-
* 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
|
|
426
|
-
*/
|
|
427
|
-
toProtobufJSON(
|
|
428
|
-
// @ts-ignore
|
|
429
|
-
options) {
|
|
430
|
-
return {
|
|
431
|
-
page: this.page,
|
|
432
|
-
pageSize: this.pageSize,
|
|
433
|
-
filters: this.filters ? this.filters.toProtobufJSON(options) : null,
|
|
434
|
-
sort: this.sort ? this.sort.toProtobufJSON(options) : null
|
|
435
|
-
};
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
(function (ListResultsRequest) {
|
|
439
|
-
/**
|
|
440
|
-
* Message implementation for armonik.api.grpc.v1.results.ListResultsRequest.Sort
|
|
441
|
-
*/
|
|
442
|
-
class Sort {
|
|
443
|
-
static { this.id = 'armonik.api.grpc.v1.results.ListResultsRequest.Sort'; }
|
|
444
|
-
/**
|
|
445
|
-
* Deserialize binary data to message
|
|
446
|
-
* @param instance message instance
|
|
447
|
-
*/
|
|
448
|
-
static deserializeBinary(bytes) {
|
|
449
|
-
const instance = new Sort();
|
|
450
|
-
Sort.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
451
|
-
return instance;
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Check all the properties and set default protobuf values if necessary
|
|
455
|
-
* @param _instance message instance
|
|
456
|
-
*/
|
|
457
|
-
static refineValues(_instance) {
|
|
458
|
-
_instance.field = _instance.field || undefined;
|
|
459
|
-
_instance.direction = _instance.direction || 0;
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
463
|
-
* @param _instance message instance
|
|
464
|
-
* @param _reader binary reader instance
|
|
465
|
-
*/
|
|
466
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
467
|
-
while (_reader.nextField()) {
|
|
468
|
-
if (_reader.isEndGroup())
|
|
469
|
-
break;
|
|
470
|
-
switch (_reader.getFieldNumber()) {
|
|
471
|
-
case 1:
|
|
472
|
-
_instance.field = new armonikApiGrpcV1Results002.ResultField();
|
|
473
|
-
_reader.readMessage(_instance.field, armonikApiGrpcV1Results002.ResultField.deserializeBinaryFromReader);
|
|
474
|
-
break;
|
|
475
|
-
case 2:
|
|
476
|
-
_instance.direction = _reader.readEnum();
|
|
477
|
-
break;
|
|
478
|
-
default:
|
|
479
|
-
_reader.skipField();
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
Sort.refineValues(_instance);
|
|
483
|
-
}
|
|
484
|
-
/**
|
|
485
|
-
* Serializes a message to binary format using provided binary reader
|
|
486
|
-
* @param _instance message instance
|
|
487
|
-
* @param _writer binary writer instance
|
|
488
|
-
*/
|
|
489
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
490
|
-
if (_instance.field) {
|
|
491
|
-
_writer.writeMessage(1, _instance.field, armonikApiGrpcV1Results002.ResultField.serializeBinaryToWriter);
|
|
492
|
-
}
|
|
493
|
-
if (_instance.direction) {
|
|
494
|
-
_writer.writeEnum(2, _instance.direction);
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
/**
|
|
498
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
499
|
-
* @param _value initial values object or instance of Sort to deeply clone from
|
|
500
|
-
*/
|
|
501
|
-
constructor(_value) {
|
|
502
|
-
_value = _value || {};
|
|
503
|
-
this.field = _value.field
|
|
504
|
-
? new armonikApiGrpcV1Results002.ResultField(_value.field)
|
|
505
|
-
: undefined;
|
|
506
|
-
this.direction = _value.direction;
|
|
507
|
-
Sort.refineValues(this);
|
|
508
|
-
}
|
|
509
|
-
get field() {
|
|
510
|
-
return this._field;
|
|
511
|
-
}
|
|
512
|
-
set field(value) {
|
|
513
|
-
this._field = value;
|
|
514
|
-
}
|
|
515
|
-
get direction() {
|
|
516
|
-
return this._direction;
|
|
517
|
-
}
|
|
518
|
-
set direction(value) {
|
|
519
|
-
this._direction = value;
|
|
520
|
-
}
|
|
521
|
-
/**
|
|
522
|
-
* Serialize message to binary data
|
|
523
|
-
* @param instance message instance
|
|
524
|
-
*/
|
|
525
|
-
serializeBinary() {
|
|
526
|
-
const writer = new BinaryWriter();
|
|
527
|
-
Sort.serializeBinaryToWriter(this, writer);
|
|
528
|
-
return writer.getResultBuffer();
|
|
529
|
-
}
|
|
530
|
-
/**
|
|
531
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
532
|
-
*/
|
|
533
|
-
toObject() {
|
|
534
|
-
return {
|
|
535
|
-
field: this.field ? this.field.toObject() : undefined,
|
|
536
|
-
direction: this.direction
|
|
537
|
-
};
|
|
538
|
-
}
|
|
539
|
-
/**
|
|
540
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
541
|
-
*/
|
|
542
|
-
toJSON() {
|
|
543
|
-
return this.toObject();
|
|
544
|
-
}
|
|
545
|
-
/**
|
|
546
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
547
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
548
|
-
* 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
|
|
549
|
-
*/
|
|
550
|
-
toProtobufJSON(
|
|
551
|
-
// @ts-ignore
|
|
552
|
-
options) {
|
|
553
|
-
return {
|
|
554
|
-
field: this.field ? this.field.toProtobufJSON(options) : null,
|
|
555
|
-
direction: armonikApiGrpcV1Sort_direction005.SortDirection[this.direction === null || this.direction === undefined
|
|
556
|
-
? 0
|
|
557
|
-
: this.direction]
|
|
558
|
-
};
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
ListResultsRequest.Sort = Sort;
|
|
562
|
-
})(ListResultsRequest || (ListResultsRequest = {}));
|
|
563
|
-
/**
|
|
564
|
-
* Message implementation for armonik.api.grpc.v1.results.ListResultsResponse
|
|
565
|
-
*/
|
|
566
|
-
export class ListResultsResponse {
|
|
567
|
-
static { this.id = 'armonik.api.grpc.v1.results.ListResultsResponse'; }
|
|
568
|
-
/**
|
|
569
|
-
* Deserialize binary data to message
|
|
570
|
-
* @param instance message instance
|
|
571
|
-
*/
|
|
572
|
-
static deserializeBinary(bytes) {
|
|
573
|
-
const instance = new ListResultsResponse();
|
|
574
|
-
ListResultsResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
575
|
-
return instance;
|
|
576
|
-
}
|
|
577
|
-
/**
|
|
578
|
-
* Check all the properties and set default protobuf values if necessary
|
|
579
|
-
* @param _instance message instance
|
|
580
|
-
*/
|
|
581
|
-
static refineValues(_instance) {
|
|
582
|
-
_instance.results = _instance.results || [];
|
|
583
|
-
_instance.page = _instance.page || 0;
|
|
584
|
-
_instance.pageSize = _instance.pageSize || 0;
|
|
585
|
-
_instance.total = _instance.total || 0;
|
|
586
|
-
}
|
|
587
|
-
/**
|
|
588
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
589
|
-
* @param _instance message instance
|
|
590
|
-
* @param _reader binary reader instance
|
|
591
|
-
*/
|
|
592
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
593
|
-
while (_reader.nextField()) {
|
|
594
|
-
if (_reader.isEndGroup())
|
|
595
|
-
break;
|
|
596
|
-
switch (_reader.getFieldNumber()) {
|
|
597
|
-
case 1:
|
|
598
|
-
const messageInitializer1 = new ResultRaw();
|
|
599
|
-
_reader.readMessage(messageInitializer1, ResultRaw.deserializeBinaryFromReader);
|
|
600
|
-
(_instance.results = _instance.results || []).push(messageInitializer1);
|
|
601
|
-
break;
|
|
602
|
-
case 2:
|
|
603
|
-
_instance.page = _reader.readInt32();
|
|
604
|
-
break;
|
|
605
|
-
case 3:
|
|
606
|
-
_instance.pageSize = _reader.readInt32();
|
|
607
|
-
break;
|
|
608
|
-
case 4:
|
|
609
|
-
_instance.total = _reader.readInt32();
|
|
610
|
-
break;
|
|
611
|
-
default:
|
|
612
|
-
_reader.skipField();
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
ListResultsResponse.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.results && _instance.results.length) {
|
|
624
|
-
_writer.writeRepeatedMessage(1, _instance.results, ResultRaw.serializeBinaryToWriter);
|
|
625
|
-
}
|
|
626
|
-
if (_instance.page) {
|
|
627
|
-
_writer.writeInt32(2, _instance.page);
|
|
628
|
-
}
|
|
629
|
-
if (_instance.pageSize) {
|
|
630
|
-
_writer.writeInt32(3, _instance.pageSize);
|
|
631
|
-
}
|
|
632
|
-
if (_instance.total) {
|
|
633
|
-
_writer.writeInt32(4, _instance.total);
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
/**
|
|
637
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
638
|
-
* @param _value initial values object or instance of ListResultsResponse to deeply clone from
|
|
639
|
-
*/
|
|
640
|
-
constructor(_value) {
|
|
641
|
-
_value = _value || {};
|
|
642
|
-
this.results = (_value.results || []).map(m => new ResultRaw(m));
|
|
643
|
-
this.page = _value.page;
|
|
644
|
-
this.pageSize = _value.pageSize;
|
|
645
|
-
this.total = _value.total;
|
|
646
|
-
ListResultsResponse.refineValues(this);
|
|
647
|
-
}
|
|
648
|
-
get results() {
|
|
649
|
-
return this._results;
|
|
650
|
-
}
|
|
651
|
-
set results(value) {
|
|
652
|
-
this._results = value;
|
|
653
|
-
}
|
|
654
|
-
get page() {
|
|
655
|
-
return this._page;
|
|
656
|
-
}
|
|
657
|
-
set page(value) {
|
|
658
|
-
this._page = value;
|
|
659
|
-
}
|
|
660
|
-
get pageSize() {
|
|
661
|
-
return this._pageSize;
|
|
662
|
-
}
|
|
663
|
-
set pageSize(value) {
|
|
664
|
-
this._pageSize = value;
|
|
665
|
-
}
|
|
666
|
-
get total() {
|
|
667
|
-
return this._total;
|
|
668
|
-
}
|
|
669
|
-
set total(value) {
|
|
670
|
-
this._total = value;
|
|
671
|
-
}
|
|
672
|
-
/**
|
|
673
|
-
* Serialize message to binary data
|
|
674
|
-
* @param instance message instance
|
|
675
|
-
*/
|
|
676
|
-
serializeBinary() {
|
|
677
|
-
const writer = new BinaryWriter();
|
|
678
|
-
ListResultsResponse.serializeBinaryToWriter(this, writer);
|
|
679
|
-
return writer.getResultBuffer();
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
683
|
-
*/
|
|
684
|
-
toObject() {
|
|
685
|
-
return {
|
|
686
|
-
results: (this.results || []).map(m => m.toObject()),
|
|
687
|
-
page: this.page,
|
|
688
|
-
pageSize: this.pageSize,
|
|
689
|
-
total: this.total
|
|
690
|
-
};
|
|
691
|
-
}
|
|
692
|
-
/**
|
|
693
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
694
|
-
*/
|
|
695
|
-
toJSON() {
|
|
696
|
-
return this.toObject();
|
|
697
|
-
}
|
|
698
|
-
/**
|
|
699
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
700
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
701
|
-
* 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
|
|
702
|
-
*/
|
|
703
|
-
toProtobufJSON(
|
|
704
|
-
// @ts-ignore
|
|
705
|
-
options) {
|
|
706
|
-
return {
|
|
707
|
-
results: (this.results || []).map(m => m.toProtobufJSON(options)),
|
|
708
|
-
page: this.page,
|
|
709
|
-
pageSize: this.pageSize,
|
|
710
|
-
total: this.total
|
|
711
|
-
};
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
/**
|
|
715
|
-
* Message implementation for armonik.api.grpc.v1.results.GetResultRequest
|
|
716
|
-
*/
|
|
717
|
-
export class GetResultRequest {
|
|
718
|
-
static { this.id = 'armonik.api.grpc.v1.results.GetResultRequest'; }
|
|
719
|
-
/**
|
|
720
|
-
* Deserialize binary data to message
|
|
721
|
-
* @param instance message instance
|
|
722
|
-
*/
|
|
723
|
-
static deserializeBinary(bytes) {
|
|
724
|
-
const instance = new GetResultRequest();
|
|
725
|
-
GetResultRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
726
|
-
return instance;
|
|
727
|
-
}
|
|
728
|
-
/**
|
|
729
|
-
* Check all the properties and set default protobuf values if necessary
|
|
730
|
-
* @param _instance message instance
|
|
731
|
-
*/
|
|
732
|
-
static refineValues(_instance) {
|
|
733
|
-
_instance.resultId = _instance.resultId || '';
|
|
734
|
-
}
|
|
735
|
-
/**
|
|
736
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
737
|
-
* @param _instance message instance
|
|
738
|
-
* @param _reader binary reader instance
|
|
739
|
-
*/
|
|
740
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
741
|
-
while (_reader.nextField()) {
|
|
742
|
-
if (_reader.isEndGroup())
|
|
743
|
-
break;
|
|
744
|
-
switch (_reader.getFieldNumber()) {
|
|
745
|
-
case 1:
|
|
746
|
-
_instance.resultId = _reader.readString();
|
|
747
|
-
break;
|
|
748
|
-
default:
|
|
749
|
-
_reader.skipField();
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
GetResultRequest.refineValues(_instance);
|
|
753
|
-
}
|
|
754
|
-
/**
|
|
755
|
-
* Serializes a message to binary format using provided binary reader
|
|
756
|
-
* @param _instance message instance
|
|
757
|
-
* @param _writer binary writer instance
|
|
758
|
-
*/
|
|
759
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
760
|
-
if (_instance.resultId) {
|
|
761
|
-
_writer.writeString(1, _instance.resultId);
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
/**
|
|
765
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
766
|
-
* @param _value initial values object or instance of GetResultRequest to deeply clone from
|
|
767
|
-
*/
|
|
768
|
-
constructor(_value) {
|
|
769
|
-
_value = _value || {};
|
|
770
|
-
this.resultId = _value.resultId;
|
|
771
|
-
GetResultRequest.refineValues(this);
|
|
772
|
-
}
|
|
773
|
-
get resultId() {
|
|
774
|
-
return this._resultId;
|
|
775
|
-
}
|
|
776
|
-
set resultId(value) {
|
|
777
|
-
this._resultId = value;
|
|
778
|
-
}
|
|
779
|
-
/**
|
|
780
|
-
* Serialize message to binary data
|
|
781
|
-
* @param instance message instance
|
|
782
|
-
*/
|
|
783
|
-
serializeBinary() {
|
|
784
|
-
const writer = new BinaryWriter();
|
|
785
|
-
GetResultRequest.serializeBinaryToWriter(this, writer);
|
|
786
|
-
return writer.getResultBuffer();
|
|
787
|
-
}
|
|
788
|
-
/**
|
|
789
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
790
|
-
*/
|
|
791
|
-
toObject() {
|
|
792
|
-
return {
|
|
793
|
-
resultId: this.resultId
|
|
794
|
-
};
|
|
795
|
-
}
|
|
796
|
-
/**
|
|
797
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
798
|
-
*/
|
|
799
|
-
toJSON() {
|
|
800
|
-
return this.toObject();
|
|
801
|
-
}
|
|
802
|
-
/**
|
|
803
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
804
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
805
|
-
* 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
|
|
806
|
-
*/
|
|
807
|
-
toProtobufJSON(
|
|
808
|
-
// @ts-ignore
|
|
809
|
-
options) {
|
|
810
|
-
return {
|
|
811
|
-
resultId: this.resultId
|
|
812
|
-
};
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
/**
|
|
816
|
-
* Message implementation for armonik.api.grpc.v1.results.GetResultResponse
|
|
817
|
-
*/
|
|
818
|
-
export class GetResultResponse {
|
|
819
|
-
static { this.id = 'armonik.api.grpc.v1.results.GetResultResponse'; }
|
|
820
|
-
/**
|
|
821
|
-
* Deserialize binary data to message
|
|
822
|
-
* @param instance message instance
|
|
823
|
-
*/
|
|
824
|
-
static deserializeBinary(bytes) {
|
|
825
|
-
const instance = new GetResultResponse();
|
|
826
|
-
GetResultResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
827
|
-
return instance;
|
|
828
|
-
}
|
|
829
|
-
/**
|
|
830
|
-
* Check all the properties and set default protobuf values if necessary
|
|
831
|
-
* @param _instance message instance
|
|
832
|
-
*/
|
|
833
|
-
static refineValues(_instance) {
|
|
834
|
-
_instance.result = _instance.result || undefined;
|
|
835
|
-
}
|
|
836
|
-
/**
|
|
837
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
838
|
-
* @param _instance message instance
|
|
839
|
-
* @param _reader binary reader instance
|
|
840
|
-
*/
|
|
841
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
842
|
-
while (_reader.nextField()) {
|
|
843
|
-
if (_reader.isEndGroup())
|
|
844
|
-
break;
|
|
845
|
-
switch (_reader.getFieldNumber()) {
|
|
846
|
-
case 1:
|
|
847
|
-
_instance.result = new ResultRaw();
|
|
848
|
-
_reader.readMessage(_instance.result, ResultRaw.deserializeBinaryFromReader);
|
|
849
|
-
break;
|
|
850
|
-
default:
|
|
851
|
-
_reader.skipField();
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
GetResultResponse.refineValues(_instance);
|
|
855
|
-
}
|
|
856
|
-
/**
|
|
857
|
-
* Serializes a message to binary format using provided binary reader
|
|
858
|
-
* @param _instance message instance
|
|
859
|
-
* @param _writer binary writer instance
|
|
860
|
-
*/
|
|
861
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
862
|
-
if (_instance.result) {
|
|
863
|
-
_writer.writeMessage(1, _instance.result, ResultRaw.serializeBinaryToWriter);
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
/**
|
|
867
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
868
|
-
* @param _value initial values object or instance of GetResultResponse to deeply clone from
|
|
869
|
-
*/
|
|
870
|
-
constructor(_value) {
|
|
871
|
-
_value = _value || {};
|
|
872
|
-
this.result = _value.result ? new ResultRaw(_value.result) : undefined;
|
|
873
|
-
GetResultResponse.refineValues(this);
|
|
874
|
-
}
|
|
875
|
-
get result() {
|
|
876
|
-
return this._result;
|
|
877
|
-
}
|
|
878
|
-
set result(value) {
|
|
879
|
-
this._result = value;
|
|
880
|
-
}
|
|
881
|
-
/**
|
|
882
|
-
* Serialize message to binary data
|
|
883
|
-
* @param instance message instance
|
|
884
|
-
*/
|
|
885
|
-
serializeBinary() {
|
|
886
|
-
const writer = new BinaryWriter();
|
|
887
|
-
GetResultResponse.serializeBinaryToWriter(this, writer);
|
|
888
|
-
return writer.getResultBuffer();
|
|
889
|
-
}
|
|
890
|
-
/**
|
|
891
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
892
|
-
*/
|
|
893
|
-
toObject() {
|
|
894
|
-
return {
|
|
895
|
-
result: this.result ? this.result.toObject() : undefined
|
|
896
|
-
};
|
|
897
|
-
}
|
|
898
|
-
/**
|
|
899
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
900
|
-
*/
|
|
901
|
-
toJSON() {
|
|
902
|
-
return this.toObject();
|
|
903
|
-
}
|
|
904
|
-
/**
|
|
905
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
906
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
907
|
-
* 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
|
|
908
|
-
*/
|
|
909
|
-
toProtobufJSON(
|
|
910
|
-
// @ts-ignore
|
|
911
|
-
options) {
|
|
912
|
-
return {
|
|
913
|
-
result: this.result ? this.result.toProtobufJSON(options) : null
|
|
914
|
-
};
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
/**
|
|
918
|
-
* Message implementation for armonik.api.grpc.v1.results.GetOwnerTaskIdRequest
|
|
919
|
-
*/
|
|
920
|
-
export class GetOwnerTaskIdRequest {
|
|
921
|
-
static { this.id = 'armonik.api.grpc.v1.results.GetOwnerTaskIdRequest'; }
|
|
922
|
-
/**
|
|
923
|
-
* Deserialize binary data to message
|
|
924
|
-
* @param instance message instance
|
|
925
|
-
*/
|
|
926
|
-
static deserializeBinary(bytes) {
|
|
927
|
-
const instance = new GetOwnerTaskIdRequest();
|
|
928
|
-
GetOwnerTaskIdRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
929
|
-
return instance;
|
|
930
|
-
}
|
|
931
|
-
/**
|
|
932
|
-
* Check all the properties and set default protobuf values if necessary
|
|
933
|
-
* @param _instance message instance
|
|
934
|
-
*/
|
|
935
|
-
static refineValues(_instance) {
|
|
936
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
937
|
-
_instance.resultId = _instance.resultId || [];
|
|
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.sessionId = _reader.readString();
|
|
951
|
-
break;
|
|
952
|
-
case 2:
|
|
953
|
-
(_instance.resultId = _instance.resultId || []).push(_reader.readString());
|
|
954
|
-
break;
|
|
955
|
-
default:
|
|
956
|
-
_reader.skipField();
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
GetOwnerTaskIdRequest.refineValues(_instance);
|
|
960
|
-
}
|
|
961
|
-
/**
|
|
962
|
-
* Serializes a message to binary format using provided binary reader
|
|
963
|
-
* @param _instance message instance
|
|
964
|
-
* @param _writer binary writer instance
|
|
965
|
-
*/
|
|
966
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
967
|
-
if (_instance.sessionId) {
|
|
968
|
-
_writer.writeString(1, _instance.sessionId);
|
|
969
|
-
}
|
|
970
|
-
if (_instance.resultId && _instance.resultId.length) {
|
|
971
|
-
_writer.writeRepeatedString(2, _instance.resultId);
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
/**
|
|
975
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
976
|
-
* @param _value initial values object or instance of GetOwnerTaskIdRequest to deeply clone from
|
|
977
|
-
*/
|
|
978
|
-
constructor(_value) {
|
|
979
|
-
_value = _value || {};
|
|
980
|
-
this.sessionId = _value.sessionId;
|
|
981
|
-
this.resultId = (_value.resultId || []).slice();
|
|
982
|
-
GetOwnerTaskIdRequest.refineValues(this);
|
|
983
|
-
}
|
|
984
|
-
get sessionId() {
|
|
985
|
-
return this._sessionId;
|
|
986
|
-
}
|
|
987
|
-
set sessionId(value) {
|
|
988
|
-
this._sessionId = value;
|
|
989
|
-
}
|
|
990
|
-
get resultId() {
|
|
991
|
-
return this._resultId;
|
|
992
|
-
}
|
|
993
|
-
set resultId(value) {
|
|
994
|
-
this._resultId = value;
|
|
995
|
-
}
|
|
996
|
-
/**
|
|
997
|
-
* Serialize message to binary data
|
|
998
|
-
* @param instance message instance
|
|
999
|
-
*/
|
|
1000
|
-
serializeBinary() {
|
|
1001
|
-
const writer = new BinaryWriter();
|
|
1002
|
-
GetOwnerTaskIdRequest.serializeBinaryToWriter(this, writer);
|
|
1003
|
-
return writer.getResultBuffer();
|
|
1004
|
-
}
|
|
1005
|
-
/**
|
|
1006
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1007
|
-
*/
|
|
1008
|
-
toObject() {
|
|
1009
|
-
return {
|
|
1010
|
-
sessionId: this.sessionId,
|
|
1011
|
-
resultId: (this.resultId || []).slice()
|
|
1012
|
-
};
|
|
1013
|
-
}
|
|
1014
|
-
/**
|
|
1015
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1016
|
-
*/
|
|
1017
|
-
toJSON() {
|
|
1018
|
-
return this.toObject();
|
|
1019
|
-
}
|
|
1020
|
-
/**
|
|
1021
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1022
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1023
|
-
* 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
|
|
1024
|
-
*/
|
|
1025
|
-
toProtobufJSON(
|
|
1026
|
-
// @ts-ignore
|
|
1027
|
-
options) {
|
|
1028
|
-
return {
|
|
1029
|
-
sessionId: this.sessionId,
|
|
1030
|
-
resultId: (this.resultId || []).slice()
|
|
1031
|
-
};
|
|
1032
|
-
}
|
|
1033
|
-
}
|
|
1034
|
-
/**
|
|
1035
|
-
* Message implementation for armonik.api.grpc.v1.results.GetOwnerTaskIdResponse
|
|
1036
|
-
*/
|
|
1037
|
-
export class GetOwnerTaskIdResponse {
|
|
1038
|
-
static { this.id = 'armonik.api.grpc.v1.results.GetOwnerTaskIdResponse'; }
|
|
1039
|
-
/**
|
|
1040
|
-
* Deserialize binary data to message
|
|
1041
|
-
* @param instance message instance
|
|
1042
|
-
*/
|
|
1043
|
-
static deserializeBinary(bytes) {
|
|
1044
|
-
const instance = new GetOwnerTaskIdResponse();
|
|
1045
|
-
GetOwnerTaskIdResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1046
|
-
return instance;
|
|
1047
|
-
}
|
|
1048
|
-
/**
|
|
1049
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1050
|
-
* @param _instance message instance
|
|
1051
|
-
*/
|
|
1052
|
-
static refineValues(_instance) {
|
|
1053
|
-
_instance.resultTask = _instance.resultTask || [];
|
|
1054
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
1055
|
-
}
|
|
1056
|
-
/**
|
|
1057
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1058
|
-
* @param _instance message instance
|
|
1059
|
-
* @param _reader binary reader instance
|
|
1060
|
-
*/
|
|
1061
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1062
|
-
while (_reader.nextField()) {
|
|
1063
|
-
if (_reader.isEndGroup())
|
|
1064
|
-
break;
|
|
1065
|
-
switch (_reader.getFieldNumber()) {
|
|
1066
|
-
case 1:
|
|
1067
|
-
const messageInitializer1 = new GetOwnerTaskIdResponse.MapResultTask();
|
|
1068
|
-
_reader.readMessage(messageInitializer1, GetOwnerTaskIdResponse.MapResultTask.deserializeBinaryFromReader);
|
|
1069
|
-
(_instance.resultTask = _instance.resultTask || []).push(messageInitializer1);
|
|
1070
|
-
break;
|
|
1071
|
-
case 2:
|
|
1072
|
-
_instance.sessionId = _reader.readString();
|
|
1073
|
-
break;
|
|
1074
|
-
default:
|
|
1075
|
-
_reader.skipField();
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
GetOwnerTaskIdResponse.refineValues(_instance);
|
|
1079
|
-
}
|
|
1080
|
-
/**
|
|
1081
|
-
* Serializes a message to binary format using provided binary reader
|
|
1082
|
-
* @param _instance message instance
|
|
1083
|
-
* @param _writer binary writer instance
|
|
1084
|
-
*/
|
|
1085
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
1086
|
-
if (_instance.resultTask && _instance.resultTask.length) {
|
|
1087
|
-
_writer.writeRepeatedMessage(1, _instance.resultTask, GetOwnerTaskIdResponse.MapResultTask.serializeBinaryToWriter);
|
|
1088
|
-
}
|
|
1089
|
-
if (_instance.sessionId) {
|
|
1090
|
-
_writer.writeString(2, _instance.sessionId);
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
/**
|
|
1094
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1095
|
-
* @param _value initial values object or instance of GetOwnerTaskIdResponse to deeply clone from
|
|
1096
|
-
*/
|
|
1097
|
-
constructor(_value) {
|
|
1098
|
-
_value = _value || {};
|
|
1099
|
-
this.resultTask = (_value.resultTask || []).map(m => new GetOwnerTaskIdResponse.MapResultTask(m));
|
|
1100
|
-
this.sessionId = _value.sessionId;
|
|
1101
|
-
GetOwnerTaskIdResponse.refineValues(this);
|
|
1102
|
-
}
|
|
1103
|
-
get resultTask() {
|
|
1104
|
-
return this._resultTask;
|
|
1105
|
-
}
|
|
1106
|
-
set resultTask(value) {
|
|
1107
|
-
this._resultTask = value;
|
|
1108
|
-
}
|
|
1109
|
-
get sessionId() {
|
|
1110
|
-
return this._sessionId;
|
|
1111
|
-
}
|
|
1112
|
-
set sessionId(value) {
|
|
1113
|
-
this._sessionId = value;
|
|
1114
|
-
}
|
|
1115
|
-
/**
|
|
1116
|
-
* Serialize message to binary data
|
|
1117
|
-
* @param instance message instance
|
|
1118
|
-
*/
|
|
1119
|
-
serializeBinary() {
|
|
1120
|
-
const writer = new BinaryWriter();
|
|
1121
|
-
GetOwnerTaskIdResponse.serializeBinaryToWriter(this, writer);
|
|
1122
|
-
return writer.getResultBuffer();
|
|
1123
|
-
}
|
|
1124
|
-
/**
|
|
1125
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1126
|
-
*/
|
|
1127
|
-
toObject() {
|
|
1128
|
-
return {
|
|
1129
|
-
resultTask: (this.resultTask || []).map(m => m.toObject()),
|
|
1130
|
-
sessionId: this.sessionId
|
|
1131
|
-
};
|
|
1132
|
-
}
|
|
1133
|
-
/**
|
|
1134
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1135
|
-
*/
|
|
1136
|
-
toJSON() {
|
|
1137
|
-
return this.toObject();
|
|
1138
|
-
}
|
|
1139
|
-
/**
|
|
1140
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1141
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1142
|
-
* 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
|
|
1143
|
-
*/
|
|
1144
|
-
toProtobufJSON(
|
|
1145
|
-
// @ts-ignore
|
|
1146
|
-
options) {
|
|
1147
|
-
return {
|
|
1148
|
-
resultTask: (this.resultTask || []).map(m => m.toProtobufJSON(options)),
|
|
1149
|
-
sessionId: this.sessionId
|
|
1150
|
-
};
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
(function (GetOwnerTaskIdResponse) {
|
|
1154
|
-
/**
|
|
1155
|
-
* Message implementation for armonik.api.grpc.v1.results.GetOwnerTaskIdResponse.MapResultTask
|
|
1156
|
-
*/
|
|
1157
|
-
class MapResultTask {
|
|
1158
|
-
static { this.id = 'armonik.api.grpc.v1.results.GetOwnerTaskIdResponse.MapResultTask'; }
|
|
1159
|
-
/**
|
|
1160
|
-
* Deserialize binary data to message
|
|
1161
|
-
* @param instance message instance
|
|
1162
|
-
*/
|
|
1163
|
-
static deserializeBinary(bytes) {
|
|
1164
|
-
const instance = new MapResultTask();
|
|
1165
|
-
MapResultTask.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1166
|
-
return instance;
|
|
1167
|
-
}
|
|
1168
|
-
/**
|
|
1169
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1170
|
-
* @param _instance message instance
|
|
1171
|
-
*/
|
|
1172
|
-
static refineValues(_instance) {
|
|
1173
|
-
_instance.resultId = _instance.resultId || '';
|
|
1174
|
-
_instance.taskId = _instance.taskId || '';
|
|
1175
|
-
}
|
|
1176
|
-
/**
|
|
1177
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1178
|
-
* @param _instance message instance
|
|
1179
|
-
* @param _reader binary reader instance
|
|
1180
|
-
*/
|
|
1181
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1182
|
-
while (_reader.nextField()) {
|
|
1183
|
-
if (_reader.isEndGroup())
|
|
1184
|
-
break;
|
|
1185
|
-
switch (_reader.getFieldNumber()) {
|
|
1186
|
-
case 1:
|
|
1187
|
-
_instance.resultId = _reader.readString();
|
|
1188
|
-
break;
|
|
1189
|
-
case 2:
|
|
1190
|
-
_instance.taskId = _reader.readString();
|
|
1191
|
-
break;
|
|
1192
|
-
default:
|
|
1193
|
-
_reader.skipField();
|
|
1194
|
-
}
|
|
1195
|
-
}
|
|
1196
|
-
MapResultTask.refineValues(_instance);
|
|
1197
|
-
}
|
|
1198
|
-
/**
|
|
1199
|
-
* Serializes a message to binary format using provided binary reader
|
|
1200
|
-
* @param _instance message instance
|
|
1201
|
-
* @param _writer binary writer instance
|
|
1202
|
-
*/
|
|
1203
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
1204
|
-
if (_instance.resultId) {
|
|
1205
|
-
_writer.writeString(1, _instance.resultId);
|
|
1206
|
-
}
|
|
1207
|
-
if (_instance.taskId) {
|
|
1208
|
-
_writer.writeString(2, _instance.taskId);
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
/**
|
|
1212
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1213
|
-
* @param _value initial values object or instance of MapResultTask to deeply clone from
|
|
1214
|
-
*/
|
|
1215
|
-
constructor(_value) {
|
|
1216
|
-
_value = _value || {};
|
|
1217
|
-
this.resultId = _value.resultId;
|
|
1218
|
-
this.taskId = _value.taskId;
|
|
1219
|
-
MapResultTask.refineValues(this);
|
|
1220
|
-
}
|
|
1221
|
-
get resultId() {
|
|
1222
|
-
return this._resultId;
|
|
1223
|
-
}
|
|
1224
|
-
set resultId(value) {
|
|
1225
|
-
this._resultId = value;
|
|
1226
|
-
}
|
|
1227
|
-
get taskId() {
|
|
1228
|
-
return this._taskId;
|
|
1229
|
-
}
|
|
1230
|
-
set taskId(value) {
|
|
1231
|
-
this._taskId = value;
|
|
1232
|
-
}
|
|
1233
|
-
/**
|
|
1234
|
-
* Serialize message to binary data
|
|
1235
|
-
* @param instance message instance
|
|
1236
|
-
*/
|
|
1237
|
-
serializeBinary() {
|
|
1238
|
-
const writer = new BinaryWriter();
|
|
1239
|
-
MapResultTask.serializeBinaryToWriter(this, writer);
|
|
1240
|
-
return writer.getResultBuffer();
|
|
1241
|
-
}
|
|
1242
|
-
/**
|
|
1243
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1244
|
-
*/
|
|
1245
|
-
toObject() {
|
|
1246
|
-
return {
|
|
1247
|
-
resultId: this.resultId,
|
|
1248
|
-
taskId: this.taskId
|
|
1249
|
-
};
|
|
1250
|
-
}
|
|
1251
|
-
/**
|
|
1252
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1253
|
-
*/
|
|
1254
|
-
toJSON() {
|
|
1255
|
-
return this.toObject();
|
|
1256
|
-
}
|
|
1257
|
-
/**
|
|
1258
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1259
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1260
|
-
* 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
|
|
1261
|
-
*/
|
|
1262
|
-
toProtobufJSON(
|
|
1263
|
-
// @ts-ignore
|
|
1264
|
-
options) {
|
|
1265
|
-
return {
|
|
1266
|
-
resultId: this.resultId,
|
|
1267
|
-
taskId: this.taskId
|
|
1268
|
-
};
|
|
1269
|
-
}
|
|
1270
|
-
}
|
|
1271
|
-
GetOwnerTaskIdResponse.MapResultTask = MapResultTask;
|
|
1272
|
-
})(GetOwnerTaskIdResponse || (GetOwnerTaskIdResponse = {}));
|
|
1273
|
-
/**
|
|
1274
|
-
* Message implementation for armonik.api.grpc.v1.results.CreateResultsMetaDataRequest
|
|
1275
|
-
*/
|
|
1276
|
-
export class CreateResultsMetaDataRequest {
|
|
1277
|
-
static { this.id = 'armonik.api.grpc.v1.results.CreateResultsMetaDataRequest'; }
|
|
1278
|
-
/**
|
|
1279
|
-
* Deserialize binary data to message
|
|
1280
|
-
* @param instance message instance
|
|
1281
|
-
*/
|
|
1282
|
-
static deserializeBinary(bytes) {
|
|
1283
|
-
const instance = new CreateResultsMetaDataRequest();
|
|
1284
|
-
CreateResultsMetaDataRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1285
|
-
return instance;
|
|
1286
|
-
}
|
|
1287
|
-
/**
|
|
1288
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1289
|
-
* @param _instance message instance
|
|
1290
|
-
*/
|
|
1291
|
-
static refineValues(_instance) {
|
|
1292
|
-
_instance.results = _instance.results || [];
|
|
1293
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
1294
|
-
}
|
|
1295
|
-
/**
|
|
1296
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1297
|
-
* @param _instance message instance
|
|
1298
|
-
* @param _reader binary reader instance
|
|
1299
|
-
*/
|
|
1300
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1301
|
-
while (_reader.nextField()) {
|
|
1302
|
-
if (_reader.isEndGroup())
|
|
1303
|
-
break;
|
|
1304
|
-
switch (_reader.getFieldNumber()) {
|
|
1305
|
-
case 1:
|
|
1306
|
-
const messageInitializer1 = new CreateResultsMetaDataRequest.ResultCreate();
|
|
1307
|
-
_reader.readMessage(messageInitializer1, CreateResultsMetaDataRequest.ResultCreate
|
|
1308
|
-
.deserializeBinaryFromReader);
|
|
1309
|
-
(_instance.results = _instance.results || []).push(messageInitializer1);
|
|
1310
|
-
break;
|
|
1311
|
-
case 2:
|
|
1312
|
-
_instance.sessionId = _reader.readString();
|
|
1313
|
-
break;
|
|
1314
|
-
default:
|
|
1315
|
-
_reader.skipField();
|
|
1316
|
-
}
|
|
1317
|
-
}
|
|
1318
|
-
CreateResultsMetaDataRequest.refineValues(_instance);
|
|
1319
|
-
}
|
|
1320
|
-
/**
|
|
1321
|
-
* Serializes a message to binary format using provided binary reader
|
|
1322
|
-
* @param _instance message instance
|
|
1323
|
-
* @param _writer binary writer instance
|
|
1324
|
-
*/
|
|
1325
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
1326
|
-
if (_instance.results && _instance.results.length) {
|
|
1327
|
-
_writer.writeRepeatedMessage(1, _instance.results, CreateResultsMetaDataRequest.ResultCreate.serializeBinaryToWriter);
|
|
1328
|
-
}
|
|
1329
|
-
if (_instance.sessionId) {
|
|
1330
|
-
_writer.writeString(2, _instance.sessionId);
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1333
|
-
/**
|
|
1334
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1335
|
-
* @param _value initial values object or instance of CreateResultsMetaDataRequest to deeply clone from
|
|
1336
|
-
*/
|
|
1337
|
-
constructor(_value) {
|
|
1338
|
-
_value = _value || {};
|
|
1339
|
-
this.results = (_value.results || []).map(m => new CreateResultsMetaDataRequest.ResultCreate(m));
|
|
1340
|
-
this.sessionId = _value.sessionId;
|
|
1341
|
-
CreateResultsMetaDataRequest.refineValues(this);
|
|
1342
|
-
}
|
|
1343
|
-
get results() {
|
|
1344
|
-
return this._results;
|
|
1345
|
-
}
|
|
1346
|
-
set results(value) {
|
|
1347
|
-
this._results = value;
|
|
1348
|
-
}
|
|
1349
|
-
get sessionId() {
|
|
1350
|
-
return this._sessionId;
|
|
1351
|
-
}
|
|
1352
|
-
set sessionId(value) {
|
|
1353
|
-
this._sessionId = value;
|
|
1354
|
-
}
|
|
1355
|
-
/**
|
|
1356
|
-
* Serialize message to binary data
|
|
1357
|
-
* @param instance message instance
|
|
1358
|
-
*/
|
|
1359
|
-
serializeBinary() {
|
|
1360
|
-
const writer = new BinaryWriter();
|
|
1361
|
-
CreateResultsMetaDataRequest.serializeBinaryToWriter(this, writer);
|
|
1362
|
-
return writer.getResultBuffer();
|
|
1363
|
-
}
|
|
1364
|
-
/**
|
|
1365
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1366
|
-
*/
|
|
1367
|
-
toObject() {
|
|
1368
|
-
return {
|
|
1369
|
-
results: (this.results || []).map(m => m.toObject()),
|
|
1370
|
-
sessionId: this.sessionId
|
|
1371
|
-
};
|
|
1372
|
-
}
|
|
1373
|
-
/**
|
|
1374
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1375
|
-
*/
|
|
1376
|
-
toJSON() {
|
|
1377
|
-
return this.toObject();
|
|
1378
|
-
}
|
|
1379
|
-
/**
|
|
1380
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1381
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1382
|
-
* 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
|
|
1383
|
-
*/
|
|
1384
|
-
toProtobufJSON(
|
|
1385
|
-
// @ts-ignore
|
|
1386
|
-
options) {
|
|
1387
|
-
return {
|
|
1388
|
-
results: (this.results || []).map(m => m.toProtobufJSON(options)),
|
|
1389
|
-
sessionId: this.sessionId
|
|
1390
|
-
};
|
|
1391
|
-
}
|
|
1392
|
-
}
|
|
1393
|
-
(function (CreateResultsMetaDataRequest) {
|
|
1394
|
-
/**
|
|
1395
|
-
* Message implementation for armonik.api.grpc.v1.results.CreateResultsMetaDataRequest.ResultCreate
|
|
1396
|
-
*/
|
|
1397
|
-
class ResultCreate {
|
|
1398
|
-
static { this.id = 'armonik.api.grpc.v1.results.CreateResultsMetaDataRequest.ResultCreate'; }
|
|
1399
|
-
/**
|
|
1400
|
-
* Deserialize binary data to message
|
|
1401
|
-
* @param instance message instance
|
|
1402
|
-
*/
|
|
1403
|
-
static deserializeBinary(bytes) {
|
|
1404
|
-
const instance = new ResultCreate();
|
|
1405
|
-
ResultCreate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1406
|
-
return instance;
|
|
1407
|
-
}
|
|
1408
|
-
/**
|
|
1409
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1410
|
-
* @param _instance message instance
|
|
1411
|
-
*/
|
|
1412
|
-
static refineValues(_instance) {
|
|
1413
|
-
_instance.name = _instance.name || '';
|
|
1414
|
-
_instance.manualDeletion = _instance.manualDeletion || false;
|
|
1415
|
-
}
|
|
1416
|
-
/**
|
|
1417
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1418
|
-
* @param _instance message instance
|
|
1419
|
-
* @param _reader binary reader instance
|
|
1420
|
-
*/
|
|
1421
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1422
|
-
while (_reader.nextField()) {
|
|
1423
|
-
if (_reader.isEndGroup())
|
|
1424
|
-
break;
|
|
1425
|
-
switch (_reader.getFieldNumber()) {
|
|
1426
|
-
case 1:
|
|
1427
|
-
_instance.name = _reader.readString();
|
|
1428
|
-
break;
|
|
1429
|
-
case 2:
|
|
1430
|
-
_instance.manualDeletion = _reader.readBool();
|
|
1431
|
-
break;
|
|
1432
|
-
default:
|
|
1433
|
-
_reader.skipField();
|
|
1434
|
-
}
|
|
1435
|
-
}
|
|
1436
|
-
ResultCreate.refineValues(_instance);
|
|
1437
|
-
}
|
|
1438
|
-
/**
|
|
1439
|
-
* Serializes a message to binary format using provided binary reader
|
|
1440
|
-
* @param _instance message instance
|
|
1441
|
-
* @param _writer binary writer instance
|
|
1442
|
-
*/
|
|
1443
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
1444
|
-
if (_instance.name) {
|
|
1445
|
-
_writer.writeString(1, _instance.name);
|
|
1446
|
-
}
|
|
1447
|
-
if (_instance.manualDeletion) {
|
|
1448
|
-
_writer.writeBool(2, _instance.manualDeletion);
|
|
1449
|
-
}
|
|
1450
|
-
}
|
|
1451
|
-
/**
|
|
1452
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1453
|
-
* @param _value initial values object or instance of ResultCreate to deeply clone from
|
|
1454
|
-
*/
|
|
1455
|
-
constructor(_value) {
|
|
1456
|
-
_value = _value || {};
|
|
1457
|
-
this.name = _value.name;
|
|
1458
|
-
this.manualDeletion = _value.manualDeletion;
|
|
1459
|
-
ResultCreate.refineValues(this);
|
|
1460
|
-
}
|
|
1461
|
-
get name() {
|
|
1462
|
-
return this._name;
|
|
1463
|
-
}
|
|
1464
|
-
set name(value) {
|
|
1465
|
-
this._name = value;
|
|
1466
|
-
}
|
|
1467
|
-
get manualDeletion() {
|
|
1468
|
-
return this._manualDeletion;
|
|
1469
|
-
}
|
|
1470
|
-
set manualDeletion(value) {
|
|
1471
|
-
this._manualDeletion = value;
|
|
1472
|
-
}
|
|
1473
|
-
/**
|
|
1474
|
-
* Serialize message to binary data
|
|
1475
|
-
* @param instance message instance
|
|
1476
|
-
*/
|
|
1477
|
-
serializeBinary() {
|
|
1478
|
-
const writer = new BinaryWriter();
|
|
1479
|
-
ResultCreate.serializeBinaryToWriter(this, writer);
|
|
1480
|
-
return writer.getResultBuffer();
|
|
1481
|
-
}
|
|
1482
|
-
/**
|
|
1483
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1484
|
-
*/
|
|
1485
|
-
toObject() {
|
|
1486
|
-
return {
|
|
1487
|
-
name: this.name,
|
|
1488
|
-
manualDeletion: this.manualDeletion
|
|
1489
|
-
};
|
|
1490
|
-
}
|
|
1491
|
-
/**
|
|
1492
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1493
|
-
*/
|
|
1494
|
-
toJSON() {
|
|
1495
|
-
return this.toObject();
|
|
1496
|
-
}
|
|
1497
|
-
/**
|
|
1498
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1499
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1500
|
-
* 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
|
|
1501
|
-
*/
|
|
1502
|
-
toProtobufJSON(
|
|
1503
|
-
// @ts-ignore
|
|
1504
|
-
options) {
|
|
1505
|
-
return {
|
|
1506
|
-
name: this.name,
|
|
1507
|
-
manualDeletion: this.manualDeletion
|
|
1508
|
-
};
|
|
1509
|
-
}
|
|
1510
|
-
}
|
|
1511
|
-
CreateResultsMetaDataRequest.ResultCreate = ResultCreate;
|
|
1512
|
-
})(CreateResultsMetaDataRequest || (CreateResultsMetaDataRequest = {}));
|
|
1513
|
-
/**
|
|
1514
|
-
* Message implementation for armonik.api.grpc.v1.results.CreateResultsMetaDataResponse
|
|
1515
|
-
*/
|
|
1516
|
-
export class CreateResultsMetaDataResponse {
|
|
1517
|
-
static { this.id = 'armonik.api.grpc.v1.results.CreateResultsMetaDataResponse'; }
|
|
1518
|
-
/**
|
|
1519
|
-
* Deserialize binary data to message
|
|
1520
|
-
* @param instance message instance
|
|
1521
|
-
*/
|
|
1522
|
-
static deserializeBinary(bytes) {
|
|
1523
|
-
const instance = new CreateResultsMetaDataResponse();
|
|
1524
|
-
CreateResultsMetaDataResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1525
|
-
return instance;
|
|
1526
|
-
}
|
|
1527
|
-
/**
|
|
1528
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1529
|
-
* @param _instance message instance
|
|
1530
|
-
*/
|
|
1531
|
-
static refineValues(_instance) {
|
|
1532
|
-
_instance.results = _instance.results || [];
|
|
1533
|
-
}
|
|
1534
|
-
/**
|
|
1535
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1536
|
-
* @param _instance message instance
|
|
1537
|
-
* @param _reader binary reader instance
|
|
1538
|
-
*/
|
|
1539
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1540
|
-
while (_reader.nextField()) {
|
|
1541
|
-
if (_reader.isEndGroup())
|
|
1542
|
-
break;
|
|
1543
|
-
switch (_reader.getFieldNumber()) {
|
|
1544
|
-
case 1:
|
|
1545
|
-
const messageInitializer1 = new ResultRaw();
|
|
1546
|
-
_reader.readMessage(messageInitializer1, ResultRaw.deserializeBinaryFromReader);
|
|
1547
|
-
(_instance.results = _instance.results || []).push(messageInitializer1);
|
|
1548
|
-
break;
|
|
1549
|
-
default:
|
|
1550
|
-
_reader.skipField();
|
|
1551
|
-
}
|
|
1552
|
-
}
|
|
1553
|
-
CreateResultsMetaDataResponse.refineValues(_instance);
|
|
1554
|
-
}
|
|
1555
|
-
/**
|
|
1556
|
-
* Serializes a message to binary format using provided binary reader
|
|
1557
|
-
* @param _instance message instance
|
|
1558
|
-
* @param _writer binary writer instance
|
|
1559
|
-
*/
|
|
1560
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
1561
|
-
if (_instance.results && _instance.results.length) {
|
|
1562
|
-
_writer.writeRepeatedMessage(1, _instance.results, ResultRaw.serializeBinaryToWriter);
|
|
1563
|
-
}
|
|
1564
|
-
}
|
|
1565
|
-
/**
|
|
1566
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1567
|
-
* @param _value initial values object or instance of CreateResultsMetaDataResponse to deeply clone from
|
|
1568
|
-
*/
|
|
1569
|
-
constructor(_value) {
|
|
1570
|
-
_value = _value || {};
|
|
1571
|
-
this.results = (_value.results || []).map(m => new ResultRaw(m));
|
|
1572
|
-
CreateResultsMetaDataResponse.refineValues(this);
|
|
1573
|
-
}
|
|
1574
|
-
get results() {
|
|
1575
|
-
return this._results;
|
|
1576
|
-
}
|
|
1577
|
-
set results(value) {
|
|
1578
|
-
this._results = value;
|
|
1579
|
-
}
|
|
1580
|
-
/**
|
|
1581
|
-
* Serialize message to binary data
|
|
1582
|
-
* @param instance message instance
|
|
1583
|
-
*/
|
|
1584
|
-
serializeBinary() {
|
|
1585
|
-
const writer = new BinaryWriter();
|
|
1586
|
-
CreateResultsMetaDataResponse.serializeBinaryToWriter(this, writer);
|
|
1587
|
-
return writer.getResultBuffer();
|
|
1588
|
-
}
|
|
1589
|
-
/**
|
|
1590
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1591
|
-
*/
|
|
1592
|
-
toObject() {
|
|
1593
|
-
return {
|
|
1594
|
-
results: (this.results || []).map(m => m.toObject())
|
|
1595
|
-
};
|
|
1596
|
-
}
|
|
1597
|
-
/**
|
|
1598
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1599
|
-
*/
|
|
1600
|
-
toJSON() {
|
|
1601
|
-
return this.toObject();
|
|
1602
|
-
}
|
|
1603
|
-
/**
|
|
1604
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1605
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1606
|
-
* 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
|
|
1607
|
-
*/
|
|
1608
|
-
toProtobufJSON(
|
|
1609
|
-
// @ts-ignore
|
|
1610
|
-
options) {
|
|
1611
|
-
return {
|
|
1612
|
-
results: (this.results || []).map(m => m.toProtobufJSON(options))
|
|
1613
|
-
};
|
|
1614
|
-
}
|
|
1615
|
-
}
|
|
1616
|
-
/**
|
|
1617
|
-
* Message implementation for armonik.api.grpc.v1.results.CreateResultsRequest
|
|
1618
|
-
*/
|
|
1619
|
-
export class CreateResultsRequest {
|
|
1620
|
-
static { this.id = 'armonik.api.grpc.v1.results.CreateResultsRequest'; }
|
|
1621
|
-
/**
|
|
1622
|
-
* Deserialize binary data to message
|
|
1623
|
-
* @param instance message instance
|
|
1624
|
-
*/
|
|
1625
|
-
static deserializeBinary(bytes) {
|
|
1626
|
-
const instance = new CreateResultsRequest();
|
|
1627
|
-
CreateResultsRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1628
|
-
return instance;
|
|
1629
|
-
}
|
|
1630
|
-
/**
|
|
1631
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1632
|
-
* @param _instance message instance
|
|
1633
|
-
*/
|
|
1634
|
-
static refineValues(_instance) {
|
|
1635
|
-
_instance.results = _instance.results || [];
|
|
1636
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
1637
|
-
}
|
|
1638
|
-
/**
|
|
1639
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1640
|
-
* @param _instance message instance
|
|
1641
|
-
* @param _reader binary reader instance
|
|
1642
|
-
*/
|
|
1643
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1644
|
-
while (_reader.nextField()) {
|
|
1645
|
-
if (_reader.isEndGroup())
|
|
1646
|
-
break;
|
|
1647
|
-
switch (_reader.getFieldNumber()) {
|
|
1648
|
-
case 1:
|
|
1649
|
-
const messageInitializer1 = new CreateResultsRequest.ResultCreate();
|
|
1650
|
-
_reader.readMessage(messageInitializer1, CreateResultsRequest.ResultCreate.deserializeBinaryFromReader);
|
|
1651
|
-
(_instance.results = _instance.results || []).push(messageInitializer1);
|
|
1652
|
-
break;
|
|
1653
|
-
case 2:
|
|
1654
|
-
_instance.sessionId = _reader.readString();
|
|
1655
|
-
break;
|
|
1656
|
-
default:
|
|
1657
|
-
_reader.skipField();
|
|
1658
|
-
}
|
|
1659
|
-
}
|
|
1660
|
-
CreateResultsRequest.refineValues(_instance);
|
|
1661
|
-
}
|
|
1662
|
-
/**
|
|
1663
|
-
* Serializes a message to binary format using provided binary reader
|
|
1664
|
-
* @param _instance message instance
|
|
1665
|
-
* @param _writer binary writer instance
|
|
1666
|
-
*/
|
|
1667
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
1668
|
-
if (_instance.results && _instance.results.length) {
|
|
1669
|
-
_writer.writeRepeatedMessage(1, _instance.results, CreateResultsRequest.ResultCreate.serializeBinaryToWriter);
|
|
1670
|
-
}
|
|
1671
|
-
if (_instance.sessionId) {
|
|
1672
|
-
_writer.writeString(2, _instance.sessionId);
|
|
1673
|
-
}
|
|
1674
|
-
}
|
|
1675
|
-
/**
|
|
1676
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1677
|
-
* @param _value initial values object or instance of CreateResultsRequest to deeply clone from
|
|
1678
|
-
*/
|
|
1679
|
-
constructor(_value) {
|
|
1680
|
-
_value = _value || {};
|
|
1681
|
-
this.results = (_value.results || []).map(m => new CreateResultsRequest.ResultCreate(m));
|
|
1682
|
-
this.sessionId = _value.sessionId;
|
|
1683
|
-
CreateResultsRequest.refineValues(this);
|
|
1684
|
-
}
|
|
1685
|
-
get results() {
|
|
1686
|
-
return this._results;
|
|
1687
|
-
}
|
|
1688
|
-
set results(value) {
|
|
1689
|
-
this._results = value;
|
|
1690
|
-
}
|
|
1691
|
-
get sessionId() {
|
|
1692
|
-
return this._sessionId;
|
|
1693
|
-
}
|
|
1694
|
-
set sessionId(value) {
|
|
1695
|
-
this._sessionId = value;
|
|
1696
|
-
}
|
|
1697
|
-
/**
|
|
1698
|
-
* Serialize message to binary data
|
|
1699
|
-
* @param instance message instance
|
|
1700
|
-
*/
|
|
1701
|
-
serializeBinary() {
|
|
1702
|
-
const writer = new BinaryWriter();
|
|
1703
|
-
CreateResultsRequest.serializeBinaryToWriter(this, writer);
|
|
1704
|
-
return writer.getResultBuffer();
|
|
1705
|
-
}
|
|
1706
|
-
/**
|
|
1707
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1708
|
-
*/
|
|
1709
|
-
toObject() {
|
|
1710
|
-
return {
|
|
1711
|
-
results: (this.results || []).map(m => m.toObject()),
|
|
1712
|
-
sessionId: this.sessionId
|
|
1713
|
-
};
|
|
1714
|
-
}
|
|
1715
|
-
/**
|
|
1716
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1717
|
-
*/
|
|
1718
|
-
toJSON() {
|
|
1719
|
-
return this.toObject();
|
|
1720
|
-
}
|
|
1721
|
-
/**
|
|
1722
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1723
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1724
|
-
* 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
|
|
1725
|
-
*/
|
|
1726
|
-
toProtobufJSON(
|
|
1727
|
-
// @ts-ignore
|
|
1728
|
-
options) {
|
|
1729
|
-
return {
|
|
1730
|
-
results: (this.results || []).map(m => m.toProtobufJSON(options)),
|
|
1731
|
-
sessionId: this.sessionId
|
|
1732
|
-
};
|
|
1733
|
-
}
|
|
1734
|
-
}
|
|
1735
|
-
(function (CreateResultsRequest) {
|
|
1736
|
-
/**
|
|
1737
|
-
* Message implementation for armonik.api.grpc.v1.results.CreateResultsRequest.ResultCreate
|
|
1738
|
-
*/
|
|
1739
|
-
class ResultCreate {
|
|
1740
|
-
static { this.id = 'armonik.api.grpc.v1.results.CreateResultsRequest.ResultCreate'; }
|
|
1741
|
-
/**
|
|
1742
|
-
* Deserialize binary data to message
|
|
1743
|
-
* @param instance message instance
|
|
1744
|
-
*/
|
|
1745
|
-
static deserializeBinary(bytes) {
|
|
1746
|
-
const instance = new ResultCreate();
|
|
1747
|
-
ResultCreate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1748
|
-
return instance;
|
|
1749
|
-
}
|
|
1750
|
-
/**
|
|
1751
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1752
|
-
* @param _instance message instance
|
|
1753
|
-
*/
|
|
1754
|
-
static refineValues(_instance) {
|
|
1755
|
-
_instance.name = _instance.name || '';
|
|
1756
|
-
_instance.data = _instance.data || new Uint8Array();
|
|
1757
|
-
_instance.manualDeletion = _instance.manualDeletion || false;
|
|
1758
|
-
}
|
|
1759
|
-
/**
|
|
1760
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1761
|
-
* @param _instance message instance
|
|
1762
|
-
* @param _reader binary reader instance
|
|
1763
|
-
*/
|
|
1764
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1765
|
-
while (_reader.nextField()) {
|
|
1766
|
-
if (_reader.isEndGroup())
|
|
1767
|
-
break;
|
|
1768
|
-
switch (_reader.getFieldNumber()) {
|
|
1769
|
-
case 1:
|
|
1770
|
-
_instance.name = _reader.readString();
|
|
1771
|
-
break;
|
|
1772
|
-
case 2:
|
|
1773
|
-
_instance.data = _reader.readBytes();
|
|
1774
|
-
break;
|
|
1775
|
-
case 3:
|
|
1776
|
-
_instance.manualDeletion = _reader.readBool();
|
|
1777
|
-
break;
|
|
1778
|
-
default:
|
|
1779
|
-
_reader.skipField();
|
|
1780
|
-
}
|
|
1781
|
-
}
|
|
1782
|
-
ResultCreate.refineValues(_instance);
|
|
1783
|
-
}
|
|
1784
|
-
/**
|
|
1785
|
-
* Serializes a message to binary format using provided binary reader
|
|
1786
|
-
* @param _instance message instance
|
|
1787
|
-
* @param _writer binary writer instance
|
|
1788
|
-
*/
|
|
1789
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
1790
|
-
if (_instance.name) {
|
|
1791
|
-
_writer.writeString(1, _instance.name);
|
|
1792
|
-
}
|
|
1793
|
-
if (_instance.data && _instance.data.length) {
|
|
1794
|
-
_writer.writeBytes(2, _instance.data);
|
|
1795
|
-
}
|
|
1796
|
-
if (_instance.manualDeletion) {
|
|
1797
|
-
_writer.writeBool(3, _instance.manualDeletion);
|
|
1798
|
-
}
|
|
1799
|
-
}
|
|
1800
|
-
/**
|
|
1801
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1802
|
-
* @param _value initial values object or instance of ResultCreate to deeply clone from
|
|
1803
|
-
*/
|
|
1804
|
-
constructor(_value) {
|
|
1805
|
-
_value = _value || {};
|
|
1806
|
-
this.name = _value.name;
|
|
1807
|
-
this.data = _value.data;
|
|
1808
|
-
this.manualDeletion = _value.manualDeletion;
|
|
1809
|
-
ResultCreate.refineValues(this);
|
|
1810
|
-
}
|
|
1811
|
-
get name() {
|
|
1812
|
-
return this._name;
|
|
1813
|
-
}
|
|
1814
|
-
set name(value) {
|
|
1815
|
-
this._name = value;
|
|
1816
|
-
}
|
|
1817
|
-
get data() {
|
|
1818
|
-
return this._data;
|
|
1819
|
-
}
|
|
1820
|
-
set data(value) {
|
|
1821
|
-
this._data = value;
|
|
1822
|
-
}
|
|
1823
|
-
get manualDeletion() {
|
|
1824
|
-
return this._manualDeletion;
|
|
1825
|
-
}
|
|
1826
|
-
set manualDeletion(value) {
|
|
1827
|
-
this._manualDeletion = value;
|
|
1828
|
-
}
|
|
1829
|
-
/**
|
|
1830
|
-
* Serialize message to binary data
|
|
1831
|
-
* @param instance message instance
|
|
1832
|
-
*/
|
|
1833
|
-
serializeBinary() {
|
|
1834
|
-
const writer = new BinaryWriter();
|
|
1835
|
-
ResultCreate.serializeBinaryToWriter(this, writer);
|
|
1836
|
-
return writer.getResultBuffer();
|
|
1837
|
-
}
|
|
1838
|
-
/**
|
|
1839
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1840
|
-
*/
|
|
1841
|
-
toObject() {
|
|
1842
|
-
return {
|
|
1843
|
-
name: this.name,
|
|
1844
|
-
data: this.data ? this.data.subarray(0) : new Uint8Array(),
|
|
1845
|
-
manualDeletion: this.manualDeletion
|
|
1846
|
-
};
|
|
1847
|
-
}
|
|
1848
|
-
/**
|
|
1849
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1850
|
-
*/
|
|
1851
|
-
toJSON() {
|
|
1852
|
-
return this.toObject();
|
|
1853
|
-
}
|
|
1854
|
-
/**
|
|
1855
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1856
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1857
|
-
* 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
|
|
1858
|
-
*/
|
|
1859
|
-
toProtobufJSON(
|
|
1860
|
-
// @ts-ignore
|
|
1861
|
-
options) {
|
|
1862
|
-
return {
|
|
1863
|
-
name: this.name,
|
|
1864
|
-
data: this.data ? uint8ArrayToBase64(this.data) : '',
|
|
1865
|
-
manualDeletion: this.manualDeletion
|
|
1866
|
-
};
|
|
1867
|
-
}
|
|
1868
|
-
}
|
|
1869
|
-
CreateResultsRequest.ResultCreate = ResultCreate;
|
|
1870
|
-
})(CreateResultsRequest || (CreateResultsRequest = {}));
|
|
1871
|
-
/**
|
|
1872
|
-
* Message implementation for armonik.api.grpc.v1.results.CreateResultsResponse
|
|
1873
|
-
*/
|
|
1874
|
-
export class CreateResultsResponse {
|
|
1875
|
-
static { this.id = 'armonik.api.grpc.v1.results.CreateResultsResponse'; }
|
|
1876
|
-
/**
|
|
1877
|
-
* Deserialize binary data to message
|
|
1878
|
-
* @param instance message instance
|
|
1879
|
-
*/
|
|
1880
|
-
static deserializeBinary(bytes) {
|
|
1881
|
-
const instance = new CreateResultsResponse();
|
|
1882
|
-
CreateResultsResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1883
|
-
return instance;
|
|
1884
|
-
}
|
|
1885
|
-
/**
|
|
1886
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1887
|
-
* @param _instance message instance
|
|
1888
|
-
*/
|
|
1889
|
-
static refineValues(_instance) {
|
|
1890
|
-
_instance.results = _instance.results || [];
|
|
1891
|
-
}
|
|
1892
|
-
/**
|
|
1893
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1894
|
-
* @param _instance message instance
|
|
1895
|
-
* @param _reader binary reader instance
|
|
1896
|
-
*/
|
|
1897
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1898
|
-
while (_reader.nextField()) {
|
|
1899
|
-
if (_reader.isEndGroup())
|
|
1900
|
-
break;
|
|
1901
|
-
switch (_reader.getFieldNumber()) {
|
|
1902
|
-
case 1:
|
|
1903
|
-
const messageInitializer1 = new ResultRaw();
|
|
1904
|
-
_reader.readMessage(messageInitializer1, ResultRaw.deserializeBinaryFromReader);
|
|
1905
|
-
(_instance.results = _instance.results || []).push(messageInitializer1);
|
|
1906
|
-
break;
|
|
1907
|
-
default:
|
|
1908
|
-
_reader.skipField();
|
|
1909
|
-
}
|
|
1910
|
-
}
|
|
1911
|
-
CreateResultsResponse.refineValues(_instance);
|
|
1912
|
-
}
|
|
1913
|
-
/**
|
|
1914
|
-
* Serializes a message to binary format using provided binary reader
|
|
1915
|
-
* @param _instance message instance
|
|
1916
|
-
* @param _writer binary writer instance
|
|
1917
|
-
*/
|
|
1918
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
1919
|
-
if (_instance.results && _instance.results.length) {
|
|
1920
|
-
_writer.writeRepeatedMessage(1, _instance.results, ResultRaw.serializeBinaryToWriter);
|
|
1921
|
-
}
|
|
1922
|
-
}
|
|
1923
|
-
/**
|
|
1924
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
1925
|
-
* @param _value initial values object or instance of CreateResultsResponse to deeply clone from
|
|
1926
|
-
*/
|
|
1927
|
-
constructor(_value) {
|
|
1928
|
-
_value = _value || {};
|
|
1929
|
-
this.results = (_value.results || []).map(m => new ResultRaw(m));
|
|
1930
|
-
CreateResultsResponse.refineValues(this);
|
|
1931
|
-
}
|
|
1932
|
-
get results() {
|
|
1933
|
-
return this._results;
|
|
1934
|
-
}
|
|
1935
|
-
set results(value) {
|
|
1936
|
-
this._results = value;
|
|
1937
|
-
}
|
|
1938
|
-
/**
|
|
1939
|
-
* Serialize message to binary data
|
|
1940
|
-
* @param instance message instance
|
|
1941
|
-
*/
|
|
1942
|
-
serializeBinary() {
|
|
1943
|
-
const writer = new BinaryWriter();
|
|
1944
|
-
CreateResultsResponse.serializeBinaryToWriter(this, writer);
|
|
1945
|
-
return writer.getResultBuffer();
|
|
1946
|
-
}
|
|
1947
|
-
/**
|
|
1948
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
1949
|
-
*/
|
|
1950
|
-
toObject() {
|
|
1951
|
-
return {
|
|
1952
|
-
results: (this.results || []).map(m => m.toObject())
|
|
1953
|
-
};
|
|
1954
|
-
}
|
|
1955
|
-
/**
|
|
1956
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
1957
|
-
*/
|
|
1958
|
-
toJSON() {
|
|
1959
|
-
return this.toObject();
|
|
1960
|
-
}
|
|
1961
|
-
/**
|
|
1962
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
1963
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
1964
|
-
* 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
|
|
1965
|
-
*/
|
|
1966
|
-
toProtobufJSON(
|
|
1967
|
-
// @ts-ignore
|
|
1968
|
-
options) {
|
|
1969
|
-
return {
|
|
1970
|
-
results: (this.results || []).map(m => m.toProtobufJSON(options))
|
|
1971
|
-
};
|
|
1972
|
-
}
|
|
1973
|
-
}
|
|
1974
|
-
/**
|
|
1975
|
-
* Message implementation for armonik.api.grpc.v1.results.UploadResultDataRequest
|
|
1976
|
-
*/
|
|
1977
|
-
export class UploadResultDataRequest {
|
|
1978
|
-
static { this.id = 'armonik.api.grpc.v1.results.UploadResultDataRequest'; }
|
|
1979
|
-
/**
|
|
1980
|
-
* Deserialize binary data to message
|
|
1981
|
-
* @param instance message instance
|
|
1982
|
-
*/
|
|
1983
|
-
static deserializeBinary(bytes) {
|
|
1984
|
-
const instance = new UploadResultDataRequest();
|
|
1985
|
-
UploadResultDataRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
1986
|
-
return instance;
|
|
1987
|
-
}
|
|
1988
|
-
/**
|
|
1989
|
-
* Check all the properties and set default protobuf values if necessary
|
|
1990
|
-
* @param _instance message instance
|
|
1991
|
-
*/
|
|
1992
|
-
static refineValues(_instance) { }
|
|
1993
|
-
/**
|
|
1994
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
1995
|
-
* @param _instance message instance
|
|
1996
|
-
* @param _reader binary reader instance
|
|
1997
|
-
*/
|
|
1998
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
1999
|
-
while (_reader.nextField()) {
|
|
2000
|
-
if (_reader.isEndGroup())
|
|
2001
|
-
break;
|
|
2002
|
-
switch (_reader.getFieldNumber()) {
|
|
2003
|
-
case 1:
|
|
2004
|
-
_instance.id = new UploadResultDataRequest.ResultIdentifier();
|
|
2005
|
-
_reader.readMessage(_instance.id, UploadResultDataRequest.ResultIdentifier.deserializeBinaryFromReader);
|
|
2006
|
-
break;
|
|
2007
|
-
case 2:
|
|
2008
|
-
_instance.dataChunk = _reader.readBytes();
|
|
2009
|
-
break;
|
|
2010
|
-
default:
|
|
2011
|
-
_reader.skipField();
|
|
2012
|
-
}
|
|
2013
|
-
}
|
|
2014
|
-
UploadResultDataRequest.refineValues(_instance);
|
|
2015
|
-
}
|
|
2016
|
-
/**
|
|
2017
|
-
* Serializes a message to binary format using provided binary reader
|
|
2018
|
-
* @param _instance message instance
|
|
2019
|
-
* @param _writer binary writer instance
|
|
2020
|
-
*/
|
|
2021
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2022
|
-
if (_instance.id) {
|
|
2023
|
-
_writer.writeMessage(1, _instance.id, UploadResultDataRequest.ResultIdentifier.serializeBinaryToWriter);
|
|
2024
|
-
}
|
|
2025
|
-
if (_instance.dataChunk && _instance.dataChunk.length) {
|
|
2026
|
-
_writer.writeBytes(2, _instance.dataChunk);
|
|
2027
|
-
}
|
|
2028
|
-
}
|
|
2029
|
-
/**
|
|
2030
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2031
|
-
* @param _value initial values object or instance of UploadResultDataRequest to deeply clone from
|
|
2032
|
-
*/
|
|
2033
|
-
constructor(_value) {
|
|
2034
|
-
this._type = UploadResultDataRequest.TypeCase.none;
|
|
2035
|
-
_value = _value || {};
|
|
2036
|
-
this.id = _value.id
|
|
2037
|
-
? new UploadResultDataRequest.ResultIdentifier(_value.id)
|
|
2038
|
-
: undefined;
|
|
2039
|
-
this.dataChunk = _value.dataChunk;
|
|
2040
|
-
UploadResultDataRequest.refineValues(this);
|
|
2041
|
-
}
|
|
2042
|
-
get id() {
|
|
2043
|
-
return this._id;
|
|
2044
|
-
}
|
|
2045
|
-
set id(value) {
|
|
2046
|
-
if (value !== undefined && value !== null) {
|
|
2047
|
-
this._dataChunk = undefined;
|
|
2048
|
-
this._type = UploadResultDataRequest.TypeCase.id;
|
|
2049
|
-
}
|
|
2050
|
-
this._id = value;
|
|
2051
|
-
}
|
|
2052
|
-
get dataChunk() {
|
|
2053
|
-
return this._dataChunk;
|
|
2054
|
-
}
|
|
2055
|
-
set dataChunk(value) {
|
|
2056
|
-
if (value !== undefined && value !== null) {
|
|
2057
|
-
this._id = undefined;
|
|
2058
|
-
this._type = UploadResultDataRequest.TypeCase.dataChunk;
|
|
2059
|
-
}
|
|
2060
|
-
this._dataChunk = value;
|
|
2061
|
-
}
|
|
2062
|
-
get type() {
|
|
2063
|
-
return this._type;
|
|
2064
|
-
}
|
|
2065
|
-
/**
|
|
2066
|
-
* Serialize message to binary data
|
|
2067
|
-
* @param instance message instance
|
|
2068
|
-
*/
|
|
2069
|
-
serializeBinary() {
|
|
2070
|
-
const writer = new BinaryWriter();
|
|
2071
|
-
UploadResultDataRequest.serializeBinaryToWriter(this, writer);
|
|
2072
|
-
return writer.getResultBuffer();
|
|
2073
|
-
}
|
|
2074
|
-
/**
|
|
2075
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2076
|
-
*/
|
|
2077
|
-
toObject() {
|
|
2078
|
-
return {
|
|
2079
|
-
id: this.id ? this.id.toObject() : undefined,
|
|
2080
|
-
dataChunk: this.dataChunk ? this.dataChunk.subarray(0) : new Uint8Array()
|
|
2081
|
-
};
|
|
2082
|
-
}
|
|
2083
|
-
/**
|
|
2084
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2085
|
-
*/
|
|
2086
|
-
toJSON() {
|
|
2087
|
-
return this.toObject();
|
|
2088
|
-
}
|
|
2089
|
-
/**
|
|
2090
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2091
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2092
|
-
* 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
|
|
2093
|
-
*/
|
|
2094
|
-
toProtobufJSON(
|
|
2095
|
-
// @ts-ignore
|
|
2096
|
-
options) {
|
|
2097
|
-
return {
|
|
2098
|
-
id: this.id ? this.id.toProtobufJSON(options) : null,
|
|
2099
|
-
dataChunk: this.dataChunk ? uint8ArrayToBase64(this.dataChunk) : ''
|
|
2100
|
-
};
|
|
2101
|
-
}
|
|
2102
|
-
}
|
|
2103
|
-
(function (UploadResultDataRequest) {
|
|
2104
|
-
let TypeCase;
|
|
2105
|
-
(function (TypeCase) {
|
|
2106
|
-
TypeCase[TypeCase["none"] = 0] = "none";
|
|
2107
|
-
TypeCase[TypeCase["id"] = 1] = "id";
|
|
2108
|
-
TypeCase[TypeCase["dataChunk"] = 2] = "dataChunk";
|
|
2109
|
-
})(TypeCase = UploadResultDataRequest.TypeCase || (UploadResultDataRequest.TypeCase = {}));
|
|
2110
|
-
/**
|
|
2111
|
-
* Message implementation for armonik.api.grpc.v1.results.UploadResultDataRequest.ResultIdentifier
|
|
2112
|
-
*/
|
|
2113
|
-
class ResultIdentifier {
|
|
2114
|
-
static { this.id = 'armonik.api.grpc.v1.results.UploadResultDataRequest.ResultIdentifier'; }
|
|
2115
|
-
/**
|
|
2116
|
-
* Deserialize binary data to message
|
|
2117
|
-
* @param instance message instance
|
|
2118
|
-
*/
|
|
2119
|
-
static deserializeBinary(bytes) {
|
|
2120
|
-
const instance = new ResultIdentifier();
|
|
2121
|
-
ResultIdentifier.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2122
|
-
return instance;
|
|
2123
|
-
}
|
|
2124
|
-
/**
|
|
2125
|
-
* Check all the properties and set default protobuf values if necessary
|
|
2126
|
-
* @param _instance message instance
|
|
2127
|
-
*/
|
|
2128
|
-
static refineValues(_instance) {
|
|
2129
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
2130
|
-
_instance.resultId = _instance.resultId || '';
|
|
2131
|
-
}
|
|
2132
|
-
/**
|
|
2133
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2134
|
-
* @param _instance message instance
|
|
2135
|
-
* @param _reader binary reader instance
|
|
2136
|
-
*/
|
|
2137
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2138
|
-
while (_reader.nextField()) {
|
|
2139
|
-
if (_reader.isEndGroup())
|
|
2140
|
-
break;
|
|
2141
|
-
switch (_reader.getFieldNumber()) {
|
|
2142
|
-
case 1:
|
|
2143
|
-
_instance.sessionId = _reader.readString();
|
|
2144
|
-
break;
|
|
2145
|
-
case 2:
|
|
2146
|
-
_instance.resultId = _reader.readString();
|
|
2147
|
-
break;
|
|
2148
|
-
default:
|
|
2149
|
-
_reader.skipField();
|
|
2150
|
-
}
|
|
2151
|
-
}
|
|
2152
|
-
ResultIdentifier.refineValues(_instance);
|
|
2153
|
-
}
|
|
2154
|
-
/**
|
|
2155
|
-
* Serializes a message to binary format using provided binary reader
|
|
2156
|
-
* @param _instance message instance
|
|
2157
|
-
* @param _writer binary writer instance
|
|
2158
|
-
*/
|
|
2159
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2160
|
-
if (_instance.sessionId) {
|
|
2161
|
-
_writer.writeString(1, _instance.sessionId);
|
|
2162
|
-
}
|
|
2163
|
-
if (_instance.resultId) {
|
|
2164
|
-
_writer.writeString(2, _instance.resultId);
|
|
2165
|
-
}
|
|
2166
|
-
}
|
|
2167
|
-
/**
|
|
2168
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2169
|
-
* @param _value initial values object or instance of ResultIdentifier to deeply clone from
|
|
2170
|
-
*/
|
|
2171
|
-
constructor(_value) {
|
|
2172
|
-
_value = _value || {};
|
|
2173
|
-
this.sessionId = _value.sessionId;
|
|
2174
|
-
this.resultId = _value.resultId;
|
|
2175
|
-
ResultIdentifier.refineValues(this);
|
|
2176
|
-
}
|
|
2177
|
-
get sessionId() {
|
|
2178
|
-
return this._sessionId;
|
|
2179
|
-
}
|
|
2180
|
-
set sessionId(value) {
|
|
2181
|
-
this._sessionId = value;
|
|
2182
|
-
}
|
|
2183
|
-
get resultId() {
|
|
2184
|
-
return this._resultId;
|
|
2185
|
-
}
|
|
2186
|
-
set resultId(value) {
|
|
2187
|
-
this._resultId = value;
|
|
2188
|
-
}
|
|
2189
|
-
/**
|
|
2190
|
-
* Serialize message to binary data
|
|
2191
|
-
* @param instance message instance
|
|
2192
|
-
*/
|
|
2193
|
-
serializeBinary() {
|
|
2194
|
-
const writer = new BinaryWriter();
|
|
2195
|
-
ResultIdentifier.serializeBinaryToWriter(this, writer);
|
|
2196
|
-
return writer.getResultBuffer();
|
|
2197
|
-
}
|
|
2198
|
-
/**
|
|
2199
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2200
|
-
*/
|
|
2201
|
-
toObject() {
|
|
2202
|
-
return {
|
|
2203
|
-
sessionId: this.sessionId,
|
|
2204
|
-
resultId: this.resultId
|
|
2205
|
-
};
|
|
2206
|
-
}
|
|
2207
|
-
/**
|
|
2208
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2209
|
-
*/
|
|
2210
|
-
toJSON() {
|
|
2211
|
-
return this.toObject();
|
|
2212
|
-
}
|
|
2213
|
-
/**
|
|
2214
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2215
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2216
|
-
* 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
|
|
2217
|
-
*/
|
|
2218
|
-
toProtobufJSON(
|
|
2219
|
-
// @ts-ignore
|
|
2220
|
-
options) {
|
|
2221
|
-
return {
|
|
2222
|
-
sessionId: this.sessionId,
|
|
2223
|
-
resultId: this.resultId
|
|
2224
|
-
};
|
|
2225
|
-
}
|
|
2226
|
-
}
|
|
2227
|
-
UploadResultDataRequest.ResultIdentifier = ResultIdentifier;
|
|
2228
|
-
})(UploadResultDataRequest || (UploadResultDataRequest = {}));
|
|
2229
|
-
/**
|
|
2230
|
-
* Message implementation for armonik.api.grpc.v1.results.UploadResultDataResponse
|
|
2231
|
-
*/
|
|
2232
|
-
export class UploadResultDataResponse {
|
|
2233
|
-
static { this.id = 'armonik.api.grpc.v1.results.UploadResultDataResponse'; }
|
|
2234
|
-
/**
|
|
2235
|
-
* Deserialize binary data to message
|
|
2236
|
-
* @param instance message instance
|
|
2237
|
-
*/
|
|
2238
|
-
static deserializeBinary(bytes) {
|
|
2239
|
-
const instance = new UploadResultDataResponse();
|
|
2240
|
-
UploadResultDataResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2241
|
-
return instance;
|
|
2242
|
-
}
|
|
2243
|
-
/**
|
|
2244
|
-
* Check all the properties and set default protobuf values if necessary
|
|
2245
|
-
* @param _instance message instance
|
|
2246
|
-
*/
|
|
2247
|
-
static refineValues(_instance) {
|
|
2248
|
-
_instance.result = _instance.result || undefined;
|
|
2249
|
-
}
|
|
2250
|
-
/**
|
|
2251
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2252
|
-
* @param _instance message instance
|
|
2253
|
-
* @param _reader binary reader instance
|
|
2254
|
-
*/
|
|
2255
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2256
|
-
while (_reader.nextField()) {
|
|
2257
|
-
if (_reader.isEndGroup())
|
|
2258
|
-
break;
|
|
2259
|
-
switch (_reader.getFieldNumber()) {
|
|
2260
|
-
case 1:
|
|
2261
|
-
_instance.result = new ResultRaw();
|
|
2262
|
-
_reader.readMessage(_instance.result, ResultRaw.deserializeBinaryFromReader);
|
|
2263
|
-
break;
|
|
2264
|
-
default:
|
|
2265
|
-
_reader.skipField();
|
|
2266
|
-
}
|
|
2267
|
-
}
|
|
2268
|
-
UploadResultDataResponse.refineValues(_instance);
|
|
2269
|
-
}
|
|
2270
|
-
/**
|
|
2271
|
-
* Serializes a message to binary format using provided binary reader
|
|
2272
|
-
* @param _instance message instance
|
|
2273
|
-
* @param _writer binary writer instance
|
|
2274
|
-
*/
|
|
2275
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2276
|
-
if (_instance.result) {
|
|
2277
|
-
_writer.writeMessage(1, _instance.result, ResultRaw.serializeBinaryToWriter);
|
|
2278
|
-
}
|
|
2279
|
-
}
|
|
2280
|
-
/**
|
|
2281
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2282
|
-
* @param _value initial values object or instance of UploadResultDataResponse to deeply clone from
|
|
2283
|
-
*/
|
|
2284
|
-
constructor(_value) {
|
|
2285
|
-
_value = _value || {};
|
|
2286
|
-
this.result = _value.result ? new ResultRaw(_value.result) : undefined;
|
|
2287
|
-
UploadResultDataResponse.refineValues(this);
|
|
2288
|
-
}
|
|
2289
|
-
get result() {
|
|
2290
|
-
return this._result;
|
|
2291
|
-
}
|
|
2292
|
-
set result(value) {
|
|
2293
|
-
this._result = value;
|
|
2294
|
-
}
|
|
2295
|
-
/**
|
|
2296
|
-
* Serialize message to binary data
|
|
2297
|
-
* @param instance message instance
|
|
2298
|
-
*/
|
|
2299
|
-
serializeBinary() {
|
|
2300
|
-
const writer = new BinaryWriter();
|
|
2301
|
-
UploadResultDataResponse.serializeBinaryToWriter(this, writer);
|
|
2302
|
-
return writer.getResultBuffer();
|
|
2303
|
-
}
|
|
2304
|
-
/**
|
|
2305
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2306
|
-
*/
|
|
2307
|
-
toObject() {
|
|
2308
|
-
return {
|
|
2309
|
-
result: this.result ? this.result.toObject() : undefined
|
|
2310
|
-
};
|
|
2311
|
-
}
|
|
2312
|
-
/**
|
|
2313
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2314
|
-
*/
|
|
2315
|
-
toJSON() {
|
|
2316
|
-
return this.toObject();
|
|
2317
|
-
}
|
|
2318
|
-
/**
|
|
2319
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2320
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2321
|
-
* 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
|
|
2322
|
-
*/
|
|
2323
|
-
toProtobufJSON(
|
|
2324
|
-
// @ts-ignore
|
|
2325
|
-
options) {
|
|
2326
|
-
return {
|
|
2327
|
-
result: this.result ? this.result.toProtobufJSON(options) : null
|
|
2328
|
-
};
|
|
2329
|
-
}
|
|
2330
|
-
}
|
|
2331
|
-
/**
|
|
2332
|
-
* Message implementation for armonik.api.grpc.v1.results.ResultsServiceConfigurationResponse
|
|
2333
|
-
*/
|
|
2334
|
-
export class ResultsServiceConfigurationResponse {
|
|
2335
|
-
static { this.id = 'armonik.api.grpc.v1.results.ResultsServiceConfigurationResponse'; }
|
|
2336
|
-
/**
|
|
2337
|
-
* Deserialize binary data to message
|
|
2338
|
-
* @param instance message instance
|
|
2339
|
-
*/
|
|
2340
|
-
static deserializeBinary(bytes) {
|
|
2341
|
-
const instance = new ResultsServiceConfigurationResponse();
|
|
2342
|
-
ResultsServiceConfigurationResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2343
|
-
return instance;
|
|
2344
|
-
}
|
|
2345
|
-
/**
|
|
2346
|
-
* Check all the properties and set default protobuf values if necessary
|
|
2347
|
-
* @param _instance message instance
|
|
2348
|
-
*/
|
|
2349
|
-
static refineValues(_instance) {
|
|
2350
|
-
_instance.dataChunkMaxSize = _instance.dataChunkMaxSize || 0;
|
|
2351
|
-
}
|
|
2352
|
-
/**
|
|
2353
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2354
|
-
* @param _instance message instance
|
|
2355
|
-
* @param _reader binary reader instance
|
|
2356
|
-
*/
|
|
2357
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2358
|
-
while (_reader.nextField()) {
|
|
2359
|
-
if (_reader.isEndGroup())
|
|
2360
|
-
break;
|
|
2361
|
-
switch (_reader.getFieldNumber()) {
|
|
2362
|
-
case 1:
|
|
2363
|
-
_instance.dataChunkMaxSize = _reader.readInt32();
|
|
2364
|
-
break;
|
|
2365
|
-
default:
|
|
2366
|
-
_reader.skipField();
|
|
2367
|
-
}
|
|
2368
|
-
}
|
|
2369
|
-
ResultsServiceConfigurationResponse.refineValues(_instance);
|
|
2370
|
-
}
|
|
2371
|
-
/**
|
|
2372
|
-
* Serializes a message to binary format using provided binary reader
|
|
2373
|
-
* @param _instance message instance
|
|
2374
|
-
* @param _writer binary writer instance
|
|
2375
|
-
*/
|
|
2376
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2377
|
-
if (_instance.dataChunkMaxSize) {
|
|
2378
|
-
_writer.writeInt32(1, _instance.dataChunkMaxSize);
|
|
2379
|
-
}
|
|
2380
|
-
}
|
|
2381
|
-
/**
|
|
2382
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2383
|
-
* @param _value initial values object or instance of ResultsServiceConfigurationResponse to deeply clone from
|
|
2384
|
-
*/
|
|
2385
|
-
constructor(_value) {
|
|
2386
|
-
_value = _value || {};
|
|
2387
|
-
this.dataChunkMaxSize = _value.dataChunkMaxSize;
|
|
2388
|
-
ResultsServiceConfigurationResponse.refineValues(this);
|
|
2389
|
-
}
|
|
2390
|
-
get dataChunkMaxSize() {
|
|
2391
|
-
return this._dataChunkMaxSize;
|
|
2392
|
-
}
|
|
2393
|
-
set dataChunkMaxSize(value) {
|
|
2394
|
-
this._dataChunkMaxSize = value;
|
|
2395
|
-
}
|
|
2396
|
-
/**
|
|
2397
|
-
* Serialize message to binary data
|
|
2398
|
-
* @param instance message instance
|
|
2399
|
-
*/
|
|
2400
|
-
serializeBinary() {
|
|
2401
|
-
const writer = new BinaryWriter();
|
|
2402
|
-
ResultsServiceConfigurationResponse.serializeBinaryToWriter(this, writer);
|
|
2403
|
-
return writer.getResultBuffer();
|
|
2404
|
-
}
|
|
2405
|
-
/**
|
|
2406
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2407
|
-
*/
|
|
2408
|
-
toObject() {
|
|
2409
|
-
return {
|
|
2410
|
-
dataChunkMaxSize: this.dataChunkMaxSize
|
|
2411
|
-
};
|
|
2412
|
-
}
|
|
2413
|
-
/**
|
|
2414
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2415
|
-
*/
|
|
2416
|
-
toJSON() {
|
|
2417
|
-
return this.toObject();
|
|
2418
|
-
}
|
|
2419
|
-
/**
|
|
2420
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2421
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2422
|
-
* 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
|
|
2423
|
-
*/
|
|
2424
|
-
toProtobufJSON(
|
|
2425
|
-
// @ts-ignore
|
|
2426
|
-
options) {
|
|
2427
|
-
return {
|
|
2428
|
-
dataChunkMaxSize: this.dataChunkMaxSize
|
|
2429
|
-
};
|
|
2430
|
-
}
|
|
2431
|
-
}
|
|
2432
|
-
/**
|
|
2433
|
-
* Message implementation for armonik.api.grpc.v1.results.DownloadResultDataRequest
|
|
2434
|
-
*/
|
|
2435
|
-
export class DownloadResultDataRequest {
|
|
2436
|
-
static { this.id = 'armonik.api.grpc.v1.results.DownloadResultDataRequest'; }
|
|
2437
|
-
/**
|
|
2438
|
-
* Deserialize binary data to message
|
|
2439
|
-
* @param instance message instance
|
|
2440
|
-
*/
|
|
2441
|
-
static deserializeBinary(bytes) {
|
|
2442
|
-
const instance = new DownloadResultDataRequest();
|
|
2443
|
-
DownloadResultDataRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2444
|
-
return instance;
|
|
2445
|
-
}
|
|
2446
|
-
/**
|
|
2447
|
-
* Check all the properties and set default protobuf values if necessary
|
|
2448
|
-
* @param _instance message instance
|
|
2449
|
-
*/
|
|
2450
|
-
static refineValues(_instance) {
|
|
2451
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
2452
|
-
_instance.resultId = _instance.resultId || '';
|
|
2453
|
-
}
|
|
2454
|
-
/**
|
|
2455
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2456
|
-
* @param _instance message instance
|
|
2457
|
-
* @param _reader binary reader instance
|
|
2458
|
-
*/
|
|
2459
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2460
|
-
while (_reader.nextField()) {
|
|
2461
|
-
if (_reader.isEndGroup())
|
|
2462
|
-
break;
|
|
2463
|
-
switch (_reader.getFieldNumber()) {
|
|
2464
|
-
case 1:
|
|
2465
|
-
_instance.sessionId = _reader.readString();
|
|
2466
|
-
break;
|
|
2467
|
-
case 2:
|
|
2468
|
-
_instance.resultId = _reader.readString();
|
|
2469
|
-
break;
|
|
2470
|
-
default:
|
|
2471
|
-
_reader.skipField();
|
|
2472
|
-
}
|
|
2473
|
-
}
|
|
2474
|
-
DownloadResultDataRequest.refineValues(_instance);
|
|
2475
|
-
}
|
|
2476
|
-
/**
|
|
2477
|
-
* Serializes a message to binary format using provided binary reader
|
|
2478
|
-
* @param _instance message instance
|
|
2479
|
-
* @param _writer binary writer instance
|
|
2480
|
-
*/
|
|
2481
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2482
|
-
if (_instance.sessionId) {
|
|
2483
|
-
_writer.writeString(1, _instance.sessionId);
|
|
2484
|
-
}
|
|
2485
|
-
if (_instance.resultId) {
|
|
2486
|
-
_writer.writeString(2, _instance.resultId);
|
|
2487
|
-
}
|
|
2488
|
-
}
|
|
2489
|
-
/**
|
|
2490
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2491
|
-
* @param _value initial values object or instance of DownloadResultDataRequest to deeply clone from
|
|
2492
|
-
*/
|
|
2493
|
-
constructor(_value) {
|
|
2494
|
-
_value = _value || {};
|
|
2495
|
-
this.sessionId = _value.sessionId;
|
|
2496
|
-
this.resultId = _value.resultId;
|
|
2497
|
-
DownloadResultDataRequest.refineValues(this);
|
|
2498
|
-
}
|
|
2499
|
-
get sessionId() {
|
|
2500
|
-
return this._sessionId;
|
|
2501
|
-
}
|
|
2502
|
-
set sessionId(value) {
|
|
2503
|
-
this._sessionId = value;
|
|
2504
|
-
}
|
|
2505
|
-
get resultId() {
|
|
2506
|
-
return this._resultId;
|
|
2507
|
-
}
|
|
2508
|
-
set resultId(value) {
|
|
2509
|
-
this._resultId = value;
|
|
2510
|
-
}
|
|
2511
|
-
/**
|
|
2512
|
-
* Serialize message to binary data
|
|
2513
|
-
* @param instance message instance
|
|
2514
|
-
*/
|
|
2515
|
-
serializeBinary() {
|
|
2516
|
-
const writer = new BinaryWriter();
|
|
2517
|
-
DownloadResultDataRequest.serializeBinaryToWriter(this, writer);
|
|
2518
|
-
return writer.getResultBuffer();
|
|
2519
|
-
}
|
|
2520
|
-
/**
|
|
2521
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2522
|
-
*/
|
|
2523
|
-
toObject() {
|
|
2524
|
-
return {
|
|
2525
|
-
sessionId: this.sessionId,
|
|
2526
|
-
resultId: this.resultId
|
|
2527
|
-
};
|
|
2528
|
-
}
|
|
2529
|
-
/**
|
|
2530
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2531
|
-
*/
|
|
2532
|
-
toJSON() {
|
|
2533
|
-
return this.toObject();
|
|
2534
|
-
}
|
|
2535
|
-
/**
|
|
2536
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2537
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2538
|
-
* 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
|
|
2539
|
-
*/
|
|
2540
|
-
toProtobufJSON(
|
|
2541
|
-
// @ts-ignore
|
|
2542
|
-
options) {
|
|
2543
|
-
return {
|
|
2544
|
-
sessionId: this.sessionId,
|
|
2545
|
-
resultId: this.resultId
|
|
2546
|
-
};
|
|
2547
|
-
}
|
|
2548
|
-
}
|
|
2549
|
-
/**
|
|
2550
|
-
* Message implementation for armonik.api.grpc.v1.results.DownloadResultDataResponse
|
|
2551
|
-
*/
|
|
2552
|
-
export class DownloadResultDataResponse {
|
|
2553
|
-
static { this.id = 'armonik.api.grpc.v1.results.DownloadResultDataResponse'; }
|
|
2554
|
-
/**
|
|
2555
|
-
* Deserialize binary data to message
|
|
2556
|
-
* @param instance message instance
|
|
2557
|
-
*/
|
|
2558
|
-
static deserializeBinary(bytes) {
|
|
2559
|
-
const instance = new DownloadResultDataResponse();
|
|
2560
|
-
DownloadResultDataResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2561
|
-
return instance;
|
|
2562
|
-
}
|
|
2563
|
-
/**
|
|
2564
|
-
* Check all the properties and set default protobuf values if necessary
|
|
2565
|
-
* @param _instance message instance
|
|
2566
|
-
*/
|
|
2567
|
-
static refineValues(_instance) {
|
|
2568
|
-
_instance.dataChunk = _instance.dataChunk || new Uint8Array();
|
|
2569
|
-
}
|
|
2570
|
-
/**
|
|
2571
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2572
|
-
* @param _instance message instance
|
|
2573
|
-
* @param _reader binary reader instance
|
|
2574
|
-
*/
|
|
2575
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2576
|
-
while (_reader.nextField()) {
|
|
2577
|
-
if (_reader.isEndGroup())
|
|
2578
|
-
break;
|
|
2579
|
-
switch (_reader.getFieldNumber()) {
|
|
2580
|
-
case 1:
|
|
2581
|
-
_instance.dataChunk = _reader.readBytes();
|
|
2582
|
-
break;
|
|
2583
|
-
default:
|
|
2584
|
-
_reader.skipField();
|
|
2585
|
-
}
|
|
2586
|
-
}
|
|
2587
|
-
DownloadResultDataResponse.refineValues(_instance);
|
|
2588
|
-
}
|
|
2589
|
-
/**
|
|
2590
|
-
* Serializes a message to binary format using provided binary reader
|
|
2591
|
-
* @param _instance message instance
|
|
2592
|
-
* @param _writer binary writer instance
|
|
2593
|
-
*/
|
|
2594
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2595
|
-
if (_instance.dataChunk && _instance.dataChunk.length) {
|
|
2596
|
-
_writer.writeBytes(1, _instance.dataChunk);
|
|
2597
|
-
}
|
|
2598
|
-
}
|
|
2599
|
-
/**
|
|
2600
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2601
|
-
* @param _value initial values object or instance of DownloadResultDataResponse to deeply clone from
|
|
2602
|
-
*/
|
|
2603
|
-
constructor(_value) {
|
|
2604
|
-
_value = _value || {};
|
|
2605
|
-
this.dataChunk = _value.dataChunk;
|
|
2606
|
-
DownloadResultDataResponse.refineValues(this);
|
|
2607
|
-
}
|
|
2608
|
-
get dataChunk() {
|
|
2609
|
-
return this._dataChunk;
|
|
2610
|
-
}
|
|
2611
|
-
set dataChunk(value) {
|
|
2612
|
-
this._dataChunk = value;
|
|
2613
|
-
}
|
|
2614
|
-
/**
|
|
2615
|
-
* Serialize message to binary data
|
|
2616
|
-
* @param instance message instance
|
|
2617
|
-
*/
|
|
2618
|
-
serializeBinary() {
|
|
2619
|
-
const writer = new BinaryWriter();
|
|
2620
|
-
DownloadResultDataResponse.serializeBinaryToWriter(this, writer);
|
|
2621
|
-
return writer.getResultBuffer();
|
|
2622
|
-
}
|
|
2623
|
-
/**
|
|
2624
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2625
|
-
*/
|
|
2626
|
-
toObject() {
|
|
2627
|
-
return {
|
|
2628
|
-
dataChunk: this.dataChunk ? this.dataChunk.subarray(0) : new Uint8Array()
|
|
2629
|
-
};
|
|
2630
|
-
}
|
|
2631
|
-
/**
|
|
2632
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2633
|
-
*/
|
|
2634
|
-
toJSON() {
|
|
2635
|
-
return this.toObject();
|
|
2636
|
-
}
|
|
2637
|
-
/**
|
|
2638
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2639
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2640
|
-
* 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
|
|
2641
|
-
*/
|
|
2642
|
-
toProtobufJSON(
|
|
2643
|
-
// @ts-ignore
|
|
2644
|
-
options) {
|
|
2645
|
-
return {
|
|
2646
|
-
dataChunk: this.dataChunk ? uint8ArrayToBase64(this.dataChunk) : ''
|
|
2647
|
-
};
|
|
2648
|
-
}
|
|
2649
|
-
}
|
|
2650
|
-
/**
|
|
2651
|
-
* Message implementation for armonik.api.grpc.v1.results.DeleteResultsDataRequest
|
|
2652
|
-
*/
|
|
2653
|
-
export class DeleteResultsDataRequest {
|
|
2654
|
-
static { this.id = 'armonik.api.grpc.v1.results.DeleteResultsDataRequest'; }
|
|
2655
|
-
/**
|
|
2656
|
-
* Deserialize binary data to message
|
|
2657
|
-
* @param instance message instance
|
|
2658
|
-
*/
|
|
2659
|
-
static deserializeBinary(bytes) {
|
|
2660
|
-
const instance = new DeleteResultsDataRequest();
|
|
2661
|
-
DeleteResultsDataRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2662
|
-
return instance;
|
|
2663
|
-
}
|
|
2664
|
-
/**
|
|
2665
|
-
* Check all the properties and set default protobuf values if necessary
|
|
2666
|
-
* @param _instance message instance
|
|
2667
|
-
*/
|
|
2668
|
-
static refineValues(_instance) {
|
|
2669
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
2670
|
-
_instance.resultId = _instance.resultId || [];
|
|
2671
|
-
}
|
|
2672
|
-
/**
|
|
2673
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2674
|
-
* @param _instance message instance
|
|
2675
|
-
* @param _reader binary reader instance
|
|
2676
|
-
*/
|
|
2677
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2678
|
-
while (_reader.nextField()) {
|
|
2679
|
-
if (_reader.isEndGroup())
|
|
2680
|
-
break;
|
|
2681
|
-
switch (_reader.getFieldNumber()) {
|
|
2682
|
-
case 1:
|
|
2683
|
-
_instance.sessionId = _reader.readString();
|
|
2684
|
-
break;
|
|
2685
|
-
case 2:
|
|
2686
|
-
(_instance.resultId = _instance.resultId || []).push(_reader.readString());
|
|
2687
|
-
break;
|
|
2688
|
-
default:
|
|
2689
|
-
_reader.skipField();
|
|
2690
|
-
}
|
|
2691
|
-
}
|
|
2692
|
-
DeleteResultsDataRequest.refineValues(_instance);
|
|
2693
|
-
}
|
|
2694
|
-
/**
|
|
2695
|
-
* Serializes a message to binary format using provided binary reader
|
|
2696
|
-
* @param _instance message instance
|
|
2697
|
-
* @param _writer binary writer instance
|
|
2698
|
-
*/
|
|
2699
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2700
|
-
if (_instance.sessionId) {
|
|
2701
|
-
_writer.writeString(1, _instance.sessionId);
|
|
2702
|
-
}
|
|
2703
|
-
if (_instance.resultId && _instance.resultId.length) {
|
|
2704
|
-
_writer.writeRepeatedString(2, _instance.resultId);
|
|
2705
|
-
}
|
|
2706
|
-
}
|
|
2707
|
-
/**
|
|
2708
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2709
|
-
* @param _value initial values object or instance of DeleteResultsDataRequest to deeply clone from
|
|
2710
|
-
*/
|
|
2711
|
-
constructor(_value) {
|
|
2712
|
-
_value = _value || {};
|
|
2713
|
-
this.sessionId = _value.sessionId;
|
|
2714
|
-
this.resultId = (_value.resultId || []).slice();
|
|
2715
|
-
DeleteResultsDataRequest.refineValues(this);
|
|
2716
|
-
}
|
|
2717
|
-
get sessionId() {
|
|
2718
|
-
return this._sessionId;
|
|
2719
|
-
}
|
|
2720
|
-
set sessionId(value) {
|
|
2721
|
-
this._sessionId = value;
|
|
2722
|
-
}
|
|
2723
|
-
get resultId() {
|
|
2724
|
-
return this._resultId;
|
|
2725
|
-
}
|
|
2726
|
-
set resultId(value) {
|
|
2727
|
-
this._resultId = value;
|
|
2728
|
-
}
|
|
2729
|
-
/**
|
|
2730
|
-
* Serialize message to binary data
|
|
2731
|
-
* @param instance message instance
|
|
2732
|
-
*/
|
|
2733
|
-
serializeBinary() {
|
|
2734
|
-
const writer = new BinaryWriter();
|
|
2735
|
-
DeleteResultsDataRequest.serializeBinaryToWriter(this, writer);
|
|
2736
|
-
return writer.getResultBuffer();
|
|
2737
|
-
}
|
|
2738
|
-
/**
|
|
2739
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2740
|
-
*/
|
|
2741
|
-
toObject() {
|
|
2742
|
-
return {
|
|
2743
|
-
sessionId: this.sessionId,
|
|
2744
|
-
resultId: (this.resultId || []).slice()
|
|
2745
|
-
};
|
|
2746
|
-
}
|
|
2747
|
-
/**
|
|
2748
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2749
|
-
*/
|
|
2750
|
-
toJSON() {
|
|
2751
|
-
return this.toObject();
|
|
2752
|
-
}
|
|
2753
|
-
/**
|
|
2754
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2755
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2756
|
-
* 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
|
|
2757
|
-
*/
|
|
2758
|
-
toProtobufJSON(
|
|
2759
|
-
// @ts-ignore
|
|
2760
|
-
options) {
|
|
2761
|
-
return {
|
|
2762
|
-
sessionId: this.sessionId,
|
|
2763
|
-
resultId: (this.resultId || []).slice()
|
|
2764
|
-
};
|
|
2765
|
-
}
|
|
2766
|
-
}
|
|
2767
|
-
/**
|
|
2768
|
-
* Message implementation for armonik.api.grpc.v1.results.DeleteResultsDataResponse
|
|
2769
|
-
*/
|
|
2770
|
-
export class DeleteResultsDataResponse {
|
|
2771
|
-
static { this.id = 'armonik.api.grpc.v1.results.DeleteResultsDataResponse'; }
|
|
2772
|
-
/**
|
|
2773
|
-
* Deserialize binary data to message
|
|
2774
|
-
* @param instance message instance
|
|
2775
|
-
*/
|
|
2776
|
-
static deserializeBinary(bytes) {
|
|
2777
|
-
const instance = new DeleteResultsDataResponse();
|
|
2778
|
-
DeleteResultsDataResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2779
|
-
return instance;
|
|
2780
|
-
}
|
|
2781
|
-
/**
|
|
2782
|
-
* Check all the properties and set default protobuf values if necessary
|
|
2783
|
-
* @param _instance message instance
|
|
2784
|
-
*/
|
|
2785
|
-
static refineValues(_instance) {
|
|
2786
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
2787
|
-
_instance.resultId = _instance.resultId || [];
|
|
2788
|
-
}
|
|
2789
|
-
/**
|
|
2790
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2791
|
-
* @param _instance message instance
|
|
2792
|
-
* @param _reader binary reader instance
|
|
2793
|
-
*/
|
|
2794
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2795
|
-
while (_reader.nextField()) {
|
|
2796
|
-
if (_reader.isEndGroup())
|
|
2797
|
-
break;
|
|
2798
|
-
switch (_reader.getFieldNumber()) {
|
|
2799
|
-
case 1:
|
|
2800
|
-
_instance.sessionId = _reader.readString();
|
|
2801
|
-
break;
|
|
2802
|
-
case 2:
|
|
2803
|
-
(_instance.resultId = _instance.resultId || []).push(_reader.readString());
|
|
2804
|
-
break;
|
|
2805
|
-
default:
|
|
2806
|
-
_reader.skipField();
|
|
2807
|
-
}
|
|
2808
|
-
}
|
|
2809
|
-
DeleteResultsDataResponse.refineValues(_instance);
|
|
2810
|
-
}
|
|
2811
|
-
/**
|
|
2812
|
-
* Serializes a message to binary format using provided binary reader
|
|
2813
|
-
* @param _instance message instance
|
|
2814
|
-
* @param _writer binary writer instance
|
|
2815
|
-
*/
|
|
2816
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2817
|
-
if (_instance.sessionId) {
|
|
2818
|
-
_writer.writeString(1, _instance.sessionId);
|
|
2819
|
-
}
|
|
2820
|
-
if (_instance.resultId && _instance.resultId.length) {
|
|
2821
|
-
_writer.writeRepeatedString(2, _instance.resultId);
|
|
2822
|
-
}
|
|
2823
|
-
}
|
|
2824
|
-
/**
|
|
2825
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2826
|
-
* @param _value initial values object or instance of DeleteResultsDataResponse to deeply clone from
|
|
2827
|
-
*/
|
|
2828
|
-
constructor(_value) {
|
|
2829
|
-
_value = _value || {};
|
|
2830
|
-
this.sessionId = _value.sessionId;
|
|
2831
|
-
this.resultId = (_value.resultId || []).slice();
|
|
2832
|
-
DeleteResultsDataResponse.refineValues(this);
|
|
2833
|
-
}
|
|
2834
|
-
get sessionId() {
|
|
2835
|
-
return this._sessionId;
|
|
2836
|
-
}
|
|
2837
|
-
set sessionId(value) {
|
|
2838
|
-
this._sessionId = value;
|
|
2839
|
-
}
|
|
2840
|
-
get resultId() {
|
|
2841
|
-
return this._resultId;
|
|
2842
|
-
}
|
|
2843
|
-
set resultId(value) {
|
|
2844
|
-
this._resultId = value;
|
|
2845
|
-
}
|
|
2846
|
-
/**
|
|
2847
|
-
* Serialize message to binary data
|
|
2848
|
-
* @param instance message instance
|
|
2849
|
-
*/
|
|
2850
|
-
serializeBinary() {
|
|
2851
|
-
const writer = new BinaryWriter();
|
|
2852
|
-
DeleteResultsDataResponse.serializeBinaryToWriter(this, writer);
|
|
2853
|
-
return writer.getResultBuffer();
|
|
2854
|
-
}
|
|
2855
|
-
/**
|
|
2856
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2857
|
-
*/
|
|
2858
|
-
toObject() {
|
|
2859
|
-
return {
|
|
2860
|
-
sessionId: this.sessionId,
|
|
2861
|
-
resultId: (this.resultId || []).slice()
|
|
2862
|
-
};
|
|
2863
|
-
}
|
|
2864
|
-
/**
|
|
2865
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2866
|
-
*/
|
|
2867
|
-
toJSON() {
|
|
2868
|
-
return this.toObject();
|
|
2869
|
-
}
|
|
2870
|
-
/**
|
|
2871
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2872
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2873
|
-
* 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
|
|
2874
|
-
*/
|
|
2875
|
-
toProtobufJSON(
|
|
2876
|
-
// @ts-ignore
|
|
2877
|
-
options) {
|
|
2878
|
-
return {
|
|
2879
|
-
sessionId: this.sessionId,
|
|
2880
|
-
resultId: (this.resultId || []).slice()
|
|
2881
|
-
};
|
|
2882
|
-
}
|
|
2883
|
-
}
|
|
2884
|
-
/**
|
|
2885
|
-
* Message implementation for armonik.api.grpc.v1.results.ImportResultsDataRequest
|
|
2886
|
-
*/
|
|
2887
|
-
export class ImportResultsDataRequest {
|
|
2888
|
-
static { this.id = 'armonik.api.grpc.v1.results.ImportResultsDataRequest'; }
|
|
2889
|
-
/**
|
|
2890
|
-
* Deserialize binary data to message
|
|
2891
|
-
* @param instance message instance
|
|
2892
|
-
*/
|
|
2893
|
-
static deserializeBinary(bytes) {
|
|
2894
|
-
const instance = new ImportResultsDataRequest();
|
|
2895
|
-
ImportResultsDataRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
2896
|
-
return instance;
|
|
2897
|
-
}
|
|
2898
|
-
/**
|
|
2899
|
-
* Check all the properties and set default protobuf values if necessary
|
|
2900
|
-
* @param _instance message instance
|
|
2901
|
-
*/
|
|
2902
|
-
static refineValues(_instance) {
|
|
2903
|
-
_instance.sessionId = _instance.sessionId || '';
|
|
2904
|
-
_instance.results = _instance.results || [];
|
|
2905
|
-
}
|
|
2906
|
-
/**
|
|
2907
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
2908
|
-
* @param _instance message instance
|
|
2909
|
-
* @param _reader binary reader instance
|
|
2910
|
-
*/
|
|
2911
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
2912
|
-
while (_reader.nextField()) {
|
|
2913
|
-
if (_reader.isEndGroup())
|
|
2914
|
-
break;
|
|
2915
|
-
switch (_reader.getFieldNumber()) {
|
|
2916
|
-
case 1:
|
|
2917
|
-
_instance.sessionId = _reader.readString();
|
|
2918
|
-
break;
|
|
2919
|
-
case 2:
|
|
2920
|
-
const messageInitializer2 = new ImportResultsDataRequest.ResultOpaqueId();
|
|
2921
|
-
_reader.readMessage(messageInitializer2, ImportResultsDataRequest.ResultOpaqueId.deserializeBinaryFromReader);
|
|
2922
|
-
(_instance.results = _instance.results || []).push(messageInitializer2);
|
|
2923
|
-
break;
|
|
2924
|
-
default:
|
|
2925
|
-
_reader.skipField();
|
|
2926
|
-
}
|
|
2927
|
-
}
|
|
2928
|
-
ImportResultsDataRequest.refineValues(_instance);
|
|
2929
|
-
}
|
|
2930
|
-
/**
|
|
2931
|
-
* Serializes a message to binary format using provided binary reader
|
|
2932
|
-
* @param _instance message instance
|
|
2933
|
-
* @param _writer binary writer instance
|
|
2934
|
-
*/
|
|
2935
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
2936
|
-
if (_instance.sessionId) {
|
|
2937
|
-
_writer.writeString(1, _instance.sessionId);
|
|
2938
|
-
}
|
|
2939
|
-
if (_instance.results && _instance.results.length) {
|
|
2940
|
-
_writer.writeRepeatedMessage(2, _instance.results, ImportResultsDataRequest.ResultOpaqueId.serializeBinaryToWriter);
|
|
2941
|
-
}
|
|
2942
|
-
}
|
|
2943
|
-
/**
|
|
2944
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
2945
|
-
* @param _value initial values object or instance of ImportResultsDataRequest to deeply clone from
|
|
2946
|
-
*/
|
|
2947
|
-
constructor(_value) {
|
|
2948
|
-
_value = _value || {};
|
|
2949
|
-
this.sessionId = _value.sessionId;
|
|
2950
|
-
this.results = (_value.results || []).map(m => new ImportResultsDataRequest.ResultOpaqueId(m));
|
|
2951
|
-
ImportResultsDataRequest.refineValues(this);
|
|
2952
|
-
}
|
|
2953
|
-
get sessionId() {
|
|
2954
|
-
return this._sessionId;
|
|
2955
|
-
}
|
|
2956
|
-
set sessionId(value) {
|
|
2957
|
-
this._sessionId = value;
|
|
2958
|
-
}
|
|
2959
|
-
get results() {
|
|
2960
|
-
return this._results;
|
|
2961
|
-
}
|
|
2962
|
-
set results(value) {
|
|
2963
|
-
this._results = value;
|
|
2964
|
-
}
|
|
2965
|
-
/**
|
|
2966
|
-
* Serialize message to binary data
|
|
2967
|
-
* @param instance message instance
|
|
2968
|
-
*/
|
|
2969
|
-
serializeBinary() {
|
|
2970
|
-
const writer = new BinaryWriter();
|
|
2971
|
-
ImportResultsDataRequest.serializeBinaryToWriter(this, writer);
|
|
2972
|
-
return writer.getResultBuffer();
|
|
2973
|
-
}
|
|
2974
|
-
/**
|
|
2975
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
2976
|
-
*/
|
|
2977
|
-
toObject() {
|
|
2978
|
-
return {
|
|
2979
|
-
sessionId: this.sessionId,
|
|
2980
|
-
results: (this.results || []).map(m => m.toObject())
|
|
2981
|
-
};
|
|
2982
|
-
}
|
|
2983
|
-
/**
|
|
2984
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
2985
|
-
*/
|
|
2986
|
-
toJSON() {
|
|
2987
|
-
return this.toObject();
|
|
2988
|
-
}
|
|
2989
|
-
/**
|
|
2990
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
2991
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
2992
|
-
* 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
|
|
2993
|
-
*/
|
|
2994
|
-
toProtobufJSON(
|
|
2995
|
-
// @ts-ignore
|
|
2996
|
-
options) {
|
|
2997
|
-
return {
|
|
2998
|
-
sessionId: this.sessionId,
|
|
2999
|
-
results: (this.results || []).map(m => m.toProtobufJSON(options))
|
|
3000
|
-
};
|
|
3001
|
-
}
|
|
3002
|
-
}
|
|
3003
|
-
(function (ImportResultsDataRequest) {
|
|
3004
|
-
/**
|
|
3005
|
-
* Message implementation for armonik.api.grpc.v1.results.ImportResultsDataRequest.ResultOpaqueId
|
|
3006
|
-
*/
|
|
3007
|
-
class ResultOpaqueId {
|
|
3008
|
-
static { this.id = 'armonik.api.grpc.v1.results.ImportResultsDataRequest.ResultOpaqueId'; }
|
|
3009
|
-
/**
|
|
3010
|
-
* Deserialize binary data to message
|
|
3011
|
-
* @param instance message instance
|
|
3012
|
-
*/
|
|
3013
|
-
static deserializeBinary(bytes) {
|
|
3014
|
-
const instance = new ResultOpaqueId();
|
|
3015
|
-
ResultOpaqueId.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
3016
|
-
return instance;
|
|
3017
|
-
}
|
|
3018
|
-
/**
|
|
3019
|
-
* Check all the properties and set default protobuf values if necessary
|
|
3020
|
-
* @param _instance message instance
|
|
3021
|
-
*/
|
|
3022
|
-
static refineValues(_instance) {
|
|
3023
|
-
_instance.resultId = _instance.resultId || '';
|
|
3024
|
-
_instance.opaqueId = _instance.opaqueId || new Uint8Array();
|
|
3025
|
-
}
|
|
3026
|
-
/**
|
|
3027
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
3028
|
-
* @param _instance message instance
|
|
3029
|
-
* @param _reader binary reader instance
|
|
3030
|
-
*/
|
|
3031
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
3032
|
-
while (_reader.nextField()) {
|
|
3033
|
-
if (_reader.isEndGroup())
|
|
3034
|
-
break;
|
|
3035
|
-
switch (_reader.getFieldNumber()) {
|
|
3036
|
-
case 1:
|
|
3037
|
-
_instance.resultId = _reader.readString();
|
|
3038
|
-
break;
|
|
3039
|
-
case 2:
|
|
3040
|
-
_instance.opaqueId = _reader.readBytes();
|
|
3041
|
-
break;
|
|
3042
|
-
default:
|
|
3043
|
-
_reader.skipField();
|
|
3044
|
-
}
|
|
3045
|
-
}
|
|
3046
|
-
ResultOpaqueId.refineValues(_instance);
|
|
3047
|
-
}
|
|
3048
|
-
/**
|
|
3049
|
-
* Serializes a message to binary format using provided binary reader
|
|
3050
|
-
* @param _instance message instance
|
|
3051
|
-
* @param _writer binary writer instance
|
|
3052
|
-
*/
|
|
3053
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
3054
|
-
if (_instance.resultId) {
|
|
3055
|
-
_writer.writeString(1, _instance.resultId);
|
|
3056
|
-
}
|
|
3057
|
-
if (_instance.opaqueId && _instance.opaqueId.length) {
|
|
3058
|
-
_writer.writeBytes(2, _instance.opaqueId);
|
|
3059
|
-
}
|
|
3060
|
-
}
|
|
3061
|
-
/**
|
|
3062
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
3063
|
-
* @param _value initial values object or instance of ResultOpaqueId to deeply clone from
|
|
3064
|
-
*/
|
|
3065
|
-
constructor(_value) {
|
|
3066
|
-
_value = _value || {};
|
|
3067
|
-
this.resultId = _value.resultId;
|
|
3068
|
-
this.opaqueId = _value.opaqueId;
|
|
3069
|
-
ResultOpaqueId.refineValues(this);
|
|
3070
|
-
}
|
|
3071
|
-
get resultId() {
|
|
3072
|
-
return this._resultId;
|
|
3073
|
-
}
|
|
3074
|
-
set resultId(value) {
|
|
3075
|
-
this._resultId = value;
|
|
3076
|
-
}
|
|
3077
|
-
get opaqueId() {
|
|
3078
|
-
return this._opaqueId;
|
|
3079
|
-
}
|
|
3080
|
-
set opaqueId(value) {
|
|
3081
|
-
this._opaqueId = value;
|
|
3082
|
-
}
|
|
3083
|
-
/**
|
|
3084
|
-
* Serialize message to binary data
|
|
3085
|
-
* @param instance message instance
|
|
3086
|
-
*/
|
|
3087
|
-
serializeBinary() {
|
|
3088
|
-
const writer = new BinaryWriter();
|
|
3089
|
-
ResultOpaqueId.serializeBinaryToWriter(this, writer);
|
|
3090
|
-
return writer.getResultBuffer();
|
|
3091
|
-
}
|
|
3092
|
-
/**
|
|
3093
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
3094
|
-
*/
|
|
3095
|
-
toObject() {
|
|
3096
|
-
return {
|
|
3097
|
-
resultId: this.resultId,
|
|
3098
|
-
opaqueId: this.opaqueId ? this.opaqueId.subarray(0) : new Uint8Array()
|
|
3099
|
-
};
|
|
3100
|
-
}
|
|
3101
|
-
/**
|
|
3102
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
3103
|
-
*/
|
|
3104
|
-
toJSON() {
|
|
3105
|
-
return this.toObject();
|
|
3106
|
-
}
|
|
3107
|
-
/**
|
|
3108
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
3109
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
3110
|
-
* 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
|
|
3111
|
-
*/
|
|
3112
|
-
toProtobufJSON(
|
|
3113
|
-
// @ts-ignore
|
|
3114
|
-
options) {
|
|
3115
|
-
return {
|
|
3116
|
-
resultId: this.resultId,
|
|
3117
|
-
opaqueId: this.opaqueId ? uint8ArrayToBase64(this.opaqueId) : ''
|
|
3118
|
-
};
|
|
3119
|
-
}
|
|
3120
|
-
}
|
|
3121
|
-
ImportResultsDataRequest.ResultOpaqueId = ResultOpaqueId;
|
|
3122
|
-
})(ImportResultsDataRequest || (ImportResultsDataRequest = {}));
|
|
3123
|
-
/**
|
|
3124
|
-
* Message implementation for armonik.api.grpc.v1.results.ImportResultsDataResponse
|
|
3125
|
-
*/
|
|
3126
|
-
export class ImportResultsDataResponse {
|
|
3127
|
-
static { this.id = 'armonik.api.grpc.v1.results.ImportResultsDataResponse'; }
|
|
3128
|
-
/**
|
|
3129
|
-
* Deserialize binary data to message
|
|
3130
|
-
* @param instance message instance
|
|
3131
|
-
*/
|
|
3132
|
-
static deserializeBinary(bytes) {
|
|
3133
|
-
const instance = new ImportResultsDataResponse();
|
|
3134
|
-
ImportResultsDataResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
3135
|
-
return instance;
|
|
3136
|
-
}
|
|
3137
|
-
/**
|
|
3138
|
-
* Check all the properties and set default protobuf values if necessary
|
|
3139
|
-
* @param _instance message instance
|
|
3140
|
-
*/
|
|
3141
|
-
static refineValues(_instance) {
|
|
3142
|
-
_instance.results = _instance.results || [];
|
|
3143
|
-
}
|
|
3144
|
-
/**
|
|
3145
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
3146
|
-
* @param _instance message instance
|
|
3147
|
-
* @param _reader binary reader instance
|
|
3148
|
-
*/
|
|
3149
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
3150
|
-
while (_reader.nextField()) {
|
|
3151
|
-
if (_reader.isEndGroup())
|
|
3152
|
-
break;
|
|
3153
|
-
switch (_reader.getFieldNumber()) {
|
|
3154
|
-
case 1:
|
|
3155
|
-
const messageInitializer1 = new ResultRaw();
|
|
3156
|
-
_reader.readMessage(messageInitializer1, ResultRaw.deserializeBinaryFromReader);
|
|
3157
|
-
(_instance.results = _instance.results || []).push(messageInitializer1);
|
|
3158
|
-
break;
|
|
3159
|
-
default:
|
|
3160
|
-
_reader.skipField();
|
|
3161
|
-
}
|
|
3162
|
-
}
|
|
3163
|
-
ImportResultsDataResponse.refineValues(_instance);
|
|
3164
|
-
}
|
|
3165
|
-
/**
|
|
3166
|
-
* Serializes a message to binary format using provided binary reader
|
|
3167
|
-
* @param _instance message instance
|
|
3168
|
-
* @param _writer binary writer instance
|
|
3169
|
-
*/
|
|
3170
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
3171
|
-
if (_instance.results && _instance.results.length) {
|
|
3172
|
-
_writer.writeRepeatedMessage(1, _instance.results, ResultRaw.serializeBinaryToWriter);
|
|
3173
|
-
}
|
|
3174
|
-
}
|
|
3175
|
-
/**
|
|
3176
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
3177
|
-
* @param _value initial values object or instance of ImportResultsDataResponse to deeply clone from
|
|
3178
|
-
*/
|
|
3179
|
-
constructor(_value) {
|
|
3180
|
-
_value = _value || {};
|
|
3181
|
-
this.results = (_value.results || []).map(m => new ResultRaw(m));
|
|
3182
|
-
ImportResultsDataResponse.refineValues(this);
|
|
3183
|
-
}
|
|
3184
|
-
get results() {
|
|
3185
|
-
return this._results;
|
|
3186
|
-
}
|
|
3187
|
-
set results(value) {
|
|
3188
|
-
this._results = value;
|
|
3189
|
-
}
|
|
3190
|
-
/**
|
|
3191
|
-
* Serialize message to binary data
|
|
3192
|
-
* @param instance message instance
|
|
3193
|
-
*/
|
|
3194
|
-
serializeBinary() {
|
|
3195
|
-
const writer = new BinaryWriter();
|
|
3196
|
-
ImportResultsDataResponse.serializeBinaryToWriter(this, writer);
|
|
3197
|
-
return writer.getResultBuffer();
|
|
3198
|
-
}
|
|
3199
|
-
/**
|
|
3200
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
3201
|
-
*/
|
|
3202
|
-
toObject() {
|
|
3203
|
-
return {
|
|
3204
|
-
results: (this.results || []).map(m => m.toObject())
|
|
3205
|
-
};
|
|
3206
|
-
}
|
|
3207
|
-
/**
|
|
3208
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
3209
|
-
*/
|
|
3210
|
-
toJSON() {
|
|
3211
|
-
return this.toObject();
|
|
3212
|
-
}
|
|
3213
|
-
/**
|
|
3214
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
3215
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
3216
|
-
* 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
|
|
3217
|
-
*/
|
|
3218
|
-
toProtobufJSON(
|
|
3219
|
-
// @ts-ignore
|
|
3220
|
-
options) {
|
|
3221
|
-
return {
|
|
3222
|
-
results: (this.results || []).map(m => m.toProtobufJSON(options))
|
|
3223
|
-
};
|
|
3224
|
-
}
|
|
3225
|
-
}
|
|
3226
|
-
/**
|
|
3227
|
-
* Message implementation for armonik.api.grpc.v1.results.WatchResultRequest
|
|
3228
|
-
*/
|
|
3229
|
-
export class WatchResultRequest {
|
|
3230
|
-
static { this.id = 'armonik.api.grpc.v1.results.WatchResultRequest'; }
|
|
3231
|
-
/**
|
|
3232
|
-
* Deserialize binary data to message
|
|
3233
|
-
* @param instance message instance
|
|
3234
|
-
*/
|
|
3235
|
-
static deserializeBinary(bytes) {
|
|
3236
|
-
const instance = new WatchResultRequest();
|
|
3237
|
-
WatchResultRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
3238
|
-
return instance;
|
|
3239
|
-
}
|
|
3240
|
-
/**
|
|
3241
|
-
* Check all the properties and set default protobuf values if necessary
|
|
3242
|
-
* @param _instance message instance
|
|
3243
|
-
*/
|
|
3244
|
-
static refineValues(_instance) {
|
|
3245
|
-
_instance.fetchStatuses = _instance.fetchStatuses || [];
|
|
3246
|
-
_instance.watchStatuses = _instance.watchStatuses || [];
|
|
3247
|
-
_instance.resultIds = _instance.resultIds || [];
|
|
3248
|
-
}
|
|
3249
|
-
/**
|
|
3250
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
3251
|
-
* @param _instance message instance
|
|
3252
|
-
* @param _reader binary reader instance
|
|
3253
|
-
*/
|
|
3254
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
3255
|
-
while (_reader.nextField()) {
|
|
3256
|
-
if (_reader.isEndGroup())
|
|
3257
|
-
break;
|
|
3258
|
-
switch (_reader.getFieldNumber()) {
|
|
3259
|
-
case 1:
|
|
3260
|
-
(_instance.fetchStatuses = _instance.fetchStatuses || []).push(...(_reader.readPackedEnum() || []));
|
|
3261
|
-
break;
|
|
3262
|
-
case 2:
|
|
3263
|
-
(_instance.watchStatuses = _instance.watchStatuses || []).push(...(_reader.readPackedEnum() || []));
|
|
3264
|
-
break;
|
|
3265
|
-
case 3:
|
|
3266
|
-
(_instance.resultIds = _instance.resultIds || []).push(_reader.readString());
|
|
3267
|
-
break;
|
|
3268
|
-
default:
|
|
3269
|
-
_reader.skipField();
|
|
3270
|
-
}
|
|
3271
|
-
}
|
|
3272
|
-
WatchResultRequest.refineValues(_instance);
|
|
3273
|
-
}
|
|
3274
|
-
/**
|
|
3275
|
-
* Serializes a message to binary format using provided binary reader
|
|
3276
|
-
* @param _instance message instance
|
|
3277
|
-
* @param _writer binary writer instance
|
|
3278
|
-
*/
|
|
3279
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
3280
|
-
if (_instance.fetchStatuses && _instance.fetchStatuses.length) {
|
|
3281
|
-
_writer.writePackedEnum(1, _instance.fetchStatuses);
|
|
3282
|
-
}
|
|
3283
|
-
if (_instance.watchStatuses && _instance.watchStatuses.length) {
|
|
3284
|
-
_writer.writePackedEnum(2, _instance.watchStatuses);
|
|
3285
|
-
}
|
|
3286
|
-
if (_instance.resultIds && _instance.resultIds.length) {
|
|
3287
|
-
_writer.writeRepeatedString(3, _instance.resultIds);
|
|
3288
|
-
}
|
|
3289
|
-
}
|
|
3290
|
-
/**
|
|
3291
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
3292
|
-
* @param _value initial values object or instance of WatchResultRequest to deeply clone from
|
|
3293
|
-
*/
|
|
3294
|
-
constructor(_value) {
|
|
3295
|
-
_value = _value || {};
|
|
3296
|
-
this.fetchStatuses = (_value.fetchStatuses || []).slice();
|
|
3297
|
-
this.watchStatuses = (_value.watchStatuses || []).slice();
|
|
3298
|
-
this.resultIds = (_value.resultIds || []).slice();
|
|
3299
|
-
WatchResultRequest.refineValues(this);
|
|
3300
|
-
}
|
|
3301
|
-
get fetchStatuses() {
|
|
3302
|
-
return this._fetchStatuses;
|
|
3303
|
-
}
|
|
3304
|
-
set fetchStatuses(value) {
|
|
3305
|
-
this._fetchStatuses = value;
|
|
3306
|
-
}
|
|
3307
|
-
get watchStatuses() {
|
|
3308
|
-
return this._watchStatuses;
|
|
3309
|
-
}
|
|
3310
|
-
set watchStatuses(value) {
|
|
3311
|
-
this._watchStatuses = value;
|
|
3312
|
-
}
|
|
3313
|
-
get resultIds() {
|
|
3314
|
-
return this._resultIds;
|
|
3315
|
-
}
|
|
3316
|
-
set resultIds(value) {
|
|
3317
|
-
this._resultIds = value;
|
|
3318
|
-
}
|
|
3319
|
-
/**
|
|
3320
|
-
* Serialize message to binary data
|
|
3321
|
-
* @param instance message instance
|
|
3322
|
-
*/
|
|
3323
|
-
serializeBinary() {
|
|
3324
|
-
const writer = new BinaryWriter();
|
|
3325
|
-
WatchResultRequest.serializeBinaryToWriter(this, writer);
|
|
3326
|
-
return writer.getResultBuffer();
|
|
3327
|
-
}
|
|
3328
|
-
/**
|
|
3329
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
3330
|
-
*/
|
|
3331
|
-
toObject() {
|
|
3332
|
-
return {
|
|
3333
|
-
fetchStatuses: (this.fetchStatuses || []).slice(),
|
|
3334
|
-
watchStatuses: (this.watchStatuses || []).slice(),
|
|
3335
|
-
resultIds: (this.resultIds || []).slice()
|
|
3336
|
-
};
|
|
3337
|
-
}
|
|
3338
|
-
/**
|
|
3339
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
3340
|
-
*/
|
|
3341
|
-
toJSON() {
|
|
3342
|
-
return this.toObject();
|
|
3343
|
-
}
|
|
3344
|
-
/**
|
|
3345
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
3346
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
3347
|
-
* 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
|
|
3348
|
-
*/
|
|
3349
|
-
toProtobufJSON(
|
|
3350
|
-
// @ts-ignore
|
|
3351
|
-
options) {
|
|
3352
|
-
return {
|
|
3353
|
-
fetchStatuses: (this.fetchStatuses || []).map(v => armonikApiGrpcV1Result_status001.ResultStatus[v]),
|
|
3354
|
-
watchStatuses: (this.watchStatuses || []).map(v => armonikApiGrpcV1Result_status001.ResultStatus[v]),
|
|
3355
|
-
resultIds: (this.resultIds || []).slice()
|
|
3356
|
-
};
|
|
3357
|
-
}
|
|
3358
|
-
}
|
|
3359
|
-
/**
|
|
3360
|
-
* Message implementation for armonik.api.grpc.v1.results.WatchResultResponse
|
|
3361
|
-
*/
|
|
3362
|
-
export class WatchResultResponse {
|
|
3363
|
-
static { this.id = 'armonik.api.grpc.v1.results.WatchResultResponse'; }
|
|
3364
|
-
/**
|
|
3365
|
-
* Deserialize binary data to message
|
|
3366
|
-
* @param instance message instance
|
|
3367
|
-
*/
|
|
3368
|
-
static deserializeBinary(bytes) {
|
|
3369
|
-
const instance = new WatchResultResponse();
|
|
3370
|
-
WatchResultResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
|
|
3371
|
-
return instance;
|
|
3372
|
-
}
|
|
3373
|
-
/**
|
|
3374
|
-
* Check all the properties and set default protobuf values if necessary
|
|
3375
|
-
* @param _instance message instance
|
|
3376
|
-
*/
|
|
3377
|
-
static refineValues(_instance) {
|
|
3378
|
-
_instance.status = _instance.status || 0;
|
|
3379
|
-
_instance.resultIds = _instance.resultIds || [];
|
|
3380
|
-
}
|
|
3381
|
-
/**
|
|
3382
|
-
* Deserializes / reads binary message into message instance using provided binary reader
|
|
3383
|
-
* @param _instance message instance
|
|
3384
|
-
* @param _reader binary reader instance
|
|
3385
|
-
*/
|
|
3386
|
-
static deserializeBinaryFromReader(_instance, _reader) {
|
|
3387
|
-
while (_reader.nextField()) {
|
|
3388
|
-
if (_reader.isEndGroup())
|
|
3389
|
-
break;
|
|
3390
|
-
switch (_reader.getFieldNumber()) {
|
|
3391
|
-
case 1:
|
|
3392
|
-
_instance.status = _reader.readEnum();
|
|
3393
|
-
break;
|
|
3394
|
-
case 2:
|
|
3395
|
-
(_instance.resultIds = _instance.resultIds || []).push(_reader.readString());
|
|
3396
|
-
break;
|
|
3397
|
-
default:
|
|
3398
|
-
_reader.skipField();
|
|
3399
|
-
}
|
|
3400
|
-
}
|
|
3401
|
-
WatchResultResponse.refineValues(_instance);
|
|
3402
|
-
}
|
|
3403
|
-
/**
|
|
3404
|
-
* Serializes a message to binary format using provided binary reader
|
|
3405
|
-
* @param _instance message instance
|
|
3406
|
-
* @param _writer binary writer instance
|
|
3407
|
-
*/
|
|
3408
|
-
static serializeBinaryToWriter(_instance, _writer) {
|
|
3409
|
-
if (_instance.status) {
|
|
3410
|
-
_writer.writeEnum(1, _instance.status);
|
|
3411
|
-
}
|
|
3412
|
-
if (_instance.resultIds && _instance.resultIds.length) {
|
|
3413
|
-
_writer.writeRepeatedString(2, _instance.resultIds);
|
|
3414
|
-
}
|
|
3415
|
-
}
|
|
3416
|
-
/**
|
|
3417
|
-
* Message constructor. Initializes the properties and applies default Protobuf values if necessary
|
|
3418
|
-
* @param _value initial values object or instance of WatchResultResponse to deeply clone from
|
|
3419
|
-
*/
|
|
3420
|
-
constructor(_value) {
|
|
3421
|
-
_value = _value || {};
|
|
3422
|
-
this.status = _value.status;
|
|
3423
|
-
this.resultIds = (_value.resultIds || []).slice();
|
|
3424
|
-
WatchResultResponse.refineValues(this);
|
|
3425
|
-
}
|
|
3426
|
-
get status() {
|
|
3427
|
-
return this._status;
|
|
3428
|
-
}
|
|
3429
|
-
set status(value) {
|
|
3430
|
-
this._status = value;
|
|
3431
|
-
}
|
|
3432
|
-
get resultIds() {
|
|
3433
|
-
return this._resultIds;
|
|
3434
|
-
}
|
|
3435
|
-
set resultIds(value) {
|
|
3436
|
-
this._resultIds = value;
|
|
3437
|
-
}
|
|
3438
|
-
/**
|
|
3439
|
-
* Serialize message to binary data
|
|
3440
|
-
* @param instance message instance
|
|
3441
|
-
*/
|
|
3442
|
-
serializeBinary() {
|
|
3443
|
-
const writer = new BinaryWriter();
|
|
3444
|
-
WatchResultResponse.serializeBinaryToWriter(this, writer);
|
|
3445
|
-
return writer.getResultBuffer();
|
|
3446
|
-
}
|
|
3447
|
-
/**
|
|
3448
|
-
* Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
|
|
3449
|
-
*/
|
|
3450
|
-
toObject() {
|
|
3451
|
-
return {
|
|
3452
|
-
status: this.status,
|
|
3453
|
-
resultIds: (this.resultIds || []).slice()
|
|
3454
|
-
};
|
|
3455
|
-
}
|
|
3456
|
-
/**
|
|
3457
|
-
* Convenience method to support JSON.stringify(message), replicates the structure of toObject()
|
|
3458
|
-
*/
|
|
3459
|
-
toJSON() {
|
|
3460
|
-
return this.toObject();
|
|
3461
|
-
}
|
|
3462
|
-
/**
|
|
3463
|
-
* Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
3464
|
-
* Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
|
|
3465
|
-
* 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
|
|
3466
|
-
*/
|
|
3467
|
-
toProtobufJSON(
|
|
3468
|
-
// @ts-ignore
|
|
3469
|
-
options) {
|
|
3470
|
-
return {
|
|
3471
|
-
status: armonikApiGrpcV1Result_status001.ResultStatus[this.status === null || this.status === undefined ? 0 : this.status],
|
|
3472
|
-
resultIds: (this.resultIds || []).slice()
|
|
3473
|
-
};
|
|
3474
|
-
}
|
|
3475
|
-
}
|
|
3476
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0cy1jb21tb24ucGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmVvY29uc3VsdGluZ2ZyL2FybW9uaWsuYXBpLmFuZ3VsYXIvc3JjL2xpYi9nZW5lcmF0ZWQvcmVzdWx0cy1jb21tb24ucGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixjQUFjO0FBQ2QsRUFBRTtBQUNGLDJCQUEyQjtBQUMzQiw4Q0FBOEM7QUFDOUMsT0FBTyxFQUlMLGtCQUFrQixFQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFekUsT0FBTyxLQUFLLGdDQUFnQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZFLE9BQU8sS0FBSywwQkFBMEIsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssaUJBQWlCLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxLQUFLLDBCQUEwQixNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sS0FBSyxpQ0FBaUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RTs7R0FFRztBQUNILE1BQU0sT0FBTyxTQUFTO2FBQ2IsT0FBRSxHQUFHLHVDQUF1QyxDQUFDO0lBRXBEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFpQjtRQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6RSxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFvQjtRQUN0QyxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxT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QUFPLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRTtTQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYztJQUNaLGFBQWE7SUFDYixPQUErQjtRQUUvQixPQUFPO1lBQ0wsTUFBTSxFQUNKLGdDQUFnQyxDQUFDLFlBQVksQ0FDM0MsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDcEU7WUFDSCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRTtTQUMxQyxDQUFDO0lBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gQHRzLW5vY2hlY2tcbi8vXG4vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEVcbi8vIERPIE5PVCBNT0RJRlkgSVQhIFlPVVIgQ0hBTkdFUyBXSUxMIEJFIExPU1RcbmltcG9ydCB7XG4gIEdycGNNZXNzYWdlLFxuICBSZWN1cnNpdmVQYXJ0aWFsLFxuICBUb1Byb3RvYnVmSlNPTk9wdGlvbnMsXG4gIHVpbnQ4QXJyYXlUb0Jhc2U2NFxufSBmcm9tICdAbmd4LWdycGMvY29tbW9uJztcbmltcG9ydCB7IEJpbmFyeVJlYWRlciwgQmluYXJ5V3JpdGVyLCBCeXRlU291cmNlIH0gZnJvbSAnZ29vZ2xlLXByb3RvYnVmJztcbmltcG9ydCAqIGFzIGFybW9uaWtBcGlHcnBjVjEwMDAgZnJvbSAnLi9maWx0ZXJzLWNvbW1vbi5wYic7XG5pbXBvcnQgKiBhcyBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMSBmcm9tICcuL3Jlc3VsdC1zdGF0dXMucGInO1xuaW1wb3J0ICogYXMgYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDIgZnJvbSAnLi9yZXN1bHRzLWZpZWxkcy5wYic7XG5pbXBvcnQgKiBhcyBnb29nbGVQcm90b2J1ZjAwMyBmcm9tICdAbmd4LWdycGMvd2VsbC1rbm93bi10eXBlcyc7XG5pbXBvcnQgKiBhcyBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwNCBmcm9tICcuL3Jlc3VsdHMtZmlsdGVycy5wYic7XG5pbXBvcnQgKiBhcyBhcm1vbmlrQXBpR3JwY1YxU29ydF9kaXJlY3Rpb24wMDUgZnJvbSAnLi9zb3J0LWRpcmVjdGlvbi5wYic7XG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5SZXN1bHRSYXdcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3VsdFJhdyBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5SZXN1bHRSYXcnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBSZXN1bHRSYXcoKTtcbiAgICBSZXN1bHRSYXcuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBSZXN1bHRSYXcpIHtcbiAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX2luc3RhbmNlLnNlc3Npb25JZCB8fCAnJztcbiAgICBfaW5zdGFuY2UubmFtZSA9IF9pbnN0YW5jZS5uYW1lIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5vd25lclRhc2tJZCA9IF9pbnN0YW5jZS5vd25lclRhc2tJZCB8fCAnJztcbiAgICBfaW5zdGFuY2Uuc3RhdHVzID0gX2luc3RhbmNlLnN0YXR1cyB8fCAwO1xuICAgIF9pbnN0YW5jZS5jcmVhdGVkQXQgPSBfaW5zdGFuY2UuY3JlYXRlZEF0IHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UuY29tcGxldGVkQXQgPSBfaW5zdGFuY2UuY29tcGxldGVkQXQgfHwgdW5kZWZpbmVkO1xuICAgIF9pbnN0YW5jZS5yZXN1bHRJZCA9IF9pbnN0YW5jZS5yZXN1bHRJZCB8fCAnJztcbiAgICBfaW5zdGFuY2Uuc2l6ZSA9IF9pbnN0YW5jZS5zaXplIHx8ICcwJztcbiAgICBfaW5zdGFuY2UuY3JlYXRlZEJ5ID0gX2luc3RhbmNlLmNyZWF0ZWRCeSB8fCAnJztcbiAgICBfaW5zdGFuY2Uub3BhcXVlSWQgPSBfaW5zdGFuY2Uub3BhcXVlSWQgfHwgbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICBfaW5zdGFuY2UubWFudWFsRGVsZXRpb24gPSBfaW5zdGFuY2UubWFudWFsRGVsZXRpb24gfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBSZXN1bHRSYXcsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLm5hbWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9pbnN0YW5jZS5vd25lclRhc2tJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgX2luc3RhbmNlLnN0YXR1cyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF9pbnN0YW5jZS5jcmVhdGVkQXQgPSBuZXcgZ29vZ2xlUHJvdG9idWYwMDMuVGltZXN0YW1wKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5jcmVhdGVkQXQsXG4gICAgICAgICAgICBnb29nbGVQcm90b2J1ZjAwMy5UaW1lc3RhbXAuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS5jb21wbGV0ZWRBdCA9IG5ldyBnb29nbGVQcm90b2J1ZjAwMy5UaW1lc3RhbXAoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLmNvbXBsZXRlZEF0LFxuICAgICAgICAgICAgZ29vZ2xlUHJvdG9idWYwMDMuVGltZXN0YW1wLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0SWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIF9pbnN0YW5jZS5zaXplID0gX3JlYWRlci5yZWFkSW50NjRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBfaW5zdGFuY2UuY3JlYXRlZEJ5ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgX2luc3RhbmNlLm9wYXF1ZUlkID0gX3JlYWRlci5yZWFkQnl0ZXMoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBfaW5zdGFuY2UubWFudWFsRGVsZXRpb24gPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBSZXN1bHRSYXcucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoX2luc3RhbmNlOiBSZXN1bHRSYXcsIF93cml0ZXI6IEJpbmFyeVdyaXRlcikge1xuICAgIGlmIChfaW5zdGFuY2Uuc2Vzc2lvbklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5zZXNzaW9uSWQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm5hbWUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLm5hbWUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm93bmVyVGFza0lkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5vd25lclRhc2tJZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3RhdHVzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlRW51bSg0LCBfaW5zdGFuY2Uuc3RhdHVzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5jcmVhdGVkQXQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICA1LFxuICAgICAgICBfaW5zdGFuY2UuY3JlYXRlZEF0IGFzIGFueSxcbiAgICAgICAgZ29vZ2xlUHJvdG9idWYwMDMuVGltZXN0YW1wLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmNvbXBsZXRlZEF0KSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgNixcbiAgICAgICAgX2luc3RhbmNlLmNvbXBsZXRlZEF0IGFzIGFueSxcbiAgICAgICAgZ29vZ2xlUHJvdG9idWYwMDMuVGltZXN0YW1wLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlc3VsdElkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDgsIF9pbnN0YW5jZS5yZXN1bHRJZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc2l6ZSkge1xuICAgICAgX3dyaXRlci53cml0ZUludDY0U3RyaW5nKDksIF9pbnN0YW5jZS5zaXplKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5jcmVhdGVkQnkpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMTAsIF9pbnN0YW5jZS5jcmVhdGVkQnkpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm9wYXF1ZUlkICYmIF9pbnN0YW5jZS5vcGFxdWVJZC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVCeXRlcygxMSwgX2luc3RhbmNlLm9wYXF1ZUlkKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5tYW51YWxEZWxldGlvbikge1xuICAgICAgX3dyaXRlci53cml0ZUJvb2woMTIsIF9pbnN0YW5jZS5tYW51YWxEZWxldGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfb3duZXJUYXNrSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfc3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXM7XG4gIHByaXZhdGUgX2NyZWF0ZWRBdD86IGdvb2dsZVByb3RvYnVmMDAzLlRpbWVzdGFtcDtcbiAgcHJpdmF0ZSBfY29tcGxldGVkQXQ/OiBnb29nbGVQcm90b2J1ZjAwMy5UaW1lc3RhbXA7XG4gIHByaXZhdGUgX3Jlc3VsdElkOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NpemU6IHN0cmluZztcbiAgcHJpdmF0ZSBfY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHByaXZhdGUgX29wYXF1ZUlkOiBVaW50OEFycmF5O1xuICBwcml2YXRlIF9tYW51YWxEZWxldGlvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFJlc3VsdFJhdyB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxSZXN1bHRSYXcuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuc2Vzc2lvbklkID0gX3ZhbHVlLnNlc3Npb25JZDtcbiAgICB0aGlzLm5hbWUgPSBfdmFsdWUubmFtZTtcbiAgICB0aGlzLm93bmVyVGFza0lkID0gX3ZhbHVlLm93bmVyVGFza0lkO1xuICAgIHRoaXMuc3RhdHVzID0gX3ZhbHVlLnN0YXR1cztcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IF92YWx1ZS5jcmVhdGVkQXRcbiAgICAgID8gbmV3IGdvb2dsZVByb3RvYnVmMDAzLlRpbWVzdGFtcChfdmFsdWUuY3JlYXRlZEF0KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb21wbGV0ZWRBdCA9IF92YWx1ZS5jb21wbGV0ZWRBdFxuICAgICAgPyBuZXcgZ29vZ2xlUHJvdG9idWYwMDMuVGltZXN0YW1wKF92YWx1ZS5jb21wbGV0ZWRBdClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzdWx0SWQgPSBfdmFsdWUucmVzdWx0SWQ7XG4gICAgdGhpcy5zaXplID0gX3ZhbHVlLnNpemU7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBfdmFsdWUuY3JlYXRlZEJ5O1xuICAgIHRoaXMub3BhcXVlSWQgPSBfdmFsdWUub3BhcXVlSWQ7XG4gICAgdGhpcy5tYW51YWxEZWxldGlvbiA9IF92YWx1ZS5tYW51YWxEZWxldGlvbjtcbiAgICBSZXN1bHRSYXcucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICB9XG4gIHNldCBzZXNzaW9uSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IHZhbHVlO1xuICB9XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cbiAgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgb3duZXJUYXNrSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3duZXJUYXNrSWQ7XG4gIH1cbiAgc2V0IG93bmVyVGFza0lkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9vd25lclRhc2tJZCA9IHZhbHVlO1xuICB9XG4gIGdldCBzdGF0dXMoKTogYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICB9XG4gIHNldCBzdGF0dXModmFsdWU6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1cykge1xuICAgIHRoaXMuX3N0YXR1cyA9IHZhbHVlO1xuICB9XG4gIGdldCBjcmVhdGVkQXQoKTogZ29vZ2xlUHJvdG9idWYwMDMuVGltZXN0YW1wIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlZEF0O1xuICB9XG4gIHNldCBjcmVhdGVkQXQodmFsdWU6IGdvb2dsZVByb3RvYnVmMDAzLlRpbWVzdGFtcCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NyZWF0ZWRBdCA9IHZhbHVlO1xuICB9XG4gIGdldCBjb21wbGV0ZWRBdCgpOiBnb29nbGVQcm90b2J1ZjAwMy5UaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb21wbGV0ZWRBdDtcbiAgfVxuICBzZXQgY29tcGxldGVkQXQodmFsdWU6IGdvb2dsZVByb3RvYnVmMDAzLlRpbWVzdGFtcCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NvbXBsZXRlZEF0ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHJlc3VsdElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdElkO1xuICB9XG4gIHNldCByZXN1bHRJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVzdWx0SWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc2l6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG4gIHNldCBzaXplKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zaXplID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGNyZWF0ZWRCeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVkQnk7XG4gIH1cbiAgc2V0IGNyZWF0ZWRCeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3JlYXRlZEJ5ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG9wYXF1ZUlkKCk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB0aGlzLl9vcGFxdWVJZDtcbiAgfVxuICBzZXQgb3BhcXVlSWQodmFsdWU6IFVpbnQ4QXJyYXkpIHtcbiAgICB0aGlzLl9vcGFxdWVJZCA9IHZhbHVlO1xuICB9XG4gIGdldCBtYW51YWxEZWxldGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbWFudWFsRGVsZXRpb247XG4gIH1cbiAgc2V0IG1hbnVhbERlbGV0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbWFudWFsRGVsZXRpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBSZXN1bHRSYXcuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogUmVzdWx0UmF3LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIG93bmVyVGFza0lkOiB0aGlzLm93bmVyVGFza0lkLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIGNyZWF0ZWRBdDogdGhpcy5jcmVhdGVkQXQgPyB0aGlzLmNyZWF0ZWRBdC50b09iamVjdCgpIDogdW5kZWZpbmVkLFxuICAgICAgY29tcGxldGVkQXQ6IHRoaXMuY29tcGxldGVkQXQgPyB0aGlzLmNvbXBsZXRlZEF0LnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICByZXN1bHRJZDogdGhpcy5yZXN1bHRJZCxcbiAgICAgIHNpemU6IHRoaXMuc2l6ZSxcbiAgICAgIGNyZWF0ZWRCeTogdGhpcy5jcmVhdGVkQnksXG4gICAgICBvcGFxdWVJZDogdGhpcy5vcGFxdWVJZCA/IHRoaXMub3BhcXVlSWQuc3ViYXJyYXkoMCkgOiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgbWFudWFsRGVsZXRpb246IHRoaXMubWFudWFsRGVsZXRpb25cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBSZXN1bHRSYXcuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgb3duZXJUYXNrSWQ6IHRoaXMub3duZXJUYXNrSWQsXG4gICAgICBzdGF0dXM6XG4gICAgICAgIGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1c1tcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9PT0gbnVsbCB8fCB0aGlzLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMCA6IHRoaXMuc3RhdHVzXG4gICAgICAgIF0sXG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0ID8gdGhpcy5jcmVhdGVkQXQudG9Qcm90b2J1ZkpTT04ob3B0aW9ucykgOiBudWxsLFxuICAgICAgY29tcGxldGVkQXQ6IHRoaXMuY29tcGxldGVkQXRcbiAgICAgICAgPyB0aGlzLmNvbXBsZXRlZEF0LnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkLFxuICAgICAgc2l6ZTogdGhpcy5zaXplLFxuICAgICAgY3JlYXRlZEJ5OiB0aGlzLmNyZWF0ZWRCeSxcbiAgICAgIG9wYXF1ZUlkOiB0aGlzLm9wYXF1ZUlkID8gdWludDhBcnJheVRvQmFzZTY0KHRoaXMub3BhcXVlSWQpIDogJycsXG4gICAgICBtYW51YWxEZWxldGlvbjogdGhpcy5tYW51YWxEZWxldGlvblxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgUmVzdWx0UmF3IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBSZXN1bHRSYXdcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBvd25lclRhc2tJZDogc3RyaW5nO1xuICAgIHN0YXR1czogYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzO1xuICAgIGNyZWF0ZWRBdD86IGdvb2dsZVByb3RvYnVmMDAzLlRpbWVzdGFtcC5Bc09iamVjdDtcbiAgICBjb21wbGV0ZWRBdD86IGdvb2dsZVByb3RvYnVmMDAzLlRpbWVzdGFtcC5Bc09iamVjdDtcbiAgICByZXN1bHRJZDogc3RyaW5nO1xuICAgIHNpemU6IHN0cmluZztcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBvcGFxdWVJZDogVWludDhBcnJheTtcbiAgICBtYW51YWxEZWxldGlvbjogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBSZXN1bHRSYXdcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBvd25lclRhc2tJZDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGNyZWF0ZWRBdDogZ29vZ2xlUHJvdG9idWYwMDMuVGltZXN0YW1wLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBjb21wbGV0ZWRBdDogZ29vZ2xlUHJvdG9idWYwMDMuVGltZXN0YW1wLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICByZXN1bHRJZDogc3RyaW5nO1xuICAgIHNpemU6IHN0cmluZztcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBvcGFxdWVJZDogc3RyaW5nO1xuICAgIG1hbnVhbERlbGV0aW9uOiBib29sZWFuO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkxpc3RSZXN1bHRzUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgTGlzdFJlc3VsdHNSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkxpc3RSZXN1bHRzUmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IExpc3RSZXN1bHRzUmVxdWVzdCgpO1xuICAgIExpc3RSZXN1bHRzUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IExpc3RSZXN1bHRzUmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5wYWdlID0gX2luc3RhbmNlLnBhZ2UgfHwgMDtcbiAgICBfaW5zdGFuY2UucGFnZVNpemUgPSBfaW5zdGFuY2UucGFnZVNpemUgfHwgMDtcbiAgICBfaW5zdGFuY2UuZmlsdGVycyA9IF9pbnN0YW5jZS5maWx0ZXJzIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2Uuc29ydCA9IF9pbnN0YW5jZS5zb3J0IHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RSZXN1bHRzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFnZSA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UucGFnZVNpemUgPSBfcmVhZGVyLnJlYWRJbnQzMigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2luc3RhbmNlLmZpbHRlcnMgPSBuZXcgYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDQuRmlsdGVycygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuZmlsdGVycyxcbiAgICAgICAgICAgIGFybW9uaWtBcGlHcnBjVjFSZXN1bHRzMDA0LkZpbHRlcnMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9pbnN0YW5jZS5zb3J0ID0gbmV3IExpc3RSZXN1bHRzUmVxdWVzdC5Tb3J0KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5zb3J0LFxuICAgICAgICAgICAgTGlzdFJlc3VsdHNSZXF1ZXN0LlNvcnQuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIExpc3RSZXN1bHRzUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RSZXN1bHRzUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5wYWdlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlSW50MzIoMSwgX2luc3RhbmNlLnBhZ2UpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnBhZ2VTaXplKSB7XG4gICAgICBfd3JpdGVyLndyaXRlSW50MzIoMiwgX2luc3RhbmNlLnBhZ2VTaXplKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5maWx0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMyxcbiAgICAgICAgX2luc3RhbmNlLmZpbHRlcnMgYXMgYW55LFxuICAgICAgICBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwNC5GaWx0ZXJzLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNvcnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICA0LFxuICAgICAgICBfaW5zdGFuY2Uuc29ydCBhcyBhbnksXG4gICAgICAgIExpc3RSZXN1bHRzUmVxdWVzdC5Tb3J0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BhZ2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcGFnZVNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZmlsdGVycz86IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRzMDA0LkZpbHRlcnM7XG4gIHByaXZhdGUgX3NvcnQ/OiBMaXN0UmVzdWx0c1JlcXVlc3QuU29ydDtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIExpc3RSZXN1bHRzUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxMaXN0UmVzdWx0c1JlcXVlc3QuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMucGFnZSA9IF92YWx1ZS5wYWdlO1xuICAgIHRoaXMucGFnZVNpemUgPSBfdmFsdWUucGFnZVNpemU7XG4gICAgdGhpcy5maWx0ZXJzID0gX3ZhbHVlLmZpbHRlcnNcbiAgICAgID8gbmV3IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRzMDA0LkZpbHRlcnMoX3ZhbHVlLmZpbHRlcnMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNvcnQgPSBfdmFsdWUuc29ydFxuICAgICAgPyBuZXcgTGlzdFJlc3VsdHNSZXF1ZXN0LlNvcnQoX3ZhbHVlLnNvcnQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBMaXN0UmVzdWx0c1JlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBwYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cbiAgc2V0IHBhZ2UodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3BhZ2UgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemU7XG4gIH1cbiAgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IHZhbHVlO1xuICB9XG4gIGdldCBmaWx0ZXJzKCk6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRzMDA0LkZpbHRlcnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJzO1xuICB9XG4gIHNldCBmaWx0ZXJzKHZhbHVlOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwNC5GaWx0ZXJzIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZmlsdGVycyA9IHZhbHVlO1xuICB9XG4gIGdldCBzb3J0KCk6IExpc3RSZXN1bHRzUmVxdWVzdC5Tb3J0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydDtcbiAgfVxuICBzZXQgc29ydCh2YWx1ZTogTGlzdFJlc3VsdHNSZXF1ZXN0LlNvcnQgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zb3J0ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgTGlzdFJlc3VsdHNSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IExpc3RSZXN1bHRzUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzID8gdGhpcy5maWx0ZXJzLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBzb3J0OiB0aGlzLnNvcnQgPyB0aGlzLnNvcnQudG9PYmplY3QoKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IExpc3RSZXN1bHRzUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzID8gdGhpcy5maWx0ZXJzLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpIDogbnVsbCxcbiAgICAgIHNvcnQ6IHRoaXMuc29ydCA/IHRoaXMuc29ydC50b1Byb3RvYnVmSlNPTihvcHRpb25zKSA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIExpc3RSZXN1bHRzUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgTGlzdFJlc3VsdHNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcGFnZVNpemU6IG51bWJlcjtcbiAgICBmaWx0ZXJzPzogYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDQuRmlsdGVycy5Bc09iamVjdDtcbiAgICBzb3J0PzogTGlzdFJlc3VsdHNSZXF1ZXN0LlNvcnQuQXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgTGlzdFJlc3VsdHNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcGFnZVNpemU6IG51bWJlcjtcbiAgICBmaWx0ZXJzOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwNC5GaWx0ZXJzLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBzb3J0OiBMaXN0UmVzdWx0c1JlcXVlc3QuU29ydC5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkxpc3RSZXN1bHRzUmVxdWVzdC5Tb3J0XG4gICAqL1xuICBleHBvcnQgY2xhc3MgU29ydCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkxpc3RSZXN1bHRzUmVxdWVzdC5Tb3J0JztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgU29ydCgpO1xuICAgICAgU29ydC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoaW5zdGFuY2UsIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogU29ydCkge1xuICAgICAgX2luc3RhbmNlLmZpZWxkID0gX2luc3RhbmNlLmZpZWxkIHx8IHVuZGVmaW5lZDtcbiAgICAgIF9pbnN0YW5jZS5kaXJlY3Rpb24gPSBfaW5zdGFuY2UuZGlyZWN0aW9uIHx8IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihfaW5zdGFuY2U6IFNvcnQsIF9yZWFkZXI6IEJpbmFyeVJlYWRlcikge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5maWVsZCA9IG5ldyBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwMi5SZXN1bHRGaWVsZCgpO1xuICAgICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgICAgX2luc3RhbmNlLmZpZWxkLFxuICAgICAgICAgICAgICBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwMi5SZXN1bHRGaWVsZC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBfaW5zdGFuY2UuZGlyZWN0aW9uID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgU29ydC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKF9pbnN0YW5jZTogU29ydCwgX3dyaXRlcjogQmluYXJ5V3JpdGVyKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLmZpZWxkKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAgIDEsXG4gICAgICAgICAgX2luc3RhbmNlLmZpZWxkIGFzIGFueSxcbiAgICAgICAgICBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwMi5SZXN1bHRGaWVsZC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5kaXJlY3Rpb24pIHtcbiAgICAgICAgX3dyaXRlci53cml0ZUVudW0oMiwgX2luc3RhbmNlLmRpcmVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmllbGQ/OiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwMi5SZXN1bHRGaWVsZDtcbiAgICBwcml2YXRlIF9kaXJlY3Rpb246IGFybW9uaWtBcGlHcnBjVjFTb3J0X2RpcmVjdGlvbjAwNS5Tb3J0RGlyZWN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgU29ydCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8U29ydC5Bc09iamVjdD4pIHtcbiAgICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICAgIHRoaXMuZmllbGQgPSBfdmFsdWUuZmllbGRcbiAgICAgICAgPyBuZXcgYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDIuUmVzdWx0RmllbGQoX3ZhbHVlLmZpZWxkKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gX3ZhbHVlLmRpcmVjdGlvbjtcbiAgICAgIFNvcnQucmVmaW5lVmFsdWVzKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgZmllbGQoKTogYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDIuUmVzdWx0RmllbGQgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkO1xuICAgIH1cbiAgICBzZXQgZmllbGQodmFsdWU6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRzMDAyLlJlc3VsdEZpZWxkIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9maWVsZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZGlyZWN0aW9uKCk6IGFybW9uaWtBcGlHcnBjVjFTb3J0X2RpcmVjdGlvbjAwNS5Tb3J0RGlyZWN0aW9uIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXJlY3Rpb247XG4gICAgfVxuICAgIHNldCBkaXJlY3Rpb24odmFsdWU6IGFybW9uaWtBcGlHcnBjVjFTb3J0X2RpcmVjdGlvbjAwNS5Tb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLl9kaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgU29ydC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICAgKi9cbiAgICB0b09iamVjdCgpOiBTb3J0LkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiB0aGlzLmZpZWxkID8gdGhpcy5maWVsZC50b09iamVjdCgpIDogdW5kZWZpbmVkLFxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IFNvcnQuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGQ6IHRoaXMuZmllbGQgPyB0aGlzLmZpZWxkLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpIDogbnVsbCxcbiAgICAgICAgZGlyZWN0aW9uOlxuICAgICAgICAgIGFybW9uaWtBcGlHcnBjVjFTb3J0X2RpcmVjdGlvbjAwNS5Tb3J0RGlyZWN0aW9uW1xuICAgICAgICAgICAgdGhpcy5kaXJlY3Rpb24gPT09IG51bGwgfHwgdGhpcy5kaXJlY3Rpb24gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgOiB0aGlzLmRpcmVjdGlvblxuICAgICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgU29ydCB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFNvcnRcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIGZpZWxkPzogYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDIuUmVzdWx0RmllbGQuQXNPYmplY3Q7XG4gICAgICBkaXJlY3Rpb246IGFybW9uaWtBcGlHcnBjVjFTb3J0X2RpcmVjdGlvbjAwNS5Tb3J0RGlyZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFNvcnRcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICAgIGZpZWxkOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwMi5SZXN1bHRGaWVsZC5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgICBkaXJlY3Rpb246IHN0cmluZztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuTGlzdFJlc3VsdHNSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgTGlzdFJlc3VsdHNSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5MaXN0UmVzdWx0c1Jlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTGlzdFJlc3VsdHNSZXNwb25zZSgpO1xuICAgIExpc3RSZXN1bHRzUmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBMaXN0UmVzdWx0c1Jlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLnJlc3VsdHMgPSBfaW5zdGFuY2UucmVzdWx0cyB8fCBbXTtcbiAgICBfaW5zdGFuY2UucGFnZSA9IF9pbnN0YW5jZS5wYWdlIHx8IDA7XG4gICAgX2luc3RhbmNlLnBhZ2VTaXplID0gX2luc3RhbmNlLnBhZ2VTaXplIHx8IDA7XG4gICAgX2luc3RhbmNlLnRvdGFsID0gX2luc3RhbmNlLnRvdGFsIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBMaXN0UmVzdWx0c1Jlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjEgPSBuZXcgUmVzdWx0UmF3KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjEsXG4gICAgICAgICAgICBSZXN1bHRSYXcuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICAoX2luc3RhbmNlLnJlc3VsdHMgPSBfaW5zdGFuY2UucmVzdWx0cyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjFcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLnBhZ2UgPSBfcmVhZGVyLnJlYWRJbnQzMigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2luc3RhbmNlLnBhZ2VTaXplID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9pbnN0YW5jZS50b3RhbCA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBMaXN0UmVzdWx0c1Jlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogTGlzdFJlc3VsdHNSZXNwb25zZSxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5yZXN1bHRzICYmIF9pbnN0YW5jZS5yZXN1bHRzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLnJlc3VsdHMgYXMgYW55LFxuICAgICAgICBSZXN1bHRSYXcuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UucGFnZSkge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDIsIF9pbnN0YW5jZS5wYWdlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5wYWdlU2l6ZSkge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDMsIF9pbnN0YW5jZS5wYWdlU2l6ZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudG90YWwpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig0LCBfaW5zdGFuY2UudG90YWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3VsdHM/OiBSZXN1bHRSYXdbXTtcbiAgcHJpdmF0ZSBfcGFnZTogbnVtYmVyO1xuICBwcml2YXRlIF9wYWdlU2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIF90b3RhbDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgTGlzdFJlc3VsdHNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxMaXN0UmVzdWx0c1Jlc3BvbnNlLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnJlc3VsdHMgPSAoX3ZhbHVlLnJlc3VsdHMgfHwgW10pLm1hcChtID0+IG5ldyBSZXN1bHRSYXcobSkpO1xuICAgIHRoaXMucGFnZSA9IF92YWx1ZS5wYWdlO1xuICAgIHRoaXMucGFnZVNpemUgPSBfdmFsdWUucGFnZVNpemU7XG4gICAgdGhpcy50b3RhbCA9IF92YWx1ZS50b3RhbDtcbiAgICBMaXN0UmVzdWx0c1Jlc3BvbnNlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcmVzdWx0cygpOiBSZXN1bHRSYXdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHM7XG4gIH1cbiAgc2V0IHJlc3VsdHModmFsdWU6IFJlc3VsdFJhd1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVzdWx0cyA9IHZhbHVlO1xuICB9XG4gIGdldCBwYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cbiAgc2V0IHBhZ2UodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3BhZ2UgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemU7XG4gIH1cbiAgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IHZhbHVlO1xuICB9XG4gIGdldCB0b3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbDtcbiAgfVxuICBzZXQgdG90YWwodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RvdGFsID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgTGlzdFJlc3VsdHNSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBMaXN0UmVzdWx0c1Jlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0czogKHRoaXMucmVzdWx0cyB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKSxcbiAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgICAgdG90YWw6IHRoaXMudG90YWxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBMaXN0UmVzdWx0c1Jlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0czogKHRoaXMucmVzdWx0cyB8fCBbXSkubWFwKG0gPT4gbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKSksXG4gICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIHRvdGFsOiB0aGlzLnRvdGFsXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBMaXN0UmVzdWx0c1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBMaXN0UmVzdWx0c1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICByZXN1bHRzPzogUmVzdWx0UmF3LkFzT2JqZWN0W107XG4gICAgcGFnZTogbnVtYmVyO1xuICAgIHBhZ2VTaXplOiBudW1iZXI7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBMaXN0UmVzdWx0c1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICByZXN1bHRzOiBSZXN1bHRSYXcuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gICAgcGFnZTogbnVtYmVyO1xuICAgIHBhZ2VTaXplOiBudW1iZXI7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5HZXRSZXN1bHRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBHZXRSZXN1bHRSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkdldFJlc3VsdFJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBHZXRSZXN1bHRSZXF1ZXN0KCk7XG4gICAgR2V0UmVzdWx0UmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEdldFJlc3VsdFJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UucmVzdWx0SWQgPSBfaW5zdGFuY2UucmVzdWx0SWQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBHZXRSZXN1bHRSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5yZXN1bHRJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgR2V0UmVzdWx0UmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEdldFJlc3VsdFJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UucmVzdWx0SWQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnJlc3VsdElkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXN1bHRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgR2V0UmVzdWx0UmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxHZXRSZXN1bHRSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnJlc3VsdElkID0gX3ZhbHVlLnJlc3VsdElkO1xuICAgIEdldFJlc3VsdFJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCByZXN1bHRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRJZDtcbiAgfVxuICBzZXQgcmVzdWx0SWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Jlc3VsdElkID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgR2V0UmVzdWx0UmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBHZXRSZXN1bHRSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0SWQ6IHRoaXMucmVzdWx0SWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBHZXRSZXN1bHRSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0SWQ6IHRoaXMucmVzdWx0SWRcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEdldFJlc3VsdFJlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEdldFJlc3VsdFJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHJlc3VsdElkOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgR2V0UmVzdWx0UmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgcmVzdWx0SWQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5HZXRSZXN1bHRSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgR2V0UmVzdWx0UmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuR2V0UmVzdWx0UmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBHZXRSZXN1bHRSZXNwb25zZSgpO1xuICAgIEdldFJlc3VsdFJlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogR2V0UmVzdWx0UmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UucmVzdWx0ID0gX2luc3RhbmNlLnJlc3VsdCB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBHZXRSZXN1bHRSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0ID0gbmV3IFJlc3VsdFJhdygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0LFxuICAgICAgICAgICAgUmVzdWx0UmF3LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXRSZXN1bHRSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEdldFJlc3VsdFJlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnJlc3VsdCkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5yZXN1bHQgYXMgYW55LFxuICAgICAgICBSZXN1bHRSYXcuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdWx0PzogUmVzdWx0UmF3O1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgR2V0UmVzdWx0UmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8R2V0UmVzdWx0UmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMucmVzdWx0ID0gX3ZhbHVlLnJlc3VsdCA/IG5ldyBSZXN1bHRSYXcoX3ZhbHVlLnJlc3VsdCkgOiB1bmRlZmluZWQ7XG4gICAgR2V0UmVzdWx0UmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCByZXN1bHQoKTogUmVzdWx0UmF3IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzdWx0O1xuICB9XG4gIHNldCByZXN1bHQodmFsdWU6IFJlc3VsdFJhdyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Jlc3VsdCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIEdldFJlc3VsdFJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEdldFJlc3VsdFJlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiB0aGlzLnJlc3VsdCA/IHRoaXMucmVzdWx0LnRvT2JqZWN0KCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBHZXRSZXN1bHRSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdDogdGhpcy5yZXN1bHQgPyB0aGlzLnJlc3VsdC50b1Byb3RvYnVmSlNPTihvcHRpb25zKSA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEdldFJlc3VsdFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBHZXRSZXN1bHRSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcmVzdWx0PzogUmVzdWx0UmF3LkFzT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEdldFJlc3VsdFJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICByZXN1bHQ6IFJlc3VsdFJhdy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuR2V0T3duZXJUYXNrSWRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBHZXRPd25lclRhc2tJZFJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuR2V0T3duZXJUYXNrSWRSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgR2V0T3duZXJUYXNrSWRSZXF1ZXN0KCk7XG4gICAgR2V0T3duZXJUYXNrSWRSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogR2V0T3duZXJUYXNrSWRSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9pbnN0YW5jZS5zZXNzaW9uSWQgfHwgJyc7XG4gICAgX2luc3RhbmNlLnJlc3VsdElkID0gX2luc3RhbmNlLnJlc3VsdElkIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogR2V0T3duZXJUYXNrSWRSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5zZXNzaW9uSWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0SWQgPSBfaW5zdGFuY2UucmVzdWx0SWQgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXRPd25lclRhc2tJZFJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBHZXRPd25lclRhc2tJZFJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2Uuc2Vzc2lvbklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5zZXNzaW9uSWQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlc3VsdElkICYmIF9pbnN0YW5jZS5yZXN1bHRJZC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygyLCBfaW5zdGFuY2UucmVzdWx0SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Nlc3Npb25JZDogc3RyaW5nO1xuICBwcml2YXRlIF9yZXN1bHRJZDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBHZXRPd25lclRhc2tJZFJlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8R2V0T3duZXJUYXNrSWRSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb25JZCA9IF92YWx1ZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy5yZXN1bHRJZCA9IChfdmFsdWUucmVzdWx0SWQgfHwgW10pLnNsaWNlKCk7XG4gICAgR2V0T3duZXJUYXNrSWRSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuICBzZXQgc2Vzc2lvbklkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZXNzaW9uSWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcmVzdWx0SWQoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRJZDtcbiAgfVxuICBzZXQgcmVzdWx0SWQodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcmVzdWx0SWQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBHZXRPd25lclRhc2tJZFJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogR2V0T3duZXJUYXNrSWRSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIHJlc3VsdElkOiAodGhpcy5yZXN1bHRJZCB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEdldE93bmVyVGFza0lkUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICByZXN1bHRJZDogKHRoaXMucmVzdWx0SWQgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEdldE93bmVyVGFza0lkUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgR2V0T3duZXJUYXNrSWRSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICByZXN1bHRJZDogc3RyaW5nW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgR2V0T3duZXJUYXNrSWRSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICByZXN1bHRJZDogc3RyaW5nW107XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuR2V0T3duZXJUYXNrSWRSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgR2V0T3duZXJUYXNrSWRSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5HZXRPd25lclRhc2tJZFJlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgR2V0T3duZXJUYXNrSWRSZXNwb25zZSgpO1xuICAgIEdldE93bmVyVGFza0lkUmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBHZXRPd25lclRhc2tJZFJlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLnJlc3VsdFRhc2sgPSBfaW5zdGFuY2UucmVzdWx0VGFzayB8fCBbXTtcbiAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX2luc3RhbmNlLnNlc3Npb25JZCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEdldE93bmVyVGFza0lkUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMSA9IG5ldyBHZXRPd25lclRhc2tJZFJlc3BvbnNlLk1hcFJlc3VsdFRhc2soKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIEdldE93bmVyVGFza0lkUmVzcG9uc2UuTWFwUmVzdWx0VGFzay5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0VGFzayA9IF9pbnN0YW5jZS5yZXN1bHRUYXNrIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXRPd25lclRhc2tJZFJlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogR2V0T3duZXJUYXNrSWRSZXNwb25zZSxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5yZXN1bHRUYXNrICYmIF9pbnN0YW5jZS5yZXN1bHRUYXNrLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLnJlc3VsdFRhc2sgYXMgYW55LFxuICAgICAgICBHZXRPd25lclRhc2tJZFJlc3BvbnNlLk1hcFJlc3VsdFRhc2suc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc2Vzc2lvbklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5zZXNzaW9uSWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3VsdFRhc2s/OiBHZXRPd25lclRhc2tJZFJlc3BvbnNlLk1hcFJlc3VsdFRhc2tbXTtcbiAgcHJpdmF0ZSBfc2Vzc2lvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBHZXRPd25lclRhc2tJZFJlc3BvbnNlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPEdldE93bmVyVGFza0lkUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMucmVzdWx0VGFzayA9IChfdmFsdWUucmVzdWx0VGFzayB8fCBbXSkubWFwKFxuICAgICAgbSA9PiBuZXcgR2V0T3duZXJUYXNrSWRSZXNwb25zZS5NYXBSZXN1bHRUYXNrKG0pXG4gICAgKTtcbiAgICB0aGlzLnNlc3Npb25JZCA9IF92YWx1ZS5zZXNzaW9uSWQ7XG4gICAgR2V0T3duZXJUYXNrSWRSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHJlc3VsdFRhc2soKTogR2V0T3duZXJUYXNrSWRSZXNwb25zZS5NYXBSZXN1bHRUYXNrW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRUYXNrO1xuICB9XG4gIHNldCByZXN1bHRUYXNrKHZhbHVlOiBHZXRPd25lclRhc2tJZFJlc3BvbnNlLk1hcFJlc3VsdFRhc2tbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Jlc3VsdFRhc2sgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuICBzZXQgc2Vzc2lvbklkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZXNzaW9uSWQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBHZXRPd25lclRhc2tJZFJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEdldE93bmVyVGFza0lkUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRUYXNrOiAodGhpcy5yZXN1bHRUYXNrIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEdldE93bmVyVGFza0lkUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRUYXNrOiAodGhpcy5yZXN1bHRUYXNrIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKSxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEdldE93bmVyVGFza0lkUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEdldE93bmVyVGFza0lkUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHJlc3VsdFRhc2s/OiBHZXRPd25lclRhc2tJZFJlc3BvbnNlLk1hcFJlc3VsdFRhc2suQXNPYmplY3RbXTtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBHZXRPd25lclRhc2tJZFJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICByZXN1bHRUYXNrOiBHZXRPd25lclRhc2tJZFJlc3BvbnNlLk1hcFJlc3VsdFRhc2suQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gICAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkdldE93bmVyVGFza0lkUmVzcG9uc2UuTWFwUmVzdWx0VGFza1xuICAgKi9cbiAgZXhwb3J0IGNsYXNzIE1hcFJlc3VsdFRhc2sgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID1cbiAgICAgICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuR2V0T3duZXJUYXNrSWRSZXNwb25zZS5NYXBSZXN1bHRUYXNrJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTWFwUmVzdWx0VGFzaygpO1xuICAgICAgTWFwUmVzdWx0VGFzay5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogTWFwUmVzdWx0VGFzaykge1xuICAgICAgX2luc3RhbmNlLnJlc3VsdElkID0gX2luc3RhbmNlLnJlc3VsdElkIHx8ICcnO1xuICAgICAgX2luc3RhbmNlLnRhc2tJZCA9IF9pbnN0YW5jZS50YXNrSWQgfHwgJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIF9pbnN0YW5jZTogTWFwUmVzdWx0VGFzayxcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5yZXN1bHRJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2luc3RhbmNlLnRhc2tJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgTWFwUmVzdWx0VGFzay5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgICAgX2luc3RhbmNlOiBNYXBSZXN1bHRUYXNrLFxuICAgICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICAgKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLnJlc3VsdElkKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnJlc3VsdElkKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UudGFza0lkKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLnRhc2tJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzdWx0SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF90YXNrSWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIE1hcFJlc3VsdFRhc2sgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPE1hcFJlc3VsdFRhc2suQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLnJlc3VsdElkID0gX3ZhbHVlLnJlc3VsdElkO1xuICAgICAgdGhpcy50YXNrSWQgPSBfdmFsdWUudGFza0lkO1xuICAgICAgTWFwUmVzdWx0VGFzay5yZWZpbmVWYWx1ZXModGhpcyk7XG4gICAgfVxuICAgIGdldCByZXN1bHRJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdElkO1xuICAgIH1cbiAgICBzZXQgcmVzdWx0SWQodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fcmVzdWx0SWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHRhc2tJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tJZDtcbiAgICB9XG4gICAgc2V0IHRhc2tJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl90YXNrSWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgTWFwUmVzdWx0VGFzay5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICAgKi9cbiAgICB0b09iamVjdCgpOiBNYXBSZXN1bHRUYXNrLkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkLFxuICAgICAgICB0YXNrSWQ6IHRoaXMudGFza0lkXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IE1hcFJlc3VsdFRhc2suQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0SWQ6IHRoaXMucmVzdWx0SWQsXG4gICAgICAgIHRhc2tJZDogdGhpcy50YXNrSWRcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgTWFwUmVzdWx0VGFzayB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIE1hcFJlc3VsdFRhc2tcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIHJlc3VsdElkOiBzdHJpbmc7XG4gICAgICB0YXNrSWQ6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBNYXBSZXN1bHRUYXNrXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICByZXN1bHRJZDogc3RyaW5nO1xuICAgICAgdGFza0lkOiBzdHJpbmc7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkNyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QoKTtcbiAgICBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5yZXN1bHRzID0gX2luc3RhbmNlLnJlc3VsdHMgfHwgW107XG4gICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9pbnN0YW5jZS5zZXNzaW9uSWQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjEgPSBuZXcgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdC5SZXN1bHRDcmVhdGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QuUmVzdWx0Q3JlYXRlXG4gICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0cyA9IF9pbnN0YW5jZS5yZXN1bHRzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5yZXN1bHRzICYmIF9pbnN0YW5jZS5yZXN1bHRzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLnJlc3VsdHMgYXMgYW55LFxuICAgICAgICBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXF1ZXN0LlJlc3VsdENyZWF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5zZXNzaW9uSWQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLnNlc3Npb25JZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdWx0cz86IENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QuUmVzdWx0Q3JlYXRlW107XG4gIHByaXZhdGUgX3Nlc3Npb25JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXF1ZXN0LkFzT2JqZWN0PlxuICApIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5yZXN1bHRzID0gKF92YWx1ZS5yZXN1bHRzIHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXF1ZXN0LlJlc3VsdENyZWF0ZShtKVxuICAgICk7XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBfdmFsdWUuc2Vzc2lvbklkO1xuICAgIENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCByZXN1bHRzKCk6IENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QuUmVzdWx0Q3JlYXRlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRzO1xuICB9XG4gIHNldCByZXN1bHRzKHZhbHVlOiBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXF1ZXN0LlJlc3VsdENyZWF0ZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVzdWx0cyA9IHZhbHVlO1xuICB9XG4gIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICB9XG4gIHNldCBzZXNzaW9uSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdHM6ICh0aGlzLnJlc3VsdHMgfHwgW10pLm1hcChtID0+IG0udG9PYmplY3QoKSksXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdHM6ICh0aGlzLnJlc3VsdHMgfHwgW10pLm1hcChtID0+IG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucykpLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcmVzdWx0cz86IENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QuUmVzdWx0Q3JlYXRlLkFzT2JqZWN0W107XG4gICAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgcmVzdWx0czogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVxdWVzdC5SZXN1bHRDcmVhdGUuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gICAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkNyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QuUmVzdWx0Q3JlYXRlXG4gICAqL1xuICBleHBvcnQgY2xhc3MgUmVzdWx0Q3JlYXRlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICAgIHN0YXRpYyBpZCA9XG4gICAgICAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkNyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlcXVlc3QuUmVzdWx0Q3JlYXRlJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUmVzdWx0Q3JlYXRlKCk7XG4gICAgICBSZXN1bHRDcmVhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFJlc3VsdENyZWF0ZSkge1xuICAgICAgX2luc3RhbmNlLm5hbWUgPSBfaW5zdGFuY2UubmFtZSB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5tYW51YWxEZWxldGlvbiA9IF9pbnN0YW5jZS5tYW51YWxEZWxldGlvbiB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBSZXN1bHRDcmVhdGUsXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfaW5zdGFuY2UubmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2luc3RhbmNlLm1hbnVhbERlbGV0aW9uID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUmVzdWx0Q3JlYXRlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgICBfaW5zdGFuY2U6IFJlc3VsdENyZWF0ZSxcbiAgICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICAgICkge1xuICAgICAgaWYgKF9pbnN0YW5jZS5uYW1lKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLm5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5tYW51YWxEZWxldGlvbikge1xuICAgICAgICBfd3JpdGVyLndyaXRlQm9vbCgyLCBfaW5zdGFuY2UubWFudWFsRGVsZXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIF9tYW51YWxEZWxldGlvbjogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFJlc3VsdENyZWF0ZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8UmVzdWx0Q3JlYXRlLkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy5uYW1lID0gX3ZhbHVlLm5hbWU7XG4gICAgICB0aGlzLm1hbnVhbERlbGV0aW9uID0gX3ZhbHVlLm1hbnVhbERlbGV0aW9uO1xuICAgICAgUmVzdWx0Q3JlYXRlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cbiAgICBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBtYW51YWxEZWxldGlvbigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYW51YWxEZWxldGlvbjtcbiAgICB9XG4gICAgc2V0IG1hbnVhbERlbGV0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9tYW51YWxEZWxldGlvbiA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgICBSZXN1bHRDcmVhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogUmVzdWx0Q3JlYXRlLkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgbWFudWFsRGVsZXRpb246IHRoaXMubWFudWFsRGVsZXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAgICovXG4gICAgdG9Qcm90b2J1ZkpTT04oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICAgKTogUmVzdWx0Q3JlYXRlLkFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgbWFudWFsRGVsZXRpb246IHRoaXMubWFudWFsRGVsZXRpb25cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgUmVzdWx0Q3JlYXRlIHtcbiAgICAvKipcbiAgICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgUmVzdWx0Q3JlYXRlXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBtYW51YWxEZWxldGlvbjogYm9vbGVhbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBSZXN1bHRDcmVhdGVcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIG1hbnVhbERlbGV0aW9uOiBib29sZWFuO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5DcmVhdGVSZXN1bHRzTWV0YURhdGFSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXNwb25zZSgpO1xuICAgIENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UucmVzdWx0cyA9IF9pbnN0YW5jZS5yZXN1bHRzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMSA9IG5ldyBSZXN1bHRSYXcoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIFJlc3VsdFJhdy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0cyA9IF9pbnN0YW5jZS5yZXN1bHRzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnJlc3VsdHMgJiYgX2luc3RhbmNlLnJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAxLFxuICAgICAgICBfaW5zdGFuY2UucmVzdWx0cyBhcyBhbnksXG4gICAgICAgIFJlc3VsdFJhdy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXN1bHRzPzogUmVzdWx0UmF3W107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDcmVhdGVSZXN1bHRzTWV0YURhdGFSZXNwb25zZS5Bc09iamVjdD5cbiAgKSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMucmVzdWx0cyA9IChfdmFsdWUucmVzdWx0cyB8fCBbXSkubWFwKG0gPT4gbmV3IFJlc3VsdFJhdyhtKSk7XG4gICAgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCByZXN1bHRzKCk6IFJlc3VsdFJhd1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzdWx0cztcbiAgfVxuICBzZXQgcmVzdWx0cyh2YWx1ZTogUmVzdWx0UmF3W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9yZXN1bHRzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRzOiAodGhpcy5yZXN1bHRzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRzOiAodGhpcy5yZXN1bHRzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENyZWF0ZVJlc3VsdHNNZXRhRGF0YVJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICByZXN1bHRzPzogUmVzdWx0UmF3LkFzT2JqZWN0W107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ3JlYXRlUmVzdWx0c01ldGFEYXRhUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHJlc3VsdHM6IFJlc3VsdFJhdy5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5DcmVhdGVSZXN1bHRzUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVzdWx0c1JlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuQ3JlYXRlUmVzdWx0c1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDcmVhdGVSZXN1bHRzUmVxdWVzdCgpO1xuICAgIENyZWF0ZVJlc3VsdHNSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ3JlYXRlUmVzdWx0c1JlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UucmVzdWx0cyA9IF9pbnN0YW5jZS5yZXN1bHRzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5zZXNzaW9uSWQgPSBfaW5zdGFuY2Uuc2Vzc2lvbklkIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ3JlYXRlUmVzdWx0c1JlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMSA9IG5ldyBDcmVhdGVSZXN1bHRzUmVxdWVzdC5SZXN1bHRDcmVhdGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIENyZWF0ZVJlc3VsdHNSZXF1ZXN0LlJlc3VsdENyZWF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0cyA9IF9pbnN0YW5jZS5yZXN1bHRzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDcmVhdGVSZXN1bHRzUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENyZWF0ZVJlc3VsdHNSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnJlc3VsdHMgJiYgX2luc3RhbmNlLnJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAxLFxuICAgICAgICBfaW5zdGFuY2UucmVzdWx0cyBhcyBhbnksXG4gICAgICAgIENyZWF0ZVJlc3VsdHNSZXF1ZXN0LlJlc3VsdENyZWF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5zZXNzaW9uSWQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLnNlc3Npb25JZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdWx0cz86IENyZWF0ZVJlc3VsdHNSZXF1ZXN0LlJlc3VsdENyZWF0ZVtdO1xuICBwcml2YXRlIF9zZXNzaW9uSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENyZWF0ZVJlc3VsdHNSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPENyZWF0ZVJlc3VsdHNSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnJlc3VsdHMgPSAoX3ZhbHVlLnJlc3VsdHMgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IENyZWF0ZVJlc3VsdHNSZXF1ZXN0LlJlc3VsdENyZWF0ZShtKVxuICAgICk7XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBfdmFsdWUuc2Vzc2lvbklkO1xuICAgIENyZWF0ZVJlc3VsdHNSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcmVzdWx0cygpOiBDcmVhdGVSZXN1bHRzUmVxdWVzdC5SZXN1bHRDcmVhdGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHM7XG4gIH1cbiAgc2V0IHJlc3VsdHModmFsdWU6IENyZWF0ZVJlc3VsdHNSZXF1ZXN0LlJlc3VsdENyZWF0ZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVzdWx0cyA9IHZhbHVlO1xuICB9XG4gIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICB9XG4gIHNldCBzZXNzaW9uSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENyZWF0ZVJlc3VsdHNSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENyZWF0ZVJlc3VsdHNSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0czogKHRoaXMucmVzdWx0cyB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKSxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBDcmVhdGVSZXN1bHRzUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdHM6ICh0aGlzLnJlc3VsdHMgfHwgW10pLm1hcChtID0+IG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucykpLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ3JlYXRlUmVzdWx0c1JlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENyZWF0ZVJlc3VsdHNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICByZXN1bHRzPzogQ3JlYXRlUmVzdWx0c1JlcXVlc3QuUmVzdWx0Q3JlYXRlLkFzT2JqZWN0W107XG4gICAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ3JlYXRlUmVzdWx0c1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHJlc3VsdHM6IENyZWF0ZVJlc3VsdHNSZXF1ZXN0LlJlc3VsdENyZWF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuQ3JlYXRlUmVzdWx0c1JlcXVlc3QuUmVzdWx0Q3JlYXRlXG4gICAqL1xuICBleHBvcnQgY2xhc3MgUmVzdWx0Q3JlYXRlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICAgIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuQ3JlYXRlUmVzdWx0c1JlcXVlc3QuUmVzdWx0Q3JlYXRlJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUmVzdWx0Q3JlYXRlKCk7XG4gICAgICBSZXN1bHRDcmVhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFJlc3VsdENyZWF0ZSkge1xuICAgICAgX2luc3RhbmNlLm5hbWUgPSBfaW5zdGFuY2UubmFtZSB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5kYXRhID0gX2luc3RhbmNlLmRhdGEgfHwgbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgIF9pbnN0YW5jZS5tYW51YWxEZWxldGlvbiA9IF9pbnN0YW5jZS5tYW51YWxEZWxldGlvbiB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBSZXN1bHRDcmVhdGUsXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfaW5zdGFuY2UubmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2luc3RhbmNlLmRhdGEgPSBfcmVhZGVyLnJlYWRCeXRlcygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgX2luc3RhbmNlLm1hbnVhbERlbGV0aW9uID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUmVzdWx0Q3JlYXRlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgICBfaW5zdGFuY2U6IFJlc3VsdENyZWF0ZSxcbiAgICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICAgICkge1xuICAgICAgaWYgKF9pbnN0YW5jZS5uYW1lKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLm5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5kYXRhICYmIF9pbnN0YW5jZS5kYXRhLmxlbmd0aCkge1xuICAgICAgICBfd3JpdGVyLndyaXRlQnl0ZXMoMiwgX2luc3RhbmNlLmRhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5tYW51YWxEZWxldGlvbikge1xuICAgICAgICBfd3JpdGVyLndyaXRlQm9vbCgzLCBfaW5zdGFuY2UubWFudWFsRGVsZXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIF9kYXRhOiBVaW50OEFycmF5O1xuICAgIHByaXZhdGUgX21hbnVhbERlbGV0aW9uOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgUmVzdWx0Q3JlYXRlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxSZXN1bHRDcmVhdGUuQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLm5hbWUgPSBfdmFsdWUubmFtZTtcbiAgICAgIHRoaXMuZGF0YSA9IF92YWx1ZS5kYXRhO1xuICAgICAgdGhpcy5tYW51YWxEZWxldGlvbiA9IF92YWx1ZS5tYW51YWxEZWxldGlvbjtcbiAgICAgIFJlc3VsdENyZWF0ZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gICAgfVxuICAgIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG4gICAgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpOiBVaW50OEFycmF5IHtcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICBzZXQgZGF0YSh2YWx1ZTogVWludDhBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgbWFudWFsRGVsZXRpb24oKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFudWFsRGVsZXRpb247XG4gICAgfVxuICAgIHNldCBtYW51YWxEZWxldGlvbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fbWFudWFsRGVsZXRpb24gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgUmVzdWx0Q3JlYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IFJlc3VsdENyZWF0ZS5Bc09iamVjdCB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5zdWJhcnJheSgwKSA6IG5ldyBVaW50OEFycmF5KCksXG4gICAgICAgIG1hbnVhbERlbGV0aW9uOiB0aGlzLm1hbnVhbERlbGV0aW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IFJlc3VsdENyZWF0ZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YSA/IHVpbnQ4QXJyYXlUb0Jhc2U2NCh0aGlzLmRhdGEpIDogJycsXG4gICAgICAgIG1hbnVhbERlbGV0aW9uOiB0aGlzLm1hbnVhbERlbGV0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBleHBvcnQgbW9kdWxlIFJlc3VsdENyZWF0ZSB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdENyZWF0ZVxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZGF0YTogVWludDhBcnJheTtcbiAgICAgIG1hbnVhbERlbGV0aW9uOiBib29sZWFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdENyZWF0ZVxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZGF0YTogc3RyaW5nO1xuICAgICAgbWFudWFsRGVsZXRpb246IGJvb2xlYW47XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkNyZWF0ZVJlc3VsdHNSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVzdWx0c1Jlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkNyZWF0ZVJlc3VsdHNSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENyZWF0ZVJlc3VsdHNSZXNwb25zZSgpO1xuICAgIENyZWF0ZVJlc3VsdHNSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENyZWF0ZVJlc3VsdHNSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5yZXN1bHRzID0gX2luc3RhbmNlLnJlc3VsdHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDcmVhdGVSZXN1bHRzUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMSA9IG5ldyBSZXN1bHRSYXcoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIFJlc3VsdFJhdy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0cyA9IF9pbnN0YW5jZS5yZXN1bHRzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDcmVhdGVSZXN1bHRzUmVzcG9uc2UucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBDcmVhdGVSZXN1bHRzUmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UucmVzdWx0cyAmJiBfaW5zdGFuY2UucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5yZXN1bHRzIGFzIGFueSxcbiAgICAgICAgUmVzdWx0UmF3LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3VsdHM/OiBSZXN1bHRSYXdbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENyZWF0ZVJlc3VsdHNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDcmVhdGVSZXN1bHRzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMucmVzdWx0cyA9IChfdmFsdWUucmVzdWx0cyB8fCBbXSkubWFwKG0gPT4gbmV3IFJlc3VsdFJhdyhtKSk7XG4gICAgQ3JlYXRlUmVzdWx0c1Jlc3BvbnNlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcmVzdWx0cygpOiBSZXN1bHRSYXdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHM7XG4gIH1cbiAgc2V0IHJlc3VsdHModmFsdWU6IFJlc3VsdFJhd1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVzdWx0cyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENyZWF0ZVJlc3VsdHNSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDcmVhdGVSZXN1bHRzUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRzOiAodGhpcy5yZXN1bHRzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ3JlYXRlUmVzdWx0c1Jlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0czogKHRoaXMucmVzdWx0cyB8fCBbXSkubWFwKG0gPT4gbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKSlcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENyZWF0ZVJlc3VsdHNSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ3JlYXRlUmVzdWx0c1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICByZXN1bHRzPzogUmVzdWx0UmF3LkFzT2JqZWN0W107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ3JlYXRlUmVzdWx0c1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICByZXN1bHRzOiBSZXN1bHRSYXcuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLlVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3QoKTtcbiAgICBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0KSB7fVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5pZCA9IG5ldyBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5SZXN1bHRJZGVudGlmaWVyKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5pZCxcbiAgICAgICAgICAgIFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0LlJlc3VsdElkZW50aWZpZXIuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5kYXRhQ2h1bmsgPSBfcmVhZGVyLnJlYWRCeXRlcygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5pZCkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5pZCBhcyBhbnksXG4gICAgICAgIFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0LlJlc3VsdElkZW50aWZpZXIuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZGF0YUNodW5rICYmIF9pbnN0YW5jZS5kYXRhQ2h1bmsubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQnl0ZXMoMiwgX2luc3RhbmNlLmRhdGFDaHVuayk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaWQ/OiBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5SZXN1bHRJZGVudGlmaWVyO1xuICBwcml2YXRlIF9kYXRhQ2h1bms6IFVpbnQ4QXJyYXk7XG5cbiAgcHJpdmF0ZSBfdHlwZTogVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3QuVHlwZUNhc2UgPVxuICAgIFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0LlR5cGVDYXNlLm5vbmU7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxVcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5pZCA9IF92YWx1ZS5pZFxuICAgICAgPyBuZXcgVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3QuUmVzdWx0SWRlbnRpZmllcihfdmFsdWUuaWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRhdGFDaHVuayA9IF92YWx1ZS5kYXRhQ2h1bms7XG4gICAgVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBpZCgpOiBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5SZXN1bHRJZGVudGlmaWVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cbiAgc2V0IGlkKHZhbHVlOiBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5SZXN1bHRJZGVudGlmaWVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2RhdGFDaHVuayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3R5cGUgPSBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5UeXBlQ2FzZS5pZDtcbiAgICB9XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZGF0YUNodW5rKCk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhQ2h1bms7XG4gIH1cbiAgc2V0IGRhdGFDaHVuayh2YWx1ZTogVWludDhBcnJheSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9pZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3R5cGUgPSBVcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5UeXBlQ2FzZS5kYXRhQ2h1bms7XG4gICAgfVxuICAgIHRoaXMuX2RhdGFDaHVuayA9IHZhbHVlO1xuICB9XG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQgPyB0aGlzLmlkLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBkYXRhQ2h1bms6IHRoaXMuZGF0YUNodW5rID8gdGhpcy5kYXRhQ2h1bmsuc3ViYXJyYXkoMCkgOiBuZXcgVWludDhBcnJheSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCA/IHRoaXMuaWQudG9Qcm90b2J1ZkpTT04ob3B0aW9ucykgOiBudWxsLFxuICAgICAgZGF0YUNodW5rOiB0aGlzLmRhdGFDaHVuayA/IHVpbnQ4QXJyYXlUb0Jhc2U2NCh0aGlzLmRhdGFDaHVuaykgOiAnJ1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBpZD86IFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0LlJlc3VsdElkZW50aWZpZXIuQXNPYmplY3Q7XG4gICAgZGF0YUNodW5rOiBVaW50OEFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFVwbG9hZFJlc3VsdERhdGFSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBpZDogVXBsb2FkUmVzdWx0RGF0YVJlcXVlc3QuUmVzdWx0SWRlbnRpZmllci5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgZGF0YUNodW5rOiBzdHJpbmc7XG4gIH1cbiAgZXhwb3J0IGVudW0gVHlwZUNhc2Uge1xuICAgIG5vbmUgPSAwLFxuICAgIGlkID0gMSxcbiAgICBkYXRhQ2h1bmsgPSAyXG4gIH1cbiAgLyoqXG4gICAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5VcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5SZXN1bHRJZGVudGlmaWVyXG4gICAqL1xuICBleHBvcnQgY2xhc3MgUmVzdWx0SWRlbnRpZmllciBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgICBzdGF0aWMgaWQgPVxuICAgICAgJ2FybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5VcGxvYWRSZXN1bHREYXRhUmVxdWVzdC5SZXN1bHRJZGVudGlmaWVyJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUmVzdWx0SWRlbnRpZmllcigpO1xuICAgICAgUmVzdWx0SWRlbnRpZmllci5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogUmVzdWx0SWRlbnRpZmllcikge1xuICAgICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9pbnN0YW5jZS5zZXNzaW9uSWQgfHwgJyc7XG4gICAgICBfaW5zdGFuY2UucmVzdWx0SWQgPSBfaW5zdGFuY2UucmVzdWx0SWQgfHwgJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIF9pbnN0YW5jZTogUmVzdWx0SWRlbnRpZmllcixcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5zZXNzaW9uSWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5yZXN1bHRJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUmVzdWx0SWRlbnRpZmllci5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgICAgX2luc3RhbmNlOiBSZXN1bHRJZGVudGlmaWVyLFxuICAgICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICAgKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLnNlc3Npb25JZCkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5yZXN1bHRJZCkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5yZXN1bHRJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbklkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcmVzdWx0SWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFJlc3VsdElkZW50aWZpZXIgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFJlc3VsdElkZW50aWZpZXIuQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLnNlc3Npb25JZCA9IF92YWx1ZS5zZXNzaW9uSWQ7XG4gICAgICB0aGlzLnJlc3VsdElkID0gX3ZhbHVlLnJlc3VsdElkO1xuICAgICAgUmVzdWx0SWRlbnRpZmllci5yZWZpbmVWYWx1ZXModGhpcyk7XG4gICAgfVxuICAgIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uSWQ7XG4gICAgfVxuICAgIHNldCBzZXNzaW9uSWQodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fc2Vzc2lvbklkID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCByZXN1bHRJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdElkO1xuICAgIH1cbiAgICBzZXQgcmVzdWx0SWQodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fcmVzdWx0SWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgUmVzdWx0SWRlbnRpZmllci5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICAgKi9cbiAgICB0b09iamVjdCgpOiBSZXN1bHRJZGVudGlmaWVyLkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IFJlc3VsdElkZW50aWZpZXIuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgcmVzdWx0SWQ6IHRoaXMucmVzdWx0SWRcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgUmVzdWx0SWRlbnRpZmllciB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdElkZW50aWZpZXJcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgICAgcmVzdWx0SWQ6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBSZXN1bHRJZGVudGlmaWVyXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICAgIHJlc3VsdElkOiBzdHJpbmc7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLlVwbG9hZFJlc3VsdERhdGFSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgVXBsb2FkUmVzdWx0RGF0YVJlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLlVwbG9hZFJlc3VsdERhdGFSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFVwbG9hZFJlc3VsdERhdGFSZXNwb25zZSgpO1xuICAgIFVwbG9hZFJlc3VsdERhdGFSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFVwbG9hZFJlc3VsdERhdGFSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5yZXN1bHQgPSBfaW5zdGFuY2UucmVzdWx0IHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFVwbG9hZFJlc3VsdERhdGFSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0ID0gbmV3IFJlc3VsdFJhdygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0LFxuICAgICAgICAgICAgUmVzdWx0UmF3LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBVcGxvYWRSZXN1bHREYXRhUmVzcG9uc2UucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBVcGxvYWRSZXN1bHREYXRhUmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UucmVzdWx0KSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLnJlc3VsdCBhcyBhbnksXG4gICAgICAgIFJlc3VsdFJhdy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXN1bHQ/OiBSZXN1bHRSYXc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBVcGxvYWRSZXN1bHREYXRhUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VXBsb2FkUmVzdWx0RGF0YVJlc3BvbnNlLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnJlc3VsdCA9IF92YWx1ZS5yZXN1bHQgPyBuZXcgUmVzdWx0UmF3KF92YWx1ZS5yZXN1bHQpIDogdW5kZWZpbmVkO1xuICAgIFVwbG9hZFJlc3VsdERhdGFSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHJlc3VsdCgpOiBSZXN1bHRSYXcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHQ7XG4gIH1cbiAgc2V0IHJlc3VsdCh2YWx1ZTogUmVzdWx0UmF3IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVzdWx0ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgVXBsb2FkUmVzdWx0RGF0YVJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFVwbG9hZFJlc3VsdERhdGFSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdDogdGhpcy5yZXN1bHQgPyB0aGlzLnJlc3VsdC50b09iamVjdCgpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogVXBsb2FkUmVzdWx0RGF0YVJlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiB0aGlzLnJlc3VsdCA/IHRoaXMucmVzdWx0LnRvUHJvdG9idWZKU09OKG9wdGlvbnMpIDogbnVsbFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgVXBsb2FkUmVzdWx0RGF0YVJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBVcGxvYWRSZXN1bHREYXRhUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHJlc3VsdD86IFJlc3VsdFJhdy5Bc09iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBVcGxvYWRSZXN1bHREYXRhUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHJlc3VsdDogUmVzdWx0UmF3LkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5SZXN1bHRzU2VydmljZUNvbmZpZ3VyYXRpb25SZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgUmVzdWx0c1NlcnZpY2VDb25maWd1cmF0aW9uUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuUmVzdWx0c1NlcnZpY2VDb25maWd1cmF0aW9uUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBSZXN1bHRzU2VydmljZUNvbmZpZ3VyYXRpb25SZXNwb25zZSgpO1xuICAgIFJlc3VsdHNTZXJ2aWNlQ29uZmlndXJhdGlvblJlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogUmVzdWx0c1NlcnZpY2VDb25maWd1cmF0aW9uUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UuZGF0YUNodW5rTWF4U2l6ZSA9IF9pbnN0YW5jZS5kYXRhQ2h1bmtNYXhTaXplIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBSZXN1bHRzU2VydmljZUNvbmZpZ3VyYXRpb25SZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UuZGF0YUNodW5rTWF4U2l6ZSA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBSZXN1bHRzU2VydmljZUNvbmZpZ3VyYXRpb25SZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFJlc3VsdHNTZXJ2aWNlQ29uZmlndXJhdGlvblJlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmRhdGFDaHVua01heFNpemUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMigxLCBfaW5zdGFuY2UuZGF0YUNodW5rTWF4U2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGF0YUNodW5rTWF4U2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgUmVzdWx0c1NlcnZpY2VDb25maWd1cmF0aW9uUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8UmVzdWx0c1NlcnZpY2VDb25maWd1cmF0aW9uUmVzcG9uc2UuQXNPYmplY3Q+XG4gICkge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmRhdGFDaHVua01heFNpemUgPSBfdmFsdWUuZGF0YUNodW5rTWF4U2l6ZTtcbiAgICBSZXN1bHRzU2VydmljZUNvbmZpZ3VyYXRpb25SZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGRhdGFDaHVua01heFNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YUNodW5rTWF4U2l6ZTtcbiAgfVxuICBzZXQgZGF0YUNodW5rTWF4U2l6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YUNodW5rTWF4U2l6ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFJlc3VsdHNTZXJ2aWNlQ29uZmlndXJhdGlvblJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFJlc3VsdHNTZXJ2aWNlQ29uZmlndXJhdGlvblJlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YUNodW5rTWF4U2l6ZTogdGhpcy5kYXRhQ2h1bmtNYXhTaXplXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogUmVzdWx0c1NlcnZpY2VDb25maWd1cmF0aW9uUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhQ2h1bmtNYXhTaXplOiB0aGlzLmRhdGFDaHVua01heFNpemVcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFJlc3VsdHNTZXJ2aWNlQ29uZmlndXJhdGlvblJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBSZXN1bHRzU2VydmljZUNvbmZpZ3VyYXRpb25SZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZGF0YUNodW5rTWF4U2l6ZTogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdHNTZXJ2aWNlQ29uZmlndXJhdGlvblJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBkYXRhQ2h1bmtNYXhTaXplOiBudW1iZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuRG93bmxvYWRSZXN1bHREYXRhUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgRG93bmxvYWRSZXN1bHREYXRhUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5Eb3dubG9hZFJlc3VsdERhdGFSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRG93bmxvYWRSZXN1bHREYXRhUmVxdWVzdCgpO1xuICAgIERvd25sb2FkUmVzdWx0RGF0YVJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBEb3dubG9hZFJlc3VsdERhdGFSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9pbnN0YW5jZS5zZXNzaW9uSWQgfHwgJyc7XG4gICAgX2luc3RhbmNlLnJlc3VsdElkID0gX2luc3RhbmNlLnJlc3VsdElkIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogRG93bmxvYWRSZXN1bHREYXRhUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0SWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIERvd25sb2FkUmVzdWx0RGF0YVJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBEb3dubG9hZFJlc3VsdERhdGFSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnNlc3Npb25JZCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2Uuc2Vzc2lvbklkKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5yZXN1bHRJZCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UucmVzdWx0SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Nlc3Npb25JZDogc3RyaW5nO1xuICBwcml2YXRlIF9yZXN1bHRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgRG93bmxvYWRSZXN1bHREYXRhUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxEb3dubG9hZFJlc3VsdERhdGFSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb25JZCA9IF92YWx1ZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy5yZXN1bHRJZCA9IF92YWx1ZS5yZXN1bHRJZDtcbiAgICBEb3dubG9hZFJlc3VsdERhdGFSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuICBzZXQgc2Vzc2lvbklkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZXNzaW9uSWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcmVzdWx0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzdWx0SWQ7XG4gIH1cbiAgc2V0IHJlc3VsdElkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZXN1bHRJZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIERvd25sb2FkUmVzdWx0RGF0YVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogRG93bmxvYWRSZXN1bHREYXRhUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICByZXN1bHRJZDogdGhpcy5yZXN1bHRJZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IERvd25sb2FkUmVzdWx0RGF0YVJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgcmVzdWx0SWQ6IHRoaXMucmVzdWx0SWRcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIERvd25sb2FkUmVzdWx0RGF0YVJlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIERvd25sb2FkUmVzdWx0RGF0YVJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIHJlc3VsdElkOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRG93bmxvYWRSZXN1bHREYXRhUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gICAgcmVzdWx0SWQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5Eb3dubG9hZFJlc3VsdERhdGFSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEb3dubG9hZFJlc3VsdERhdGFSZXNwb25zZSgpO1xuICAgIERvd25sb2FkUmVzdWx0RGF0YVJlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UuZGF0YUNodW5rID0gX2luc3RhbmNlLmRhdGFDaHVuayB8fCBuZXcgVWludDhBcnJheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLmRhdGFDaHVuayA9IF9yZWFkZXIucmVhZEJ5dGVzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBEb3dubG9hZFJlc3VsdERhdGFSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IERvd25sb2FkUmVzdWx0RGF0YVJlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmRhdGFDaHVuayAmJiBfaW5zdGFuY2UuZGF0YUNodW5rLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZUJ5dGVzKDEsIF9pbnN0YW5jZS5kYXRhQ2h1bmspO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2RhdGFDaHVuazogVWludDhBcnJheTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIERvd25sb2FkUmVzdWx0RGF0YVJlc3BvbnNlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPERvd25sb2FkUmVzdWx0RGF0YVJlc3BvbnNlLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmRhdGFDaHVuayA9IF92YWx1ZS5kYXRhQ2h1bms7XG4gICAgRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBkYXRhQ2h1bmsoKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFDaHVuaztcbiAgfVxuICBzZXQgZGF0YUNodW5rKHZhbHVlOiBVaW50OEFycmF5KSB7XG4gICAgdGhpcy5fZGF0YUNodW5rID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhQ2h1bms6IHRoaXMuZGF0YUNodW5rID8gdGhpcy5kYXRhQ2h1bmsuc3ViYXJyYXkoMCkgOiBuZXcgVWludDhBcnJheSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhQ2h1bms6IHRoaXMuZGF0YUNodW5rID8gdWludDhBcnJheVRvQmFzZTY0KHRoaXMuZGF0YUNodW5rKSA6ICcnXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBEb3dubG9hZFJlc3VsdERhdGFSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgRG93bmxvYWRSZXN1bHREYXRhUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGRhdGFDaHVuazogVWludDhBcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBEb3dubG9hZFJlc3VsdERhdGFSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZGF0YUNodW5rOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWxldGVSZXN1bHRzRGF0YVJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0KCk7XG4gICAgRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9pbnN0YW5jZS5zZXNzaW9uSWQgfHwgJyc7XG4gICAgX2luc3RhbmNlLnJlc3VsdElkID0gX2luc3RhbmNlLnJlc3VsdElkIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5zZXNzaW9uSWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0SWQgPSBfaW5zdGFuY2UucmVzdWx0SWQgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBEZWxldGVSZXN1bHRzRGF0YVJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBEZWxldGVSZXN1bHRzRGF0YVJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2Uuc2Vzc2lvbklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5zZXNzaW9uSWQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlc3VsdElkICYmIF9pbnN0YW5jZS5yZXN1bHRJZC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygyLCBfaW5zdGFuY2UucmVzdWx0SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Nlc3Npb25JZDogc3RyaW5nO1xuICBwcml2YXRlIF9yZXN1bHRJZDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBEZWxldGVSZXN1bHRzRGF0YVJlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb25JZCA9IF92YWx1ZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy5yZXN1bHRJZCA9IChfdmFsdWUucmVzdWx0SWQgfHwgW10pLnNsaWNlKCk7XG4gICAgRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuICBzZXQgc2Vzc2lvbklkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZXNzaW9uSWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcmVzdWx0SWQoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRJZDtcbiAgfVxuICBzZXQgcmVzdWx0SWQodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcmVzdWx0SWQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBEZWxldGVSZXN1bHRzRGF0YVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIHJlc3VsdElkOiAodGhpcy5yZXN1bHRJZCB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IERlbGV0ZVJlc3VsdHNEYXRhUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICByZXN1bHRJZDogKHRoaXMucmVzdWx0SWQgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIERlbGV0ZVJlc3VsdHNEYXRhUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICByZXN1bHRJZDogc3RyaW5nW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRGVsZXRlUmVzdWx0c0RhdGFSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICByZXN1bHRJZDogc3RyaW5nW107XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuRGVsZXRlUmVzdWx0c0RhdGFSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgRGVsZXRlUmVzdWx0c0RhdGFSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5EZWxldGVSZXN1bHRzRGF0YVJlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGVsZXRlUmVzdWx0c0RhdGFSZXNwb25zZSgpO1xuICAgIERlbGV0ZVJlc3VsdHNEYXRhUmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBEZWxldGVSZXN1bHRzRGF0YVJlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9pbnN0YW5jZS5zZXNzaW9uSWQgfHwgJyc7XG4gICAgX2luc3RhbmNlLnJlc3VsdElkID0gX2luc3RhbmNlLnJlc3VsdElkIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogRGVsZXRlUmVzdWx0c0RhdGFSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAoX2luc3RhbmNlLnJlc3VsdElkID0gX2luc3RhbmNlLnJlc3VsdElkIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgX3JlYWRlci5yZWFkU3RyaW5nKClcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRGVsZXRlUmVzdWx0c0RhdGFSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IERlbGV0ZVJlc3VsdHNEYXRhUmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2Uuc2Vzc2lvbklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5zZXNzaW9uSWQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlc3VsdElkICYmIF9pbnN0YW5jZS5yZXN1bHRJZC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygyLCBfaW5zdGFuY2UucmVzdWx0SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Nlc3Npb25JZDogc3RyaW5nO1xuICBwcml2YXRlIF9yZXN1bHRJZDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBEZWxldGVSZXN1bHRzRGF0YVJlc3BvbnNlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPERlbGV0ZVJlc3VsdHNEYXRhUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuc2Vzc2lvbklkID0gX3ZhbHVlLnNlc3Npb25JZDtcbiAgICB0aGlzLnJlc3VsdElkID0gKF92YWx1ZS5yZXN1bHRJZCB8fCBbXSkuc2xpY2UoKTtcbiAgICBEZWxldGVSZXN1bHRzRGF0YVJlc3BvbnNlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuICBzZXQgc2Vzc2lvbklkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZXNzaW9uSWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcmVzdWx0SWQoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRJZDtcbiAgfVxuICBzZXQgcmVzdWx0SWQodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcmVzdWx0SWQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBEZWxldGVSZXN1bHRzRGF0YVJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IERlbGV0ZVJlc3VsdHNEYXRhUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgcmVzdWx0SWQ6ICh0aGlzLnJlc3VsdElkIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogRGVsZXRlUmVzdWx0c0RhdGFSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICByZXN1bHRJZDogKHRoaXMucmVzdWx0SWQgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIERlbGV0ZVJlc3VsdHNEYXRhUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIERlbGV0ZVJlc3VsdHNEYXRhUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIHJlc3VsdElkOiBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBEZWxldGVSZXN1bHRzRGF0YVJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICByZXN1bHRJZDogc3RyaW5nW107XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBJbXBvcnRSZXN1bHRzRGF0YVJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0KCk7XG4gICAgSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9pbnN0YW5jZS5zZXNzaW9uSWQgfHwgJyc7XG4gICAgX2luc3RhbmNlLnJlc3VsdHMgPSBfaW5zdGFuY2UucmVzdWx0cyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEltcG9ydFJlc3VsdHNEYXRhUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIyID0gbmV3IEltcG9ydFJlc3VsdHNEYXRhUmVxdWVzdC5SZXN1bHRPcGFxdWVJZCgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIyLFxuICAgICAgICAgICAgSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0LlJlc3VsdE9wYXF1ZUlkLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5yZXN1bHRzID0gX2luc3RhbmNlLnJlc3VsdHMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEltcG9ydFJlc3VsdHNEYXRhUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEltcG9ydFJlc3VsdHNEYXRhUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5zZXNzaW9uSWQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnNlc3Npb25JZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UucmVzdWx0cyAmJiBfaW5zdGFuY2UucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDIsXG4gICAgICAgIF9pbnN0YW5jZS5yZXN1bHRzIGFzIGFueSxcbiAgICAgICAgSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0LlJlc3VsdE9wYXF1ZUlkLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Nlc3Npb25JZDogc3RyaW5nO1xuICBwcml2YXRlIF9yZXN1bHRzPzogSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0LlJlc3VsdE9wYXF1ZUlkW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBJbXBvcnRSZXN1bHRzRGF0YVJlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8SW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb25JZCA9IF92YWx1ZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy5yZXN1bHRzID0gKF92YWx1ZS5yZXN1bHRzIHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBJbXBvcnRSZXN1bHRzRGF0YVJlcXVlc3QuUmVzdWx0T3BhcXVlSWQobSlcbiAgICApO1xuICAgIEltcG9ydFJlc3VsdHNEYXRhUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHNlc3Npb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uSWQ7XG4gIH1cbiAgc2V0IHNlc3Npb25JZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2Vzc2lvbklkID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHJlc3VsdHMoKTogSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0LlJlc3VsdE9wYXF1ZUlkW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRzO1xuICB9XG4gIHNldCByZXN1bHRzKHZhbHVlOiBJbXBvcnRSZXN1bHRzRGF0YVJlcXVlc3QuUmVzdWx0T3BhcXVlSWRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Jlc3VsdHMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBJbXBvcnRSZXN1bHRzRGF0YVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIHJlc3VsdHM6ICh0aGlzLnJlc3VsdHMgfHwgW10pLm1hcChtID0+IG0udG9PYmplY3QoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBJbXBvcnRSZXN1bHRzRGF0YVJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgcmVzdWx0czogKHRoaXMucmVzdWx0cyB8fCBbXSkubWFwKG0gPT4gbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKSlcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEltcG9ydFJlc3VsdHNEYXRhUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICByZXN1bHRzPzogSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0LlJlc3VsdE9wYXF1ZUlkLkFzT2JqZWN0W107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgSW1wb3J0UmVzdWx0c0RhdGFSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICByZXN1bHRzOiBJbXBvcnRSZXN1bHRzRGF0YVJlcXVlc3QuUmVzdWx0T3BhcXVlSWQuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkltcG9ydFJlc3VsdHNEYXRhUmVxdWVzdC5SZXN1bHRPcGFxdWVJZFxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIFJlc3VsdE9wYXF1ZUlkIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICAgIHN0YXRpYyBpZCA9XG4gICAgICAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLkltcG9ydFJlc3VsdHNEYXRhUmVxdWVzdC5SZXN1bHRPcGFxdWVJZCc7XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFJlc3VsdE9wYXF1ZUlkKCk7XG4gICAgICBSZXN1bHRPcGFxdWVJZC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogUmVzdWx0T3BhcXVlSWQpIHtcbiAgICAgIF9pbnN0YW5jZS5yZXN1bHRJZCA9IF9pbnN0YW5jZS5yZXN1bHRJZCB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5vcGFxdWVJZCA9IF9pbnN0YW5jZS5vcGFxdWVJZCB8fCBuZXcgVWludDhBcnJheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBfaW5zdGFuY2U6IFJlc3VsdE9wYXF1ZUlkLFxuICAgICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICAgKSB7XG4gICAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgX2luc3RhbmNlLnJlc3VsdElkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBfaW5zdGFuY2Uub3BhcXVlSWQgPSBfcmVhZGVyLnJlYWRCeXRlcygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUmVzdWx0T3BhcXVlSWQucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogUmVzdWx0T3BhcXVlSWQsXG4gICAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgICApIHtcbiAgICAgIGlmIChfaW5zdGFuY2UucmVzdWx0SWQpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UucmVzdWx0SWQpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5vcGFxdWVJZCAmJiBfaW5zdGFuY2Uub3BhcXVlSWQubGVuZ3RoKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVCeXRlcygyLCBfaW5zdGFuY2Uub3BhcXVlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc3VsdElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfb3BhcXVlSWQ6IFVpbnQ4QXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBSZXN1bHRPcGFxdWVJZCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8UmVzdWx0T3BhcXVlSWQuQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLnJlc3VsdElkID0gX3ZhbHVlLnJlc3VsdElkO1xuICAgICAgdGhpcy5vcGFxdWVJZCA9IF92YWx1ZS5vcGFxdWVJZDtcbiAgICAgIFJlc3VsdE9wYXF1ZUlkLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHJlc3VsdElkKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVzdWx0SWQ7XG4gICAgfVxuICAgIHNldCByZXN1bHRJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl9yZXN1bHRJZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgb3BhcXVlSWQoKTogVWludDhBcnJheSB7XG4gICAgICByZXR1cm4gdGhpcy5fb3BhcXVlSWQ7XG4gICAgfVxuICAgIHNldCBvcGFxdWVJZCh2YWx1ZTogVWludDhBcnJheSkge1xuICAgICAgdGhpcy5fb3BhcXVlSWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgUmVzdWx0T3BhcXVlSWQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogUmVzdWx0T3BhcXVlSWQuQXNPYmplY3Qge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0SWQ6IHRoaXMucmVzdWx0SWQsXG4gICAgICAgIG9wYXF1ZUlkOiB0aGlzLm9wYXF1ZUlkID8gdGhpcy5vcGFxdWVJZC5zdWJhcnJheSgwKSA6IG5ldyBVaW50OEFycmF5KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAgICovXG4gICAgdG9Qcm90b2J1ZkpTT04oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICAgKTogUmVzdWx0T3BhcXVlSWQuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0SWQ6IHRoaXMucmVzdWx0SWQsXG4gICAgICAgIG9wYXF1ZUlkOiB0aGlzLm9wYXF1ZUlkID8gdWludDhBcnJheVRvQmFzZTY0KHRoaXMub3BhcXVlSWQpIDogJydcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgUmVzdWx0T3BhcXVlSWQge1xuICAgIC8qKlxuICAgICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBSZXN1bHRPcGFxdWVJZFxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgICAgcmVzdWx0SWQ6IHN0cmluZztcbiAgICAgIG9wYXF1ZUlkOiBVaW50OEFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdE9wYXF1ZUlkXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICByZXN1bHRJZDogc3RyaW5nO1xuICAgICAgb3BhcXVlSWQ6IHN0cmluZztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLnJlc3VsdHMuSW1wb3J0UmVzdWx0c0RhdGFSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgSW1wb3J0UmVzdWx0c0RhdGFSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5JbXBvcnRSZXN1bHRzRGF0YVJlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSW1wb3J0UmVzdWx0c0RhdGFSZXNwb25zZSgpO1xuICAgIEltcG9ydFJlc3VsdHNEYXRhUmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBJbXBvcnRSZXN1bHRzRGF0YVJlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLnJlc3VsdHMgPSBfaW5zdGFuY2UucmVzdWx0cyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEltcG9ydFJlc3VsdHNEYXRhUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMSA9IG5ldyBSZXN1bHRSYXcoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIFJlc3VsdFJhdy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0cyA9IF9pbnN0YW5jZS5yZXN1bHRzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBJbXBvcnRSZXN1bHRzRGF0YVJlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogSW1wb3J0UmVzdWx0c0RhdGFSZXNwb25zZSxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5yZXN1bHRzICYmIF9pbnN0YW5jZS5yZXN1bHRzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLnJlc3VsdHMgYXMgYW55LFxuICAgICAgICBSZXN1bHRSYXcuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdWx0cz86IFJlc3VsdFJhd1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgSW1wb3J0UmVzdWx0c0RhdGFSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxJbXBvcnRSZXN1bHRzRGF0YVJlc3BvbnNlLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnJlc3VsdHMgPSAoX3ZhbHVlLnJlc3VsdHMgfHwgW10pLm1hcChtID0+IG5ldyBSZXN1bHRSYXcobSkpO1xuICAgIEltcG9ydFJlc3VsdHNEYXRhUmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCByZXN1bHRzKCk6IFJlc3VsdFJhd1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzdWx0cztcbiAgfVxuICBzZXQgcmVzdWx0cyh2YWx1ZTogUmVzdWx0UmF3W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9yZXN1bHRzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgSW1wb3J0UmVzdWx0c0RhdGFSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBJbXBvcnRSZXN1bHRzRGF0YVJlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0czogKHRoaXMucmVzdWx0cyB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEltcG9ydFJlc3VsdHNEYXRhUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRzOiAodGhpcy5yZXN1bHRzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgSW1wb3J0UmVzdWx0c0RhdGFSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgSW1wb3J0UmVzdWx0c0RhdGFSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcmVzdWx0cz86IFJlc3VsdFJhdy5Bc09iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEltcG9ydFJlc3VsdHNEYXRhUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHJlc3VsdHM6IFJlc3VsdFJhdy5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5XYXRjaFJlc3VsdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIFdhdGNoUmVzdWx0UmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5XYXRjaFJlc3VsdFJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBXYXRjaFJlc3VsdFJlcXVlc3QoKTtcbiAgICBXYXRjaFJlc3VsdFJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBXYXRjaFJlc3VsdFJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UuZmV0Y2hTdGF0dXNlcyA9IF9pbnN0YW5jZS5mZXRjaFN0YXR1c2VzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS53YXRjaFN0YXR1c2VzID0gX2luc3RhbmNlLndhdGNoU3RhdHVzZXMgfHwgW107XG4gICAgX2luc3RhbmNlLnJlc3VsdElkcyA9IF9pbnN0YW5jZS5yZXN1bHRJZHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBXYXRjaFJlc3VsdFJlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgKF9pbnN0YW5jZS5mZXRjaFN0YXR1c2VzID0gX2luc3RhbmNlLmZldGNoU3RhdHVzZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICAuLi4oX3JlYWRlci5yZWFkUGFja2VkRW51bSgpIHx8IFtdKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAoX2luc3RhbmNlLndhdGNoU3RhdHVzZXMgPSBfaW5zdGFuY2Uud2F0Y2hTdGF0dXNlcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIC4uLihfcmVhZGVyLnJlYWRQYWNrZWRFbnVtKCkgfHwgW10pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIChfaW5zdGFuY2UucmVzdWx0SWRzID0gX2luc3RhbmNlLnJlc3VsdElkcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZFN0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFdhdGNoUmVzdWx0UmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFdhdGNoUmVzdWx0UmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5mZXRjaFN0YXR1c2VzICYmIF9pbnN0YW5jZS5mZXRjaFN0YXR1c2VzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVBhY2tlZEVudW0oMSwgX2luc3RhbmNlLmZldGNoU3RhdHVzZXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLndhdGNoU3RhdHVzZXMgJiYgX2luc3RhbmNlLndhdGNoU3RhdHVzZXMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUGFja2VkRW51bSgyLCBfaW5zdGFuY2Uud2F0Y2hTdGF0dXNlcyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UucmVzdWx0SWRzICYmIF9pbnN0YW5jZS5yZXN1bHRJZHMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoMywgX2luc3RhbmNlLnJlc3VsdElkcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmV0Y2hTdGF0dXNlczogYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzW107XG4gIHByaXZhdGUgX3dhdGNoU3RhdHVzZXM6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1c1tdO1xuICBwcml2YXRlIF9yZXN1bHRJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgV2F0Y2hSZXN1bHRSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFdhdGNoUmVzdWx0UmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5mZXRjaFN0YXR1c2VzID0gKF92YWx1ZS5mZXRjaFN0YXR1c2VzIHx8IFtdKS5zbGljZSgpO1xuICAgIHRoaXMud2F0Y2hTdGF0dXNlcyA9IChfdmFsdWUud2F0Y2hTdGF0dXNlcyB8fCBbXSkuc2xpY2UoKTtcbiAgICB0aGlzLnJlc3VsdElkcyA9IChfdmFsdWUucmVzdWx0SWRzIHx8IFtdKS5zbGljZSgpO1xuICAgIFdhdGNoUmVzdWx0UmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGZldGNoU3RhdHVzZXMoKTogYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzW10ge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaFN0YXR1c2VzO1xuICB9XG4gIHNldCBmZXRjaFN0YXR1c2VzKHZhbHVlOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXNbXSkge1xuICAgIHRoaXMuX2ZldGNoU3RhdHVzZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgd2F0Y2hTdGF0dXNlcygpOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXNbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhdGNoU3RhdHVzZXM7XG4gIH1cbiAgc2V0IHdhdGNoU3RhdHVzZXModmFsdWU6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1c1tdKSB7XG4gICAgdGhpcy5fd2F0Y2hTdGF0dXNlcyA9IHZhbHVlO1xuICB9XG4gIGdldCByZXN1bHRJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRJZHM7XG4gIH1cbiAgc2V0IHJlc3VsdElkcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9yZXN1bHRJZHMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBXYXRjaFJlc3VsdFJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogV2F0Y2hSZXN1bHRSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZmV0Y2hTdGF0dXNlczogKHRoaXMuZmV0Y2hTdGF0dXNlcyB8fCBbXSkuc2xpY2UoKSxcbiAgICAgIHdhdGNoU3RhdHVzZXM6ICh0aGlzLndhdGNoU3RhdHVzZXMgfHwgW10pLnNsaWNlKCksXG4gICAgICByZXN1bHRJZHM6ICh0aGlzLnJlc3VsdElkcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFdhdGNoUmVzdWx0UmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZldGNoU3RhdHVzZXM6ICh0aGlzLmZldGNoU3RhdHVzZXMgfHwgW10pLm1hcChcbiAgICAgICAgdiA9PiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXNbdl1cbiAgICAgICksXG4gICAgICB3YXRjaFN0YXR1c2VzOiAodGhpcy53YXRjaFN0YXR1c2VzIHx8IFtdKS5tYXAoXG4gICAgICAgIHYgPT4gYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzW3ZdXG4gICAgICApLFxuICAgICAgcmVzdWx0SWRzOiAodGhpcy5yZXN1bHRJZHMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFdhdGNoUmVzdWx0UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgV2F0Y2hSZXN1bHRSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBmZXRjaFN0YXR1c2VzOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXNbXTtcbiAgICB3YXRjaFN0YXR1c2VzOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXNbXTtcbiAgICByZXN1bHRJZHM6IHN0cmluZ1tdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFdhdGNoUmVzdWx0UmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZmV0Y2hTdGF0dXNlczogc3RyaW5nW107XG4gICAgd2F0Y2hTdGF0dXNlczogc3RyaW5nW107XG4gICAgcmVzdWx0SWRzOiBzdHJpbmdbXTtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEucmVzdWx0cy5XYXRjaFJlc3VsdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBXYXRjaFJlc3VsdFJlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5yZXN1bHRzLldhdGNoUmVzdWx0UmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBXYXRjaFJlc3VsdFJlc3BvbnNlKCk7XG4gICAgV2F0Y2hSZXN1bHRSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFdhdGNoUmVzdWx0UmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2Uuc3RhdHVzID0gX2luc3RhbmNlLnN0YXR1cyB8fCAwO1xuICAgIF9pbnN0YW5jZS5yZXN1bHRJZHMgPSBfaW5zdGFuY2UucmVzdWx0SWRzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogV2F0Y2hSZXN1bHRSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3RhdHVzID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgKF9pbnN0YW5jZS5yZXN1bHRJZHMgPSBfaW5zdGFuY2UucmVzdWx0SWRzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgX3JlYWRlci5yZWFkU3RyaW5nKClcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgV2F0Y2hSZXN1bHRSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFdhdGNoUmVzdWx0UmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2Uuc3RhdHVzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlRW51bSgxLCBfaW5zdGFuY2Uuc3RhdHVzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5yZXN1bHRJZHMgJiYgX2luc3RhbmNlLnJlc3VsdElkcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygyLCBfaW5zdGFuY2UucmVzdWx0SWRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdGF0dXM6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1cztcbiAgcHJpdmF0ZSBfcmVzdWx0SWRzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFdhdGNoUmVzdWx0UmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8V2F0Y2hSZXN1bHRSZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5zdGF0dXMgPSBfdmFsdWUuc3RhdHVzO1xuICAgIHRoaXMucmVzdWx0SWRzID0gKF92YWx1ZS5yZXN1bHRJZHMgfHwgW10pLnNsaWNlKCk7XG4gICAgV2F0Y2hSZXN1bHRSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHN0YXR1cygpOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXMge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cbiAgc2V0IHN0YXR1cyh2YWx1ZTogYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzKSB7XG4gICAgdGhpcy5fc3RhdHVzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHJlc3VsdElkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdElkcztcbiAgfVxuICBzZXQgcmVzdWx0SWRzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3Jlc3VsdElkcyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFdhdGNoUmVzdWx0UmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogV2F0Y2hSZXN1bHRSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICByZXN1bHRJZHM6ICh0aGlzLnJlc3VsdElkcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFdhdGNoUmVzdWx0UmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6XG4gICAgICAgIGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1c1tcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9PT0gbnVsbCB8fCB0aGlzLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMCA6IHRoaXMuc3RhdHVzXG4gICAgICAgIF0sXG4gICAgICByZXN1bHRJZHM6ICh0aGlzLnJlc3VsdElkcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgV2F0Y2hSZXN1bHRSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgV2F0Y2hSZXN1bHRSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgc3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXM7XG4gICAgcmVzdWx0SWRzOiBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBXYXRjaFJlc3VsdFJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICByZXN1bHRJZHM6IHN0cmluZ1tdO1xuICB9XG59XG4iXX0=
|