@secrecy/lib 1.0.0-dev.8 → 1.0.0-dev.81

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 (127) hide show
  1. package/README.md +1 -1
  2. package/dist/BaseClient.d.ts +104 -0
  3. package/dist/BaseClient.js +430 -0
  4. package/{lib → dist}/PopupTools.d.ts +1 -1
  5. package/dist/PopupTools.js +196 -0
  6. package/{lib → dist}/ZeusThunder.d.ts +0 -0
  7. package/dist/ZeusThunder.js +65 -0
  8. package/dist/cache.d.ts +6 -0
  9. package/dist/cache.js +4 -0
  10. package/dist/client/SecrecyAppClient.d.ts +17 -0
  11. package/dist/client/SecrecyAppClient.js +227 -0
  12. package/dist/client/SecrecyCloudClient.d.ts +89 -0
  13. package/dist/client/SecrecyCloudClient.js +1411 -0
  14. package/dist/client/SecrecyDbClient.d.ts +21 -0
  15. package/dist/client/SecrecyDbClient.js +177 -0
  16. package/dist/client/SecrecyMailClient.d.ts +42 -0
  17. package/dist/client/SecrecyMailClient.js +1022 -0
  18. package/dist/client/SecrecyPayClient.d.ts +28 -0
  19. package/dist/client/SecrecyPayClient.js +68 -0
  20. package/dist/client/SecrecyWalletClient.d.ts +30 -0
  21. package/dist/client/SecrecyWalletClient.js +73 -0
  22. package/{lib → dist}/client/convert/file.d.ts +3 -3
  23. package/dist/client/convert/file.js +33 -0
  24. package/dist/client/convert/mail.d.ts +3 -0
  25. package/dist/client/convert/mail.js +43 -0
  26. package/dist/client/convert/node.d.ts +9 -0
  27. package/dist/client/convert/node.js +88 -0
  28. package/{lib → dist}/client/helpers.d.ts +6 -1
  29. package/dist/client/helpers.js +119 -0
  30. package/dist/client/index.d.ts +34 -0
  31. package/dist/client/index.js +46 -0
  32. package/{lib → dist}/client/storage.d.ts +0 -0
  33. package/dist/client/storage.js +12 -0
  34. package/dist/client/types/File.d.ts +14 -0
  35. package/dist/client/types/File.js +3 -0
  36. package/{lib → dist}/client/types/Inputs.d.ts +2 -7
  37. package/dist/client/types/Inputs.js +3 -0
  38. package/dist/client/types/Node.d.ts +56 -0
  39. package/dist/client/types/Node.js +3 -0
  40. package/{lib → dist}/client/types/UserAppNotifications.d.ts +1 -1
  41. package/dist/client/types/UserAppNotifications.js +3 -0
  42. package/{lib → dist}/client/types/UserAppSettings.d.ts +1 -3
  43. package/dist/client/types/UserAppSettings.js +3 -0
  44. package/{lib → dist}/client/types/index.d.ts +9 -43
  45. package/dist/client/types/index.js +8 -0
  46. package/dist/client/types/selectors.d.ts +400 -0
  47. package/dist/client/types/selectors.js +135 -0
  48. package/{lib → dist}/crypto/file.d.ts +0 -0
  49. package/dist/crypto/file.js +195 -0
  50. package/{lib → dist}/crypto/index.d.ts +0 -0
  51. package/dist/crypto/index.js +45 -0
  52. package/dist/error.d.ts +33 -0
  53. package/dist/error.js +3 -0
  54. package/dist/index.d.ts +14 -0
  55. package/dist/index.js +10 -0
  56. package/{lib → dist}/minify/index.d.ts +0 -0
  57. package/dist/minify/index.js +23 -0
  58. package/{lib → dist}/minify/lz4.d.ts +0 -0
  59. package/dist/minify/lz4.js +539 -0
  60. package/{lib → dist}/sodium.d.ts +0 -0
  61. package/dist/sodium.js +6 -0
  62. package/{lib → dist}/utils/store-buddy.d.ts +0 -0
  63. package/dist/utils/store-buddy.js +58 -0
  64. package/{lib → dist}/utils/time.d.ts +0 -0
  65. package/dist/utils/time.js +12 -0
  66. package/{lib → dist/utils}/utils.d.ts +0 -0
  67. package/dist/utils/utils.js +47 -0
  68. package/{lib → dist}/worker/md5.d.ts +0 -0
  69. package/dist/worker/md5.js +24 -0
  70. package/{lib → dist}/worker/sodium.d.ts +0 -0
  71. package/dist/worker/sodium.js +118 -0
  72. package/{lib → dist}/worker/workerCodes.d.ts +0 -0
  73. package/dist/worker/workerCodes.js +255 -0
  74. package/{lib → dist}/zeus/const.d.ts +5 -0
  75. package/dist/zeus/const.js +1670 -0
  76. package/dist/zeus/index.d.ts +7896 -0
  77. package/dist/zeus/index.js +602 -0
  78. package/package.json +64 -54
  79. package/lib/BaseClient.d.ts +0 -266
  80. package/lib/BaseClient.js +0 -1332
  81. package/lib/PopupTools.js +0 -213
  82. package/lib/ZeusThunder.js +0 -112
  83. package/lib/cache.d.ts +0 -7
  84. package/lib/cache.js +0 -5
  85. package/lib/client/convert/file.js +0 -39
  86. package/lib/client/convert/folder.d.ts +0 -8
  87. package/lib/client/convert/folder.js +0 -264
  88. package/lib/client/convert/mail.d.ts +0 -3
  89. package/lib/client/convert/mail.js +0 -46
  90. package/lib/client/convert/vFile.d.ts +0 -5
  91. package/lib/client/convert/vFile.js +0 -164
  92. package/lib/client/helpers.js +0 -116
  93. package/lib/client/index.d.ts +0 -168
  94. package/lib/client/index.js +0 -3795
  95. package/lib/client/storage.js +0 -12
  96. package/lib/client/types/File.d.ts +0 -21
  97. package/lib/client/types/File.js +0 -2
  98. package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
  99. package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
  100. package/lib/client/types/Folder.d.ts +0 -68
  101. package/lib/client/types/Folder.js +0 -7
  102. package/lib/client/types/Inputs.js +0 -2
  103. package/lib/client/types/UserAppNotifications.js +0 -2
  104. package/lib/client/types/UserAppSettings.js +0 -2
  105. package/lib/client/types/VFile.d.ts +0 -62
  106. package/lib/client/types/VFile.js +0 -4
  107. package/lib/client/types/index.js +0 -9
  108. package/lib/client/types/queries.d.ts +0 -535
  109. package/lib/client/types/queries.js +0 -192
  110. package/lib/crypto/file.js +0 -291
  111. package/lib/crypto/index.js +0 -37
  112. package/lib/index.d.ts +0 -11
  113. package/lib/index.js +0 -40
  114. package/lib/minify/index.js +0 -28
  115. package/lib/minify/lz4.js +0 -633
  116. package/lib/sodium.js +0 -28
  117. package/lib/utils/store-buddy.js +0 -69
  118. package/lib/utils/time.js +0 -22
  119. package/lib/utils.js +0 -188
  120. package/lib/worker/__mock__/sodium.worker.d.ts +0 -19
  121. package/lib/worker/__mock__/sodium.worker.js +0 -57
  122. package/lib/worker/md5.js +0 -43
  123. package/lib/worker/sodium.js +0 -155
  124. package/lib/worker/workerCodes.js +0 -3
  125. package/lib/zeus/const.js +0 -1644
  126. package/lib/zeus/index.d.ts +0 -26279
  127. package/lib/zeus/index.js +0 -552
