@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.
@@ -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
- /** Gets the number of 32-bit words which make the LongInt. */
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9uZ0ludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaXRCb2FyZC9sb25nSW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLE9BQU87SUFDeEIseUNBQXlDO0lBQ3pCLElBQUksQ0FBYztJQWlCbEM7OztPQUdHO0lBQ0gsWUFBbUIsSUFBK0M7UUFDOUQsSUFBSSxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxXQUFXO1lBQ3BELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakMsSUFBSSxJQUFJLFlBQVksT0FBTztZQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFFdkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQWEsRUFBRSxLQUF1QjtRQUNwRCxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQWEsRUFBRSxLQUF1QjtRQUNuRCxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQWEsRUFBRSxLQUF1QjtRQUNwRCxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBZTtRQUM3QixPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBZSxFQUFFLFdBQW1CO1FBQ3hELE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBZSxFQUFFLFdBQW1CO1FBQ3pELE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFlLEVBQUUsV0FBbUI7UUFDbkUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQWlCLEVBQUUsUUFBMEI7UUFDOUQsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUF1QkQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBZ0IsRUFBRSxRQUFtRCxDQUFDO1FBQ25HLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxHQUFHLENBQUMsS0FBdUI7UUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRTFDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksRUFBRSxDQUFDLEtBQXVCO1FBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUUxQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEdBQUcsQ0FBQyxLQUF1QjtRQUM5QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFFMUMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEdBQUc7UUFDTixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRWxDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLFdBQW1CO1FBQ2hDLElBQUksV0FBVyxLQUFLLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUM7UUFFaEIsSUFBSSxXQUFXLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFdkQsSUFBSSxXQUFXLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDckIsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBRTNDLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFFLEtBQUssRUFBRSxHQUFHLGlCQUFpQixDQUFDO1FBQ3pHLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7TUFJRTtJQUNLLFVBQVUsQ0FBQyxXQUFtQjtRQUNqQyxJQUFJLFdBQVcsS0FBSyxDQUFDO1lBQ2pCLE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQUksV0FBVyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUUzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLEtBQUssaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFFLElBQUksRUFBRSxHQUFHLGlCQUFpQixDQUFDO1FBQ3pHLENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG9CQUFvQixDQUFDLFdBQW1CO1FBQzNDLElBQUksV0FBVyxLQUFLLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUM7UUFFaEIsSUFBSSxXQUFXLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDckIsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBRTNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUUsSUFBSSxFQUFFLEdBQUcsaUJBQWlCLENBQUM7UUFDeEcsQ0FBQztRQUVELElBQUksV0FBVyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVoRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxLQUF1QjtRQUNqQyxNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDL0UsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2xELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDckMsT0FBTyxLQUFLLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksUUFBUSxDQUFDLElBQWdCO1FBQzVCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1lBQ1gsS0FBSyxDQUFDO2dCQUNGLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsTUFBTTtZQUNWLEtBQUssRUFBRTtnQkFDSCxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNmLE1BQU07WUFDVixLQUFLLEVBQUU7Z0JBQ0gsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDZCxNQUFNO1FBQ2QsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDaEIsT0FBTyxFQUFFO2FBQ1QsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUEwQkQ7Ozs7T0FJRztJQUNLLGtCQUFrQixDQUFDLFFBQW1ELENBQUM7UUFDM0UsSUFBSSxRQUFRLEdBQTJCLEVBQUUsQ0FBQztRQUUxQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ1gsS0FBSyxLQUFLLFlBQVksV0FBVztnQkFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtvQkFDL0IsUUFBUSxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNoRixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO29CQUNwQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzs7b0JBRTVDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBRXJCLE1BQU07WUFDVixLQUFLLEtBQUssWUFBWSxPQUFPO2dCQUN6QixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtvQkFDcEMsUUFBUSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzFGLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO29CQUN6QyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7O29CQUVqRCxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFFMUIsTUFBTTtZQUNWLEtBQUssS0FBSyxZQUFZLEtBQUs7Z0JBQ3ZCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQy9CLFFBQVEsR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDaEYsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtvQkFDcEMsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7O29CQUU1QyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUVyQixNQUFNO1lBQ1Y7Z0JBQ0ksUUFBUSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLEtBQWEsRUFBRSxZQUFvQixDQUFDO1FBQ3hELElBQUksS0FBSyxHQUFHLENBQUM7WUFDVCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUM7UUFFckQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssY0FBYyxDQUFDLEtBQWEsRUFBRSxZQUFvQixDQUFDO1FBQ3ZELElBQUksS0FBSyxHQUFHLENBQUM7WUFDVCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUVyRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTdHJpbmdUeXBlID0gMiB8IDEwIHwgMTY7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvbmcgaW50ZWdlciB1c2luZyBhbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycy5cbiAqIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBiaXR3aXNlIG9wZXJhdGlvbnMgd2hpY2ggZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgdmFsdWVzLlxuICogUHJvdmlkZXMgbm9uLXN0YXRpYyBlcXVpdmFsZW50cyB0byB0aGUgYWJvdmUgb3BlcmF0aW9ucywgd2hpY2ggYXJlIGNhcnJpZWQgb3V0IGluIHBsYWNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb25nSW50IHtcbiAgICAvKiogSG9sZHMgdGhlIGFycmF5IG9mIDMyLWJpdCBudW1iZXJzLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkYXRhOiBVaW50MzJBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTG9uZ0ludC5cbiAgICAgKiBAcGFyYW0gdmFsdWVzIEEgbGl0dGxlLWVuZGlhbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycyB0byBmaWxsIHRoZSBgTG9uZ0ludGAuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHZhbHVlczogbnVtYmVyW10gfCBVaW50MzJBcnJheSk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMb25nSW50LlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiAzMi1iaXQgbnVtYmVycyB0byBjb25zdHJ1Y3QgdGhlIGBMb25nSW50YCBvdXQgb2YuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyKTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIExvbmdJbnQuXG4gICAgICogQHBhcmFtIGxvbmdJbnQgQSBgTG9uZ0ludGAgb2JqZWN0IHRvIGR1cGxpY2F0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobG9uZ0ludDogTG9uZ0ludCk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMb25nSW50LlxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gY29uc3RydWN0IHRoZSBgTG9uZ0ludGAgb3V0IG9mLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihhcmdzOiBMb25nSW50IHwgbnVtYmVyW10gfCBVaW50MzJBcnJheSB8IG51bWJlcikge1xuICAgICAgICBpZiAoYXJncyBpbnN0YW5jZW9mIEFycmF5IHx8IGFyZ3MgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheShhcmdzKTtcbiAgICAgICAgZWxzZSBpZiAoYXJncyBpbnN0YW5jZW9mIExvbmdJbnQpXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDMyQXJyYXkoYXJncy5kYXRhKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQzMkFycmF5KGFyZ3MpLmZpbGwoMCk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgdGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgd2hpY2ggbWFrZSB0aGUgTG9uZ0ludC4gKi9cbiAgICBwdWJsaWMgZ2V0IHdvcmRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgYW5kICgmKSBvcGVyYXRpb24gb24gdGhlIHR3byBudW1iZXJzLlxuICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IG51bWJlci5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGxlZnQgJiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGFuZChsZWZ0OiBMb25nSW50LCByaWdodDogTG9uZ0ludCB8IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobGVmdCkuYW5kKHJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugb3IgKHwpIG9wZXJhdGlvbiBvbiB0aGUgdHdvIG51bWJlcnMuXG4gICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgbnVtYmVyLlxuICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbGVmdCB8IHJpZ2h0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgb3IobGVmdDogTG9uZ0ludCwgcmlnaHQ6IExvbmdJbnQgfCBudW1iZXIpOiBMb25nSW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50KGxlZnQpLm9yKHJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgeG9yICheKSBvcGVyYXRpb24gb24gdGhlIHR3byBudW1iZXJzLlxuICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IG51bWJlci5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGxlZnQgXiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHhvcihsZWZ0OiBMb25nSW50LCByaWdodDogTG9uZ0ludCB8IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobGVmdCkueG9yKHJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugbm90ICh+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): this;
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): this;
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): this;
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(): this;
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): this;
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): this;
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): this;
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;