@archont561/qgis-sdk-bridge 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/host.js ADDED
@@ -0,0 +1,433 @@
1
+ // src/generated/host.ts
2
+ var HOST_ID = "qgis.host";
3
+ var HOST_FINGERPRINT = "sha256:f96bdf1046434de3c5eae01efb34c8ad2bcd1cf241a3dc42f6c4b613dc7d7d6f";
4
+ var HOST_SCHEMA_VERSION = 1;
5
+ var HOST_OPERATIONS = [
6
+ "files.export",
7
+ "layers.get",
8
+ "layers.list",
9
+ "layers.open_vector",
10
+ "network.fetch",
11
+ "notifications.info",
12
+ "project.layer_ids",
13
+ "settings.get",
14
+ "styles.apply"
15
+ ];
16
+
17
+ class HostContractError extends Error {
18
+ operation;
19
+ constructor(operation, message) {
20
+ super(`operation "${operation}": ${message}`);
21
+ this.name = "HostContractError";
22
+ this.operation = operation;
23
+ }
24
+ }
25
+ function isRecord(value) {
26
+ return typeof value === "object" && value !== null && !Array.isArray(value);
27
+ }
28
+ function hasOnly(value, keys) {
29
+ return Object.keys(value).every((key) => keys.includes(key));
30
+ }
31
+ function isSafeInteger(value) {
32
+ return typeof value === "number" && Number.isSafeInteger(value);
33
+ }
34
+ function ExportRequest(value, strict = false) {
35
+ if (!isRecord(value))
36
+ return false;
37
+ if (!("file" in value))
38
+ return false;
39
+ if (!("content" in value))
40
+ return false;
41
+ if (value["content"] !== undefined && !(typeof value["content"] === "string")) {
42
+ return false;
43
+ }
44
+ if (value["file"] !== undefined && !FileRef(value["file"], strict)) {
45
+ return false;
46
+ }
47
+ if (strict && !hasOnly(value, ["content", "file"]))
48
+ return false;
49
+ return true;
50
+ }
51
+ function ExportResult(value, strict = false) {
52
+ if (!isRecord(value))
53
+ return false;
54
+ if (!("bytes_written" in value))
55
+ return false;
56
+ if (!("name" in value))
57
+ return false;
58
+ if (value["bytes_written"] !== undefined && !isSafeInteger(value["bytes_written"])) {
59
+ return false;
60
+ }
61
+ if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
62
+ return false;
63
+ }
64
+ if (strict && !hasOnly(value, ["bytes_written", "name"]))
65
+ return false;
66
+ return true;
67
+ }
68
+ function FetchRequest(value, strict = false) {
69
+ if (!isRecord(value))
70
+ return false;
71
+ if (!("url" in value))
72
+ return false;
73
+ if (value["auth_config"] !== undefined && !(typeof value["auth_config"] === "string")) {
74
+ return false;
75
+ }
76
+ if (value["body"] !== undefined && !(typeof value["body"] === "string")) {
77
+ return false;
78
+ }
79
+ if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader(item, strict)))) {
80
+ return false;
81
+ }
82
+ 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")) {
83
+ return false;
84
+ }
85
+ if (value["timeout_seconds"] !== undefined && !(typeof value["timeout_seconds"] === "number" && Number.isFinite(value["timeout_seconds"]) && value["timeout_seconds"] >= 0.1 && value["timeout_seconds"] <= 300)) {
86
+ return false;
87
+ }
88
+ if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
89
+ return false;
90
+ }
91
+ if (strict && !hasOnly(value, ["auth_config", "body", "headers", "method", "timeout_seconds", "url"]))
92
+ return false;
93
+ return true;
94
+ }
95
+ function FileRef(value, strict = false) {
96
+ if (!isRecord(value))
97
+ return false;
98
+ if (!("kind" in value))
99
+ return false;
100
+ if (!("id" in value))
101
+ return false;
102
+ if (value["id"] !== undefined && !(typeof value["id"] === "string" && new RegExp("^(?:[a-f0-9]{16,64})$").test(value["id"]))) {
103
+ return false;
104
+ }
105
+ if (value["kind"] !== undefined && !(value["kind"] === "file")) {
106
+ return false;
107
+ }
108
+ if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
109
+ return false;
110
+ }
111
+ if (value["operations"] !== undefined && !(Array.isArray(value["operations"]) && value["operations"].every((item) => item === "read" || item === "write"))) {
112
+ return false;
113
+ }
114
+ if (strict && !hasOnly(value, ["id", "kind", "name", "operations"]))
115
+ return false;
116
+ return true;
117
+ }
118
+ function HttpHeader(value, strict = false) {
119
+ if (!isRecord(value))
120
+ return false;
121
+ if (!("name" in value))
122
+ return false;
123
+ if (!("value" in value))
124
+ return false;
125
+ if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
126
+ return false;
127
+ }
128
+ if (value["value"] !== undefined && !(typeof value["value"] === "string")) {
129
+ return false;
130
+ }
131
+ if (strict && !hasOnly(value, ["name", "value"]))
132
+ return false;
133
+ return true;
134
+ }
135
+ function IdPage(value, strict = false) {
136
+ if (!isRecord(value))
137
+ return false;
138
+ if (!("items" in value))
139
+ return false;
140
+ if (!("truncated" in value))
141
+ return false;
142
+ if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => typeof item === "string"))) {
143
+ return false;
144
+ }
145
+ if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
146
+ return false;
147
+ }
148
+ if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
149
+ return false;
150
+ }
151
+ if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
152
+ return false;
153
+ return true;
154
+ }
155
+ function LayerPage(value, strict = false) {
156
+ if (!isRecord(value))
157
+ return false;
158
+ if (!("items" in value))
159
+ return false;
160
+ if (!("truncated" in value))
161
+ return false;
162
+ if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => VectorLayerInfo(item, strict)))) {
163
+ return false;
164
+ }
165
+ if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
166
+ return false;
167
+ }
168
+ if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
169
+ return false;
170
+ }
171
+ if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
172
+ return false;
173
+ return true;
174
+ }
175
+ function LayerRequest(value, strict = false) {
176
+ if (!isRecord(value))
177
+ return false;
178
+ if (!("layer_id" in value))
179
+ return false;
180
+ if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
181
+ return false;
182
+ }
183
+ if (strict && !hasOnly(value, ["layer_id"]))
184
+ return false;
185
+ return true;
186
+ }
187
+ function NetworkFetchData(value, strict = false) {
188
+ if (!isRecord(value))
189
+ return false;
190
+ if (!("url" in value))
191
+ return false;
192
+ if (!("status_code" in value))
193
+ return false;
194
+ if (!("reason" in value))
195
+ return false;
196
+ if (!("headers" in value))
197
+ return false;
198
+ if (!("text" in value))
199
+ return false;
200
+ if (!("base64" in value))
201
+ return false;
202
+ if (value["base64"] !== undefined && !(typeof value["base64"] === "string" || value["base64"] === null)) {
203
+ return false;
204
+ }
205
+ if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader(item, strict)))) {
206
+ return false;
207
+ }
208
+ if (value["reason"] !== undefined && !(typeof value["reason"] === "string")) {
209
+ return false;
210
+ }
211
+ if (value["status_code"] !== undefined && !isSafeInteger(value["status_code"])) {
212
+ return false;
213
+ }
214
+ if (value["text"] !== undefined && !(typeof value["text"] === "string" || value["text"] === null)) {
215
+ return false;
216
+ }
217
+ if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
218
+ return false;
219
+ }
220
+ if (strict && !hasOnly(value, ["base64", "headers", "reason", "status_code", "text", "url"]))
221
+ return false;
222
+ return true;
223
+ }
224
+ function NotificationsInfoRequest(value, strict = false) {
225
+ if (!isRecord(value))
226
+ return false;
227
+ if (!("message" in value))
228
+ return false;
229
+ if (value["message"] !== undefined && !(typeof value["message"] === "string")) {
230
+ return false;
231
+ }
232
+ if (strict && !hasOnly(value, ["message"]))
233
+ return false;
234
+ return true;
235
+ }
236
+ function OpenVectorRequest(value, strict = false) {
237
+ if (!isRecord(value))
238
+ return false;
239
+ if (!("file" in value))
240
+ return false;
241
+ if (value["file"] !== undefined && !FileRef(value["file"], strict)) {
242
+ return false;
243
+ }
244
+ if (strict && !hasOnly(value, ["file"]))
245
+ return false;
246
+ return true;
247
+ }
248
+ function PageRequest(value, strict = false) {
249
+ if (!isRecord(value))
250
+ return false;
251
+ if (value["cursor"] !== undefined && !(typeof value["cursor"] === "string" && new RegExp("^(?:[0-9]+)$").test(value["cursor"]))) {
252
+ return false;
253
+ }
254
+ if (value["limit"] !== undefined && !(isSafeInteger(value["limit"]) && value["limit"] >= 1 && value["limit"] <= 200)) {
255
+ return false;
256
+ }
257
+ if (strict && !hasOnly(value, ["cursor", "limit"]))
258
+ return false;
259
+ return true;
260
+ }
261
+ function SettingsGetRequest(value, strict = false) {
262
+ if (!isRecord(value))
263
+ return false;
264
+ if (!("key" in value))
265
+ return false;
266
+ if (value["default"] !== undefined && !(typeof value["default"] === "string" || value["default"] === null)) {
267
+ return false;
268
+ }
269
+ if (value["key"] !== undefined && !(typeof value["key"] === "string")) {
270
+ return false;
271
+ }
272
+ if (strict && !hasOnly(value, ["default", "key"]))
273
+ return false;
274
+ return true;
275
+ }
276
+ function StylesApplyRequest(value, strict = false) {
277
+ if (!isRecord(value))
278
+ return false;
279
+ if (!("layer_id" in value))
280
+ return false;
281
+ if (!("style" in value))
282
+ return false;
283
+ if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
284
+ return false;
285
+ }
286
+ if (value["style"] !== undefined && !(typeof value["style"] === "string")) {
287
+ return false;
288
+ }
289
+ if (strict && !hasOnly(value, ["layer_id", "style"]))
290
+ return false;
291
+ return true;
292
+ }
293
+ function VectorLayerInfo(value, strict = false) {
294
+ if (!isRecord(value))
295
+ return false;
296
+ if (!("id" in value))
297
+ return false;
298
+ if (!("name" in value))
299
+ return false;
300
+ if (!("geometry_type" in value))
301
+ return false;
302
+ if (!("field_names" in value))
303
+ return false;
304
+ if (!("crs" in value))
305
+ return false;
306
+ if (value["crs"] !== undefined && !(typeof value["crs"] === "string" || value["crs"] === null)) {
307
+ return false;
308
+ }
309
+ if (value["field_names"] !== undefined && !(Array.isArray(value["field_names"]) && value["field_names"].every((item) => typeof item === "string"))) {
310
+ return false;
311
+ }
312
+ if (value["geometry_type"] !== undefined && !(value["geometry_type"] === "point" || value["geometry_type"] === "line" || value["geometry_type"] === "polygon" || value["geometry_type"] === "none")) {
313
+ return false;
314
+ }
315
+ if (value["id"] !== undefined && !(typeof value["id"] === "string")) {
316
+ return false;
317
+ }
318
+ if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
319
+ return false;
320
+ }
321
+ if (strict && !hasOnly(value, ["crs", "field_names", "geometry_type", "id", "name"]))
322
+ return false;
323
+ return true;
324
+ }
325
+ function NetworkFetchEvent(value, strict = false) {
326
+ if (!isRecord(value))
327
+ return false;
328
+ if (value.kind === "data")
329
+ return NetworkFetchData(value.payload, strict);
330
+ return false;
331
+ }
332
+ function createHost(client) {
333
+ return {
334
+ files: {
335
+ export: (input, options) => call(client, "files.export", input, options, ExportRequest, ExportResult)
336
+ },
337
+ layers: {
338
+ get: (input, options) => call(client, "layers.get", input, options, LayerRequest, VectorLayerInfo),
339
+ list: (input, options) => call(client, "layers.list", input, options, PageRequest, LayerPage),
340
+ open_vector: (input, options) => call(client, "layers.open_vector", input, options, OpenVectorRequest, VectorLayerInfo)
341
+ },
342
+ network: {
343
+ fetch: (input, handlers, options) => open(client, "network.fetch", input, handlers, options, FetchRequest, NetworkFetchEvent)
344
+ },
345
+ notifications: {
346
+ info: (input, options) => call(client, "notifications.info", input, options, NotificationsInfoRequest, (candidate) => candidate === null)
347
+ },
348
+ project: {
349
+ layer_ids: (input, options) => call(client, "project.layer_ids", input, options, PageRequest, IdPage)
350
+ },
351
+ settings: {
352
+ get: (input, options) => call(client, "settings.get", input, options, SettingsGetRequest, (candidate) => typeof candidate === "string" || candidate === null)
353
+ },
354
+ styles: {
355
+ apply: (input, options) => call(client, "styles.apply", input, options, StylesApplyRequest, (candidate) => candidate === null)
356
+ }
357
+ };
358
+ }
359
+ async function call(client, operation, input, options, acceptInput, acceptOutput) {
360
+ if (input !== undefined && !acceptInput(input, true)) {
361
+ throw new HostContractError(operation, "the arguments do not match the declared request");
362
+ }
363
+ const value = await client.invoke(operation, input ?? {}, options);
364
+ if (!acceptOutput(value)) {
365
+ throw new HostContractError(operation, "the response does not match the declared result");
366
+ }
367
+ return value;
368
+ }
369
+ async function open(client, operation, input, handlers, options, acceptInput, acceptEvent) {
370
+ if (!acceptInput(input, true)) {
371
+ throw new HostContractError(operation, "the arguments do not match the declared request");
372
+ }
373
+ let ended = false;
374
+ let violated = false;
375
+ let handle = null;
376
+ const end = (terminal) => {
377
+ if (ended)
378
+ return;
379
+ ended = true;
380
+ handlers.onTerminal?.(terminal);
381
+ };
382
+ handle = await client.subscribe(operation, input, {
383
+ onEvent: (event) => {
384
+ if (ended)
385
+ return;
386
+ if (acceptEvent(event)) {
387
+ handlers.onEvent?.(event);
388
+ return;
389
+ }
390
+ end({
391
+ kind: "error",
392
+ message: new HostContractError(operation, "an event does not match the declared events").message
393
+ });
394
+ if (handle === null) {
395
+ violated = true;
396
+ } else {
397
+ handle.close();
398
+ }
399
+ },
400
+ onTerminal: end
401
+ }, options);
402
+ if (violated) {
403
+ handle.close();
404
+ }
405
+ return handle;
406
+ }
407
+ export {
408
+ ExportRequest,
409
+ ExportResult,
410
+ FetchRequest,
411
+ FileRef,
412
+ HOST_FINGERPRINT,
413
+ HOST_ID,
414
+ HOST_OPERATIONS,
415
+ HOST_SCHEMA_VERSION,
416
+ HostContractError,
417
+ HttpHeader,
418
+ IdPage,
419
+ LayerPage,
420
+ LayerRequest,
421
+ NetworkFetchData,
422
+ NetworkFetchEvent,
423
+ NotificationsInfoRequest,
424
+ OpenVectorRequest,
425
+ PageRequest,
426
+ SettingsGetRequest,
427
+ StylesApplyRequest,
428
+ VectorLayerInfo,
429
+ createHost
430
+ };
431
+
432
+ //# debugId=EF165F591C75829964756E2164756E21
433
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2dlbmVyYXRlZC9ob3N0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIEdlbmVyYXRlZCBieSBxZ2lzLXNkay4gRG8gbm90IGVkaXQuXG4vLyBTb3VyY2U6IHRoZSBjdXJhdGVkIGhvc3QgbWFuaWZlc3QgaW4gcWdpc19zZGsuYnJpZGdlLmhvc3QuXG4vLyBSZWdlbmVyYXRlIHdpdGggYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZSAtLWhvc3RgOyBDSSBmYWlscyBvbiBkcmlmdC5cblxuZXhwb3J0IGNvbnN0IEhPU1RfSUQgPSBcInFnaXMuaG9zdFwiO1xuZXhwb3J0IGNvbnN0IEhPU1RfRklOR0VSUFJJTlQgPSBcInNoYTI1NjpmOTZiZGYxMDQ2NDM0ZGUzYzVlYWUwMWVmYjM0YzhhZDJiY2QxY2YyNDFhM2RjNDJmNmM0YjYxM2RjN2Q3ZDZmXCI7XG5leHBvcnQgY29uc3QgSE9TVF9TQ0hFTUFfVkVSU0lPTiA9IDE7XG5cbi8qKiBFdmVyeSBkZWNsYXJlZCBvcGVyYXRpb24gaWQsIHNvIGEgbmFtZSBjYW4gYmUgY2hlY2tlZCwgbm90IGd1ZXNzZWQuICovXG5leHBvcnQgY29uc3QgSE9TVF9PUEVSQVRJT05TID0gW1xuXHRcImZpbGVzLmV4cG9ydFwiLFxuXHRcImxheWVycy5nZXRcIixcblx0XCJsYXllcnMubGlzdFwiLFxuXHRcImxheWVycy5vcGVuX3ZlY3RvclwiLFxuXHRcIm5ldHdvcmsuZmV0Y2hcIixcblx0XCJub3RpZmljYXRpb25zLmluZm9cIixcblx0XCJwcm9qZWN0LmxheWVyX2lkc1wiLFxuXHRcInNldHRpbmdzLmdldFwiLFxuXHRcInN0eWxlcy5hcHBseVwiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgSG9zdE9wZXJhdGlvbklkID0gKHR5cGVvZiBIT1NUX09QRVJBVElPTlMpW251bWJlcl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdEludm9rZU9wdGlvbnMge1xuXHRyZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIFRoZSBjbGllbnQgdGhpcyBtb2R1bGUgd3JhcHM6IGFueXRoaW5nIHdpdGggYSBjb3JyZWxhdGVkIGludm9rZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdENsaWVudExpa2Uge1xuXHRpbnZva2UoXG5cdFx0b3BlcmF0aW9uOiBzdHJpbmcsXG5cdFx0cGF5bG9hZD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcblx0XHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG5cdCk6IFByb21pc2U8dW5rbm93bj47XG5cdHN1YnNjcmliZShcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0XHRwYXlsb2FkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdGhhbmRsZXJzPzogSG9zdFN0cmVhbUhhbmRsZXJzPHtcblx0XHRcdHJlYWRvbmx5IGtpbmQ6IFwiZGF0YVwiIHwgXCJwcm9ncmVzc1wiIHwgXCJzdGF0ZVwiO1xuXHRcdFx0cmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcblx0XHR9Pixcblx0XHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG5cdCk6IFByb21pc2U8SG9zdFN0cmVhbUhhbmRsZT47XG59XG5cbi8qKiBIb3cgYSBzdHJlYW0gZW5kZWQ7IGBkcm9wcGVkYCBpcyBvbmx5IHByZXNlbnQgZm9yIGEgZ2FwLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0U3RyZWFtVGVybWluYWwge1xuXHRyZWFkb25seSBraW5kOiBcImNvbXBsZXRlXCIgfCBcImVycm9yXCIgfCBcImNhbmNlbGxlZFwiIHwgXCJnYXBcIiB8IFwiZGlzcG9zZWRcIjtcblx0cmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblx0cmVhZG9ubHkgZHJvcHBlZD86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQgYSBzdHJlYW0gcmVwb3J0czogdHlwZWQgZXZlbnRzLCB0aGVuIGV4YWN0bHkgb25lIGVuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdFN0cmVhbUhhbmRsZXJzPEU+IHtcblx0cmVhZG9ubHkgb25FdmVudD86IChldmVudDogRSkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25UZXJtaW5hbD86ICh0ZXJtaW5hbDogSG9zdFN0cmVhbVRlcm1pbmFsKSA9PiB2b2lkO1xufVxuXG4vKiogQSBsaXZlIHN0cmVhbSwgYXMgdGhlIGNhbGxlciBob2xkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdFN0cmVhbUhhbmRsZSB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGNsb3NlZDogYm9vbGVhbjtcblx0Y2xvc2UoKTogdm9pZDtcbn1cblxuLyoqIEFuIGFyZ3VtZW50IG9yIGEgcmVzcG9uc2UgdGhhdCBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyZWQgc2NoZW1hLiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RDb250cmFjdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvcGVyYXRpb246IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIoYG9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiOiAke21lc3NhZ2V9YCk7XG5cdFx0dGhpcy5uYW1lID0gXCJIb3N0Q29udHJhY3RFcnJvclwiO1xuXHRcdHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaGFzT25seShcblx0dmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRrZXlzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmV2ZXJ5KChrZXkpID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRSZXF1ZXN0IHtcblx0cmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXHRyZWFkb25seSBmaWxlOiBGaWxlUmVmO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFJlc3VsdCB7XG5cdHJlYWRvbmx5IGJ5dGVzX3dyaXR0ZW46IG51bWJlcjtcblx0cmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGF1dGhfY29uZmlnPzogc3RyaW5nO1xuXHRyZWFkb25seSBib2R5Pzogc3RyaW5nO1xuXHRyZWFkb25seSBoZWFkZXJzPzogcmVhZG9ubHkgSHR0cEhlYWRlcltdO1xuXHRyZWFkb25seSBtZXRob2Q/OiBcIkdFVFwiIHwgXCJIRUFEXCIgfCBcIlBPU1RcIiB8IFwiUFVUXCIgfCBcIlBBVENIXCIgfCBcIkRFTEVURVwiIHwgXCJPUFRJT05TXCI7XG5cdHJlYWRvbmx5IHRpbWVvdXRfc2Vjb25kcz86IG51bWJlcjtcblx0cmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlZiB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGtpbmQ6IFwiZmlsZVwiO1xuXHRyZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXHRyZWFkb25seSBvcGVyYXRpb25zPzogcmVhZG9ubHkgKFwicmVhZFwiIHwgXCJ3cml0ZVwiKVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBIZWFkZXIge1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRQYWdlIHtcblx0cmVhZG9ubHkgaXRlbXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHRyZWFkb25seSBuZXh0X2N1cnNvcj86IHN0cmluZztcblx0cmVhZG9ubHkgdHJ1bmNhdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheWVyUGFnZSB7XG5cdHJlYWRvbmx5IGl0ZW1zOiByZWFkb25seSBWZWN0b3JMYXllckluZm9bXTtcblx0cmVhZG9ubHkgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IHRydW5jYXRlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXllclJlcXVlc3Qge1xuXHRyZWFkb25seSBsYXllcl9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtGZXRjaERhdGEge1xuXHRyZWFkb25seSBiYXNlNjQ6IHN0cmluZyB8IG51bGw7XG5cdHJlYWRvbmx5IGhlYWRlcnM6IHJlYWRvbmx5IEh0dHBIZWFkZXJbXTtcblx0cmVhZG9ubHkgcmVhc29uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHN0YXR1c19jb2RlOiBudW1iZXI7XG5cdHJlYWRvbmx5IHRleHQ6IHN0cmluZyB8IG51bGw7XG5cdHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCB7XG5cdHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuVmVjdG9yUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGZpbGU6IEZpbGVSZWY7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlcXVlc3Qge1xuXHRyZWFkb25seSBjdXJzb3I/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzR2V0UmVxdWVzdCB7XG5cdHJlYWRvbmx5IGRlZmF1bHQ/OiBzdHJpbmcgfCBudWxsO1xuXHRyZWFkb25seSBrZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHlsZXNBcHBseVJlcXVlc3Qge1xuXHRyZWFkb25seSBsYXllcl9pZDogc3RyaW5nO1xuXHRyZWFkb25seSBzdHlsZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvckxheWVySW5mbyB7XG5cdHJlYWRvbmx5IGNyczogc3RyaW5nIHwgbnVsbDtcblx0cmVhZG9ubHkgZmllbGRfbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHRyZWFkb25seSBnZW9tZXRyeV90eXBlOiBcInBvaW50XCIgfCBcImxpbmVcIiB8IFwicG9seWdvblwiIHwgXCJub25lXCI7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydFJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgRXhwb3J0UmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImNvbnRlbnRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiY29udGVudFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiY29udGVudFwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiZmlsZVwiXSAhPT0gdW5kZWZpbmVkICYmICEoRmlsZVJlZih2YWx1ZVtcImZpbGVcIl0sIHN0cmljdCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImNvbnRlbnRcIiwgXCJmaWxlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydFJlc3VsdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBFeHBvcnRSZXN1bHQge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImJ5dGVzX3dyaXR0ZW5cIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJuYW1lXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImJ5dGVzX3dyaXR0ZW5cIl0gIT09IHVuZGVmaW5lZCAmJiAhKGlzU2FmZUludGVnZXIodmFsdWVbXCJieXRlc193cml0dGVuXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiYnl0ZXNfd3JpdHRlblwiLCBcIm5hbWVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRmV0Y2hSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIEZldGNoUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidXJsXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImF1dGhfY29uZmlnXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJhdXRoX2NvbmZpZ1wiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiYm9keVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiaGVhZGVyc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJoZWFkZXJzXCJdKSAmJiB2YWx1ZVtcImhlYWRlcnNcIl0uZXZlcnkoKGl0ZW0pID0+IEh0dHBIZWFkZXIoaXRlbSwgc3RyaWN0KSkpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJtZXRob2RcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJHRVRcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJIRUFEXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiUE9TVFwiIHx8IHZhbHVlW1wibWV0aG9kXCJdID09PSBcIlBVVFwiIHx8IHZhbHVlW1wibWV0aG9kXCJdID09PSBcIlBBVENIXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiREVMRVRFXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiT1BUSU9OU1wiKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZVtcInRpbWVvdXRfc2Vjb25kc1wiXSkgJiYgdmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gPj0gMC4xICYmIHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdIDw9IDMwMCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInVybFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widXJsXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJhdXRoX2NvbmZpZ1wiLCBcImJvZHlcIiwgXCJoZWFkZXJzXCIsIFwibWV0aG9kXCIsIFwidGltZW91dF9zZWNvbmRzXCIsIFwidXJsXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZpbGVSZWYodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgRmlsZVJlZiB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwia2luZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImlkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImlkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJpZFwiXSA9PT0gXCJzdHJpbmdcIiAmJiBuZXcgUmVnRXhwKFwiXig/OlthLWYwLTldezE2LDY0fSkkXCIpLnRlc3QodmFsdWVbXCJpZFwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImtpbmRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcImtpbmRcIl0gPT09IFwiZmlsZVwiKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wib3BlcmF0aW9uc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJvcGVyYXRpb25zXCJdKSAmJiB2YWx1ZVtcIm9wZXJhdGlvbnNcIl0uZXZlcnkoKGl0ZW0pID0+IChpdGVtID09PSBcInJlYWRcIiB8fCBpdGVtID09PSBcIndyaXRlXCIpKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImlkXCIsIFwia2luZFwiLCBcIm5hbWVcIiwgXCJvcGVyYXRpb25zXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEh0dHBIZWFkZXIodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgSHR0cEhlYWRlciB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibmFtZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInZhbHVlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcIm5hbWVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcIm5hbWVcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInZhbHVlXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ2YWx1ZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibmFtZVwiLCBcInZhbHVlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElkUGFnZSh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBJZFBhZ2Uge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIml0ZW1zXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidHJ1bmNhdGVkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcIml0ZW1zXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcIml0ZW1zXCJdKSAmJiB2YWx1ZVtcIml0ZW1zXCJdLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuZXh0X2N1cnNvclwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmV4dF9jdXJzb3JcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInRydW5jYXRlZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widHJ1bmNhdGVkXCJdID09PSBcImJvb2xlYW5cIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiaXRlbXNcIiwgXCJuZXh0X2N1cnNvclwiLCBcInRydW5jYXRlZFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYXllclBhZ2UodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTGF5ZXJQYWdlIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJpdGVtc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInRydW5jYXRlZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJpdGVtc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJpdGVtc1wiXSkgJiYgdmFsdWVbXCJpdGVtc1wiXS5ldmVyeSgoaXRlbSkgPT4gVmVjdG9yTGF5ZXJJbmZvKGl0ZW0sIHN0cmljdCkpKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmV4dF9jdXJzb3JcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcIm5leHRfY3Vyc29yXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJ0cnVuY2F0ZWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInRydW5jYXRlZFwiXSA9PT0gXCJib29sZWFuXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcIml0ZW1zXCIsIFwibmV4dF9jdXJzb3JcIiwgXCJ0cnVuY2F0ZWRcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTGF5ZXJSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIExheWVyUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibGF5ZXJfaWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wibGF5ZXJfaWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImxheWVyX2lkXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJsYXllcl9pZFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBOZXR3b3JrRmV0Y2hEYXRhKHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE5ldHdvcmtGZXRjaERhdGEge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInVybFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInN0YXR1c19jb2RlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwicmVhc29uXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiaGVhZGVyc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInRleHRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJiYXNlNjRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiYmFzZTY0XCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1wiYmFzZTY0XCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1wiYmFzZTY0XCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiaGVhZGVyc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJoZWFkZXJzXCJdKSAmJiB2YWx1ZVtcImhlYWRlcnNcIl0uZXZlcnkoKGl0ZW0pID0+IEh0dHBIZWFkZXIoaXRlbSwgc3RyaWN0KSkpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJyZWFzb25cIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInJlYXNvblwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wic3RhdHVzX2NvZGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKGlzU2FmZUludGVnZXIodmFsdWVbXCJzdGF0dXNfY29kZVwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInRleHRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJ0ZXh0XCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1widGV4dFwiXSA9PT0gbnVsbCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInVybFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widXJsXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJiYXNlNjRcIiwgXCJoZWFkZXJzXCIsIFwicmVhc29uXCIsIFwic3RhdHVzX2NvZGVcIiwgXCJ0ZXh0XCIsIFwidXJsXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBOb3RpZmljYXRpb25zSW5mb1JlcXVlc3Qge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIm1lc3NhZ2VcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wibWVzc2FnZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibWVzc2FnZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibWVzc2FnZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVmVjdG9yUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBPcGVuVmVjdG9yUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJmaWxlXCJdICE9PSB1bmRlZmluZWQgJiYgIShGaWxlUmVmKHZhbHVlW1wiZmlsZVwiXSwgc3RyaWN0KSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiZmlsZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQYWdlUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBQYWdlUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImN1cnNvclwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiY3Vyc29yXCJdID09PSBcInN0cmluZ1wiICYmIG5ldyBSZWdFeHAoXCJeKD86WzAtOV0rKSRcIikudGVzdCh2YWx1ZVtcImN1cnNvclwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImxpbWl0XCJdICE9PSB1bmRlZmluZWQgJiYgISgoaXNTYWZlSW50ZWdlcih2YWx1ZVtcImxpbWl0XCJdKSAmJiB2YWx1ZVtcImxpbWl0XCJdID49IDEgJiYgdmFsdWVbXCJsaW1pdFwiXSA8PSAyMDApKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJjdXJzb3JcIiwgXCJsaW1pdFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTZXR0aW5nc0dldFJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgU2V0dGluZ3NHZXRSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJrZXlcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiZGVmYXVsdFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHR5cGVvZiB2YWx1ZVtcImRlZmF1bHRcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJkZWZhdWx0XCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wia2V5XCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJrZXlcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImRlZmF1bHRcIiwgXCJrZXlcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gU3R5bGVzQXBwbHlSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIFN0eWxlc0FwcGx5UmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibGF5ZXJfaWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJzdHlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJsYXllcl9pZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibGF5ZXJfaWRcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInN0eWxlXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJzdHlsZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibGF5ZXJfaWRcIiwgXCJzdHlsZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBWZWN0b3JMYXllckluZm8odmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgVmVjdG9yTGF5ZXJJbmZvIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJpZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIm5hbWVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJnZW9tZXRyeV90eXBlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmllbGRfbmFtZXNcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJjcnNcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiY3JzXCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1wiY3JzXCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1wiY3JzXCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiZmllbGRfbmFtZXNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKChBcnJheS5pc0FycmF5KHZhbHVlW1wiZmllbGRfbmFtZXNcIl0pICYmIHZhbHVlW1wiZmllbGRfbmFtZXNcIl0uZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gPT09IFwicG9pbnRcIiB8fCB2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gPT09IFwibGluZVwiIHx8IHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSA9PT0gXCJwb2x5Z29uXCIgfHwgdmFsdWVbXCJnZW9tZXRyeV90eXBlXCJdID09PSBcIm5vbmVcIikpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImlkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJpZFwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiY3JzXCIsIFwiZmllbGRfbmFtZXNcIiwgXCJnZW9tZXRyeV90eXBlXCIsIFwiaWRcIiwgXCJuYW1lXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIE9uZSBldmVudCBvZiBgbmV0d29yay5mZXRjaGAsIG5hcnJvd2VkIGJ5IGl0cyBraW5kLiAqL1xuZXhwb3J0IHR5cGUgTmV0d29ya0ZldGNoRXZlbnQgPVxuXHR8IHsgcmVhZG9ubHkga2luZDogXCJkYXRhXCI7IHJlYWRvbmx5IHBheWxvYWQ6IE5ldHdvcmtGZXRjaERhdGEgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5ldHdvcmtGZXRjaEV2ZW50KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE5ldHdvcmtGZXRjaEV2ZW50IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlLmtpbmQgPT09IFwiZGF0YVwiKSByZXR1cm4gTmV0d29ya0ZldGNoRGF0YSh2YWx1ZS5wYXlsb2FkLCBzdHJpY3QpO1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBFdmVyeSBvcGVyYXRpb24gdGhpcyBzdXJmYWNlIGRlY2xhcmVzLCBhcyBjYWxsYWJsZSBtZXRob2RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0T3BlcmF0aW9ucyB7XG5cdHJlYWRvbmx5IGZpbGVzOiB7XG5cdFx0cmVhZG9ubHkgZXhwb3J0OiAoaW5wdXQ6IEV4cG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxFeHBvcnRSZXN1bHQ+O1xuXHR9O1xuXHRyZWFkb25seSBsYXllcnM6IHtcblx0XHRyZWFkb25seSBnZXQ6IChpbnB1dDogTGF5ZXJSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8VmVjdG9yTGF5ZXJJbmZvPjtcblx0XHRyZWFkb25seSBsaXN0OiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPExheWVyUGFnZT47XG5cdFx0cmVhZG9ubHkgb3Blbl92ZWN0b3I6IChpbnB1dDogT3BlblZlY3RvclJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxWZWN0b3JMYXllckluZm8+O1xuXHR9O1xuXHRyZWFkb25seSBuZXR3b3JrOiB7XG5cdFx0cmVhZG9ubHkgZmV0Y2g6IChpbnB1dDogRmV0Y2hSZXF1ZXN0LCBoYW5kbGVyczogSG9zdFN0cmVhbUhhbmRsZXJzPE5ldHdvcmtGZXRjaEV2ZW50Piwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPEhvc3RTdHJlYW1IYW5kbGU+O1xuXHR9O1xuXHRyZWFkb25seSBub3RpZmljYXRpb25zOiB7XG5cdFx0cmVhZG9ubHkgaW5mbzogKGlucHV0OiBOb3RpZmljYXRpb25zSW5mb1JlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxudWxsPjtcblx0fTtcblx0cmVhZG9ubHkgcHJvamVjdDoge1xuXHRcdHJlYWRvbmx5IGxheWVyX2lkczogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxJZFBhZ2U+O1xuXHR9O1xuXHRyZWFkb25seSBzZXR0aW5nczoge1xuXHRcdHJlYWRvbmx5IGdldDogKGlucHV0OiBTZXR0aW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcblx0fTtcblx0cmVhZG9ubHkgc3R5bGVzOiB7XG5cdFx0cmVhZG9ubHkgYXBwbHk6IChpbnB1dDogU3R5bGVzQXBwbHlSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8bnVsbD47XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb3N0KGNsaWVudDogSG9zdENsaWVudExpa2UpOiBIb3N0T3BlcmF0aW9ucyB7XG5cdHJldHVybiB7XG5cdFx0ZmlsZXM6IHtcblx0XHRcdGV4cG9ydDogKGlucHV0OiBFeHBvcnRSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8RXhwb3J0UmVzdWx0Pihcblx0XHRcdFx0XHRjbGllbnQsIFwiZmlsZXMuZXhwb3J0XCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdEV4cG9ydFJlcXVlc3QsXG5cdFx0XHRcdFx0RXhwb3J0UmVzdWx0LFxuXHRcdFx0XHQpLFxuXHRcdH0sXG5cdFx0bGF5ZXJzOiB7XG5cdFx0XHRnZXQ6IChpbnB1dDogTGF5ZXJSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8VmVjdG9yTGF5ZXJJbmZvPihcblx0XHRcdFx0XHRjbGllbnQsIFwibGF5ZXJzLmdldFwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRMYXllclJlcXVlc3QsXG5cdFx0XHRcdFx0VmVjdG9yTGF5ZXJJbmZvLFxuXHRcdFx0XHQpLFxuXHRcdFx0bGlzdDogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxMYXllclBhZ2U+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJsYXllcnMubGlzdFwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRQYWdlUmVxdWVzdCxcblx0XHRcdFx0XHRMYXllclBhZ2UsXG5cdFx0XHRcdCksXG5cdFx0XHRvcGVuX3ZlY3RvcjogKGlucHV0OiBPcGVuVmVjdG9yUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPFZlY3RvckxheWVySW5mbz4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcImxheWVycy5vcGVuX3ZlY3RvclwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRPcGVuVmVjdG9yUmVxdWVzdCxcblx0XHRcdFx0XHRWZWN0b3JMYXllckluZm8sXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRuZXR3b3JrOiB7XG5cdFx0XHRmZXRjaDogKGlucHV0OiBGZXRjaFJlcXVlc3QsIGhhbmRsZXJzOiBIb3N0U3RyZWFtSGFuZGxlcnM8TmV0d29ya0ZldGNoRXZlbnQ+LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdG9wZW48TmV0d29ya0ZldGNoRXZlbnQ+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJuZXR3b3JrLmZldGNoXCIsIGlucHV0LCBoYW5kbGVycywgb3B0aW9ucyxcblx0XHRcdFx0XHRGZXRjaFJlcXVlc3QsXG5cdFx0XHRcdFx0TmV0d29ya0ZldGNoRXZlbnQsXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRub3RpZmljYXRpb25zOiB7XG5cdFx0XHRpbmZvOiAoaW5wdXQ6IE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJub3RpZmljYXRpb25zLmluZm9cIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0Tm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+IGNhbmRpZGF0ZSA9PT0gbnVsbCxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdHByb2plY3Q6IHtcblx0XHRcdGxheWVyX2lkczogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxJZFBhZ2U+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJwcm9qZWN0LmxheWVyX2lkc1wiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRQYWdlUmVxdWVzdCxcblx0XHRcdFx0XHRJZFBhZ2UsXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRzZXR0aW5nczoge1xuXHRcdFx0Z2V0OiAoaW5wdXQ6IFNldHRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPHN0cmluZyB8IG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJzZXR0aW5ncy5nZXRcIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0U2V0dGluZ3NHZXRSZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+ICh0eXBlb2YgY2FuZGlkYXRlID09PSBcInN0cmluZ1wiIHx8IGNhbmRpZGF0ZSA9PT0gbnVsbCksXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRzdHlsZXM6IHtcblx0XHRcdGFwcGx5OiAoaW5wdXQ6IFN0eWxlc0FwcGx5UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJzdHlsZXMuYXBwbHlcIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0U3R5bGVzQXBwbHlSZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+IGNhbmRpZGF0ZSA9PT0gbnVsbCxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHR9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjYWxsPFQ+KFxuXHRjbGllbnQ6IEhvc3RDbGllbnRMaWtlLFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0aW5wdXQ6IHVua25vd24sXG5cdG9wdGlvbnM6IEhvc3RJbnZva2VPcHRpb25zIHwgdW5kZWZpbmVkLFxuXHRhY2NlcHRJbnB1dDogKHZhbHVlOiB1bmtub3duLCBzdHJpY3Q/OiBib29sZWFuKSA9PiBib29sZWFuLFxuXHRhY2NlcHRPdXRwdXQ6ICh2YWx1ZTogdW5rbm93bikgPT4gYm9vbGVhbixcbik6IFByb21pc2U8VD4ge1xuXHRpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCAmJiAhYWNjZXB0SW5wdXQoaW5wdXQsIHRydWUpKSB7XG5cdFx0dGhyb3cgbmV3IEhvc3RDb250cmFjdEVycm9yKG9wZXJhdGlvbiwgXCJ0aGUgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVxdWVzdFwiKTtcblx0fVxuXHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoXG5cdFx0b3BlcmF0aW9uLFxuXHRcdChpbnB1dCA/PyB7fSkgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICghYWNjZXB0T3V0cHV0KHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBIb3N0Q29udHJhY3RFcnJvcihvcGVyYXRpb24sIFwidGhlIHJlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCByZXN1bHRcIik7XG5cdH1cblx0cmV0dXJuIHZhbHVlIGFzIFQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW48RSBleHRlbmRzIHsgcmVhZG9ubHkga2luZDogc3RyaW5nIH0+KFxuXHRjbGllbnQ6IEhvc3RDbGllbnRMaWtlLFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0aW5wdXQ6IHVua25vd24sXG5cdGhhbmRsZXJzOiBIb3N0U3RyZWFtSGFuZGxlcnM8RT4sXG5cdG9wdGlvbnM6IEhvc3RJbnZva2VPcHRpb25zIHwgdW5kZWZpbmVkLFxuXHRhY2NlcHRJbnB1dDogKHZhbHVlOiB1bmtub3duLCBzdHJpY3Q/OiBib29sZWFuKSA9PiBib29sZWFuLFxuXHRhY2NlcHRFdmVudDogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBFLFxuKTogUHJvbWlzZTxIb3N0U3RyZWFtSGFuZGxlPiB7XG5cdGlmICghYWNjZXB0SW5wdXQoaW5wdXQsIHRydWUpKSB7XG5cdFx0dGhyb3cgbmV3IEhvc3RDb250cmFjdEVycm9yKG9wZXJhdGlvbiwgXCJ0aGUgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVxdWVzdFwiKTtcblx0fVxuXHQvLyBUaGUgdHlwZWQgc3RyZWFtIGVuZHMgZXhhY3RseSBvbmNlLCBsaWtlIHRoZSBzdWJzY3JpcHRpb24gdW5kZXIgaXQ6IGFcblx0Ly8gY29udHJhY3QgdmlvbGF0aW9uIGVuZHMgaXQgaGVyZSwgY2xvc2VzIHRoZSBzdWJzY3JpcHRpb24sIGFuZCB0aGVcblx0Ly8gYGRpc3Bvc2VkYCB0aGUgY2xpZW50IHRoZW4gcmVwb3J0cyBpcyBub3QgZGVsaXZlcmVkIGEgc2Vjb25kIHRpbWUuXG5cdGxldCBlbmRlZCA9IGZhbHNlO1xuXHRsZXQgdmlvbGF0ZWQgPSBmYWxzZTtcblx0bGV0IGhhbmRsZTogSG9zdFN0cmVhbUhhbmRsZSB8IG51bGwgPSBudWxsO1xuXHRjb25zdCBlbmQgPSAodGVybWluYWw6IEhvc3RTdHJlYW1UZXJtaW5hbCk6IHZvaWQgPT4ge1xuXHRcdGlmIChlbmRlZCkgcmV0dXJuO1xuXHRcdGVuZGVkID0gdHJ1ZTtcblx0XHRoYW5kbGVycy5vblRlcm1pbmFsPy4odGVybWluYWwpO1xuXHR9O1xuXHRoYW5kbGUgPSBhd2FpdCBjbGllbnQuc3Vic2NyaWJlKFxuXHRcdG9wZXJhdGlvbixcblx0XHRpbnB1dCBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG5cdFx0e1xuXHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmIChlbmRlZCkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoYWNjZXB0RXZlbnQoZXZlbnQpKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0ZW5kKHtcblx0XHRcdFx0XHRraW5kOiBcImVycm9yXCIsXG5cdFx0XHRcdFx0bWVzc2FnZTogbmV3IEhvc3RDb250cmFjdEVycm9yKFxuXHRcdFx0XHRcdFx0b3BlcmF0aW9uLFxuXHRcdFx0XHRcdFx0XCJhbiBldmVudCBkb2VzIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgZXZlbnRzXCIsXG5cdFx0XHRcdFx0KS5tZXNzYWdlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHZpb2xhdGVkID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHR9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICh2aW9sYXRlZCkge1xuXHRcdGhhbmRsZS5jbG9zZSgpO1xuXHR9XG5cdHJldHVybiBoYW5kbGU7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBSU8sSUFBTSxVQUFVO0FBQ2hCLElBQU0sbUJBQW1CO0FBQ3pCLElBQU0sc0JBQXNCO0FBRzVCLElBQU0sa0JBQWtCO0FBQUEsRUFDOUI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNEO0FBQUE7QUErQ08sTUFBTSwwQkFBMEIsTUFBTTtBQUFBLEVBQzVCO0FBQUEsRUFDVCxXQUFXLENBQUMsV0FBbUIsU0FBaUI7QUFBQSxJQUN0RCxNQUFNLGNBQWMsZUFBZSxTQUFTO0FBQUEsSUFDNUMsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLFlBQVk7QUFBQTtBQUVu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TSxJQUFJLGtCQUFrQixXQUFXLGlEQUFpRDtBQUFBLEVBQ3pGO0FBQUEsRUFJQSxJQUFJLFFBQVE7QUFBQSxFQUNaLElBQUksV0FBVztBQUFBLEVBQ2YsSUFBSSxTQUFrQztBQUFBLEVBQ3RDLE1BQU0sTUFBTSxDQUFDLGFBQXVDO0FBQUEsSUFDbkQsSUFBSTtBQUFBLE1BQU87QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLFNBQVMsYUFBYSxRQUFRO0FBQUE7QUFBQSxFQUUvQixTQUFTLE1BQU0sT0FBTyxVQUNyQixXQUNBLE9BQ0E7QUFBQSxJQUNDLFNBQVMsQ0FBQyxVQUFVO0FBQUEsTUFDbkIsSUFBSTtBQUFBLFFBQU87QUFBQSxNQUNYLElBQUksWUFBWSxLQUFLLEdBQUc7QUFBQSxRQUN2QixTQUFTLFVBQVUsS0FBSztBQUFBLFFBQ3hCO0FBQUEsTUFDRDtBQUFBLE1BQ0EsSUFBSTtBQUFBLFFBQ0gsTUFBTTtBQUFBLFFBQ04sU0FBUyxJQUFJLGtCQUNaLFdBQ0EsNkNBQ0QsRUFBRTtBQUFBLE1BQ0gsQ0FBQztBQUFBLE1BQ0QsSUFBSSxXQUFXLE1BQU07QUFBQSxRQUNwQixXQUFXO0FBQUEsTUFDWixFQUFPO0FBQUEsUUFDTixPQUFPLE1BQU07QUFBQTtBQUFBO0FBQUEsSUFHZixZQUFZO0FBQUEsRUFDYixHQUNBLE9BQ0Q7QUFBQSxFQUNBLElBQUksVUFBVTtBQUFBLElBQ2IsT0FBTyxNQUFNO0FBQUEsRUFDZDtBQUFBLEVBQ0EsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiRUYxNjVGNTkxQzc1ODI5OTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/dist/index.d.ts CHANGED
@@ -24,11 +24,27 @@ interface ActionDescription {
24
24
  readonly request: Readonly<Record<string, unknown>>;
25
25
  readonly result: Readonly<Record<string, unknown>>;
26
26
  }