@@ -0,0 +1,539 @@
1
+ // lz4-ts @license BSD-3-Clause / Copyright (c) 2015, Pierre Curto / 2016, oov. All rights reserved.
2
+ /**
3
+ * Copyright (c) 2015, Pierre Curto
4
+ * Copyright (c) 2016, oov
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright notice, this
11
+ * list of conditions and the following disclaimer.
12
+ *
13
+ * * Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * * Neither the name of xxHash nor the names of its
18
+ * contributors may be used to endorse or promote products derived from
19
+ * this software without specific prior written permission.
20
+ *
21
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ */
32
+
33
+ const errInvalidSource = new Error("invalid source");
34
+ const errShortBuffer = new Error("short buffer");
35
+
36
+ // The following constants are used to setup the compression algorithm.
37
+ const minMatch = 4; // the minimum size of the match sequence size (4 bytes)
38
+ const winSizeLog = 16; // LZ4 64Kb window size limit
39
+ const winSize = 1 << winSizeLog;
40
+ const winMask = winSize - 1; // 64Kb window of previous data for dependent blocks
41
+
42
+ // hashSizeLog determines the size of the hash table used to quickly find a previous match position.
43
+ // Its value influences the compression speed and memory usage, the lower the faster,
44
+ // but at the expense of the compression ratio.
45
+ // 16 seems to be the best compromise.
46
+ const hashSizeLog = 16;
47
+ const hashSize = 1 << hashSizeLog;
48
+ const hashShift = minMatch * 8 - hashSizeLog;
49
+ const mfLimit = 8 + minMatch; // The last match cannot start within the last 12 bytes.
50
+ const skipStrength = 6; // variable step for fast scan
51
+
52
+ const hasher = 2654435761 | 0; // prime number used to hash minMatch
53
+
54
+ // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/imul#Polyfill
55
+ function imulPolyfill(a, b) {
56
+ const ah = a >>> 16 & 0xffff;
57
+ const al = a & 0xffff;
58
+ const bh = b >>> 16 & 0xffff;
59
+ const bl = b & 0xffff;
60
+ // the shift by 0 fixes the sign on the high part
61
+ // the final |0 converts the unsigned value into a signed value
62
+ return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0;
63
+ }
64
+ const imul = Math.imul ? Math.imul : imulPolyfill;
65
+ function getUint32(a, i) {
66
+ return a[i + 3] | a[i + 2] << 8 | a[i + 1] << 16 | a[i] << 24;
67
+ }
68
+ function copy(dest, src, di, si, len) {
69
+ for (let i = 0; i < len; ++i) {
70
+ dest[di++] = src[si++];
71
+ }
72
+ }
73
+ export function calcUncompressedLen(src) {
74
+ const sn = src.length;
75
+ if (sn === 0) {
76
+ return 0;
77
+ }
78
+ let si = 0;
79
+ let di = 0;
80
+ while (true) {
81
+ // literals and match lengths (token)
82
+ let lLen = src[si] >> 4;
83
+ let mLen = src[si] & 0xf;
84
+ if (++si === sn) {
85
+ throw errInvalidSource;
86
+ }
87
+
88
+ // literals
89
+ if (lLen > 0) {
90
+ if (lLen === 0xf) {
91
+ while (src[si] === 0xff) {
92
+ lLen += 0xff;
93
+ if (++si === sn) {
94
+ throw errInvalidSource;
95
+ }
96
+ }
97
+ lLen += src[si];
98
+ if (++si === sn) {
99
+ throw errInvalidSource;
100
+ }
101
+ }
102
+ di += lLen;
103
+ si += lLen;
104
+ if (si >= sn) {
105
+ return di;
106
+ }
107
+ }
108
+ si += 2;
109
+ if (si >= sn) {
110
+ throw errInvalidSource;
111
+ }
112
+ const offset = src[si - 2] | src[si - 1] << 8;
113
+ if (di - offset < 0 || offset === 0) {
114
+ throw errInvalidSource;
115
+ }
116
+
117
+ // match
118
+ if (mLen === 0xf) {
119
+ while (src[si] === 0xff) {
120
+ mLen += 0xff;
121
+ if (++si === sn) {
122
+ throw errInvalidSource;
123
+ }
124
+ }
125
+ mLen += src[si];
126
+ if (++si === sn) {
127
+ throw errInvalidSource;
128
+ }
129
+ }
130
+ // minimum match length is 4
131
+ mLen += 4;
132
+
133
+ // copy the match (NB. match is at least 4 bytes long)
134
+ for (; mLen >= offset; mLen -= offset) {
135
+ di += offset;
136
+ }
137
+ di += mLen;
138
+ }
139
+ }
140
+ export function uncompressBlock(src, dest) {
141
+ const sn = src.length;
142
+ const dn = dest.length;
143
+ if (sn === 0) {
144
+ return 0;
145
+ }
146
+ let si = 0;
147
+ let di = 0;
148
+ while (true) {
149
+ // literals and match lengths (token)
150
+ let lLen = src[si] >> 4;
151
+ let mLen = src[si] & 0xf;
152
+ if (++si === sn) {
153
+ throw errInvalidSource;
154
+ }
155
+
156
+ // literals
157
+ if (lLen > 0) {
158
+ if (lLen === 0xf) {
159
+ while (src[si] === 0xff) {
160
+ lLen += 0xff;
161
+ if (++si === sn) {
162
+ throw errInvalidSource;
163
+ }
164
+ }
165
+ lLen += src[si];
166
+ if (++si === sn) {
167
+ throw errInvalidSource;
168
+ }
169
+ }
170
+ if (dn - di < lLen || si + lLen > sn) {
171
+ throw errShortBuffer;
172
+ }
173
+ copy(dest, src, di, si, lLen);
174
+ di += lLen;
175
+ si += lLen;
176
+ if (si >= sn) {
177
+ return di;
178
+ }
179
+ }
180
+ si += 2;
181
+ if (si >= sn) {
182
+ throw errInvalidSource;
183
+ }
184
+ const offset = src[si - 2] | src[si - 1] << 8;
185
+ if (di - offset < 0 || offset === 0) {
186
+ throw errInvalidSource;
187
+ }
188
+
189
+ // match
190
+ if (mLen === 0xf) {
191
+ while (src[si] === 0xff) {
192
+ mLen += 0xff;
193
+ if (++si === sn) {
194
+ throw errInvalidSource;
195
+ }
196
+ }
197
+ mLen += src[si];
198
+ if (++si === sn) {
199
+ throw errInvalidSource;
200
+ }
201
+ }
202
+ // minimum match length is 4
203
+ mLen += 4;
204
+ if (dn - di <= mLen) {
205
+ throw errShortBuffer;
206
+ }
207
+
208
+ // copy the match (NB. match is at least 4 bytes long)
209
+ for (; mLen >= offset; mLen -= offset) {
210
+ copy(dest, dest, di, di - offset, offset);
211
+ di += offset;
212
+ }
213
+ copy(dest, dest, di, di - offset, mLen);
214
+ di += mLen;
215
+ }
216
+ }
217
+ export function compressBlockBound(n) {
218
+ return n + (n / 255 | 0) + 16;
219
+ }
220
+ export function compressBlock(src, dest, soffset) {
221
+ const sn = src.length - mfLimit;
222
+ const dn = dest.length;
223
+ if (sn <= 0 || dn === 0 || soffset >= sn) {
224
+ return 0;
225
+ }
226
+ let si = 0,
227
+ di = 0;
228
+
229
+ // fast scan strategy:
230
+ // we only need a hash table to store the last sequences (4 bytes)
231
+ const hashTable = new Uint32Array(hashSize);
232
+
233
+ // Initialise the hash table with the first 64Kb of the input buffer
234
+ // (used when compressing dependent blocks)
235
+ while (si < soffset) {
236
+ const h = imul(getUint32(src, si), hasher) >>> hashShift;
237
+ hashTable[h] = ++si;
238
+ }
239
+ let anchor = si;
240
+ let fma = 1 << skipStrength;
241
+ while (si < sn - minMatch) {
242
+ // hash the next 4 bytes (sequence)...
243
+ const h = imul(getUint32(src, si), hasher) >>> hashShift;
244
+ // -1 to separate existing entries from new ones
245
+ const ref = hashTable[h] - 1;
246
+ // ...and store the position of the hash in the hash table (+1 to compensate the -1 upon saving)
247
+ hashTable[h] = si + 1;
248
+ // no need to check the last 3 bytes in the first literal 4 bytes as
249
+ // this guarantees that the next match, if any, is compressed with
250
+ // a lower size, since to have some compression we must have:
251
+ // ll+ml-overlap > 1 + (ll-15)/255 + (ml-4-15)/255 + 2 (uncompressed size>compressed size)
252
+ // => ll+ml>3+2*overlap => ll+ml>= 4+2*overlap
253
+ // and by definition we do have:
254
+ // ll >= 1, ml >= 4
255
+ // => ll+ml >= 5
256
+ // => so overlap must be 0
257
+
258
+ // the sequence is new, out of bound (64kb) or not valid: try next sequence
259
+ if (ref < 0 ||
260
+ //(fma & ((1 << skipStrength) - 1)) < 4 || // this code seems has a big penalty for size...
261
+ si - ref >> winSizeLog > 0 || src[ref] !== src[si] || src[ref + 1] !== src[si + 1] || src[ref + 2] !== src[si + 2] || src[ref + 3] !== src[si + 3]) {
262
+ // variable step: improves performance on non-compressible data
263
+ si += fma >> skipStrength;
264
+ ++fma;
265
+ continue;
266
+ }
267
+ // match found
268
+ fma = 1 << skipStrength;
269
+ const lLen = si - anchor;
270
+ const offset = si - ref;
271
+
272
+ // encode match length part 1
273
+ si += minMatch;
274
+ let mLen = si; // match length has minMatch already
275
+ while (si <= sn && src[si] === src[si - offset]) {
276
+ si++;
277
+ }
278
+ mLen = si - mLen;
279
+ if (mLen < 0xf) {
280
+ dest[di] = mLen;
281
+ } else {
282
+ dest[di] = 0xf;
283
+ }
284
+
285
+ // encode literals length
286
+ if (lLen < 0xf) {
287
+ dest[di] |= lLen << 4;
288
+ } else {
289
+ dest[di] |= 0xf0;
290
+ if (++di === dn) {
291
+ throw errShortBuffer;
292
+ }
293
+ let l = lLen - 0xf;
294
+ for (; l >= 0xff; l -= 0xff) {
295
+ dest[di] = 0xff;
296
+ if (++di === dn) {
297
+ throw errShortBuffer;
298
+ }
299
+ }
300
+ dest[di] = l & 0xff;
301
+ }
302
+ if (++di === dn) {
303
+ throw errShortBuffer;
304
+ }
305
+
306
+ // literals
307
+ if (di + lLen >= dn) {
308
+ throw errShortBuffer;
309
+ }
310
+ copy(dest, src, di, anchor, lLen);
311
+ di += lLen;
312
+ anchor = si;
313
+
314
+ // encode offset
315
+ di += 2;
316
+ if (di >= dn) {
317
+ throw errShortBuffer;
318
+ }
319
+ dest[di - 2] = offset;
320
+ dest[di - 1] = offset >> 8;
321
+
322
+ // encode match length part 2
323
+ if (mLen >= 0xf) {
324
+ for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
325
+ dest[di] = 0xff;
326
+ if (++di === dn) {
327
+ throw errShortBuffer;
328
+ }
329
+ }
330
+ dest[di] = mLen;
331
+ if (++di === dn) {
332
+ throw errShortBuffer;
333
+ }
334
+ }
335
+ }
336
+ if (anchor === 0) {
337
+ // incompressible
338
+ return 0;
339
+ }
340
+
341
+ // last literals
342
+ let lLen = src.length - anchor;
343
+ if (lLen < 0xf) {
344
+ dest[di] = lLen << 4;
345
+ } else {
346
+ dest[di] = 0xf0;
347
+ if (++di === dn) {
348
+ throw errShortBuffer;
349
+ }
350
+ for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
351
+ dest[di] = 0xff;
352
+ if (++di === dn) {
353
+ throw errShortBuffer;
354
+ }
355
+ }
356
+ dest[di] = lLen;
357
+ }
358
+ if (++di === dn) {
359
+ throw errShortBuffer;
360
+ }
361
+
362
+ // write literals
363
+ const lastLen = src.length - anchor;
364
+ const n = di + lastLen;
365
+ if (n > dn) {
366
+ throw errShortBuffer;
367
+ } else if (n >= sn) {
368
+ // incompressible
369
+ return 0;
370
+ }
371
+ copy(dest, src, di, anchor, lastLen);
372
+ di += lastLen;
373
+ return di;
374
+ }
375
+ export function compressBlockHC(src, dest, soffset) {
376
+ const sn = src.length - mfLimit;
377
+ const dn = dest.length;
378
+ if (sn <= 0 || dn === 0 || soffset >= sn) {
379
+ return 0;
380
+ }
381
+ let si = 0;
382
+ let di = 0;
383
+
384
+ // Hash Chain strategy:
385
+ // we need a hash table and a chain table
386
+ // the chain table cannot contain more entries than the window size (64Kb entries)
387
+ const hashTable = new Uint32Array(hashSize);
388
+ const chainTable = new Uint32Array(winSize);
389
+
390
+ // Initialise the hash table with the first 64Kb of the input buffer
391
+ // (used when compressing dependent blocks)
392
+ while (si < soffset) {
393
+ const h = imul(getUint32(src, si), hasher) >>> hashShift;
394
+ chainTable[si & winMask] = hashTable[h];
395
+ hashTable[h] = ++si;
396
+ }
397
+ let anchor = si;
398
+ while (si < sn - minMatch) {
399
+ // hash the next 4 bytes (sequence)...
400
+ const h = imul(getUint32(src, si), hasher) >>> hashShift;
401
+
402
+ // follow the chain until out of window and give the longest match
403
+ let mLen = 0;
404
+ let offset = 0;
405
+ for (let next = hashTable[h] - 1; next > 0 && next > si - winSize; next = chainTable[next & winMask] - 1) {
406
+ // the first (mLen==0) or next byte (mLen>=minMatch) at current match length must match to improve on the match length
407
+ if (src[next + mLen] === src[si + mLen]) {
408
+ for (let ml = 0;; ++ml) {
409
+ if (src[next + ml] !== src[si + ml] || si + ml > sn) {
410
+ // found a longer match, keep its position and length
411
+ if (mLen < ml && ml >= minMatch) {
412
+ mLen = ml;
413
+ offset = si - next;
414
+ }
415
+ break;
416
+ }
417
+ }
418
+ }
419
+ }
420
+ chainTable[si & winMask] = hashTable[h];
421
+ hashTable[h] = si + 1;
422
+
423
+ // no match found
424
+ if (mLen === 0) {
425
+ ++si;
426
+ continue;
427
+ }
428
+ let si2 = si + 1;
429
+ const ml = si + mLen;
430
+
431
+ // match found
432
+ // update hash/chain tables with overlaping bytes:
433
+ // si already hashed, add everything from si+1 up to the match length
434
+ while (si2 < ml) {
435
+ const h = imul(getUint32(src, si2), hasher) >>> hashShift;
436
+ chainTable[si2 & winMask] = hashTable[h];
437
+ hashTable[h] = ++si2;
438
+ }
439
+ const lLen = si - anchor;
440
+ si += mLen;
441
+ mLen -= minMatch; // match length does not include minMatch
442
+
443
+ if (mLen < 0xf) {
444
+ dest[di] = mLen;
445
+ } else {
446
+ dest[di] = 0xf;
447
+ }
448
+
449
+ // encode literals length
450
+ if (lLen < 0xf) {
451
+ dest[di] |= lLen << 4;
452
+ } else {
453
+ dest[di] |= 0xf0;
454
+ if (++di === dn) {
455
+ throw errShortBuffer;
456
+ }
457
+ let l = lLen - 0xf;
458
+ for (; l >= 0xff; l -= 0xff) {
459
+ dest[di] = 0xff;
460
+ if (++di === dn) {
461
+ throw errShortBuffer;
462
+ }
463
+ }
464
+ dest[di] = l & 0xff;
465
+ }
466
+ if (++di === dn) {
467
+ throw errShortBuffer;
468
+ }
469
+
470
+ // literals
471
+ if (di + lLen >= dn) {
472
+ throw errShortBuffer;
473
+ }
474
+ copy(dest, src, di, anchor, lLen);
475
+ di += lLen;
476
+ anchor = si;
477
+
478
+ // encode offset
479
+ di += 2;
480
+ if (di >= dn) {
481
+ throw errShortBuffer;
482
+ }
483
+ dest[di - 2] = offset;
484
+ dest[di - 1] = offset >> 8;
485
+
486
+ // encode match length part 2
487
+ if (mLen >= 0xf) {
488
+ for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
489
+ dest[di] = 0xff;
490
+ if (++di === dn) {
491
+ throw errShortBuffer;
492
+ }
493
+ }
494
+ dest[di] = mLen;
495
+ if (++di === dn) {
496
+ throw errShortBuffer;
497
+ }
498
+ }
499
+ }
500
+ if (anchor === 0) {
501
+ // incompressible
502
+ return 0;
503
+ }
504
+
505
+ // last literals
506
+ let lLen = src.length - anchor;
507
+ if (lLen < 0xf) {
508
+ dest[di] = lLen << 4;
509
+ } else {
510
+ dest[di] = 0xf0;
511
+ if (++di === dn) {
512
+ throw errShortBuffer;
513
+ }
514
+ for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
515
+ dest[di] = 0xff;
516
+ if (++di === dn) {
517
+ throw errShortBuffer;
518
+ }
519
+ }
520
+ dest[di] = lLen;
521
+ }
522
+ if (++di === dn) {
523
+ throw errShortBuffer;
524
+ }
525
+
526
+ // write literals
527
+ const lastLen = src.length - anchor;
528
+ const n = di + lastLen;
529
+ if (n > dn) {
530
+ throw errShortBuffer;
531
+ } else if (n >= sn) {
532
+ // incompressible
533
+ return 0;
534
+ }
535
+ copy(dest, src, di, anchor, lastLen);
536
+ di += lastLen;
537
+ return di;
538
+ }
539
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJJbnZhbGlkU291cmNlIiwiRXJyb3IiLCJlcnJTaG9ydEJ1ZmZlciIsIm1pbk1hdGNoIiwid2luU2l6ZUxvZyIsIndpblNpemUiLCJ3aW5NYXNrIiwiaGFzaFNpemVMb2ciLCJoYXNoU2l6ZSIsImhhc2hTaGlmdCIsIm1mTGltaXQiLCJza2lwU3RyZW5ndGgiLCJoYXNoZXIiLCJpbXVsUG9seWZpbGwiLCJhIiwiYiIsImFoIiwiYWwiLCJiaCIsImJsIiwiaW11bCIsIk1hdGgiLCJnZXRVaW50MzIiLCJpIiwiY29weSIsImRlc3QiLCJzcmMiLCJkaSIsInNpIiwibGVuIiwiY2FsY1VuY29tcHJlc3NlZExlbiIsInNuIiwibGVuZ3RoIiwibExlbiIsIm1MZW4iLCJvZmZzZXQiLCJ1bmNvbXByZXNzQmxvY2siLCJkbiIsImNvbXByZXNzQmxvY2tCb3VuZCIsIm4iLCJjb21wcmVzc0Jsb2NrIiwic29mZnNldCIsImhhc2hUYWJsZSIsIlVpbnQzMkFycmF5IiwiaCIsImFuY2hvciIsImZtYSIsInJlZiIsImwiLCJsYXN0TGVuIiwiY29tcHJlc3NCbG9ja0hDIiwiY2hhaW5UYWJsZSIsIm5leHQiLCJtbCIsInNpMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taW5pZnkvbHo0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGx6NC10cyBAbGljZW5zZSBCU0QtMy1DbGF1c2UgLyBDb3B5cmlnaHQgKGMpIDIwMTUsIFBpZXJyZSBDdXJ0byAvIDIwMTYsIG9vdi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBQaWVycmUgQ3VydG9cbiAqIENvcHlyaWdodCAoYykgMjAxNiwgb292XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHh4SGFzaCBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5jb25zdCBlcnJJbnZhbGlkU291cmNlID0gbmV3IEVycm9yKFwiaW52YWxpZCBzb3VyY2VcIik7XG5jb25zdCBlcnJTaG9ydEJ1ZmZlciA9IG5ldyBFcnJvcihcInNob3J0IGJ1ZmZlclwiKTtcblxuLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHVzZWQgdG8gc2V0dXAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS5cbmNvbnN0IG1pbk1hdGNoID0gNDsgLy8gdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggc2VxdWVuY2Ugc2l6ZSAoNCBieXRlcylcbmNvbnN0IHdpblNpemVMb2cgPSAxNjsgLy8gTFo0IDY0S2Igd2luZG93IHNpemUgbGltaXRcbmNvbnN0IHdpblNpemUgPSAxIDw8IHdpblNpemVMb2c7XG5jb25zdCB3aW5NYXNrID0gd2luU2l6ZSAtIDE7IC8vIDY0S2Igd2luZG93IG9mIHByZXZpb3VzIGRhdGEgZm9yIGRlcGVuZGVudCBibG9ja3NcblxuLy8gaGFzaFNpemVMb2cgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSB1c2VkIHRvIHF1aWNrbHkgZmluZCBhIHByZXZpb3VzIG1hdGNoIHBvc2l0aW9uLlxuLy8gSXRzIHZhbHVlIGluZmx1ZW5jZXMgdGhlIGNvbXByZXNzaW9uIHNwZWVkIGFuZCBtZW1vcnkgdXNhZ2UsIHRoZSBsb3dlciB0aGUgZmFzdGVyLFxuLy8gYnV0IGF0IHRoZSBleHBlbnNlIG9mIHRoZSBjb21wcmVzc2lvbiByYXRpby5cbi8vIDE2IHNlZW1zIHRvIGJlIHRoZSBiZXN0IGNvbXByb21pc2UuXG5jb25zdCBoYXNoU2l6ZUxvZyA9IDE2O1xuY29uc3QgaGFzaFNpemUgPSAxIDw8IGhhc2hTaXplTG9nO1xuY29uc3QgaGFzaFNoaWZ0ID0gbWluTWF0Y2ggKiA4IC0gaGFzaFNpemVMb2c7XG5cbmNvbnN0IG1mTGltaXQgPSA4ICsgbWluTWF0Y2g7IC8vIFRoZSBsYXN0IG1hdGNoIGNhbm5vdCBzdGFydCB3aXRoaW4gdGhlIGxhc3QgMTIgYnl0ZXMuXG5jb25zdCBza2lwU3RyZW5ndGggPSA2OyAvLyB2YXJpYWJsZSBzdGVwIGZvciBmYXN0IHNjYW5cblxuY29uc3QgaGFzaGVyID0gMjY1NDQzNTc2MSB8IDA7IC8vIHByaW1lIG51bWJlciB1c2VkIHRvIGhhc2ggbWluTWF0Y2hcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9pbXVsI1BvbHlmaWxsXG5mdW5jdGlvbiBpbXVsUG9seWZpbGwoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBhaCA9IChhID4+PiAxNikgJiAweGZmZmY7XG4gIGNvbnN0IGFsID0gYSAmIDB4ZmZmZjtcbiAgY29uc3QgYmggPSAoYiA+Pj4gMTYpICYgMHhmZmZmO1xuICBjb25zdCBibCA9IGIgJiAweGZmZmY7XG4gIC8vIHRoZSBzaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnRcbiAgLy8gdGhlIGZpbmFsIHwwIGNvbnZlcnRzIHRoZSB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgc2lnbmVkIHZhbHVlXG4gIHJldHVybiAoYWwgKiBibCArICgoKGFoICogYmwgKyBhbCAqIGJoKSA8PCAxNikgPj4+IDApKSB8IDA7XG59XG5jb25zdCBpbXVsID0gTWF0aC5pbXVsID8gTWF0aC5pbXVsIDogaW11bFBvbHlmaWxsO1xuXG5mdW5jdGlvbiBnZXRVaW50MzIoYTogVWludDhBcnJheSwgaTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGFbaSArIDNdIHwgKGFbaSArIDJdIDw8IDgpIHwgKGFbaSArIDFdIDw8IDE2KSB8IChhW2ldIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gY29weShcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkaTogbnVtYmVyLFxuICBzaTogbnVtYmVyLFxuICBsZW46IG51bWJlclxuKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBkZXN0W2RpKytdID0gc3JjW3NpKytdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjVW5jb21wcmVzc2VkTGVuKHNyYzogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aDtcbiAgaWYgKHNuID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBsZXQgc2kgPSAwO1xuICBsZXQgZGkgPSAwO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gbGl0ZXJhbHMgYW5kIG1hdGNoIGxlbmd0aHMgKHRva2VuKVxuICAgIGxldCBsTGVuID0gc3JjW3NpXSA+PiA0O1xuICAgIGxldCBtTGVuID0gc3JjW3NpXSAmIDB4ZjtcbiAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAobExlbiA+IDApIHtcbiAgICAgIGlmIChsTGVuID09PSAweGYpIHtcbiAgICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgICBsTGVuICs9IDB4ZmY7XG4gICAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsTGVuICs9IHNyY1tzaV07XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRpICs9IGxMZW47XG4gICAgICBzaSArPSBsTGVuO1xuICAgICAgaWYgKHNpID49IHNuKSB7XG4gICAgICAgIHJldHVybiBkaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaSArPSAyO1xuICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3JjW3NpIC0gMl0gfCAoc3JjW3NpIC0gMV0gPDwgOCk7XG4gICAgaWYgKGRpIC0gb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPT09IDApIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbWF0Y2hcbiAgICBpZiAobUxlbiA9PT0gMHhmKSB7XG4gICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICBtTGVuICs9IDB4ZmY7XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1MZW4gKz0gc3JjW3NpXTtcbiAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBtaW5pbXVtIG1hdGNoIGxlbmd0aCBpcyA0XG4gICAgbUxlbiArPSA0O1xuXG4gICAgLy8gY29weSB0aGUgbWF0Y2ggKE5CLiBtYXRjaCBpcyBhdCBsZWFzdCA0IGJ5dGVzIGxvbmcpXG4gICAgZm9yICg7IG1MZW4gPj0gb2Zmc2V0OyBtTGVuIC09IG9mZnNldCkge1xuICAgICAgZGkgKz0gb2Zmc2V0O1xuICAgIH1cbiAgICBkaSArPSBtTGVuO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmNvbXByZXNzQmxvY2soc3JjOiBVaW50OEFycmF5LCBkZXN0OiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoO1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBzaSA9IDA7XG4gIGxldCBkaSA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBsaXRlcmFscyBhbmQgbWF0Y2ggbGVuZ3RocyAodG9rZW4pXG4gICAgbGV0IGxMZW4gPSBzcmNbc2ldID4+IDQ7XG4gICAgbGV0IG1MZW4gPSBzcmNbc2ldICYgMHhmO1xuICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChsTGVuID4gMCkge1xuICAgICAgaWYgKGxMZW4gPT09IDB4Zikge1xuICAgICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICAgIGxMZW4gKz0gMHhmZjtcbiAgICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxMZW4gKz0gc3JjW3NpXTtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRuIC0gZGkgPCBsTGVuIHx8IHNpICsgbExlbiA+IHNuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgY29weShkZXN0LCBzcmMsIGRpLCBzaSwgbExlbik7XG4gICAgICBkaSArPSBsTGVuO1xuICAgICAgc2kgKz0gbExlbjtcbiAgICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgICByZXR1cm4gZGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2kgKz0gMjtcbiAgICBpZiAoc2kgPj0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IHNyY1tzaSAtIDJdIHwgKHNyY1tzaSAtIDFdIDw8IDgpO1xuICAgIGlmIChkaSAtIG9mZnNldCA8IDAgfHwgb2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cblxuICAgIC8vIG1hdGNoXG4gICAgaWYgKG1MZW4gPT09IDB4Zikge1xuICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgbUxlbiArPSAweGZmO1xuICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtTGVuICs9IHNyY1tzaV07XG4gICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbWluaW11bSBtYXRjaCBsZW5ndGggaXMgNFxuICAgIG1MZW4gKz0gNDtcbiAgICBpZiAoZG4gLSBkaSA8PSBtTGVuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBjb3B5IHRoZSBtYXRjaCAoTkIuIG1hdGNoIGlzIGF0IGxlYXN0IDQgYnl0ZXMgbG9uZylcbiAgICBmb3IgKDsgbUxlbiA+PSBvZmZzZXQ7IG1MZW4gLT0gb2Zmc2V0KSB7XG4gICAgICBjb3B5KGRlc3QsIGRlc3QsIGRpLCBkaSAtIG9mZnNldCwgb2Zmc2V0KTtcbiAgICAgIGRpICs9IG9mZnNldDtcbiAgICB9XG4gICAgY29weShkZXN0LCBkZXN0LCBkaSwgZGkgLSBvZmZzZXQsIG1MZW4pO1xuICAgIGRpICs9IG1MZW47XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzQmxvY2tCb3VuZChuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbiArICgobiAvIDI1NSkgfCAwKSArIDE2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NCbG9jayhcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzb2Zmc2V0OiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aCAtIG1mTGltaXQ7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA8PSAwIHx8IGRuID09PSAwIHx8IHNvZmZzZXQgPj0gc24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgc2kgPSAwLFxuICAgIGRpID0gMDtcblxuICAvLyBmYXN0IHNjYW4gc3RyYXRlZ3k6XG4gIC8vIHdlIG9ubHkgbmVlZCBhIGhhc2ggdGFibGUgdG8gc3RvcmUgdGhlIGxhc3Qgc2VxdWVuY2VzICg0IGJ5dGVzKVxuICBjb25zdCBoYXNoVGFibGUgPSBuZXcgVWludDMyQXJyYXkoaGFzaFNpemUpO1xuXG4gIC8vIEluaXRpYWxpc2UgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgZmlyc3QgNjRLYiBvZiB0aGUgaW5wdXQgYnVmZmVyXG4gIC8vICh1c2VkIHdoZW4gY29tcHJlc3NpbmcgZGVwZW5kZW50IGJsb2NrcylcbiAgd2hpbGUgKHNpIDwgc29mZnNldCkge1xuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIGxldCBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgd2hpbGUgKHNpIDwgc24gLSBtaW5NYXRjaCkge1xuICAgIC8vIGhhc2ggdGhlIG5leHQgNCBieXRlcyAoc2VxdWVuY2UpLi4uXG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgLy8gLTEgdG8gc2VwYXJhdGUgZXhpc3RpbmcgZW50cmllcyBmcm9tIG5ldyBvbmVzXG4gICAgY29uc3QgcmVmID0gaGFzaFRhYmxlW2hdIC0gMTtcbiAgICAvLyAuLi5hbmQgc3RvcmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBoYXNoIGluIHRoZSBoYXNoIHRhYmxlICgrMSB0byBjb21wZW5zYXRlIHRoZSAtMSB1cG9uIHNhdmluZylcbiAgICBoYXNoVGFibGVbaF0gPSBzaSArIDE7XG4gICAgLy8gbm8gbmVlZCB0byBjaGVjayB0aGUgbGFzdCAzIGJ5dGVzIGluIHRoZSBmaXJzdCBsaXRlcmFsIDQgYnl0ZXMgYXNcbiAgICAvLyB0aGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgbmV4dCBtYXRjaCwgaWYgYW55LCBpcyBjb21wcmVzc2VkIHdpdGhcbiAgICAvLyBhIGxvd2VyIHNpemUsIHNpbmNlIHRvIGhhdmUgc29tZSBjb21wcmVzc2lvbiB3ZSBtdXN0IGhhdmU6XG4gICAgLy8gbGwrbWwtb3ZlcmxhcCA+IDEgKyAobGwtMTUpLzI1NSArIChtbC00LTE1KS8yNTUgKyAyICh1bmNvbXByZXNzZWQgc2l6ZT5jb21wcmVzc2VkIHNpemUpXG4gICAgLy8gPT4gbGwrbWw+MysyKm92ZXJsYXAgPT4gbGwrbWw+PSA0KzIqb3ZlcmxhcFxuICAgIC8vIGFuZCBieSBkZWZpbml0aW9uIHdlIGRvIGhhdmU6XG4gICAgLy8gbGwgPj0gMSwgbWwgPj0gNFxuICAgIC8vID0+IGxsK21sID49IDVcbiAgICAvLyA9PiBzbyBvdmVybGFwIG11c3QgYmUgMFxuXG4gICAgLy8gdGhlIHNlcXVlbmNlIGlzIG5ldywgb3V0IG9mIGJvdW5kICg2NGtiKSBvciBub3QgdmFsaWQ6IHRyeSBuZXh0IHNlcXVlbmNlXG4gICAgaWYgKFxuICAgICAgcmVmIDwgMCB8fCAvLyhmbWEgJiAoKDEgPDwgc2tpcFN0cmVuZ3RoKSAtIDEpKSA8IDQgfHwgLy8gdGhpcyBjb2RlIHNlZW1zIGhhcyBhIGJpZyBwZW5hbHR5IGZvciBzaXplLi4uXG4gICAgICAoc2kgLSByZWYpID4+IHdpblNpemVMb2cgPiAwIHx8XG4gICAgICBzcmNbcmVmXSAhPT0gc3JjW3NpXSB8fFxuICAgICAgc3JjW3JlZiArIDFdICE9PSBzcmNbc2kgKyAxXSB8fFxuICAgICAgc3JjW3JlZiArIDJdICE9PSBzcmNbc2kgKyAyXSB8fFxuICAgICAgc3JjW3JlZiArIDNdICE9PSBzcmNbc2kgKyAzXVxuICAgICkge1xuICAgICAgLy8gdmFyaWFibGUgc3RlcDogaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb24gbm9uLWNvbXByZXNzaWJsZSBkYXRhXG4gICAgICBzaSArPSBmbWEgPj4gc2tpcFN0cmVuZ3RoO1xuICAgICAgKytmbWE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gbWF0Y2ggZm91bmRcbiAgICBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgICBjb25zdCBsTGVuID0gc2kgLSBhbmNob3I7XG4gICAgY29uc3Qgb2Zmc2V0ID0gc2kgLSByZWY7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMVxuICAgIHNpICs9IG1pbk1hdGNoO1xuICAgIGxldCBtTGVuID0gc2k7IC8vIG1hdGNoIGxlbmd0aCBoYXMgbWluTWF0Y2ggYWxyZWFkeVxuICAgIHdoaWxlIChzaSA8PSBzbiAmJiBzcmNbc2ldID09PSBzcmNbc2kgLSBvZmZzZXRdKSB7XG4gICAgICBzaSsrO1xuICAgIH1cbiAgICBtTGVuID0gc2kgLSBtTGVuO1xuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc0Jsb2NrSEMoXG4gIHNyYzogVWludDhBcnJheSxcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc29mZnNldDogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBzbiA9IHNyYy5sZW5ndGggLSBtZkxpbWl0O1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPD0gMCB8fCBkbiA9PT0gMCB8fCBzb2Zmc2V0ID49IHNuKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbGV0IHNpID0gMDtcbiAgbGV0IGRpID0gMDtcblxuICAvLyBIYXNoIENoYWluIHN0cmF0ZWd5OlxuICAvLyB3ZSBuZWVkIGEgaGFzaCB0YWJsZSBhbmQgYSBjaGFpbiB0YWJsZVxuICAvLyB0aGUgY2hhaW4gdGFibGUgY2Fubm90IGNvbnRhaW4gbW9yZSBlbnRyaWVzIHRoYW4gdGhlIHdpbmRvdyBzaXplICg2NEtiIGVudHJpZXMpXG4gIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBVaW50MzJBcnJheShoYXNoU2l6ZSk7XG4gIGNvbnN0IGNoYWluVGFibGUgPSBuZXcgVWludDMyQXJyYXkod2luU2l6ZSk7XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgaGFzaCB0YWJsZSB3aXRoIHRoZSBmaXJzdCA2NEtiIG9mIHRoZSBpbnB1dCBidWZmZXJcbiAgLy8gKHVzZWQgd2hlbiBjb21wcmVzc2luZyBkZXBlbmRlbnQgYmxvY2tzKVxuICB3aGlsZSAoc2kgPCBzb2Zmc2V0KSB7XG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgY2hhaW5UYWJsZVtzaSAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIHdoaWxlIChzaSA8IHNuIC0gbWluTWF0Y2gpIHtcbiAgICAvLyBoYXNoIHRoZSBuZXh0IDQgYnl0ZXMgKHNlcXVlbmNlKS4uLlxuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuXG4gICAgLy8gZm9sbG93IHRoZSBjaGFpbiB1bnRpbCBvdXQgb2Ygd2luZG93IGFuZCBnaXZlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAgbGV0IG1MZW4gPSAwO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoXG4gICAgICBsZXQgbmV4dCA9IGhhc2hUYWJsZVtoXSAtIDE7XG4gICAgICBuZXh0ID4gMCAmJiBuZXh0ID4gc2kgLSB3aW5TaXplO1xuICAgICAgbmV4dCA9IGNoYWluVGFibGVbbmV4dCAmIHdpbk1hc2tdIC0gMVxuICAgICkge1xuICAgICAgLy8gdGhlIGZpcnN0IChtTGVuPT0wKSBvciBuZXh0IGJ5dGUgKG1MZW4+PW1pbk1hdGNoKSBhdCBjdXJyZW50IG1hdGNoIGxlbmd0aCBtdXN0IG1hdGNoIHRvIGltcHJvdmUgb24gdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgaWYgKHNyY1tuZXh0ICsgbUxlbl0gPT09IHNyY1tzaSArIG1MZW5dKSB7XG4gICAgICAgIGZvciAobGV0IG1sID0gMDsgOyArK21sKSB7XG4gICAgICAgICAgaWYgKHNyY1tuZXh0ICsgbWxdICE9PSBzcmNbc2kgKyBtbF0gfHwgc2kgKyBtbCA+IHNuKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBhIGxvbmdlciBtYXRjaCwga2VlcCBpdHMgcG9zaXRpb24gYW5kIGxlbmd0aFxuICAgICAgICAgICAgaWYgKG1MZW4gPCBtbCAmJiBtbCA+PSBtaW5NYXRjaCkge1xuICAgICAgICAgICAgICBtTGVuID0gbWw7XG4gICAgICAgICAgICAgIG9mZnNldCA9IHNpIC0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjaGFpblRhYmxlW3NpICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgaGFzaFRhYmxlW2hdID0gc2kgKyAxO1xuXG4gICAgLy8gbm8gbWF0Y2ggZm91bmRcbiAgICBpZiAobUxlbiA9PT0gMCkge1xuICAgICAgKytzaTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBzaTIgPSBzaSArIDE7XG4gICAgY29uc3QgbWwgPSBzaSArIG1MZW47XG5cbiAgICAvLyBtYXRjaCBmb3VuZFxuICAgIC8vIHVwZGF0ZSBoYXNoL2NoYWluIHRhYmxlcyB3aXRoIG92ZXJsYXBpbmcgYnl0ZXM6XG4gICAgLy8gc2kgYWxyZWFkeSBoYXNoZWQsIGFkZCBldmVyeXRoaW5nIGZyb20gc2krMSB1cCB0byB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgd2hpbGUgKHNpMiA8IG1sKSB7XG4gICAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaTIpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgICBjaGFpblRhYmxlW3NpMiAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgICAgaGFzaFRhYmxlW2hdID0gKytzaTI7XG4gICAgfVxuXG4gICAgY29uc3QgbExlbiA9IHNpIC0gYW5jaG9yO1xuICAgIHNpICs9IG1MZW47XG4gICAgbUxlbiAtPSBtaW5NYXRjaDsgLy8gbWF0Y2ggbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgbWluTWF0Y2hcblxuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQU1BLGdCQUFnQixHQUFHLElBQUlDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztBQUNwRCxNQUFNQyxjQUFjLEdBQUcsSUFBSUQsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7QUFFaEQ7QUFDQSxNQUFNRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEIsTUFBTUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU1DLE9BQU8sR0FBRyxDQUFDLElBQUlELFVBQVU7QUFDL0IsTUFBTUUsT0FBTyxHQUFHRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUUsV0FBVyxHQUFHLEVBQUU7QUFDdEIsTUFBTUMsUUFBUSxHQUFHLENBQUMsSUFBSUQsV0FBVztBQUNqQyxNQUFNRSxTQUFTLEdBQUdOLFFBQVEsR0FBRyxDQUFDLEdBQUdJLFdBQVc7QUFFNUMsTUFBTUcsT0FBTyxHQUFHLENBQUMsR0FBR1AsUUFBUSxDQUFDLENBQUM7QUFDOUIsTUFBTVEsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDOztBQUV4QixNQUFNQyxNQUFNLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDOztBQUUvQjtBQUNBLFNBQVNDLFlBQVksQ0FBQ0MsQ0FBUyxFQUFFQyxDQUFTLEVBQVU7RUFDbEQsTUFBTUMsRUFBRSxHQUFJRixDQUFD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
File without changes
package/dist/sodium.js ADDED
@@ -0,0 +1,6 @@
1
+ import sodium from "libsodium-wrappers";
2
+ export async function setup() {
3
+ await sodium.ready;
4
+ }
5
+ export { sodium };
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzb2RpdW0iLCJzZXR1cCIsInJlYWR5Il0sInNvdXJjZXMiOlsiLi4vc3JjL3NvZGl1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc29kaXVtIGZyb20gXCJsaWJzb2RpdW0td3JhcHBlcnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBzb2RpdW0ucmVhZHk7XG59XG5cbmV4cG9ydCB7IHNvZGl1bSB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFNLE1BQU0sb0JBQW9CO0FBRXZDLE9BQU8sZUFBZUMsS0FBSyxHQUFrQjtFQUMzQyxNQUFNRCxNQUFNLENBQUNFLEtBQUs7QUFDcEI7QUFFQSxTQUFTRixNQUFNIn0=
File without changes