1 | /**
|
2 | * @license
|
3 | * Copyright 2017 Google LLC. All Rights Reserved.
|
4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | * you may not use this file except in compliance with the License.
|
6 | * You may obtain a copy of the License at
|
7 | *
|
8 | * http://www.apache.org/licenses/LICENSE-2.0
|
9 | *
|
10 | * Unless required by applicable law or agreed to in writing, software
|
11 | * distributed under the License is distributed on an "AS IS" BASIS,
|
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13 | * See the License for the specific language governing permissions and
|
14 | * limitations under the License.
|
15 | * =============================================================================
|
16 | */
|
17 | import * as tf from '../index';
|
18 | import { ALL_ENVS, describeWithFlags } from '../jasmine_util';
|
19 | import { expectArraysClose } from '../test_util';
|
20 | describeWithFlags('batchNorm4D', ALL_ENVS, () => {
|
21 | it('simple batchnorm4D, no offset or scale, 2x1x1x2', async () => {
|
22 | const xT = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
23 | const meanT = tf.tensor1d([1, 2]);
|
24 | const varianceT = tf.tensor1d([2, 3]);
|
25 | const varianceEpsilon = .001;
|
26 | const result = tf.batchNorm4d(xT, meanT, varianceT, undefined, undefined, varianceEpsilon);
|
27 | const x = await xT.array();
|
28 | const mean = await meanT.array();
|
29 | const variance = await varianceT.array();
|
30 | expectArraysClose(await result.data(), [
|
31 | (x[0][0][0][0] - mean[0]) * 1 / Math.sqrt(variance[0] + varianceEpsilon),
|
32 | (x[0][0][0][1] - mean[1]) * 1 / Math.sqrt(variance[1] + varianceEpsilon),
|
33 | (x[1][0][0][0] - mean[0]) * 1 / Math.sqrt(variance[0] + varianceEpsilon),
|
34 | (x[1][0][0][1] - mean[1]) * 1 / Math.sqrt(variance[1] + varianceEpsilon)
|
35 | ]);
|
36 | });
|
37 | it('simple batchnorm4D, no offset, 2x1x1x2', async () => {
|
38 | const xT = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
39 | const meanT = tf.tensor1d([1, 2]);
|
40 | const varianceT = tf.tensor1d([2, 3]);
|
41 | const scaleT = tf.tensor1d([4, 5]);
|
42 | const varianceEpsilon = .001;
|
43 | const result = tf.batchNorm4d(xT, meanT, varianceT, undefined, scaleT, varianceEpsilon);
|
44 | const x = await xT.buffer();
|
45 | const mean = await meanT.buffer();
|
46 | const variance = await varianceT.buffer();
|
47 | const scale = await scaleT.buffer();
|
48 | expectArraysClose(await result.data(), [
|
49 | (x.get(0, 0, 0, 0) - mean.get(0)) * scale.get(0) /
|
50 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
51 | (x.get(0, 0, 0, 1) - mean.get(1)) * scale.get(1) /
|
52 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
53 | (x.get(1, 0, 0, 0) - mean.get(0)) * scale.get(0) /
|
54 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
55 | (x.get(1, 0, 0, 1) - mean.get(1)) * scale.get(1) /
|
56 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
57 | ]);
|
58 | });
|
59 | it('simple batchnorm4D, no scale, 2x1x1x2', async () => {
|
60 | const xT = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
61 | const meanT = tf.tensor1d([1, 2]);
|
62 | const varianceT = tf.tensor1d([2, 3]);
|
63 | const offsetT = tf.tensor1d([4, 5]);
|
64 | const varianceEpsilon = .001;
|
65 | const result = tf.batchNorm4d(xT, meanT, varianceT, offsetT, undefined, varianceEpsilon);
|
66 | const x = await xT.buffer();
|
67 | const mean = await meanT.buffer();
|
68 | const variance = await varianceT.buffer();
|
69 | const offset = await offsetT.buffer();
|
70 | expectArraysClose(await result.data(), [
|
71 | offset.get(0) +
|
72 | (x.get(0, 0, 0, 0) - mean.get(0)) * 1 /
|
73 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
74 | offset.get(1) +
|
75 | (x.get(0, 0, 0, 1) - mean.get(1)) * 1 /
|
76 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
77 | offset.get(0) +
|
78 | (x.get(1, 0, 0, 0) - mean.get(0)) * 1 /
|
79 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
80 | offset.get(1) +
|
81 | (x.get(1, 0, 0, 1) - mean.get(1)) * 1 /
|
82 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
83 | ]);
|
84 | });
|
85 | it('simple batchnorm4D, 2x1x1x2', async () => {
|
86 | const xT = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
87 | const meanT = tf.tensor1d([1, 2]);
|
88 | const varianceT = tf.tensor1d([2, 3]);
|
89 | const offsetT = tf.tensor1d([3, 4]);
|
90 | const scaleT = tf.tensor1d([4, 5]);
|
91 | const varianceEpsilon = .001;
|
92 | const result = tf.batchNorm4d(xT, meanT, varianceT, offsetT, scaleT, varianceEpsilon);
|
93 | const x = await xT.buffer();
|
94 | const mean = await meanT.buffer();
|
95 | const variance = await varianceT.buffer();
|
96 | const scale = await scaleT.buffer();
|
97 | const offset = await offsetT.buffer();
|
98 | expectArraysClose(await result.data(), [
|
99 | offset.get(0) +
|
100 | (x.get(0, 0, 0, 0) - mean.get(0)) * scale.get(0) /
|
101 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
102 | offset.get(1) +
|
103 | (x.get(0, 0, 0, 1) - mean.get(1)) * scale.get(1) /
|
104 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
105 | offset.get(0) +
|
106 | (x.get(1, 0, 0, 0) - mean.get(0)) * scale.get(0) /
|
107 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
108 | offset.get(1) +
|
109 | (x.get(1, 0, 0, 1) - mean.get(1)) * scale.get(1) /
|
110 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
111 | ]);
|
112 | });
|
113 | it('accepts a tensor-like object', async () => {
|
114 | const x = [[[[2, 4]]], [[[9, 23]]]]; // 2x1x1x2
|
115 | const mean = [1, 2];
|
116 | const variance = [2, 3];
|
117 | const offset = [3, 4];
|
118 | const scale = [4, 5];
|
119 | const varianceEpsilon = .001;
|
120 | const result = tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon);
|
121 | expectArraysClose(await result.data(), [
|
122 | offset[0] +
|
123 | (x[0][0][0][0] - mean[0]) * scale[0] /
|
124 | Math.sqrt(variance[0] + varianceEpsilon),
|
125 | offset[1] +
|
126 | (x[0][0][0][1] - mean[1]) * scale[1] /
|
127 | Math.sqrt(variance[1] + varianceEpsilon),
|
128 | offset[0] +
|
129 | (x[1][0][0][0] - mean[0]) * scale[0] /
|
130 | Math.sqrt(variance[0] + varianceEpsilon),
|
131 | offset[1] +
|
132 | (x[1][0][0][1] - mean[1]) * scale[1] /
|
133 | Math.sqrt(variance[1] + varianceEpsilon)
|
134 | ]);
|
135 | });
|
136 | it('simple batchnorm4D gradients, 2x1x1x2', async () => {
|
137 | const x = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
138 | const mean = tf.tensor1d([1, 2]);
|
139 | const variance = tf.tensor1d([2, 3]);
|
140 | const offset = tf.tensor1d([3, 4]);
|
141 | const scale = tf.tensor1d([2, 5]);
|
142 | const varianceEpsilon = .001;
|
143 | const dy = tf.tensor4d([-1, -1, -1, -1], [2, 1, 1, 2]);
|
144 | const gradX = tf.grad((x) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(x, dy);
|
145 | expectArraysClose(await gradX.data(), [-1.414, -2.887, -1.414, -2.887]);
|
146 | expect(gradX.shape).toEqual([2, 1, 1, 2]);
|
147 | const gradMean = tf.grad((mean) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(mean, dy);
|
148 | expectArraysClose(await gradMean.data(), [2.828, 5.773]);
|
149 | expect(gradMean.shape).toEqual([2]);
|
150 | const gradVariance = tf.grad((variance) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(variance, dy);
|
151 | expectArraysClose(await gradVariance.data(), [3.180, 11.060]);
|
152 | expect(gradVariance.shape).toEqual([2]);
|
153 | const gradOffset = tf.grad((offset) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(offset, dy);
|
154 | expectArraysClose(await gradOffset.data(), await dy.sum([0, 1, 2]).data());
|
155 | expect(gradOffset.shape).toEqual([2]);
|
156 | const gradScale = tf.grad((scale) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(scale, dy);
|
157 | expectArraysClose(await gradScale.data(), [-6.362, -13.277]);
|
158 | expect(gradScale.shape).toEqual([2]);
|
159 | });
|
160 | it('batchnorm4D gradients, same shapes in x, mean and variance', async () => {
|
161 | const x = tf.tensor4d([10, 20, 30, 40], [2, 1, 1, 2]);
|
162 | const mean = tf.tensor4d([0, 5, 10, 15], [2, 1, 1, 2]);
|
163 | const variance = tf.tensor4d([2, 4, 6, 8], [2, 1, 1, 2]);
|
164 | const scale = tf.tensor4d([2, 5, 2, 5], [2, 1, 1, 2]);
|
165 | const offset = tf.tensor4d([0, 0, 0, 0], [2, 1, 1, 2]);
|
166 | const varianceEpsilon = .001;
|
167 | const dy = tf.tensor4d([-1, -1, -1, -1], [2, 1, 1, 2]);
|
168 | const gradX = tf.grad((x) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(x, dy);
|
169 | expectArraysClose(await gradX.data(), [-1.414, -2.500, -0.816, -1.768]);
|
170 | expect(gradX.shape).toEqual([2, 1, 1, 2]);
|
171 | const gradMean = tf.grad((mean) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(mean, dy);
|
172 | expectArraysClose(await gradMean.data(), [1.414, 2.500, 0.816, 1.768]);
|
173 | expect(gradMean.shape).toEqual([2, 1, 1, 2]);
|
174 | const gradVariance = tf.grad((variance) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(variance, dy);
|
175 | expectArraysClose(await gradVariance.data(), [3.533, 4.686, 1.360, 2.762]);
|
176 | expect(gradVariance.shape).toEqual([2, 1, 1, 2]);
|
177 | const gradOffset = tf.grad((offset) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(offset, dy);
|
178 | expectArraysClose(await gradOffset.data(), await dy.data());
|
179 | expect(gradOffset.shape).toEqual([2, 1, 1, 2]);
|
180 | const gradScale = tf.grad((scale) => tf.batchNorm4d(x, mean, variance, offset, scale, varianceEpsilon))(scale, dy);
|
181 | expectArraysClose(await gradScale.data(), [-7.069, -7.499, -8.164, -8.838]);
|
182 | expect(gradScale.shape).toEqual([2, 1, 1, 2]);
|
183 | });
|
184 | });
|
185 | describeWithFlags('batchNorm3D', ALL_ENVS, () => {
|
186 | it('simple batchnorm3D, no offset or scale, 2x1x2', async () => {
|
187 | const xT = tf.tensor3d([2, 4, 9, 23], [2, 1, 2]);
|
188 | const meanT = tf.tensor1d([1, 2]);
|
189 | const varianceT = tf.tensor1d([2, 3]);
|
190 | const varianceEpsilon = .001;
|
191 | const result = tf.batchNorm3d(xT, meanT, varianceT, undefined, undefined, varianceEpsilon);
|
192 | const x = await xT.buffer();
|
193 | const mean = await meanT.buffer();
|
194 | const variance = await varianceT.buffer();
|
195 | expectArraysClose(await result.data(), [
|
196 | (x.get(0, 0, 0) - mean.get(0)) * 1 /
|
197 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
198 | (x.get(0, 0, 1) - mean.get(1)) * 1 /
|
199 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
200 | (x.get(1, 0, 0) - mean.get(0)) * 1 /
|
201 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
202 | (x.get(1, 0, 1) - mean.get(1)) * 1 /
|
203 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
204 | ]);
|
205 | });
|
206 | it('simple batchnorm3D, no offset, 2x1x2', async () => {
|
207 | const xT = tf.tensor3d([2, 4, 9, 23], [2, 1, 2]);
|
208 | const meanT = tf.tensor1d([1, 2]);
|
209 | const varianceT = tf.tensor1d([2, 3]);
|
210 | const scaleT = tf.tensor1d([4, 5]);
|
211 | const varianceEpsilon = .001;
|
212 | const result = tf.batchNorm3d(xT, meanT, varianceT, undefined, scaleT, varianceEpsilon);
|
213 | const x = await xT.buffer();
|
214 | const mean = await meanT.buffer();
|
215 | const variance = await varianceT.buffer();
|
216 | const scale = await scaleT.buffer();
|
217 | expectArraysClose(await result.data(), [
|
218 | (x.get(0, 0, 0) - mean.get(0)) * scale.get(0) /
|
219 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
220 | (x.get(0, 0, 1) - mean.get(1)) * scale.get(1) /
|
221 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
222 | (x.get(1, 0, 0) - mean.get(0)) * scale.get(0) /
|
223 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
224 | (x.get(1, 0, 1) - mean.get(1)) * scale.get(1) /
|
225 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
226 | ]);
|
227 | });
|
228 | it('simple batchnorm3D, no scale, 2x1x2', async () => {
|
229 | const xT = tf.tensor3d([2, 4, 9, 23], [2, 1, 2]);
|
230 | const meanT = tf.tensor1d([1, 2]);
|
231 | const varianceT = tf.tensor1d([2, 3]);
|
232 | const offsetT = tf.tensor1d([4, 5]);
|
233 | const varianceEpsilon = .001;
|
234 | const result = tf.batchNorm3d(xT, meanT, varianceT, offsetT, undefined, varianceEpsilon);
|
235 | const x = await xT.buffer();
|
236 | const mean = await meanT.buffer();
|
237 | const variance = await varianceT.buffer();
|
238 | const offset = await offsetT.buffer();
|
239 | expectArraysClose(await result.data(), [
|
240 | offset.get(0) +
|
241 | (x.get(0, 0, 0) - mean.get(0)) * 1 /
|
242 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
243 | offset.get(1) +
|
244 | (x.get(0, 0, 1) - mean.get(1)) * 1 /
|
245 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
246 | offset.get(0) +
|
247 | (x.get(1, 0, 0) - mean.get(0)) * 1 /
|
248 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
249 | offset.get(1) +
|
250 | (x.get(1, 0, 1) - mean.get(1)) * 1 /
|
251 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
252 | ]);
|
253 | });
|
254 | it('simple batchnorm3D, 2x1x2', async () => {
|
255 | const xT = tf.tensor3d([2, 4, 9, 23], [2, 1, 2]);
|
256 | const meanT = tf.tensor1d([1, 2]);
|
257 | const varianceT = tf.tensor1d([2, 3]);
|
258 | const offsetT = tf.tensor1d([3, 4]);
|
259 | const scaleT = tf.tensor1d([4, 5]);
|
260 | const varianceEpsilon = .001;
|
261 | const result = tf.batchNorm3d(xT, meanT, varianceT, offsetT, scaleT, varianceEpsilon);
|
262 | const x = await xT.buffer();
|
263 | const mean = await meanT.buffer();
|
264 | const variance = await varianceT.buffer();
|
265 | const offset = await offsetT.buffer();
|
266 | const scale = await scaleT.buffer();
|
267 | expectArraysClose(await result.data(), [
|
268 | offset.get(0) +
|
269 | (x.get(0, 0, 0) - mean.get(0)) * scale.get(0) /
|
270 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
271 | offset.get(1) +
|
272 | (x.get(0, 0, 1) - mean.get(1)) * scale.get(1) /
|
273 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
274 | offset.get(0) +
|
275 | (x.get(1, 0, 0) - mean.get(0)) * scale.get(0) /
|
276 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
277 | offset.get(1) +
|
278 | (x.get(1, 0, 1) - mean.get(1)) * scale.get(1) /
|
279 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
280 | ]);
|
281 | });
|
282 | it('accepts a tensor-like object', async () => {
|
283 | const x = [[[2, 4]], [[9, 23]]]; // 2x1x2
|
284 | const mean = [1, 2];
|
285 | const variance = [2, 3];
|
286 | const offset = [3, 4];
|
287 | const scale = [4, 5];
|
288 | const varianceEpsilon = .001;
|
289 | const result = tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon);
|
290 | expectArraysClose(await result.data(), [
|
291 | offset[0] +
|
292 | (x[0][0][0] - mean[0]) * scale[0] /
|
293 | Math.sqrt(variance[0] + varianceEpsilon),
|
294 | offset[1] +
|
295 | (x[0][0][1] - mean[1]) * scale[1] /
|
296 | Math.sqrt(variance[1] + varianceEpsilon),
|
297 | offset[0] +
|
298 | (x[1][0][0] - mean[0]) * scale[0] /
|
299 | Math.sqrt(variance[0] + varianceEpsilon),
|
300 | offset[1] +
|
301 | (x[1][0][1] - mean[1]) * scale[1] /
|
302 | Math.sqrt(variance[1] + varianceEpsilon)
|
303 | ]);
|
304 | });
|
305 | it('batchnorm3D, x,mean,var,offset,scale are all 3D', async () => {
|
306 | const shape = [2, 1, 2];
|
307 | const xT = tf.tensor3d([2, 4, 9, 23], shape);
|
308 | const meanT = tf.tensor3d([1, 2, 3, 4], shape);
|
309 | const varianceT = tf.tensor3d([2, 3, 4, 5], shape);
|
310 | const offsetT = tf.tensor3d([3, 4, 5, 6], shape);
|
311 | const scaleT = tf.tensor3d([4, 5, 6, 7], shape);
|
312 | const varianceEpsilon = .001;
|
313 | const result = tf.batchNorm3d(xT, meanT, varianceT, offsetT, scaleT, varianceEpsilon);
|
314 | const x = await xT.buffer();
|
315 | const mean = await meanT.buffer();
|
316 | const variance = await varianceT.buffer();
|
317 | const offset = await offsetT.buffer();
|
318 | const scale = await scaleT.buffer();
|
319 | expectArraysClose(await result.data(), [
|
320 | offset.get(0, 0, 0) +
|
321 | (x.get(0, 0, 0) - mean.get(0, 0, 0)) * scale.get(0, 0, 0) /
|
322 | Math.sqrt(variance.get(0, 0, 0) + varianceEpsilon),
|
323 | offset.get(0, 0, 1) +
|
324 | (x.get(0, 0, 1) - mean.get(0, 0, 1)) * scale.get(0, 0, 1) /
|
325 | Math.sqrt(variance.get(0, 0, 1) + varianceEpsilon),
|
326 | offset.get(1, 0, 0) +
|
327 | (x.get(1, 0, 0) - mean.get(1, 0, 0)) * scale.get(1, 0, 0) /
|
328 | Math.sqrt(variance.get(1, 0, 0) + varianceEpsilon),
|
329 | offset.get(1, 0, 1) +
|
330 | (x.get(1, 0, 1) - mean.get(1, 0, 1)) * scale.get(1, 0, 1) /
|
331 | Math.sqrt(variance.get(1, 0, 1) + varianceEpsilon)
|
332 | ]);
|
333 | });
|
334 | it('simple batchnorm3D gradients, 2x1x2', async () => {
|
335 | const x = tf.tensor3d([2, 4, 9, 23], [2, 1, 2]);
|
336 | const mean = tf.tensor1d([1, 2]);
|
337 | const variance = tf.tensor1d([2, 3]);
|
338 | const offset = tf.tensor1d([3, 4]);
|
339 | const scale = tf.tensor1d([2, 5]);
|
340 | const varianceEpsilon = .001;
|
341 | const dy = tf.tensor3d([1, 1, 1, 1], [2, 1, 2]);
|
342 | const gradX = tf.grad((x) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(x, dy);
|
343 | expectArraysClose(await gradX.data(), [1.414, 2.887, 1.414, 2.887]);
|
344 | expect(gradX.shape).toEqual([2, 1, 2]);
|
345 | const gradMean = tf.grad((mean) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(mean, dy);
|
346 | expectArraysClose(await gradMean.data(), [-2.828, -5.773]);
|
347 | expect(gradMean.shape).toEqual([2]);
|
348 | const gradVariance = tf.grad((variance) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(variance, dy);
|
349 | expectArraysClose(await gradVariance.data(), [-3.180, -11.060]);
|
350 | expect(gradVariance.shape).toEqual([2]);
|
351 | const gradOffset = tf.grad((offset) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(offset, dy);
|
352 | expectArraysClose(await gradOffset.data(), [2, 2]);
|
353 | expect(gradOffset.shape).toEqual([2]);
|
354 | const gradScale = tf.grad((scale) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(scale, dy);
|
355 | expectArraysClose(await gradScale.data(), [6.362, 13.277]);
|
356 | expect(gradScale.shape).toEqual([2]);
|
357 | });
|
358 | it('batchnorm3D gradients, same shapes in x, mean and variance', async () => {
|
359 | const x = tf.tensor3d([10, 20, 30, 40], [2, 1, 2]);
|
360 | const mean = tf.tensor3d([0, 5, 10, 15], [2, 1, 2]);
|
361 | const variance = tf.tensor3d([2, 4, 6, 8], [2, 1, 2]);
|
362 | const scale = tf.tensor3d([2, 5, 2, 5], [2, 1, 2]);
|
363 | const offset = tf.tensor3d([0, 0, 0, 0], [2, 1, 2]);
|
364 | const varianceEpsilon = .001;
|
365 | const dy = tf.tensor3d([1, 1, 1, 1], [2, 1, 2]);
|
366 | const gradX = tf.grad((x) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(x, dy);
|
367 | expectArraysClose(await gradX.data(), [1.414, 2.500, 0.816, 1.768]);
|
368 | expect(gradX.shape).toEqual([2, 1, 2]);
|
369 | const gradMean = tf.grad((mean) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(mean, dy);
|
370 | expectArraysClose(await gradMean.data(), [-1.414, -2.500, -0.816, -1.768]);
|
371 | expect(gradMean.shape).toEqual([2, 1, 2]);
|
372 | const gradVariance = tf.grad((variance) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(variance, dy);
|
373 | expectArraysClose(await gradVariance.data(), [-3.533, -4.686, -1.360, -2.762]);
|
374 | expect(gradVariance.shape).toEqual([2, 1, 2]);
|
375 | const gradOffset = tf.grad((offset) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(offset, dy);
|
376 | expectArraysClose(await gradOffset.data(), [1, 1, 1, 1]);
|
377 | expect(gradOffset.shape).toEqual([2, 1, 2]);
|
378 | const gradScale = tf.grad((scale) => tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon))(scale, dy);
|
379 | expectArraysClose(await gradScale.data(), [7.069, 7.499, 8.164, 8.838]);
|
380 | expect(gradScale.shape).toEqual([2, 1, 2]);
|
381 | });
|
382 | it('batchnorm matches tensorflow, 2x3x3', async () => {
|
383 | const x = tf.tensor3d([
|
384 | 0.49955603, 0.04158615, -1.09440524, 2.03854165, -0.61578344,
|
385 | 2.87533573, 1.18105987, 0.807462, 1.87888837, 2.26563962, -0.37040935,
|
386 | 1.35848753, -0.75347094, 0.15683117, 0.91925946, 0.34121279,
|
387 | 0.92717143, 1.89683965
|
388 | ], [2, 3, 3]);
|
389 | const mean = tf.tensor1d([0.39745062, -0.48062894, 0.4847822]);
|
390 | const variance = tf.tensor1d([0.32375343, 0.67117643, 1.08334653]);
|
391 | const offset = tf.tensor1d([0.69398749, -1.29056387, 0.9429723]);
|
392 | const scale = tf.tensor1d([-0.5607271, 0.9878457, 0.25181573]);
|
393 | const varianceEpsilon = .001;
|
394 | const result = tf.batchNorm3d(x, mean, variance, offset, scale, varianceEpsilon);
|
395 | expectArraysClose(await result.data(), [
|
396 | 0.59352049, -0.66135202, 0.5610874, -0.92077015, -1.45341019, 1.52106473,
|
397 | -0.07704776, 0.26144429, 1.28010017, -1.14422404, -1.15776136, 1.15425493,
|
398 | 1.82644104, -0.52249442, 1.04803919, 0.74932291, 0.40568101, 1.2844412
|
399 | ]);
|
400 | });
|
401 | });
|
402 | describeWithFlags('batchNorm2D', ALL_ENVS, () => {
|
403 | it('simple batchnorm2D, no offset or scale, 2x2', async () => {
|
404 | const xT = tf.tensor2d([2, 4, 9, 23], [2, 2]);
|
405 | const meanT = tf.tensor1d([1, 2]);
|
406 | const varianceT = tf.tensor1d([2, 3]);
|
407 | const varianceEpsilon = .001;
|
408 | const result = tf.batchNorm2d(xT, meanT, varianceT, undefined, undefined, varianceEpsilon);
|
409 | const x = await xT.buffer();
|
410 | const mean = await meanT.buffer();
|
411 | const variance = await varianceT.buffer();
|
412 | expectArraysClose(await result.data(), [
|
413 | (x.get(0, 0) - mean.get(0)) * 1 /
|
414 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
415 | (x.get(0, 1) - mean.get(1)) * 1 /
|
416 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
417 | (x.get(1, 0) - mean.get(0)) * 1 /
|
418 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
419 | (x.get(1, 1) - mean.get(1)) * 1 /
|
420 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
421 | ]);
|
422 | });
|
423 | it('simple batchnorm2D, no offset, 2x2', async () => {
|
424 | const xT = tf.tensor2d([2, 4, 9, 23], [2, 2]);
|
425 | const meanT = tf.tensor1d([1, 2]);
|
426 | const varianceT = tf.tensor1d([2, 3]);
|
427 | const scaleT = tf.tensor1d([4, 5]);
|
428 | const varianceEpsilon = .001;
|
429 | const result = tf.batchNorm2d(xT, meanT, varianceT, undefined, scaleT, varianceEpsilon);
|
430 | const x = await xT.buffer();
|
431 | const mean = await meanT.buffer();
|
432 | const variance = await varianceT.buffer();
|
433 | const scale = await scaleT.buffer();
|
434 | expectArraysClose(await result.data(), [
|
435 | (x.get(0, 0) - mean.get(0)) * scale.get(0) /
|
436 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
437 | (x.get(0, 1) - mean.get(1)) * scale.get(1) /
|
438 | Math.sqrt(variance.get(1) + varianceEpsilon),
|
439 | (x.get(1, 0) - mean.get(0)) * scale.get(0) /
|
440 | Math.sqrt(variance.get(0) + varianceEpsilon),
|
441 | (x.get(1, 1) - mean.get(1)) * scale.get(1) /
|
442 | Math.sqrt(variance.get(1) + varianceEpsilon)
|
443 | ]);
|
444 | });
|
445 | it('simple batchnorm2D, no scale, 2x2', async () => {
|
446 | const xT = tf.tensor2d([2, 4, 9, 23], [2, 2]);
|
447 | const meanT = tf.tensor1d([1, 2]);
|
448 | const varianceT = tf.tensor1d([2, 3]);
|
449 | const offsetT = tf.tensor1d([4, 5]);
|
450 | const varianceEpsilon = .001;
|
451 | const result = tf.batchNorm2d(xT, meanT, varianceT, offsetT, undefined, varianceEpsilon);
|
452 | const offset = await offsetT.array();
|
453 | const mean = await meanT.array();
|
454 | const variance = await varianceT.array();
|
455 | const x = await xT.array();
|
456 | expectArraysClose(await result.data(), [
|
457 | offset[0] +
|
458 | (x[0][0] - mean[0]) * 1 / Math.sqrt(variance[0] + varianceEpsilon),
|
459 | offset[1] +
|
460 | (x[0][1] - mean[1]) * 1 / Math.sqrt(variance[1] + varianceEpsilon),
|
461 | offset[0] +
|
462 | (x[1][0] - mean[0]) * 1 / Math.sqrt(variance[0] + varianceEpsilon),
|
463 | offset[1] +
|
464 | (x[1][1] - mean[1]) * 1 / Math.sqrt(variance[1] + varianceEpsilon)
|
465 | ]);
|
466 | });
|
467 | it('simple batchnorm2D, 2x2', async () => {
|
468 | const xT = tf.tensor2d([2, 4, 9, 23], [2, 2]);
|
469 | const meanT = tf.tensor1d([1, 2]);
|
470 | const varianceT = tf.tensor1d([2, 3]);
|
471 | const offsetT = tf.tensor1d([3, 4]);
|
472 | const scaleT = tf.tensor1d([4, 5]);
|
473 | const varianceEpsilon = .001;
|
474 | const result = tf.batchNorm2d(xT, meanT, varianceT, offsetT, scaleT, varianceEpsilon);
|
475 | const offset = await offsetT.array();
|
476 | const mean = await meanT.array();
|
477 | const variance = await varianceT.array();
|
478 | const scale = await scaleT.array();
|
479 | const x = await xT.array();
|
480 | expectArraysClose(await result.data(), [
|
481 | offset[0] +
|
482 | (x[0][0] - mean[0]) * scale[0] /
|
483 | Math.sqrt(variance[0] + varianceEpsilon),
|
484 | offset[1] +
|
485 | (x[0][1] - mean[1]) * scale[1] /
|
486 | Math.sqrt(variance[1] + varianceEpsilon),
|
487 | offset[0] +
|
488 | (x[1][0] - mean[0]) * scale[0] /
|
489 | Math.sqrt(variance[0] + varianceEpsilon),
|
490 | offset[1] +
|
491 | (x[1][1] - mean[1]) * scale[1] /
|
492 | Math.sqrt(variance[1] + varianceEpsilon)
|
493 | ]);
|
494 | });
|
495 | it('simple batchnorm2D gradients, 2x2', async () => {
|
496 | const x = tf.tensor2d([2, 4, 9, 23], [2, 2]);
|
497 | const mean = tf.tensor1d([1, 2]);
|
498 | const variance = tf.tensor1d([2, 3]);
|
499 | const offset = tf.tensor1d([3, 4]);
|
500 | const scale = tf.tensor1d([2, 5]);
|
501 | const varianceEpsilon = .001;
|
502 | const dy = tf.tensor2d([1, 1, 1, 1], [2, 2]);
|
503 | const [gradX, gradMean, gradVariance, gradOffset, gradScale] = tf.grads((x, mean, variance, offset, scale) => tf.batchNorm2d(x, mean, variance, offset, scale, varianceEpsilon))([x, mean, variance, offset, scale], dy);
|
504 | expectArraysClose(await gradX.data(), [1.414, 2.887, 1.414, 2.887]);
|
505 | expect(gradX.shape).toEqual([2, 2]);
|
506 | expectArraysClose(await gradMean.data(), [-2.828, -5.773]);
|
507 | expect(gradMean.shape).toEqual([2]);
|
508 | expectArraysClose(await gradVariance.data(), [-3.180, -11.060]);
|
509 | expect(gradVariance.shape).toEqual([2]);
|
510 | expectArraysClose(await gradOffset.data(), [2, 2]);
|
511 | expect(gradOffset.shape).toEqual([2]);
|
512 | expectArraysClose(await gradScale.data(), [6.362, 13.277]);
|
513 | expect(gradScale.shape).toEqual([2]);
|
514 | });
|
515 | it('gradient with clones batchnorm2D', async () => {
|
516 | const x = tf.tensor2d([2, 4, 9, 23], [2, 2]);
|
517 | const mean = tf.tensor1d([1, 2]);
|
518 | const variance = tf.tensor1d([2, 3]);
|
519 | const offset = tf.tensor1d([3, 4]);
|
520 | const scale = tf.tensor1d([2, 5]);
|
521 | const varianceEpsilon = .001;
|
522 | const dy = tf.tensor2d([1, 1, 1, 1], [2, 2]);
|
523 | const [gradX, gradMean, gradVariance, gradOffset, gradScale] = tf.grads((x, mean, variance, offset, scale) => tf.batchNorm2d(x.clone(), mean.clone(), variance.clone(), offset.clone(), scale.clone(), varianceEpsilon)
|
524 | .clone())([x, mean, variance, offset, scale], dy);
|
525 | expectArraysClose(await gradX.data(), [1.414, 2.887, 1.414, 2.887]);
|
526 | expect(gradX.shape).toEqual([2, 2]);
|
527 | expectArraysClose(await gradMean.data(), [-2.828, -5.773]);
|
528 | expect(gradMean.shape).toEqual([2]);
|
529 | expectArraysClose(await gradVariance.data(), [-3.180, -11.060]);
|
530 | expect(gradVariance.shape).toEqual([2]);
|
531 | expectArraysClose(await gradOffset.data(), [2, 2]);
|
532 | expect(gradOffset.shape).toEqual([2]);
|
533 | expectArraysClose(await gradScale.data(), [6.362, 13.277]);
|
534 | expect(gradScale.shape).toEqual([2]);
|
535 | });
|
536 | it('batchnorm2D gradients, same shapes in x, mean and variance', async () => {
|
537 | const x = tf.tensor2d([10, 20, 30, 40], [2, 2]);
|
538 | const mean = tf.tensor2d([0, 5, 10, 15], [2, 2]);
|
539 | const variance = tf.tensor2d([2, 4, 6, 8], [2, 2]);
|
540 | const scale = tf.tensor2d([2, 5, 2, 5], [2, 2]);
|
541 | const offset = tf.tensor2d([0, 0, 0, 0], [2, 2]);
|
542 | const varianceEpsilon = .001;
|
543 | const dy = tf.tensor2d([1, 1, 1, 1], [2, 2]);
|
544 | const gradX = tf.grad((x) => tf.batchNorm2d(x, mean, variance, offset, scale, varianceEpsilon))(x, dy);
|
545 | expectArraysClose(await gradX.data(), [1.414, 2.500, 0.816, 1.768]);
|
546 | expect(gradX.shape).toEqual([2, 2]);
|
547 | const gradMean = tf.grad((mean) => tf.batchNorm2d(x, mean, variance, offset, scale, varianceEpsilon))(mean, dy);
|
548 | expectArraysClose(await gradMean.data(), [-1.414, -2.500, -0.816, -1.768]);
|
549 | expect(gradMean.shape).toEqual([2, 2]);
|
550 | const gradVariance = tf.grad((variance) => tf.batchNorm2d(x, mean, variance, offset, scale, varianceEpsilon))(variance, dy);
|
551 | expectArraysClose(await gradVariance.data(), [-3.533, -4.686, -1.360, -2.762]);
|
552 | expect(gradVariance.shape).toEqual([2, 2]);
|
553 | const gradOffset = tf.grad((offset) => tf.batchNorm2d(x, mean, variance, offset, scale, varianceEpsilon))(offset, dy);
|
554 | expectArraysClose(await gradOffset.data(), [1, 1, 1, 1]);
|
555 | expect(gradOffset.shape).toEqual([2, 2]);
|
556 | const gradScale = tf.grad((scale) => tf.batchNorm2d(x, mean, variance, offset, scale, varianceEpsilon))(scale, dy);
|
557 | expectArraysClose(await gradScale.data(), [7.069, 7.499, 8.164, 8.838]);
|
558 | expect(gradScale.shape).toEqual([2, 2]);
|
559 | });
|
560 | it('gradient with clones', () => {
|
561 | const x = tf.zeros([2, 2]);
|
562 | const mean = tf.zeros([2, 2]);
|
563 | const variance = tf.zeros([2, 2]);
|
564 | const scale = tf.zeros([2, 2]);
|
565 | const offset = tf.zeros([2, 2]);
|
566 | const varianceEpsilon = .001;
|
567 | const gradF = tf.grads((x, mean, variance, offset, scale) => tf.batchNorm2d(x.clone(), mean.clone(), variance.clone(), offset.clone(), scale.clone(), varianceEpsilon)
|
568 | .clone());
|
569 | const [gradX, gradMean, gradVariance, gradOffset, gradScale] = gradF([x, mean, variance, offset, scale]);
|
570 | expect(gradX.shape).toEqual(x.shape);
|
571 | expect(gradMean.shape).toEqual(mean.shape);
|
572 | expect(gradVariance.shape).toEqual(variance.shape);
|
573 | expect(gradOffset.shape).toEqual(offset.shape);
|
574 | expect(gradScale.shape).toEqual(scale.shape);
|
575 | });
|
576 | it('batchnorm2D matches tensorflow, 3x3', async () => {
|
577 | const x = tf.tensor2d([
|
578 | 0.3136892, 0.92389025, 0.594782, 0.05021042, 0.67545404, 0.93910035,
|
579 | 0.13277993, 0.96474269, 0.88608916
|
580 | ], [3, 3]);
|
581 | const mean = tf.tensor1d([0.19526312, 0.74857256, 0.45166398]);
|
582 | const variance = tf.tensor1d([0.22963001, 0.61521992, 0.46623685]);
|
583 | const offset = tf.tensor1d([0.43098484, 0.77712237, 0.47916298]);
|
584 | const scale = tf.tensor1d([0.62186907, 0.85673736, 0.19201061]);
|
585 | const varianceEpsilon = .001;
|
586 | const result = tf.batchNorm2d(x, mean, variance, offset, scale, varianceEpsilon);
|
587 | expectArraysClose(await result.data(), [
|
588 | 0.58433646, 0.96846228, 0.51936529, 0.24315402, 0.69732157, 0.61608542,
|
589 | 0.35007446, 1.01304821, 0.60119441
|
590 | ]);
|
591 | });
|
592 | it('throws when passed x as a non-tensor', () => {
|
593 | const mean = tf.tensor1d([1, 2]);
|
594 | const variance = tf.tensor1d([2, 3]);
|
595 | expect(() => tf.batchNorm({}, mean, variance))
|
596 | .toThrowError(/Argument 'x' passed to 'batchNorm' must be a Tensor/);
|
597 | });
|
598 | it('throws when passed mean as a non-tensor', () => {
|
599 | const x = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
600 | const variance = tf.tensor1d([2, 3]);
|
601 | expect(() => tf.batchNorm(x, {}, variance))
|
602 | .toThrowError(/Argument 'mean' passed to 'batchNorm' must be a Tensor/);
|
603 | });
|
604 | it('throws when passed variance as a non-tensor', () => {
|
605 | const x = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
606 | const mean = tf.tensor1d([1, 2]);
|
607 | const e = /Argument 'variance' passed to 'batchNorm' must be a Tensor/;
|
608 | expect(() => tf.batchNorm(x, mean, {})).toThrowError(e);
|
609 | });
|
610 | it('throws when passed scale as a non-tensor', () => {
|
611 | const x = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
612 | const mean = tf.tensor1d([1, 2]);
|
613 | const variance = tf.tensor1d([2, 3]);
|
614 | const epsilon = .001;
|
615 | expect(() => tf.batchNorm(x, mean, variance, epsilon, {}))
|
616 | .toThrowError(/Argument 'scale' passed to 'batchNorm' must be a Tensor/);
|
617 | });
|
618 | it('throws when passed offset as a non-tensor', () => {
|
619 | const x = tf.tensor4d([2, 4, 9, 23], [2, 1, 1, 2]);
|
620 | const mean = tf.tensor1d([1, 2]);
|
621 | const variance = tf.tensor1d([2, 3]);
|
622 | const epsilon = .001;
|
623 | const scale = tf.tensor1d([0.62186907, 0.85673736, 0.19201061]);
|
624 | const e = /Argument 'offset' passed to 'batchNorm' must be a Tensor/;
|
625 | expect(() => tf.batchNorm(x, mean, variance, {}, scale, epsilon))
|
626 | .toThrowError(e);
|
627 | });
|
628 | it('accepts a tensor-like object', async () => {
|
629 | const x = [[2, 4], [9, 23]];
|
630 | const mean = [1, 2];
|
631 | const variance = [2, 3];
|
632 | const offset = [3, 4];
|
633 | const scale = [4, 5];
|
634 | const varianceEpsilon = .001;
|
635 | const result = tf.batchNorm2d(x, mean, variance, offset, scale, varianceEpsilon);
|
636 | expectArraysClose(await result.data(), [
|
637 | offset[0] +
|
638 | (x[0][0] - mean[0]) * scale[0] /
|
639 | Math.sqrt(variance[0] + varianceEpsilon),
|
640 | offset[1] +
|
641 | (x[0][1] - mean[1]) * scale[1] /
|
642 | Math.sqrt(variance[1] + varianceEpsilon),
|
643 | offset[0] +
|
644 | (x[1][0] - mean[0]) * scale[0] /
|
645 | Math.sqrt(variance[0] + varianceEpsilon),
|
646 | offset[1] +
|
647 | (x[1][1] - mean[1]) * scale[1] /
|
648 | Math.sqrt(variance[1] + varianceEpsilon)
|
649 | ]);
|
650 | });
|
651 | it('throws error when x is a string tensor', () => {
|
652 | const mean = [1, 2];
|
653 | const variance = [2, 3];
|
654 | const offset = [3, 4];
|
655 | const scale = [4, 5];
|
656 | const varianceEpsilon = .001;
|
657 | const f = () => tf.batchNorm2d([['a', 'b'], ['c', 'd']], mean, variance, offset, scale, varianceEpsilon);
|
658 | expect(f).toThrowError(/Argument 'x' passed to 'batchNorm' must be numeric/);
|
659 | });
|
660 | it('throws error when mean is a string tensor', () => {
|
661 | const x = [[2, 4], [9, 23]];
|
662 | const variance = [2, 3];
|
663 | const offset = [3, 4];
|
664 | const scale = [4, 5];
|
665 | const varianceEpsilon = .001;
|
666 | const f = () => tf.batchNorm2d(x, ['a', 'b'], variance, offset, scale, varianceEpsilon);
|
667 | expect(f).toThrowError(/Argument 'mean' passed to 'batchNorm' must be numeric/);
|
668 | });
|
669 | it('throws error when variance is a string tensor', () => {
|
670 | const x = [[2, 4], [9, 23]];
|
671 | const mean = [1, 2];
|
672 | const offset = [3, 4];
|
673 | const scale = [4, 5];
|
674 | const varianceEpsilon = .001;
|
675 | const f = () => tf.batchNorm2d(x, mean, ['a', 'b'], offset, scale, varianceEpsilon);
|
676 | expect(f).toThrowError(/'variance' passed to 'batchNorm' must be numeric/);
|
677 | });
|
678 | it('throws error when scale is a string tensor', () => {
|
679 | const x = [[2, 4], [9, 23]];
|
680 | const mean = [1, 2];
|
681 | const variance = [2, 3];
|
682 | const offset = [3, 4];
|
683 | const varianceEpsilon = .001;
|
684 | const f = () => tf.batchNorm2d(x, mean, variance, offset, ['a', 'b'], varianceEpsilon);
|
685 | expect(f).toThrowError(/'scale' passed to 'batchNorm' must be numeric/);
|
686 | });
|
687 | it('throws error when offset is a string tensor', () => {
|
688 | const x = [[2, 4], [9, 23]];
|
689 | const mean = [1, 2];
|
690 | const variance = [2, 3];
|
691 | const scale = [4, 5];
|
692 | const varianceEpsilon = .001;
|
693 | const f = () => tf.batchNorm2d(x, mean, variance, ['a', 'b'], scale, varianceEpsilon);
|
694 | expect(f).toThrowError(/'offset' passed to 'batchNorm' must be numeric/);
|
695 | });
|
696 | });
|
697 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtX3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm1fdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRS9DLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO0lBQzlDLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvRCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTdCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQ3pCLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFakUsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekMsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUN4RSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDeEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztTQUN6RSxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztRQUU3QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUN6QixFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzlELE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXBDLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7U0FDakQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxF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QUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNULENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUNwRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDVCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1NBQ3JELENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRSxVQUFVO1FBQ2hELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztRQUU3QixNQUFNLE1BQU0sR0FDUixFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFdEUsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7U0FDakQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsRUFB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LElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3JCLENBQUMsS0FBa0IsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FDbEMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RSxpQkFBaUIsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztRQUU3QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDakIsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQzlCLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkUsaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3BCLENBQUMsSUFBaUIsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FDakMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RSxpQkFBaUIsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3hCLENBQUMsUUFBcUIsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FDckMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxRSxpQkFBaUIsQ0FBQyxNQUFNLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3RCLENBQUMsTUFBbUIsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FDbkMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RSxpQkFBaUIsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUNyQixDQUFDLEtBQWtCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQ2xDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkUsaUJBQWlCLENBQUMsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtJQUM5QyxFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0QsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTdCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQ3pCLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUMsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7U0FDakQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztRQUU3QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUN6QixFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRTlELE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BDLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuRCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTdCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQ3pCLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFL0QsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEMsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENB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QUUsRUFBRTtZQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUNoRCxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUNoRCxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUNoRCxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvRCxNQUFNLEtBQUssR0FBNkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0MsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFaEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTdCLE1BQU0sTUFBTSxHQUNSLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUUzRSxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQyxNQUFNLE1BQU0s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QyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztRQUU3QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDakIsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQzlCLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkUsaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3BCLENBQUMsSUFBaUIsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FDakMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RSxpQkFBaUIsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDeEIsQ0FBQyxRQUFxQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUNyQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLGlCQUFpQixDQUFDLE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUN0QixDQUFDLE1BQW1CLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQ25DLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEUsaUJBQWlCLENBQUMsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDckIsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUNsQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLGlCQUFpQixDQUFDLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNu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QUM7UUFFOUQsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEMsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7U0FDakQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTdCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQ3pCLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFL0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFM0IsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUN0RSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDdEUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFN0IsTUFBTSxNQUFNLEdBQ1IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRTNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTNCLGlCQUFpQixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1NBQ2pELENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxRQUFR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QUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFN0IsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDakIsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQzlCLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkUsaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDcEIsQ0FBQyxJQUFpQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUNqQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLGlCQUFpQixDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDeEIsQ0FBQyxRQUFxQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUNyQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLGlCQUFpQixDQUNiLE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FB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LFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDbkQsWUFBWSxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sQ0FBQyxHQUFHLDREQUE0RCxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBZSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFckIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQWUsQ0FBQyxDQUFDO2FBQ2xFLFlBQVksQ0FDVCx5REFBeUQsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNuRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFaEUsTUFBTSxDQUFDLEdBQUcsMERBQTBELENBQUM7UUFDckUsTUFBTSxDQUNGLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQzthQUN0RSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztRQUU3QixNQUFNLE1BQU0sR0FDUixFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFdEUsaUJBQWlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDaEQs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QUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztRQUU3QixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FDWCxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMxRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHtBTExfRU5WUywgZGVzY3JpYmVXaXRoRmxhZ3N9IGZyb20gJy4uL2phc21pbmVfdXRpbCc7XG5pbXBvcnQge2V4cGVjdEFycmF5c0Nsb3NlfSBmcm9tICcuLi90ZXN0X3V0aWwnO1xuXG5kZXNjcmliZVdpdGhGbGFncygnYmF0Y2hOb3JtNEQnLCBBTExfRU5WUywgKCkgPT4ge1xuICBpdCgnc2ltcGxlIGJhdGNobm9ybTRELCBubyBvZmZzZXQgb3Igc2NhbGUsIDJ4MXgxeDInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeFQgPSB0Zi50ZW5zb3I0ZChbMiwgNCwgOSwgMjNdLCBbMiwgMSwgMSwgMl0pO1xuICAgIGNvbnN0IG1lYW5UID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAgICBjb25zdCB2YXJpYW5jZVQgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0Zi5iYXRjaE5vcm00ZChcbiAgICAgICAgeFQsIG1lYW5ULCB2YXJpYW5jZVQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB2YXJpYW5jZUVwc2lsb24pO1xuXG4gICAgY29uc3QgeCA9IGF3YWl0IHhULmFycmF5KCk7XG4gICAgY29uc3QgbWVhbiA9IGF3YWl0IG1lYW5ULmFycmF5KCk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBhd2FpdCB2YXJpYW5jZVQuYXJyYXkoKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICAoeFswXVswXVswXVswXSAtIG1lYW5bMF0pICogMSAvIE1hdGguc3FydCh2YXJpYW5jZVswXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICAoeFswXVswXVswXVsxXSAtIG1lYW5bMV0pICogMSAvIE1hdGguc3FydCh2YXJpYW5jZVsxXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICAoeFsxXVswXVswXVswXSAtIG1lYW5bMF0pICogMSAvIE1hdGguc3FydCh2YXJpYW5jZVswXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICAoeFsxXVswXVswXVsxXSAtIG1lYW5bMV0pICogMSAvIE1hdGguc3FydCh2YXJpYW5jZVsxXSArIHZhcmlhbmNlRXBzaWxvbilcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3NpbXBsZSBiYXRjaG5vcm00RCwgbm8gb2Zmc2V0LCAyeDF4MXgyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHhUID0gdGYudGVuc29yNGQoWzIsIDQsIDksIDIzXSwgWzIsIDEsIDEsIDJdKTtcbiAgICBjb25zdCBtZWFuVCA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2VUID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAgICBjb25zdCBzY2FsZVQgPSB0Zi50ZW5zb3IxZChbNCwgNV0pO1xuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0Zi5iYXRjaE5vcm00ZChcbiAgICAgICAgeFQsIG1lYW5ULCB2YXJpYW5jZVQsIHVuZGVmaW5lZCwgc2NhbGVULCB2YXJpYW5jZUVwc2lsb24pO1xuICAgIGNvbnN0IHggPSBhd2FpdCB4VC5idWZmZXIoKTtcbiAgICBjb25zdCBtZWFuID0gYXdhaXQgbWVhblQuYnVmZmVyKCk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBhd2FpdCB2YXJpYW5jZVQuYnVmZmVyKCk7XG4gICAgY29uc3Qgc2NhbGUgPSBhd2FpdCBzY2FsZVQuYnVmZmVyKCk7XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICAoeC5nZXQoMCwgMCwgMCwgMCkgLSBtZWFuLmdldCgwKSkgKiBzY2FsZS5nZXQoMCkgL1xuICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMCkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgKHguZ2V0KDAsIDAsIDAsIDEpIC0gbWVhbi5nZXQoMSkpICogc2NhbGUuZ2V0KDEpIC9cbiAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDEpICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgICh4LmdldCgxLCAwLCAwLCAwKSAtIG1lYW4uZ2V0KDApKSAqIHNjYWxlLmdldCgwKSAvXG4gICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICAoeC5nZXQoMSwgMCwgMCwgMSkgLSBtZWFuLmdldCgxKSkgKiBzY2FsZS5nZXQoMSkgL1xuICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMSkgKyB2YXJpYW5jZUVwc2lsb24pXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdzaW1wbGUgYmF0Y2hub3JtNEQsIG5vIHNjYWxlLCAyeDF4MXgyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHhUID0gdGYudGVuc29yNGQoWzIsIDQsIDksIDIzXSwgWzIsIDEsIDEsIDJdKTtcbiAgICBjb25zdCBtZWFuVCA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2VUID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAgICBjb25zdCBvZmZzZXRUID0gdGYudGVuc29yMWQoWzQsIDVdKTtcblxuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0Zi5iYXRjaE5vcm00ZChcbiAgICAgICAgeFQsIG1lYW5ULCB2YXJpYW5jZVQsIG9mZnNldFQsIHVuZGVmaW5lZCwgdmFyaWFuY2VFcHNpbG9uKTtcbiAgICBjb25zdCB4ID0gYXdhaXQgeFQuYnVmZmVyKCk7XG4gICAgY29uc3QgbWVhbiA9IGF3YWl0IG1lYW5ULmJ1ZmZlcigpO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gYXdhaXQgdmFyaWFuY2VULmJ1ZmZlcigpO1xuICAgIGNvbnN0IG9mZnNldCA9IGF3YWl0IG9mZnNldFQuYnVmZmVyKCk7XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICBvZmZzZXQuZ2V0KDApICtcbiAgICAgICAgICAoeC5nZXQoMCwgMCwgMCwgMCkgLSBtZWFuLmdldCgwKSkgKiAxIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXQuZ2V0KDEpICtcbiAgICAgICAgICAoeC5nZXQoMCwgMCwgMCwgMSkgLSBtZWFuLmdldCgxKSkgKiAxIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgxKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXQuZ2V0KDApICtcbiAgICAgICAgICAoeC5nZXQoMSwgMCwgMCwgMCkgLSBtZWFuLmdldCgwKSkgKiAxIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXQuZ2V0KDEpICtcbiAgICAgICAgICAoeC5nZXQoMSwgMCwgMCwgMSkgLSBtZWFuLmdldCgxKSkgKiAxIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgxKSArIHZhcmlhbmNlRXBzaWxvbilcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3NpbXBsZSBiYXRjaG5vcm00RCwgMngxeDF4MicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4VCA9IHRmLnRlbnNvcjRkKFsyLCA0LCA5LCAyM10sIFsyLCAxLCAxLCAyXSk7XG4gICAgY29uc3QgbWVhblQgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlVCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gICAgY29uc3Qgb2Zmc2V0VCA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gICAgY29uc3Qgc2NhbGVUID0gdGYudGVuc29yMWQoWzQsIDVdKTtcblxuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICB0Zi5iYXRjaE5vcm00ZCh4VCwgbWVhblQsIHZhcmlhbmNlVCwgb2Zmc2V0VCwgc2NhbGVULCB2YXJpYW5jZUVwc2lsb24pO1xuICAgIGNvbnN0IHggPSBhd2FpdCB4VC5idWZmZXIoKTtcbiAgICBjb25zdCBtZWFuID0gYXdhaXQgbWVhblQuYnVmZmVyKCk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBhd2FpdCB2YXJpYW5jZVQuYnVmZmVyKCk7XG4gICAgY29uc3Qgc2NhbGUgPSBhd2FpdCBzY2FsZVQuYnVmZmVyKCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgb2Zmc2V0VC5idWZmZXIoKTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHJlc3VsdC5kYXRhKCksIFtcbiAgICAgIG9mZnNldC5nZXQoMCkgK1xuICAgICAgICAgICh4LmdldCgwLCAwLCAwLCAwKSAtIG1lYW4uZ2V0KDApKSAqIHNjYWxlLmdldCgwKSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMCkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0LmdldCgxKSArXG4gICAgICAgICAgKHguZ2V0KDAsIDAsIDAsIDEpIC0gbWVhbi5nZXQoMSkpICogc2NhbGUuZ2V0KDEpIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgxKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXQuZ2V0KDApICtcbiAgICAgICAgICAoeC5nZXQoMSwgMCwgMCwgMCkgLSBtZWFuLmdldCgwKSkgKiBzY2FsZS5nZXQoMCkgL1xuICAgICAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDApICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgIG9mZnNldC5nZXQoMSkgK1xuICAgICAgICAgICh4LmdldCgxLCAwLCAwLCAxKSAtIG1lYW4uZ2V0KDEpKSAqIHNjYWxlLmdldCgxKSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMSkgKyB2YXJpYW5jZUVwc2lsb24pXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGEgdGVuc29yLWxpa2Ugb2JqZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHggPSBbW1tbMiwgNF1dXSwgW1tbOSwgMjNdXV1dOyAgLy8gMngxeDF4MlxuICAgIGNvbnN0IG1lYW4gPSBbMSwgMl07XG4gICAgY29uc3QgdmFyaWFuY2UgPSBbMiwgM107XG4gICAgY29uc3Qgb2Zmc2V0ID0gWzMsIDRdO1xuICAgIGNvbnN0IHNjYWxlID0gWzQsIDVdO1xuXG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIHRmLmJhdGNoTm9ybTRkKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgcmVzdWx0LmRhdGEoKSwgW1xuICAgICAgb2Zmc2V0WzBdICtcbiAgICAgICAgICAoeFswXVswXVswXVswXSAtIG1lYW5bMF0pICogc2NhbGVbMF0gL1xuICAgICAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2VbMF0gKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0WzFdICtcbiAgICAgICAgICAoeFswXVswXVswXVsxXSAtIG1lYW5bMV0pICogc2NhbGVbMV0gL1xuICAgICAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2VbMV0gKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0WzBdICtcbiAgICAgICAgICAoeFsxXVswXVswXVswXSAtIG1lYW5bMF0pICogc2NhbGVbMF0gL1xuICAgICAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2VbMF0gKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0WzFdICtcbiAgICAgICAgICAoeFsxXVswXVswXVsxXSAtIG1lYW5bMV0pICogc2NhbGVbMV0gL1xuICAgICAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2VbMV0gKyB2YXJpYW5jZUVwc2lsb24pXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdzaW1wbGUgYmF0Y2hub3JtNEQgZ3JhZGllbnRzLCAyeDF4MXgyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZChbMiwgNCwgOSwgMjNdLCBbMiwgMSwgMSwgMl0pO1xuICAgIGNvbnN0IG1lYW4gPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAgICBjb25zdCBvZmZzZXQgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICAgIGNvbnN0IHNjYWxlID0gdGYudGVuc29yMWQoWzIsIDVdKTtcblxuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjRkKFstMSwgLTEsIC0xLCAtMV0sIFsyLCAxLCAxLCAyXSk7XG4gICAgY29uc3QgZ3JhZFggPSB0Zi5ncmFkKFxuICAgICAgICAoeDogdGYuVGVuc29yNEQpID0+IHRmLmJhdGNoTm9ybTRkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHgsIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkWC5kYXRhKCksIFstMS40MTQsIC0yLjg4NywgLTEuNDE0LCAtMi44ODddKTtcbiAgICBleHBlY3QoZ3JhZFguc2hhcGUpLnRvRXF1YWwoWzIsIDEsIDEsIDJdKTtcbiAgICBjb25zdCBncmFkTWVhbiA9IHRmLmdyYWQoXG4gICAgICAgIChtZWFuOiB0Zi5UZW5zb3IxRCkgPT4gdGYuYmF0Y2hOb3JtNGQoXG4gICAgICAgICAgICB4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSkobWVhbiwgZHkpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRNZWFuLmRhdGEoKSwgWzIuODI4LCA1Ljc3M10pO1xuICAgIGV4cGVjdChncmFkTWVhbi5zaGFwZSkudG9FcXVhbChbMl0pO1xuICAgIGNvbnN0IGdyYWRWYXJpYW5jZSA9IHRmLmdyYWQoXG4gICAgICAgICh2YXJpYW5jZTogdGYuVGVuc29yMUQpID0+IHRmLmJhdGNoTm9ybTRkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHZhcmlhbmNlLCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFZhcmlhbmNlLmRhdGEoKSwgWzMuMTgwLCAxMS4wNjBdKTtcbiAgICBleHBlY3QoZ3JhZFZhcmlhbmNlLnNoYXBlKS50b0VxdWFsKFsyXSk7XG4gICAgY29uc3QgZ3JhZE9mZnNldCA9IHRmLmdyYWQoXG4gICAgICAgIChvZmZzZXQ6IHRmLlRlbnNvcjFEKSA9PiB0Zi5iYXRjaE5vcm00ZChcbiAgICAgICAgICAgIHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pKShvZmZzZXQsIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkT2Zmc2V0LmRhdGEoKSwgYXdhaXQgZHkuc3VtKFswLCAxLCAyXSkuZGF0YSgpKTtcbiAgICBleHBlY3QoZ3JhZE9mZnNldC5zaGFwZSkudG9FcXVhbChbMl0pO1xuICAgIGNvbnN0IGdyYWRTY2FsZSA9IHRmLmdyYWQoXG4gICAgICAgIChzY2FsZTogdGYuVGVuc29yMUQpID0+IHRmLmJhdGNoTm9ybTRkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHNjYWxlLCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFNjYWxlLmRhdGEoKSwgWy02LjM2MiwgLTEzLjI3N10pO1xuICAgIGV4cGVjdChncmFkU2NhbGUuc2hhcGUpLnRvRXF1YWwoWzJdKTtcbiAgfSk7XG5cbiAgaXQoJ2JhdGNobm9ybTREIGdyYWRpZW50cywgc2FtZSBzaGFwZXMgaW4geCwgbWVhbiBhbmQgdmFyaWFuY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeCA9IHRmLnRlbnNvcjRkKFsxMCwgMjAsIDMwLCA0MF0sIFsyLCAxLCAxLCAyXSk7XG4gICAgY29uc3QgbWVhbiA9IHRmLnRlbnNvcjRkKFswLCA1LCAxMCwgMTVdLCBbMiwgMSwgMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gdGYudGVuc29yNGQoWzIsIDQsIDYsIDhdLCBbMiwgMSwgMSwgMl0pO1xuICAgIGNvbnN0IHNjYWxlID0gdGYudGVuc29yNGQoWzIsIDUsIDIsIDVdLCBbMiwgMSwgMSwgMl0pO1xuICAgIGNvbnN0IG9mZnNldCA9IHRmLnRlbnNvcjRkKFswLCAwLCAwLCAwXSwgWzIsIDEsIDEsIDJdKTtcblxuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjRkKFstMSwgLTEsIC0xLCAtMV0sIFsyLCAxLCAxLCAyXSk7XG4gICAgY29uc3QgZ3JhZFggPSB0Zi5ncmFkKFxuICAgICAgICAoeDogdGYuVGVuc29yNEQpID0+IHRmLmJhdGNoTm9ybTRkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHgsIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkWC5kYXRhKCksIFstMS40MTQsIC0yLjUwMCwgLTAuODE2LCAtMS43NjhdKTtcbiAgICBleHBlY3QoZ3JhZFguc2hhcGUpLnRvRXF1YWwoWzIsIDEsIDEsIDJdKTtcbiAgICBjb25zdCBncmFkTWVhbiA9IHRmLmdyYWQoXG4gICAgICAgIChtZWFuOiB0Zi5UZW5zb3I0RCkgPT4gdGYuYmF0Y2hOb3JtNGQoXG4gICAgICAgICAgICB4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSkobWVhbiwgZHkpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRNZWFuLmRhdGEoKSwgWzEuNDE0LCAyLjUwMCwgMC44MTYsIDEuNzY4XSk7XG4gICAgZXhwZWN0KGdyYWRNZWFuLnNoYXBlKS50b0VxdWFsKFsyLCAxLCAxLCAyXSk7XG4gICAgY29uc3QgZ3JhZFZhcmlhbmNlID0gdGYuZ3JhZChcbiAgICAgICAgKHZhcmlhbmNlOiB0Zi5UZW5zb3I0RCkgPT4gdGYuYmF0Y2hOb3JtNGQoXG4gICAgICAgICAgICB4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSkodmFyaWFuY2UsIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkVmFyaWFuY2UuZGF0YSgpLCBbMy41MzMsIDQuNjg2LCAxLjM2MCwgMi43NjJdKTtcbiAgICBleHBlY3QoZ3JhZFZhcmlhbmNlLnNoYXBlKS50b0VxdWFsKFsyLCAxLCAxLCAyXSk7XG4gICAgY29uc3QgZ3JhZE9mZnNldCA9IHRmLmdyYWQoXG4gICAgICAgIChvZmZzZXQ6IHRmLlRlbnNvcjREKSA9PiB0Zi5iYXRjaE5vcm00ZChcbiAgICAgICAgICAgIHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pKShvZmZzZXQsIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkT2Zmc2V0LmRhdGEoKSwgYXdhaXQgZHkuZGF0YSgpKTtcbiAgICBleHBlY3QoZ3JhZE9mZnNldC5zaGFwZSkudG9FcXVhbChbMiwgMSwgMSwgMl0pO1xuICAgIGNvbnN0IGdyYWRTY2FsZSA9IHRmLmdyYWQoXG4gICAgICAgIChzY2FsZTogdGYuVGVuc29yNEQpID0+IHRmLmJhdGNoTm9ybTRkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHNjYWxlLCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFNjYWxlLmRhdGEoKSwgWy03LjA2OSwgLTcuNDk5LCAtOC4xNjQsIC04LjgzOF0pO1xuICAgIGV4cGVjdChncmFkU2NhbGUuc2hhcGUpLnRvRXF1YWwoWzIsIDEsIDEsIDJdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmVXaXRoRmxhZ3MoJ2JhdGNoTm9ybTNEJywgQUxMX0VOVlMsICgpID0+IHtcbiAgaXQoJ3NpbXBsZSBiYXRjaG5vcm0zRCwgbm8gb2Zmc2V0IG9yIHNjYWxlLCAyeDF4MicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4VCA9IHRmLnRlbnNvcjNkKFsyLCA0LCA5LCAyM10sIFsyLCAxLCAyXSk7XG4gICAgY29uc3QgbWVhblQgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlVCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRmLmJhdGNoTm9ybTNkKFxuICAgICAgICB4VCwgbWVhblQsIHZhcmlhbmNlVCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHZhcmlhbmNlRXBzaWxvbik7XG4gICAgY29uc3QgeCA9IGF3YWl0IHhULmJ1ZmZlcigpO1xuICAgIGNvbnN0IG1lYW4gPSBhd2FpdCBtZWFuVC5idWZmZXIoKTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IGF3YWl0IHZhcmlhbmNlVC5idWZmZXIoKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICAoeC5nZXQoMCwgMCwgMCkgLSBtZWFuLmdldCgwKSkgKiAxIC9cbiAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDApICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgICh4LmdldCgwLCAwLCAxKSAtIG1lYW4uZ2V0KDEpKSAqIDEgL1xuICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMSkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgKHguZ2V0KDEsIDAsIDApIC0gbWVhbi5nZXQoMCkpICogMSAvXG4gICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICAoeC5nZXQoMSwgMCwgMSkgLSBtZWFuLmdldCgxKSkgKiAxIC9cbiAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDEpICsgdmFyaWFuY2VFcHNpbG9uKVxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc2ltcGxlIGJhdGNobm9ybTNELCBubyBvZmZzZXQsIDJ4MXgyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHhUID0gdGYudGVuc29yM2QoWzIsIDQsIDksIDIzXSwgWzIsIDEsIDJdKTtcbiAgICBjb25zdCBtZWFuVCA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2VUID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAgICBjb25zdCBzY2FsZVQgPSB0Zi50ZW5zb3IxZChbNCwgNV0pO1xuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0Zi5iYXRjaE5vcm0zZChcbiAgICAgICAgeFQsIG1lYW5ULCB2YXJpYW5jZVQsIHVuZGVmaW5lZCwgc2NhbGVULCB2YXJpYW5jZUVwc2lsb24pO1xuXG4gICAgY29uc3QgeCA9IGF3YWl0IHhULmJ1ZmZlcigpO1xuICAgIGNvbnN0IG1lYW4gPSBhd2FpdCBtZWFuVC5idWZmZXIoKTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IGF3YWl0IHZhcmlhbmNlVC5idWZmZXIoKTtcbiAgICBjb25zdCBzY2FsZSA9IGF3YWl0IHNjYWxlVC5idWZmZXIoKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICAoeC5nZXQoMCwgMCwgMCkgLSBtZWFuLmdldCgwKSkgKiBzY2FsZS5nZXQoMCkgL1xuICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMCkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgKHguZ2V0KDAsIDAsIDEpIC0gbWVhbi5nZXQoMSkpICogc2NhbGUuZ2V0KDEpIC9cbiAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDEpICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgICh4LmdldCgxLCAwLCAwKSAtIG1lYW4uZ2V0KDApKSAqIHNjYWxlLmdldCgwKSAvXG4gICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICAoeC5nZXQoMSwgMCwgMSkgLSBtZWFuLmdldCgxKSkgKiBzY2FsZS5nZXQoMSkgL1xuICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMSkgKyB2YXJpYW5jZUVwc2lsb24pXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdzaW1wbGUgYmF0Y2hub3JtM0QsIG5vIHNjYWxlLCAyeDF4MicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4VCA9IHRmLnRlbnNvcjNkKFsyLCA0LCA5LCAyM10sIFsyLCAxLCAyXSk7XG4gICAgY29uc3QgbWVhblQgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlVCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gICAgY29uc3Qgb2Zmc2V0VCA9IHRmLnRlbnNvcjFkKFs0LCA1XSk7XG5cbiAgICBjb25zdCB2YXJpYW5jZUVwc2lsb24gPSAuMDAxO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGYuYmF0Y2hOb3JtM2QoXG4gICAgICAgIHhULCBtZWFuVCwgdmFyaWFuY2VULCBvZmZzZXRULCB1bmRlZmluZWQsIHZhcmlhbmNlRXBzaWxvbik7XG5cbiAgICBjb25zdCB4ID0gYXdhaXQgeFQuYnVmZmVyKCk7XG4gICAgY29uc3QgbWVhbiA9IGF3YWl0IG1lYW5ULmJ1ZmZlcigpO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gYXdhaXQgdmFyaWFuY2VULmJ1ZmZlcigpO1xuICAgIGNvbnN0IG9mZnNldCA9IGF3YWl0IG9mZnNldFQuYnVmZmVyKCk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgcmVzdWx0LmRhdGEoKSwgW1xuICAgICAgb2Zmc2V0LmdldCgwKSArXG4gICAgICAgICAgKHguZ2V0KDAsIDAsIDApIC0gbWVhbi5nZXQoMCkpICogMSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMCkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0LmdldCgxKSArXG4gICAgICAgICAgKHguZ2V0KDAsIDAsIDEpIC0gbWVhbi5nZXQoMSkpICogMSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMSkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0LmdldCgwKSArXG4gICAgICAgICAgKHguZ2V0KDEsIDAsIDApIC0gbWVhbi5nZXQoMCkpICogMSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMCkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0LmdldCgxKSArXG4gICAgICAgICAgKHguZ2V0KDEsIDAsIDEpIC0gbWVhbi5nZXQoMSkpICogMSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMSkgKyB2YXJpYW5jZUVwc2lsb24pXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdzaW1wbGUgYmF0Y2hub3JtM0QsIDJ4MXgyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHhUID0gdGYudGVuc29yM2QoWzIsIDQsIDksIDIzXSwgWzIsIDEsIDJdKTtcbiAgICBjb25zdCBtZWFuVCA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2VUID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAgICBjb25zdCBvZmZzZXRUID0gdGYudGVuc29yMWQoWzMsIDRdKTtcbiAgICBjb25zdCBzY2FsZVQgPSB0Zi50ZW5zb3IxZChbNCwgNV0pO1xuXG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIHRmLmJhdGNoTm9ybTNkKHhULCBtZWFuVCwgdmFyaWFuY2VULCBvZmZzZXRULCBzY2FsZVQsIHZhcmlhbmNlRXBzaWxvbik7XG4gICAgY29uc3QgeCA9IGF3YWl0IHhULmJ1ZmZlcigpO1xuICAgIGNvbnN0IG1lYW4gPSBhd2FpdCBtZWFuVC5idWZmZXIoKTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IGF3YWl0IHZhcmlhbmNlVC5idWZmZXIoKTtcbiAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCBvZmZzZXRULmJ1ZmZlcigpO1xuICAgIGNvbnN0IHNjYWxlID0gYXdhaXQgc2NhbGVULmJ1ZmZlcigpO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgcmVzdWx0LmRhdGEoKSwgW1xuICAgICAgb2Zmc2V0LmdldCgwKSArXG4gICAgICAgICAgKHguZ2V0KDAsIDAsIDApIC0gbWVhbi5nZXQoMCkpICogc2NhbGUuZ2V0KDApIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXQuZ2V0KDEpICtcbiAgICAgICAgICAoeC5nZXQoMCwgMCwgMSkgLSBtZWFuLmdldCgxKSkgKiBzY2FsZS5nZXQoMSkgL1xuICAgICAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDEpICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgIG9mZnNldC5nZXQoMCkgK1xuICAgICAgICAgICh4LmdldCgxLCAwLCAwKSAtIG1lYW4uZ2V0KDApKSAqIHNjYWxlLmdldCgwKSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMCkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0LmdldCgxKSArXG4gICAgICAgICAgKHguZ2V0KDEsIDAsIDEpIC0gbWVhbi5nZXQoMSkpICogc2NhbGUuZ2V0KDEpIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgxKSArIHZhcmlhbmNlRXBzaWxvbilcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ2FjY2VwdHMgYSB0ZW5zb3ItbGlrZSBvYmplY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeCA9IFtbWzIsIDRdXSwgW1s5LCAyM11dXTsgIC8vIDJ4MXgyXG4gICAgY29uc3QgbWVhbiA9IFsxLCAyXTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IFsyLCAzXTtcbiAgICBjb25zdCBvZmZzZXQgPSBbMywgNF07XG4gICAgY29uc3Qgc2NhbGUgPSBbNCwgNV07XG5cbiAgICBjb25zdCB2YXJpYW5jZUVwc2lsb24gPSAuMDAxO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgdGYuYmF0Y2hOb3JtM2QoeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICBvZmZzZXRbMF0gK1xuICAgICAgICAgICh4WzBdWzBdWzBdIC0gbWVhblswXSkgKiBzY2FsZVswXSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZVswXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXRbMV0gK1xuICAgICAgICAgICh4WzBdWzBdWzFdIC0gbWVhblsxXSkgKiBzY2FsZVsxXSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZVsxXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXRbMF0gK1xuICAgICAgICAgICh4WzFdWzBdWzBdIC0gbWVhblswXSkgKiBzY2FsZVswXSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZVswXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXRbMV0gK1xuICAgICAgICAgICh4WzFdWzBdWzFdIC0gbWVhblsxXSkgKiBzY2FsZVsxXSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZVsxXSArIHZhcmlhbmNlRXBzaWxvbilcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ2JhdGNobm9ybTNELCB4LG1lYW4sdmFyLG9mZnNldCxzY2FsZSBhcmUgYWxsIDNEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMiwgMSwgMl07XG4gICAgY29uc3QgeFQgPSB0Zi50ZW5zb3IzZChbMiwgNCwgOSwgMjNdLCBzaGFwZSk7XG4gICAgY29uc3QgbWVhblQgPSB0Zi50ZW5zb3IzZChbMSwgMiwgMywgNF0sIHNoYXBlKTtcbiAgICBjb25zdCB2YXJpYW5jZVQgPSB0Zi50ZW5zb3IzZChbMiwgMywgNCwgNV0sIHNoYXBlKTtcbiAgICBjb25zdCBvZmZzZXRUID0gdGYudGVuc29yM2QoWzMsIDQsIDUsIDZdLCBzaGFwZSk7XG4gICAgY29uc3Qgc2NhbGVUID0gdGYudGVuc29yM2QoWzQsIDUsIDYsIDddLCBzaGFwZSk7XG5cbiAgICBjb25zdCB2YXJpYW5jZUVwc2lsb24gPSAuMDAxO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgdGYuYmF0Y2hOb3JtM2QoeFQsIG1lYW5ULCB2YXJpYW5jZVQsIG9mZnNldFQsIHNjYWxlVCwgdmFyaWFuY2VFcHNpbG9uKTtcblxuICAgIGNvbnN0IHggPSBhd2FpdCB4VC5idWZmZXIoKTtcbiAgICBjb25zdCBtZWFuID0gYXdhaXQgbWVhblQuYnVmZmVyKCk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBhd2FpdCB2YXJpYW5jZVQuYnVmZmVyKCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgb2Zmc2V0VC5idWZmZXIoKTtcbiAgICBjb25zdCBzY2FsZSA9IGF3YWl0IHNjYWxlVC5idWZmZXIoKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICBvZmZzZXQuZ2V0KDAsIDAsIDApICtcbiAgICAgICAgICAoeC5nZXQoMCwgMCwgMCkgLSBtZWFuLmdldCgwLCAwLCAwKSkgKiBzY2FsZS5nZXQoMCwgMCwgMCkgL1xuICAgICAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDAsIDAsIDApICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgIG9mZnNldC5nZXQoMCwgMCwgMSkgK1xuICAgICAgICAgICh4LmdldCgwLCAwLCAxKSAtIG1lYW4uZ2V0KDAsIDAsIDEpKSAqIHNjYWxlLmdldCgwLCAwLCAxKSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMCwgMCwgMSkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0LmdldCgxLCAwLCAwKSArXG4gICAgICAgICAgKHguZ2V0KDEsIDAsIDApIC0gbWVhbi5nZXQoMSwgMCwgMCkpICogc2NhbGUuZ2V0KDEsIDAsIDApIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgxLCAwLCAwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXQuZ2V0KDEsIDAsIDEpICtcbiAgICAgICAgICAoeC5nZXQoMSwgMCwgMSkgLSBtZWFuLmdldCgxLCAwLCAxKSkgKiBzY2FsZS5nZXQoMSwgMCwgMSkgL1xuICAgICAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDEsIDAsIDEpICsgdmFyaWFuY2VFcHNpbG9uKVxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc2ltcGxlIGJhdGNobm9ybTNEIGdyYWRpZW50cywgMngxeDInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeCA9IHRmLnRlbnNvcjNkKFsyLCA0LCA5LCAyM10sIFsyLCAxLCAyXSk7XG4gICAgY29uc3QgbWVhbiA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICAgIGNvbnN0IG9mZnNldCA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gICAgY29uc3Qgc2NhbGUgPSB0Zi50ZW5zb3IxZChbMiwgNV0pO1xuXG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IGR5ID0gdGYudGVuc29yM2QoWzEsIDEsIDEsIDFdLCBbMiwgMSwgMl0pO1xuICAgIGNvbnN0IGdyYWRYID0gdGYuZ3JhZChcbiAgICAgICAgKHg6IHRmLlRlbnNvcjNEKSA9PiB0Zi5iYXRjaE5vcm0zZChcbiAgICAgICAgICAgIHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pKSh4LCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFguZGF0YSgpLCBbMS40MTQsIDIuODg3LCAxLjQxNCwgMi44ODddKTtcbiAgICBleHBlY3QoZ3JhZFguc2hhcGUpLnRvRXF1YWwoWzIsIDEsIDJdKTtcbiAgICBjb25zdCBncmFkTWVhbiA9IHRmLmdyYWQoXG4gICAgICAgIChtZWFuOiB0Zi5UZW5zb3IxRCkgPT4gdGYuYmF0Y2hOb3JtM2QoXG4gICAgICAgICAgICB4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSkobWVhbiwgZHkpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRNZWFuLmRhdGEoKSwgWy0yLjgyOCwgLTUuNzczXSk7XG4gICAgZXhwZWN0KGdyYWRNZWFuLnNoYXBlKS50b0VxdWFsKFsyXSk7XG4gICAgY29uc3QgZ3JhZFZhcmlhbmNlID0gdGYuZ3JhZChcbiAgICAgICAgKHZhcmlhbmNlOiB0Zi5UZW5zb3IxRCkgPT4gdGYuYmF0Y2hOb3JtM2QoXG4gICAgICAgICAgICB4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSkodmFyaWFuY2UsIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkVmFyaWFuY2UuZGF0YSgpLCBbLTMuMTgwLCAtMTEuMDYwXSk7XG4gICAgZXhwZWN0KGdyYWRWYXJpYW5jZS5zaGFwZSkudG9FcXVhbChbMl0pO1xuICAgIGNvbnN0IGdyYWRPZmZzZXQgPSB0Zi5ncmFkKFxuICAgICAgICAob2Zmc2V0OiB0Zi5UZW5zb3IxRCkgPT4gdGYuYmF0Y2hOb3JtM2QoXG4gICAgICAgICAgICB4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSkob2Zmc2V0LCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZE9mZnNldC5kYXRhKCksIFsyLCAyXSk7XG4gICAgZXhwZWN0KGdyYWRPZmZzZXQuc2hhcGUpLnRvRXF1YWwoWzJdKTtcbiAgICBjb25zdCBncmFkU2NhbGUgPSB0Zi5ncmFkKFxuICAgICAgICAoc2NhbGU6IHRmLlRlbnNvcjFEKSA9PiB0Zi5iYXRjaE5vcm0zZChcbiAgICAgICAgICAgIHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pKShzY2FsZSwgZHkpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRTY2FsZS5kYXRhKCksIFs2LjM2MiwgMTMuMjc3XSk7XG4gICAgZXhwZWN0KGdyYWRTY2FsZS5zaGFwZSkudG9FcXVhbChbMl0pO1xuICB9KTtcblxuICBpdCgnYmF0Y2hub3JtM0QgZ3JhZGllbnRzLCBzYW1lIHNoYXBlcyBpbiB4LCBtZWFuIGFuZCB2YXJpYW5jZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4ID0gdGYudGVuc29yM2QoWzEwLCAyMCwgMzAsIDQwXSwgWzIsIDEsIDJdKTtcbiAgICBjb25zdCBtZWFuID0gdGYudGVuc29yM2QoWzAsIDUsIDEwLCAxNV0sIFsyLCAxLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi50ZW5zb3IzZChbMiwgNCwgNiwgOF0sIFsyLCAxLCAyXSk7XG4gICAgY29uc3Qgc2NhbGUgPSB0Zi50ZW5zb3IzZChbMiwgNSwgMiwgNV0sIFsyLCAxLCAyXSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGYudGVuc29yM2QoWzAsIDAsIDAsIDBdLCBbMiwgMSwgMl0pO1xuXG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IGR5ID0gdGYudGVuc29yM2QoWzEsIDEsIDEsIDFdLCBbMiwgMSwgMl0pO1xuICAgIGNvbnN0IGdyYWRYID0gdGYuZ3JhZChcbiAgICAgICAgKHg6IHRmLlRlbnNvcjNEKSA9PiB0Zi5iYXRjaE5vcm0zZChcbiAgICAgICAgICAgIHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pKSh4LCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFguZGF0YSgpLCBbMS40MTQsIDIuNTAwLCAwLjgxNiwgMS43NjhdKTtcbiAgICBleHBlY3QoZ3JhZFguc2hhcGUpLnRvRXF1YWwoWzIsIDEsIDJdKTtcbiAgICBjb25zdCBncmFkTWVhbiA9IHRmLmdyYWQoXG4gICAgICAgIChtZWFuOiB0Zi5UZW5zb3IzRCkgPT4gdGYuYmF0Y2hOb3JtM2QoXG4gICAgICAgICAgICB4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSkobWVhbiwgZHkpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRNZWFuLmRhdGEoKSwgWy0xLjQxNCwgLTIuNTAwLCAtMC44MTYsIC0xLjc2OF0pO1xuICAgIGV4cGVjdChncmFkTWVhbi5zaGFwZSkudG9FcXVhbChbMiwgMSwgMl0pO1xuICAgIGNvbnN0IGdyYWRWYXJpYW5jZSA9IHRmLmdyYWQoXG4gICAgICAgICh2YXJpYW5jZTogdGYuVGVuc29yM0QpID0+IHRmLmJhdGNoTm9ybTNkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHZhcmlhbmNlLCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoXG4gICAgICAgIGF3YWl0IGdyYWRWYXJpYW5jZS5kYXRhKCksIFstMy41MzMsIC00LjY4NiwgLTEuMzYwLCAtMi43NjJdKTtcbiAgICBleHBlY3QoZ3JhZFZhcmlhbmNlLnNoYXBlKS50b0VxdWFsKFsyLCAxLCAyXSk7XG4gICAgY29uc3QgZ3JhZE9mZnNldCA9IHRmLmdyYWQoXG4gICAgICAgIChvZmZzZXQ6IHRmLlRlbnNvcjNEKSA9PiB0Zi5iYXRjaE5vcm0zZChcbiAgICAgICAgICAgIHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pKShvZmZzZXQsIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkT2Zmc2V0LmRhdGEoKSwgWzEsIDEsIDEsIDFdKTtcbiAgICBleHBlY3QoZ3JhZE9mZnNldC5zaGFwZSkudG9FcXVhbChbMiwgMSwgMl0pO1xuICAgIGNvbnN0IGdyYWRTY2FsZSA9IHRmLmdyYWQoXG4gICAgICAgIChzY2FsZTogdGYuVGVuc29yM0QpID0+IHRmLmJhdGNoTm9ybTNkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHNjYWxlLCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFNjYWxlLmRhdGEoKSwgWzcuMDY5LCA3LjQ5OSwgOC4xNjQsIDguODM4XSk7XG4gICAgZXhwZWN0KGdyYWRTY2FsZS5zaGFwZSkudG9FcXVhbChbMiwgMSwgMl0pO1xuICB9KTtcblxuICBpdCgnYmF0Y2hub3JtIG1hdGNoZXMgdGVuc29yZmxvdywgMngzeDMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeCA9IHRmLnRlbnNvcjNkKFxuICAgICAgICBbXG4gICAgICAgICAgMC40OTk1NTYwMywgMC4wNDE1ODYxNSwgLTEuMDk0NDA1MjQsIDIuMDM4NTQxNjUsIC0wLjYxNTc4MzQ0LFxuICAgICAgICAgIDIuODc1MzM1NzMsIDEuMTgxMDU5ODcsIDAuODA3NDYyLCAxLjg3ODg4ODM3LCAyLjI2NTYzOTYyLCAtMC4zNzA0MDkzNSxcbiAgICAgICAgICAxLjM1ODQ4NzUzLCAtMC43NTM0NzA5NCwgMC4xNTY4MzExNywgMC45MTkyNTk0NiwgMC4zNDEyMTI3OSxcbiAgICAgICAgICAwLjkyNzE3MTQzLCAxLjg5NjgzOTY1XG4gICAgICAgIF0sXG4gICAgICAgIFsyLCAzLCAzXSk7XG4gICAgY29uc3QgbWVhbiA9IHRmLnRlbnNvcjFkKFswLjM5NzQ1MDYyLCAtMC40ODA2Mjg5NCwgMC40ODQ3ODIyXSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi50ZW5zb3IxZChbMC4zMjM3NTM0MywgMC42NzExNzY0MywgMS4wODMzNDY1M10pO1xuICAgIGNvbnN0IG9mZnNldCA9IHRmLnRlbnNvcjFkKFswLjY5Mzk4NzQ5LCAtMS4yOTA1NjM4NywgMC45NDI5NzIzXSk7XG4gICAgY29uc3Qgc2NhbGUgPSB0Zi50ZW5zb3IxZChbLTAuNTYwNzI3MSwgMC45ODc4NDU3LCAwLjI1MTgxNTczXSk7XG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIHRmLmJhdGNoTm9ybTNkKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgcmVzdWx0LmRhdGEoKSwgW1xuICAgICAgMC41OTM1MjA0OSwgLTAuNjYxMzUyMDIsIDAuNTYxMDg3NCwgLTAuOTIwNzcwMTUsIC0xLjQ1MzQxMDE5LCAxLjUyMTA2NDczLFxuICAgICAgLTAuMDc3MDQ3NzYsIDAuMjYxNDQ0MjksIDEuMjgwMTAwMTcsIC0xLjE0NDIyNDA0LCAtMS4xNTc3NjEzNiwgMS4xNTQyNTQ5MyxcbiAgICAgIDEuODI2NDQxMDQsIC0wLjUyMjQ5NDQyLCAxLjA0ODAzOTE5LCAwLjc0OTMyMjkxLCAwLjQwNTY4MTAxLCAxLjI4NDQ0MTJcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmVXaXRoRmxhZ3MoJ2JhdGNoTm9ybTJEJywgQUxMX0VOVlMsICgpID0+IHtcbiAgaXQoJ3NpbXBsZSBiYXRjaG5vcm0yRCwgbm8gb2Zmc2V0IG9yIHNjYWxlLCAyeDInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeFQgPSB0Zi50ZW5zb3IyZChbMiwgNCwgOSwgMjNdLCBbMiwgMl0pO1xuICAgIGNvbnN0IG1lYW5UID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAgICBjb25zdCB2YXJpYW5jZVQgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0Zi5iYXRjaE5vcm0yZChcbiAgICAgICAgeFQsIG1lYW5ULCB2YXJpYW5jZVQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB2YXJpYW5jZUVwc2lsb24pO1xuXG4gICAgY29uc3QgeCA9IGF3YWl0IHhULmJ1ZmZlcigpO1xuICAgIGNvbnN0IG1lYW4gPSBhd2FpdCBtZWFuVC5idWZmZXIoKTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IGF3YWl0IHZhcmlhbmNlVC5idWZmZXIoKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICAoeC5nZXQoMCwgMCkgLSBtZWFuLmdldCgwKSkgKiAxIC9cbiAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDApICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgICh4LmdldCgwLCAxKSAtIG1lYW4uZ2V0KDEpKSAqIDEgL1xuICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMSkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgKHguZ2V0KDEsIDApIC0gbWVhbi5nZXQoMCkpICogMSAvXG4gICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICAoeC5nZXQoMSwgMSkgLSBtZWFuLmdldCgxKSkgKiAxIC9cbiAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDEpICsgdmFyaWFuY2VFcHNpbG9uKVxuICAgIF0pO1xuICB9KTtcbiAgaXQoJ3NpbXBsZSBiYXRjaG5vcm0yRCwgbm8gb2Zmc2V0LCAyeDInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeFQgPSB0Zi50ZW5zb3IyZChbMiwgNCwgOSwgMjNdLCBbMiwgMl0pO1xuICAgIGNvbnN0IG1lYW5UID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAgICBjb25zdCB2YXJpYW5jZVQgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICAgIGNvbnN0IHNjYWxlVCA9IHRmLnRlbnNvcjFkKFs0LCA1XSk7XG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRmLmJhdGNoTm9ybTJkKFxuICAgICAgICB4VCwgbWVhblQsIHZhcmlhbmNlVCwgdW5kZWZpbmVkLCBzY2FsZVQsIHZhcmlhbmNlRXBzaWxvbik7XG5cbiAgICBjb25zdCB4ID0gYXdhaXQgeFQuYnVmZmVyKCk7XG4gICAgY29uc3QgbWVhbiA9IGF3YWl0IG1lYW5ULmJ1ZmZlcigpO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gYXdhaXQgdmFyaWFuY2VULmJ1ZmZlcigpO1xuICAgIGNvbnN0IHNjYWxlID0gYXdhaXQgc2NhbGVULmJ1ZmZlcigpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHJlc3VsdC5kYXRhKCksIFtcbiAgICAgICh4LmdldCgwLCAwKSAtIG1lYW4uZ2V0KDApKSAqIHNjYWxlLmdldCgwKSAvXG4gICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgwKSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICAoeC5nZXQoMCwgMSkgLSBtZWFuLmdldCgxKSkgKiBzY2FsZS5nZXQoMSkgL1xuICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZS5nZXQoMSkgKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgKHguZ2V0KDEsIDApIC0gbWVhbi5nZXQoMCkpICogc2NhbGUuZ2V0KDApIC9cbiAgICAgICAgICBNYXRoLnNxcnQodmFyaWFuY2UuZ2V0KDApICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgICh4LmdldCgxLCAxKSAtIG1lYW4uZ2V0KDEpKSAqIHNjYWxlLmdldCgxKSAvXG4gICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlLmdldCgxKSArIHZhcmlhbmNlRXBzaWxvbilcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3NpbXBsZSBiYXRjaG5vcm0yRCwgbm8gc2NhbGUsIDJ4MicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4VCA9IHRmLnRlbnNvcjJkKFsyLCA0LCA5LCAyM10sIFsyLCAyXSk7XG4gICAgY29uc3QgbWVhblQgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlVCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gICAgY29uc3Qgb2Zmc2V0VCA9IHRmLnRlbnNvcjFkKFs0LCA1XSk7XG5cbiAgICBjb25zdCB2YXJpYW5jZUVwc2lsb24gPSAuMDAxO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGYuYmF0Y2hOb3JtMmQoXG4gICAgICAgIHhULCBtZWFuVCwgdmFyaWFuY2VULCBvZmZzZXRULCB1bmRlZmluZWQsIHZhcmlhbmNlRXBzaWxvbik7XG5cbiAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCBvZmZzZXRULmFycmF5KCk7XG4gICAgY29uc3QgbWVhbiA9IGF3YWl0IG1lYW5ULmFycmF5KCk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBhd2FpdCB2YXJpYW5jZVQuYXJyYXkoKTtcbiAgICBjb25zdCB4ID0gYXdhaXQgeFQuYXJyYXkoKTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHJlc3VsdC5kYXRhKCksIFtcbiAgICAgIG9mZnNldFswXSArXG4gICAgICAgICAgKHhbMF1bMF0gLSBtZWFuWzBdKSAqIDEgLyBNYXRoLnNxcnQodmFyaWFuY2VbMF0gKyB2YXJpYW5jZUVwc2lsb24pLFxuICAgICAgb2Zmc2V0WzFdICtcbiAgICAgICAgICAoeFswXVsxXSAtIG1lYW5bMV0pICogMSAvIE1hdGguc3FydCh2YXJpYW5jZVsxXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXRbMF0gK1xuICAgICAgICAgICh4WzFdWzBdIC0gbWVhblswXSkgKiAxIC8gTWF0aC5zcXJ0KHZhcmlhbmNlWzBdICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgIG9mZnNldFsxXSArXG4gICAgICAgICAgKHhbMV1bMV0gLSBtZWFuWzFdKSAqIDEgLyBNYXRoLnNxcnQodmFyaWFuY2VbMV0gKyB2YXJpYW5jZUVwc2lsb24pXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdzaW1wbGUgYmF0Y2hub3JtMkQsIDJ4MicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4VCA9IHRmLnRlbnNvcjJkKFsyLCA0LCA5LCAyM10sIFsyLCAyXSk7XG4gICAgY29uc3QgbWVhblQgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlVCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gICAgY29uc3Qgb2Zmc2V0VCA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gICAgY29uc3Qgc2NhbGVUID0gdGYudGVuc29yMWQoWzQsIDVdKTtcblxuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICB0Zi5iYXRjaE5vcm0yZCh4VCwgbWVhblQsIHZhcmlhbmNlVCwgb2Zmc2V0VCwgc2NhbGVULCB2YXJpYW5jZUVwc2lsb24pO1xuXG4gICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgb2Zmc2V0VC5hcnJheSgpO1xuICAgIGNvbnN0IG1lYW4gPSBhd2FpdCBtZWFuVC5hcnJheSgpO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gYXdhaXQgdmFyaWFuY2VULmFycmF5KCk7XG4gICAgY29uc3Qgc2NhbGUgPSBhd2FpdCBzY2FsZVQuYXJyYXkoKTtcbiAgICBjb25zdCB4ID0gYXdhaXQgeFQuYXJyYXkoKTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHJlc3VsdC5kYXRhKCksIFtcbiAgICAgIG9mZnNldFswXSArXG4gICAgICAgICAgKHhbMF1bMF0gLSBtZWFuWzBdKSAqIHNjYWxlWzBdIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlWzBdICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgIG9mZnNldFsxXSArXG4gICAgICAgICAgKHhbMF1bMV0gLSBtZWFuWzFdKSAqIHNjYWxlWzFdIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlWzFdICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgIG9mZnNldFswXSArXG4gICAgICAgICAgKHhbMV1bMF0gLSBtZWFuWzBdKSAqIHNjYWxlWzBdIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlWzBdICsgdmFyaWFuY2VFcHNpbG9uKSxcbiAgICAgIG9mZnNldFsxXSArXG4gICAgICAgICAgKHhbMV1bMV0gLSBtZWFuWzFdKSAqIHNjYWxlWzFdIC9cbiAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhcmlhbmNlWzFdICsgdmFyaWFuY2VFcHNpbG9uKVxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc2ltcGxlIGJhdGNobm9ybTJEIGdyYWRpZW50cywgMngyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMiwgNCwgOSwgMjNdLCBbMiwgMl0pO1xuICAgIGNvbnN0IG1lYW4gPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAgICBjb25zdCBvZmZzZXQgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICAgIGNvbnN0IHNjYWxlID0gdGYudGVuc29yMWQoWzIsIDVdKTtcblxuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjJkKFsxLCAxLCAxLCAxXSwgWzIsIDJdKTtcbiAgICBjb25zdCBbZ3JhZFgsIGdyYWRNZWFuLCBncmFkVmFyaWFuY2UsIGdyYWRPZmZzZXQsIGdyYWRTY2FsZV0gPSB0Zi5ncmFkcyhcbiAgICAgICAgKHg6IHRmLlRlbnNvcjJELCBtZWFuOiB0Zi5UZW5zb3IxRCwgdmFyaWFuY2U6IHRmLlRlbnNvcjFELFxuICAgICAgICAgb2Zmc2V0OiB0Zi5UZW5zb3IxRCwgc2NhbGU6IHRmLlRlbnNvcjFEKSA9PlxuICAgICAgICAgICAgdGYuYmF0Y2hOb3JtMmQoeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKFxuICAgICAgICBbeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGVdLCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFguZGF0YSgpLCBbMS40MTQsIDIuODg3LCAxLjQxNCwgMi44ODddKTtcbiAgICBleHBlY3QoZ3JhZFguc2hhcGUpLnRvRXF1YWwoWzIsIDJdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkTWVhbi5kYXRhKCksIFstMi44MjgsIC01Ljc3M10pO1xuICAgIGV4cGVjdChncmFkTWVhbi5zaGFwZSkudG9FcXVhbChbMl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRWYXJpYW5jZS5kYXRhKCksIFstMy4xODAsIC0xMS4wNjBdKTtcbiAgICBleHBlY3QoZ3JhZFZhcmlhbmNlLnNoYXBlKS50b0VxdWFsKFsyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZE9mZnNldC5kYXRhKCksIFsyLCAyXSk7XG4gICAgZXhwZWN0KGdyYWRPZmZzZXQuc2hhcGUpLnRvRXF1YWwoWzJdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkU2NhbGUuZGF0YSgpLCBbNi4zNjIsIDEzLjI3N10pO1xuICAgIGV4cGVjdChncmFkU2NhbGUuc2hhcGUpLnRvRXF1YWwoWzJdKTtcbiAgfSk7XG5cbiAgaXQoJ2dyYWRpZW50IHdpdGggY2xvbmVzIGJhdGNobm9ybTJEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMiwgNCwgOSwgMjNdLCBbMiwgMl0pO1xuICAgIGNvbnN0IG1lYW4gPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAgICBjb25zdCBvZmZzZXQgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICAgIGNvbnN0IHNjYWxlID0gdGYudGVuc29yMWQoWzIsIDVdKTtcblxuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCBkeSA9IHRmLnRlbnNvcjJkKFsxLCAxLCAxLCAxXSwgWzIsIDJdKTtcbiAgICBjb25zdCBbZ3JhZFgsIGdyYWRNZWFuLCBncmFkVmFyaWFuY2UsIGdyYWRPZmZzZXQsIGdyYWRTY2FsZV0gPSB0Zi5ncmFkcyhcbiAgICAgICAgKHg6IHRmLlRlbnNvcjJELCBtZWFuOiB0Zi5UZW5zb3IxRCwgdmFyaWFuY2U6IHRmLlRlbnNvcjFELFxuICAgICAgICAgb2Zmc2V0OiB0Zi5UZW5zb3IxRCwgc2NhbGU6IHRmLlRlbnNvcjFEKSA9PlxuICAgICAgICAgICAgdGYuYmF0Y2hOb3JtMmQoXG4gICAgICAgICAgICAgICAgICB4LmNsb25lKCksIG1lYW4uY2xvbmUoKSwgdmFyaWFuY2UuY2xvbmUoKSwgb2Zmc2V0LmNsb25lKCksXG4gICAgICAgICAgICAgICAgICBzY2FsZS5jbG9uZSgpLCB2YXJpYW5jZUVwc2lsb24pXG4gICAgICAgICAgICAgICAgLmNsb25lKCkpKFt4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZV0sIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkWC5kYXRhKCksIFsxLjQxNCwgMi44ODcsIDEuNDE0LCAyLjg4N10pO1xuICAgIGV4cGVjdChncmFkWC5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRNZWFuLmRhdGEoKSwgWy0yLjgyOCwgLTUuNzczXSk7XG4gICAgZXhwZWN0KGdyYWRNZWFuLnNoYXBlKS50b0VxdWFsKFsyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFZhcmlhbmNlLmRhdGEoKSwgWy0zLjE4MCwgLTExLjA2MF0pO1xuICAgIGV4cGVjdChncmFkVmFyaWFuY2Uuc2hhcGUpLnRvRXF1YWwoWzJdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkT2Zmc2V0LmRhdGEoKSwgWzIsIDJdKTtcbiAgICBleHBlY3QoZ3JhZE9mZnNldC5zaGFwZSkudG9FcXVhbChbMl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRTY2FsZS5kYXRhKCksIFs2LjM2MiwgMTMuMjc3XSk7XG4gICAgZXhwZWN0KGdyYWRTY2FsZS5zaGFwZSkudG9FcXVhbChbMl0pO1xuICB9KTtcblxuICBpdCgnYmF0Y2hub3JtMkQgZ3JhZGllbnRzLCBzYW1lIHNoYXBlcyBpbiB4LCBtZWFuIGFuZCB2YXJpYW5jZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEwLCAyMCwgMzAsIDQwXSwgWzIsIDJdKTtcbiAgICBjb25zdCBtZWFuID0gdGYudGVuc29yMmQoWzAsIDUsIDEwLCAxNV0sIFsyLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi50ZW5zb3IyZChbMiwgNCwgNiwgOF0sIFsyLCAyXSk7XG4gICAgY29uc3Qgc2NhbGUgPSB0Zi50ZW5zb3IyZChbMiwgNSwgMiwgNV0sIFsyLCAyXSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGYudGVuc29yMmQoWzAsIDAsIDAsIDBdLCBbMiwgMl0pO1xuXG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IGR5ID0gdGYudGVuc29yMmQoWzEsIDEsIDEsIDFdLCBbMiwgMl0pO1xuICAgIGNvbnN0IGdyYWRYID0gdGYuZ3JhZChcbiAgICAgICAgKHg6IHRmLlRlbnNvcjJEKSA9PiB0Zi5iYXRjaE5vcm0yZChcbiAgICAgICAgICAgIHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pKSh4LCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFguZGF0YSgpLCBbMS40MTQsIDIuNTAwLCAwLjgxNiwgMS43NjhdKTtcbiAgICBleHBlY3QoZ3JhZFguc2hhcGUpLnRvRXF1YWwoWzIsIDJdKTtcbiAgICBjb25zdCBncmFkTWVhbiA9IHRmLmdyYWQoXG4gICAgICAgIChtZWFuOiB0Zi5UZW5zb3IyRCkgPT4gdGYuYmF0Y2hOb3JtMmQoXG4gICAgICAgICAgICB4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSkobWVhbiwgZHkpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGdyYWRNZWFuLmRhdGEoKSwgWy0xLjQxNCwgLTIuNTAwLCAtMC44MTYsIC0xLjc2OF0pO1xuICAgIGV4cGVjdChncmFkTWVhbi5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICAgIGNvbnN0IGdyYWRWYXJpYW5jZSA9IHRmLmdyYWQoXG4gICAgICAgICh2YXJpYW5jZTogdGYuVGVuc29yMkQpID0+IHRmLmJhdGNoTm9ybTJkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHZhcmlhbmNlLCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoXG4gICAgICAgIGF3YWl0IGdyYWRWYXJpYW5jZS5kYXRhKCksIFstMy41MzMsIC00LjY4NiwgLTEuMzYwLCAtMi43NjJdKTtcbiAgICBleHBlY3QoZ3JhZFZhcmlhbmNlLnNoYXBlKS50b0VxdWFsKFsyLCAyXSk7XG4gICAgY29uc3QgZ3JhZE9mZnNldCA9IHRmLmdyYWQoXG4gICAgICAgIChvZmZzZXQ6IHRmLlRlbnNvcjJEKSA9PiB0Zi5iYXRjaE5vcm0yZChcbiAgICAgICAgICAgIHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pKShvZmZzZXQsIGR5KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBncmFkT2Zmc2V0LmRhdGEoKSwgWzEsIDEsIDEsIDFdKTtcbiAgICBleHBlY3QoZ3JhZE9mZnNldC5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICAgIGNvbnN0IGdyYWRTY2FsZSA9IHRmLmdyYWQoXG4gICAgICAgIChzY2FsZTogdGYuVGVuc29yMkQpID0+IHRmLmJhdGNoTm9ybTJkKFxuICAgICAgICAgICAgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikpKHNjYWxlLCBkeSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgZ3JhZFNjYWxlLmRhdGEoKSwgWzcuMDY5LCA3LjQ5OSwgOC4xNjQsIDguODM4XSk7XG4gICAgZXhwZWN0KGdyYWRTY2FsZS5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICB9KTtcblxuICBpdCgnZ3JhZGllbnQgd2l0aCBjbG9uZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgeCA9IHRmLnplcm9zKFsyLCAyXSk7XG4gICAgY29uc3QgbWVhbiA9IHRmLnplcm9zKFsyLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi56ZXJvcyhbMiwgMl0pO1xuICAgIGNvbnN0IHNjYWxlID0gdGYuemVyb3MoWzIsIDJdKTtcbiAgICBjb25zdCBvZmZzZXQgPSB0Zi56ZXJvcyhbMiwgMl0pO1xuXG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IGdyYWRGID0gdGYuZ3JhZHMoXG4gICAgICAgICh4OiB0Zi5UZW5zb3IyRCwgbWVhbjogdGYuVGVuc29yMkQsIHZhcmlhbmNlOiB0Zi5UZW5zb3IyRCxcbiAgICAgICAgIG9mZnNldDogdGYuVGVuc29yMkQsIHNjYWxlOiB0Zi5UZW5zb3IyRCkgPT5cbiAgICAgICAgICAgIHRmLmJhdGNoTm9ybTJkKFxuICAgICAgICAgICAgICAgICAgeC5jbG9uZSgpLCBtZWFuLmNsb25lKCksIHZhcmlhbmNlLmNsb25lKCksIG9mZnNldC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgc2NhbGUuY2xvbmUoKSwgdmFyaWFuY2VFcHNpbG9uKVxuICAgICAgICAgICAgICAgIC5jbG9uZSgpKTtcbiAgICBjb25zdCBbZ3JhZFgsIGdyYWRNZWFuLCBncmFkVmFyaWFuY2UsIGdyYWRPZmZzZXQsIGdyYWRTY2FsZV0gPVxuICAgICAgICBncmFkRihbeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGVdKTtcbiAgICBleHBlY3QoZ3JhZFguc2hhcGUpLnRvRXF1YWwoeC5zaGFwZSk7XG4gICAgZXhwZWN0KGdyYWRNZWFuLnNoYXBlKS50b0VxdWFsKG1lYW4uc2hhcGUpO1xuICAgIGV4cGVjdChncmFkVmFyaWFuY2Uuc2hhcGUpLnRvRXF1YWwodmFyaWFuY2Uuc2hhcGUpO1xuICAgIGV4cGVjdChncmFkT2Zmc2V0LnNoYXBlKS50b0VxdWFsKG9mZnNldC5zaGFwZSk7XG4gICAgZXhwZWN0KGdyYWRTY2FsZS5zaGFwZSkudG9FcXVhbChzY2FsZS5zaGFwZSk7XG4gIH0pO1xuXG4gIGl0KCdiYXRjaG5vcm0yRCBtYXRjaGVzIHRlbnNvcmZsb3csIDN4MycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4ID0gdGYudGVuc29yMmQoXG4gICAgICAgIFtcbiAgICAgICAgICAwLjMxMzY4OTIsIDAuOTIzODkwMjUsIDAuNTk0NzgyLCAwLjA1MDIxMDQyLCAwLjY3NTQ1NDA0LCAwLjkzOTEwMDM1LFxuICAgICAgICAgIDAuMTMyNzc5OTMsIDAuOTY0NzQyNjksIDAuODg2MDg5MTZcbiAgICAgICAgXSxcbiAgICAgICAgWzMsIDNdKTtcbiAgICBjb25zdCBtZWFuID0gdGYudGVuc29yMWQoWzAuMTk1MjYzMTIsIDAuNzQ4NTcyNTYsIDAuNDUxNjYzOThdKTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IHRmLnRlbnNvcjFkKFswLjIyOTYzMDAxLCAwLjYxNTIxOTkyLCAwLjQ2NjIzNjg1XSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGYudGVuc29yMWQoWzAuNDMwOTg0ODQsIDAuNzc3MTIyMzcsIDAuNDc5MTYyOThdKTtcbiAgICBjb25zdCBzY2FsZSA9IHRmLnRlbnNvcjFkKFswLjYyMTg2OTA3LCAwLjg1NjczNzM2LCAwLjE5MjAxMDYxXSk7XG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIHRmLmJhdGNoTm9ybTJkKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgcmVzdWx0LmRhdGEoKSwgW1xuICAgICAgMC41ODQzMzY0NiwgMC45Njg0NjIyOCwgMC41MTkzNjUyOSwgMC4yNDMxNTQwMiwgMC42OTczMjE1NywgMC42MTYwODU0MixcbiAgICAgIDAuMzUwMDc0NDYsIDEuMDEzMDQ4MjEsIDAuNjAxMTk0NDFcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aGVuIHBhc3NlZCB4IGFzIGEgbm9uLXRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBtZWFuID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG5cbiAgICBleHBlY3QoKCkgPT4gdGYuYmF0Y2hOb3JtKHt9IGFzIHRmLlRlbnNvciwgbWVhbiwgdmFyaWFuY2UpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKC9Bcmd1bWVudCAneCcgcGFzc2VkIHRvICdiYXRjaE5vcm0nIG11c3QgYmUgYSBUZW5zb3IvKTtcbiAgfSk7XG4gIGl0KCd0aHJvd3Mgd2hlbiBwYXNzZWQgbWVhbiBhcyBhIG5vbi10ZW5zb3InLCAoKSA9PiB7XG4gICAgY29uc3QgeCA9IHRmLnRlbnNvcjRkKFsyLCA0LCA5LCAyM10sIFsyLCAxLCAxLCAyXSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuXG4gICAgZXhwZWN0KCgpID0+IHRmLmJhdGNoTm9ybSh4LCB7fSBhcyB0Zi5UZW5zb3IsIHZhcmlhbmNlKSlcbiAgICAgICAgLnRvVGhyb3dFcnJvcigvQXJndW1lbnQgJ21lYW4nIHBhc3NlZCB0byAnYmF0Y2hOb3JtJyBtdXN0IGJlIGEgVGVuc29yLyk7XG4gIH0pO1xuICBpdCgndGhyb3dzIHdoZW4gcGFzc2VkIHZhcmlhbmNlIGFzIGEgbm9uLXRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCB4ID0gdGYudGVuc29yNGQoWzIsIDQsIDksIDIzXSwgWzIsIDEsIDEsIDJdKTtcbiAgICBjb25zdCBtZWFuID0gdGYudGVuc29yMWQoWzEsIDJdKTtcblxuICAgIGNvbnN0IGUgPSAvQXJndW1lbnQgJ3ZhcmlhbmNlJyBwYXNzZWQgdG8gJ2JhdGNoTm9ybScgbXVzdCBiZSBhIFRlbnNvci87XG4gICAgZXhwZWN0KCgpID0+IHRmLmJhdGNoTm9ybSh4LCBtZWFuLCB7fSBhcyB0Zi5UZW5zb3IpKS50b1Rocm93RXJyb3IoZSk7XG4gIH0pO1xuICBpdCgndGhyb3dzIHdoZW4gcGFzc2VkIHNjYWxlIGFzIGEgbm9uLXRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCB4ID0gdGYudGVuc29yNGQoWzIsIDQsIDksIDIzXSwgWzIsIDEsIDEsIDJdKTtcbiAgICBjb25zdCBtZWFuID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gICAgY29uc3QgZXBzaWxvbiA9IC4wMDE7XG5cbiAgICBleHBlY3QoKCkgPT4gdGYuYmF0Y2hOb3JtKHgsIG1lYW4sIHZhcmlhbmNlLCBlcHNpbG9uLCB7fSBhcyB0Zi5UZW5zb3IpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKFxuICAgICAgICAgICAgL0FyZ3VtZW50ICdzY2FsZScgcGFzc2VkIHRvICdiYXRjaE5vcm0nIG11c3QgYmUgYSBUZW5zb3IvKTtcbiAgfSk7XG4gIGl0KCd0aHJvd3Mgd2hlbiBwYXNzZWQgb2Zmc2V0IGFzIGEgbm9uLXRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCB4ID0gdGYudGVuc29yNGQoWzIsIDQsIDksIDIzXSwgWzIsIDEsIDEsIDJdKTtcbiAgICBjb25zdCBtZWFuID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gICAgY29uc3QgZXBzaWxvbiA9IC4wMDE7XG4gICAgY29uc3Qgc2NhbGUgPSB0Zi50ZW5zb3IxZChbMC42MjE4NjkwNywgMC44NTY3MzczNiwgMC4xOTIwMTA2MV0pO1xuXG4gICAgY29uc3QgZSA9IC9Bcmd1bWVudCAnb2Zmc2V0JyBwYXNzZWQgdG8gJ2JhdGNoTm9ybScgbXVzdCBiZSBhIFRlbnNvci87XG4gICAgZXhwZWN0KFxuICAgICAgICAoKSA9PiB0Zi5iYXRjaE5vcm0oeCwgbWVhbiwgdmFyaWFuY2UsIHt9IGFzIHRmLlRlbnNvciwgc2NhbGUsIGVwc2lsb24pKVxuICAgICAgICAudG9UaHJvd0Vycm9yKGUpO1xuICB9KTtcblxuICBpdCgnYWNjZXB0cyBhIHRlbnNvci1saWtlIG9iamVjdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB4ID0gW1syLCA0XSwgWzksIDIzXV07XG4gICAgY29uc3QgbWVhbiA9IFsxLCAyXTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IFsyLCAzXTtcbiAgICBjb25zdCBvZmZzZXQgPSBbMywgNF07XG4gICAgY29uc3Qgc2NhbGUgPSBbNCwgNV07XG5cbiAgICBjb25zdCB2YXJpYW5jZUVwc2lsb24gPSAuMDAxO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgdGYuYmF0Y2hOb3JtMmQoeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG5cbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbXG4gICAgICBvZmZzZXRbMF0gK1xuICAgICAgICAgICh4WzBdWzBdIC0gbWVhblswXSkgKiBzY2FsZVswXSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZVswXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXRbMV0gK1xuICAgICAgICAgICh4WzBdWzFdIC0gbWVhblsxXSkgKiBzY2FsZVsxXSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZVsxXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXRbMF0gK1xuICAgICAgICAgICh4WzFdWzBdIC0gbWVhblswXSkgKiBzY2FsZVswXSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZVswXSArIHZhcmlhbmNlRXBzaWxvbiksXG4gICAgICBvZmZzZXRbMV0gK1xuICAgICAgICAgICh4WzFdWzFdIC0gbWVhblsxXSkgKiBzY2FsZVsxXSAvXG4gICAgICAgICAgICAgIE1hdGguc3FydCh2YXJpYW5jZVsxXSArIHZhcmlhbmNlRXBzaWxvbilcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBlcnJvciB3aGVuIHggaXMgYSBzdHJpbmcgdGVuc29yJywgKCkgPT4ge1xuICAgIGNvbnN0IG1lYW4gPSBbMSwgMl07XG4gICAgY29uc3QgdmFyaWFuY2UgPSBbMiwgM107XG4gICAgY29uc3Qgb2Zmc2V0ID0gWzMsIDRdO1xuICAgIGNvbnN0IHNjYWxlID0gWzQsIDVdO1xuXG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IGYgPSAoKSA9PiB0Zi5iYXRjaE5vcm0yZChcbiAgICAgICAgW1snYScsICdiJ10sIFsnYycsICdkJ11dLCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSxcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uKTtcbiAgICBleHBlY3QoZikudG9UaHJvd0Vycm9yKFxuICAgICAgICAvQXJndW1lbnQgJ3gnIHBhc3NlZCB0byAnYmF0Y2hOb3JtJyBtdXN0IGJlIG51bWVyaWMvKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBlcnJvciB3aGVuIG1lYW4gaXMgYSBzdHJpbmcgdGVuc29yJywgKCkgPT4ge1xuICAgIGNvbnN0IHggPSBbWzIsIDRdLCBbOSwgMjNdXTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IFsyLCAzXTtcbiAgICBjb25zdCBvZmZzZXQgPSBbMywgNF07XG4gICAgY29uc3Qgc2NhbGUgPSBbNCwgNV07XG5cbiAgICBjb25zdCB2YXJpYW5jZUVwc2lsb24gPSAuMDAxO1xuXG4gICAgY29uc3QgZiA9ICgpID0+XG4gICAgICAgIHRmLmJhdGNoTm9ybTJkKHgsIFsnYScsICdiJ10sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xuICAgIGV4cGVjdChmKS50b1Rocm93RXJyb3IoXG4gICAgICAgIC9Bcmd1bWVudCAnbWVhbicgcGFzc2VkIHRvICdiYXRjaE5vcm0nIG11c3QgYmUgbnVtZXJpYy8pO1xuICB9KTtcblxuICBpdCgndGhyb3dzIGVycm9yIHdoZW4gdmFyaWFuY2UgaXMgYSBzdHJpbmcgdGVuc29yJywgKCkgPT4ge1xuICAgIGNvbnN0IHggPSBbWzIsIDRdLCBbOSwgMjNdXTtcbiAgICBjb25zdCBtZWFuID0gWzEsIDJdO1xuICAgIGNvbnN0IG9mZnNldCA9IFszLCA0XTtcbiAgICBjb25zdCBzY2FsZSA9IFs0LCA1XTtcblxuICAgIGNvbnN0IHZhcmlhbmNlRXBzaWxvbiA9IC4wMDE7XG5cbiAgICBjb25zdCBmID0gKCkgPT5cbiAgICAgICAgdGYuYmF0Y2hOb3JtMmQoeCwgbWVhbiwgWydhJywgJ2InXSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKTtcbiAgICBleHBlY3QoZikudG9UaHJvd0Vycm9yKC8ndmFyaWFuY2UnIHBhc3NlZCB0byAnYmF0Y2hOb3JtJyBtdXN0IGJlIG51bWVyaWMvKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBlcnJvciB3aGVuIHNjYWxlIGlzIGEgc3RyaW5nIHRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCB4ID0gW1syLCA0XSwgWzksIDIzXV07XG4gICAgY29uc3QgbWVhbiA9IFsxLCAyXTtcbiAgICBjb25zdCB2YXJpYW5jZSA9IFsyLCAzXTtcbiAgICBjb25zdCBvZmZzZXQgPSBbMywgNF07XG5cbiAgICBjb25zdCB2YXJpYW5jZUVwc2lsb24gPSAuMDAxO1xuXG4gICAgY29uc3QgZiA9ICgpID0+XG4gICAgICAgIHRmLmJhdGNoTm9ybTJkKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIFsnYScsICdiJ10sIHZhcmlhbmNlRXBzaWxvbik7XG4gICAgZXhwZWN0KGYpLnRvVGhyb3dFcnJvcigvJ3NjYWxlJyBwYXNzZWQgdG8gJ2JhdGNoTm9ybScgbXVzdCBiZSBudW1lcmljLyk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvd3MgZXJyb3Igd2hlbiBvZmZzZXQgaXMgYSBzdHJpbmcgdGVuc29yJywgKCkgPT4ge1xuICAgIGNvbnN0IHggPSBbWzIsIDRdLCBbOSwgMjNdXTtcbiAgICBjb25zdCBtZWFuID0gWzEsIDJdO1xuICAgIGNvbnN0IHZhcmlhbmNlID0gWzIsIDNdO1xuICAgIGNvbnN0IHNjYWxlID0gWzQsIDVdO1xuXG4gICAgY29uc3QgdmFyaWFuY2VFcHNpbG9uID0gLjAwMTtcblxuICAgIGNvbnN0IGYgPSAoKSA9PlxuICAgICAgICB0Zi5iYXRjaE5vcm0yZCh4LCBtZWFuLCB2YXJpYW5jZSwgWydhJywgJ2InXSwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG4gICAgZXhwZWN0KGYpLnRvVGhyb3dFcnJvcigvJ29mZnNldCcgcGFzc2VkIHRvICdiYXRjaE5vcm0nIG11c3QgYmUgbnVtZXJpYy8pO1xuICB9KTtcbn0pO1xuIl19 |
\ | No newline at end of file |