@secrecy/lib 1.0.0-dev.9 → 1.0.0

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