@secrecy/lib 1.0.0-dev.39 → 1.0.0-dev.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BaseClient.d.ts +33 -53
- package/dist/BaseClient.js +886 -2093
- package/dist/PopupTools.js +20 -21
- package/dist/ZeusThunder.js +50 -84
- package/dist/cache.d.ts +2 -3
- package/dist/cache.js +4 -5
- package/dist/client/admin/index.js +77 -165
- package/dist/client/convert/file.d.ts +3 -3
- package/dist/client/convert/file.js +18 -23
- package/dist/client/convert/mail.js +13 -13
- package/dist/client/convert/node.d.ts +9 -0
- package/dist/client/convert/node.js +101 -0
- package/dist/client/helpers.js +41 -41
- package/dist/client/index.d.ts +63 -74
- package/dist/client/index.js +2727 -5759
- package/dist/client/storage.js +7 -7
- package/dist/client/types/File.d.ts +6 -13
- package/dist/client/types/File.js +1 -1
- package/dist/client/types/Inputs.d.ts +2 -7
- package/dist/client/types/Inputs.js +1 -1
- package/dist/client/types/Node.d.ts +49 -0
- package/dist/client/types/Node.js +3 -0
- package/dist/client/types/UserAppNotifications.d.ts +1 -1
- package/dist/client/types/UserAppNotifications.js +1 -1
- package/dist/client/types/UserAppSettings.js +1 -1
- package/dist/client/types/index.d.ts +7 -13
- package/dist/client/types/index.js +2 -4
- package/dist/client/types/selectors.d.ts +476 -0
- package/dist/client/types/selectors.js +125 -0
- package/dist/crypto/file.js +122 -203
- package/dist/crypto/index.js +14 -12
- package/dist/error.js +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.js +2 -34
- package/dist/minify/index.js +7 -7
- package/dist/minify/lz4.js +87 -93
- package/dist/sodium.js +3 -25
- package/dist/utils/store-buddy.js +11 -15
- package/dist/utils/time.js +4 -12
- package/dist/{utils.d.ts → utils/utils.d.ts} +0 -0
- package/dist/utils/utils.js +57 -0
- package/dist/worker/__mock__/sodium.worker.js +35 -32
- package/dist/worker/md5.js +21 -39
- package/dist/worker/sodium.js +95 -130
- package/dist/worker/workerCodes.js +3 -3
- package/dist/zeus/const.d.ts +5 -0
- package/dist/zeus/const.js +303 -1360
- package/dist/zeus/index.d.ts +1805 -1817
- package/dist/zeus/index.js +542 -434
- package/package.json +40 -39
- package/dist/client/convert/folder.d.ts +0 -8
- package/dist/client/convert/folder.js +0 -264
- package/dist/client/convert/vFile.d.ts +0 -5
- package/dist/client/convert/vFile.js +0 -164
- package/dist/client/types/FilesOnUsersOnApplications.d.ts +0 -9
- package/dist/client/types/FilesOnUsersOnApplications.js +0 -3
- package/dist/client/types/Folder.d.ts +0 -68
- package/dist/client/types/Folder.js +0 -7
- package/dist/client/types/VFile.d.ts +0 -62
- package/dist/client/types/VFile.js +0 -4
- package/dist/client/types/queries.d.ts +0 -535
- package/dist/client/types/queries.js +0 -192
- package/dist/utils.js +0 -188
package/dist/minify/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { calcUncompressedLen, compressBlockBound, compressBlockHC, uncompressBlock } from "./lz4.js";
|
|
2
|
-
import { concatenate } from "../utils.js";
|
|
2
|
+
import { concatenate } from "../utils/utils.js";
|
|
3
3
|
export function compress(data) {
|
|
4
4
|
if (data.byteLength > 15000000) {
|
|
5
5
|
return concatenate(new Uint8Array([0]), data);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
const compressed = new Uint8Array(compressBlockBound(data.byteLength));
|
|
9
|
+
const compressedSize = compressBlockHC(data, compressed, 0);
|
|
10
10
|
|
|
11
11
|
if (compressedSize === 0) {
|
|
12
12
|
return concatenate(new Uint8Array([0]), data);
|
|
@@ -15,14 +15,14 @@ export function compress(data) {
|
|
|
15
15
|
return concatenate(new Uint8Array([1]), compressed.slice(0, compressedSize));
|
|
16
16
|
}
|
|
17
17
|
export function uncompress(data) {
|
|
18
|
-
|
|
18
|
+
const realData = data.slice(1);
|
|
19
19
|
|
|
20
20
|
if (data[0] === 0) {
|
|
21
21
|
return realData;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
const dst = new Uint8Array(calcUncompressedLen(realData));
|
|
25
|
+
const uncompressedSize = uncompressBlock(realData, dst);
|
|
26
26
|
return dst.slice(0, uncompressedSize);
|
|
27
27
|
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxjVW5jb21wcmVzc2VkTGVuIiwiY29tcHJlc3NCbG9ja0JvdW5kIiwiY29tcHJlc3NCbG9ja0hDIiwidW5jb21wcmVzc0Jsb2NrIiwiY29uY2F0ZW5hdGUiLCJjb21wcmVzcyIsImRhdGEiLCJieXRlTGVuZ3RoIiwiVWludDhBcnJheSIsImNvbXByZXNzZWQiLCJjb21wcmVzc2VkU2l6ZSIsInNsaWNlIiwidW5jb21wcmVzcyIsInJlYWxEYXRhIiwiZHN0IiwidW5jb21wcmVzc2VkU2l6ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taW5pZnkvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY2FsY1VuY29tcHJlc3NlZExlbixcbiAgY29tcHJlc3NCbG9ja0JvdW5kLFxuICBjb21wcmVzc0Jsb2NrSEMsXG4gIHVuY29tcHJlc3NCbG9ja1xufSBmcm9tIFwiLi9sejQuanNcIjtcbmltcG9ydCB7IGNvbmNhdGVuYXRlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzcyhkYXRhOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGlmIChkYXRhLmJ5dGVMZW5ndGggPiAxNV8wMDBfMDAwKSB7XG4gICAgcmV0dXJuIGNvbmNhdGVuYXRlKG5ldyBVaW50OEFycmF5KFswXSksIGRhdGEpO1xuICB9XG4gIGNvbnN0IGNvbXByZXNzZWQgPSBuZXcgVWludDhBcnJheShjb21wcmVzc0Jsb2NrQm91bmQoZGF0YS5ieXRlTGVuZ3RoKSk7XG4gIGNvbnN0IGNvbXByZXNzZWRTaXplID0gY29tcHJlc3NCbG9ja0hDKGRhdGEsIGNvbXByZXNzZWQsIDApO1xuICBpZiAoY29tcHJlc3NlZFNpemUgPT09IDApIHtcbiAgICByZXR1cm4gY29uY2F0ZW5hdGUobmV3IFVpbnQ4QXJyYXkoWzBdKSwgZGF0YSk7XG4gIH1cbiAgcmV0dXJuIGNvbmNhdGVuYXRlKG5ldyBVaW50OEFycmF5KFsxXSksIGNvbXByZXNzZWQuc2xpY2UoMCwgY29tcHJlc3NlZFNpemUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuY29tcHJlc3MoZGF0YTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCByZWFsRGF0YSA9IGRhdGEuc2xpY2UoMSk7XG4gIGlmIChkYXRhWzBdID09PSAwKSB7XG4gICAgcmV0dXJuIHJlYWxEYXRhO1xuICB9XG4gIGNvbnN0IGRzdCA9IG5ldyBVaW50OEFycmF5KGNhbGNVbmNvbXByZXNzZWRMZW4ocmVhbERhdGEpKTtcbiAgY29uc3QgdW5jb21wcmVzc2VkU2l6ZSA9IHVuY29tcHJlc3NCbG9jayhyZWFsRGF0YSwgZHN0KTtcbiAgcmV0dXJuIGRzdC5zbGljZSgwLCB1bmNvbXByZXNzZWRTaXplKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FDRUEsbUJBREYsRUFFRUMsa0JBRkYsRUFHRUMsZUFIRixFQUlFQyxlQUpGLFFBS08sVUFMUDtBQU1BLFNBQVNDLFdBQVQsUUFBNEIsbUJBQTVCO0FBRUEsT0FBTyxTQUFTQyxRQUFULENBQWtCQyxJQUFsQixFQUFnRDtFQUNyRCxJQUFJQSxJQUFJLENBQUNDLFVBQUwsR0FBa0IsUUFBdEIsRUFBa0M7SUFDaEMsT0FBT0gsV0FBVyxDQUFDLElBQUlJLFVBQUosQ0FBZSxDQUFDLENBQUQsQ0FBZixDQUFELEVBQXNCRixJQUF0QixDQUFsQjtFQUNEOztFQUNELE1BQU1HLFVBQVUsR0FBRyxJQUFJRCxVQUFKLENBQWVQLGtCQUFrQixDQUFDSyxJQUFJLENBQUNDLFVBQU4sQ0FBakMsQ0FBbkI7RUFDQSxNQUFNRyxjQUFjLEdBQUdSLGVBQWUsQ0FBQ0ksSUFBRCxFQUFPRyxVQUFQLEVBQW1CLENBQW5CLENBQXRDOztFQUNBLElBQUlDLGNBQWMsS0FBSyxDQUF2QixFQUEwQjtJQUN4QixPQUFPTixXQUFXLENBQUMsSUFBSUksVUFBSixDQUFlLENBQUMsQ0FBRCxDQUFmLENBQUQsRUFBc0JGLElBQXRCLENBQWxCO0VBQ0Q7O0VBQ0QsT0FBT0YsV0FBVyxDQUFDLElBQUlJLFVBQUosQ0FBZSxDQUFDLENBQUQsQ0FBZixDQUFELEVBQXNCQyxVQUFVLENBQUNFLEtBQVgsQ0FBaUIsQ0FBakIsRUFBb0JELGNBQXBCLENBQXRCLENBQWxCO0FBQ0Q7QUFFRCxPQUFPLFNBQVNFLFVBQVQsQ0FBb0JOLElBQXBCLEVBQWtEO0VBQ3ZELE1BQU1PLFFBQVEsR0FBR1AsSUFBSSxDQUFDSyxLQUFMLENBQVcsQ0FBWCxDQUFqQjs7RUFDQSxJQUFJTCxJQUFJLENBQUMsQ0FBRCxDQUFKLEtBQVksQ0FBaEIsRUFBbUI7SUFDakIsT0FBT08sUUFBUDtFQUNEOztFQUNELE1BQU1DLEdBQUcsR0FBRyxJQUFJTixVQUFKLENBQWVSLG1CQUFtQixDQUFDYSxRQUFELENBQWxDLENBQVo7RUFDQSxNQUFNRSxnQkFBZ0IsR0FBR1osZUFBZSxDQUFDVSxRQUFELEVBQVdDLEdBQVgsQ0FBeEM7RUFDQSxPQUFPQSxHQUFHLENBQUNILEtBQUosQ0FBVSxDQUFWLEVBQWFJLGdCQUFiLENBQVA7QUFDRCJ9
|
package/dist/minify/lz4.js
CHANGED
|
@@ -30,66 +30,66 @@
|
|
|
30
30
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
31
31
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
32
|
*/
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
const errInvalidSource = new Error("invalid source");
|
|
34
|
+
const errShortBuffer = new Error("short buffer"); // The following constants are used to setup the compression algorithm.
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
const minMatch = 4; // the minimum size of the match sequence size (4 bytes)
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
const winSizeLog = 16; // LZ4 64Kb window size limit
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
const winSize = 1 << winSizeLog;
|
|
41
|
+
const winMask = winSize - 1; // 64Kb window of previous data for dependent blocks
|
|
42
42
|
// hashSizeLog determines the size of the hash table used to quickly find a previous match position.
|
|
43
43
|
// Its value influences the compression speed and memory usage, the lower the faster,
|
|
44
44
|
// but at the expense of the compression ratio.
|
|
45
45
|
// 16 seems to be the best compromise.
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
const hashSizeLog = 16;
|
|
48
|
+
const hashSize = 1 << hashSizeLog;
|
|
49
|
+
const hashShift = minMatch * 8 - hashSizeLog;
|
|
50
|
+
const mfLimit = 8 + minMatch; // The last match cannot start within the last 12 bytes.
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
const skipStrength = 6; // variable step for fast scan
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
const hasher = 2654435761 | 0; // prime number used to hash minMatch
|
|
55
55
|
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/imul#Polyfill
|
|
56
56
|
|
|
57
57
|
function imulPolyfill(a, b) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
const ah = a >>> 16 & 0xffff;
|
|
59
|
+
const al = a & 0xffff;
|
|
60
|
+
const bh = b >>> 16 & 0xffff;
|
|
61
|
+
const bl = b & 0xffff; // the shift by 0 fixes the sign on the high part
|
|
62
62
|
// the final |0 converts the unsigned value into a signed value
|
|
63
63
|
|
|
64
64
|
return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
const imul = Math.imul ? Math.imul : imulPolyfill;
|
|
68
68
|
|
|
69
69
|
function getUint32(a, i) {
|
|
70
70
|
return a[i + 3] | a[i + 2] << 8 | a[i + 1] << 16 | a[i] << 24;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
function copy(dest, src, di, si, len) {
|
|
74
|
-
for (
|
|
74
|
+
for (let i = 0; i < len; ++i) {
|
|
75
75
|
dest[di++] = src[si++];
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
export function calcUncompressedLen(src) {
|
|
80
|
-
|
|
80
|
+
const sn = src.length;
|
|
81
81
|
|
|
82
82
|
if (sn === 0) {
|
|
83
83
|
return 0;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
let si = 0;
|
|
87
|
+
let di = 0;
|
|
88
88
|
|
|
89
89
|
while (true) {
|
|
90
90
|
// literals and match lengths (token)
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
let lLen = src[si] >> 4;
|
|
92
|
+
let mLen = src[si] & 0xf;
|
|
93
93
|
|
|
94
94
|
if (++si === sn) {
|
|
95
95
|
throw errInvalidSource;
|
|
@@ -127,7 +127,7 @@ export function calcUncompressedLen(src) {
|
|
|
127
127
|
throw errInvalidSource;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
const offset = src[si - 2] | src[si - 1] << 8;
|
|
131
131
|
|
|
132
132
|
if (di - offset < 0 || offset === 0) {
|
|
133
133
|
throw errInvalidSource;
|
|
@@ -161,20 +161,20 @@ export function calcUncompressedLen(src) {
|
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
export function uncompressBlock(src, dest) {
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
const sn = src.length;
|
|
165
|
+
const dn = dest.length;
|
|
166
166
|
|
|
167
167
|
if (sn === 0) {
|
|
168
168
|
return 0;
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
|
|
172
|
-
|
|
171
|
+
let si = 0;
|
|
172
|
+
let di = 0;
|
|
173
173
|
|
|
174
174
|
while (true) {
|
|
175
175
|
// literals and match lengths (token)
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
let lLen = src[si] >> 4;
|
|
177
|
+
let mLen = src[si] & 0xf;
|
|
178
178
|
|
|
179
179
|
if (++si === sn) {
|
|
180
180
|
throw errInvalidSource;
|
|
@@ -217,7 +217,7 @@ export function uncompressBlock(src, dest) {
|
|
|
217
217
|
throw errInvalidSource;
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
const offset = src[si - 2] | src[si - 1] << 8;
|
|
221
221
|
|
|
222
222
|
if (di - offset < 0 || offset === 0) {
|
|
223
223
|
throw errInvalidSource;
|
|
@@ -261,36 +261,35 @@ export function compressBlockBound(n) {
|
|
|
261
261
|
return n + (n / 255 | 0) + 16;
|
|
262
262
|
}
|
|
263
263
|
export function compressBlock(src, dest, soffset) {
|
|
264
|
-
|
|
265
|
-
|
|
264
|
+
const sn = src.length - mfLimit;
|
|
265
|
+
const dn = dest.length;
|
|
266
266
|
|
|
267
267
|
if (sn <= 0 || dn === 0 || soffset >= sn) {
|
|
268
268
|
return 0;
|
|
269
269
|
}
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
let si = 0,
|
|
272
272
|
di = 0; // fast scan strategy:
|
|
273
273
|
// we only need a hash table to store the last sequences (4 bytes)
|
|
274
274
|
|
|
275
|
-
|
|
275
|
+
const hashTable = new Uint32Array(hashSize); // Initialise the hash table with the first 64Kb of the input buffer
|
|
276
276
|
// (used when compressing dependent blocks)
|
|
277
277
|
|
|
278
278
|
while (si < soffset) {
|
|
279
|
-
|
|
279
|
+
const h = imul(getUint32(src, si), hasher) >>> hashShift;
|
|
280
280
|
hashTable[h] = ++si;
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
-
|
|
284
|
-
|
|
283
|
+
let anchor = si;
|
|
284
|
+
let fma = 1 << skipStrength;
|
|
285
285
|
|
|
286
286
|
while (si < sn - minMatch) {
|
|
287
287
|
// hash the next 4 bytes (sequence)...
|
|
288
|
-
|
|
288
|
+
const h = imul(getUint32(src, si), hasher) >>> hashShift; // -1 to separate existing entries from new ones
|
|
289
289
|
|
|
290
|
+
const ref = hashTable[h] - 1; // ...and store the position of the hash in the hash table (+1 to compensate the -1 upon saving)
|
|
290
291
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
hashTable[_h] = si + 1; // no need to check the last 3 bytes in the first literal 4 bytes as
|
|
292
|
+
hashTable[h] = si + 1; // no need to check the last 3 bytes in the first literal 4 bytes as
|
|
294
293
|
// this guarantees that the next match, if any, is compressed with
|
|
295
294
|
// a lower size, since to have some compression we must have:
|
|
296
295
|
// ll+ml-overlap > 1 + (ll-15)/255 + (ml-4-15)/255 + 2 (uncompressed size>compressed size)
|
|
@@ -311,13 +310,11 @@ export function compressBlock(src, dest, soffset) {
|
|
|
311
310
|
|
|
312
311
|
|
|
313
312
|
fma = 1 << skipStrength;
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
var offset = si - ref; // encode match length part 1
|
|
313
|
+
const lLen = si - anchor;
|
|
314
|
+
const offset = si - ref; // encode match length part 1
|
|
318
315
|
|
|
319
316
|
si += minMatch;
|
|
320
|
-
|
|
317
|
+
let mLen = si; // match length has minMatch already
|
|
321
318
|
|
|
322
319
|
while (si <= sn && src[si] === src[si - offset]) {
|
|
323
320
|
si++;
|
|
@@ -332,8 +329,8 @@ export function compressBlock(src, dest, soffset) {
|
|
|
332
329
|
} // encode literals length
|
|
333
330
|
|
|
334
331
|
|
|
335
|
-
if (
|
|
336
|
-
dest[di] |=
|
|
332
|
+
if (lLen < 0xf) {
|
|
333
|
+
dest[di] |= lLen << 4;
|
|
337
334
|
} else {
|
|
338
335
|
dest[di] |= 0xf0;
|
|
339
336
|
|
|
@@ -341,7 +338,7 @@ export function compressBlock(src, dest, soffset) {
|
|
|
341
338
|
throw errShortBuffer;
|
|
342
339
|
}
|
|
343
340
|
|
|
344
|
-
|
|
341
|
+
let l = lLen - 0xf;
|
|
345
342
|
|
|
346
343
|
for (; l >= 0xff; l -= 0xff) {
|
|
347
344
|
dest[di] = 0xff;
|
|
@@ -359,12 +356,12 @@ export function compressBlock(src, dest, soffset) {
|
|
|
359
356
|
} // literals
|
|
360
357
|
|
|
361
358
|
|
|
362
|
-
if (di +
|
|
359
|
+
if (di + lLen >= dn) {
|
|
363
360
|
throw errShortBuffer;
|
|
364
361
|
}
|
|
365
362
|
|
|
366
|
-
copy(dest, src, di, anchor,
|
|
367
|
-
di +=
|
|
363
|
+
copy(dest, src, di, anchor, lLen);
|
|
364
|
+
di += lLen;
|
|
368
365
|
anchor = si; // encode offset
|
|
369
366
|
|
|
370
367
|
di += 2;
|
|
@@ -399,7 +396,7 @@ export function compressBlock(src, dest, soffset) {
|
|
|
399
396
|
} // last literals
|
|
400
397
|
|
|
401
398
|
|
|
402
|
-
|
|
399
|
+
let lLen = src.length - anchor;
|
|
403
400
|
|
|
404
401
|
if (lLen < 0xf) {
|
|
405
402
|
dest[di] = lLen << 4;
|
|
@@ -426,8 +423,8 @@ export function compressBlock(src, dest, soffset) {
|
|
|
426
423
|
} // write literals
|
|
427
424
|
|
|
428
425
|
|
|
429
|
-
|
|
430
|
-
|
|
426
|
+
const lastLen = src.length - anchor;
|
|
427
|
+
const n = di + lastLen;
|
|
431
428
|
|
|
432
429
|
if (n > dn) {
|
|
433
430
|
throw errShortBuffer;
|
|
@@ -441,46 +438,45 @@ export function compressBlock(src, dest, soffset) {
|
|
|
441
438
|
return di;
|
|
442
439
|
}
|
|
443
440
|
export function compressBlockHC(src, dest, soffset) {
|
|
444
|
-
|
|
445
|
-
|
|
441
|
+
const sn = src.length - mfLimit;
|
|
442
|
+
const dn = dest.length;
|
|
446
443
|
|
|
447
444
|
if (sn <= 0 || dn === 0 || soffset >= sn) {
|
|
448
445
|
return 0;
|
|
449
446
|
}
|
|
450
447
|
|
|
451
|
-
|
|
452
|
-
|
|
448
|
+
let si = 0;
|
|
449
|
+
let di = 0; // Hash Chain strategy:
|
|
453
450
|
// we need a hash table and a chain table
|
|
454
451
|
// the chain table cannot contain more entries than the window size (64Kb entries)
|
|
455
452
|
|
|
456
|
-
|
|
457
|
-
|
|
453
|
+
const hashTable = new Uint32Array(hashSize);
|
|
454
|
+
const chainTable = new Uint32Array(winSize); // Initialise the hash table with the first 64Kb of the input buffer
|
|
458
455
|
// (used when compressing dependent blocks)
|
|
459
456
|
|
|
460
457
|
while (si < soffset) {
|
|
461
|
-
|
|
458
|
+
const h = imul(getUint32(src, si), hasher) >>> hashShift;
|
|
462
459
|
chainTable[si & winMask] = hashTable[h];
|
|
463
460
|
hashTable[h] = ++si;
|
|
464
461
|
}
|
|
465
462
|
|
|
466
|
-
|
|
463
|
+
let anchor = si;
|
|
467
464
|
|
|
468
465
|
while (si < sn - minMatch) {
|
|
469
466
|
// hash the next 4 bytes (sequence)...
|
|
470
|
-
|
|
471
|
-
|
|
467
|
+
const h = imul(getUint32(src, si), hasher) >>> hashShift; // follow the chain until out of window and give the longest match
|
|
472
468
|
|
|
473
|
-
|
|
474
|
-
|
|
469
|
+
let mLen = 0;
|
|
470
|
+
let offset = 0;
|
|
475
471
|
|
|
476
|
-
for (
|
|
472
|
+
for (let next = hashTable[h] - 1; next > 0 && next > si - winSize; next = chainTable[next & winMask] - 1) {
|
|
477
473
|
// the first (mLen==0) or next byte (mLen>=minMatch) at current match length must match to improve on the match length
|
|
478
474
|
if (src[next + mLen] === src[si + mLen]) {
|
|
479
|
-
for (
|
|
480
|
-
if (src[next +
|
|
475
|
+
for (let ml = 0;; ++ml) {
|
|
476
|
+
if (src[next + ml] !== src[si + ml] || si + ml > sn) {
|
|
481
477
|
// found a longer match, keep its position and length
|
|
482
|
-
if (mLen <
|
|
483
|
-
mLen =
|
|
478
|
+
if (mLen < ml && ml >= minMatch) {
|
|
479
|
+
mLen = ml;
|
|
484
480
|
offset = si - next;
|
|
485
481
|
}
|
|
486
482
|
|
|
@@ -490,28 +486,26 @@ export function compressBlockHC(src, dest, soffset) {
|
|
|
490
486
|
}
|
|
491
487
|
}
|
|
492
488
|
|
|
493
|
-
chainTable[si & winMask] = hashTable[
|
|
494
|
-
hashTable[
|
|
489
|
+
chainTable[si & winMask] = hashTable[h];
|
|
490
|
+
hashTable[h] = si + 1; // no match found
|
|
495
491
|
|
|
496
492
|
if (mLen === 0) {
|
|
497
493
|
++si;
|
|
498
494
|
continue;
|
|
499
495
|
}
|
|
500
496
|
|
|
501
|
-
|
|
502
|
-
|
|
497
|
+
let si2 = si + 1;
|
|
498
|
+
const ml = si + mLen; // match found
|
|
503
499
|
// update hash/chain tables with overlaping bytes:
|
|
504
500
|
// si already hashed, add everything from si+1 up to the match length
|
|
505
501
|
|
|
506
502
|
while (si2 < ml) {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
hashTable[_h3] = ++si2;
|
|
503
|
+
const h = imul(getUint32(src, si2), hasher) >>> hashShift;
|
|
504
|
+
chainTable[si2 & winMask] = hashTable[h];
|
|
505
|
+
hashTable[h] = ++si2;
|
|
511
506
|
}
|
|
512
507
|
|
|
513
|
-
|
|
514
|
-
|
|
508
|
+
const lLen = si - anchor;
|
|
515
509
|
si += mLen;
|
|
516
510
|
mLen -= minMatch; // match length does not include minMatch
|
|
517
511
|
|
|
@@ -522,8 +516,8 @@ export function compressBlockHC(src, dest, soffset) {
|
|
|
522
516
|
} // encode literals length
|
|
523
517
|
|
|
524
518
|
|
|
525
|
-
if (
|
|
526
|
-
dest[di] |=
|
|
519
|
+
if (lLen < 0xf) {
|
|
520
|
+
dest[di] |= lLen << 4;
|
|
527
521
|
} else {
|
|
528
522
|
dest[di] |= 0xf0;
|
|
529
523
|
|
|
@@ -531,7 +525,7 @@ export function compressBlockHC(src, dest, soffset) {
|
|
|
531
525
|
throw errShortBuffer;
|
|
532
526
|
}
|
|
533
527
|
|
|
534
|
-
|
|
528
|
+
let l = lLen - 0xf;
|
|
535
529
|
|
|
536
530
|
for (; l >= 0xff; l -= 0xff) {
|
|
537
531
|
dest[di] = 0xff;
|
|
@@ -549,12 +543,12 @@ export function compressBlockHC(src, dest, soffset) {
|
|
|
549
543
|
} // literals
|
|
550
544
|
|
|
551
545
|
|
|
552
|
-
if (di +
|
|
546
|
+
if (di + lLen >= dn) {
|
|
553
547
|
throw errShortBuffer;
|
|
554
548
|
}
|
|
555
549
|
|
|
556
|
-
copy(dest, src, di, anchor,
|
|
557
|
-
di +=
|
|
550
|
+
copy(dest, src, di, anchor, lLen);
|
|
551
|
+
di += lLen;
|
|
558
552
|
anchor = si; // encode offset
|
|
559
553
|
|
|
560
554
|
di += 2;
|
|
@@ -589,7 +583,7 @@ export function compressBlockHC(src, dest, soffset) {
|
|
|
589
583
|
} // last literals
|
|
590
584
|
|
|
591
585
|
|
|
592
|
-
|
|
586
|
+
let lLen = src.length - anchor;
|
|
593
587
|
|
|
594
588
|
if (lLen < 0xf) {
|
|
595
589
|
dest[di] = lLen << 4;
|
|
@@ -616,8 +610,8 @@ export function compressBlockHC(src, dest, soffset) {
|
|
|
616
610
|
} // write literals
|
|
617
611
|
|
|
618
612
|
|
|
619
|
-
|
|
620
|
-
|
|
613
|
+
const lastLen = src.length - anchor;
|
|
614
|
+
const n = di + lastLen;
|
|
621
615
|
|
|
622
616
|
if (n > dn) {
|
|
623
617
|
throw errShortBuffer;
|
|
@@ -630,4 +624,4 @@ export function compressBlockHC(src, dest, soffset) {
|
|
|
630
624
|
di += lastLen;
|
|
631
625
|
return di;
|
|
632
626
|
}
|
|
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==
|
|
627
|
+
//# 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+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLGdCQUFnQixHQUFHLElBQUlDLEtBQUosQ0FBVSxnQkFBVixDQUF6QjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxJQUFJRCxLQUFKLENBQVUsY0FBVixDQUF2QixDLENBRUE7O0FBQ0EsTUFBTUUsUUFBUSxHQUFHLENBQWpCLEMsQ0FBb0I7O0FBQ3BCLE1BQU1DLFVBQVUsR0FBRyxFQUFuQixDLENBQXVCOztBQUN2QixNQUFNQyxPQUFPLEdBQUcsS0FBS0QsVUFBckI7QUFDQSxNQUFNRSxPQUFPLEdBQUdELE9BQU8sR0FBRyxDQUExQixDLENBQTZCO0FBRTdCO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1FLFdBQVcsR0FBRyxFQUFwQjtBQUNBLE1BQU1DLFFBQVEsR0FBRyxLQUFLRCxXQUF0QjtBQUNBLE1BQU1FLFNBQVMsR0FBR04sUUFBUSxHQUFHLENBQVgsR0FBZUksV0FBakM7QUFFQSxNQUFNRyxPQUFPLEdBQUcsSUFBSVAsUUFBcEIsQyxDQUE4Qjs7QUFDOUIsTUFBTVEsWUFBWSxHQUFHLENBQXJCLEMsQ0FBd0I7O0FBRXhCLE1BQU1DLE1BQU0sR0FBRyxhQUFhLENBQTVCLEMsQ0FBK0I7QUFFL0I7O0FBQ0EsU0FBU0MsWUFBVCxDQUFzQkMsQ0FBdEIsRUFBaUNDLENBQWpDLEVBQW9EO0VBQ2xELE1BQU1DLEVBQUUsR0FBSUYsQ0FBQyxLQUFLLEVBQVAsR0FBYSxN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
|