@oathompsonjones/mini-games 1.0.6 → 1.0.9
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/TODO.md +6 -0
- package/build/base/board.d.ts +53 -45
- package/build/base/board.js +84 -72
- package/build/base/controller.d.ts +48 -37
- package/build/base/controller.js +32 -26
- package/build/bitBoard/bitBoard.d.ts +37 -34
- package/build/bitBoard/bitBoard.js +15 -12
- package/build/bitBoard/intBitBoard.d.ts +22 -22
- package/build/bitBoard/intBitBoard.js +16 -16
- package/build/bitBoard/longInt.d.ts +47 -40
- package/build/bitBoard/longInt.js +40 -37
- package/build/bitBoard/longIntBitBoard.d.ts +26 -26
- package/build/bitBoard/longIntBitBoard.js +16 -16
- package/build/console.d.ts +2 -3
- package/build/console.js +3 -4
- package/build/games/connect4/board.d.ts +12 -5
- package/build/games/connect4/board.js +12 -6
- package/build/games/connect4/controller.d.ts +18 -11
- package/build/games/connect4/controller.js +20 -12
- package/build/games/tictactoe/board.d.ts +5 -2
- package/build/games/tictactoe/board.js +5 -2
- package/build/games/tictactoe/controller.d.ts +17 -12
- package/build/games/tictactoe/controller.js +19 -13
- package/eslint.config.js +1 -1
- package/package.json +6 -7
- package/patches/eventemitter3@5.0.1.patch +0 -68
|
@@ -8,7 +8,7 @@ export default class LongInt {
|
|
|
8
8
|
data;
|
|
9
9
|
/**
|
|
10
10
|
* Creates an instance of LongInt.
|
|
11
|
-
* @param args The arguments to construct the `LongInt` out of.
|
|
11
|
+
* @param args - The arguments to construct the `LongInt` out of.
|
|
12
12
|
*/
|
|
13
13
|
constructor(args) {
|
|
14
14
|
if (args instanceof Array || args instanceof Uint32Array)
|
|
@@ -18,14 +18,17 @@ export default class LongInt {
|
|
|
18
18
|
else
|
|
19
19
|
this.data = new Uint32Array(args).fill(0);
|
|
20
20
|
}
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Gets the number of 32-bit words which make the LongInt.
|
|
23
|
+
* @returns The number of words.
|
|
24
|
+
*/
|
|
22
25
|
get wordCount() {
|
|
23
26
|
return this.data.length;
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* Carries out a bitwise and (&) operation on the two numbers.
|
|
27
|
-
* @param left The left number.
|
|
28
|
-
* @param right The right number.
|
|
30
|
+
* @param left - The left number.
|
|
31
|
+
* @param right - The right number.
|
|
29
32
|
* @returns The result of left & right.
|
|
30
33
|
*/
|
|
31
34
|
static and(left, right) {
|
|
@@ -33,8 +36,8 @@ export default class LongInt {
|
|
|
33
36
|
}
|
|
34
37
|
/**
|
|
35
38
|
* Carries out a bitwise or (|) operation on the two numbers.
|
|
36
|
-
* @param left The left number.
|
|
37
|
-
* @param right The right number.
|
|
39
|
+
* @param left - The left number.
|
|
40
|
+
* @param right - The right number.
|
|
38
41
|
* @returns The result of left | right.
|
|
39
42
|
*/
|
|
40
43
|
static or(left, right) {
|
|
@@ -42,8 +45,8 @@ export default class LongInt {
|
|
|
42
45
|
}
|
|
43
46
|
/**
|
|
44
47
|
* Carries out a bitwise xor (^) operation on the two numbers.
|
|
45
|
-
* @param left The left number.
|
|
46
|
-
* @param right The right number.
|
|
48
|
+
* @param left - The left number.
|
|
49
|
+
* @param right - The right number.
|
|
47
50
|
* @returns The result of left ^ right.
|
|
48
51
|
*/
|
|
49
52
|
static xor(left, right) {
|
|
@@ -51,7 +54,7 @@ export default class LongInt {
|
|
|
51
54
|
}
|
|
52
55
|
/**
|
|
53
56
|
* Carries out a bitwise not (~) operation on the number.
|
|
54
|
-
* @param number The number to negate.
|
|
57
|
+
* @param number - The number to negate.
|
|
55
58
|
* @returns The result of ~number.
|
|
56
59
|
*/
|
|
57
60
|
static not(number) {
|
|
@@ -59,8 +62,8 @@ export default class LongInt {
|
|
|
59
62
|
}
|
|
60
63
|
/**
|
|
61
64
|
* Carries out a bitwise left shift (<<) operation on the number.
|
|
62
|
-
* @param number The number to shift.
|
|
63
|
-
* @param shiftAmount The number of places to shift.
|
|
65
|
+
* @param number - The number to shift.
|
|
66
|
+
* @param shiftAmount - The number of places to shift.
|
|
64
67
|
* @returns The result of number << shiftAmount.
|
|
65
68
|
*/
|
|
66
69
|
static leftShift(number, shiftAmount) {
|
|
@@ -68,8 +71,8 @@ export default class LongInt {
|
|
|
68
71
|
}
|
|
69
72
|
/**
|
|
70
73
|
* Carries out a bitwise unsigned right shift (>>>) operation on the number.
|
|
71
|
-
* @param number The number to shift.
|
|
72
|
-
* @param shiftAmount The number of places to shift.
|
|
74
|
+
* @param number - The number to shift.
|
|
75
|
+
* @param shiftAmount - The number of places to shift.
|
|
73
76
|
* @returns The result of number >>> shiftAmount.
|
|
74
77
|
*/
|
|
75
78
|
static rightShift(number, shiftAmount) {
|
|
@@ -77,8 +80,8 @@ export default class LongInt {
|
|
|
77
80
|
}
|
|
78
81
|
/**
|
|
79
82
|
* Carries out a bitwise arithmetic right shift (>>) operation on the number.
|
|
80
|
-
* @param number The number to shift.
|
|
81
|
-
* @param shiftAmount The number of places to shift.
|
|
83
|
+
* @param number - The number to shift.
|
|
84
|
+
* @param shiftAmount - The number of places to shift.
|
|
82
85
|
* @returns The result of number >> shiftAmount.
|
|
83
86
|
*/
|
|
84
87
|
static arithmeticRightShift(number, shiftAmount) {
|
|
@@ -86,8 +89,8 @@ export default class LongInt {
|
|
|
86
89
|
}
|
|
87
90
|
/**
|
|
88
91
|
* Determines whether or not 2 LongInts have equal values.
|
|
89
|
-
* @param longInt1 The first LongInt.
|
|
90
|
-
* @param longInt2 The second LongInt (can also be a number).
|
|
92
|
+
* @param longInt1 - The first LongInt.
|
|
93
|
+
* @param longInt2 - The second LongInt (can also be a number).
|
|
91
94
|
* @returns Whether or not they are equal.
|
|
92
95
|
*/
|
|
93
96
|
static equals(longInt1, longInt2) {
|
|
@@ -95,8 +98,8 @@ export default class LongInt {
|
|
|
95
98
|
}
|
|
96
99
|
/**
|
|
97
100
|
* Creates a LongInt with the same dimensions as this one, using the given input.
|
|
98
|
-
* @param longInt The LongInt to match the dimensions of.
|
|
99
|
-
* @param value The value of the LongInt.
|
|
101
|
+
* @param longInt - The LongInt to match the dimensions of.
|
|
102
|
+
* @param value - The value of the LongInt to create.
|
|
100
103
|
* @returns The new LongInt.
|
|
101
104
|
*/
|
|
102
105
|
static getMatchingLongInt(longInt, value = 0) {
|
|
@@ -104,7 +107,7 @@ export default class LongInt {
|
|
|
104
107
|
}
|
|
105
108
|
/**
|
|
106
109
|
* Carries out an in-place bitwise and (&) operation on this number and the one provided.
|
|
107
|
-
* @param right The right number.
|
|
110
|
+
* @param right - The right number.
|
|
108
111
|
* @returns The new value of this & right.
|
|
109
112
|
*/
|
|
110
113
|
and(right) {
|
|
@@ -115,7 +118,7 @@ export default class LongInt {
|
|
|
115
118
|
}
|
|
116
119
|
/**
|
|
117
120
|
* Carries out an in-place bitwise or (|) operation on this number and the one provided.
|
|
118
|
-
* @param right The right number.
|
|
121
|
+
* @param right - The right number.
|
|
119
122
|
* @returns The new value of this | right.
|
|
120
123
|
*/
|
|
121
124
|
or(right) {
|
|
@@ -126,7 +129,7 @@ export default class LongInt {
|
|
|
126
129
|
}
|
|
127
130
|
/**
|
|
128
131
|
* Carries out an in-place bitwise xor (^) operation on this number and the one provided.
|
|
129
|
-
* @param right The right number.
|
|
132
|
+
* @param right - The right number.
|
|
130
133
|
* @returns The new value of this ^ right.
|
|
131
134
|
*/
|
|
132
135
|
xor(right) {
|
|
@@ -146,7 +149,7 @@ export default class LongInt {
|
|
|
146
149
|
}
|
|
147
150
|
/**
|
|
148
151
|
* Carries out an in-place bitwise left shift (<<) operation on this number.
|
|
149
|
-
* @param shiftAmount The number of places to shift.
|
|
152
|
+
* @param shiftAmount - The number of places to shift.
|
|
150
153
|
* @returns The result of this << shiftAmount.
|
|
151
154
|
*/
|
|
152
155
|
leftShift(shiftAmount) {
|
|
@@ -163,9 +166,9 @@ export default class LongInt {
|
|
|
163
166
|
}
|
|
164
167
|
/**
|
|
165
168
|
* Carries out an in-place bitwise unsigned right shift (>>>) operation on this number.
|
|
166
|
-
* @param shiftAmount The number of places to shift.
|
|
169
|
+
* @param shiftAmount - The number of places to shift.
|
|
167
170
|
* @returns The result of this >>> shiftAmount.
|
|
168
|
-
|
|
171
|
+
*/
|
|
169
172
|
rightShift(shiftAmount) {
|
|
170
173
|
if (shiftAmount === 0)
|
|
171
174
|
return this;
|
|
@@ -180,7 +183,7 @@ export default class LongInt {
|
|
|
180
183
|
}
|
|
181
184
|
/**
|
|
182
185
|
* Carries out an in-place bitwise arithmetic right shift (>>) operation on this number.
|
|
183
|
-
* @param shiftAmount The number of places to shift.
|
|
186
|
+
* @param shiftAmount - The number of places to shift.
|
|
184
187
|
* @returns The result of this >> shiftAmount.
|
|
185
188
|
*/
|
|
186
189
|
arithmeticRightShift(shiftAmount) {
|
|
@@ -197,7 +200,7 @@ export default class LongInt {
|
|
|
197
200
|
}
|
|
198
201
|
/**
|
|
199
202
|
* Determines whether or not this LongInt has equal value to another.
|
|
200
|
-
* @param value The LongInt or number to compare to.
|
|
203
|
+
* @param value - The LongInt or number to compare to.
|
|
201
204
|
* @returns Whether or not they are equal.
|
|
202
205
|
*/
|
|
203
206
|
equals(value) {
|
|
@@ -213,19 +216,19 @@ export default class LongInt {
|
|
|
213
216
|
}
|
|
214
217
|
/**
|
|
215
218
|
* Returns a string representation of the LongInt.
|
|
216
|
-
* @param type The base of the string to print.
|
|
219
|
+
* @param type - The base of the string to print.
|
|
217
220
|
* @returns The string representation.
|
|
218
221
|
*/
|
|
219
222
|
toString(type) {
|
|
220
223
|
let padLength = 0;
|
|
221
224
|
switch (type) {
|
|
222
|
-
case 2
|
|
225
|
+
case 2 /* StringType.BINARY */:
|
|
223
226
|
padLength = 32;
|
|
224
227
|
break;
|
|
225
|
-
case 10
|
|
228
|
+
case 10 /* StringType.DECIMAL */:
|
|
226
229
|
padLength = 10;
|
|
227
230
|
break;
|
|
228
|
-
case 16
|
|
231
|
+
case 16 /* StringType.HEXADECIMAL */:
|
|
229
232
|
padLength = 8;
|
|
230
233
|
break;
|
|
231
234
|
}
|
|
@@ -236,7 +239,7 @@ export default class LongInt {
|
|
|
236
239
|
}
|
|
237
240
|
/**
|
|
238
241
|
* Creates a LongInt with the same dimensions as this one, using the given input.
|
|
239
|
-
* @param value The value of the LongInt.
|
|
242
|
+
* @param value - The value of the LongInt to create.
|
|
240
243
|
* @returns The new LongInt.
|
|
241
244
|
*/
|
|
242
245
|
getMatchingLongInt(value = 0) {
|
|
@@ -274,8 +277,8 @@ export default class LongInt {
|
|
|
274
277
|
}
|
|
275
278
|
/**
|
|
276
279
|
* Shifts the 32-bit number array to the right.
|
|
277
|
-
* @param count How many places to shift the array.
|
|
278
|
-
* @param fillValue The value to fill empty spaces with.
|
|
280
|
+
* @param count - How many places to shift the array.
|
|
281
|
+
* @param fillValue - The value to fill empty spaces with.
|
|
279
282
|
* @returns The new value of this.
|
|
280
283
|
*/
|
|
281
284
|
shiftArrayRight(count, fillValue = 0) {
|
|
@@ -287,8 +290,8 @@ export default class LongInt {
|
|
|
287
290
|
}
|
|
288
291
|
/**
|
|
289
292
|
* Shifts the 32-bit number array to the left.
|
|
290
|
-
* @param count How many places to shift the array.
|
|
291
|
-
* @param fillValue The value to fill empty spaces with.
|
|
293
|
+
* @param count - How many places to shift the array.
|
|
294
|
+
* @param fillValue - The value to fill empty spaces with.
|
|
292
295
|
* @returns The new value of this.
|
|
293
296
|
*/
|
|
294
297
|
shiftArrayLeft(count, fillValue = 0) {
|
|
@@ -299,4 +302,4 @@ export default class LongInt {
|
|
|
299
302
|
return this;
|
|
300
303
|
}
|
|
301
304
|
}
|
|
302
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9uZ0ludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaXRCb2FyZC9sb25nSW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLE9BQU87SUFDeEIseUNBQXlDO0lBQ3pCLElBQUksQ0FBYztJQWlCbEM7OztPQUdHO0lBQ0gsWUFBbUIsSUFBK0M7UUFDOUQsSUFBSSxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxXQUFXO1lBQ3BELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakMsSUFBSSxJQUFJLFlBQVksT0FBTztZQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFFdkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQWEsRUFBRSxLQUF1QjtRQUNwRCxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQWEsRUFBRSxLQUF1QjtRQUNuRCxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQWEsRUFBRSxL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QixDQUFDO1FBQ3hELElBQUksS0FBSyxHQUFHLENBQUM7WUFDVCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUM7UUFFckQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssY0FBYyxDQUFDLEtBQWEsRUFBRSxZQUFvQixDQUFDO1FBQ3ZELElBQUksS0FBSyxHQUFHLENBQUM7WUFDVCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUVyRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTdHJpbmdUeXBlID0gMiB8IDEwIHwgMTY7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvbmcgaW50ZWdlciB1c2luZyBhbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycy5cbiAqIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBiaXR3aXNlIG9wZXJhdGlvbnMgd2hpY2ggZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgdmFsdWVzLlxuICogUHJvdmlkZXMgbm9uLXN0YXRpYyBlcXVpdmFsZW50cyB0byB0aGUgYWJvdmUgb3BlcmF0aW9ucywgd2hpY2ggYXJlIGNhcnJpZWQgb3V0IGluIHBsYWNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb25nSW50IHtcbiAgICAvKiogSG9sZHMgdGhlIGFycmF5IG9mIDMyLWJpdCBudW1iZXJzLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkYXRhOiBVaW50MzJBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTG9uZ0ludC5cbiAgICAgKiBAcGFyYW0gdmFsdWVzIEEgbGl0dGxlLWVuZGlhbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycyB0byBmaWxsIHRoZSBgTG9uZ0ludGAuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHZhbHVlczogbnVtYmVyW10gfCBVaW50MzJBcnJheSk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMb25nSW50LlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiAzMi1iaXQgbnVtYmVycyB0byBjb25zdHJ1Y3QgdGhlIGBMb25nSW50YCBvdXQgb2YuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyKTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIExvbmdJbnQuXG4gICAgICogQHBhcmFtIGxvbmdJbnQgQSBgTG9uZ0ludGAgb2JqZWN0IHRvIGR1cGxpY2F0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobG9uZ0ludDogTG9uZ0ludCk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMb25nSW50LlxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gY29uc3RydWN0IHRoZSBgTG9uZ0ludGAgb3V0IG9mLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihhcmdzOiBMb25nSW50IHwgbnVtYmVyW10gfCBVaW50MzJBcnJheSB8IG51bWJlcikge1xuICAgICAgICBpZiAoYXJncyBpbnN0YW5jZW9mIEFycmF5IHx8IGFyZ3MgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheShhcmdzKTtcbiAgICAgICAgZWxzZSBpZiAoYXJncyBpbnN0YW5jZW9mIExvbmdJbnQpXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDMyQXJyYXkoYXJncy5kYXRhKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQzMkFycmF5KGFyZ3MpLmZpbGwoMCk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgdGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgd2hpY2ggbWFrZSB0aGUgTG9uZ0ludC4gKi9cbiAgICBwdWJsaWMgZ2V0IHdvcmRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgYW5kICgmKSBvcGVyYXRpb24gb24gdGhlIHR3byBudW1iZXJzLlxuICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IG51bWJlci5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGxlZnQgJiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGFuZChsZWZ0OiBMb25nSW50LCByaWdodDogTG9uZ0ludCB8IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobGVmdCkuYW5kKHJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugb3IgKHwpIG9wZXJhdGlvbiBvbiB0aGUgdHdvIG51bWJlcnMuXG4gICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgbnVtYmVyLlxuICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbGVmdCB8IHJpZ2h0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgb3IobGVmdDogTG9uZ0ludCwgcmlnaHQ6IExvbmdJbnQgfCBudW1iZXIpOiBMb25nSW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50KGxlZnQpLm9yKHJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgeG9yICheKSBvcGVyYXRpb24gb24gdGhlIHR3byBudW1iZXJzLlxuICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IG51bWJlci5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGxlZnQgXiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHhvcihsZWZ0OiBMb25nSW50LCByaWdodDogTG9uZ0ludCB8IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobGVmdCkueG9yKHJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugbm90ICh+KSBvcGVyYXRpb24gb24gdGhlIG51bWJlci5cbiAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBudW1iZXIgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2Ygfm51bWJlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIG5vdChudW1iZXI6IExvbmdJbnQpOiBMb25nSW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50KG51bWJlcikubm90KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIGxlZnQgc2hpZnQgKDw8KSBvcGVyYXRpb24gb24gdGhlIG51bWJlci5cbiAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBudW1iZXIgdG8gc2hpZnQuXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IFRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHNoaWZ0LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbnVtYmVyIDw8IHNoaWZ0QW1vdW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbGVmdFNoaWZ0KG51bWJlcjogTG9uZ0ludCwgc2hpZnRBbW91bnQ6IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobnVtYmVyKS5sZWZ0U2hpZnQoc2hpZnRBbW91bnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSB1bnNpZ25lZCByaWdodCBzaGlmdCAoPj4+KSBvcGVyYXRpb24gb24gdGhlIG51bWJlci5cbiAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBudW1iZXIgdG8gc2hpZnQuXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IFRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHNoaWZ0LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbnVtYmVyID4+PiBzaGlmdEFtb3VudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJpZ2h0U2hpZnQobnVtYmVyOiBMb25nSW50LCBzaGlmdEFtb3VudDogbnVtYmVyKTogTG9uZ0ludCB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludChudW1iZXIpLnJpZ2h0U2hpZnQoc2hpZnRBbW91bnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0ICg+Pikgb3BlcmF0aW9uIG9uIHRoZSBudW1iZXIuXG4gICAgICogQHBhcmFtIG51bWJlciBUaGUgbnVtYmVyIHRvIHNoaWZ0LlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIG51bWJlciA+PiBzaGlmdEFtb3VudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGFyaXRobWV0aWNSaWdodFNoaWZ0KG51bWJlcjogTG9uZ0ludCwgc2hpZnRBbW91bnQ6IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobnVtYmVyKS5hcml0aG1ldGljUmlnaHRTaGlmdChzaGlmdEFtb3VudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCAyIExvbmdJbnRzIGhhdmUgZXF1YWwgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBsb25nSW50MSBUaGUgZmlyc3QgTG9uZ0ludC5cbiAgICAgKiBAcGFyYW0gbG9uZ0ludDIgVGhlIHNlY29uZCBMb25nSW50IChjYW4gYWxzbyBiZSBhIG51bWJlcikuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhleSBhcmUgZXF1YWwuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBlcXVhbHMobG9uZ0ludDE6IExvbmdJbnQsIGxvbmdJbnQyOiBMb25nSW50IHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBsb25nSW50MS5lcXVhbHMobG9uZ0ludDIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIHN0cmV0Y2hlZCBvciB0cnVuY2F0ZWQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB0aGlzLlxuICAgICAqIEBwYXJhbSBsb25nSW50IFRoZSBMb25nSW50IHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgTG9uZ0ludCBvYmplY3QgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNYXRjaGluZ0xvbmdJbnQobG9uZ0ludDogTG9uZ0ludCwgdmFsdWU6IExvbmdJbnQpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIHZhbHVlLCBzdHJldGNoZWQgb3IgdHJ1bmNhdGVkIHRvIHRoZSBzYW1lIHNpemUgYXMgdGhpcy5cbiAgICAgKiBAcGFyYW0gbG9uZ0ludCBUaGUgTG9uZ0ludCB0byBtYXRjaCB0aGUgZGltZW5zaW9ucyBvZi5cbiAgICAgKiBAcGFyYW0gdmFsdWVzIEFuIGFycmF5IG9mIDMyLWJpdCBudW1iZXJzIHRvIHVzZSBhcyB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWF0Y2hpbmdMb25nSW50KGxvbmdJbnQ6IExvbmdJbnQsIHZhbHVlczogbnVtYmVyW10gfCBVaW50MzJBcnJheSk6IExvbmdJbnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBMb25nSW50IG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gdmFsdWUsIHN0cmV0Y2hlZCBvciB0cnVuY2F0ZWQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB0aGlzLlxuICAgICAqIEBwYXJhbSBsb25nSW50IFRoZSBMb25nSW50IHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBBIDMyLWJpdCBudW1iZXIgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNYXRjaGluZ0xvbmdJbnQobG9uZ0ludDogTG9uZ0ludCwgdmFsdWU/OiBudW1iZXIpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb25nSW50IHdpdGggdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGlzIG9uZSwgdXNpbmcgdGhlIGdpdmVuIGlucHV0LlxuICAgICAqIEBwYXJhbSBsb25nSW50IFRoZSBMb25nSW50IHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIExvbmdJbnQuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWF0Y2hpbmdMb25nSW50KGxvbmdJbnQ6IExvbmdJbnQsIHZhbHVlOiBMb25nSW50IHwgbnVtYmVyW10gfCBVaW50MzJBcnJheSB8IG51bWJlciA9IDApOiBMb25nSW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50KGxvbmdJbnQpLmdldE1hdGNoaW5nTG9uZ0ludCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYW4gaW4tcGxhY2UgYml0d2lzZSBhbmQgKCYpIG9wZXJhdGlvbiBvbiB0aGlzIG51bWJlciBhbmQgdGhlIG9uZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHZhbHVlIG9mIHRoaXMgJiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYW5kKHJpZ2h0OiBMb25nSW50IHwgbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IHJpZ2h0TG9uZ0ludCA9IHRoaXMuZ2V0TWF0Y2hpbmdMb25nSW50KHJpZ2h0KTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSAmPSByaWdodExvbmdJbnQuZGF0YVtpXSE7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYW4gaW4tcGxhY2UgYml0d2lzZSBvciAofCkgb3BlcmF0aW9uIG9uIHRoaXMgbnVtYmVyIGFuZCB0aGUgb25lIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgdmFsdWUgb2YgdGhpcyB8IHJpZ2h0LlxuICAgICAqL1xuICAgIHB1YmxpYyBvcihyaWdodDogTG9uZ0ludCB8IG51bWJlcik6IHRoaXMge1xuICAgICAgICBjb25zdCByaWdodExvbmdJbnQgPSB0aGlzLmdldE1hdGNoaW5nTG9uZ0ludChyaWdodCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gfD0gcmlnaHRMb25nSW50LmRhdGFbaV0hO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGFuIGluLXBsYWNlIGJpdHdpc2UgeG9yICheKSBvcGVyYXRpb24gb24gdGhpcyBudW1iZXIgYW5kIHRoZSBvbmUgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBudW1iZXIuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyB2YWx1ZSBvZiB0aGlzIF4gcmlnaHQuXG4gICAgICovXG4gICAgcHVibGljIHhvcihyaWdodDogTG9uZ0ludCB8IG51bWJlcik6IHRoaXMge1xuICAgICAgICBjb25zdCByaWdodExvbmdJbnQgPSB0aGlzLmdldE1hdGNoaW5nTG9uZ0ludChyaWdodCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gXj0gcmlnaHRMb25nSW50LmRhdGFbaV0hO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGFuIGluLXBsYWNlIGJpdHdpc2Ugbm90ICh+KSBvcGVyYXRpb24gb24gdGhpcyBudXJtYmUuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB+dGhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbm90KCk6IHRoaXMge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IH50aGlzLmRhdGFbaV0hO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGFuIGluLXBsYWNlIGJpdHdpc2UgbGVmdCBzaGlmdCAoPDwpIG9wZXJhdGlvbiBvbiB0aGlzIG51bWJlci5cbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgVGhlIG51bWJlciBvZiBwbGFjZXMgdG8gc2hpZnQuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGlzIDw8IHNoaWZ0QW1vdW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZWZ0U2hpZnQoc2hpZnRBbW91bnQ6IG51bWJlcik6IHRoaXMge1xuICAgICAgICBpZiAoc2hpZnRBbW91bnQgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAoc2hpZnRBbW91bnQgPiAzMSlcbiAgICAgICAgICAgIHRoaXMuc2hpZnRBcnJheVJpZ2h0KE1hdGguZmxvb3Ioc2hpZnRBbW91bnQgLyAzMikpO1xuXG4gICAgICAgIGlmIChzaGlmdEFtb3VudCAhPT0gMzIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZVNoaWZ0QW1vdW50ID0gc2hpZnRBbW91bnQgJSAzMjtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbaV0hIDw8IHNpbmdsZVNoaWZ0QW1vdW50IHwgdGhpcy5kYXRhW2kgLSAxXSEgPj4+IDMyIC0gc2luZ2xlU2hpZnRBbW91bnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhbiBpbi1wbGFjZSBiaXR3aXNlIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0ICg+Pj4pIG9wZXJhdGlvbiBvbiB0aGlzIG51bWJlci5cbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgVGhlIG51bWJlciBvZiBwbGFjZXMgdG8gc2hpZnQuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGlzID4+PiBzaGlmdEFtb3VudC5cbiAgICAqL1xuICAgIHB1YmxpYyByaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ICE9PSAzMikge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlU2hpZnRBbW91bnQgPSBzaGlmdEFtb3VudCAlIDMyO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbaV0hID4+PiBzaW5nbGVTaGlmdEFtb3VudCB8IHRoaXMuZGF0YVtpICsgMV0hIDw8IDMyIC0gc2luZ2xlU2hpZnRBbW91bnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hpZnRBbW91bnQgPiAzMSlcbiAgICAgICAgICAgIHRoaXMuc2hpZnRBcnJheUxlZnQoTWF0aC5mbG9vcihzaGlmdEFtb3VudCAvIDMyKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYW4gaW4tcGxhY2UgYml0d2lzZSBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0ICg+Pikgb3BlcmF0aW9uIG9uIHRoaXMgbnVtYmVyLlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoaXMgPj4gc2hpZnRBbW91bnQuXG4gICAgICovXG4gICAgcHVibGljIGFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ICE9PSAzMikge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlU2hpZnRBbW91bnQgPSBzaGlmdEFtb3VudCAlIDMyO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbaV0hID4+IHNpbmdsZVNoaWZ0QW1vdW50IHwgdGhpcy5kYXRhW2kgKyAxXSEgPDwgMzIgLSBzaW5nbGVTaGlmdEFtb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaGlmdEFtb3VudCA+IDMxKVxuICAgICAgICAgICAgdGhpcy5zaGlmdEFycmF5TGVmdChNYXRoLmZsb29yKHNoaWZ0QW1vdW50IC8gMzIpLCB+MCA+Pj4gMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGlzIExvbmdJbnQgaGFzIGVxdWFsIHZhbHVlIHRvIGFub3RoZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBMb25nSW50IG9yIG51bWJlciB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIHB1YmxpYyBlcXVhbHModmFsdWU6IExvbmdJbnQgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbG9uZ0ludCA9IHZhbHVlIGluc3RhbmNlb2YgTG9uZ0ludCA/IHZhbHVlIDogbmV3IExvbmdJbnQoW3ZhbHVlXSk7XG4gICAgICAgIGNvbnN0IGxvbmdlc3RMb25nSW50ID0gdGhpcy5kYXRhLmxlbmd0aCA+IGxvbmdJbnQuZGF0YS5sZW5ndGggPyB0aGlzIDogbG9uZ0ludDtcbiAgICAgICAgY29uc3QgbG9uZ0ludDEgPSBMb25nSW50LmdldE1hdGNoaW5nTG9uZ0ludChsb25nZXN0TG9uZ0ludCwgdGhpcyk7XG4gICAgICAgIGNvbnN0IGxvbmdJbnQyID0gTG9uZ0ludC5nZXRNYXRjaGluZ0xvbmdJbnQobG9uZ2VzdExvbmdJbnQsIGxvbmdJbnQpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9uZ2VzdExvbmdJbnQuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxvbmdJbnQxLmRhdGFbaV0gIT09IGxvbmdJbnQyLmRhdGFbaV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgTG9uZ0ludC5cbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgYmFzZSBvZiB0aGUgc3RyaW5nIHRvIHByaW50LlxuICAgICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKHR5cGU6IFN0cmluZ1R5cGUpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcGFkTGVuZ3RoID0gMDtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBwYWRMZW5ndGggPSAzMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgcGFkTGVuZ3RoID0gMTA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgIHBhZExlbmd0aCA9IDg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gWy4uLnRoaXMuZGF0YV1cbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5tYXAoKG51bSkgPT4gbnVtLnRvU3RyaW5nKHR5cGUpLnBhZFN0YXJ0KHBhZExlbmd0aCwgXCIwXCIpKVxuICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIHN0cmV0Y2hlZCBvciB0cnVuY2F0ZWQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB0aGlzLlxuICAgICAqIEBwYXJhbSBsb25nSW50IFRoZSBMb25nSW50IG9iamVjdCB0byB1c2UgYXMgdGhlIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgTG9uZ0ludC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nTG9uZ0ludChsb25nSW50OiBMb25nSW50KTogTG9uZ0ludDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IExvbmdJbnQgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiB2YWx1ZSwgc3RyZXRjaGVkIG9yIHRydW5jYXRlZCB0byB0aGUgc2FtZSBzaXplIGFzIHRoaXMuXG4gICAgICogQHBhcmFtIHZhbHVlcyBBbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycyB0byB1c2UgYXMgdGhlIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgTG9uZ0ludC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nTG9uZ0ludCh2YWx1ZXM6IG51bWJlcltdIHwgVWludDMyQXJyYXkpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIHZhbHVlLCBzdHJldGNoZWQgb3IgdHJ1bmNhdGVkIHRvIHRoZSBzYW1lIHNpemUgYXMgdGhpcy5cbiAgICAgKiBAcGFyYW0gdmFsdWUgQSAzMi1iaXQgbnVtYmVyIHRvIHVzZSBhcyB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdMb25nSW50KHZhbHVlPzogbnVtYmVyKTogTG9uZ0ludDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9uZ0ludCB3aXRoIHRoZSBzYW1lIGRpbWVuc2lvbnMgYXMgdGhpcyBvbmUsIHVzaW5nIHRoZSBnaXZlbiBpbnB1dC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBMb25nSW50LlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgTG9uZ0ludC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nTG9uZ0ludCh2YWx1ZTogTG9uZ0ludCB8IG51bWJlcltdIHwgVWludDMyQXJyYXkgfCBudW1iZXIpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb25nSW50IHdpdGggdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGlzIG9uZSwgdXNpbmcgdGhlIGdpdmVuIGlucHV0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIExvbmdJbnQuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdMb25nSW50KHZhbHVlOiBMb25nSW50IHwgbnVtYmVyW10gfCBVaW50MzJBcnJheSB8IG51bWJlciA9IDApOiBMb25nSW50IHtcbiAgICAgICAgbGV0IGludGVnZXJzOiBudW1iZXJbXSB8IFVpbnQzMkFycmF5ID0gW107XG5cbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICBjYXNlIHZhbHVlIGluc3RhbmNlb2YgVWludDMyQXJyYXk6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMuZGF0YS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gWy4uLnZhbHVlLCAuLi5BcnJheTxudW1iZXI+KHRoaXMuZGF0YS5sZW5ndGggLSB2YWx1ZS5sZW5ndGgpLmZpbGwoMCldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IHRoaXMuZGF0YS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gdmFsdWUuc2xpY2UoMCwgdGhpcy5kYXRhLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHZhbHVlIGluc3RhbmNlb2YgTG9uZ0ludDpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuZGF0YS5sZW5ndGggPCB0aGlzLmRhdGEubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IFsuLi52YWx1ZS5kYXRhLCAuLi5BcnJheTxudW1iZXI+KHRoaXMuZGF0YS5sZW5ndGggLSB2YWx1ZS5kYXRhLmxlbmd0aCkuZmlsbCgwKV07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZGF0YS5sZW5ndGggPiB0aGlzLmRhdGEubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IHZhbHVlLmRhdGEuc2xpY2UoMCwgdGhpcy5kYXRhLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IHZhbHVlLmRhdGE7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgdmFsdWUgaW5zdGFuY2VvZiBBcnJheTpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDwgdGhpcy5kYXRhLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSBbLi4udmFsdWUsIC4uLkFycmF5PG51bWJlcj4odGhpcy5kYXRhLmxlbmd0aCAtIHZhbHVlLmxlbmd0aCkuZmlsbCgwKV07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gdGhpcy5kYXRhLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSB2YWx1ZS5zbGljZSgwLCB0aGlzLmRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaW50ZWdlcnMgPSBbdmFsdWUsIC4uLkFycmF5PG51bWJlcj4odGhpcy5kYXRhLmxlbmd0aCAtIDEpLmZpbGwoMCldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50KGludGVnZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaGlmdHMgdGhlIDMyLWJpdCBudW1iZXIgYXJyYXkgdG8gdGhlIHJpZ2h0LlxuICAgICAqIEBwYXJhbSBjb3VudCBIb3cgbWFueSBwbGFjZXMgdG8gc2hpZnQgdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSBmaWxsVmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgZW1wdHkgc3BhY2VzIHdpdGguXG4gICAgICogQHJldHVybnMgVGhlIG5ldyB2YWx1ZSBvZiB0aGlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2hpZnRBcnJheVJpZ2h0KGNvdW50OiBudW1iZXIsIGZpbGxWYWx1ZTogbnVtYmVyID0gMCk6IHRoaXMge1xuICAgICAgICBpZiAoY291bnQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hpZnRBcnJheUxlZnQoLWNvdW50LCBmaWxsVmFsdWUpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbaSAtIGNvdW50XSA/PyBmaWxsVmFsdWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hpZnRzIHRoZSAzMi1iaXQgbnVtYmVyIGFycmF5IHRvIHRoZSBsZWZ0LlxuICAgICAqIEBwYXJhbSBjb3VudCBIb3cgbWFueSBwbGFjZXMgdG8gc2hpZnQgdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSBmaWxsVmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgZW1wdHkgc3BhY2VzIHdpdGguXG4gICAgICogQHJldHVybnMgVGhlIG5ldyB2YWx1ZSBvZiB0aGlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2hpZnRBcnJheUxlZnQoY291bnQ6IG51bWJlciwgZmlsbFZhbHVlOiBudW1iZXIgPSAwKTogdGhpcyB7XG4gICAgICAgIGlmIChjb3VudCA8IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaGlmdEFycmF5UmlnaHQoLWNvdW50LCBmaWxsVmFsdWUpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5kYXRhW2ldID0gdGhpcy5kYXRhW2kgKyBjb3VudF0gPz8gZmlsbFZhbHVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiJdfQ==
|
|
305
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9uZ0ludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaXRCb2FyZC9sb25nSW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLE9BQU87SUFDeEIseUNBQXlDO0lBQ3pCLElBQUksQ0FBYztJQWlCbEM7OztPQUdHO0lBQ0gsWUFBbUIsSUFBK0M7UUFDOUQsSUFBSSxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxXQUFXO1lBQ3BELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakMsSUFBSSxJQUFJLFlBQVksT0FBTztZQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFFdkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBYSxFQUFFLEtBQXVCO1FBQ3BELE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBYSxFQUFFLEtBQXVCO1FBQ25ELE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBYSxFQUFFLEtB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QztZQUNULE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVsRCxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUVyRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxjQUFjLENBQUMsS0FBYSxFQUFFLFlBQW9CLENBQUM7UUFDdkQsSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDO1FBRXJELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBlbnVtIFN0cmluZ1R5cGUge1xuICAgIEJJTkFSWSA9IDIsXG4gICAgREVDSU1BTCA9IDEwLFxuICAgIEhFWEFERUNJTUFMID0gMTYsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvbmcgaW50ZWdlciB1c2luZyBhbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycy5cbiAqIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBiaXR3aXNlIG9wZXJhdGlvbnMgd2hpY2ggZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgdmFsdWVzLlxuICogUHJvdmlkZXMgbm9uLXN0YXRpYyBlcXVpdmFsZW50cyB0byB0aGUgYWJvdmUgb3BlcmF0aW9ucywgd2hpY2ggYXJlIGNhcnJpZWQgb3V0IGluIHBsYWNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb25nSW50IHtcbiAgICAvKiogSG9sZHMgdGhlIGFycmF5IG9mIDMyLWJpdCBudW1iZXJzLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkYXRhOiBVaW50MzJBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTG9uZ0ludC5cbiAgICAgKiBAcGFyYW0gdmFsdWVzIC0gQSBsaXR0bGUtZW5kaWFuIGFycmF5IG9mIDMyLWJpdCBudW1iZXJzIHRvIGZpbGwgdGhlIGBMb25nSW50YC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IodmFsdWVzOiBudW1iZXJbXSB8IFVpbnQzMkFycmF5KTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIExvbmdJbnQuXG4gICAgICogQHBhcmFtIGxlbmd0aCAtIFRoZSBudW1iZXIgb2YgMzItYml0IG51bWJlcnMgdG8gY29uc3RydWN0IHRoZSBgTG9uZ0ludGAgb3V0IG9mLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihsZW5ndGg6IG51bWJlcik7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMb25nSW50LlxuICAgICAqIEBwYXJhbSBsb25nSW50IC0gQSBgTG9uZ0ludGAgb2JqZWN0IHRvIGR1cGxpY2F0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobG9uZ0ludDogTG9uZ0ludCk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMb25nSW50LlxuICAgICAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBjb25zdHJ1Y3QgdGhlIGBMb25nSW50YCBvdXQgb2YuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGFyZ3M6IExvbmdJbnQgfCBudW1iZXJbXSB8IFVpbnQzMkFycmF5IHwgbnVtYmVyKSB7XG4gICAgICAgIGlmIChhcmdzIGluc3RhbmNlb2YgQXJyYXkgfHwgYXJncyBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KVxuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQzMkFycmF5KGFyZ3MpO1xuICAgICAgICBlbHNlIGlmIChhcmdzIGluc3RhbmNlb2YgTG9uZ0ludClcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheShhcmdzLmRhdGEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDMyQXJyYXkoYXJncykuZmlsbCgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHdoaWNoIG1ha2UgdGhlIExvbmdJbnQuXG4gICAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiB3b3Jkcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHdvcmRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgYW5kICgmKSBvcGVyYXRpb24gb24gdGhlIHR3byBudW1iZXJzLlxuICAgICAqIEBwYXJhbSBsZWZ0IC0gVGhlIGxlZnQgbnVtYmVyLlxuICAgICAqIEBwYXJhbSByaWdodCAtIFRoZSByaWdodCBudW1iZXIuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBsZWZ0ICYgcmlnaHQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhbmQobGVmdDogTG9uZ0ludCwgcmlnaHQ6IExvbmdJbnQgfCBudW1iZXIpOiBMb25nSW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50KGxlZnQpLmFuZChyaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIG9yICh8KSBvcGVyYXRpb24gb24gdGhlIHR3byBudW1iZXJzLlxuICAgICAqIEBwYXJhbSBsZWZ0IC0gVGhlIGxlZnQgbnVtYmVyLlxuICAgICAqIEBwYXJhbSByaWdodCAtIFRoZSByaWdodCBudW1iZXIuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBsZWZ0IHwgcmlnaHQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBvcihsZWZ0OiBMb25nSW50LCByaWdodDogTG9uZ0ludCB8IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobGVmdCkub3IocmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSB4b3IgKF4pIG9wZXJhdGlvbiBvbiB0aGUgdHdvIG51bWJlcnMuXG4gICAgICogQHBhcmFtIGxlZnQgLSBUaGUgbGVmdCBudW1iZXIuXG4gICAgICogQHBhcmFtIHJpZ2h0IC0gVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGxlZnQgXiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHhvcihsZWZ0OiBMb25nSW50LCByaWdodDogTG9uZ0ludCB8IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobGVmdCkueG9yKHJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugbm90ICh+KSBvcGVyYXRpb24gb24gdGhlIG51bWJlci5cbiAgICAgKiBAcGFyYW0gbnVtYmVyIC0gVGhlIG51bWJlciB0byBuZWdhdGUuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB+bnVtYmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm90KG51bWJlcjogTG9uZ0ludCk6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobnVtYmVyKS5ub3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgbGVmdCBzaGlmdCAoPDwpIG9wZXJhdGlvbiBvbiB0aGUgbnVtYmVyLlxuICAgICAqIEBwYXJhbSBudW1iZXIgLSBUaGUgbnVtYmVyIHRvIHNoaWZ0LlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCAtIFRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHNoaWZ0LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbnVtYmVyIDw8IHNoaWZ0QW1vdW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbGVmdFNoaWZ0KG51bWJlcjogTG9uZ0ludCwgc2hpZnRBbW91bnQ6IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobnVtYmVyKS5sZWZ0U2hpZnQoc2hpZnRBbW91bnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSB1bnNpZ25lZCByaWdodCBzaGlmdCAoPj4+KSBvcGVyYXRpb24gb24gdGhlIG51bWJlci5cbiAgICAgKiBAcGFyYW0gbnVtYmVyIC0gVGhlIG51bWJlciB0byBzaGlmdC5cbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgLSBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIG51bWJlciA+Pj4gc2hpZnRBbW91bnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByaWdodFNoaWZ0KG51bWJlcjogTG9uZ0ludCwgc2hpZnRBbW91bnQ6IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobnVtYmVyKS5yaWdodFNoaWZ0KHNoaWZ0QW1vdW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgYXJpdGhtZXRpYyByaWdodCBzaGlmdCAoPj4pIG9wZXJhdGlvbiBvbiB0aGUgbnVtYmVyLlxuICAgICAqIEBwYXJhbSBudW1iZXIgLSBUaGUgbnVtYmVyIHRvIHNoaWZ0LlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCAtIFRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHNoaWZ0LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbnVtYmVyID4+IHNoaWZ0QW1vdW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXJpdGhtZXRpY1JpZ2h0U2hpZnQobnVtYmVyOiBMb25nSW50LCBzaGlmdEFtb3VudDogbnVtYmVyKTogTG9uZ0ludCB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludChudW1iZXIpLmFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IDIgTG9uZ0ludHMgaGF2ZSBlcXVhbCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGxvbmdJbnQxIC0gVGhlIGZpcnN0IExvbmdJbnQuXG4gICAgICogQHBhcmFtIGxvbmdJbnQyIC0gVGhlIHNlY29uZCBMb25nSW50IChjYW4gYWxzbyBiZSBhIG51bWJlcikuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhleSBhcmUgZXF1YWwuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBlcXVhbHMobG9uZ0ludDE6IExvbmdJbnQsIGxvbmdJbnQyOiBMb25nSW50IHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBsb25nSW50MS5lcXVhbHMobG9uZ0ludDIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIHN0cmV0Y2hlZCBvciB0cnVuY2F0ZWQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB0aGlzLlxuICAgICAqIEBwYXJhbSBsb25nSW50IC0gVGhlIExvbmdJbnQgdG8gbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIExvbmdJbnQgb2JqZWN0IHRvIHVzZSBhcyB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWF0Y2hpbmdMb25nSW50KGxvbmdJbnQ6IExvbmdJbnQsIHZhbHVlOiBMb25nSW50KTogTG9uZ0ludDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IExvbmdJbnQgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiB2YWx1ZSwgc3RyZXRjaGVkIG9yIHRydW5jYXRlZCB0byB0aGUgc2FtZSBzaXplIGFzIHRoaXMuXG4gICAgICogQHBhcmFtIGxvbmdJbnQgLSBUaGUgTG9uZ0ludCB0byBtYXRjaCB0aGUgZGltZW5zaW9ucyBvZi5cbiAgICAgKiBAcGFyYW0gdmFsdWVzIC0gQW4gYXJyYXkgb2YgMzItYml0IG51bWJlcnMgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNYXRjaGluZ0xvbmdJbnQobG9uZ0ludDogTG9uZ0ludCwgdmFsdWVzOiBudW1iZXJbXSB8IFVpbnQzMkFycmF5KTogTG9uZ0ludDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IExvbmdJbnQgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiB2YWx1ZSwgc3RyZXRjaGVkIG9yIHRydW5jYXRlZCB0byB0aGUgc2FtZSBzaXplIGFzIHRoaXMuXG4gICAgICogQHBhcmFtIGxvbmdJbnQgLSBUaGUgTG9uZ0ludCB0byBtYXRjaCB0aGUgZGltZW5zaW9ucyBvZi5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIDMyLWJpdCBudW1iZXIgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNYXRjaGluZ0xvbmdJbnQobG9uZ0ludDogTG9uZ0ludCwgdmFsdWU/OiBudW1iZXIpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb25nSW50IHdpdGggdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGlzIG9uZSwgdXNpbmcgdGhlIGdpdmVuIGlucHV0LlxuICAgICAqIEBwYXJhbSBsb25nSW50IC0gVGhlIExvbmdJbnQgdG8gbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBMb25nSW50IHRvIGNyZWF0ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNYXRjaGluZ0xvbmdJbnQobG9uZ0ludDogTG9uZ0ludCwgdmFsdWU6IExvbmdJbnQgfCBudW1iZXJbXSB8IFVpbnQzMkFycmF5IHwgbnVtYmVyID0gMCk6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobG9uZ0ludCkuZ2V0TWF0Y2hpbmdMb25nSW50KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhbiBpbi1wbGFjZSBiaXR3aXNlIGFuZCAoJikgb3BlcmF0aW9uIG9uIHRoaXMgbnVtYmVyIGFuZCB0aGUgb25lIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSByaWdodCAtIFRoZSByaWdodCBudW1iZXIuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyB2YWx1ZSBvZiB0aGlzICYgcmlnaHQuXG4gICAgICovXG4gICAgcHVibGljIGFuZChyaWdodDogTG9uZ0ludCB8IG51bWJlcik6IHRoaXMge1xuICAgICAgICBjb25zdCByaWdodExvbmdJbnQgPSB0aGlzLmdldE1hdGNoaW5nTG9uZ0ludChyaWdodCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0hICY9IHJpZ2h0TG9uZ0ludC5kYXRhW2ldITtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhbiBpbi1wbGFjZSBiaXR3aXNlIG9yICh8KSBvcGVyYXRpb24gb24gdGhpcyBudW1iZXIgYW5kIHRoZSBvbmUgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHJpZ2h0IC0gVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHZhbHVlIG9mIHRoaXMgfCByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3IocmlnaHQ6IExvbmdJbnQgfCBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgcmlnaHRMb25nSW50ID0gdGhpcy5nZXRNYXRjaGluZ0xvbmdJbnQocmlnaHQpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5kYXRhW2ldISB8PSByaWdodExvbmdJbnQuZGF0YVtpXSE7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYW4gaW4tcGxhY2UgYml0d2lzZSB4b3IgKF4pIG9wZXJhdGlvbiBvbiB0aGlzIG51bWJlciBhbmQgdGhlIG9uZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBUaGUgcmlnaHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgdmFsdWUgb2YgdGhpcyBeIHJpZ2h0LlxuICAgICAqL1xuICAgIHB1YmxpYyB4b3IocmlnaHQ6IExvbmdJbnQgfCBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgcmlnaHRMb25nSW50ID0gdGhpcy5nZXRNYXRjaGluZ0xvbmdJbnQocmlnaHQpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5kYXRhW2ldISBePSByaWdodExvbmdJbnQuZGF0YVtpXSE7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYW4gaW4tcGxhY2UgYml0d2lzZSBub3QgKH4pIG9wZXJhdGlvbiBvbiB0aGlzIG51cm1iZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIH50aGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyBub3QoKTogdGhpcyB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5kYXRhW2ldID0gfnRoaXMuZGF0YVtpXSE7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYW4gaW4tcGxhY2UgYml0d2lzZSBsZWZ0IHNoaWZ0ICg8PCkgb3BlcmF0aW9uIG9uIHRoaXMgbnVtYmVyLlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCAtIFRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHNoaWZ0LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhpcyA8PCBzaGlmdEFtb3VudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGVmdFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID4gMzEpXG4gICAgICAgICAgICB0aGlzLnNoaWZ0QXJyYXlSaWdodChNYXRoLmZsb29yKHNoaWZ0QW1vdW50IC8gMzIpKTtcblxuICAgICAgICBpZiAoc2hpZnRBbW91bnQgIT09IDMyKSB7XG4gICAgICAgICAgICBjb25zdCBzaW5nbGVTaGlmdEFtb3VudCA9IHNoaWZ0QW1vdW50ICUgMzI7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhW2ldID0gdGhpcy5kYXRhW2ldISA8PCBzaW5nbGVTaGlmdEFtb3VudCB8IHRoaXMuZGF0YVtpIC0gMV0hID4+PiAzMiAtIHNpbmdsZVNoaWZ0QW1vdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYW4gaW4tcGxhY2UgYml0d2lzZSB1bnNpZ25lZCByaWdodCBzaGlmdCAoPj4+KSBvcGVyYXRpb24gb24gdGhpcyBudW1iZXIuXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IC0gVGhlIG51bWJlciBvZiBwbGFjZXMgdG8gc2hpZnQuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGlzID4+PiBzaGlmdEFtb3VudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmlnaHRTaGlmdChzaGlmdEFtb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIGlmIChzaGlmdEFtb3VudCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChzaGlmdEFtb3VudCAhPT0gMzIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZVNoaWZ0QW1vdW50ID0gc2hpZnRBbW91bnQgJSAzMjtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhW2ldID0gdGhpcy5kYXRhW2ldISA+Pj4gc2luZ2xlU2hpZnRBbW91bnQgfCB0aGlzLmRhdGFbaSArIDFdISA8PCAzMiAtIHNpbmdsZVNoaWZ0QW1vdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID4gMzEpXG4gICAgICAgICAgICB0aGlzLnNoaWZ0QXJyYXlMZWZ0KE1hdGguZmxvb3Ioc2hpZnRBbW91bnQgLyAzMikpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGFuIGluLXBsYWNlIGJpdHdpc2UgYXJpdGhtZXRpYyByaWdodCBzaGlmdCAoPj4pIG9wZXJhdGlvbiBvbiB0aGlzIG51bWJlci5cbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgLSBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoaXMgPj4gc2hpZnRBbW91bnQuXG4gICAgICovXG4gICAgcHVibGljIGFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ICE9PSAzMikge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlU2hpZnRBbW91bnQgPSBzaGlmdEFtb3VudCAlIDMyO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbaV0hID4+IHNpbmdsZVNoaWZ0QW1vdW50IHwgdGhpcy5kYXRhW2kgKyAxXSEgPDwgMzIgLSBzaW5nbGVTaGlmdEFtb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaGlmdEFtb3VudCA+IDMxKVxuICAgICAgICAgICAgdGhpcy5zaGlmdEFycmF5TGVmdChNYXRoLmZsb29yKHNoaWZ0QW1vdW50IC8gMzIpLCB+MCA+Pj4gMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGlzIExvbmdJbnQgaGFzIGVxdWFsIHZhbHVlIHRvIGFub3RoZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIExvbmdJbnQgb3IgbnVtYmVyIHRvIGNvbXBhcmUgdG8uXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhleSBhcmUgZXF1YWwuXG4gICAgICovXG4gICAgcHVibGljIGVxdWFscyh2YWx1ZTogTG9uZ0ludCB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsb25nSW50ID0gdmFsdWUgaW5zdGFuY2VvZiBMb25nSW50ID8gdmFsdWUgOiBuZXcgTG9uZ0ludChbdmFsdWVdKTtcbiAgICAgICAgY29uc3QgbG9uZ2VzdExvbmdJbnQgPSB0aGlzLmRhdGEubGVuZ3RoID4gbG9uZ0ludC5kYXRhLmxlbmd0aCA/IHRoaXMgOiBsb25nSW50O1xuICAgICAgICBjb25zdCBsb25nSW50MSA9IExvbmdJbnQuZ2V0TWF0Y2hpbmdMb25nSW50KGxvbmdlc3RMb25nSW50LCB0aGlzKTtcbiAgICAgICAgY29uc3QgbG9uZ0ludDIgPSBMb25nSW50LmdldE1hdGNoaW5nTG9uZ0ludChsb25nZXN0TG9uZ0ludCwgbG9uZ0ludCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb25nZXN0TG9uZ0ludC5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobG9uZ0ludDEuZGF0YVtpXSAhPT0gbG9uZ0ludDIuZGF0YVtpXSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBMb25nSW50LlxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIGJhc2Ugb2YgdGhlIHN0cmluZyB0byBwcmludC5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZyh0eXBlOiBTdHJpbmdUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHBhZExlbmd0aCA9IDA7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFN0cmluZ1R5cGUuQklOQVJZOlxuICAgICAgICAgICAgICAgIHBhZExlbmd0aCA9IDMyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdHJpbmdUeXBlLkRFQ0lNQUw6XG4gICAgICAgICAgICAgICAgcGFkTGVuZ3RoID0gMTA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN0cmluZ1R5cGUuSEVYQURFQ0lNQUw6XG4gICAgICAgICAgICAgICAgcGFkTGVuZ3RoID0gODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbLi4udGhpcy5kYXRhXVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLm1hcCgobnVtKSA9PiBudW0udG9TdHJpbmcodHlwZSkucGFkU3RhcnQocGFkTGVuZ3RoLCBcIjBcIikpXG4gICAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBMb25nSW50IG9iamVjdCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSwgc3RyZXRjaGVkIG9yIHRydW5jYXRlZCB0byB0aGUgc2FtZSBzaXplIGFzIHRoaXMuXG4gICAgICogQHBhcmFtIGxvbmdJbnQgLSBUaGUgTG9uZ0ludCBvYmplY3QgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRNYXRjaGluZ0xvbmdJbnQobG9uZ0ludDogTG9uZ0ludCk6IExvbmdJbnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBMb25nSW50IG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gdmFsdWUsIHN0cmV0Y2hlZCBvciB0cnVuY2F0ZWQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB0aGlzLlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgLSBBbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycyB0byB1c2UgYXMgdGhlIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgTG9uZ0ludC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nTG9uZ0ludCh2YWx1ZXM6IG51bWJlcltdIHwgVWludDMyQXJyYXkpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIHZhbHVlLCBzdHJldGNoZWQgb3IgdHJ1bmNhdGVkIHRvIHRoZSBzYW1lIHNpemUgYXMgdGhpcy5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIDMyLWJpdCBudW1iZXIgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRNYXRjaGluZ0xvbmdJbnQodmFsdWU/OiBudW1iZXIpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb25nSW50IHdpdGggdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGlzIG9uZSwgdXNpbmcgdGhlIGdpdmVuIGlucHV0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgTG9uZ0ludCB0byBjcmVhdGUuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdMb25nSW50KHZhbHVlOiBMb25nSW50IHwgbnVtYmVyW10gfCBVaW50MzJBcnJheSB8IG51bWJlcik6IExvbmdJbnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvbmdJbnQgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIHRoaXMgb25lLCB1c2luZyB0aGUgZ2l2ZW4gaW5wdXQuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBMb25nSW50IHRvIGNyZWF0ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRNYXRjaGluZ0xvbmdJbnQodmFsdWU6IExvbmdJbnQgfCBudW1iZXJbXSB8IFVpbnQzMkFycmF5IHwgbnVtYmVyID0gMCk6IExvbmdJbnQge1xuICAgICAgICBsZXQgaW50ZWdlcnM6IG51bWJlcltdIHwgVWludDMyQXJyYXkgPSBbXTtcblxuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgIGNhc2UgdmFsdWUgaW5zdGFuY2VvZiBVaW50MzJBcnJheTpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDwgdGhpcy5kYXRhLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSBbLi4udmFsdWUsIC4uLkFycmF5PG51bWJlcj4odGhpcy5kYXRhLmxlbmd0aCAtIHZhbHVlLmxlbmd0aCkuZmlsbCgwKV07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gdGhpcy5kYXRhLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSB2YWx1ZS5zbGljZSgwLCB0aGlzLmRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgdmFsdWUgaW5zdGFuY2VvZiBMb25nSW50OlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5kYXRhLmxlbmd0aCA8IHRoaXMuZGF0YS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gWy4uLnZhbHVlLmRhdGEsIC4uLkFycmF5PG51bWJlcj4odGhpcy5kYXRhLmxlbmd0aCAtIHZhbHVlLmRhdGEubGVuZ3RoKS5maWxsKDApXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5kYXRhLmxlbmd0aCA+IHRoaXMuZGF0YS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gdmFsdWUuZGF0YS5zbGljZSgwLCB0aGlzLmRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gdmFsdWUuZGF0YTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5OlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLmRhdGEubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IFsuLi52YWx1ZSwgLi4uQXJyYXk8bnVtYmVyPih0aGlzLmRhdGEubGVuZ3RoIC0gdmFsdWUubGVuZ3RoKS5maWxsKDApXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiB0aGlzLmRhdGEubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IHZhbHVlLnNsaWNlKDAsIHRoaXMuZGF0YS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IFt2YWx1ZSwgLi4uQXJyYXk8bnVtYmVyPih0aGlzLmRhdGEubGVuZ3RoIC0gMSkuZmlsbCgwKV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQoaW50ZWdlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNoaWZ0cyB0aGUgMzItYml0IG51bWJlciBhcnJheSB0byB0aGUgcmlnaHQuXG4gICAgICogQHBhcmFtIGNvdW50IC0gSG93IG1hbnkgcGxhY2VzIHRvIHNoaWZ0IHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0gZmlsbFZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbGwgZW1wdHkgc3BhY2VzIHdpdGguXG4gICAgICogQHJldHVybnMgVGhlIG5ldyB2YWx1ZSBvZiB0aGlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2hpZnRBcnJheVJpZ2h0KGNvdW50OiBudW1iZXIsIGZpbGxWYWx1ZTogbnVtYmVyID0gMCk6IHRoaXMge1xuICAgICAgICBpZiAoY291bnQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hpZnRBcnJheUxlZnQoLWNvdW50LCBmaWxsVmFsdWUpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbaSAtIGNvdW50XSA/PyBmaWxsVmFsdWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hpZnRzIHRoZSAzMi1iaXQgbnVtYmVyIGFycmF5IHRvIHRoZSBsZWZ0LlxuICAgICAqIEBwYXJhbSBjb3VudCAtIEhvdyBtYW55IHBsYWNlcyB0byBzaGlmdCB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIGZpbGxWYWx1ZSAtIFRoZSB2YWx1ZSB0byBmaWxsIGVtcHR5IHNwYWNlcyB3aXRoLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgdmFsdWUgb2YgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNoaWZ0QXJyYXlMZWZ0KGNvdW50OiBudW1iZXIsIGZpbGxWYWx1ZTogbnVtYmVyID0gMCk6IHRoaXMge1xuICAgICAgICBpZiAoY291bnQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hpZnRBcnJheVJpZ2h0KC1jb3VudCwgZmlsbFZhbHVlKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IHRoaXMuZGF0YVtpICsgY291bnRdID8/IGZpbGxWYWx1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iXX0=
|
|
@@ -4,43 +4,43 @@ import LongInt from "./longInt.js";
|
|
|
4
4
|
export default class LongIntBitBoard extends BitBoard<LongInt> {
|
|
5
5
|
/**
|
|
6
6
|
* Creates an instance of LongIntBitBoard.
|
|
7
|
-
* @param longInt The data to fill the BitBoard with.
|
|
8
|
-
|
|
7
|
+
* @param longInt - The data to fill the BitBoard with.
|
|
8
|
+
*/
|
|
9
9
|
constructor(longInt: LongInt);
|
|
10
10
|
/**
|
|
11
11
|
* Creates an instance of LongIntBitBoard.
|
|
12
|
-
* @param uint32Array The data to fill the BitBoard with.
|
|
12
|
+
* @param uint32Array - The data to fill the BitBoard with.
|
|
13
13
|
*/
|
|
14
14
|
constructor(uint32Array: Uint32Array);
|
|
15
15
|
/**
|
|
16
16
|
* Creates an instance of LongIntBitBoard.
|
|
17
|
-
* @param numberArray The data to fill the BitBoard with.
|
|
17
|
+
* @param numberArray - The data to fill the BitBoard with.
|
|
18
18
|
*/
|
|
19
19
|
constructor(numberArray: number[]);
|
|
20
20
|
/**
|
|
21
21
|
* Creates an instance of LongIntBitBoard.
|
|
22
|
-
* @param length The length of the LongInt.
|
|
22
|
+
* @param length - The length of the LongInt array.
|
|
23
23
|
*/
|
|
24
24
|
constructor(length: number);
|
|
25
25
|
/**
|
|
26
26
|
* Gets the value of a given bit.
|
|
27
|
-
* @param bit The bit to get.
|
|
27
|
+
* @param bit - The bit to get.
|
|
28
28
|
* @returns The value of the bit.
|
|
29
29
|
*/
|
|
30
30
|
getBit(bit: number): 0 | 1;
|
|
31
31
|
/**
|
|
32
32
|
* Sets the value for a given bit to 1.
|
|
33
|
-
* @param bit The bit to set.
|
|
33
|
+
* @param bit - The bit to set.
|
|
34
34
|
*/
|
|
35
35
|
setBit(bit: number): void;
|
|
36
36
|
/**
|
|
37
37
|
* Sets the value for a given bit to 0.
|
|
38
|
-
* @param bit The bit to clear.
|
|
38
|
+
* @param bit - The bit to clear.
|
|
39
39
|
*/
|
|
40
40
|
clearBit(bit: number): void;
|
|
41
41
|
/**
|
|
42
42
|
* Toggles the data for a given bit between 0 and 1.
|
|
43
|
-
* @param bit The bit to toggle.
|
|
43
|
+
* @param bit - The bit to toggle.
|
|
44
44
|
*/
|
|
45
45
|
toggleBit(bit: number): void;
|
|
46
46
|
/** Sets all bits to 0. */
|
|
@@ -49,55 +49,55 @@ export default class LongIntBitBoard extends BitBoard<LongInt> {
|
|
|
49
49
|
setAll(): void;
|
|
50
50
|
/**
|
|
51
51
|
* Gets a given number of bits.
|
|
52
|
-
* @param LSB The least significant bit to get.
|
|
53
|
-
* @param numberOfBits The number of bits to get.
|
|
54
|
-
* @returns The bits.
|
|
52
|
+
* @param LSB - The least significant bit to get.
|
|
53
|
+
* @param numberOfBits - The number of bits to get.
|
|
54
|
+
* @returns The bits as a number.
|
|
55
55
|
*/
|
|
56
56
|
getBits(LSB: number, numberOfBits: number): LongInt;
|
|
57
57
|
/**
|
|
58
58
|
* Carries out a bitwise and (&) operation.
|
|
59
|
-
* @param right The right value.
|
|
59
|
+
* @param right - The right value.
|
|
60
60
|
* @returns The result.
|
|
61
61
|
*/
|
|
62
|
-
and(right: LongIntBitBoard | number):
|
|
62
|
+
and(right: LongIntBitBoard | number): LongIntBitBoard;
|
|
63
63
|
/**
|
|
64
64
|
* Carries out a bitwise or (|) operation.
|
|
65
|
-
* @param right The right value.
|
|
65
|
+
* @param right - The right value.
|
|
66
66
|
* @returns The result.
|
|
67
67
|
*/
|
|
68
|
-
or(right: LongIntBitBoard | number):
|
|
68
|
+
or(right: LongIntBitBoard | number): LongIntBitBoard;
|
|
69
69
|
/**
|
|
70
70
|
* Carries out a bitwise xor (^) operation.
|
|
71
|
-
* @param right The right value.
|
|
71
|
+
* @param right - The right value.
|
|
72
72
|
* @returns The result.
|
|
73
73
|
*/
|
|
74
|
-
xor(right: LongIntBitBoard | number):
|
|
74
|
+
xor(right: LongIntBitBoard | number): LongIntBitBoard;
|
|
75
75
|
/**
|
|
76
76
|
* Carries out a bitwise not (~) operation.
|
|
77
77
|
* @returns The result.
|
|
78
78
|
*/
|
|
79
|
-
not():
|
|
79
|
+
not(): LongIntBitBoard;
|
|
80
80
|
/**
|
|
81
81
|
* Carries out a bitwise left shift (<<) operation.
|
|
82
|
-
* @param shiftAmount How much to shift it by.
|
|
82
|
+
* @param shiftAmount - How much to shift it by.
|
|
83
83
|
* @returns The result.
|
|
84
84
|
*/
|
|
85
|
-
leftShift(shiftAmount: number):
|
|
85
|
+
leftShift(shiftAmount: number): LongIntBitBoard;
|
|
86
86
|
/**
|
|
87
87
|
* Carries out a bitwise logical right shift (>>>) operation.
|
|
88
|
-
* @param shiftAmount How much to shift it by.
|
|
88
|
+
* @param shiftAmount - How much to shift it by.
|
|
89
89
|
* @returns The result.
|
|
90
90
|
*/
|
|
91
|
-
rightShift(shiftAmount: number):
|
|
91
|
+
rightShift(shiftAmount: number): LongIntBitBoard;
|
|
92
92
|
/**
|
|
93
93
|
* Carries out a bitwise arithmetic right shift (>>) operation.
|
|
94
|
-
* @param shiftAmount How much to shift it by.
|
|
94
|
+
* @param shiftAmount - How much to shift it by.
|
|
95
95
|
* @returns The result.
|
|
96
96
|
*/
|
|
97
|
-
arithmeticRightShift(shiftAmount: number):
|
|
97
|
+
arithmeticRightShift(shiftAmount: number): LongIntBitBoard;
|
|
98
98
|
/**
|
|
99
99
|
* Checks if two BitBoards have equal data values.
|
|
100
|
-
* @param value The value to compare against.
|
|
100
|
+
* @param value - The value to compare against.
|
|
101
101
|
* @returns Whether or not the two BitBoard have the same data value.
|
|
102
102
|
*/
|
|
103
103
|
equals(value: LongInt | LongIntBitBoard | number): boolean;
|