@archont561/qgis-sdk 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,414 @@
1
+ import {
2
+ QgisSdkError2
3
+ } from "./chunk-2hwva3a3.js";
4
+
5
+ // src/generated/host.ts
6
+ var HOST_ID2 = "qgis.host";
7
+ var HOST_FINGERPRINT2 = "sha256:f96bdf1046434de3c5eae01efb34c8ad2bcd1cf241a3dc42f6c4b613dc7d7d6f";
8
+ var HOST_SCHEMA_VERSION2 = 1;
9
+ var HOST_OPERATIONS2 = [
10
+ "files.export",
11
+ "layers.get",
12
+ "layers.list",
13
+ "layers.open_vector",
14
+ "network.fetch",
15
+ "notifications.info",
16
+ "project.layer_ids",
17
+ "settings.get",
18
+ "styles.apply"
19
+ ];
20
+
21
+ class QgisSdkHostContractError2 extends QgisSdkError2 {
22
+ operation;
23
+ constructor(operation, message) {
24
+ super(`operation "${operation}": ${message}`, "contract_validation_failed");
25
+ this.operation = operation;
26
+ }
27
+ }
28
+ function isRecord(value) {
29
+ return typeof value === "object" && value !== null && !Array.isArray(value);
30
+ }
31
+ function hasOnly(value, keys) {
32
+ return Object.keys(value).every((key) => keys.includes(key));
33
+ }
34
+ function isSafeInteger(value) {
35
+ return typeof value === "number" && Number.isSafeInteger(value);
36
+ }
37
+ function ExportRequest2(value, strict = false) {
38
+ if (!isRecord(value))
39
+ return false;
40
+ if (!("file" in value))
41
+ return false;
42
+ if (!("content" in value))
43
+ return false;
44
+ if (value["content"] !== undefined && !(typeof value["content"] === "string")) {
45
+ return false;
46
+ }
47
+ if (value["file"] !== undefined && !FileRef2(value["file"], strict)) {
48
+ return false;
49
+ }
50
+ if (strict && !hasOnly(value, ["content", "file"]))
51
+ return false;
52
+ return true;
53
+ }
54
+ function ExportResult2(value, strict = false) {
55
+ if (!isRecord(value))
56
+ return false;
57
+ if (!("bytes_written" in value))
58
+ return false;
59
+ if (!("name" in value))
60
+ return false;
61
+ if (value["bytes_written"] !== undefined && !isSafeInteger(value["bytes_written"])) {
62
+ return false;
63
+ }
64
+ if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
65
+ return false;
66
+ }
67
+ if (strict && !hasOnly(value, ["bytes_written", "name"]))
68
+ return false;
69
+ return true;
70
+ }
71
+ function FetchRequest2(value, strict = false) {
72
+ if (!isRecord(value))
73
+ return false;
74
+ if (!("url" in value))
75
+ return false;
76
+ if (value["auth_config"] !== undefined && !(typeof value["auth_config"] === "string")) {
77
+ return false;
78
+ }
79
+ if (value["body"] !== undefined && !(typeof value["body"] === "string")) {
80
+ return false;
81
+ }
82
+ if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader2(item, strict)))) {
83
+ return false;
84
+ }
85
+ if (value["method"] !== undefined && !(value["method"] === "GET" || value["method"] === "HEAD" || value["method"] === "POST" || value["method"] === "PUT" || value["method"] === "PATCH" || value["method"] === "DELETE" || value["method"] === "OPTIONS")) {
86
+ return false;
87
+ }
88
+ if (value["timeout_seconds"] !== undefined && !(typeof value["timeout_seconds"] === "number" && Number.isFinite(value["timeout_seconds"]) && value["timeout_seconds"] >= 0.1 && value["timeout_seconds"] <= 300)) {
89
+ return false;
90
+ }
91
+ if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
92
+ return false;
93
+ }
94
+ if (strict && !hasOnly(value, ["auth_config", "body", "headers", "method", "timeout_seconds", "url"]))
95
+ return false;
96
+ return true;
97
+ }
98
+ function FileRef2(value, strict = false) {
99
+ if (!isRecord(value))
100
+ return false;
101
+ if (!("kind" in value))
102
+ return false;
103
+ if (!("id" in value))
104
+ return false;
105
+ if (value["id"] !== undefined && !(typeof value["id"] === "string" && new RegExp("^(?:[a-f0-9]{16,64})$").test(value["id"]))) {
106
+ return false;
107
+ }
108
+ if (value["kind"] !== undefined && !(value["kind"] === "file")) {
109
+ return false;
110
+ }
111
+ if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
112
+ return false;
113
+ }
114
+ if (value["operations"] !== undefined && !(Array.isArray(value["operations"]) && value["operations"].every((item) => item === "read" || item === "write"))) {
115
+ return false;
116
+ }
117
+ if (strict && !hasOnly(value, ["id", "kind", "name", "operations"]))
118
+ return false;
119
+ return true;
120
+ }
121
+ function HttpHeader2(value, strict = false) {
122
+ if (!isRecord(value))
123
+ return false;
124
+ if (!("name" in value))
125
+ return false;
126
+ if (!("value" in value))
127
+ return false;
128
+ if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
129
+ return false;
130
+ }
131
+ if (value["value"] !== undefined && !(typeof value["value"] === "string")) {
132
+ return false;
133
+ }
134
+ if (strict && !hasOnly(value, ["name", "value"]))
135
+ return false;
136
+ return true;
137
+ }
138
+ function IdPage2(value, strict = false) {
139
+ if (!isRecord(value))
140
+ return false;
141
+ if (!("items" in value))
142
+ return false;
143
+ if (!("truncated" in value))
144
+ return false;
145
+ if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => typeof item === "string"))) {
146
+ return false;
147
+ }
148
+ if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
149
+ return false;
150
+ }
151
+ if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
152
+ return false;
153
+ }
154
+ if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
155
+ return false;
156
+ return true;
157
+ }
158
+ function LayerPage2(value, strict = false) {
159
+ if (!isRecord(value))
160
+ return false;
161
+ if (!("items" in value))
162
+ return false;
163
+ if (!("truncated" in value))
164
+ return false;
165
+ if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => VectorLayerInfo2(item, strict)))) {
166
+ return false;
167
+ }
168
+ if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
169
+ return false;
170
+ }
171
+ if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
172
+ return false;
173
+ }
174
+ if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
175
+ return false;
176
+ return true;
177
+ }
178
+ function LayerRequest2(value, strict = false) {
179
+ if (!isRecord(value))
180
+ return false;
181
+ if (!("layer_id" in value))
182
+ return false;
183
+ if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
184
+ return false;
185
+ }
186
+ if (strict && !hasOnly(value, ["layer_id"]))
187
+ return false;
188
+ return true;
189
+ }
190
+ function NetworkFetchData2(value, strict = false) {
191
+ if (!isRecord(value))
192
+ return false;
193
+ if (!("url" in value))
194
+ return false;
195
+ if (!("status_code" in value))
196
+ return false;
197
+ if (!("reason" in value))
198
+ return false;
199
+ if (!("headers" in value))
200
+ return false;
201
+ if (!("text" in value))
202
+ return false;
203
+ if (!("base64" in value))
204
+ return false;
205
+ if (value["base64"] !== undefined && !(typeof value["base64"] === "string" || value["base64"] === null)) {
206
+ return false;
207
+ }
208
+ if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader2(item, strict)))) {
209
+ return false;
210
+ }
211
+ if (value["reason"] !== undefined && !(typeof value["reason"] === "string")) {
212
+ return false;
213
+ }
214
+ if (value["status_code"] !== undefined && !isSafeInteger(value["status_code"])) {
215
+ return false;
216
+ }
217
+ if (value["text"] !== undefined && !(typeof value["text"] === "string" || value["text"] === null)) {
218
+ return false;
219
+ }
220
+ if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
221
+ return false;
222
+ }
223
+ if (strict && !hasOnly(value, ["base64", "headers", "reason", "status_code", "text", "url"]))
224
+ return false;
225
+ return true;
226
+ }
227
+ function NotificationsInfoRequest2(value, strict = false) {
228
+ if (!isRecord(value))
229
+ return false;
230
+ if (!("message" in value))
231
+ return false;
232
+ if (value["message"] !== undefined && !(typeof value["message"] === "string")) {
233
+ return false;
234
+ }
235
+ if (strict && !hasOnly(value, ["message"]))
236
+ return false;
237
+ return true;
238
+ }
239
+ function OpenVectorRequest2(value, strict = false) {
240
+ if (!isRecord(value))
241
+ return false;
242
+ if (!("file" in value))
243
+ return false;
244
+ if (value["file"] !== undefined && !FileRef2(value["file"], strict)) {
245
+ return false;
246
+ }
247
+ if (strict && !hasOnly(value, ["file"]))
248
+ return false;
249
+ return true;
250
+ }
251
+ function PageRequest2(value, strict = false) {
252
+ if (!isRecord(value))
253
+ return false;
254
+ if (value["cursor"] !== undefined && !(typeof value["cursor"] === "string" && new RegExp("^(?:[0-9]+)$").test(value["cursor"]))) {
255
+ return false;
256
+ }
257
+ if (value["limit"] !== undefined && !(isSafeInteger(value["limit"]) && value["limit"] >= 1 && value["limit"] <= 200)) {
258
+ return false;
259
+ }
260
+ if (strict && !hasOnly(value, ["cursor", "limit"]))
261
+ return false;
262
+ return true;
263
+ }
264
+ function SettingsGetRequest2(value, strict = false) {
265
+ if (!isRecord(value))
266
+ return false;
267
+ if (!("key" in value))
268
+ return false;
269
+ if (value["default"] !== undefined && !(typeof value["default"] === "string" || value["default"] === null)) {
270
+ return false;
271
+ }
272
+ if (value["key"] !== undefined && !(typeof value["key"] === "string")) {
273
+ return false;
274
+ }
275
+ if (strict && !hasOnly(value, ["default", "key"]))
276
+ return false;
277
+ return true;
278
+ }
279
+ function StylesApplyRequest2(value, strict = false) {
280
+ if (!isRecord(value))
281
+ return false;
282
+ if (!("layer_id" in value))
283
+ return false;
284
+ if (!("style" in value))
285
+ return false;
286
+ if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
287
+ return false;
288
+ }
289
+ if (value["style"] !== undefined && !(typeof value["style"] === "string")) {
290
+ return false;
291
+ }
292
+ if (strict && !hasOnly(value, ["layer_id", "style"]))
293
+ return false;
294
+ return true;
295
+ }
296
+ function VectorLayerInfo2(value, strict = false) {
297
+ if (!isRecord(value))
298
+ return false;
299
+ if (!("id" in value))
300
+ return false;
301
+ if (!("name" in value))
302
+ return false;
303
+ if (!("geometry_type" in value))
304
+ return false;
305
+ if (!("field_names" in value))
306
+ return false;
307
+ if (!("crs" in value))
308
+ return false;
309
+ if (value["crs"] !== undefined && !(typeof value["crs"] === "string" || value["crs"] === null)) {
310
+ return false;
311
+ }
312
+ if (value["field_names"] !== undefined && !(Array.isArray(value["field_names"]) && value["field_names"].every((item) => typeof item === "string"))) {
313
+ return false;
314
+ }
315
+ if (value["geometry_type"] !== undefined && !(value["geometry_type"] === "point" || value["geometry_type"] === "line" || value["geometry_type"] === "polygon" || value["geometry_type"] === "none")) {
316
+ return false;
317
+ }
318
+ if (value["id"] !== undefined && !(typeof value["id"] === "string")) {
319
+ return false;
320
+ }
321
+ if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
322
+ return false;
323
+ }
324
+ if (strict && !hasOnly(value, ["crs", "field_names", "geometry_type", "id", "name"]))
325
+ return false;
326
+ return true;
327
+ }
328
+ function NetworkFetchEvent2(value, strict = false) {
329
+ if (!isRecord(value))
330
+ return false;
331
+ if (value.kind === "data")
332
+ return NetworkFetchData2(value.payload, strict);
333
+ return false;
334
+ }
335
+ function createHost2(client) {
336
+ return {
337
+ files: {
338
+ export: (input, options) => call(client, "files.export", input, options, ExportRequest2, ExportResult2)
339
+ },
340
+ layers: {
341
+ get: (input, options) => call(client, "layers.get", input, options, LayerRequest2, VectorLayerInfo2),
342
+ list: (input, options) => call(client, "layers.list", input, options, PageRequest2, LayerPage2),
343
+ open_vector: (input, options) => call(client, "layers.open_vector", input, options, OpenVectorRequest2, VectorLayerInfo2)
344
+ },
345
+ network: {
346
+ fetch: (input, handlers, options) => open(client, "network.fetch", input, handlers, options, FetchRequest2, NetworkFetchEvent2)
347
+ },
348
+ notifications: {
349
+ info: (input, options) => call(client, "notifications.info", input, options, NotificationsInfoRequest2, (candidate) => candidate === null)
350
+ },
351
+ project: {
352
+ layer_ids: (input, options) => call(client, "project.layer_ids", input, options, PageRequest2, IdPage2)
353
+ },
354
+ settings: {
355
+ get: (input, options) => call(client, "settings.get", input, options, SettingsGetRequest2, (candidate) => typeof candidate === "string" || candidate === null)
356
+ },
357
+ styles: {
358
+ apply: (input, options) => call(client, "styles.apply", input, options, StylesApplyRequest2, (candidate) => candidate === null)
359
+ }
360
+ };
361
+ }
362
+ async function call(client, operation, input, options, acceptInput, acceptOutput) {
363
+ if (input !== undefined && !acceptInput(input, true)) {
364
+ throw new QgisSdkHostContractError2(operation, "the arguments do not match the declared request");
365
+ }
366
+ const value = await client.invoke(operation, input ?? {}, options);
367
+ if (!acceptOutput(value)) {
368
+ throw new QgisSdkHostContractError2(operation, "the response does not match the declared result");
369
+ }
370
+ return value;
371
+ }
372
+ async function open(client, operation, input, handlers, options, acceptInput, acceptEvent) {
373
+ if (!acceptInput(input, true)) {
374
+ throw new QgisSdkHostContractError2(operation, "the arguments do not match the declared request");
375
+ }
376
+ let ended = false;
377
+ let violated = false;
378
+ let handle = null;
379
+ const end = (terminal) => {
380
+ if (ended)
381
+ return;
382
+ ended = true;
383
+ handlers.onTerminal?.(terminal);
384
+ };
385
+ handle = await client.subscribe(operation, input, {
386
+ onEvent: (event) => {
387
+ if (ended)
388
+ return;
389
+ if (acceptEvent(event)) {
390
+ handlers.onEvent?.(event);
391
+ return;
392
+ }
393
+ end({
394
+ kind: "error",
395
+ message: new QgisSdkHostContractError2(operation, "an event does not match the declared events").message
396
+ });
397
+ if (handle === null) {
398
+ violated = true;
399
+ } else {
400
+ handle.close();
401
+ }
402
+ },
403
+ onTerminal: end
404
+ }, options);
405
+ if (violated) {
406
+ handle.close();
407
+ }
408
+ return handle;
409
+ }
410
+
411
+ export { HOST_ID2, HOST_FINGERPRINT2, HOST_SCHEMA_VERSION2, HOST_OPERATIONS2, QgisSdkHostContractError2, ExportRequest2, ExportResult2, FetchRequest2, FileRef2, HttpHeader2, IdPage2, LayerPage2, LayerRequest2, NetworkFetchData2, NotificationsInfoRequest2, OpenVectorRequest2, PageRequest2, SettingsGetRequest2, StylesApplyRequest2, VectorLayerInfo2, NetworkFetchEvent2, createHost2 };
412
+
413
+ //# debugId=14FA6E1BACC48E4964756E2164756E21
414
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2dlbmVyYXRlZC9ob3N0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIEdlbmVyYXRlZCBieSBxZ2lzLXNkay4gRG8gbm90IGVkaXQuXG4vLyBTb3VyY2U6IHRoZSBjdXJhdGVkIGhvc3QgbWFuaWZlc3QgaW4gcWdpc19zZGsuYnJpZGdlLmhvc3QuXG4vLyBSZWdlbmVyYXRlIHdpdGggYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZSAtLWhvc3RgOyBDSSBmYWlscyBvbiBkcmlmdC5cblxuaW1wb3J0IHsgUWdpc1Nka0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuXG5leHBvcnQgY29uc3QgSE9TVF9JRCA9IFwicWdpcy5ob3N0XCI7XG5leHBvcnQgY29uc3QgSE9TVF9GSU5HRVJQUklOVCA9IFwic2hhMjU2OmY5NmJkZjEwNDY0MzRkZTNjNWVhZTAxZWZiMzRjOGFkMmJjZDFjZjI0MWEzZGM0MmY2YzRiNjEzZGM3ZDdkNmZcIjtcbmV4cG9ydCBjb25zdCBIT1NUX1NDSEVNQV9WRVJTSU9OID0gMTtcblxuLyoqIEV2ZXJ5IGRlY2xhcmVkIG9wZXJhdGlvbiBpZCwgc28gYSBuYW1lIGNhbiBiZSBjaGVja2VkLCBub3QgZ3Vlc3NlZC4gKi9cbmV4cG9ydCBjb25zdCBIT1NUX09QRVJBVElPTlMgPSBbXG5cdFwiZmlsZXMuZXhwb3J0XCIsXG5cdFwibGF5ZXJzLmdldFwiLFxuXHRcImxheWVycy5saXN0XCIsXG5cdFwibGF5ZXJzLm9wZW5fdmVjdG9yXCIsXG5cdFwibmV0d29yay5mZXRjaFwiLFxuXHRcIm5vdGlmaWNhdGlvbnMuaW5mb1wiLFxuXHRcInByb2plY3QubGF5ZXJfaWRzXCIsXG5cdFwic2V0dGluZ3MuZ2V0XCIsXG5cdFwic3R5bGVzLmFwcGx5XCIsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBIb3N0T3BlcmF0aW9uSWQgPSAodHlwZW9mIEhPU1RfT1BFUkFUSU9OUylbbnVtYmVyXTtcblxuZXhwb3J0IGludGVyZmFjZSBIb3N0SW52b2tlT3B0aW9ucyB7XG5cdHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogVGhlIGNsaWVudCB0aGlzIG1vZHVsZSB3cmFwczogYW55dGhpbmcgd2l0aCBhIGNvcnJlbGF0ZWQgaW52b2tlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0Q2xpZW50TGlrZSB7XG5cdGludm9rZShcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0XHRwYXlsb2FkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucyxcblx0KTogUHJvbWlzZTx1bmtub3duPjtcblx0c3Vic2NyaWJlKFxuXHRcdG9wZXJhdGlvbjogc3RyaW5nLFxuXHRcdHBheWxvYWQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG5cdFx0aGFuZGxlcnM/OiBIb3N0U3RyZWFtSGFuZGxlcnM8e1xuXHRcdFx0cmVhZG9ubHkga2luZDogXCJkYXRhXCIgfCBcInByb2dyZXNzXCIgfCBcInN0YXRlXCI7XG5cdFx0XHRyZWFkb25seSBwYXlsb2FkOiB1bmtub3duO1xuXHRcdH0+LFxuXHRcdG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucyxcblx0KTogUHJvbWlzZTxIb3N0U3RyZWFtSGFuZGxlPjtcbn1cblxuLyoqIEhvdyBhIHN0cmVhbSBlbmRlZDsgYGRyb3BwZWRgIGlzIG9ubHkgcHJlc2VudCBmb3IgYSBnYXAuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RTdHJlYW1UZXJtaW5hbCB7XG5cdHJlYWRvbmx5IGtpbmQ6IFwiY29tcGxldGVcIiB8IFwiZXJyb3JcIiB8IFwiY2FuY2VsbGVkXCIgfCBcImdhcFwiIHwgXCJkaXNwb3NlZFwiO1xuXHRyZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xuXHRyZWFkb25seSBkcm9wcGVkPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCBhIHN0cmVhbSByZXBvcnRzOiB0eXBlZCBldmVudHMsIHRoZW4gZXhhY3RseSBvbmUgZW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0U3RyZWFtSGFuZGxlcnM8RT4ge1xuXHRyZWFkb25seSBvbkV2ZW50PzogKGV2ZW50OiBFKSA9PiB2b2lkO1xuXHRyZWFkb25seSBvblRlcm1pbmFsPzogKHRlcm1pbmFsOiBIb3N0U3RyZWFtVGVybWluYWwpID0+IHZvaWQ7XG59XG5cbi8qKiBBIGxpdmUgc3RyZWFtLCBhcyB0aGUgY2FsbGVyIGhvbGRzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0U3RyZWFtSGFuZGxlIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgY2xvc2VkOiBib29sZWFuO1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG4vKiogQW4gYXJndW1lbnQgb3IgYSByZXNwb25zZSB0aGF0IGRvZXMgbm90IG1hdGNoIGl0cyBkZWNsYXJlZCBzY2hlbWEuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0hvc3RDb250cmFjdEVycm9yIGV4dGVuZHMgUWdpc1Nka0Vycm9yIHtcblx0cHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRwdWJsaWMgY29uc3RydWN0b3Iob3BlcmF0aW9uOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuXHRcdHN1cGVyKGBvcGVyYXRpb24gXCIke29wZXJhdGlvbn1cIjogJHttZXNzYWdlfWAsIFwiY29udHJhY3RfdmFsaWRhdGlvbl9mYWlsZWRcIik7XG5cdFx0dGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247XG5cdH1cbn1cblxuZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBoYXNPbmx5KFxuXHR2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkuZXZlcnkoKGtleSkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcbn1cblxuZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFJlcXVlc3Qge1xuXHRyZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGZpbGU6IEZpbGVSZWY7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0UmVzdWx0IHtcblx0cmVhZG9ubHkgYnl0ZXNfd3JpdHRlbjogbnVtYmVyO1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hSZXF1ZXN0IHtcblx0cmVhZG9ubHkgYXV0aF9jb25maWc/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGJvZHk/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGhlYWRlcnM/OiByZWFkb25seSBIdHRwSGVhZGVyW107XG5cdHJlYWRvbmx5IG1ldGhvZD86IFwiR0VUXCIgfCBcIkhFQURcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCIgfCBcIk9QVElPTlNcIjtcblx0cmVhZG9ubHkgdGltZW91dF9zZWNvbmRzPzogbnVtYmVyO1xuXHRyZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUmVmIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkga2luZDogXCJmaWxlXCI7XG5cdHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbnM/OiByZWFkb25seSAoXCJyZWFkXCIgfCBcIndyaXRlXCIpW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEhlYWRlciB7XG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblx0cmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJZFBhZ2Uge1xuXHRyZWFkb25seSBpdGVtczogcmVhZG9ubHkgc3RyaW5nW107XG5cdHJlYWRvbmx5IG5leHRfY3Vyc29yPzogc3RyaW5nO1xuXHRyZWFkb25seSB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJQYWdlIHtcblx0cmVhZG9ubHkgaXRlbXM6IHJlYWRvbmx5IFZlY3RvckxheWVySW5mb1tdO1xuXHRyZWFkb25seSBuZXh0X2N1cnNvcj86IHN0cmluZztcblx0cmVhZG9ubHkgdHJ1bmNhdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheWVyUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGxheWVyX2lkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya0ZldGNoRGF0YSB7XG5cdHJlYWRvbmx5IGJhc2U2NDogc3RyaW5nIHwgbnVsbDtcblx0cmVhZG9ubHkgaGVhZGVyczogcmVhZG9ubHkgSHR0cEhlYWRlcltdO1xuXHRyZWFkb25seSByZWFzb246IHN0cmluZztcblx0cmVhZG9ubHkgc3RhdHVzX2NvZGU6IG51bWJlcjtcblx0cmVhZG9ubHkgdGV4dDogc3RyaW5nIHwgbnVsbDtcblx0cmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0IHtcblx0cmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5WZWN0b3JSZXF1ZXN0IHtcblx0cmVhZG9ubHkgZmlsZTogRmlsZVJlZjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGN1cnNvcj86IHN0cmluZztcblx0cmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3NHZXRSZXF1ZXN0IHtcblx0cmVhZG9ubHkgZGVmYXVsdD86IHN0cmluZyB8IG51bGw7XG5cdHJlYWRvbmx5IGtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0eWxlc0FwcGx5UmVxdWVzdCB7XG5cdHJlYWRvbmx5IGxheWVyX2lkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHN0eWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yTGF5ZXJJbmZvIHtcblx0cmVhZG9ubHkgY3JzOiBzdHJpbmcgfCBudWxsO1xuXHRyZWFkb25seSBmaWVsZF9uYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cdHJlYWRvbmx5IGdlb21ldHJ5X3R5cGU6IFwicG9pbnRcIiB8IFwibGluZVwiIHwgXCJwb2x5Z29uXCIgfCBcIm5vbmVcIjtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRXhwb3J0UmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBFeHBvcnRSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJmaWxlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiY29udGVudFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJjb250ZW50XCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJjb250ZW50XCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJmaWxlXCJdICE9PSB1bmRlZmluZWQgJiYgIShGaWxlUmVmKHZhbHVlW1wiZmlsZVwiXSwgc3RyaWN0KSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiY29udGVudFwiLCBcImZpbGVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRXhwb3J0UmVzdWx0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIEV4cG9ydFJlc3VsdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiYnl0ZXNfd3JpdHRlblwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIm5hbWVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiYnl0ZXNfd3JpdHRlblwiXSAhPT0gdW5kZWZpbmVkICYmICEoaXNTYWZlSW50ZWdlcih2YWx1ZVtcImJ5dGVzX3dyaXR0ZW5cIl0pKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJuYW1lXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJieXRlc193cml0dGVuXCIsIFwibmFtZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGZXRjaFJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgRmV0Y2hSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJ1cmxcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiYXV0aF9jb25maWdcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImF1dGhfY29uZmlnXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJib2R5XCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJib2R5XCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJoZWFkZXJzXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcImhlYWRlcnNcIl0pICYmIHZhbHVlW1wiaGVhZGVyc1wiXS5ldmVyeSgoaXRlbSkgPT4gSHR0cEhlYWRlcihpdGVtLCBzdHJpY3QpKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcIm1ldGhvZFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHZhbHVlW1wibWV0aG9kXCJdID09PSBcIkdFVFwiIHx8IHZhbHVlW1wibWV0aG9kXCJdID09PSBcIkhFQURcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJQT1NUXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiUFVUXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiUEFUQ0hcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJERUxFVEVcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJPUFRJT05TXCIpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdKSAmJiB2YWx1ZVtcInRpbWVvdXRfc2Vjb25kc1wiXSA+PSAwLjEgJiYgdmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gPD0gMzAwKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widXJsXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ1cmxcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImF1dGhfY29uZmlnXCIsIFwiYm9keVwiLCBcImhlYWRlcnNcIiwgXCJtZXRob2RcIiwgXCJ0aW1lb3V0X3NlY29uZHNcIiwgXCJ1cmxcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRmlsZVJlZih2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBGaWxlUmVmIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJraW5kXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiaWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiaWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImlkXCJdID09PSBcInN0cmluZ1wiICYmIG5ldyBSZWdFeHAoXCJeKD86W2EtZjAtOV17MTYsNjR9KSRcIikudGVzdCh2YWx1ZVtcImlkXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wia2luZFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHZhbHVlW1wia2luZFwiXSA9PT0gXCJmaWxlXCIpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJuYW1lXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJvcGVyYXRpb25zXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcIm9wZXJhdGlvbnNcIl0pICYmIHZhbHVlW1wib3BlcmF0aW9uc1wiXS5ldmVyeSgoaXRlbSkgPT4gKGl0ZW0gPT09IFwicmVhZFwiIHx8IGl0ZW0gPT09IFwid3JpdGVcIikpKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiaWRcIiwgXCJraW5kXCIsIFwibmFtZVwiLCBcIm9wZXJhdGlvbnNcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSHR0cEhlYWRlcih2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBIdHRwSGVhZGVyIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJuYW1lXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidmFsdWVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widmFsdWVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInZhbHVlXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJuYW1lXCIsIFwidmFsdWVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSWRQYWdlKHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIElkUGFnZSB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiaXRlbXNcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJ0cnVuY2F0ZWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiaXRlbXNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKChBcnJheS5pc0FycmF5KHZhbHVlW1wiaXRlbXNcIl0pICYmIHZhbHVlW1wiaXRlbXNcIl0uZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcIm5leHRfY3Vyc29yXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJuZXh0X2N1cnNvclwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widHJ1bmNhdGVkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ0cnVuY2F0ZWRcIl0gPT09IFwiYm9vbGVhblwiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJpdGVtc1wiLCBcIm5leHRfY3Vyc29yXCIsIFwidHJ1bmNhdGVkXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExheWVyUGFnZSh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBMYXllclBhZ2Uge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIml0ZW1zXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidHJ1bmNhdGVkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcIml0ZW1zXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcIml0ZW1zXCJdKSAmJiB2YWx1ZVtcIml0ZW1zXCJdLmV2ZXJ5KChpdGVtKSA9PiBWZWN0b3JMYXllckluZm8oaXRlbSwgc3RyaWN0KSkpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuZXh0X2N1cnNvclwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmV4dF9jdXJzb3JcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInRydW5jYXRlZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widHJ1bmNhdGVkXCJdID09PSBcImJvb2xlYW5cIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiaXRlbXNcIiwgXCJuZXh0X2N1cnNvclwiLCBcInRydW5jYXRlZFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYXllclJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTGF5ZXJSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJsYXllcl9pZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJsYXllcl9pZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibGF5ZXJfaWRcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImxheWVyX2lkXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5ldHdvcmtGZXRjaERhdGEodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTmV0d29ya0ZldGNoRGF0YSB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidXJsXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwic3RhdHVzX2NvZGVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJyZWFzb25cIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJoZWFkZXJzXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidGV4dFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImJhc2U2NFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJiYXNlNjRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJiYXNlNjRcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJiYXNlNjRcIl0gPT09IG51bGwpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJoZWFkZXJzXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcImhlYWRlcnNcIl0pICYmIHZhbHVlW1wiaGVhZGVyc1wiXS5ldmVyeSgoaXRlbSkgPT4gSHR0cEhlYWRlcihpdGVtLCBzdHJpY3QpKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInJlYXNvblwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wicmVhc29uXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJzdGF0dXNfY29kZVwiXSAhPT0gdW5kZWZpbmVkICYmICEoaXNTYWZlSW50ZWdlcih2YWx1ZVtcInN0YXR1c19jb2RlXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widGV4dFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHR5cGVvZiB2YWx1ZVtcInRleHRcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJ0ZXh0XCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widXJsXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ1cmxcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImJhc2U2NFwiLCBcImhlYWRlcnNcIiwgXCJyZWFzb25cIiwgXCJzdGF0dXNfY29kZVwiLCBcInRleHRcIiwgXCJ1cmxcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibWVzc2FnZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJtZXNzYWdlXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJtZXNzYWdlXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJtZXNzYWdlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9wZW5WZWN0b3JSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE9wZW5WZWN0b3JSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJmaWxlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImZpbGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKEZpbGVSZWYodmFsdWVbXCJmaWxlXCJdLCBzdHJpY3QpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJmaWxlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFBhZ2VSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIFBhZ2VSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiY3Vyc29yXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJjdXJzb3JcIl0gPT09IFwic3RyaW5nXCIgJiYgbmV3IFJlZ0V4cChcIl4oPzpbMC05XSspJFwiKS50ZXN0KHZhbHVlW1wiY3Vyc29yXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibGltaXRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKChpc1NhZmVJbnRlZ2VyKHZhbHVlW1wibGltaXRcIl0pICYmIHZhbHVlW1wibGltaXRcIl0gPj0gMSAmJiB2YWx1ZVtcImxpbWl0XCJdIDw9IDIwMCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImN1cnNvclwiLCBcImxpbWl0XCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNldHRpbmdzR2V0UmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBTZXR0aW5nc0dldFJlcXVlc3Qge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImtleVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJkZWZhdWx0XCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1wiZGVmYXVsdFwiXSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZVtcImRlZmF1bHRcIl0gPT09IG51bGwpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJrZXlcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImtleVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiZGVmYXVsdFwiLCBcImtleVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTdHlsZXNBcHBseVJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgU3R5bGVzQXBwbHlSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJsYXllcl9pZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInN0eWxlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImxheWVyX2lkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJsYXllcl9pZFwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wic3R5bGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInN0eWxlXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJsYXllcl9pZFwiLCBcInN0eWxlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFZlY3RvckxheWVySW5mbyh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBWZWN0b3JMYXllckluZm8ge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImlkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibmFtZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImdlb21ldHJ5X3R5cGVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJmaWVsZF9uYW1lc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImNyc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJjcnNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJjcnNcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJjcnNcIl0gPT09IG51bGwpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJmaWVsZF9uYW1lc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJmaWVsZF9uYW1lc1wiXSkgJiYgdmFsdWVbXCJmaWVsZF9uYW1lc1wiXS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSA9PT0gXCJwb2ludFwiIHx8IHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSA9PT0gXCJsaW5lXCIgfHwgdmFsdWVbXCJnZW9tZXRyeV90eXBlXCJdID09PSBcInBvbHlnb25cIiB8fCB2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gPT09IFwibm9uZVwiKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiaWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImlkXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJuYW1lXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJjcnNcIiwgXCJmaWVsZF9uYW1lc1wiLCBcImdlb21ldHJ5X3R5cGVcIiwgXCJpZFwiLCBcIm5hbWVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG4vKiogT25lIGV2ZW50IG9mIGBuZXR3b3JrLmZldGNoYCwgbmFycm93ZWQgYnkgaXRzIGtpbmQuICovXG5leHBvcnQgdHlwZSBOZXR3b3JrRmV0Y2hFdmVudCA9XG5cdHwgeyByZWFkb25seSBraW5kOiBcImRhdGFcIjsgcmVhZG9ubHkgcGF5bG9hZDogTmV0d29ya0ZldGNoRGF0YSB9O1xuXG5leHBvcnQgZnVuY3Rpb24gTmV0d29ya0ZldGNoRXZlbnQodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTmV0d29ya0ZldGNoRXZlbnQge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWUua2luZCA9PT0gXCJkYXRhXCIpIHJldHVybiBOZXR3b3JrRmV0Y2hEYXRhKHZhbHVlLnBheWxvYWQsIHN0cmljdCk7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqIEV2ZXJ5IG9wZXJhdGlvbiB0aGlzIHN1cmZhY2UgZGVjbGFyZXMsIGFzIGNhbGxhYmxlIG1ldGhvZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RPcGVyYXRpb25zIHtcblx0cmVhZG9ubHkgZmlsZXM6IHtcblx0XHRyZWFkb25seSBleHBvcnQ6IChpbnB1dDogRXhwb3J0UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPEV4cG9ydFJlc3VsdD47XG5cdH07XG5cdHJlYWRvbmx5IGxheWVyczoge1xuXHRcdHJlYWRvbmx5IGdldDogKGlucHV0OiBMYXllclJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxWZWN0b3JMYXllckluZm8+O1xuXHRcdHJlYWRvbmx5IGxpc3Q6IChpbnB1dD86IFBhZ2VSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8TGF5ZXJQYWdlPjtcblx0XHRyZWFkb25seSBvcGVuX3ZlY3RvcjogKGlucHV0OiBPcGVuVmVjdG9yUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPFZlY3RvckxheWVySW5mbz47XG5cdH07XG5cdHJlYWRvbmx5IG5ldHdvcms6IHtcblx0XHRyZWFkb25seSBmZXRjaDogKGlucHV0OiBGZXRjaFJlcXVlc3QsIGhhbmRsZXJzOiBIb3N0U3RyZWFtSGFuZGxlcnM8TmV0d29ya0ZldGNoRXZlbnQ+LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8SG9zdFN0cmVhbUhhbmRsZT47XG5cdH07XG5cdHJlYWRvbmx5IG5vdGlmaWNhdGlvbnM6IHtcblx0XHRyZWFkb25seSBpbmZvOiAoaW5wdXQ6IE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPG51bGw+O1xuXHR9O1xuXHRyZWFkb25seSBwcm9qZWN0OiB7XG5cdFx0cmVhZG9ubHkgbGF5ZXJfaWRzOiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPElkUGFnZT47XG5cdH07XG5cdHJlYWRvbmx5IHNldHRpbmdzOiB7XG5cdFx0cmVhZG9ubHkgZ2V0OiAoaW5wdXQ6IFNldHRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuXHR9O1xuXHRyZWFkb25seSBzdHlsZXM6IHtcblx0XHRyZWFkb25seSBhcHBseTogKGlucHV0OiBTdHlsZXNBcHBseVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxudWxsPjtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvc3QoY2xpZW50OiBIb3N0Q2xpZW50TGlrZSk6IEhvc3RPcGVyYXRpb25zIHtcblx0cmV0dXJuIHtcblx0XHRmaWxlczoge1xuXHRcdFx0ZXhwb3J0OiAoaW5wdXQ6IEV4cG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxFeHBvcnRSZXN1bHQ+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJmaWxlcy5leHBvcnRcIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0RXhwb3J0UmVxdWVzdCxcblx0XHRcdFx0XHRFeHBvcnRSZXN1bHQsXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRsYXllcnM6IHtcblx0XHRcdGdldDogKGlucHV0OiBMYXllclJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxWZWN0b3JMYXllckluZm8+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJsYXllcnMuZ2V0XCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdExheWVyUmVxdWVzdCxcblx0XHRcdFx0XHRWZWN0b3JMYXllckluZm8sXG5cdFx0XHRcdCksXG5cdFx0XHRsaXN0OiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPExheWVyUGFnZT4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcImxheWVycy5saXN0XCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdFBhZ2VSZXF1ZXN0LFxuXHRcdFx0XHRcdExheWVyUGFnZSxcblx0XHRcdFx0KSxcblx0XHRcdG9wZW5fdmVjdG9yOiAoaW5wdXQ6IE9wZW5WZWN0b3JSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8VmVjdG9yTGF5ZXJJbmZvPihcblx0XHRcdFx0XHRjbGllbnQsIFwibGF5ZXJzLm9wZW5fdmVjdG9yXCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdE9wZW5WZWN0b3JSZXF1ZXN0LFxuXHRcdFx0XHRcdFZlY3RvckxheWVySW5mbyxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdG5ldHdvcms6IHtcblx0XHRcdGZldGNoOiAoaW5wdXQ6IEZldGNoUmVxdWVzdCwgaGFuZGxlcnM6IEhvc3RTdHJlYW1IYW5kbGVyczxOZXR3b3JrRmV0Y2hFdmVudD4sIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0b3BlbjxOZXR3b3JrRmV0Y2hFdmVudD4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcIm5ldHdvcmsuZmV0Y2hcIiwgaW5wdXQsIGhhbmRsZXJzLCBvcHRpb25zLFxuXHRcdFx0XHRcdEZldGNoUmVxdWVzdCxcblx0XHRcdFx0XHROZXR3b3JrRmV0Y2hFdmVudCxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdG5vdGlmaWNhdGlvbnM6IHtcblx0XHRcdGluZm86IChpbnB1dDogTm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8bnVsbD4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcIm5vdGlmaWNhdGlvbnMuaW5mb1wiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHROb3RpZmljYXRpb25zSW5mb1JlcXVlc3QsXG5cdFx0XHRcdFx0KGNhbmRpZGF0ZTogdW5rbm93bikgPT4gY2FuZGlkYXRlID09PSBudWxsLFxuXHRcdFx0XHQpLFxuXHRcdH0sXG5cdFx0cHJvamVjdDoge1xuXHRcdFx0bGF5ZXJfaWRzOiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPElkUGFnZT4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcInByb2plY3QubGF5ZXJfaWRzXCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdFBhZ2VSZXF1ZXN0LFxuXHRcdFx0XHRcdElkUGFnZSxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdHNldHRpbmdzOiB7XG5cdFx0XHRnZXQ6IChpbnB1dDogU2V0dGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8c3RyaW5nIHwgbnVsbD4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcInNldHRpbmdzLmdldFwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRTZXR0aW5nc0dldFJlcXVlc3QsXG5cdFx0XHRcdFx0KGNhbmRpZGF0ZTogdW5rbm93bikgPT4gKHR5cGVvZiBjYW5kaWRhdGUgPT09IFwic3RyaW5nXCIgfHwgY2FuZGlkYXRlID09PSBudWxsKSxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdHN0eWxlczoge1xuXHRcdFx0YXBwbHk6IChpbnB1dDogU3R5bGVzQXBwbHlSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8bnVsbD4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcInN0eWxlcy5hcHBseVwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRTdHlsZXNBcHBseVJlcXVlc3QsXG5cdFx0XHRcdFx0KGNhbmRpZGF0ZTogdW5rbm93bikgPT4gY2FuZGlkYXRlID09PSBudWxsLFxuXHRcdFx0XHQpLFxuXHRcdH0sXG5cdH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGw8VD4oXG5cdGNsaWVudDogSG9zdENsaWVudExpa2UsXG5cdG9wZXJhdGlvbjogc3RyaW5nLFxuXHRpbnB1dDogdW5rbm93bixcblx0b3B0aW9uczogSG9zdEludm9rZU9wdGlvbnMgfCB1bmRlZmluZWQsXG5cdGFjY2VwdElucHV0OiAodmFsdWU6IHVua25vd24sIHN0cmljdD86IGJvb2xlYW4pID0+IGJvb2xlYW4sXG5cdGFjY2VwdE91dHB1dDogKHZhbHVlOiB1bmtub3duKSA9PiBib29sZWFuLFxuKTogUHJvbWlzZTxUPiB7XG5cdGlmIChpbnB1dCAhPT0gdW5kZWZpbmVkICYmICFhY2NlcHRJbnB1dChpbnB1dCwgdHJ1ZSkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0hvc3RDb250cmFjdEVycm9yKG9wZXJhdGlvbiwgXCJ0aGUgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVxdWVzdFwiKTtcblx0fVxuXHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoXG5cdFx0b3BlcmF0aW9uLFxuXHRcdChpbnB1dCA/PyB7fSkgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICghYWNjZXB0T3V0cHV0KHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrSG9zdENvbnRyYWN0RXJyb3Iob3BlcmF0aW9uLCBcInRoZSByZXNwb25zZSBkb2VzIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVzdWx0XCIpO1xuXHR9XG5cdHJldHVybiB2YWx1ZSBhcyBUO1xufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuPEUgZXh0ZW5kcyB7IHJlYWRvbmx5IGtpbmQ6IHN0cmluZyB9Pihcblx0Y2xpZW50OiBIb3N0Q2xpZW50TGlrZSxcblx0b3BlcmF0aW9uOiBzdHJpbmcsXG5cdGlucHV0OiB1bmtub3duLFxuXHRoYW5kbGVyczogSG9zdFN0cmVhbUhhbmRsZXJzPEU+LFxuXHRvcHRpb25zOiBIb3N0SW52b2tlT3B0aW9ucyB8IHVuZGVmaW5lZCxcblx0YWNjZXB0SW5wdXQ6ICh2YWx1ZTogdW5rbm93biwgc3RyaWN0PzogYm9vbGVhbikgPT4gYm9vbGVhbixcblx0YWNjZXB0RXZlbnQ6ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgRSxcbik6IFByb21pc2U8SG9zdFN0cmVhbUhhbmRsZT4ge1xuXHRpZiAoIWFjY2VwdElucHV0KGlucHV0LCB0cnVlKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrSG9zdENvbnRyYWN0RXJyb3Iob3BlcmF0aW9uLCBcInRoZSBhcmd1bWVudHMgZG8gbm90IG1hdGNoIHRoZSBkZWNsYXJlZCByZXF1ZXN0XCIpO1xuXHR9XG5cdC8vIFRoZSB0eXBlZCBzdHJlYW0gZW5kcyBleGFjdGx5IG9uY2UsIGxpa2UgdGhlIHN1YnNjcmlwdGlvbiB1bmRlciBpdDogYVxuXHQvLyBjb250cmFjdCB2aW9sYXRpb24gZW5kcyBpdCBoZXJlLCBjbG9zZXMgdGhlIHN1YnNjcmlwdGlvbiwgYW5kIHRoZVxuXHQvLyBgZGlzcG9zZWRgIHRoZSBjbGllbnQgdGhlbiByZXBvcnRzIGlzIG5vdCBkZWxpdmVyZWQgYSBzZWNvbmQgdGltZS5cblx0bGV0IGVuZGVkID0gZmFsc2U7XG5cdGxldCB2aW9sYXRlZCA9IGZhbHNlO1xuXHRsZXQgaGFuZGxlOiBIb3N0U3RyZWFtSGFuZGxlIHwgbnVsbCA9IG51bGw7XG5cdGNvbnN0IGVuZCA9ICh0ZXJtaW5hbDogSG9zdFN0cmVhbVRlcm1pbmFsKTogdm9pZCA9PiB7XG5cdFx0aWYgKGVuZGVkKSByZXR1cm47XG5cdFx0ZW5kZWQgPSB0cnVlO1xuXHRcdGhhbmRsZXJzLm9uVGVybWluYWw/Lih0ZXJtaW5hbCk7XG5cdH07XG5cdGhhbmRsZSA9IGF3YWl0IGNsaWVudC5zdWJzY3JpYmUoXG5cdFx0b3BlcmF0aW9uLFxuXHRcdGlucHV0IGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcblx0XHR7XG5cdFx0XHRvbkV2ZW50OiAoZXZlbnQpID0+IHtcblx0XHRcdFx0aWYgKGVuZGVkKSByZXR1cm47XG5cdFx0XHRcdGlmIChhY2NlcHRFdmVudChldmVudCkpIHtcblx0XHRcdFx0XHRoYW5kbGVycy5vbkV2ZW50Py4oZXZlbnQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbmQoe1xuXHRcdFx0XHRcdGtpbmQ6IFwiZXJyb3JcIixcblx0XHRcdFx0XHRtZXNzYWdlOiBuZXcgUWdpc1Nka0hvc3RDb250cmFjdEVycm9yKFxuXHRcdFx0XHRcdFx0b3BlcmF0aW9uLFxuXHRcdFx0XHRcdFx0XCJhbiBldmVudCBkb2VzIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgZXZlbnRzXCIsXG5cdFx0XHRcdFx0KS5tZXNzYWdlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHZpb2xhdGVkID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHR9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICh2aW9sYXRlZCkge1xuXHRcdGhhbmRsZS5jbG9zZSgpO1xuXHR9XG5cdHJldHVybiBoYW5kbGU7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQU1PLElBQU0sV0FBVTtBQUNoQixJQUFNLG9CQUFtQjtBQUN6QixJQUFNLHVCQUFzQjtBQUc1QixJQUFNLG1CQUFrQjtBQUFBLEVBQzlCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRDtBQUFBO0FBK0NPLE1BQU0sa0NBQWlDLGNBQWE7QUFBQSxFQUMxQztBQUFBLEVBQ1QsV0FBVyxDQUFDLFdBQW1CLFNB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VUFDQSxTQUNBLGFBQ0EsYUFDNEI7QUFBQSxFQUM1QixJQUFJLENBQUMsWUFBWSxPQUFPLElBQUksR0FBRztBQUFBLElBQzlCLE1BQU0sSUFBSSwwQkFBeUIsV0FBVyxpREFBaUQ7QUFBQSxFQUNoRztBQUFBLEVBSUEsSUFBSSxRQUFRO0FBQUEsRUFDWixJQUFJLFdBQVc7QUFBQSxFQUNmLElBQUksU0FBa0M7QUFBQSxFQUN0QyxNQUFNLE1BQU0sQ0FBQyxhQUF1QztBQUFBLElBQ25ELElBQUk7QUFBQSxNQUFPO0FBQUEsSUFDWCxRQUFRO0FBQUEsSUFDUixTQUFTLGFBQWEsUUFBUTtBQUFBO0FBQUEsRUFFL0IsU0FBUyxNQUFNLE9BQU8sVUFDckIsV0FDQSxPQUNBO0FBQUEsSUFDQyxTQUFTLENBQUMsVUFBVTtBQUFBLE1BQ25CLElBQUk7QUFBQSxRQUFPO0FBQUEsTUFDWCxJQUFJLFlBQVksS0FBSyxHQUFHO0FBQUEsUUFDdkIsU0FBUyxVQUFVLEtBQUs7QUFBQSxRQUN4QjtBQUFBLE1BQ0Q7QUFBQSxNQUNBLElBQUk7QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLFNBQVMsSUFBSSwwQkFDWixXQUNBLDZDQUNELEVBQUU7QUFBQSxNQUNILENBQUM7QUFBQSxNQUNELElBQUksV0FBVyxNQUFNO0FBQUEsUUFDcEIsV0FBVztBQUFBLE1BQ1osRUFBTztBQUFBLFFBQ04sT0FBTyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBR2YsWUFBWTtBQUFBLEVBQ2IsR0FDQSxPQUNEO0FBQUEsRUFDQSxJQUFJLFVBQVU7QUFBQSxJQUNiLE9BQU8sTUFBTTtBQUFBLEVBQ2Q7QUFBQSxFQUNBLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjE0RkE2RTFCQUNDNDhFNDk2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9