@secrecy/lib 1.0.0-dev.54 → 1.0.0-dev.57

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,1637 @@
1
+ import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
2
+ import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
3
+
4
+ /* eslint-disable @typescript-eslint/naming-convention */
5
+ import axios from "axios";
6
+ import ky from "ky";
7
+ import { encryptName } from "../index.js";
8
+ import { nodesCache, filesCache } from "../cache.js";
9
+ import { secretstreamKeygen } from "../crypto/file.js";
10
+ import { decryptCryptoBox } from "../crypto/index.js";
11
+ import { encryptCryptoBox } from "../crypto/index.js";
12
+ import { compress, uncompress } from "../minify/index.js";
13
+ import { sodium } from "../sodium.js";
14
+ import { enumerate, chunks, promiseAllLimit, concatenate } from "../utils/utils.js";
15
+ import { md5 } from "../worker/md5.js";
16
+ import { decrypt, encrypt } from "../worker/sodium.js";
17
+ import { gqlFileToExternal } from "./convert/file.js";
18
+ import { gqlNodeFullToInternalFull, gqlNodeToExternal, gqlNodeToExternalNodeFull, internalNodeToNode } from "./convert/node.js";
19
+ import { fileSelector, nodeFullSelector, nodeSelector } from "./types/selectors.js"; // import { md5 } from "../worker/index.js";
20
+ // import { firstValueFrom, of } from "rxjs";
21
+
22
+ var _client = /*#__PURE__*/_classPrivateFieldLooseKey("client");
23
+
24
+ var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
25
+
26
+ var _thunder = /*#__PURE__*/_classPrivateFieldLooseKey("thunder");
27
+
28
+ export class SecrecyCloudClient {
29
+ constructor(client, keys, thunder) {
30
+ Object.defineProperty(this, _client, {
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+ Object.defineProperty(this, _keys, {
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ Object.defineProperty(this, _thunder, {
39
+ writable: true,
40
+ value: void 0
41
+ });
42
+
43
+ this.perNode = async (nodeId, publicKey) => {
44
+ var _node$access;
45
+
46
+ let node = nodesCache.get(nodeId);
47
+
48
+ if (!node) {
49
+ await this.node({
50
+ id: nodeId
51
+ });
52
+ node = nodesCache.get(nodeId);
53
+
54
+ if (!node) {
55
+ return null;
56
+ }
57
+ }
58
+
59
+ const nameKey = (_node$access = node.access) == null ? void 0 : _node$access.nameKey;
60
+
61
+ if (!nameKey) {
62
+ return null;
63
+ }
64
+
65
+ return {
66
+ id: node.id,
67
+ nameKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(nameKey), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
68
+ files: "history" in node ? node.history.map(f => ({
69
+ id: f.id,
70
+ key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(f.key), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
71
+ })) : []
72
+ };
73
+ };
74
+
75
+ _classPrivateFieldLooseBase(this, _client)[_client] = client;
76
+ _classPrivateFieldLooseBase(this, _keys)[_keys] = keys;
77
+ _classPrivateFieldLooseBase(this, _thunder)[_thunder] = thunder;
78
+ }
79
+
80
+ async addFileToHistory(_ref) {
81
+ let {
82
+ fileId,
83
+ nodeId
84
+ } = _ref;
85
+ const {
86
+ addFileToHistory
87
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
88
+ addFileToHistory: [{
89
+ fileId,
90
+ nodeId
91
+ }, {
92
+ "...on ErrorAccessDenied": {
93
+ __typename: true,
94
+ message: true
95
+ },
96
+ "...on ErrorNotExist": {
97
+ __typename: true,
98
+ message: true
99
+ },
100
+ "...on AddFileToHistoryResponse": {
101
+ __typename: true,
102
+ addFileToHistory: nodeFullSelector
103
+ }
104
+ }]
105
+ });
106
+
107
+ if (!addFileToHistory) {
108
+ return null;
109
+ }
110
+
111
+ if (addFileToHistory.__typename === "ErrorAccessDenied") {
112
+ return addFileToHistory;
113
+ }
114
+
115
+ if (addFileToHistory.__typename === "ErrorNotExist") {
116
+ return addFileToHistory;
117
+ }
118
+
119
+ const node = await gqlNodeFullToInternalFull(addFileToHistory.addFileToHistory, _classPrivateFieldLooseBase(this, _keys)[_keys]);
120
+ const file = node.history.find(f => f.id === fileId);
121
+
122
+ if (file) {
123
+ const users = node.users.filter(_ref2 => {
124
+ let [u] = _ref2;
125
+ return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
126
+ });
127
+ const input = {
128
+ fileId: file.id,
129
+ users: users.map(_ref3 => {
130
+ let [u] = _ref3;
131
+ return {
132
+ id: u.id,
133
+ key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
134
+ };
135
+ })
136
+ };
137
+ await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
138
+ shareFileInHistory: [{
139
+ input,
140
+ nodeId
141
+ }, {
142
+ "...on ErrorAccessDenied": {
143
+ __typename: true,
144
+ message: true
145
+ },
146
+ "...on ErrorNotFound": {
147
+ __typename: true,
148
+ message: true
149
+ },
150
+ "...on ShareFileInHistoryResponse": {
151
+ __typename: true,
152
+ shareFileInHistory: true
153
+ }
154
+ }]
155
+ });
156
+ }
157
+
158
+ const result = internalNodeToNode(node);
159
+ return {
160
+ __typename: "SuccessResponse",
161
+ data: result
162
+ };
163
+ }
164
+
165
+ async uploadFile(_ref4) {
166
+ let {
167
+ file,
168
+ encryptProgress,
169
+ uploadProgress,
170
+ signal
171
+ } = _ref4;
172
+ const fileKey = secretstreamKeygen();
173
+ const fileBuffer = file instanceof File ? new Uint8Array(await file.arrayBuffer()) : file;
174
+ const compressed = compress(fileBuffer);
175
+ const {
176
+ data: encryptedFile,
177
+ md5: md5File,
178
+ md5Encrypted
179
+ } = await encrypt(fileKey, compressed, encryptProgress, signal);
180
+ const encryptedFileKey = encryptCryptoBox(fileKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
181
+ const {
182
+ uploadFile
183
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation", {
184
+ scalars: {
185
+ Json: {
186
+ encode: e => JSON.stringify(e),
187
+ decode: e => JSON.parse(e)
188
+ },
189
+ DateTime: {
190
+ decode: e => new Date(e),
191
+ encode: e => e.toISOString()
192
+ },
193
+ BigInt: {
194
+ decode: e => BigInt(e),
195
+ encode: e => e.toString()
196
+ }
197
+ }
198
+ })({
199
+ uploadFile: [{
200
+ fileSize: encryptedFile.byteLength,
201
+ fileSizeBefore: fileBuffer.byteLength,
202
+ fileKey: sodium.to_hex(encryptedFileKey),
203
+ md5Encrypted,
204
+ md5: md5File
205
+ }, {
206
+ "...on ErrorAccessDenied": {
207
+ __typename: true,
208
+ message: true
209
+ },
210
+ "...on ErrorLimit": {
211
+ __typename: true,
212
+ message: true
213
+ },
214
+ "...on ErrorNotFound": {
215
+ __typename: true,
216
+ message: true
217
+ },
218
+ "...on UploadFileResponse": {
219
+ __typename: true,
220
+ uploadFile: {
221
+ fileId: true,
222
+ filePartSize: true,
223
+ parts: {
224
+ fields: true,
225
+ order: true,
226
+ url: true
227
+ }
228
+ }
229
+ }
230
+ }]
231
+ });
232
+
233
+ if (!uploadFile) {
234
+ return null;
235
+ }
236
+
237
+ if (uploadFile.__typename === "ErrorAccessDenied") {
238
+ return uploadFile;
239
+ }
240
+
241
+ if (uploadFile.__typename === "ErrorLimit") {
242
+ return uploadFile;
243
+ }
244
+
245
+ if (uploadFile.__typename === "ErrorNotFound") {
246
+ return uploadFile;
247
+ }
248
+
249
+ if (!uploadFile.uploadFile) {
250
+ return null;
251
+ }
252
+
253
+ uploadProgress == null ? void 0 : uploadProgress({
254
+ total: encryptedFile.byteLength,
255
+ current: 0,
256
+ percent: 0
257
+ });
258
+
259
+ if (uploadFile.uploadFile.parts.length === 0) {
260
+ uploadProgress == null ? void 0 : uploadProgress({
261
+ total: encryptedFile.byteLength,
262
+ current: encryptedFile.byteLength,
263
+ percent: 1
264
+ });
265
+ return {
266
+ __typename: "SuccessResponse",
267
+ data: uploadFile.uploadFile.fileId
268
+ };
269
+ }
270
+
271
+ const uploadPartEnded = async (md5, order) => {
272
+ if (!uploadFile.uploadFile) {
273
+ return null;
274
+ }
275
+
276
+ const {
277
+ uploadFilePartEnd
278
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
279
+ uploadFilePartEnd: [{
280
+ fileId: uploadFile.uploadFile.fileId,
281
+ md5,
282
+ order
283
+ }, {
284
+ "...on ErrorAccessDenied": {
285
+ __typename: true,
286
+ message: true
287
+ },
288
+ "...on UploadFilePartEndResponse": {
289
+ __typename: true,
290
+ uploadFilePartEnd: true
291
+ }
292
+ }]
293
+ });
294
+
295
+ if (!uploadFilePartEnd) {
296
+ return null;
297
+ }
298
+
299
+ if (uploadFilePartEnd.__typename === "ErrorAccessDenied") {
300
+ return uploadFilePartEnd;
301
+ }
302
+
303
+ return {
304
+ __typename: "SuccessResponse",
305
+ data: uploadFilePartEnd.uploadFilePartEnd
306
+ };
307
+ };
308
+
309
+ const uploadEnded = async () => {
310
+ if (!uploadFile.uploadFile) {
311
+ return null;
312
+ }
313
+
314
+ const {
315
+ uploadFileEnd
316
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
317
+ uploadFileEnd: [{
318
+ fileId: uploadFile.uploadFile.fileId
319
+ }, {
320
+ "...on ErrorAccessDenied": {
321
+ __typename: true,
322
+ message: true
323
+ },
324
+ "...on ErrorNotFound": {
325
+ __typename: true,
326
+ message: true
327
+ },
328
+ "...on UploadFileEndResponse": {
329
+ __typename: true,
330
+ uploadFileEnd: true
331
+ }
332
+ }]
333
+ });
334
+
335
+ if (!uploadFileEnd) {
336
+ return null;
337
+ }
338
+
339
+ if (uploadFileEnd.__typename === "ErrorAccessDenied") {
340
+ return uploadFileEnd;
341
+ }
342
+
343
+ if (uploadFileEnd.__typename === "ErrorNotFound") {
344
+ return uploadFileEnd;
345
+ }
346
+
347
+ if (!uploadFileEnd.uploadFileEnd) {
348
+ return null;
349
+ }
350
+
351
+ return {
352
+ __typename: "SuccessResponse",
353
+ data: uploadFileEnd.uploadFileEnd
354
+ };
355
+ };
356
+
357
+ const chunkParts = new Array();
358
+
359
+ for (const [index, chunk] of enumerate(chunks(encryptedFile, Number(uploadFile.uploadFile.filePartSize)))) {
360
+ chunkParts.push({
361
+ order: index + 1,
362
+ data: chunk,
363
+ md5: await md5(chunk)
364
+ });
365
+ }
366
+
367
+ const progressParts = {};
368
+
369
+ const onProgress = (part, progressEvent) => {
370
+ progressParts[part] = progressEvent;
371
+ const current = Object.values(progressParts).reduce((prv, cur) => prv + cur.loaded, 0);
372
+ uploadProgress == null ? void 0 : uploadProgress({
373
+ percent: current / encryptedFile.byteLength,
374
+ total: encryptedFile.byteLength,
375
+ current
376
+ });
377
+ };
378
+
379
+ const byPart = async part => {
380
+ if (!uploadFile.uploadFile) {
381
+ return;
382
+ }
383
+
384
+ const formData = new FormData();
385
+ const chunk = chunkParts.find(p => p.order === part.order);
386
+
387
+ if (!chunk) {
388
+ return;
389
+ }
390
+
391
+ for (const [key, value] of Object.entries(part.fields)) {
392
+ formData.append(key, value);
393
+ }
394
+
395
+ formData.append("file", new Blob([chunk.data]), uploadFile.uploadFile.fileId + "-" + chunk.order);
396
+ await axios.post(part.url, formData, {
397
+ onUploadProgress: progressEvent => onProgress(part.order, progressEvent),
398
+ signal
399
+ });
400
+ await uploadPartEnded(chunk.md5, chunk.order); // if ((e as any).response.status === 0) {
401
+ // // TODO https://github.com/sindresorhus/ky/issues/305
402
+ // } else {
403
+ // throw e;
404
+ // }
405
+ };
406
+
407
+ if (!uploadFile.uploadFile) {
408
+ return null;
409
+ }
410
+
411
+ await promiseAllLimit(3, uploadFile.uploadFile.parts.map(p => () => byPart(p)));
412
+ const result = await uploadEnded();
413
+
414
+ if (!result) {
415
+ return null;
416
+ }
417
+
418
+ if (result.__typename === "ErrorAccessDenied") {
419
+ return result;
420
+ }
421
+
422
+ if (result.__typename === "ErrorNotFound") {
423
+ return result;
424
+ }
425
+
426
+ return {
427
+ __typename: "SuccessResponse",
428
+ data: result.data
429
+ };
430
+ }
431
+
432
+ async uploadFileInCloud(_ref5) {
433
+ let {
434
+ file,
435
+ name,
436
+ nodeId,
437
+ encryptProgress,
438
+ uploadProgress,
439
+ signal
440
+ } = _ref5;
441
+ const fileId = await this.uploadFile({
442
+ file,
443
+ encryptProgress,
444
+ uploadProgress,
445
+ signal
446
+ });
447
+
448
+ if (!fileId) {
449
+ return null;
450
+ }
451
+
452
+ if (fileId.__typename === "ErrorAccessDenied") {
453
+ return fileId;
454
+ }
455
+
456
+ if (fileId.__typename === "ErrorLimit") {
457
+ return fileId;
458
+ }
459
+
460
+ if (fileId.__typename === "ErrorNotFound") {
461
+ return fileId;
462
+ }
463
+
464
+ const result = await this.saveInCloud({
465
+ fileId: fileId.data,
466
+ name,
467
+ nodeId
468
+ });
469
+
470
+ if (!result) {
471
+ return null;
472
+ }
473
+
474
+ if (result.__typename === "ErrorAccessDenied") {
475
+ return result;
476
+ }
477
+
478
+ if (result.__typename === "ErrorBasic") {
479
+ return result;
480
+ }
481
+
482
+ if (result.__typename === "ErrorLimit") {
483
+ return result;
484
+ }
485
+
486
+ if (result.__typename === "ErrorNotFound") {
487
+ return result;
488
+ }
489
+
490
+ if (result.__typename === "ErrorNotExist") {
491
+ return result;
492
+ }
493
+
494
+ return {
495
+ __typename: "SuccessResponse",
496
+ data: result.data
497
+ };
498
+ }
499
+
500
+ async deletedNodes() {
501
+ const {
502
+ deletedNodes
503
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
504
+ deletedNodes: {
505
+ "...on ErrorAccessDenied": {
506
+ __typename: true,
507
+ message: true
508
+ },
509
+ "...on DeletedNodesResponse": {
510
+ __typename: true,
511
+ deletedNodes: nodeSelector
512
+ }
513
+ }
514
+ });
515
+
516
+ if (!deletedNodes) {
517
+ return null;
518
+ }
519
+
520
+ if (deletedNodes.__typename === "ErrorAccessDenied") {
521
+ return deletedNodes;
522
+ }
523
+
524
+ const nodes = new Array();
525
+
526
+ for (const node of deletedNodes.deletedNodes) {
527
+ nodes.push(await gqlNodeToExternal(node, _classPrivateFieldLooseBase(this, _keys)[_keys]));
528
+ }
529
+
530
+ return {
531
+ __typename: "SuccessResponse",
532
+ data: nodes
533
+ };
534
+ }
535
+
536
+ async sharedNodes() {
537
+ const {
538
+ sharedNodes
539
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
540
+ sharedNodes: {
541
+ "...on ErrorAccessDenied": {
542
+ __typename: true,
543
+ message: true
544
+ },
545
+ "...on SharedNodesResponse": {
546
+ __typename: true,
547
+ sharedNodes: nodeSelector
548
+ }
549
+ }
550
+ });
551
+
552
+ if (!sharedNodes) {
553
+ return null;
554
+ }
555
+
556
+ if (sharedNodes.__typename === "ErrorAccessDenied") {
557
+ return sharedNodes;
558
+ }
559
+
560
+ const nodes = new Array();
561
+
562
+ for (const folder of sharedNodes.sharedNodes) {
563
+ nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
564
+ }
565
+
566
+ return {
567
+ __typename: "SuccessResponse",
568
+ data: nodes
569
+ };
570
+ }
571
+
572
+ async nodesSharedWithMe(type) {
573
+ const {
574
+ nodesSharedWithMe
575
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
576
+ nodesSharedWithMe: [{
577
+ type
578
+ }, {
579
+ "...on ErrorAccessDenied": {
580
+ __typename: true,
581
+ message: true
582
+ },
583
+ "...on NodesSharedWithMeResponse": {
584
+ __typename: true,
585
+ nodesSharedWithMe: nodeSelector
586
+ }
587
+ }]
588
+ });
589
+
590
+ if (!nodesSharedWithMe) {
591
+ return null;
592
+ }
593
+
594
+ if (nodesSharedWithMe.__typename === "ErrorAccessDenied") {
595
+ return nodesSharedWithMe;
596
+ }
597
+
598
+ const nodes = new Array();
599
+
600
+ for (const folder of nodesSharedWithMe.nodesSharedWithMe) {
601
+ nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
602
+ }
603
+
604
+ return {
605
+ __typename: "SuccessResponse",
606
+ data: nodes
607
+ };
608
+ }
609
+
610
+ async deleteNodeSharing(_ref6) {
611
+ let {
612
+ nodeId,
613
+ userId
614
+ } = _ref6;
615
+ const {
616
+ deleteNodeSharing
617
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
618
+ deleteNodeSharing: [{
619
+ nodeId,
620
+ userId
621
+ }, {
622
+ "...on ErrorAccessDenied": {
623
+ __typename: true,
624
+ message: true
625
+ },
626
+ "...on DeleteNodeSharingResponse": {
627
+ __typename: true,
628
+ deleteNodeSharing: true
629
+ }
630
+ }]
631
+ });
632
+
633
+ if (!deleteNodeSharing) {
634
+ return null;
635
+ }
636
+
637
+ if (deleteNodeSharing.__typename === "ErrorAccessDenied") {
638
+ return deleteNodeSharing;
639
+ }
640
+
641
+ return {
642
+ __typename: "SuccessResponse",
643
+ data: deleteNodeSharing.deleteNodeSharing
644
+ };
645
+ }
646
+
647
+ async duplicateNode(_ref7) {
648
+ var _node$access2;
649
+
650
+ let {
651
+ nodeId,
652
+ folderId,
653
+ customName
654
+ } = _ref7;
655
+ let node = nodesCache.get(nodeId);
656
+
657
+ if (!node) {
658
+ await this.node({
659
+ id: nodeId
660
+ });
661
+ node = nodesCache.get(nodeId);
662
+
663
+ if (!node) {
664
+ throw new Error("Node (" + nodeId + ") does not exists");
665
+ }
666
+ }
667
+
668
+ if (!((_node$access2 = node.access) != null && _node$access2.nameKey)) {
669
+ throw new Error("Can't have access to node " + nodeId);
670
+ }
671
+
672
+ customName = customName ? await encryptName(customName, node.access.nameKey) : null;
673
+ const {
674
+ duplicateNode
675
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
676
+ duplicateNode: [{
677
+ nodeId,
678
+ folderId,
679
+ customName
680
+ }, {
681
+ "...on ErrorAccessDenied": {
682
+ __typename: true,
683
+ message: true
684
+ },
685
+ "...on ErrorNotFound": {
686
+ __typename: true,
687
+ message: true
688
+ },
689
+ "...on DuplicateNodeResponse": {
690
+ __typename: true,
691
+ duplicateNode: true
692
+ }
693
+ }]
694
+ });
695
+
696
+ if (!duplicateNode) {
697
+ return null;
698
+ }
699
+
700
+ if (duplicateNode.__typename === "ErrorAccessDenied") {
701
+ return duplicateNode;
702
+ }
703
+
704
+ if (duplicateNode.__typename === "ErrorNotFound") {
705
+ return duplicateNode;
706
+ }
707
+
708
+ return {
709
+ __typename: "SuccessResponse",
710
+ data: duplicateNode.duplicateNode
711
+ };
712
+ }
713
+
714
+ async deleteNodeCloudTrash(_ref8) {
715
+ var _deleteNodeCloudTrash;
716
+
717
+ let {
718
+ ids
719
+ } = _ref8;
720
+ const {
721
+ deleteNodeCloudTrash
722
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
723
+ deleteNodeCloudTrash: [{
724
+ ids
725
+ }, {
726
+ "...on ErrorAccessDenied": {
727
+ __typename: true,
728
+ message: true
729
+ },
730
+ "...on DeleteNodeCloudTrashResponse": {
731
+ __typename: true,
732
+ deleteNodeCloudTrash: true
733
+ }
734
+ }]
735
+ });
736
+
737
+ if (!deleteNodeCloudTrash) {
738
+ return null;
739
+ }
740
+
741
+ if (deleteNodeCloudTrash.__typename === "ErrorAccessDenied") {
742
+ return deleteNodeCloudTrash;
743
+ }
744
+
745
+ return {
746
+ __typename: "SuccessResponse",
747
+ data: (_deleteNodeCloudTrash = deleteNodeCloudTrash.deleteNodeCloudTrash) != null ? _deleteNodeCloudTrash : false
748
+ };
749
+ }
750
+
751
+ async createFolder(_ref9) {
752
+ var _folder$parent$users$, _folder$parent, _folder$parent$users;
753
+
754
+ let {
755
+ name,
756
+ parentFolderId
757
+ } = _ref9;
758
+ const key = secretstreamKeygen();
759
+ const encryptedName = await encryptName(name, sodium.to_hex(key));
760
+ const encryptedKey = encryptCryptoBox(key, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
761
+ const {
762
+ createFolder
763
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
764
+ createFolder: [{
765
+ name: encryptedName,
766
+ parentFolderId,
767
+ key: sodium.to_hex(encryptedKey)
768
+ }, {
769
+ "...on ErrorAccessDenied": {
770
+ __typename: true,
771
+ message: true
772
+ },
773
+ "...on ErrorNotExist": {
774
+ __typename: true,
775
+ message: true
776
+ },
777
+ "...on CreateFolderResponse": {
778
+ __typename: true,
779
+ createFolder: nodeFullSelector
780
+ }
781
+ }]
782
+ });
783
+
784
+ if (!createFolder) {
785
+ //throw new Error(`Can't create folder`);
786
+ return null;
787
+ }
788
+
789
+ if (createFolder.__typename === "ErrorAccessDenied") {
790
+ return createFolder;
791
+ }
792
+
793
+ if (createFolder.__typename === "ErrorNotExist") {
794
+ return createFolder;
795
+ }
796
+
797
+ if (!createFolder.createFolder) {
798
+ return null;
799
+ }
800
+
801
+ const folder = await gqlNodeToExternalNodeFull(createFolder.createFolder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
802
+ const users = (_folder$parent$users$ = (_folder$parent = folder.parent) == null ? void 0 : (_folder$parent$users = _folder$parent.users) == null ? void 0 : _folder$parent$users.filter(_ref10 => {
803
+ let [u] = _ref10;
804
+ return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
805
+ })) != null ? _folder$parent$users$ : [];
806
+
807
+ if (users.length) {
808
+ await Promise.all(users.map(_ref11 => {
809
+ let [u, rights] = _ref11;
810
+ return this.shareNode({
811
+ nodeId: folder.id,
812
+ rights,
813
+ userId: u.id
814
+ });
815
+ }));
816
+ }
817
+
818
+ return {
819
+ __typename: "SuccessResponse",
820
+ data: folder
821
+ };
822
+ }
823
+
824
+ async node(_temp) {
825
+ let {
826
+ id,
827
+ deleted
828
+ } = _temp === void 0 ? {} : _temp;
829
+ const {
830
+ node
831
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
832
+ node: [{
833
+ deleted,
834
+ id
835
+ }, {
836
+ "...on ErrorAccessDenied": {
837
+ __typename: true,
838
+ message: true
839
+ },
840
+ "...on NodeResponse": {
841
+ __typename: true,
842
+ node: nodeFullSelector
843
+ }
844
+ }]
845
+ });
846
+
847
+ if (!node) {
848
+ return null;
849
+ }
850
+
851
+ if (node.__typename === "ErrorAccessDenied") {
852
+ return node;
853
+ }
854
+
855
+ if (!node.node) {
856
+ return null;
857
+ }
858
+
859
+ const result = await gqlNodeToExternalNodeFull(node.node, _classPrivateFieldLooseBase(this, _keys)[_keys]);
860
+ return {
861
+ __typename: "SuccessResponse",
862
+ data: result
863
+ };
864
+ }
865
+
866
+ async file(_ref12) {
867
+ let {
868
+ id
869
+ } = _ref12;
870
+ const {
871
+ file
872
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
873
+ file: [{
874
+ id
875
+ }, {
876
+ "...on ErrorAccessDenied": {
877
+ __typename: true,
878
+ message: true
879
+ },
880
+ "...on FileQueryResponse": {
881
+ __typename: true,
882
+ file: fileSelector
883
+ }
884
+ }]
885
+ });
886
+
887
+ if (!file) {
888
+ return null;
889
+ }
890
+
891
+ if (file.__typename === "ErrorAccessDenied") {
892
+ return file;
893
+ }
894
+
895
+ if (!file.file) {
896
+ return null;
897
+ }
898
+
899
+ const result = gqlFileToExternal(file.file, _classPrivateFieldLooseBase(this, _keys)[_keys]);
900
+ return {
901
+ __typename: "SuccessResponse",
902
+ data: result
903
+ };
904
+ }
905
+
906
+ async shareNode(_ref13) {
907
+ var _shareNodeFinish$shar;
908
+
909
+ let {
910
+ nodeId,
911
+ userId,
912
+ rights
913
+ } = _ref13;
914
+ const user = await _classPrivateFieldLooseBase(this, _client)[_client].user({
915
+ userId,
916
+ withPublicKey: true
917
+ });
918
+
919
+ if (!user) {
920
+ return user;
921
+ }
922
+
923
+ if (user.__typename === "ErrorNotFound") {
924
+ return user;
925
+ }
926
+
927
+ const {
928
+ shareNode
929
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
930
+ shareNode: [{
931
+ nodeId,
932
+ userId
933
+ }, {
934
+ "...on ErrorAccessDenied": {
935
+ __typename: true,
936
+ message: true
937
+ },
938
+ "...on ErrorNotFound": {
939
+ __typename: true,
940
+ message: true
941
+ },
942
+ "...on ShareNodeResponse": {
943
+ __typename: true,
944
+ nodes: true
945
+ }
946
+ }]
947
+ });
948
+
949
+ if (!shareNode) {
950
+ return null;
951
+ }
952
+
953
+ if (shareNode.__typename === "ErrorAccessDenied") {
954
+ return shareNode;
955
+ }
956
+
957
+ if (shareNode.__typename === "ErrorNotFound") {
958
+ return shareNode;
959
+ }
960
+
961
+ const shareNodes = {
962
+ nodes: []
963
+ };
964
+
965
+ for (const id of shareNode.nodes) {
966
+ const nameKey = await this.perNode(id, user.data.publicKey);
967
+
968
+ if (nameKey) {
969
+ shareNodes.nodes.push(nameKey);
970
+ }
971
+ }
972
+
973
+ const {
974
+ shareNodeFinish
975
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
976
+ shareNodeFinish: [{
977
+ rights,
978
+ userId,
979
+ shareNodes
980
+ }, {
981
+ "...on ErrorAccessDenied": {
982
+ __typename: true,
983
+ message: true
984
+ },
985
+ "...on ErrorNotFound": {
986
+ __typename: true,
987
+ message: true
988
+ },
989
+ "...on ShareNodeFinishResponse": {
990
+ __typename: true,
991
+ shareNodeFinish: true
992
+ }
993
+ }]
994
+ });
995
+
996
+ if (!shareNodeFinish) {
997
+ return null;
998
+ }
999
+
1000
+ if (shareNodeFinish.__typename === "ErrorAccessDenied") {
1001
+ return shareNodeFinish;
1002
+ }
1003
+
1004
+ if (shareNodeFinish.__typename === "ErrorNotFound") {
1005
+ return shareNodeFinish;
1006
+ }
1007
+
1008
+ return {
1009
+ __typename: "SuccessResponse",
1010
+ data: (_shareNodeFinish$shar = shareNodeFinish.shareNodeFinish) != null ? _shareNodeFinish$shar : false
1011
+ };
1012
+ }
1013
+
1014
+ async updateNode(_ref14) {
1015
+ var _node$access3, _node$access4;
1016
+
1017
+ let {
1018
+ nodeId,
1019
+ name,
1020
+ isFavorite,
1021
+ deletedAt
1022
+ } = _ref14;
1023
+ let node = nodesCache.get(nodeId);
1024
+
1025
+ if (!node) {
1026
+ await this.node({
1027
+ id: nodeId
1028
+ });
1029
+ node = nodesCache.get(nodeId);
1030
+
1031
+ if (!node) {
1032
+ throw "Can't find Node " + nodeId;
1033
+ }
1034
+ }
1035
+
1036
+ if (!((_node$access3 = node.access) != null && _node$access3.nameKey)) {
1037
+ throw new Error("Can't have access to node " + nodeId);
1038
+ }
1039
+
1040
+ name = name ? (_node$access4 = node.access) != null && _node$access4.nameKey ? await encryptName(name, node.access.nameKey) : name : null;
1041
+ const {
1042
+ updateNode
1043
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1044
+ updateNode: [{
1045
+ nodeId,
1046
+ name,
1047
+ isFavorite,
1048
+ deletedAt
1049
+ }, {
1050
+ "...on ErrorAccessDenied": {
1051
+ __typename: true,
1052
+ message: true
1053
+ },
1054
+ "...on ErrorNotExist": {
1055
+ __typename: true,
1056
+ message: true
1057
+ },
1058
+ "...on UpdateNodeResponse": {
1059
+ __typename: true,
1060
+ updateNode: nodeFullSelector
1061
+ }
1062
+ }]
1063
+ });
1064
+
1065
+ if (!updateNode) {
1066
+ return null;
1067
+ }
1068
+
1069
+ if (updateNode.__typename === "ErrorAccessDenied") {
1070
+ return updateNode;
1071
+ }
1072
+
1073
+ if (updateNode.__typename === "ErrorNotExist") {
1074
+ return updateNode;
1075
+ }
1076
+
1077
+ if (!updateNode.updateNode) {
1078
+ return null;
1079
+ }
1080
+
1081
+ const result = await gqlNodeToExternalNodeFull(updateNode.updateNode, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1082
+ return {
1083
+ __typename: "SuccessResponse",
1084
+ data: result
1085
+ };
1086
+ }
1087
+
1088
+ async fileContent(_ref15) {
1089
+ let {
1090
+ fileId,
1091
+ onDownloadProgress,
1092
+ progressDecrypt,
1093
+ signal
1094
+ } = _ref15;
1095
+ const {
1096
+ fileContent
1097
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
1098
+ scalars: {
1099
+ Bytes: {
1100
+ decode: e => {
1101
+ console.log(e, typeof e);
1102
+ return Uint8Array.from([1, 2, 3]);
1103
+ },
1104
+ encode: e => e.toString()
1105
+ }
1106
+ }
1107
+ })({
1108
+ fileContent: [{
1109
+ fileId
1110
+ }, {
1111
+ "...on ErrorAccessDenied": {
1112
+ __typename: true,
1113
+ message: true
1114
+ },
1115
+ "...on ErrorBasic": {
1116
+ __typename: true,
1117
+ message: true
1118
+ },
1119
+ "...on FileContentResponse": {
1120
+ __typename: true,
1121
+ file: {
1122
+ "...on FileContentCloud": {
1123
+ __typename: true,
1124
+ parts: {
1125
+ contentUrl: true,
1126
+ order: true,
1127
+ md5: true
1128
+ },
1129
+ key: true,
1130
+ publicKey: true,
1131
+ totalSize: true,
1132
+ md5: true,
1133
+ md5Encrypted: true
1134
+ },
1135
+ "...on FileContentLite": {
1136
+ __typename: true,
1137
+ content: true,
1138
+ id: true,
1139
+ key: true,
1140
+ publicKey: true,
1141
+ md5: true,
1142
+ md5Encrypted: true,
1143
+ totalSize: true
1144
+ },
1145
+ "...on FileContentReceivedMail": {
1146
+ __typename: true,
1147
+ maybeParts: {
1148
+ contentUrl: true,
1149
+ order: true,
1150
+ md5: true
1151
+ },
1152
+ maybeContent: true,
1153
+ key: true,
1154
+ senderPublicKey: true,
1155
+ totalSize: true,
1156
+ md5: true,
1157
+ md5Encrypted: true
1158
+ },
1159
+ "...on FileContentSentMail": {
1160
+ __typename: true,
1161
+ maybeParts: {
1162
+ contentUrl: true,
1163
+ order: true,
1164
+ md5: true
1165
+ },
1166
+ maybeContent: true,
1167
+ key: true,
1168
+ totalSize: true,
1169
+ md5: true,
1170
+ md5Encrypted: true
1171
+ }
1172
+ }
1173
+ }
1174
+ }]
1175
+ });
1176
+
1177
+ if (!fileContent) {
1178
+ return null;
1179
+ }
1180
+
1181
+ if (fileContent.__typename === "ErrorAccessDenied") {
1182
+ return fileContent;
1183
+ }
1184
+
1185
+ if (fileContent.__typename === "ErrorBasic") {
1186
+ return fileContent;
1187
+ }
1188
+
1189
+ const file = fileContent.file;
1190
+
1191
+ if (!file) {
1192
+ return null;
1193
+ }
1194
+
1195
+ const progressParts = {};
1196
+
1197
+ const onProgress = (part, progressEvent) => {
1198
+ progressParts[part] = progressEvent;
1199
+ const transferredBytes = Object.values(progressParts).reduce((prv, cur) => prv + cur.transferredBytes, 0);
1200
+ const totalBytes = Number(file.totalSize);
1201
+ onDownloadProgress == null ? void 0 : onDownloadProgress({
1202
+ percent: transferredBytes / totalBytes,
1203
+ totalBytes,
1204
+ transferredBytes
1205
+ });
1206
+ };
1207
+
1208
+ const encryptedContentFromParts = async fileParts => {
1209
+ const parts = new Array();
1210
+
1211
+ const byPart = async part => {
1212
+ const buf = new Uint8Array(await ky.get(part.contentUrl, {
1213
+ timeout: false,
1214
+ onDownloadProgress: pr => onProgress(part.order, pr),
1215
+ signal: signal
1216
+ }).arrayBuffer());
1217
+ const md5Part = await md5(buf);
1218
+
1219
+ if (md5Part !== part.md5) {
1220
+ throw new Error("Invalid md5 for part " + part.order + " of file " + fileId);
1221
+ }
1222
+
1223
+ parts.push({
1224
+ data: buf,
1225
+ order: part.order
1226
+ });
1227
+ };
1228
+
1229
+ await promiseAllLimit(3, fileParts.map(p => () => byPart(p)));
1230
+ return concatenate(...parts.sort((a, b) => a.order - b.order).map(p => p.data));
1231
+ };
1232
+
1233
+ const finalize = async encryptedContent => {
1234
+ // const md5Encrypted = await firstValueFrom(md5(of(encryptedContent)));
1235
+ const md5Encrypted = await md5(encryptedContent);
1236
+
1237
+ if (md5Encrypted !== file.md5Encrypted) {
1238
+ throw new Error("Encrypted content does not match");
1239
+ }
1240
+
1241
+ const key = decryptCryptoBox(sodium.from_hex(file.key), file.__typename === "FileContentReceivedMail" ? file.senderPublicKey : file.__typename === "FileContentCloud" ? file.publicKey : _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
1242
+ const src = await decrypt(key, encryptedContent, progressDecrypt, signal); // const md5Content = await firstValueFrom(md5(of(src)));
1243
+
1244
+ const md5Content = await md5(src);
1245
+
1246
+ if (md5Content !== file.md5) {
1247
+ throw new Error("Content does not match");
1248
+ }
1249
+
1250
+ return uncompress(src);
1251
+ };
1252
+
1253
+ const encryptedContent = file.__typename === "FileContentLite" ? file.content : file.__typename === "FileContentCloud" ? await encryptedContentFromParts(file.parts) : file.maybeContent ? file.maybeContent : file.maybeParts ? await encryptedContentFromParts(file.maybeParts) : null;
1254
+
1255
+ if (!encryptedContent) {
1256
+ return null;
1257
+ }
1258
+
1259
+ return {
1260
+ __typename: "SuccessResponse",
1261
+ data: await finalize(encryptedContent)
1262
+ };
1263
+ }
1264
+
1265
+ async deleteFile(_ref16) {
1266
+ let {
1267
+ fileId,
1268
+ nodeId
1269
+ } = _ref16;
1270
+ const {
1271
+ deleteFile
1272
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1273
+ deleteFile: [{
1274
+ fileId,
1275
+ nodeId
1276
+ }, {
1277
+ "...on ErrorAccessDenied": {
1278
+ __typename: true,
1279
+ message: true
1280
+ },
1281
+ "...on ErrorNotExist": {
1282
+ __typename: true,
1283
+ message: true
1284
+ },
1285
+ "...on DeleteFileResponse": {
1286
+ __typename: true,
1287
+ deleteFile: true
1288
+ }
1289
+ }]
1290
+ });
1291
+
1292
+ if (!deleteFile) {
1293
+ return null;
1294
+ }
1295
+
1296
+ if (deleteFile.__typename === "ErrorAccessDenied") {
1297
+ return deleteFile;
1298
+ }
1299
+
1300
+ if (deleteFile.__typename === "ErrorNotExist") {
1301
+ return deleteFile;
1302
+ }
1303
+
1304
+ return {
1305
+ __typename: "SuccessResponse",
1306
+ data: deleteFile.deleteFile
1307
+ };
1308
+ }
1309
+
1310
+ async deleteNode(_ref17) {
1311
+ let {
1312
+ nodeId
1313
+ } = _ref17;
1314
+ const {
1315
+ deleteNode
1316
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1317
+ deleteNode: [{
1318
+ id: nodeId
1319
+ }, {
1320
+ "...on ErrorAccessDenied": {
1321
+ __typename: true,
1322
+ message: true
1323
+ },
1324
+ "...on DeleteNodeResponse": {
1325
+ __typename: true,
1326
+ deleteNode: true
1327
+ }
1328
+ }]
1329
+ });
1330
+
1331
+ if (!deleteNode) {
1332
+ return null;
1333
+ }
1334
+
1335
+ if (deleteNode.__typename === "ErrorAccessDenied") {
1336
+ return deleteNode;
1337
+ }
1338
+
1339
+ return {
1340
+ __typename: "SuccessResponse",
1341
+ data: deleteNode.deleteNode
1342
+ };
1343
+ }
1344
+
1345
+ async emptyTrash() {
1346
+ const {
1347
+ emptyCloudTrash
1348
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1349
+ emptyCloudTrash: {
1350
+ "...on ErrorAccessDenied": {
1351
+ __typename: true,
1352
+ message: true
1353
+ },
1354
+ "...on EmptyCloudTrashResponse": {
1355
+ __typename: true,
1356
+ emptyCloudTrash: true
1357
+ }
1358
+ }
1359
+ });
1360
+
1361
+ if (!emptyCloudTrash) {
1362
+ return null;
1363
+ }
1364
+
1365
+ if (emptyCloudTrash.__typename === "ErrorAccessDenied") {
1366
+ return emptyCloudTrash;
1367
+ }
1368
+
1369
+ if (!emptyCloudTrash.emptyCloudTrash) {
1370
+ return null;
1371
+ }
1372
+
1373
+ return {
1374
+ __typename: "SuccessResponse",
1375
+ data: emptyCloudTrash.emptyCloudTrash
1376
+ };
1377
+ }
1378
+
1379
+ async recoverNode(id) {
1380
+ var _recoverNode$recoverN;
1381
+
1382
+ const {
1383
+ recoverNode
1384
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1385
+ recoverNode: [{
1386
+ id
1387
+ }, {
1388
+ "...on ErrorAccessDenied": {
1389
+ __typename: true,
1390
+ message: true
1391
+ },
1392
+ "...on ErrorNotExist": {
1393
+ __typename: true,
1394
+ message: true
1395
+ },
1396
+ "...on RecoverNodeResponse": {
1397
+ __typename: true,
1398
+ recoverNode: true
1399
+ }
1400
+ }]
1401
+ });
1402
+
1403
+ if (!recoverNode) {
1404
+ return null;
1405
+ }
1406
+
1407
+ if (recoverNode.__typename === "ErrorAccessDenied") {
1408
+ return recoverNode;
1409
+ }
1410
+
1411
+ if (recoverNode.__typename === "ErrorNotExist") {
1412
+ return recoverNode;
1413
+ }
1414
+
1415
+ return {
1416
+ __typename: "SuccessResponse",
1417
+ data: (_recoverNode$recoverN = recoverNode.recoverNode) != null ? _recoverNode$recoverN : false
1418
+ };
1419
+ }
1420
+
1421
+ async moveNodes(_ref18) {
1422
+ var _moveNodes$moveNodes;
1423
+
1424
+ let {
1425
+ nodeIds,
1426
+ parentNodeId
1427
+ } = _ref18;
1428
+ const {
1429
+ moveNodes
1430
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1431
+ moveNodes: [{
1432
+ nodeIds,
1433
+ parentNodeId
1434
+ }, {
1435
+ "...on ErrorAccessDenied": {
1436
+ __typename: true,
1437
+ message: true
1438
+ },
1439
+ "...on MoveNodesResponse": {
1440
+ __typename: true,
1441
+ moveNodes: true
1442
+ }
1443
+ }]
1444
+ });
1445
+
1446
+ if (!moveNodes) {
1447
+ return null;
1448
+ }
1449
+
1450
+ if (moveNodes.__typename === "ErrorAccessDenied") {
1451
+ return moveNodes;
1452
+ }
1453
+
1454
+ return {
1455
+ __typename: "SuccessResponse",
1456
+ data: (_moveNodes$moveNodes = moveNodes.moveNodes) != null ? _moveNodes$moveNodes : false
1457
+ };
1458
+ }
1459
+
1460
+ async saveInCloud(_ref19) {
1461
+ var _node$parent;
1462
+
1463
+ let {
1464
+ fileId,
1465
+ name,
1466
+ nodeId
1467
+ } = _ref19;
1468
+
1469
+ if (nodeId && !nodesCache.has(nodeId)) {
1470
+ await this.node({
1471
+ id: nodeId
1472
+ });
1473
+
1474
+ if (!nodesCache.has(nodeId)) {
1475
+ return {
1476
+ __typename: "ErrorBasic",
1477
+ message: "The node " + nodeId + " does not exists"
1478
+ };
1479
+ }
1480
+ }
1481
+
1482
+ let key = "";
1483
+ const file = filesCache.get(fileId);
1484
+
1485
+ if (!file) {
1486
+ var _filesCache$get;
1487
+
1488
+ await this.file({
1489
+ id: fileId
1490
+ });
1491
+ const file = (_filesCache$get = filesCache.get(fileId)) != null ? _filesCache$get : null;
1492
+
1493
+ if (!file) {
1494
+ const receivedMails = await _classPrivateFieldLooseBase(this, _client)[_client].mail.receivedMails();
1495
+
1496
+ if (!receivedMails) {
1497
+ return null;
1498
+ }
1499
+
1500
+ if (receivedMails.__typename !== "SuccessResponse") {
1501
+ return null;
1502
+ }
1503
+
1504
+ const mail = receivedMails.data.find(m => m.files.some(f => f.id === fileId));
1505
+
1506
+ if (!mail) {
1507
+ return {
1508
+ __typename: "ErrorBasic",
1509
+ message: "Can't find mail with the file " + fileId
1510
+ };
1511
+ }
1512
+
1513
+ const fileMail = mail.files.find(f => f.id === fileId);
1514
+
1515
+ if (!fileMail) {
1516
+ return {
1517
+ __typename: "ErrorBasic",
1518
+ message: "Can't find mail with the file " + fileId
1519
+ };
1520
+ }
1521
+
1522
+ const fileKey = decryptCryptoBox(sodium.from_hex(fileMail.key), mail.sender.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
1523
+ key = sodium.to_hex(fileKey);
1524
+ } else {
1525
+ key = file.key;
1526
+ }
1527
+ } else {
1528
+ key = file.key;
1529
+ }
1530
+
1531
+ if (key === "") {
1532
+ return {
1533
+ __typename: "ErrorBasic",
1534
+ message: "Unexpected error 3"
1535
+ };
1536
+ }
1537
+
1538
+ key = sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
1539
+ const nameKey = secretstreamKeygen();
1540
+ const encryptedName = await encryptName(name, sodium.to_hex(nameKey));
1541
+ const encryptedNameKey = sodium.to_hex(encryptCryptoBox(nameKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
1542
+ const {
1543
+ saveInCloud
1544
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1545
+ saveInCloud: [{
1546
+ fileId,
1547
+ key,
1548
+ nodeId,
1549
+ filename: encryptedName,
1550
+ nameKey: encryptedNameKey
1551
+ }, {
1552
+ "...on ErrorAccessDenied": {
1553
+ __typename: true,
1554
+ message: true
1555
+ },
1556
+ "...on ErrorNotFound": {
1557
+ __typename: true,
1558
+ message: true
1559
+ },
1560
+ "...on ErrorLimit": {
1561
+ __typename: true,
1562
+ message: true
1563
+ },
1564
+ "...on ErrorBasic": {
1565
+ __typename: true,
1566
+ message: true
1567
+ },
1568
+ "...on ErrorNotExist": {
1569
+ __typename: true,
1570
+ message: true
1571
+ },
1572
+ "...on SaveInCloudResponse": {
1573
+ __typename: true,
1574
+ saveInCloud: nodeFullSelector
1575
+ }
1576
+ }]
1577
+ });
1578
+
1579
+ if (!saveInCloud) {
1580
+ return null;
1581
+ }
1582
+
1583
+ if (saveInCloud.__typename === "ErrorAccessDenied") {
1584
+ return saveInCloud;
1585
+ }
1586
+
1587
+ if (saveInCloud.__typename === "ErrorNotFound") {
1588
+ return saveInCloud;
1589
+ }
1590
+
1591
+ if (saveInCloud.__typename === "ErrorLimit") {
1592
+ return saveInCloud;
1593
+ }
1594
+
1595
+ if (saveInCloud.__typename === "ErrorBasic") {
1596
+ return saveInCloud;
1597
+ }
1598
+
1599
+ if (saveInCloud.__typename === "ErrorNotExist") {
1600
+ return saveInCloud;
1601
+ }
1602
+
1603
+ if (!saveInCloud.saveInCloud) {
1604
+ return null;
1605
+ }
1606
+
1607
+ const node = await gqlNodeToExternalNodeFull(saveInCloud.saveInCloud, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1608
+ const me = (_node$parent = node.parent) == null ? void 0 : _node$parent.users.find(_ref20 => {
1609
+ let [u] = _ref20;
1610
+ return u.publicKey === _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
1611
+ });
1612
+
1613
+ if (me && ["admin", "write"].includes(me[1])) {
1614
+ var _node$parent$users$fi, _node$parent2;
1615
+
1616
+ const others = (_node$parent$users$fi = (_node$parent2 = node.parent) == null ? void 0 : _node$parent2.users.filter(_ref21 => {
1617
+ let [u] = _ref21;
1618
+ return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
1619
+ })) != null ? _node$parent$users$fi : [];
1620
+ await Promise.all(others.map(_ref22 => {
1621
+ let [u, rights] = _ref22;
1622
+ return this.shareNode({
1623
+ nodeId: node.id,
1624
+ rights,
1625
+ userId: u.id
1626
+ });
1627
+ }));
1628
+ }
1629
+
1630
+ return {
1631
+ __typename: "SuccessResponse",
1632
+ data: node
1633
+ };
1634
+ }
1635
+
1636
+ }
1637
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJheGlvcyIsImt5IiwiZW5jcnlwdE5hbWUiLCJub2Rlc0NhY2hlIiwiZmlsZXNDYWNoZSIsInNlY3JldHN0cmVhbUtleWdlbiIsImRlY3J5cHRDcnlwdG9Cb3giLCJlbmNyeXB0Q3J5cHRvQm94IiwiY29tcHJlc3MiLCJ1bmNvbXByZXNzIiwic29kaXVtIiwiZW51bWVyYXRlIiwiY2h1bmtzIiwicHJvbWlzZUFsbExpbWl0IiwiY29uY2F0ZW5hdGUiLCJtZDUiLCJkZWNyeXB0IiwiZW5jcnlwdCIsImdxbEZpbGVUb0V4dGVybmFsIiwiZ3FsTm9kZUZ1bGxUb0ludGVybmFsRnVsbCIsImdxbE5vZGVUb0V4dGVybmFsIiwiZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbCIsImludGVybmFsTm9kZVRvTm9kZSIsImZpbGVTZWxlY3RvciIsIm5vZGVGdWxsU2VsZWN0b3IiLCJub2RlU2VsZWN0b3IiLCJTZWNyZWN5Q2xvdWRDbGllbnQiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImtleXMiLCJ0aHVuZGVyIiwicGVyTm9kZSIsIm5vZGVJZCIsInB1YmxpY0tleSIsIm5vZGUiLCJnZXQiLCJpZCIsIm5hbWVLZXkiLCJhY2Nlc3MiLCJ0b19oZXgiLCJmcm9tX2hleCIsInByaXZhdGVLZXkiLCJmaWxlcyIsImhpc3RvcnkiLCJtYXAiLCJmIiwia2V5IiwiYWRkRmlsZVRvSGlzdG9yeSIsImZpbGVJZCIsIl9fdHlwZW5hbWUiLCJtZXNzYWdlIiwiZmlsZSIsImZpbmQiLCJ1c2VycyIsImZpbHRlciIsInUiLCJpbnB1dCIsInNoYXJlRmlsZUluSGlzdG9yeSIsInJlc3VsdCIsImRhdGEiLCJ1cGxvYWRGaWxlIiwiZW5jcnlwdFByb2dyZXNzIiwidXBsb2FkUHJvZ3Jlc3MiLCJzaWduYWwiLCJmaWxlS2V5IiwiZmlsZUJ1ZmZlciIsIkZpbGUiLCJVaW50OEFycmF5IiwiYXJyYXlCdWZmZXIiLCJjb21wcmVzc2VkIiwiZW5jcnlwdGVkRmlsZSIsIm1kNUZpbGUiLCJtZDVFbmNyeXB0ZWQiLCJlbmNyeXB0ZWRGaWxlS2V5Iiwic2NhbGFycyIsIkpzb24iLCJlbmNvZGUiLCJlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRlY29kZSIsInBhcnNlIiwiRGF0ZVRpbWUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJCaWdJbnQiLCJ0b1N0cmluZyIsImZpbGVTaXplIiwiYnl0ZUxlbmd0aCIsImZpbGVTaXplQmVmb3JlIiwiZmlsZVBhcnRTaXplIiwicGFydHMiLCJmaWVsZHMiLCJvcmRlciIsInVybCIsInRvdGFsIiwiY3VycmVudCIsInBlcmNlbnQiLCJsZW5ndGgiLCJ1cGxvYWRQYXJ0RW5kZWQiLCJ1cGxvYWRGaWxlUGFydEVuZCIsInVwbG9hZEVuZGVkIiwidXBsb2FkRmlsZUVuZCIsImNodW5rUGFydHMiLCJBcnJheSIsImluZGV4IiwiY2h1bmsiLCJOdW1iZXIiLCJwdXNoIiwicHJvZ3Jlc3NQYXJ0cyIsIm9uUHJvZ3Jlc3MiLCJwYXJ0IiwicHJvZ3Jlc3NFdmVudCIsIk9iamVjdCIsInZhbHVlcyIsInJlZHVjZSIsInBydiIsImN1ciIsImxvYWRlZCIsImJ5UGFydCIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJwIiwidmFsdWUiLCJlbnRyaWVzIiwiYXBwZW5kIiwiQmxvYiIsInBvc3QiLCJvblVwbG9hZFByb2dyZXNzIiwidXBsb2FkRmlsZUluQ2xvdWQiLCJuYW1lIiwic2F2ZUluQ2xvdWQiLCJkZWxldGVkTm9kZXMiLCJub2RlcyIsInNoYXJlZE5vZGVzIiwiZm9sZGVyIiwibm9kZXNTaGFyZWRXaXRoTWUiLCJ0eXBlIiwiZGVsZXRlTm9kZVNoYXJpbmciLCJ1c2VySWQiLCJkdXBsaWNhdGVOb2RlIiwiZm9sZGVySWQiLCJjdXN0b21OYW1lIiwiRXJyb3IiLCJkZWxldGVOb2RlQ2xvdWRUcmFzaCIsImlkcyIsImNyZWF0ZUZvbGRlciIsInBhcmVudEZvbGRlcklkIiwiZW5jcnlwdGVkTmFtZSIsImVuY3J5cHRlZEtleSIsInBhcmVudCIsIlByb21pc2UiLCJhbGwiLCJyaWdodHMiLCJzaGFyZU5vZGUiLCJkZWxldGVkIiwidXNlciIsIndpdGhQdWJsaWNLZXkiLCJzaGFyZU5vZGVzIiwic2hhcmVOb2RlRmluaXNoIiwidXBkYXRlTm9kZSIsImlzRmF2b3JpdGUiLCJkZWxldGVkQXQiLCJmaWxlQ29udGVudCIsIm9uRG93bmxvYWRQcm9ncmVzcyIsInByb2dyZXNzRGVjcnlwdCIsIkJ5dGVzIiwiY29uc29sZSIsImxvZyIsImZyb20iLCJjb250ZW50VXJsIiwidG90YWxTaXplIiwiY29udGVudCIsIm1heWJlUGFydHMiLCJtYXliZUNvbnRlbnQiLCJzZW5kZXJQdWJsaWNLZXkiLCJ0cmFuc2ZlcnJlZEJ5dGVzIiwidG90YWxCeXRlcyIsImVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMiLCJmaWxlUGFydHMiLCJidWYiLCJ0aW1lb3V0IiwicHIiLCJtZDVQYXJ0Iiwic29ydCIsImEiLCJiIiwiZmluYWxpemUiLCJlbmNyeXB0ZWRDb250ZW50Iiwic3JjIiwibWQ1Q29udGVudCIsImRlbGV0ZUZpbGUiLCJkZWxldGVOb2RlIiwiZW1wdHlUcmFzaCIsImVtcHR5Q2xvdWRUcmFzaCIsInJlY292ZXJOb2RlIiwibW92ZU5vZGVzIiwibm9kZUlkcyIsInBhcmVudE5vZGVJZCIsImhhcyIsInJlY2VpdmVkTWFpbHMiLCJtYWlsIiwibSIsInNvbWUiLCJmaWxlTWFpbCIsInNlbmRlciIsImVuY3J5cHRlZE5hbWVLZXkiLCJmaWxlbmFtZSIsIm1lIiwiaW5jbHVkZXMiLCJvdGhlcnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L1NlY3JlY3lDbG91ZENsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCBreSBmcm9tIFwia3lcIjtcbmltcG9ydCB0eXBlIHtcbiAgRG93bmxvYWRQcm9ncmVzcyxcbiAgUHJvZ3Jlc3NDYWxsYmFjayxcbiAgU2VjcmVjeUNsaWVudCxcbiAgU3VjY2Vzc1Jlc3BvbnNlXG59IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZW5jcnlwdE5hbWUgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IG5vZGVzQ2FjaGUsIGZpbGVzQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGUuanNcIjtcbmltcG9ydCB7IHNlY3JldHN0cmVhbUtleWdlbiB9IGZyb20gXCIuLi9jcnlwdG8vZmlsZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXlQYWlyIH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVjcnlwdENyeXB0b0JveCB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IGVuY3J5cHRDcnlwdG9Cb3ggfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEVycm9yQWNjZXNzRGVuaWVkLFxuICBFcnJvckJhc2ljLFxuICBFcnJvckxpbWl0LFxuICBFcnJvck5vdEV4aXN0LFxuICBFcnJvck5vdEZvdW5kXG59IGZyb20gXCIuLi9lcnJvci5qc1wiO1xuaW1wb3J0IHsgY29tcHJlc3MsIHVuY29tcHJlc3MgfSBmcm9tIFwiLi4vbWluaWZ5L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBzb2RpdW0gfSBmcm9tIFwiLi4vc29kaXVtLmpzXCI7XG5pbXBvcnQge1xuICBlbnVtZXJhdGUsXG4gIGNodW5rcyxcbiAgcHJvbWlzZUFsbExpbWl0LFxuICBjb25jYXRlbmF0ZVxufSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMuanNcIjtcbmltcG9ydCB7IG1kNSB9IGZyb20gXCIuLi93b3JrZXIvbWQ1LmpzXCI7XG5pbXBvcnQgeyBkZWNyeXB0LCBlbmNyeXB0IH0gZnJvbSBcIi4uL3dvcmtlci9zb2RpdW0uanNcIjtcbmltcG9ydCB0eXBlIHsgTm9kZVR5cGUsIFJpZ2h0cywgVGh1bmRlciB9IGZyb20gXCIuLi96ZXVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBncWxGaWxlVG9FeHRlcm5hbCB9IGZyb20gXCIuL2NvbnZlcnQvZmlsZS5qc1wiO1xuaW1wb3J0IHtcbiAgZ3FsTm9kZUZ1bGxUb0ludGVybmFsRnVsbCxcbiAgZ3FsTm9kZVRvRXh0ZXJuYWwsXG4gIGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwsXG4gIGludGVybmFsTm9kZVRvTm9kZVxufSBmcm9tIFwiLi9jb252ZXJ0L25vZGUuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmlsZUNvbnRlbnRQYXJ0LFxuICBGaWxlTWV0YWRhdGEsXG4gIEZpbGVQYXJ0UmVzcG9uc2UsXG4gIE5hbWVLZXlJbnB1dCxcbiAgTm9kZSxcbiAgTm9kZUZ1bGwsXG4gIFNoYXJlRmlsZUluSGlzdG9yeUlucHV0LFxuICBTaGFyZU5vZGVzSW5wdXRcbn0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7XG4gIGZpbGVTZWxlY3RvcixcbiAgbm9kZUZ1bGxTZWxlY3RvcixcbiAgbm9kZVNlbGVjdG9yXG59IGZyb20gXCIuL3R5cGVzL3NlbGVjdG9ycy5qc1wiO1xuLy8gaW1wb3J0IHsgbWQ1IH0gZnJvbSBcIi4uL3dvcmtlci9pbmRleC5qc1wiO1xuLy8gaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIG9mIH0gZnJvbSBcInJ4anNcIjtcblxuZXhwb3J0IGNsYXNzIFNlY3JlY3lDbG91ZENsaWVudCB7XG4gICNjbGllbnQ6IFNlY3JlY3lDbGllbnQ7XG5cbiAgI2tleXM6IEtleVBhaXI7XG5cbiAgI3RodW5kZXI6IFJldHVyblR5cGU8dHlwZW9mIFRodW5kZXI+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogU2VjcmVjeUNsaWVudCxcbiAgICBrZXlzOiBLZXlQYWlyLFxuICAgIHRodW5kZXI6IFJldHVyblR5cGU8dHlwZW9mIFRodW5kZXI+XG4gICkge1xuICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLiNrZXlzID0ga2V5cztcbiAgICB0aGlzLiN0aHVuZGVyID0gdGh1bmRlcjtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpbGVUb0hpc3Rvcnkoe1xuICAgIGZpbGVJZCxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgYWRkRmlsZVRvSGlzdG9yeSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGFkZEZpbGVUb0hpc3Rvcnk6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBBZGRGaWxlVG9IaXN0b3J5UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGFkZEZpbGVUb0hpc3Rvcnk6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghYWRkRmlsZVRvSGlzdG9yeSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGFkZEZpbGVUb0hpc3RvcnkuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gYWRkRmlsZVRvSGlzdG9yeTtcbiAgICB9XG5cbiAgICBpZiAoYWRkRmlsZVRvSGlzdG9yeS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGFkZEZpbGVUb0hpc3Rvcnk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IGF3YWl0IGdxbE5vZGVGdWxsVG9JbnRlcm5hbEZ1bGwoXG4gICAgICBhZGRGaWxlVG9IaXN0b3J5LmFkZEZpbGVUb0hpc3RvcnksXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcbiAgICBjb25zdCBmaWxlID0gbm9kZS5oaXN0b3J5LmZpbmQoZiA9PiBmLmlkID09PSBmaWxlSWQpO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCB1c2VycyA9IG5vZGUudXNlcnMuZmlsdGVyKFxuICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBpbnB1dDogU2hhcmVGaWxlSW5IaXN0b3J5SW5wdXQgPSB7XG4gICAgICAgIGZpbGVJZDogZmlsZS5pZCxcbiAgICAgICAgdXNlcnM6IHVzZXJzLm1hcCgoW3VdKSA9PiAoe1xuICAgICAgICAgIGlkOiB1LmlkLFxuICAgICAgICAgIGtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlLmtleSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH0pKVxuICAgICAgfTtcblxuICAgICAgYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgICAgc2hhcmVGaWxlSW5IaXN0b3J5OiBbXG4gICAgICAgICAgeyBpbnB1dCwgbm9kZUlkIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBTaGFyZUZpbGVJbkhpc3RvcnlSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIHNoYXJlRmlsZUluSGlzdG9yeTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGludGVybmFsTm9kZVRvTm9kZShub2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGxvYWRGaWxlKHtcbiAgICBmaWxlLFxuICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGU6IGdsb2JhbFRoaXMuRmlsZSB8IFVpbnQ4QXJyYXk7XG4gICAgZW5jcnlwdFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICB1cGxvYWRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU3VjY2Vzc1Jlc3BvbnNlPHN0cmluZz5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvckxpbWl0XG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IGZpbGVLZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBmaWxlQnVmZmVyID1cbiAgICAgIGZpbGUgaW5zdGFuY2VvZiBGaWxlID8gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpKSA6IGZpbGU7XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGNvbXByZXNzKGZpbGVCdWZmZXIpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZGF0YTogZW5jcnlwdGVkRmlsZSxcbiAgICAgIG1kNTogbWQ1RmlsZSxcbiAgICAgIG1kNUVuY3J5cHRlZFxuICAgIH0gPSBhd2FpdCBlbmNyeXB0KGZpbGVLZXksIGNvbXByZXNzZWQsIGVuY3J5cHRQcm9ncmVzcywgc2lnbmFsKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZEZpbGVLZXkgPSBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgZmlsZUtleSxcbiAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHsgdXBsb2FkRmlsZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgSnNvbjoge1xuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IEpTT04uc3RyaW5naWZ5KGUpLFxuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEpTT04ucGFyc2UoZSBhcyBzdHJpbmcpXG4gICAgICAgIH0sXG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfSxcbiAgICAgICAgQmlnSW50OiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gQmlnSW50KGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBiaWdpbnQpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVwbG9hZEZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVTaXplOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgZmlsZVNpemVCZWZvcmU6IGZpbGVCdWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KGVuY3J5cHRlZEZpbGVLZXkpLFxuICAgICAgICAgIG1kNUVuY3J5cHRlZCxcbiAgICAgICAgICBtZDU6IG1kNUZpbGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JMaW1pdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVwbG9hZEZpbGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXBsb2FkRmlsZToge1xuICAgICAgICAgICAgICBmaWxlSWQ6IHRydWUsXG4gICAgICAgICAgICAgIGZpbGVQYXJ0U2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgdXJsOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXBsb2FkRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwbG9hZEZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdXBsb2FkRmlsZTtcbiAgICB9XG5cbiAgICBpZiAodXBsb2FkRmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIHVwbG9hZEZpbGU7XG4gICAgfVxuXG4gICAgaWYgKHVwbG9hZEZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1cGxvYWRGaWxlO1xuICAgIH1cblxuICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB1cGxvYWRQcm9ncmVzcz8uKHtcbiAgICAgIHRvdGFsOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICBjdXJyZW50OiAwLFxuICAgICAgcGVyY2VudDogMFxuICAgIH0pO1xuXG4gICAgaWYgKHVwbG9hZEZpbGUudXBsb2FkRmlsZS5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBjdXJyZW50OiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgIHBlcmNlbnQ6IDFcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiB1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVwbG9hZFBhcnRFbmRlZCA9IGFzeW5jIChcbiAgICAgIG1kNTogc3RyaW5nLFxuICAgICAgb3JkZXI6IG51bWJlclxuICAgICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiA9PiB7XG4gICAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXBsb2FkRmlsZVBhcnRFbmQgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgIHVwbG9hZEZpbGVQYXJ0RW5kOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkLFxuICAgICAgICAgICAgbWQ1LFxuICAgICAgICAgICAgb3JkZXJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBVcGxvYWRGaWxlUGFydEVuZFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgdXBsb2FkRmlsZVBhcnRFbmQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXVwbG9hZEZpbGVQYXJ0RW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBsb2FkRmlsZVBhcnRFbmQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICAgIHJldHVybiB1cGxvYWRGaWxlUGFydEVuZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogdXBsb2FkRmlsZVBhcnRFbmQudXBsb2FkRmlsZVBhcnRFbmRcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IHVwbG9hZEVuZGVkID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICBTdWNjZXNzUmVzcG9uc2U8c3RyaW5nPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgICA+ID0+IHtcbiAgICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1cGxvYWRGaWxlRW5kIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgICB1cGxvYWRGaWxlRW5kOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIFVwbG9hZEZpbGVFbmRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIHVwbG9hZEZpbGVFbmQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXVwbG9hZEZpbGVFbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGxvYWRGaWxlRW5kLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgICByZXR1cm4gdXBsb2FkRmlsZUVuZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwbG9hZEZpbGVFbmQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgICAgcmV0dXJuIHVwbG9hZEZpbGVFbmQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBsb2FkRmlsZUVuZC51cGxvYWRGaWxlRW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiB1cGxvYWRGaWxlRW5kLnVwbG9hZEZpbGVFbmRcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGNodW5rUGFydHMgPSBuZXcgQXJyYXk8e1xuICAgICAgb3JkZXI6IG51bWJlcjtcbiAgICAgIGRhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICBtZDU6IHN0cmluZztcbiAgICB9PigpO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGNodW5rXSBvZiBlbnVtZXJhdGUoXG4gICAgICBjaHVua3MoZW5jcnlwdGVkRmlsZSwgTnVtYmVyKHVwbG9hZEZpbGUudXBsb2FkRmlsZS5maWxlUGFydFNpemUpKVxuICAgICkpIHtcbiAgICAgIGNodW5rUGFydHMucHVzaCh7XG4gICAgICAgIG9yZGVyOiBpbmRleCArIDEsXG4gICAgICAgIGRhdGE6IGNodW5rLFxuICAgICAgICBtZDU6IGF3YWl0IG1kNShjaHVuaylcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyZXNzUGFydHM6IFJlY29yZDxudW1iZXIsIFByb2dyZXNzRXZlbnQ+ID0ge307XG4gICAgY29uc3Qgb25Qcm9ncmVzcyA9IChwYXJ0OiBudW1iZXIsIHByb2dyZXNzRXZlbnQ6IFByb2dyZXNzRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIHByb2dyZXNzUGFydHNbcGFydF0gPSBwcm9ncmVzc0V2ZW50O1xuICAgICAgY29uc3QgY3VycmVudCA9IE9iamVjdC52YWx1ZXMocHJvZ3Jlc3NQYXJ0cykucmVkdWNlKFxuICAgICAgICAocHJ2LCBjdXIpID0+IHBydiArIGN1ci5sb2FkZWQsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICB1cGxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgcGVyY2VudDogY3VycmVudCAvIGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgICAgdG90YWw6IGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgICAgY3VycmVudFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGJ5UGFydCA9IGFzeW5jIChwYXJ0OiBGaWxlUGFydFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgY29uc3QgY2h1bmsgPSBjaHVua1BhcnRzLmZpbmQocCA9PiBwLm9yZGVyID09PSBwYXJ0Lm9yZGVyKTtcbiAgICAgIGlmICghY2h1bmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFydC5maWVsZHMpKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgXCJmaWxlXCIsXG4gICAgICAgIG5ldyBCbG9iKFtjaHVuay5kYXRhXSksXG4gICAgICAgIGAke3VwbG9hZEZpbGUudXBsb2FkRmlsZS5maWxlSWR9LSR7Y2h1bmsub3JkZXJ9YFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgYXhpb3MucG9zdChwYXJ0LnVybCwgZm9ybURhdGEsIHtcbiAgICAgICAgb25VcGxvYWRQcm9ncmVzczogcHJvZ3Jlc3NFdmVudCA9PlxuICAgICAgICAgIG9uUHJvZ3Jlc3MocGFydC5vcmRlciwgcHJvZ3Jlc3NFdmVudCksXG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHVwbG9hZFBhcnRFbmRlZChjaHVuay5tZDUsIGNodW5rLm9yZGVyKTtcbiAgICAgIC8vIGlmICgoZSBhcyBhbnkpLnJlc3BvbnNlLnN0YXR1cyA9PT0gMCkge1xuICAgICAgLy8gICAvLyBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMva3kvaXNzdWVzLzMwNVxuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgdGhyb3cgZTtcbiAgICAgIC8vIH1cbiAgICB9O1xuXG4gICAgaWYgKCF1cGxvYWRGaWxlLnVwbG9hZEZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VBbGxMaW1pdChcbiAgICAgIDMsXG4gICAgICB1cGxvYWRGaWxlLnVwbG9hZEZpbGUucGFydHMubWFwKHAgPT4gKCk6IFByb21pc2U8dm9pZD4gPT4gYnlQYXJ0KHApKVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGxvYWRFbmRlZCgpO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHQuZGF0YVxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGxvYWRGaWxlSW5DbG91ZCh7XG4gICAgZmlsZSxcbiAgICBuYW1lLFxuICAgIG5vZGVJZCxcbiAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgdXBsb2FkUHJvZ3Jlc3MsXG4gICAgc2lnbmFsXG4gIH06IHtcbiAgICBmaWxlOiBnbG9iYWxUaGlzLkZpbGUgfCBVaW50OEFycmF5O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub2RlSWQ/OiBzdHJpbmc7XG4gICAgZW5jcnlwdFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICB1cGxvYWRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yTGltaXRcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTm90RXhpc3RcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgZmlsZUlkID0gYXdhaXQgdGhpcy51cGxvYWRGaWxlKHtcbiAgICAgIGZpbGUsXG4gICAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChmaWxlSWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZmlsZUlkO1xuICAgIH1cblxuICAgIGlmIChmaWxlSWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiBmaWxlSWQ7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVJZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIGZpbGVJZDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNhdmVJbkNsb3VkKHtcbiAgICAgIGZpbGVJZDogZmlsZUlkLmRhdGEsXG4gICAgICBuYW1lLFxuICAgICAgbm9kZUlkXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JMaW1pdFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZWROb2RlcygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZGVsZXRlZE5vZGVzIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgZGVsZXRlZE5vZGVzOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIERlbGV0ZWROb2Rlc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIGRlbGV0ZWROb2Rlczogbm9kZVNlbGVjdG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlZE5vZGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlZE5vZGVzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZWROb2RlcztcbiAgICB9XG5cbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheTxOb2RlPigpO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGRlbGV0ZWROb2Rlcy5kZWxldGVkTm9kZXMpIHtcbiAgICAgIG5vZGVzLnB1c2goYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWwobm9kZSwgdGhpcy4ja2V5cykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbm9kZXNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2hhcmVkTm9kZXMoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZVtdPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHNoYXJlZE5vZGVzIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgc2hhcmVkTm9kZXM6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gU2hhcmVkTm9kZXNSZXNwb25zZVwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBzaGFyZWROb2Rlczogbm9kZVNlbGVjdG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghc2hhcmVkTm9kZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzaGFyZWROb2Rlcy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZWROb2RlcztcbiAgICB9XG5cbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheTxOb2RlPigpO1xuXG4gICAgZm9yIChjb25zdCBmb2xkZXIgb2Ygc2hhcmVkTm9kZXMuc2hhcmVkTm9kZXMpIHtcbiAgICAgIG5vZGVzLnB1c2goYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWwoZm9sZGVyLCB0aGlzLiNrZXlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBub2Rlc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBub2Rlc1NoYXJlZFdpdGhNZShcbiAgICB0eXBlPzogTm9kZVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPE5vZGVbXT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IG5vZGVzU2hhcmVkV2l0aE1lIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgbm9kZXNTaGFyZWRXaXRoTWU6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gTm9kZXNTaGFyZWRXaXRoTWVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbm9kZXNTaGFyZWRXaXRoTWU6IG5vZGVTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFub2Rlc1NoYXJlZFdpdGhNZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVzU2hhcmVkV2l0aE1lLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG5vZGVzU2hhcmVkV2l0aE1lO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5PE5vZGU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBub2Rlc1NoYXJlZFdpdGhNZS5ub2Rlc1NoYXJlZFdpdGhNZSkge1xuICAgICAgbm9kZXMucHVzaChhd2FpdCBncWxOb2RlVG9FeHRlcm5hbChmb2xkZXIsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU5vZGVTaGFyaW5nKHtcbiAgICBub2RlSWQsXG4gICAgdXNlcklkXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVOb2RlU2hhcmluZyB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGVTaGFyaW5nOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgdXNlcklkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZU5vZGVTaGFyaW5nUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU5vZGVTaGFyaW5nOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZU5vZGVTaGFyaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlTm9kZVNoYXJpbmcuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlTm9kZVNoYXJpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVOb2RlU2hhcmluZy5kZWxldGVOb2RlU2hhcmluZ1xuICAgIH07XG4gIH1cblxuICBhc3luYyBkdXBsaWNhdGVOb2RlKHtcbiAgICBub2RlSWQsXG4gICAgZm9sZGVySWQsXG4gICAgY3VzdG9tTmFtZVxuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgZm9sZGVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGN1c3RvbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gID4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgKCR7bm9kZUlkfSkgZG9lcyBub3QgZXhpc3RzYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbm9kZS5hY2Nlc3M/Lm5hbWVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgaGF2ZSBhY2Nlc3MgdG8gbm9kZSAke25vZGVJZH1gKTtcbiAgICB9XG4gICAgY3VzdG9tTmFtZSA9IGN1c3RvbU5hbWVcbiAgICAgID8gYXdhaXQgZW5jcnlwdE5hbWUoY3VzdG9tTmFtZSwgbm9kZS5hY2Nlc3MubmFtZUtleSlcbiAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHsgZHVwbGljYXRlTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGR1cGxpY2F0ZU5vZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBmb2xkZXJJZCxcbiAgICAgICAgICBjdXN0b21OYW1lXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRHVwbGljYXRlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkdXBsaWNhdGVOb2RlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWR1cGxpY2F0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkdXBsaWNhdGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGR1cGxpY2F0ZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKGR1cGxpY2F0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiBkdXBsaWNhdGVOb2RlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZHVwbGljYXRlTm9kZS5kdXBsaWNhdGVOb2RlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU5vZGVDbG91ZFRyYXNoKHtcbiAgICBpZHNcbiAgfToge1xuICAgIGlkczogQXJyYXk8c3RyaW5nPjtcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVOb2RlQ2xvdWRUcmFzaCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGVDbG91ZFRyYXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTm9kZUNsb3VkVHJhc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTm9kZUNsb3VkVHJhc2g6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlTm9kZUNsb3VkVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVOb2RlQ2xvdWRUcmFzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVOb2RlQ2xvdWRUcmFzaDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRlbGV0ZU5vZGVDbG91ZFRyYXNoLmRlbGV0ZU5vZGVDbG91ZFRyYXNoID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZvbGRlcih7XG4gICAgbmFtZSxcbiAgICBwYXJlbnRGb2xkZXJJZFxuICB9OiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHBhcmVudEZvbGRlcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3Qga2V5ID0gc2VjcmV0c3RyZWFtS2V5Z2VuKCk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZSA9IGF3YWl0IGVuY3J5cHROYW1lKG5hbWUsIHNvZGl1bS50b19oZXgoa2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkS2V5ID0gZW5jcnlwdENyeXB0b0JveChcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgKTtcbiAgICBjb25zdCB7IGNyZWF0ZUZvbGRlciB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGNyZWF0ZUZvbGRlcjogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogZW5jcnlwdGVkTmFtZSxcbiAgICAgICAgICBwYXJlbnRGb2xkZXJJZCxcbiAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoZW5jcnlwdGVkS2V5KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIENyZWF0ZUZvbGRlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGVGb2xkZXI6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIWNyZWF0ZUZvbGRlcikge1xuICAgICAgLy90aHJvdyBuZXcgRXJyb3IoYENhbid0IGNyZWF0ZSBmb2xkZXJgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVGb2xkZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRm9sZGVyO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVGb2xkZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGb2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKCFjcmVhdGVGb2xkZXIuY3JlYXRlRm9sZGVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgY3JlYXRlRm9sZGVyLmNyZWF0ZUZvbGRlcixcbiAgICAgIHRoaXMuI2tleXNcbiAgICApO1xuXG4gICAgY29uc3QgdXNlcnMgPVxuICAgICAgZm9sZGVyLnBhcmVudD8udXNlcnM/LmZpbHRlcihcbiAgICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgIT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgICApID8/IFtdO1xuXG4gICAgaWYgKHVzZXJzLmxlbmd0aCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHVzZXJzLm1hcCgoW3UsIHJpZ2h0c10pID0+XG4gICAgICAgICAgdGhpcy5zaGFyZU5vZGUoe1xuICAgICAgICAgICAgbm9kZUlkOiBmb2xkZXIuaWQsXG4gICAgICAgICAgICByaWdodHMsXG4gICAgICAgICAgICB1c2VySWQ6IHUuaWRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZm9sZGVyXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG5vZGUoe1xuICAgIGlkLFxuICAgIGRlbGV0ZWRcbiAgfToge1xuICAgIGlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBkZWxldGVkPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0gPSB7fSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcInF1ZXJ5XCIpKHtcbiAgICAgIG5vZGU6IFtcbiAgICAgICAgeyBkZWxldGVkLCBpZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG5vZGU6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChub2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGlmICghbm9kZS5ub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKG5vZGUubm9kZSwgdGhpcy4ja2V5cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmlsZSh7XG4gICAgaWRcbiAgfToge1xuICAgIGlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxGaWxlTWV0YWRhdGE+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgZmlsZTogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRmlsZVF1ZXJ5UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGZpbGU6IGZpbGVTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICBpZiAoIWZpbGUuZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gZ3FsRmlsZVRvRXh0ZXJuYWwoZmlsZS5maWxlLCB0aGlzLiNrZXlzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNoYXJlTm9kZSh7XG4gICAgbm9kZUlkLFxuICAgIHVzZXJJZCxcbiAgICByaWdodHNcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHJpZ2h0czogUmlnaHRzO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLiNjbGllbnQudXNlcih7IHVzZXJJZCwgd2l0aFB1YmxpY0tleTogdHJ1ZSB9KTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKHVzZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2hhcmVOb2RlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgc2hhcmVOb2RlOiBbXG4gICAgICAgIHsgbm9kZUlkLCB1c2VySWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBTaGFyZU5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbm9kZXM6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghc2hhcmVOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlTm9kZTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gc2hhcmVOb2RlO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJlTm9kZXM6IFNoYXJlTm9kZXNJbnB1dCA9IHtcbiAgICAgIG5vZGVzOiBbXVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGlkIG9mIHNoYXJlTm9kZS5ub2Rlcykge1xuICAgICAgY29uc3QgbmFtZUtleSA9IGF3YWl0IHRoaXMucGVyTm9kZShpZCwgdXNlci5kYXRhLnB1YmxpY0tleSk7XG4gICAgICBpZiAobmFtZUtleSkge1xuICAgICAgICBzaGFyZU5vZGVzLm5vZGVzLnB1c2gobmFtZUtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBzaGFyZU5vZGVGaW5pc2ggfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzaGFyZU5vZGVGaW5pc2g6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2hhcmVOb2Rlc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFNoYXJlTm9kZUZpbmlzaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzaGFyZU5vZGVGaW5pc2g6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghc2hhcmVOb2RlRmluaXNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmVOb2RlRmluaXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlTm9kZUZpbmlzaDtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmVOb2RlRmluaXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gc2hhcmVOb2RlRmluaXNoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogc2hhcmVOb2RlRmluaXNoLnNoYXJlTm9kZUZpbmlzaCA/PyBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGRhdGVOb2RlKHtcbiAgICBub2RlSWQsXG4gICAgbmFtZSxcbiAgICBpc0Zhdm9yaXRlLFxuICAgIGRlbGV0ZWRBdFxuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgaXNGYXZvcml0ZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGRlbGV0ZWRBdD86IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBsZXQgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBhd2FpdCB0aGlzLm5vZGUoeyBpZDogbm9kZUlkIH0pO1xuICAgICAgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgYENhbid0IGZpbmQgTm9kZSAke25vZGVJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbm9kZS5hY2Nlc3M/Lm5hbWVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgaGF2ZSBhY2Nlc3MgdG8gbm9kZSAke25vZGVJZH1gKTtcbiAgICB9XG5cbiAgICBuYW1lID0gbmFtZVxuICAgICAgPyBub2RlLmFjY2Vzcz8ubmFtZUtleVxuICAgICAgICA/IGF3YWl0IGVuY3J5cHROYW1lKG5hbWUsIG5vZGUuYWNjZXNzLm5hbWVLZXkpXG4gICAgICAgIDogbmFtZVxuICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgeyB1cGRhdGVOb2RlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgdXBkYXRlTm9kZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaXNGYXZvcml0ZSxcbiAgICAgICAgICBkZWxldGVkQXRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVcGRhdGVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVwZGF0ZU5vZGU6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXBkYXRlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdXBkYXRlTm9kZTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKCF1cGRhdGVOb2RlLnVwZGF0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwoXG4gICAgICB1cGRhdGVOb2RlLnVwZGF0ZU5vZGUsXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZpbGVDb250ZW50KHtcbiAgICBmaWxlSWQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIHByb2dyZXNzRGVjcnlwdCxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG9uRG93bmxvYWRQcm9ncmVzcz86IChwcm9ncmVzczogRG93bmxvYWRQcm9ncmVzcykgPT4gdm9pZDtcbiAgICBwcm9ncmVzc0RlY3J5cHQ/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8VWludDhBcnJheT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZmlsZUNvbnRlbnQgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEJ5dGVzOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSwgdHlwZW9mIGUpO1xuICAgICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShbMSwgMiwgM10pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgVWludDhBcnJheSkudG9TdHJpbmcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgZmlsZUNvbnRlbnQ6IFtcbiAgICAgICAgeyBmaWxlSWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBmaWxlOiB7XG4gICAgICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRDbG91ZFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJ0czoge1xuICAgICAgICAgICAgICAgICAgY29udGVudFVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG9yZGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbWQ1OiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgcHVibGljS2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1RW5jcnlwdGVkOiB0cnVlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRMaXRlXCI6IHtcbiAgICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAga2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1RW5jcnlwdGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50UmVjZWl2ZWRNYWlsXCI6IHtcbiAgICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1heWJlUGFydHM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1kNTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWF5YmVDb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZW5kZXJQdWJsaWNLZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgdG90YWxTaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDVFbmNyeXB0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudFNlbnRNYWlsXCI6IHtcbiAgICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1heWJlUGFydHM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1kNTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWF5YmVDb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWZpbGVDb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZmlsZUNvbnRlbnQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZmlsZUNvbnRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVDb250ZW50Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gZmlsZUNvbnRlbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZSA9IGZpbGVDb250ZW50LmZpbGU7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ncmVzc1BhcnRzOiBSZWNvcmQ8bnVtYmVyLCBEb3dubG9hZFByb2dyZXNzPiA9IHt9O1xuICAgIGNvbnN0IG9uUHJvZ3Jlc3MgPSAoXG4gICAgICBwYXJ0OiBudW1iZXIsXG4gICAgICBwcm9ncmVzc0V2ZW50OiBEb3dubG9hZFByb2dyZXNzXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBwcm9ncmVzc1BhcnRzW3BhcnRdID0gcHJvZ3Jlc3NFdmVudDtcbiAgICAgIGNvbnN0IHRyYW5zZmVycmVkQnl0ZXMgPSBPYmplY3QudmFsdWVzKHByb2dyZXNzUGFydHMpLnJlZHVjZShcbiAgICAgICAgKHBydiwgY3VyKSA9PiBwcnYgKyBjdXIudHJhbnNmZXJyZWRCeXRlcyxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRvdGFsQnl0ZXMgPSBOdW1iZXIoZmlsZS50b3RhbFNpemUpO1xuICAgICAgb25Eb3dubG9hZFByb2dyZXNzPy4oe1xuICAgICAgICBwZXJjZW50OiB0cmFuc2ZlcnJlZEJ5dGVzIC8gdG90YWxCeXRlcyxcbiAgICAgICAgdG90YWxCeXRlcyxcbiAgICAgICAgdHJhbnNmZXJyZWRCeXRlc1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMgPSBhc3luYyAoXG4gICAgICBmaWxlUGFydHM6IEZpbGVDb250ZW50UGFydFtdXG4gICAgKTogUHJvbWlzZTxVaW50OEFycmF5PiA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IG5ldyBBcnJheTx7IGRhdGE6IFVpbnQ4QXJyYXk7IG9yZGVyOiBudW1iZXIgfT4oKTtcblxuICAgICAgY29uc3QgYnlQYXJ0ID0gYXN5bmMgKHBhcnQ6IEZpbGVDb250ZW50UGFydCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgICBhd2FpdCBreVxuICAgICAgICAgICAgLmdldChwYXJ0LmNvbnRlbnRVcmwsIHtcbiAgICAgICAgICAgICAgdGltZW91dDogZmFsc2UsXG4gICAgICAgICAgICAgIG9uRG93bmxvYWRQcm9ncmVzczogcHIgPT4gb25Qcm9ncmVzcyhwYXJ0Lm9yZGVyLCBwciksXG4gICAgICAgICAgICAgIHNpZ25hbDogc2lnbmFsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFycmF5QnVmZmVyKClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbWQ1UGFydCA9IGF3YWl0IG1kNShidWYpO1xuICAgICAgICBpZiAobWQ1UGFydCAhPT0gcGFydC5tZDUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBtZDUgZm9yIHBhcnQgJHtwYXJ0Lm9yZGVyfSBvZiBmaWxlICR7ZmlsZUlkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgIGRhdGE6IGJ1ZixcbiAgICAgICAgICBvcmRlcjogcGFydC5vcmRlclxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHByb21pc2VBbGxMaW1pdChcbiAgICAgICAgMyxcbiAgICAgICAgZmlsZVBhcnRzLm1hcChwID0+ICgpOiBQcm9taXNlPHZvaWQ+ID0+IGJ5UGFydChwKSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBjb25jYXRlbmF0ZShcbiAgICAgICAgLi4ucGFydHMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpLm1hcChwID0+IHAuZGF0YSlcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IGZpbmFsaXplID0gYXN5bmMgKFxuICAgICAgZW5jcnlwdGVkQ29udGVudDogVWludDhBcnJheVxuICAgICk6IFByb21pc2U8VWludDhBcnJheT4gPT4ge1xuICAgICAgLy8gY29uc3QgbWQ1RW5jcnlwdGVkID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWQ1KG9mKGVuY3J5cHRlZENvbnRlbnQpKSk7XG4gICAgICBjb25zdCBtZDVFbmNyeXB0ZWQgPSBhd2FpdCBtZDUoZW5jcnlwdGVkQ29udGVudCk7XG5cbiAgICAgIGlmIChtZDVFbmNyeXB0ZWQgIT09IGZpbGUubWQ1RW5jcnlwdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRW5jcnlwdGVkIGNvbnRlbnQgZG9lcyBub3QgbWF0Y2hgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gZGVjcnlwdENyeXB0b0JveChcbiAgICAgICAgc29kaXVtLmZyb21faGV4KGZpbGUua2V5KSxcbiAgICAgICAgZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50UmVjZWl2ZWRNYWlsXCJcbiAgICAgICAgICA/IGZpbGUuc2VuZGVyUHVibGljS2V5XG4gICAgICAgICAgOiBmaWxlLl9fdHlwZW5hbWUgPT09IFwiRmlsZUNvbnRlbnRDbG91ZFwiXG4gICAgICAgICAgPyBmaWxlLnB1YmxpY0tleVxuICAgICAgICAgIDogdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3JjID0gYXdhaXQgZGVjcnlwdChrZXksIGVuY3J5cHRlZENvbnRlbnQsIHByb2dyZXNzRGVjcnlwdCwgc2lnbmFsKTtcblxuICAgICAgLy8gY29uc3QgbWQ1Q29udGVudCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1kNShvZihzcmMpKSk7XG4gICAgICBjb25zdCBtZDVDb250ZW50ID0gYXdhaXQgbWQ1KHNyYyk7XG5cbiAgICAgIGlmIChtZDVDb250ZW50ICE9PSBmaWxlLm1kNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnRlbnQgZG9lcyBub3QgbWF0Y2hgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuY29tcHJlc3Moc3JjKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZW5jcnlwdGVkQ29udGVudCA9XG4gICAgICBmaWxlLl9fdHlwZW5hbWUgPT09IFwiRmlsZUNvbnRlbnRMaXRlXCJcbiAgICAgICAgPyBmaWxlLmNvbnRlbnRcbiAgICAgICAgOiBmaWxlLl9fdHlwZW5hbWUgPT09IFwiRmlsZUNvbnRlbnRDbG91ZFwiXG4gICAgICAgID8gYXdhaXQgZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyhmaWxlLnBhcnRzKVxuICAgICAgICA6IGZpbGUubWF5YmVDb250ZW50XG4gICAgICAgID8gZmlsZS5tYXliZUNvbnRlbnRcbiAgICAgICAgOiBmaWxlLm1heWJlUGFydHNcbiAgICAgICAgPyBhd2FpdCBlbmNyeXB0ZWRDb250ZW50RnJvbVBhcnRzKGZpbGUubWF5YmVQYXJ0cylcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKCFlbmNyeXB0ZWRDb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGF3YWl0IGZpbmFsaXplKGVuY3J5cHRlZENvbnRlbnQpXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZpbGUoe1xuICAgIGZpbGVJZCxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZGVsZXRlRmlsZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZUZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVGaWxlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZUZpbGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZUZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlRmlsZTtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlRmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZUZpbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVGaWxlLmRlbGV0ZUZpbGVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTm9kZSh7XG4gICAgbm9kZUlkXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVOb2RlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTm9kZTogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IG5vZGVJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU5vZGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlTm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRlbGV0ZU5vZGUuZGVsZXRlTm9kZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBlbXB0eVRyYXNoKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZW1wdHlDbG91ZFRyYXNoIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZW1wdHlDbG91ZFRyYXNoOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIEVtcHR5Q2xvdWRUcmFzaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIGVtcHR5Q2xvdWRUcmFzaDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWVtcHR5Q2xvdWRUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVtcHR5Q2xvdWRUcmFzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBlbXB0eUNsb3VkVHJhc2g7XG4gICAgfVxuXG4gICAgaWYgKCFlbXB0eUNsb3VkVHJhc2guZW1wdHlDbG91ZFRyYXNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGVtcHR5Q2xvdWRUcmFzaC5lbXB0eUNsb3VkVHJhc2hcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVjb3Zlck5vZGUoXG4gICAgaWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyByZWNvdmVyTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIHJlY292ZXJOb2RlOiBbXG4gICAgICAgIHsgaWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBSZWNvdmVyTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICByZWNvdmVyTm9kZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZWNvdmVyTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlY292ZXJOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHJlY292ZXJOb2RlO1xuICAgIH1cblxuICAgIGlmIChyZWNvdmVyTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIHJlY292ZXJOb2RlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVjb3Zlck5vZGUucmVjb3Zlck5vZGUgPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbW92ZU5vZGVzKHtcbiAgICBub2RlSWRzLFxuICAgIHBhcmVudE5vZGVJZFxuICB9OiB7XG4gICAgbm9kZUlkczogc3RyaW5nW107XG4gICAgcGFyZW50Tm9kZUlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBtb3ZlTm9kZXMgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBtb3ZlTm9kZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICAgcGFyZW50Tm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIE1vdmVOb2Rlc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtb3ZlTm9kZXM6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghbW92ZU5vZGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobW92ZU5vZGVzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG1vdmVOb2RlcztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG1vdmVOb2Rlcy5tb3ZlTm9kZXMgPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2F2ZUluQ2xvdWQoe1xuICAgIGZpbGVJZCxcbiAgICBuYW1lLFxuICAgIG5vZGVJZFxuICB9OiB7XG4gICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG5vZGVJZD86IHN0cmluZztcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+XG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JCYXNpY1xuICAgIHwgRXJyb3JMaW1pdFxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgRXJyb3JOb3RFeGlzdFxuICAgIHwgbnVsbFxuICA+IHtcbiAgICBpZiAobm9kZUlkICYmICFub2Rlc0NhY2hlLmhhcyhub2RlSWQpKSB7XG4gICAgICBhd2FpdCB0aGlzLm5vZGUoeyBpZDogbm9kZUlkIH0pO1xuICAgICAgaWYgKCFub2Rlc0NhY2hlLmhhcyhub2RlSWQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX190eXBlbmFtZTogXCJFcnJvckJhc2ljXCIsXG4gICAgICAgICAgbWVzc2FnZTogYFRoZSBub2RlICR7bm9kZUlkfSBkb2VzIG5vdCBleGlzdHNgXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGtleSA9IFwiXCI7XG5cbiAgICBjb25zdCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZmlsZUlkKTtcblxuICAgIGlmICghZmlsZSkge1xuICAgICAgYXdhaXQgdGhpcy5maWxlKHsgaWQ6IGZpbGVJZCB9KTtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc0NhY2hlLmdldChmaWxlSWQpID8/IG51bGw7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRNYWlscyA9IGF3YWl0IHRoaXMuI2NsaWVudC5tYWlsLnJlY2VpdmVkTWFpbHMoKTtcbiAgICAgICAgaWYgKCFyZWNlaXZlZE1haWxzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY2VpdmVkTWFpbHMuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1haWwgPSByZWNlaXZlZE1haWxzLmRhdGEuZmluZChtID0+XG4gICAgICAgICAgbS5maWxlcy5zb21lKGYgPT4gZi5pZCA9PT0gZmlsZUlkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghbWFpbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiBcIkVycm9yQmFzaWNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW4ndCBmaW5kIG1haWwgd2l0aCB0aGUgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVNYWlsID0gbWFpbC5maWxlcy5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcblxuICAgICAgICBpZiAoIWZpbGVNYWlsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogYENhbid0IGZpbmQgbWFpbCB3aXRoIHRoZSBmaWxlICR7ZmlsZUlkfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21faGV4KGZpbGVNYWlsLmtleSksXG4gICAgICAgICAgbWFpbC5zZW5kZXIucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApO1xuXG4gICAgICAgIGtleSA9IHNvZGl1bS50b19oZXgoZmlsZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkgPSBmaWxlLmtleTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gZmlsZS5rZXk7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJFcnJvckJhc2ljXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiVW5leHBlY3RlZCBlcnJvciAzXCJcbiAgICAgIH07XG4gICAgfVxuXG4gICAga2V5ID0gc29kaXVtLnRvX2hleChcbiAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWVLZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChuYW1lS2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZUtleSA9IHNvZGl1bS50b19oZXgoXG4gICAgICBlbmNyeXB0Q3J5cHRvQm94KG5hbWVLZXksIHRoaXMuI2tleXMucHVibGljS2V5LCB0aGlzLiNrZXlzLnByaXZhdGVLZXkpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2F2ZUluQ2xvdWQgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzYXZlSW5DbG91ZDogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgZmlsZW5hbWU6IGVuY3J5cHRlZE5hbWUsXG4gICAgICAgICAgbmFtZUtleTogZW5jcnlwdGVkTmFtZUtleVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTGltaXRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFNhdmVJbkNsb3VkUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHNhdmVJbkNsb3VkOiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNhdmVJbkNsb3VkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gc2F2ZUluQ2xvdWQ7XG4gICAgfVxuXG4gICAgaWYgKHNhdmVJbkNsb3VkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gc2F2ZUluQ2xvdWQ7XG4gICAgfVxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmICghc2F2ZUluQ2xvdWQuc2F2ZUluQ2xvdWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgc2F2ZUluQ2xvdWQuc2F2ZUluQ2xvdWQsXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcblxuICAgIGNvbnN0IG1lID0gbm9kZS5wYXJlbnQ/LnVzZXJzLmZpbmQoXG4gICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSA9PT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICApO1xuXG4gICAgaWYgKG1lICYmIFtcImFkbWluXCIsIFwid3JpdGVcIl0uaW5jbHVkZXMobWVbMV0pKSB7XG4gICAgICBjb25zdCBvdGhlcnMgPVxuICAgICAgICBub2RlLnBhcmVudD8udXNlcnMuZmlsdGVyKFxuICAgICAgICAgIChbdV0pID0+IHUucHVibGljS2V5ICE9PSB0aGlzLiNrZXlzLnB1YmxpY0tleVxuICAgICAgICApID8/IFtdO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3RoZXJzLm1hcCgoW3UsIHJpZ2h0c10pID0+XG4gICAgICAgICAgdGhpcy5zaGFyZU5vZGUoe1xuICAgICAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgcmlnaHRzLFxuICAgICAgICAgICAgdXNlcklkOiB1LmlkXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwZXJOb2RlID0gYXN5bmMgKFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIHB1YmxpY0tleTogc3RyaW5nXG4gICk6IFByb21pc2U8TmFtZUtleUlucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZUtleSA9IG5vZGUuYWNjZXNzPy5uYW1lS2V5O1xuXG4gICAgaWYgKCFuYW1lS2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICBuYW1lS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChuYW1lS2V5KSxcbiAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczpcbiAgICAgICAgXCJoaXN0b3J5XCIgaW4gbm9kZVxuICAgICAgICAgID8gbm9kZS5oaXN0b3J5Lm1hcChmID0+ICh7XG4gICAgICAgICAgICAgIGlkOiBmLmlkLFxuICAgICAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmLmtleSksXG4gICAgICAgICAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIDogW11cbiAgICB9O1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBLE9BQU9BLEtBQVAsTUFBa0IsT0FBbEI7QUFDQSxPQUFPQyxFQUFQLE1BQWUs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