27
+ /** The event kinds a stream may declare; the frame carries the same three. */
28
+ type StreamEventKind = "data" | "progress" | "state";
29
+ /**
30
+ * A declared stream (decision-28): a request in, one payload schema per
31
+ * declared event kind out. There is no `result`: the reply to a subscription is
32
+ * the protocol's acknowledgement, not something an author declares.
33
+ */
34
+ interface StreamDescription {
35
+ readonly id: string;
36
+ readonly title: string;
37
+ readonly handler: string;
38
+ readonly request: Readonly<Record<string, unknown>>;
39
+ readonly events: Readonly<Partial<Record<StreamEventKind, Readonly<Record<string, unknown>>>>>;
40
+ }
27
41
  interface PluginDescription {
28
42
  readonly schema_version: 1;
29
43
  readonly id: string;
30
44
  readonly title: string;
31
45
  readonly actions: readonly ActionDescription[];
46
+ /** Declared streams; a description from a host that predates them is empty. */
47
+ readonly streams: readonly StreamDescription[];
32
48
  }
33
49
  /**
34
50
  * Return whether `value` is a finite integer within the JavaScript-safe wire range.
@@ -79,7 +95,12 @@ declare class QgisSdkContractValidationError extends QgisSdkError {
79
95
  toJSON(): SerializedContractValidationError;
80
96
  }
81
97
  /**
98
+ * Return whether `value` is a non-null, non-array object: the shape every wire
99
+ * envelope, description and event payload must have before its fields are read.
100
+ */
101
+ declare function isPlainRecord(value: unknown): value is Record<string, unknown>;
102
+ /**
82
103
  * Parse and validate a version 1 `PluginDescription` emitted by `describe_plugin`.
83
104
  */
84
105
  declare function parsePluginDescription(input: string | Readonly<Record<string, unknown>>): PluginDescription;
85
- export { ActionDescription, MAX_SAFE_INTEGER, MIN_SAFE_INTEGER, PLUGIN_DESCRIPTION_SCHEMA_VERSION, PluginDescription, QgisSdkContractValidationError, QgisSdkDeclarationError, QgisSdkError, QgisSdkScopeClosedError, QgisSdkUnsupportedCapabilityError, QgisSdkValidationIssue, SerializedContractValidationError, SerializedValidationIssue, ValidationDirection, isSafeJsonInteger, parsePluginDescription };
106
+ export { ActionDescription, MAX_SAFE_INTEGER, MIN_SAFE_INTEGER, PLUGIN_DESCRIPTION_SCHEMA_VERSION, PluginDescription, QgisSdkContractValidationError, QgisSdkDeclarationError, QgisSdkError, QgisSdkScopeClosedError, QgisSdkUnsupportedCapabilityError, QgisSdkValidationIssue, SerializedContractValidationError, SerializedValidationIssue, StreamDescription, StreamEventKind, ValidationDirection, isPlainRecord, isSafeJsonInteger, parsePluginDescription };