@secrecy/lib 1.0.0-dev.64 → 1.0.0-dev.65

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