forked from leonardojs1981/analise_grafos_parlamentares
/
visualizar_grafo.html
286 lines (233 loc) · 718 KB
/
visualizar_grafo.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
<html>
<head>
<meta charset="utf-8">
<style>
.col:not(:first-child,:last-child) {
padding-right:7px;
padding-left:7px;
}
.links line {
stroke: #999;
stroke-opacity: 0.6;
}
.links path {
stroke: #999;
stroke-opacity: 0.6;
fill: none;
stroke: #666;
stroke-width: 1.5px;
}
.nodes circle {
stroke: #fff;
stroke-width: 1.0px;
}
</style>
</head>
<h3 class="page-header" style="margin-top:0px;">
Relações entre Palavras
</h3>
<div id="div_graph" style="height:400px;">
</div>
<!-- d3 -->
<script src=""></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWEuZG9jdW1lbnQsZT1jLnNsaWNlLGY9Yy5jb25jYXQsZz1jLnB1c2gsaD1jLmluZGV4T2YsaT17fSxqPWkudG9TdHJpbmcsaz1pLmhhc093blByb3BlcnR5LGw9e30sbT0iMS4xMi40IixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmUuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZWFjaCh0aGlzLGEpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpnLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihuLmlzUGxhaW5PYmplY3QoYyl8fChiPW4uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbi5pc0FycmF5KGEpP2E6W10pOmY9YSYmbi5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1uLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW4udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXt2YXIgYj1hJiZhLnRvU3RyaW5nKCk7cmV0dXJuIW4uaXNBcnJheShhKSYmYi1wYXJzZUZsb2F0KGIpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFrLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWsuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKCFsLm93bkZpcnN0KWZvcihiIGluIGEpcmV0dXJuIGsuY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxrLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGgpcmV0dXJuIGguY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc9MCxoPVtdO2lmKHMoYSkpZm9yKGQ9YS5sZW5ndGg7ZD5nO2crKyllPWIoYVtnXSxnLGMpLG51bGwhPWUmJmgucHVzaChlKTtlbHNlIGZvcihnIGluIGEpZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7cmV0dXJuIGYuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWUuY2FsbChhcmd1bWVudHMsMiksZD1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpKX0sZC5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGQpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYobi5mbltTeW1ib2wuaXRlcmF0b3JdPWNbU3ltYm9sLml0ZXJhdG9yXSksbi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj0hIWEmJiJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9Z2EoKSx6PWdhKCksQT1nYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitNKyIpKXwpIitMKyIqXFxdIixPPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTisiKSopfC4qKVxcKXwpIixQPW5ldyBSZWdFeHAoTCsiKyIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxUPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFU9bmV3IFJlZ0V4cChPKSxWPW5ldyBSZWdFeHAoIl4iK00rIiQiKSxXPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK04pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitPKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWT0vXmhcZCQvaSxaPS9eW157XStce1xzKlxbbmF0aXZlIFx3LywkPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sXz0vWyt+XS8sYWE9Lyd8XFwvZyxiYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksY2E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGRhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZmEoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3PWImJmIub3duZXJEb2N1bWVudCx4PWI/Yi5ub2RlVHlwZTo5O2lmKGQ9ZHx8W10sInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PXgmJjkhPT14JiYxMSE9PXgpcmV0dXJuIGQ7aWYoIWUmJigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dikhPT1uJiZtKGIpLGI9Ynx8bixwKSl7aWYoMTEhPT14JiYobz0kLmV4ZWMoYSkpKWlmKGY9b1sxXSl7aWYoOT09PXgpe2lmKCEoaj1iLmdldEVsZW1lbnRCeUlkKGYpKSlyZXR1cm4gZDtpZihqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZSBpZih3JiYoaj13LmdldEVsZW1lbnRCeUlkKGYpKSYmdChiLGopJiZqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZXtpZihvWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoZj1vWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZikpLGR9aWYoYy5xc2EmJiFBW2ErIiAiXSYmKCFxfHwhcS50ZXN0KGEpKSl7aWYoMSE9PXgpdz1iLHM9YTtlbHNlIGlmKCJvYmplY3QiIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoaz1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/az1rLnJlcGxhY2UoYWEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLGs9dSkscj1nKGEpLGg9ci5sZW5ndGgsbD1WLnRlc3Qoayk/IiMiK2s6IltpZD0nIitrKyInXSI7d2hpbGUoaC0tKXJbaF09bCsiICIrcWEocltoXSk7cz1yLmpvaW4oIiwiKSx3PV8udGVzdChhKSYmb2EoYi5wYXJlbnROb2RlKXx8Yn1pZihzKXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbChzKSksZH1jYXRjaCh5KXt9ZmluYWxseXtrPT09dSYmYi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gaShhLnJlcGxhY2UoUSwiJDEiKSxiLGQsZSl9ZnVuY3Rpb24gZ2EoKXt2YXIgYT1bXTtmdW5jdGlvbiBiKGMsZSl7cmV0dXJuIGEucHVzaChjKyIgIik+ZC5jYWNoZUxlbmd0aCYmZGVsZXRlIGJbYS5zaGlmdCgpXSxiW2MrIiAiXT1lfXJldHVybiBifWZ1bmN0aW9uIGhhKGEpe3JldHVybiBhW3VdPSEwLGF9ZnVuY3Rpb24gaWEoYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuISFhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsfX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuc3BsaXQoInwiKSxlPWMubGVuZ3RoO3doaWxlKGUtLSlkLmF0dHJIYW5kbGVbY1tlXV09Yn1mdW5jdGlvbiBrYShhLGIpe3ZhciBjPWImJmEsZD1jJiYxPT09YS5ub2RlVHlwZSYmMT09PWIubm9kZVR5cGUmJih+Yi5zb3VyY2VJbmRleHx8QyktKH5hLnNvdXJjZUluZGV4fHxDKTtpZihkKXJldHVybiBkO2lmKGMpd2hpbGUoYz1jLm5leHRTaWJsaW5nKWlmKGM9PT1iKXJldHVybi0xO3JldHVybiBhPzE6LTF9ZnVuY3Rpb24gbGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YyYmYi50eXBlPT09YX19ZnVuY3Rpb24gbWEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PWN8fCJidXR0b24iPT09YykmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBoYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixoYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIG9hKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1mYS5zdXBwb3J0PXt9LGY9ZmEuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiPyJIVE1MIiE9PWIubm9kZU5hbWU6ITF9LG09ZmEuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZSxnPWE/YS5vd25lckRvY3VtZW50fHxhOnY7cmV0dXJuIGchPT1uJiY5PT09Zy5ub2RlVHlwZSYmZy5kb2N1bWVudEVsZW1lbnQ/KG49ZyxvPW4uZG9jdW1lbnRFbGVtZW50LHA9IWYobiksKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1pYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVoudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1pYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoYmEsY2EpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT1aLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihpYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGlhKGZ1bmN0aW9uKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVoudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmaWEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLE8pfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj1aLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHxaLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1ufHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PW58fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxnPVthXSxoPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1uPy0xOmI9PT1uPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGthKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWcudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO3doaWxlKGdbZF09PT1oW2RdKWQrKztyZXR1cm4gZD9rYShnW2RdLGhbZF0pOmdbZF09PT12Py0xOmhbZF09PT12PzE6MH0sbik6bn0sZmEubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBmYShhLG51bGwsbnVsbCxiKX0sZmEubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFQsIj0nJDEnXSIpLGMubWF0Y2hlc1NlbGVjdG9yJiZwJiYhQVtiKyIgIl0mJighcnx8IXIudGVzdChiKSkmJighcXx8IXEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGZhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGZhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZmEuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGZhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZmEudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWZhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1mYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpoYSxtYXRjaDpXLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYmEsY2EpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGJhLGNhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZmEuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZmEuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFcuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVS50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZmEuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShQLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2hhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1KKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmhhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShRLCIkMSIpKTtyZXR1cm4gZFt1XT9oYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZmEoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczpoYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoYmEsY2EpLGZ1bmN0aW9uKGIpe3JldHVybihiLnRleHRDb250ZW50fHxiLmlubmVyVGV4dHx8ZShiKSkuaW5kZXhPZihhKT4tMX19KSxsYW5nOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBWLnRlc3QoYXx8IiIpfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIithKSxhPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXt2YXIgYztkbyBpZihjPXA/Yi5sYW5nOmIuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxiLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBjPWMudG9Mb3dlckNhc2UoKSxjPT09YXx8MD09PWMuaW5kZXhPZihhKyItIik7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmMT09PWIubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihiKXt2YXIgYz1hLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhhc2g7cmV0dXJuIGMmJmMuc2xpY2UoMSk9PT1iLmlkfSxyb290OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09b30sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1uLmFjdGl2ZUVsZW1lbnQmJighbi5oYXNGb2N1c3x8bi5oYXNGb2N1cygpKSYmISEoYS50eXBlfHxhLmhyZWZ8fH5hLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFkudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6bmEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Om5hKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpuYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuWzA+Yz9jK2I6Y119KSxldmVuOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6bmEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpuYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bGEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bWEoYik7ZnVuY3Rpb24gcGEoKXt9cGEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyBwYSxnPWZhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1SLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1TLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFEsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1XW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/ZmEuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBxYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHJhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGosaz1bdyxmXTtpZihnKXt3aGlsZShiPWJbZF0paWYoKDE9PT1iLm5vZGVUeXBlfHxlKSYmYShiLGMsZykpcmV0dXJuITB9ZWxzZSB3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpe2lmKGo9Ylt1XXx8KGJbdV09e30pLGk9altiLnVuaXF1ZUlEXXx8KGpbYi51bmlxdWVJRF09e30pLChoPWlbZF0pJiZoWzBdPT09dyYmaFsxXT09PWYpcmV0dXJuIGtbMl09aFsyXTtpZihpW2RdPWssa1syXT1hKGIsYyxnKSlyZXR1cm4hMH19fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhLmxlbmd0aD4xP2Z1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0paWYoIWFbZV0oYixjLGQpKXJldHVybiExO3JldHVybiEwfTphWzBdfWZ1bmN0aW9uIHRhKGEsYixjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZmEoYSxiW2RdLGMpO3JldHVybiBjfWZ1bmN0aW9uIHVhKGEsYixjLGQsZSl7Zm9yKHZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1udWxsIT1iO2k+aDtoKyspKGY9YVtoXSkmJihjJiYhYyhmLGQsZSl8fChnLnB1c2goZiksaiYmYi5wdXNoKGgpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFt1XSYmKGQ9dmEoZCkpLGUmJiFlW3VdJiYoZT12YShlLGYpKSxoYShmdW5jdGlvbihmLGcsaCxpKXt2YXIgaixrLGwsbT1bXSxuPVtdLG89Zy5sZW5ndGgscD1mfHx0YShifHwiKiIsaC5ub2RlVHlwZT9baF06aCxbXSkscT0hYXx8IWYmJmI/cDp1YShwLG0sYSxoLGkpLHI9Yz9lfHwoZj9hOm98fGQpP1tdOmc6cTtpZihjJiZjKHEscixoLGkpLGQpe2o9dWEocixuKSxkKGosW10saCxpKSxrPWoubGVuZ3RoO3doaWxlKGstLSkobD1qW2tdKSYmKHJbbltrXV09IShxW25ba11dPWwpKX1pZihmKXtpZihlfHxhKXtpZihlKXtqPVtdLGs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiZqLnB1c2gocVtrXT1sKTtlKG51bGwscj1bXSxqLGkpfWs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiYoaj1lP0ooZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXVhKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpILmFwcGx5KGcscil9KX1mdW5jdGlvbiB3YShhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saD1nfHxkLnJlbGF0aXZlWyIgIl0saT1nPzE6MCxrPXJhKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saCwhMCksbD1yYShmdW5jdGlvbihhKXtyZXR1cm4gSihiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7dmFyIGU9IWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSk7cmV0dXJuIGI9bnVsbCxlfV07Zj5pO2krKylpZihjPWQucmVsYXRpdmVbYVtpXS50eXBlXSltPVtyYShzYShtKSxjKV07ZWxzZXtpZihjPWQuZmlsdGVyW2FbaV0udHlwZV0uYXBwbHkobnVsbCxhW2ldLm1hdGNoZXMpLGNbdV0pe2ZvcihlPSsraTtmPmU7ZSsrKWlmKGQucmVsYXRpdmVbYVtlXS50eXBlXSlicmVhaztyZXR1cm4gdmEoaT4xJiZzYShtKSxpPjEmJnFhKGEuc2xpY2UoMCxpLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09YVtpLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoUSwiJDEiKSxjLGU+aSYmd2EoYS5zbGljZShpLGUpKSxmPmUmJndhKGE9YS5zbGljZShlKSksZj5lJiZxYShhKSl9bS5wdXNoKGMpfXJldHVybiBzYShtKX1mdW5jdGlvbiB4YShhLGIpe3ZhciBjPWIubGVuZ3RoPjAsZT1hLmxlbmd0aD4wLGY9ZnVuY3Rpb24oZixnLGgsaSxrKXt2YXIgbCxvLHEscj0wLHM9IjAiLHQ9ZiYmW10sdT1bXSx2PWoseD1mfHxlJiZkLmZpbmQuVEFHKCIqIixrKSx5PXcrPW51bGw9PXY/MTpNYXRoLnJhbmRvbSgpfHwuMSx6PXgubGVuZ3RoO2ZvcihrJiYoaj1nPT09bnx8Z3x8ayk7cyE9PXomJm51bGwhPShsPXhbc10pO3MrKyl7aWYoZSYmbCl7bz0wLGd8fGwub3duZXJEb2N1bWVudD09PW58fChtKGwpLGg9IXApO3doaWxlKHE9YVtvKytdKWlmKHEobCxnfHxuLGgpKXtpLnB1c2gobCk7YnJlYWt9ayYmKHc9eSl9YyYmKChsPSFxJiZsKSYmci0tLGYmJnQucHVzaChsKSl9aWYocis9cyxjJiZzIT09cil7bz0wO3doaWxlKHE9YltvKytdKXEodCx1LGcsaCk7aWYoZil7aWYocj4wKXdoaWxlKHMtLSl0W3NdfHx1W3NdfHwodVtzXT1GLmNhbGwoaSkpO3U9dWEodSl9SC5hcHBseShpLHUpLGsmJiFmJiZ1Lmxlbmd0aD4wJiZyK2IubGVuZ3RoPjEmJmZhLnVuaXF1ZVNvcnQoaSl9cmV0dXJuIGsmJih3PXksaj12KSx0fTtyZXR1cm4gYz9oYShmKTpmfXJldHVybiBoPWZhLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1BW2ErIiAiXTtpZighZil7Ynx8KGI9ZyhhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj13YShiW2NdKSxmW3VdP2QucHVzaChmKTplLnB1c2goZik7Zj1BKGEseGEoZSxkKSksZi5zZWxlY3Rvcj1hfXJldHVybiBmfSxpPWZhLnNlbGVjdD1mdW5jdGlvbihhLGIsZSxmKXt2YXIgaSxqLGssbCxtLG49ImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEsbz0hZiYmZyhhPW4uc2VsZWN0b3J8fGEpO2lmKGU9ZXx8W10sMT09PW8ubGVuZ3RoKXtpZihqPW9bMF09b1swXS5zbGljZSgwKSxqLmxlbmd0aD4yJiYiSUQiPT09KGs9alswXSkudHlwZSYmYy5nZXRCeUlkJiY5PT09Yi5ub2RlVHlwZSYmcCYmZC5yZWxhdGl2ZVtqWzFdLnR5cGVdKXtpZihiPShkLmZpbmQuSUQoay5tYXRjaGVzWzBdLnJlcGxhY2UoYmEsY2EpLGIpfHxbXSlbMF0sIWIpcmV0dXJuIGU7biYmKGI9Yi5wYXJlbnROb2RlKSxhPWEuc2xpY2Uoai5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1XLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6ai5sZW5ndGg7d2hpbGUoaS0tKXtpZihrPWpbaV0sZC5yZWxhdGl2ZVtsPWsudHlwZV0pYnJlYWs7aWYoKG09ZC5maW5kW2xdKSYmKGY9bShrLm1hdGNoZXNbMF0ucmVwbGFjZShiYSxjYSksXy50ZXN0KGpbMF0udHlwZSkmJm9hKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZxYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSwhYnx8Xy50ZXN0KGEpJiZvYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGphKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGphKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxqYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxmYX0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlU29ydD1uLnVuaXF1ZT10LnVuaXF1ZVNvcnQsbi50ZXh0PXQuZ2V0VGV4dCxuLmlzWE1MRG9jPXQuaXNYTUwsbi5jb250YWlucz10LmNvbnRhaW5zO3ZhciB1PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sdj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY30sdz1uLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHg9L148KFtcdy1dKylccypcLz8+KD86PFwvXDE+fCkkLyx5PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24geihhLGIsYyl7aWYobi5pc0Z1bmN0aW9uKGIpKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih5LnRlc3QoYikpcmV0dXJuIG4uZmlsdGVyKGIsYSxjKTtiPW4uZmlsdGVyKGIsYSl9cmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBuLmluQXJyYXkoYSxiKT4tMSE9PWN9KX1uLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9uLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm4uZmluZC5tYXRjaGVzKGEsbi5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxuLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobi5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyluLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9uLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEheih0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdy50ZXN0KGEpP24oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgQSxCPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sQz1uLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxBLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hLmNoYXJBdCgwKSYmIj4iPT09YS5jaGFyQXQoYS5sZW5ndGgtMSkmJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06Qi5leGVjKGEpLCFlfHwhZVsxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fGMpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGVbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChlWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmQsITApKSx4LnRlc3QoZVsxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoZSBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2VdKT90aGlzW2VdKGJbZV0pOnRoaXMuYXR0cihlLGJbZV0pO3JldHVybiB0aGlzfWlmKGY9ZC5nZXRFbGVtZW50QnlJZChlWzJdKSxmJiZmLnBhcmVudE5vZGUpe2lmKGYuaWQhPT1lWzJdKXJldHVybiBBLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWZ9cmV0dXJuIHRoaXMuY29udGV4dD1kLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpPyJ1bmRlZmluZWQiIT10eXBlb2YgYy5yZWFkeT9jLnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0MucHJvdG90eXBlPW4uZm4sQT1uKGQpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW4oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihuLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dy50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlU29ydChmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWVTb3J0KG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEYoYSxiKXtkbyBhPWFbYl07d2hpbGUoYSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEYoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gdigoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihFW2FdfHwoZT1uLnVuaXF1ZVNvcnQoZSkpLEQudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRz0vXFMrL2c7ZnVuY3Rpb24gSChhKXt2YXIgYj17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRyl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmPVtdLGc9W10saD0tMSxpPWZ1bmN0aW9uKCl7Zm9yKGU9YS5vbmNlLGQ9Yj0hMDtnLmxlbmd0aDtoPS0xKXtjPWcuc2hpZnQoKTt3aGlsZSgrK2g8Zi5sZW5ndGgpZltoXS5hcHBseShjWzBdLGNbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihoPWYubGVuZ3RoLGM9ITEpfWEubWVtb3J5fHwoYz0hMSksYj0hMSxlJiYoZj1jP1tdOiIiKX0saj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGYmJihjJiYhYiYmKGg9Zi5sZW5ndGgtMSxnLnB1c2goYykpLGZ1bmN0aW9uIGQoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXtuLmlzRnVuY3Rpb24oYyk/YS51bmlxdWUmJmouaGFzKGMpfHxmLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09bi50eXBlKGMpJiZkKGMpfSl9KGFyZ3VtZW50cyksYyYmIWImJmkoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixmLGMpKT4tMSlmLnNwbGljZShjLDEpLGg+PWMmJmgtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxmKT4tMTpmLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBmJiYoZj1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBlPWc9W10sZj1jPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZT0hMCxjfHxqLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhjLm5vdGlmeSkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1lLmNhbGwoYXJndW1lbnRzKSxkPWMubGVuZ3RoLGY9MSE9PWR8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2Q6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZS5jYWxsKGFyZ3VtZW50cyk6ZCxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGQ+MSlmb3IoaT1uZXcgQXJyYXkoZCksaj1uZXcgQXJyYXkoZCksaz1uZXcgQXJyYXkoZCk7ZD5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5wcm9ncmVzcyhoKGIsaixpKSkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEkucmVzb2x2ZVdpdGgoZCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG4oZCkub2ZmKCJyZWFkeSIpKSkpfX0pO2Z1bmN0aW9uIEooKXtkLmFkZEV2ZW50TGlzdGVuZXI/KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixLKSk6KGQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5kZXRhY2hFdmVudCgib25sb2FkIixLKSl9ZnVuY3Rpb24gSygpeyhkLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWEuZXZlbnQudHlwZXx8ImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZSkmJihKKCksbi5yZWFkeSgpKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7aWYoIUkpaWYoST1uLkRlZmVycmVkKCksImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09ZC5yZWFkeVN0YXRlJiYhZC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwpYS5zZXRUaW1lb3V0KG4ucmVhZHkpO2Vsc2UgaWYoZC5hZGRFdmVudExpc3RlbmVyKWQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixLKTtlbHNle2QuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5hdHRhY2hFdmVudCgib25sb2FkIixLKTt2YXIgYz0hMTt0cnl7Yz1udWxsPT1hLmZyYW1lRWxlbWVudCYmZC5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZSl7fWMmJmMuZG9TY3JvbGwmJiFmdW5jdGlvbiBmKCl7aWYoIW4uaXNSZWFkeSl7dHJ5e2MuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChiKXtyZXR1cm4gYS5zZXRUaW1lb3V0KGYsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBMO2ZvcihMIGluIG4obCkpYnJlYWs7bC5vd25GaXJzdD0iMCI9PT1MLGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxuKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGU7Yz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGIuc3R5bGUuem9vbSYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsbC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChlKSl9KSxmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX1hPW51bGx9KCk7dmFyIE09ZnVuY3Rpb24oYSl7dmFyIGI9bi5ub0RhdGFbKGEubm9kZU5hbWUrIiAiKS50b0xvd2VyQ2FzZSgpXSxjPSthLm5vZGVUeXBlfHwxO3JldHVybiAxIT09YyYmOSE9PWM/ITE6IWJ8fGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9LE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwOwp9cmV0dXJuIGN9ZnVuY3Rpb24gUShhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbi5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFIoYSxiLGQsZSl7aWYoTShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksIm9iamVjdCIhPXR5cGVvZiBiJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8KGU/altrXT1uLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1uLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbi5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbi5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKE0oYSkpe3ZhciBkLGUsZj1hLm5vZGVUeXBlLGc9Zj9uLmNhY2hlOmEsaD1mP2Fbbi5leHBhbmRvXTpuLmV4cGFuZG87aWYoZ1toXSl7aWYoYiYmKGQ9Yz9nW2hdOmdbaF0uZGF0YSkpe24uaXNBcnJheShiKT9iPWIuY29uY2F0KG4ubWFwKGIsbi5jYW1lbENhc2UpKTpiIGluIGQ/Yj1bYl06KGI9bi5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIuc3BsaXQoIiAiKSksZT1iLmxlbmd0aDt3aGlsZShlLS0pZGVsZXRlIGRbYltlXV07aWYoYz8hUShkKTohbi5pc0VtcHR5T2JqZWN0KGQpKXJldHVybn0oY3x8KGRlbGV0ZSBnW2hdLmRhdGEsUShnW2hdKSkpJiYoZj9uLmNsZWFuRGF0YShbYV0sITApOmwuZGVsZXRlRXhwYW5kb3x8ZyE9Zy53aW5kb3c/ZGVsZXRlIGdbaF06Z1toXT12b2lkIDApfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFAoZixkLGVbZF0pKSk7bi5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhLGIpfSk6Zj9QKGYsYSxuLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1uLl9kYXRhKGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1uLl9kYXRhKGEsYixuLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbi5fZGF0YShhLGMpfHxuLl9kYXRhKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bi5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbi5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bi5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1uLnF1ZXVlKHRoaXMsYSxiKTtuLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1uLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW4uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSksZnVuY3Rpb24oKXt2YXIgYTtsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxlO3JldHVybiBjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoYiksInVuZGVmaW5lZCIhPXR5cGVvZiBiLnN0eWxlLnpvb20mJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChlKSxhKTp2b2lkIDB9fSgpO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1QrIikoW2EteiVdKikkIiwiaSIpLFY9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxXPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX07ZnVuY3Rpb24gWChhLGIsYyxkKXt2YXIgZSxmPTEsZz0yMCxoPWQ/ZnVuY3Rpb24oKXtyZXR1cm4gZC5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbi5jc3MoYSxiLCIiKX0saT1oKCksaj1jJiZjWzNdfHwobi5jc3NOdW1iZXJbYl0/IiI6InB4Iiksaz0obi5jc3NOdW1iZXJbYl18fCJweCIhPT1qJiYraSkmJlUuZXhlYyhuLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixuLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBZPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1uLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYylZKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9LFo9L14oPzpjaGVja2JveHxyYWRpbykkL2ksJD0vPChbXHc6LV0rKS8sXz0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksYWE9L15ccysvLGJhPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZGlhbG9nfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1haW58bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHBpY3R1cmV8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRlbXBsYXRlfHRpbWV8dmlkZW8iO2Z1bmN0aW9uIGNhKGEpe3ZhciBiPWJhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfSFmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ZC5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYi5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGEuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYi5hcHBlbmRDaGlsZChhKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYS5hcHBlbmRDaGlsZChjKSxsLmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ISFhLmFkZEV2ZW50TGlzdGVuZXIsYVtuLmV4cGFuZG9dPTEsbC5hdHRyaWJ1dGVzPSFhLmdldEF0dHJpYnV0ZShuLmV4cGFuZG8pfSgpO3ZhciBkYT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19O2RhLm9wdGdyb3VwPWRhLm9wdGlvbixkYS50Ym9keT1kYS50Zm9vdD1kYS5jb2xncm91cD1kYS5jYXB0aW9uPWRhLnRoZWFkLGRhLnRoPWRhLnRkO2Z1bmN0aW9uIGVhKGEsYil7dmFyIGMsZCxlPTAsZj0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLGVhKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiBmYShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW4uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG4uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX12YXIgZ2E9Lzx8JiM/XHcrOy8saGE9Lzx0Ym9keS9pO2Z1bmN0aW9uIGlhKGEpe1oudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGphKGEsYixjLGQsZSl7Zm9yKHZhciBmLGcsaCxpLGosayxtLG89YS5sZW5ndGgscD1jYShiKSxxPVtdLHI9MDtvPnI7cisrKWlmKGc9YVtyXSxnfHwwPT09ZylpZigib2JqZWN0Ij09PW4udHlwZShnKSluLm1lcmdlKHEsZy5ub2RlVHlwZT9bZ106Zyk7ZWxzZSBpZihnYS50ZXN0KGcpKXtpPWl8fHAuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaj0oJC5leGVjKGcpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09ZGFbal18fGRhLl9kZWZhdWx0LGkuaW5uZXJIVE1MPW1bMV0rbi5odG1sUHJlZmlsdGVyKGcpK21bMl0sZj1tWzBdO3doaWxlKGYtLSlpPWkubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZhYS50ZXN0KGcpJiZxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShhYS5leGVjKGcpWzBdKSksIWwudGJvZHkpe2c9InRhYmxlIiE9PWp8fGhhLnRlc3QoZyk/Ijx0YWJsZT4iIT09bVsxXXx8aGEudGVzdChnKT8wOmk6aS5maXJzdENoaWxkLGY9ZyYmZy5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShmLS0pbi5ub2RlTmFtZShrPWcuY2hpbGROb2Rlc1tmXSwidGJvZHkiKSYmIWsuY2hpbGROb2Rlcy5sZW5ndGgmJmcucmVtb3ZlQ2hpbGQoayl9bi5tZXJnZShxLGkuY2hpbGROb2RlcyksaS50ZXh0Q29udGVudD0iIjt3aGlsZShpLmZpcnN0Q2hpbGQpaS5yZW1vdmVDaGlsZChpLmZpcnN0Q2hpbGQpO2k9cC5sYXN0Q2hpbGR9ZWxzZSBxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShnKSk7aSYmcC5yZW1vdmVDaGlsZChpKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcChlYShxLCJpbnB1dCIpLGlhKSxyPTA7d2hpbGUoZz1xW3IrK10paWYoZCYmbi5pbkFycmF5KGcsZCk+LTEpZSYmZS5wdXNoKGcpO2Vsc2UgaWYoaD1uLmNvbnRhaW5zKGcub3duZXJEb2N1bWVudCxnKSxpPWVhKHAuYXBwZW5kQ2hpbGQoZyksInNjcmlwdCIpLGgmJmZhKGkpLGMpe2Y9MDt3aGlsZShnPWlbZisrXSlfLnRlc3QoZy50eXBlfHwiIikmJmMucHVzaChnKX1yZXR1cm4gaT1udWxsLHB9IWZ1bmN0aW9uKCl7dmFyIGIsYyxlPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiXT1jIGluIGEpfHwoZS5zZXRBdHRyaWJ1dGUoYywidCIpLGxbYl09ZS5hdHRyaWJ1dGVzW2NdLmV4cGFuZG89PT0hMSk7ZT1udWxsfSgpO3ZhciBrYT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksbGE9L15rZXkvLG1hPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxuYT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sb2E9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIHBhKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMX1mdW5jdGlvbiByYSgpe3RyeXtyZXR1cm4gZC5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319ZnVuY3Rpb24gc2EoYSxiLGMsZCxlLGYpe3ZhciBnLGg7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXsic3RyaW5nIiE9dHlwZW9mIGMmJihkPWR8fGMsYz12b2lkIDApO2ZvcihoIGluIGIpc2EoYSxoLGMsZCxiW2hdLGYpO3JldHVybiBhfWlmKG51bGw9PWQmJm51bGw9PWU/KGU9YyxkPWM9dm9pZCAwKTpudWxsPT1lJiYoInN0cmluZyI9PXR5cGVvZiBjPyhlPWQsZD12b2lkIDApOihlPWQsZD1jLGM9dm9pZCAwKSksZT09PSExKWU9cWE7ZWxzZSBpZighZSlyZXR1cm4gYTtyZXR1cm4gMT09PWYmJihnPWUsZT1mdW5jdGlvbihhKXtyZXR1cm4gbigpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1uLmd1aWQrKykpLGEuZWFjaChmdW5jdGlvbigpe24uZXZlbnQuYWRkKHRoaXMsYixlLGQsYyl9KX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygbnx8YSYmbi5ldmVudC50cmlnZ2VyZWQ9PT1hLnR5cGU/dm9pZCAwOm4uZXZlbnQuZGlzcGF0Y2guYXBwbHkoay5lbGVtLGFyZ3VtZW50cyl9LGsuZWxlbT1hKSxiPShifHwiIikubWF0Y2goRyl8fFsiIl0saD1iLmxlbmd0aDt3aGlsZShoLS0pZj1vYS5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChtPWdbb10pfHwobT1nW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsbCk6bS5wdXNoKGwpLG4uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9bi5oYXNEYXRhKGEpJiZuLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9b2EuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09a1tvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGk9Zj1tLmxlbmd0aDt3aGlsZShmLS0pZz1tW2ZdLCFlJiZxIT09Zy5vcmlnVHlwZXx8YyYmYy5ndWlkIT09Zy5ndWlkfHxoJiYhaC50ZXN0KGcubmFtZXNwYWNlKXx8ZCYmZCE9PWcuc2VsZWN0b3ImJigiKioiIT09ZHx8IWcuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxnLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGcpKTtpJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGtbb10pfWVsc2UgZm9yKG8gaW4gayluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChrKSYmKGRlbGV0ZSByLmhhbmRsZSxuLl9yZW1vdmVEYXRhKGEsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGUsZil7dmFyIGcsaCxpLGosbCxtLG8scD1bZXx8ZF0scT1rLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHI9ay5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoaT1tPWU9ZXx8ZCwzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJiFuYS50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKCIuIik+LTEmJihyPXEuc3BsaXQoIi4iKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksaD1xLmluZGV4T2YoIjoiKTwwJiYib24iK3EsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChxLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9Zj8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKCIuIiksYi5ybmFtZXNwYWNlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1lKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxsPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZnx8IWwudHJpZ2dlcnx8bC50cmlnZ2VyLmFwcGx5KGUsYykhPT0hMSkpe2lmKCFmJiYhbC5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZSkpe2ZvcihqPWwuZGVsZWdhdGVUeXBlfHxxLG5hLnRlc3QoaitxKXx8KGk9aS5wYXJlbnROb2RlKTtpO2k9aS5wYXJlbnROb2RlKXAucHVzaChpKSxtPWk7bT09PShlLm93bmVyRG9jdW1lbnR8fGQpJiZwLnB1c2gobS5kZWZhdWx0Vmlld3x8bS5wYXJlbnRXaW5kb3d8fGEpfW89MDt3aGlsZSgoaT1wW28rK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1vPjE/ajpsLmJpbmRUeXBlfHxxLGc9KG4uX2RhdGEoaSwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZuLl9kYXRhKGksImhhbmRsZSIpLGcmJmcuYXBwbHkoaSxjKSxnPWgmJmlbaF0sZyYmZy5hcHBseSYmTShpKSYmKGIucmVzdWx0PWcuYXBwbHkoaSxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1xLCFmJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFsLl9kZWZhdWx0fHxsLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksYyk9PT0hMSkmJk0oZSkmJmgmJmVbcV0mJiFuLmlzV2luZG93KGUpKXttPWVbaF0sbSYmKGVbaF09bnVsbCksbi5ldmVudC50cmlnZ2VyZWQ9cTt0cnl7ZVtxXSgpfWNhdGNoKHMpe31uLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbSYmKGVbaF09bSl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGQsZixnLGg9W10saT1lLmNhbGwoYXJndW1lbnRzKSxqPShuLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1uLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1uLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGM9MDt3aGlsZSgoZz1mLmhhbmRsZXJzW2MrK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWEucm5hbWVzcGFjZSYmIWEucm5hbWVzcGFjZS50ZXN0KGcubmFtZXNwYWNlKXx8KGEuaGFuZGxlT2JqPWcsYS5kYXRhPWcuZGF0YSxkPSgobi5ldmVudC5zcGVjaWFsW2cub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxnLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1kJiYoYS5yZXN1bHQ9ZCk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8aXNOYU4oYS5idXR0b24pfHxhLmJ1dHRvbjwxKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZD1bXSxjPTA7aD5jO2MrKylmPWJbY10sZT1mLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1kW2VdJiYoZFtlXT1mLm5lZWRzQ29udGV4dD9uKGUsdGhpcykuaW5kZXgoaSk+LTE6bi5maW5kKGUsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxkW2VdJiZkLnB1c2goZik7ZC5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmR9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW24uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxlLGY9YS50eXBlLGc9YSxoPXRoaXMuZml4SG9va3NbZl07aHx8KHRoaXMuZml4SG9va3NbZl09aD1tYS50ZXN0KGYpP3RoaXMubW91c2VIb29rczpsYS50ZXN0KGYpP3RoaXMua2V5SG9va3M6e30pLGU9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZyksYj1lLmxlbmd0aDt3aGlsZShiLS0pYz1lW2JdLGFbY109Z1tjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGQpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBkZXRhaWwgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGc9Yi5idXR0b24saD1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGQsZj1lLmRvY3VtZW50RWxlbWVudCxjPWUuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmgmJihhLnJlbGF0ZWRUYXJnZXQ9aD09PWEudGFyZ2V0P2IudG9FbGVtZW50OmgpLGEud2hpY2h8fHZvaWQgMD09PWd8fChhLndoaWNoPTEmZz8xOjImZz8zOjQmZz8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09cmEoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1yYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMH0pO24uZXZlbnQudHJpZ2dlcihkLG51bGwsYiksZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD1kLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgYVtkXSYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/cGE6cWEpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6bi5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6cWEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6cWEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6cWEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGEsYSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1wYSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9cGEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fG4uY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLGwuc3VibWl0fHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP24ucHJvcChiLCJmb3JtIik6dm9pZCAwO2MmJiFuLl9kYXRhKGMsInN1Ym1pdCIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdEJ1YmJsZT0hMH0pLG4uX2RhdGEoYywic3VibWl0IiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRCdWJibGUmJihkZWxldGUgYS5fc3VibWl0QnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZuLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxsLmNoYW5nZXx8KG4uZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIGthLnRlc3QodGhpcy5ub2RlTmFtZSk/KCJjaGVja2JveCIhPT10aGlzLnR5cGUmJiJyYWRpbyIhPT10aGlzLnR5cGV8fChuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdENoYW5nZWQ9ITApfSksbi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdENoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RDaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7a2EudGVzdChiLm5vZGVOYW1lKSYmIW4uX2RhdGEoYiwiY2hhbmdlIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEpfSksbi5fZGF0YShiLCJjaGFuZ2UiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFrYS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbnx8bi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe24uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxuLmV2ZW50LmZpeChhKSl9O24uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbi5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW4uX2RhdGEoZCxiKS0xO2U/bi5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG4uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gc2EodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBzYSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixuKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9cWEpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSk7dmFyIHRhPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csdWE9bmV3IFJlZ0V4cCgiPCg/OiIrYmErIilbXFxzLz5dIiwiaSIpLHZhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzotXSspW14+XSopXC8+L2dpLHdhPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLHhhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHlhPS9edHJ1ZVwvKC4qKS8semE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLEFhPWNhKGQpLEJhPUFhLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Z1bmN0aW9uIENhKGEsYil7cmV0dXJuIG4ubm9kZU5hbWUoYSwidGFibGUiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBEYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bi5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gRWEoYSl7dmFyIGI9eWEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBGYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZuLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW4uX2RhdGEoYSksZz1uLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyluLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW4uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBHYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWwubm9DbG9uZUV2ZW50JiZiW24uZXhwYW5kb10pe2U9bi5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyluLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobi5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oRGEoYikudGV4dD1hLnRleHQsRWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGwuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFuLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmWi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19ZnVuY3Rpb24gSGEoYSxiLGMsZCl7Yj1mLmFwcGx5KFtdLGIpO3ZhciBlLGcsaCxpLGosayxtPTAsbz1hLmxlbmd0aCxwPW8tMSxxPWJbMF0scj1uLmlzRnVuY3Rpb24ocSk7aWYocnx8bz4xJiYic3RyaW5nIj09dHlwZW9mIHEmJiFsLmNoZWNrQ2xvbmUmJnhhLnRlc3QocSkpcmV0dXJuIGEuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1hLmVxKGUpO3ImJihiWzBdPXEuY2FsbCh0aGlzLGUsZi5odG1sKCkpKSxIYShmLGIsYyxkKX0pO2lmKG8mJihrPWphKGIsYVswXS5vd25lckRvY3VtZW50LCExLGEsZCksZT1rLmZpcnN0Q2hpbGQsMT09PWsuY2hpbGROb2Rlcy5sZW5ndGgmJihrPWUpLGV8fGQpKXtmb3IoaT1uLm1hcChlYShrLCJzY3JpcHQiKSxEYSksaD1pLmxlbmd0aDtvPm07bSsrKWc9ayxtIT09cCYmKGc9bi5jbG9uZShnLCEwLCEwKSxoJiZuLm1lcmdlKGksZWEoZywic2NyaXB0IikpKSxjLmNhbGwoYVttXSxnLG0pO2lmKGgpZm9yKGo9aVtpLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG4ubWFwKGksRWEpLG09MDtoPm07bSsrKWc9aVttXSxfLnRlc3QoZy50eXBlfHwiIikmJiFuLl9kYXRhKGcsImdsb2JhbEV2YWwiKSYmbi5jb250YWlucyhqLGcpJiYoZy5zcmM/bi5fZXZhbFVybCYmbi5fZXZhbFVybChnLnNyYyk6bi5nbG9iYWxFdmFsKChnLnRleHR8fGcudGV4dENvbnRlbnR8fGcuaW5uZXJIVE1MfHwiIikucmVwbGFjZSh6YSwiIikpKTtrPWU9bnVsbH1yZXR1cm4gYX1mdW5jdGlvbiBJYShhLGIsYyl7Zm9yKHZhciBkLGU9Yj9uLmZpbHRlcihiLGEpOmEsZj0wO251bGwhPShkPWVbZl0pO2YrKyljfHwxIT09ZC5ub2RlVHlwZXx8bi5jbGVhbkRhdGEoZWEoZCkpLGQucGFyZW50Tm9kZSYmKGMmJm4uY29udGFpbnMoZC5vd25lckRvY3VtZW50LGQpJiZmYShlYShkLCJzY3JpcHQiKSksZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpKTtyZXR1cm4gYX1uLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHZhLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1uLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihsLmh0bWw1Q2xvbmV8fG4uaXNYTUxEb2MoYSl8fCF1YS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KEJhLmlubmVySFRNTD1hLm91dGVySFRNTCxCYS5yZW1vdmVDaGlsZChmPUJhLmZpcnN0Q2hpbGQpKSwhKGwubm9DbG9uZUV2ZW50JiZsLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZD1lYShmKSxoPWVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmR2EoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8ZWEoYSksZD1kfHxlYShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUZhKGUsZFtnXSk7ZWxzZSBGYShhLGYpO3JldHVybiBkPWVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJmZhKGQsIWkmJmVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5hdHRyaWJ1dGVzLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8TShkKSkmJihmPWRbaV0sZz1mJiZqW2ZdKSl7aWYoZy5ldmVudHMpZm9yKGUgaW4gZy5ldmVudHMpbVtlXT9uLmV2ZW50LnJlbW92ZShkLGUpOm4ucmVtb3ZlRXZlbnQoZCxlLGcuaGFuZGxlKTtqW2ZdJiYoZGVsZXRlIGpbZl0sa3x8InVuZGVmaW5lZCI9PXR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZT9kW2ldPXZvaWQgMDpkLnJlbW92ZUF0dHJpYnV0ZShpKSxjLnB1c2goZikpfX19KSxuLmZuLmV4dGVuZCh7ZG9tTWFuaXA6SGEsZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBJYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIElhKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9uLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxkKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEhhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1DYSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUNhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm4uY2xlYW5EYXRhKGVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbi5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UodGEsIiIpOnZvaWQgMDtpZigic3RyaW5nIj09dHlwZW9mIGEmJiF3YS50ZXN0KGEpJiYobC5odG1sU2VyaWFsaXplfHwhdWEudGVzdChhKSkmJihsLmxlYWRpbmdXaGl0ZXNwYWNlfHwhYWEudGVzdChhKSkmJiFkYVsoJC5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1uLmh0bWxQcmVmaWx0ZXIoYSk7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEoZWEoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5wYXJlbnROb2RlO24uaW5BcnJheSh0aGlzLGEpPDAmJihuLmNsZWFuRGF0YShlYSh0aGlzKSksYyYmYy5yZXBsYWNlQ2hpbGQoYix0aGlzKSl9LGEpfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZj1uKGEpLGg9Zi5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihmW2RdKVtiXShjKSxnLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBKYSxLYT17SFRNTDoiYmxvY2siLEJPRFk6ImJsb2NrIn07ZnVuY3Rpb24gTGEoYSxiKXt2YXIgYz1uKGIuY3JlYXRlRWxlbWVudChhKSkuYXBwZW5kVG8oYi5ib2R5KSxkPW4uY3NzKGNbMF0sImRpc3BsYXkiKTtyZXR1cm4gYy5kZXRhY2goKSxkfWZ1bmN0aW9uIE1hKGEpe3ZhciBiPWQsYz1LYVthXTtyZXR1cm4gY3x8KGM9TGEoYSxiKSwibm9uZSIhPT1jJiZjfHwoSmE9KEphfHxuKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKGIuZG9jdW1lbnRFbGVtZW50KSxiPShKYVswXS5jb250ZW50V2luZG93fHxKYVswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz1MYShhLGIpLEphLmRldGFjaCgpKSxLYVthXT1jKSxjfXZhciBOYT0vXm1hcmdpbi8sT2E9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxQYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX0sUWE9ZC5kb2N1bWVudEVsZW1lbnQ7IWZ1bmN0aW9uKCl7dmFyIGIsYyxlLGYsZyxoLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxqPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYoai5zdHlsZSl7ai5zdHlsZS5jc3NUZXh0PSJmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLGwub3BhY2l0eT0iMC41Ij09PWouc3R5bGUub3BhY2l0eSxsLmNzc0Zsb2F0PSEhai5zdHlsZS5jc3NGbG9hdCxqLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsai5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGwuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1qLnN0eWxlLmJhY2tncm91bmRDbGlwLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixqLmlubmVySFRNTD0iIixpLmFwcGVuZENoaWxkKGopLGwuYm94U2l6aW5nPSIiPT09ai5zdHlsZS5ib3hTaXppbmd8fCIiPT09ai5zdHlsZS5Nb3pCb3hTaXppbmd8fCIiPT09ai5zdHlsZS5XZWJraXRCb3hTaXppbmcsbi5leHRlbmQobCx7cmVsaWFibGVIaWRkZW5PZmZzZXRzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxmfSxib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZX0scGl4ZWxNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksY30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksYn0scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZ30scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxofX0pO2Z1bmN0aW9uIGsoKXt2YXIgayxsLG09ZC5kb2N1bWVudEVsZW1lbnQ7bS5hcHBlbmRDaGlsZChpKSxqLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7dG9wOjElO3dpZHRoOjUwJSIsYj1lPWg9ITEsYz1nPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9YS5nZXRDb21wdXRlZFN0eWxlKGopLGI9IjElIiE9PShsfHx7fSkudG9wLGg9IjJweCI9PT0obHx8e30pLm1hcmdpbkxlZnQsZT0iNHB4Ij09PShsfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxqLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGM9IjRweCI9PT0obHx8e21hcmdpblJpZ2h0OiI0cHgifSkubWFyZ2luUmlnaHQsaz1qLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGsuc3R5bGUuY3NzVGV4dD1qLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsay5zdHlsZS5tYXJnaW5SaWdodD1rLnN0eWxlLndpZHRoPSIwIixqLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShrKXx8e30pLm1hcmdpblJpZ2h0KSxqLnJlbW92ZUNoaWxkKGspKSxqLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWouZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsZiYmKGouc3R5bGUuZGlzcGxheT0iIixqLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsai5jaGlsZE5vZGVzWzBdLnN0eWxlLmJvcmRlckNvbGxhcHNlPSJzZXBhcmF0ZSIsaz1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGtbMF0uc3R5bGUuY3NzVGV4dD0ibWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowO2Rpc3BsYXk6bm9uZSIsZj0wPT09a1swXS5vZmZzZXRIZWlnaHQsZiYmKGtbMF0uc3R5bGUuZGlzcGxheT0iIixrWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWtbMF0ub2Zmc2V0SGVpZ2h0KSksbS5yZW1vdmVDaGlsZChpKX19fSgpO3ZhciBSYSxTYSxUYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhSYT1mdW5jdGlvbihiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGMmJmMub3BlbmVyfHwoYz1hKSxjLmdldENvbXB1dGVkU3R5bGUoYil9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2MuZ2V0UHJvcGVydHlWYWx1ZShiKXx8Y1tiXTp2b2lkIDAsIiIhPT1nJiZ2b2lkIDAhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxjJiYhbC5waXhlbE1hcmdpblJpZ2h0KCkmJk9hLnRlc3QoZykmJk5hLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9Ziksdm9pZCAwPT09Zz9nOmcrIiJ9KTpRYS5jdXJyZW50U3R5bGUmJihSYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jdXJyZW50U3R5bGV9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2NbYl06dm9pZCAwLG51bGw9PWcmJmgmJmhbYl0mJihnPWhbYl0pLE9hLnRlc3QoZykmJiFUYS50ZXN0KGIpJiYoZD1oLmxlZnQsZT1hLnJ1bnRpbWVTdHlsZSxmPWUmJmUubGVmdCxmJiYoZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGgubGVmdD0iZm9udFNpemUiPT09Yj8iMWVtIjpnLGc9aC5waXhlbExlZnQrInB4IixoLmxlZnQ9ZCxmJiYoZS5sZWZ0PWYpKSx2b2lkIDA9PT1nP2c6ZysiInx8ImF1dG8ifSk7ZnVuY3Rpb24gVWEoYSxiKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19dmFyIFZhPS9hbHBoYVwoW14pXSpcKS9pLFdhPS9vcGFjaXR5XHMqPVxzKihbXildKikvaSxYYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sWWE9bmV3IFJlZ0V4cCgiXigiK1QrIikoLiopJCIsImkiKSxaYT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sJGE9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LF9hPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sYWI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtmdW5jdGlvbiBiYihhKXtpZihhIGluIGFiKXJldHVybiBhO3ZhciBiPWEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPV9hLmxlbmd0aDt3aGlsZShjLS0paWYoYT1fYVtjXStiLGEgaW4gYWIpcmV0dXJuIGF9ZnVuY3Rpb24gY2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlcoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsTWEoZC5ub2RlTmFtZSkpKSk6KGU9VyhkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIGRiKGEsYixjKXt2YXIgZD1ZYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIGViKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVltmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gZmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPVJhKGEpLGc9bC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1TYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLE9hLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYobC5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK2ViKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1uLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPVNhKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1iYihoKXx8aCksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWMpcmV0dXJuIGcmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdO2lmKGY9dHlwZW9mIGMsInN0cmluZyI9PT1mJiYoZT1VLmV4ZWMoYykpJiZlWzFdJiYoYz1YKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChuLmNzc051bWJlcltoXT8iIjoicHgiKSksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPWJiKGgpfHxoKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZj1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1mJiYoZj1TYShhLGIsZCkpLCJub3JtYWwiPT09ZiYmYiBpbiAkYSYmKGY9JGFbYl0pLCIiPT09Y3x8Yz8oZT1wYXJzZUZsb2F0KGYpLGM9PT0hMHx8aXNGaW5pdGUoZSk/ZXx8MDpmKTpmfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP1hhLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/UGEoYSxaYSxmdW5jdGlvbigpe3JldHVybiBmYihhLGIsZCl9KTpmYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJlJhKGEpO3JldHVybiBkYihhLGMsZD9lYihhLGIsZCxsLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbC5vcGFjaXR5fHwobi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gV2EudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW4uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1uLnRyaW0oZi5yZXBsYWNlKFZhLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPVZhLnRlc3QoZik/Zi5yZXBsYWNlKFZhLGUpOmYrIiAiK2UpfX0pLG4uY3NzSG9va3MubWFyZ2luUmlnaHQ9VWEobC5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/UGEoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sU2EsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uY3NzSG9va3MubWFyZ2luTGVmdD1VYShsLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihhLGIpe3JldHVybiBiPyhwYXJzZUZsb2F0KFNhKGEsIm1hcmdpbkxlZnQiKSl8fChuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtUGEoYSx7Cm1hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSk6MCkpKyJweCI6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxOYS50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1kYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPVJhKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGE/YT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMpP24odGhpcykuc2hvdygpOm4odGhpcykuaGlkZSgpfSl9fSk7ZnVuY3Rpb24gZ2IoYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGdiLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bi5Ud2Vlbj1nYixnYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fG4uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWdiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpnYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1nYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmdiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGdiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1nYi5wcm90b3R5cGUsZ2IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiAxIT09YS5lbGVtLm5vZGVUeXBlfHxudWxsIT1hLmVsZW1bYS5wcm9wXSYmbnVsbD09YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtW2EucHJvcF06KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6MSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbD09YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV0mJiFuLmNzc0hvb2tzW2EucHJvcF0/YS5lbGVtW2EucHJvcF09YS5ub3c6bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCl9fX0sZ2IucHJvcEhvb2tzLnNjcm9sbFRvcD1nYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LG4uZng9Z2IucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBoYixpYixqYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sa2I9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBsYigpe3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoYj12b2lkIDB9KSxoYj1uLm5vdygpfWZ1bmN0aW9uIG1iKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VltlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIG5iKGEsYixjKXtmb3IodmFyIGQsZT0ocWIudHdlZW5lcnNbYl18fFtdKS5jb25jYXQocWIudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gb2IoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVyhhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP24uX2RhdGEoYSwib2xkZGlzcGxheSIpfHxNYShhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09ayYmIm5vbmUiPT09bi5jc3MoYSwiZmxvYXQiKSYmKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmImlubGluZSIhPT1NYShhLm5vZGVOYW1lKT9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGpiLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChvKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP01hKGEubm9kZU5hbWUpOmopJiYocC5kaXNwbGF5PWopO2Vsc2V7cj8iaGlkZGVuImluIHImJihxPXIuaGlkZGVuKTpyPW4uX2RhdGEoYSwiZnhzaG93Iix7fSksZiYmKHIuaGlkZGVuPSFxKSxxP24oYSkuc2hvdygpOm0uZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbS5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7bi5fcmVtb3ZlRGF0YShhLCJmeHNob3ciKTtmb3IoYiBpbiBvKW4uc3R5bGUoYSxiLG9bYl0pfSk7Zm9yKGQgaW4gbylnPW5iKHE/cltkXTowLGQsbSksZCBpbiByfHwocltkXT1nLnN0YXJ0LHEmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBxYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1xYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWhifHxsYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpuLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmhifHxsYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihwYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9cWIucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIG4uaXNGdW5jdGlvbihkLnN0b3ApJiYobi5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPW4ucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiBuLm1hcChrLG5iLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQocWIse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpO3JldHVybiBYKGMuZWxlbSxhLFUuZXhlYyhiKSxjKSxjfV19LHR3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEubWF0Y2goRyk7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLHFiLnR3ZWVuZXJzW2NdPXFiLnR3ZWVuZXJzW2NdfHxbXSxxYi50d2VlbmVyc1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXJzOltvYl0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9xYi5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6cWIucHJlZmlsdGVycy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihXKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9cWIodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8bi5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9bi5fZGF0YSh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZrYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1uLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobWIoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOm1iKCJzaG93Iiksc2xpZGVVcDptYigiaGlkZSIpLHNsaWRlVG9nZ2xlOm1iKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW4udGltZXJzLGM9MDtmb3IoaGI9bi5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxuLmZ4LnN0b3AoKSxoYj12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpYnx8KGliPWEuc2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7YS5jbGVhckludGVydmFsKGliKSxpYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9bi5meD9uLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYSxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGY9ZS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnNldEF0dHJpYnV0ZSgidHlwZSIsImNoZWNrYm94IiksYy5hcHBlbmRDaGlsZChiKSxhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGwuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWMuY2xhc3NOYW1lLGwuc3R5bGU9L3RvcC8udGVzdChhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksbC5ocmVmTm9ybWFsaXplZD0iL2EiPT09YS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxsLmNoZWNrT249ISFiLnZhbHVlLGwub3B0U2VsZWN0ZWQ9Zi5zZWxlY3RlZCxsLmVuY3R5cGU9ISFkLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGUuZGlzYWJsZWQ9ITAsbC5vcHREaXNhYmxlZD0hZi5kaXNhYmxlZCxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxsLmlucHV0PSIiPT09Yi5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYi52YWx1ZT0idCIsYi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGwucmFkaW9WYWx1ZT0idCI9PT1iLnZhbHVlfSgpO3ZhciByYj0vXHIvZyxzYj0vW1x4MjBcdFxyXG5cZl0rL2c7bi5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW4uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxuKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bi5pc0FycmF5KGUpJiYoZT1uLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKHJiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxuLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKS5yZXBsYWNlKHNiLCIgIil9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwoYy5zZWxlY3RlZHx8aT09PWUpJiYobC5vcHREaXNhYmxlZD8hYy5kaXNhYmxlZDpudWxsPT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpJiYoIWMucGFyZW50Tm9kZS5kaXNhYmxlZHx8IW4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0paWYoZD1lW2ddLG4uaW5BcnJheShuLnZhbEhvb2tzLm9wdGlvbi5nZXQoZCksZik+LTEpdHJ5e2Quc2VsZWN0ZWQ9Yz0hMH1jYXRjaChoKXtkLnNjcm9sbEhlaWdodH1lbHNlIGQuc2VsZWN0ZWQ9ITE7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGV9fX19KSxuLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtuLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5pc0FycmF5KGIpP2EuY2hlY2tlZD1uLmluQXJyYXkobihhKS52YWwoKSxiKT4tMTp2b2lkIDB9fSxsLmNoZWNrT258fChuLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSk7dmFyIHRiLHViLHZiPW4uZXhwci5hdHRySGFuZGxlLHdiPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2kseGI9bC5nZXRTZXRBdHRyaWJ1dGUseWI9bC5pbnB1dDtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBZKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZigzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGU/bi5wcm9wKGEsYixjKTooMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxlPW4uYXR0ckhvb2tzW2JdfHwobi5leHByLm1hdGNoLmJvb2wudGVzdChiKT91Yjp0YikpLHZvaWQgMCE9PWM/bnVsbD09PWM/dm9pZCBuLnJlbW92ZUF0dHIoYSxiKTplJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOihkPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZD92b2lkIDA6ZCkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFsLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEcpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/eWImJnhifHwhd2IudGVzdChjKT9hW2RdPSExOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTpuLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh4Yj9jOmQpfX0pLHViPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6eWImJnhifHwhd2IudGVzdChjKT9hLnNldEF0dHJpYnV0ZSgheGImJm4ucHJvcEZpeFtjXXx8YyxjKTphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPXZiW2JdfHxuLmZpbmQuYXR0cjt5YiYmeGJ8fCF3Yi50ZXN0KGIpP3ZiW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj12YltiXSx2YltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsdmJbYl09ZiksZX06dmJbYl09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHliJiZ4Ynx8KG4uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTp0YiYmdGIuc2V0KGEsYixjKX19KSx4Ynx8KHRiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sdmIuaWQ9dmIubmFtZT12Yi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxuLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0OnRiLnNldH0sbi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3RiLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe24uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxsLnN0eWxlfHwobi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksQWI9L14oPzphfGFyZWEpJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bi5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKDMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1uLnByb3BGaXhbYl18fGIsZT1uLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTp6Yi50ZXN0KGEubm9kZU5hbWUpfHxBYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGwuZW5jdHlwZXx8KG4ucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpO3ZhciBCYj0vW1x0XHJcblxmXS9nO2Z1bmN0aW9uIENiKGEpe3JldHVybiBuLmF0dHIoYSwiY2xhc3MiKXx8IiJ9bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk9MDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsQ2IodGhpcykpKX0pO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKWQuaW5kZXhPZigiICIrZisiICIpPDAmJihkKz1mKyIgIik7aD1uLnRyaW0oZCksZSE9PWgmJm4uYXR0cihjLCJjbGFzcyIsaCl9fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLENiKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZisiICIpPi0xKWQ9ZC5yZXBsYWNlKCIgIitmKyIgIiwiICIpO2g9bi50cmltKGQpLGUhPT1oJiZuLmF0dHIoYywiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6bi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsQ2IodGhpcyksYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixkLGUsZjtpZigic3RyaW5nIj09PWMpe2Q9MCxlPW4odGhpcyksZj1hLm1hdGNoKEcpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlIHZvaWQgMCE9PWEmJiJib29sZWFuIiE9PWN8fChiPUNiKHRoaXMpLGImJm4uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsYiksbi5hdHRyKHRoaXMsImNsYXNzIixifHxhPT09ITE/IiI6bi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPTA7Yj0iICIrYSsiICI7d2hpbGUoYz10aGlzW2QrK10paWYoMT09PWMubm9kZVR5cGUmJigiICIrQ2IoYykrIiAiKS5yZXBsYWNlKEJiLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KSxuLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxuLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIERiPWEubG9jYXRpb24sRWI9bi5ub3coKSxGYj0vXD8vLEdiPS8oLCl8KFxbfHspfCh9fF0pfCIoPzpbXiJcXFxyXG5dfFxcWyJcXFwvYmZucnRdfFxcdVtcZGEtZkEtRl17NH0pKiJccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXGQpXGQrKD86XC5cZCt8KSg/OltlRV1bKy1dP1xkK3wpL2c7bi5wYXJzZUpTT049ZnVuY3Rpb24oYil7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKyIiKTt2YXIgYyxkPW51bGwsZT1uLnRyaW0oYisiIik7cmV0dXJuIGUmJiFuLnRyaW0oZS5yZXBsYWNlKEdiLGZ1bmN0aW9uKGEsYixlLGYpe3JldHVybiBjJiZiJiYoZD0wKSwwPT09ZD9hOihjPWV8fGIsZCs9IWYtIWUsIiIpfSkpP0Z1bmN0aW9uKCJyZXR1cm4gIitlKSgpOm4uZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihiKXt2YXIgYyxkO2lmKCFifHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIG51bGw7dHJ5e2EuRE9NUGFyc2VyPyhkPW5ldyBhLkRPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIEhiPS8jLiokLyxJYj0vKFs/Jl0pXz1bXiZdKi8sSmI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxLYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxMYj0vXig/OkdFVHxIRUFEKSQvLE1iPS9eXC9cLy8sTmI9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sT2I9e30sUGI9e30sUWI9IiovIi5jb25jYXQoIioiKSxSYj1EYi5ocmVmLFNiPU5iLmV4ZWMoUmIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIFRiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEcpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gVWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09UGI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBWYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gV2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gWGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6UmIsdHlwZToiR0VUIixpc0xvY2FsOktiLnRlc3QoU2JbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6UWIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bi5wYXJzZUpTT04sInRleHQgeG1sIjpuLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9WYihWYihhLG4uYWpheFNldHRpbmdzKSxiKTpWYihuLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpUYihPYiksYWpheFRyYW5zcG9ydDpUYihQYiksYWpheDpmdW5jdGlvbihiLGMpeyJvYmplY3QiPT10eXBlb2YgYiYmKGM9YixiPXZvaWQgMCksYz1jfHx7fTt2YXIgZCxlLGYsZyxoLGksaixrLGw9bi5hamF4U2V0dXAoe30sYyksbT1sLmNvbnRleHR8fGwsbz1sLmNvbnRleHQmJihtLm5vZGVUeXBlfHxtLmpxdWVyeSk/bihtKTpuLmV2ZW50LHA9bi5EZWZlcnJlZCgpLHE9bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHM9e30sdD17fSx1PTAsdj0iY2FuY2VsZWQiLHc9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dSl7aWYoIWspe2s9e307d2hpbGUoYj1KYi5leGVjKGcpKWtbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9a1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT11P2c6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdXx8KGE9dFtjXT10W2NdfHxhLHNbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdXx8KGwubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dSlmb3IoYiBpbiBhKXJbYl09W3JbYl0sYVtiXV07ZWxzZSB3LmFsd2F5cyhhW3cuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHY7cmV0dXJuIGomJmouYWJvcnQoYikseSgwLGIpLHRoaXN9fTtpZihwLnByb21pc2UodykuY29tcGxldGU9cS5hZGQsdy5zdWNjZXNzPXcuZG9uZSx3LmVycm9yPXcuZmFpbCxsLnVybD0oKGJ8fGwudXJsfHxSYikrIiIpLnJlcGxhY2UoSGIsIiIpLnJlcGxhY2UoTWIsU2JbMV0rIi8vIiksbC50eXBlPWMubWV0aG9kfHxjLnR5cGV8fGwubWV0aG9kfHxsLnR5cGUsbC5kYXRhVHlwZXM9bi50cmltKGwuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChHKXx8WyIiXSxudWxsPT1sLmNyb3NzRG9tYWluJiYoZD1OYi5leGVjKGwudXJsLnRvTG93ZXJDYXNlKCkpLGwuY3Jvc3NEb21haW49ISghZHx8ZFsxXT09PVNiWzFdJiZkWzJdPT09U2JbMl0mJihkWzNdfHwoImh0dHA6Ij09PWRbMV0/IjgwIjoiNDQzIikpPT09KFNiWzNdfHwoImh0dHA6Ij09PVNiWzFdPyI4MCI6IjQ0MyIpKSkpLGwuZGF0YSYmbC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBsLmRhdGEmJihsLmRhdGE9bi5wYXJhbShsLmRhdGEsbC50cmFkaXRpb25hbCkpLFViKE9iLGwsYyx3KSwyPT09dSlyZXR1cm4gdztpPW4uZXZlbnQmJmwuZ2xvYmFsLGkmJjA9PT1uLmFjdGl2ZSsrJiZuLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGwudHlwZT1sLnR5cGUudG9VcHBlckNhc2UoKSxsLmhhc0NvbnRlbnQ9IUxiLnRlc3QobC50eXBlKSxmPWwudXJsLGwuaGFzQ29udGVudHx8KGwuZGF0YSYmKGY9bC51cmwrPShGYi50ZXN0KGYpPyImIjoiPyIpK2wuZGF0YSxkZWxldGUgbC5kYXRhKSxsLmNhY2hlPT09ITEmJihsLnVybD1JYi50ZXN0KGYpP2YucmVwbGFjZShJYiwiJDFfPSIrRWIrKyk6ZisoRmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0ViKyspKSxsLmlmTW9kaWZpZWQmJihuLmxhc3RNb2RpZmllZFtmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbi5sYXN0TW9kaWZpZWRbZl0pLG4uZXRhZ1tmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixuLmV0YWdbZl0pKSwobC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJncuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSx3LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsbC5kYXRhVHlwZXNbMF0mJmwuYWNjZXB0c1tsLmRhdGFUeXBlc1swXV0/bC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXSsoIioiIT09bC5kYXRhVHlwZXNbMF0/IiwgIitRYisiOyBxPTAuMDEiOiIiKTpsLmFjY2VwdHNbIioiXSk7Zm9yKGUgaW4gbC5oZWFkZXJzKXcuc2V0UmVxdWVzdEhlYWRlcihlLGwuaGVhZGVyc1tlXSk7aWYobC5iZWZvcmVTZW5kJiYobC5iZWZvcmVTZW5kLmNhbGwobSx3LGwpPT09ITF8fDI9PT11KSlyZXR1cm4gdy5hYm9ydCgpO3Y9ImFib3J0Ijtmb3IoZSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl3W2VdKGxbZV0pO2lmKGo9VWIoUGIsbCxjLHcpKXtpZih3LnJlYWR5U3RhdGU9MSxpJiZvLnRyaWdnZXIoImFqYXhTZW5kIixbdyxsXSksMj09PXUpcmV0dXJuIHc7bC5hc3luYyYmbC50aW1lb3V0PjAmJihoPWEuc2V0VGltZW91dChmdW5jdGlvbigpe3cuYWJvcnQoInRpbWVvdXQiKX0sbC50aW1lb3V0KSk7dHJ5e3U9MSxqLnNlbmQocyx5KX1jYXRjaCh4KXtpZighKDI+dSkpdGhyb3cgeDt5KC0xLHgpfX1lbHNlIHkoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHkoYixjLGQsZSl7dmFyIGsscyx0LHYseCx5PWM7MiE9PXUmJih1PTIsaCYmYS5jbGVhclRpbWVvdXQoaCksaj12b2lkIDAsZz1lfHwiIix3LnJlYWR5U3RhdGU9Yj4wPzQ6MCxrPWI+PTIwMCYmMzAwPmJ8fDMwND09PWIsZCYmKHY9V2IobCx3LGQpKSx2PVhiKGwsdix3LGspLGs/KGwuaWZNb2RpZmllZCYmKHg9dy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHgmJihuLmxhc3RNb2RpZmllZFtmXT14KSx4PXcuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx4JiYobi5ldGFnW2ZdPXgpKSwyMDQ9PT1ifHwiSEVBRCI9PT1sLnR5cGU/eT0ibm9jb250ZW50IjozMDQ9PT1iP3k9Im5vdG1vZGlmaWVkIjooeT12LnN0YXRlLHM9di5kYXRhLHQ9di5lcnJvcixrPSF0KSk6KHQ9eSwhYiYmeXx8KHk9ImVycm9yIiwwPmImJihiPTApKSksdy5zdGF0dXM9Yix3LnN0YXR1c1RleHQ9KGN8fHkpKyIiLGs/cC5yZXNvbHZlV2l0aChtLFtzLHksd10pOnAucmVqZWN0V2l0aChtLFt3LHksdF0pLHcuc3RhdHVzQ29kZShyKSxyPXZvaWQgMCxpJiZvLnRyaWdnZXIoaz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt3LGwsaz9zOnRdKSxxLmZpcmVXaXRoKG0sW3cseV0pLGkmJihvLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3csbF0pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB3fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheChuLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sbi5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KTtmdW5jdGlvbiBZYihhKXtyZXR1cm4gYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5Iil9ZnVuY3Rpb24gWmIoYSl7aWYoIW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50fHxkLGEpKXJldHVybiEwO3doaWxlKGEmJjE9PT1hLm5vZGVUeXBlKXtpZigibm9uZSI9PT1ZYihhKXx8ImhpZGRlbiI9PT1hLnR5cGUpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9bi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpP2Eub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wJiYhYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDpaYihhKX0sbi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgJGI9LyUyMC9nLF9iPS9cW1xdJC8sYWM9L1xyP1xuL2csYmM9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGNjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBkYyhhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxfYi50ZXN0KGEpP2QoYSxlKTpkYyhhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bi50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpZGMoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlkYyhjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSgkYiwiKyIpfSxuLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1uLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmY2MudGVzdCh0aGlzLm5vZGVOYW1lKSYmIWJjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFaLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYWMsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGFjLCJcclxuIil9fSkuZ2V0KCl9fSksbi5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTG9jYWw/aWMoKTpkLmRvY3VtZW50TW9kZT44P2hjKCk6L14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmaGMoKXx8aWMoKX06aGM7dmFyIGVjPTAsZmM9e30sZ2M9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGZjKWZjW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFnYyYmIndpdGhDcmVkZW50aWFscyJpbiBnYyxnYz1sLmFqYXg9ISFnYyxnYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGIpe2lmKCFiLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7dmFyIGYsZz1iLnhocigpLGg9KytlYztpZihnLm9wZW4oYi50eXBlLGIudXJsLGIuYXN5bmMsYi51c2VybmFtZSxiLnBhc3N3b3JkKSxiLnhockZpZWxkcylmb3IoZiBpbiBiLnhockZpZWxkcylnW2ZdPWIueGhyRmllbGRzW2ZdO2IubWltZVR5cGUmJmcub3ZlcnJpZGVNaW1lVHlwZSYmZy5vdmVycmlkZU1pbWVUeXBlKGIubWltZVR5cGUpLGIuY3Jvc3NEb21haW58fGRbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGRbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZiBpbiBkKXZvaWQgMCE9PWRbZl0mJmcuc2V0UmVxdWVzdEhlYWRlcihmLGRbZl0rIiIpO2cuc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCksYz1mdW5jdGlvbihhLGQpe3ZhciBmLGksajtpZihjJiYoZHx8ND09PWcucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIGZjW2hdLGM9dm9pZCAwLGcub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxkKTQhPT1nLnJlYWR5U3RhdGUmJmcuYWJvcnQoKTtlbHNle2o9e30sZj1nLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGcucmVzcG9uc2VUZXh0JiYoai50ZXh0PWcucmVzcG9uc2VUZXh0KTt0cnl7aT1nLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1mfHwhYi5pc0xvY2FsfHxiLmNyb3NzRG9tYWluPzEyMjM9PT1mJiYoZj0yMDQpOmY9ai50ZXh0PzIwMDo0MDR9aiYmZShmLGksaixnLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYi5hc3luYz80PT09Zy5yZWFkeVN0YXRlP2Euc2V0VGltZW91dChjKTpnLm9ucmVhZHlzdGF0ZWNoYW5nZT1mY1toXT1jOmMoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKHZvaWQgMCwhMCl9fX19KTtmdW5jdGlvbiBoYygpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBpYygpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fW4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPWQuaGVhZHx8bigiaGVhZCIpWzBdfHxkLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGYpe2I9ZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxmKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgamM9W10sa2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9amMucG9wKCl8fG4uZXhwYW5kbysiXyIrRWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGtjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYma2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGtjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShGYi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1mP24oYSkucmVtb3ZlUHJvcChlKTphW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssamMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGQ7dmFyIGU9eC5leGVjKGEpLGY9IWMmJltdO3JldHVybiBlP1tiLmNyZWF0ZUVsZW1lbnQoZVsxXSldOihlPWphKFthXSxiLGYpLGYmJmYubGVuZ3RoJiZuKGYpLnJlbW92ZSgpLG4ubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9O3ZhciBsYz1uLmZuLmxvYWQ7bi5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJmxjKXJldHVybiBsYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZigiICIpO3JldHVybiBoPi0xJiYoZD1uLnRyaW0oYS5zbGljZShoLGEubGVuZ3RoKSksYT1hLnNsaWNlKDAsaCkpLG4uaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmbi5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07ZnVuY3Rpb24gbWMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZuLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLG4uZXh0ZW5kKHt9LGgpKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8oInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1tYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYhbi5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bi5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxRYX0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO24uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9bWMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bihmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bihmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT1VYShsLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1TYShhLGIpLE9hLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7CnBhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pLG4uZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sbi5mbi5hbmRTZWxmPW4uZm4uYWRkQmFjaywiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBuYz1hLmpRdWVyeSxvYz1hLiQ7cmV0dXJuIG4ubm9Db25mbGljdD1mdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09biYmKGEuJD1vYyksYiYmYS5qUXVlcnk9PT1uJiYoYS5qUXVlcnk9bmMpLG59LGJ8fChhLmpRdWVyeT1hLiQ9biksbn0pOwo="></script>
<script src="data:application/x-javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuMi42LiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6CiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6CiAgKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsKfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOwoKdmFyIHZlcnNpb24gPSAiNC4yLjYiOwoKdmFyIGFzY2VuZGluZyA9IGZ1bmN0aW9uKGEsIGIpIHsKICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47Cn0KCnZhciBiaXNlY3RvciA9IGZ1bmN0aW9uKGNvbXBhcmUpIHsKICBpZiAoY29tcGFyZS5sZW5ndGggPT09IDEpIGNvbXBhcmUgPSBhc2NlbmRpbmdDb21wYXJhdG9yKGNvbXBhcmUpOwogIHJldHVybiB7CiAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDsKICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsKICAgICAgICBlbHNlIGhpID0gbWlkOwogICAgICB9CiAgICAgIHJldHVybiBsbzsKICAgIH0sCiAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7CiAgICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoOwogICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAwKSBoaSA9IG1pZDsKICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsKICAgICAgfQogICAgICByZXR1cm4gbG87CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGQsIHgpIHsKICAgIHJldHVybiBhc2NlbmRpbmcoZihkKSwgeCk7CiAgfTsKfQoKdmFyIGFzY2VuZGluZ0Jpc2VjdCA9IGJpc2VjdG9yKGFzY2VuZGluZyk7CnZhciBiaXNlY3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDsKdmFyIGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDsKCnZhciBkZXNjZW5kaW5nID0gZnVuY3Rpb24oYSwgYikgewogIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsKfQoKdmFyIG51bWJlciA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4Owp9Cgp2YXIgdmFyaWFuY2UgPSBmdW5jdGlvbihhcnJheSwgZikgewogIHZhciBuID0gYXJyYXkubGVuZ3RoLAogICAgICBtID0gMCwKICAgICAgYSwKICAgICAgZCwKICAgICAgcyA9IDAsCiAgICAgIGkgPSAtMSwKICAgICAgaiA9IDA7CgogIGlmIChmID09IG51bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4oYSA9IG51bWJlcihhcnJheVtpXSkpKSB7CiAgICAgICAgZCA9IGEgLSBtOwogICAgICAgIG0gKz0gZCAvICsrajsKICAgICAgICBzICs9IGQgKiAoYSAtIG0pOwogICAgICB9CiAgICB9CiAgfQoKICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4oYSA9IG51bWJlcihmKGFycmF5W2ldLCBpLCBhcnJheSkpKSkgewogICAgICAgIGQgPSBhIC0gbTsKICAgICAgICBtICs9IGQgLyArK2o7CiAgICAgICAgcyArPSBkICogKGEgLSBtKTsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKGogPiAxKSByZXR1cm4gcyAvIChqIC0gMSk7Cn0KCnZhciBkZXZpYXRpb24gPSBmdW5jdGlvbihhcnJheSwgZikgewogIHZhciB2ID0gdmFyaWFuY2UoYXJyYXksIGYpOwogIHJldHVybiB2ID8gTWF0aC5zcXJ0KHYpIDogdjsKfQoKdmFyIGV4dGVudCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIGkgPSAtMSwKICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgYSwKICAgICAgYiwKICAgICAgYzsKCiAgaWYgKGYgPT0gbnVsbCkgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGIgPj0gYikgeyBhID0gYyA9IGI7IGJyZWFrOyB9CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwpIHsKICAgICAgaWYgKGEgPiBiKSBhID0gYjsKICAgICAgaWYgKGMgPCBiKSBjID0gYjsKICAgIH0KICB9CgogIGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYoYXJyYXlbaV0sIGksIGFycmF5KSkgIT0gbnVsbCAmJiBiID49IGIpIHsgYSA9IGMgPSBiOyBicmVhazsgfQogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYoYXJyYXlbaV0sIGksIGFycmF5KSkgIT0gbnVsbCkgewogICAgICBpZiAoYSA+IGIpIGEgPSBiOwogICAgICBpZiAoYyA8IGIpIGMgPSBiOwogICAgfQogIH0KCiAgcmV0dXJuIFthLCBjXTsKfQoKdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOwoKdmFyIHNsaWNlID0gYXJyYXkuc2xpY2U7CnZhciBtYXAgPSBhcnJheS5tYXA7Cgp2YXIgY29uc3RhbnQkMSA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9Cgp2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIHg7Cn0KCnZhciByYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7CiAgc3RhcnQgPSArc3RhcnQsIHN0b3AgPSArc3RvcCwgc3RlcCA9IChuID0gYXJndW1lbnRzLmxlbmd0aCkgPCAyID8gKHN0b3AgPSBzdGFydCwgc3RhcnQgPSAwLCAxKSA6IG4gPCAzID8gMSA6ICtzdGVwOwoKICB2YXIgaSA9IC0xLAogICAgICBuID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCkpIHwgMCwKICAgICAgcmFuZ2UgPSBuZXcgQXJyYXkobik7CgogIHdoaWxlICgrK2kgPCBuKSB7CiAgICByYW5nZVtpXSA9IHN0YXJ0ICsgaSAqIHN0ZXA7CiAgfQoKICByZXR1cm4gcmFuZ2U7Cn0KCnZhciBlMTAgPSBNYXRoLnNxcnQoNTApOwp2YXIgZTUgPSBNYXRoLnNxcnQoMTApOwp2YXIgZTIgPSBNYXRoLnNxcnQoMik7Cgp2YXIgdGlja3MgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgY291bnQpIHsKICB2YXIgc3RlcCA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCk7CiAgcmV0dXJuIHJhbmdlKAogICAgTWF0aC5jZWlsKHN0YXJ0IC8gc3RlcCkgKiBzdGVwLAogICAgTWF0aC5mbG9vcihzdG9wIC8gc3RlcCkgKiBzdGVwICsgc3RlcCAvIDIsIC8vIGluY2x1c2l2ZQogICAgc3RlcAogICk7Cn0KCmZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCkgewogIHZhciBzdGVwMCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBjb3VudCksCiAgICAgIHN0ZXAxID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcDApIC8gTWF0aC5MTjEwKSksCiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTsKICBpZiAoZXJyb3IgPj0gZTEwKSBzdGVwMSAqPSAxMDsKICBlbHNlIGlmIChlcnJvciA+PSBlNSkgc3RlcDEgKj0gNTsKICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjsKICByZXR1cm4gc3RvcCA8IHN0YXJ0ID8gLXN0ZXAxIDogc3RlcDE7Cn0KCnZhciBzdHVyZ2VzID0gZnVuY3Rpb24odmFsdWVzKSB7CiAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4yKSArIDE7Cn0KCnZhciBoaXN0b2dyYW0gPSBmdW5jdGlvbigpIHsKICB2YXIgdmFsdWUgPSBpZGVudGl0eSwKICAgICAgZG9tYWluID0gZXh0ZW50LAogICAgICB0aHJlc2hvbGQgPSBzdHVyZ2VzOwoKICBmdW5jdGlvbiBoaXN0b2dyYW0oZGF0YSkgewogICAgdmFyIGksCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgIHgsCiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgdmFsdWVzW2ldID0gdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSk7CiAgICB9CgogICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksCiAgICAgICAgeDAgPSB4elswXSwKICAgICAgICB4MSA9IHh6WzFdLAogICAgICAgIHR6ID0gdGhyZXNob2xkKHZhbHVlcywgeDAsIHgxKTsKCiAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGludG8gdW5pZm9ybSB0aHJlc2hvbGRzLgogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgdHogPSB0aWNrcyh4MCwgeDEsIHR6KTsKCiAgICAvLyBSZW1vdmUgYW55IHRocmVzaG9sZHMgb3V0c2lkZSB0aGUgZG9tYWluLgogICAgdmFyIG0gPSB0ei5sZW5ndGg7CiAgICB3aGlsZSAodHpbMF0gPD0geDApIHR6LnNoaWZ0KCksIC0tbTsKICAgIHdoaWxlICh0elttIC0gMV0gPj0geDEpIHR6LnBvcCgpLCAtLW07CgogICAgdmFyIGJpbnMgPSBuZXcgQXJyYXkobSArIDEpLAogICAgICAgIGJpbjsKCiAgICAvLyBJbml0aWFsaXplIGJpbnMuCiAgICBmb3IgKGkgPSAwOyBpIDw9IG07ICsraSkgewogICAgICBiaW4gPSBiaW5zW2ldID0gW107CiAgICAgIGJpbi54MCA9IGkgPiAwID8gdHpbaSAtIDFdIDogeDA7CiAgICAgIGJpbi54MSA9IGkgPCBtID8gdHpbaV0gOiB4MTsKICAgIH0KCiAgICAvLyBBc3NpZ24gZGF0YSB0byBiaW5zIGJ5IHZhbHVlLCBpZ25vcmluZyBhbnkgb3V0c2lkZSB0aGUgZG9tYWluLgogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICB4ID0gdmFsdWVzW2ldOwogICAgICBpZiAoeDAgPD0geCAmJiB4IDw9IHgxKSB7CiAgICAgICAgYmluc1tiaXNlY3RSaWdodCh0eiwgeCwgMCwgbSldLnB1c2goZGF0YVtpXSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gYmluczsKICB9CgogIGhpc3RvZ3JhbS52YWx1ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMShfKSwgaGlzdG9ncmFtKSA6IHZhbHVlOwogIH07CgogIGhpc3RvZ3JhbS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQxKFtfWzBdLCBfWzFdXSksIGhpc3RvZ3JhbSkgOiBkb21haW47CiAgfTsKCiAgaGlzdG9ncmFtLnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQkMShzbGljZS5jYWxsKF8pKSA6IGNvbnN0YW50JDEoXyksIGhpc3RvZ3JhbSkgOiB0aHJlc2hvbGQ7CiAgfTsKCiAgcmV0dXJuIGhpc3RvZ3JhbTsKfQoKdmFyIHRocmVzaG9sZCA9IGZ1bmN0aW9uKGFycmF5LCBwLCBmKSB7CiAgaWYgKGYgPT0gbnVsbCkgZiA9IG51bWJlcjsKICBpZiAoIShuID0gYXJyYXkubGVuZ3RoKSkgcmV0dXJuOwogIGlmICgocCA9ICtwKSA8PSAwIHx8IG4gPCAyKSByZXR1cm4gK2YoYXJyYXlbMF0sIDAsIGFycmF5KTsKICBpZiAocCA+PSAxKSByZXR1cm4gK2YoYXJyYXlbbiAtIDFdLCBuIC0gMSwgYXJyYXkpOwogIHZhciBuLAogICAgICBoID0gKG4gLSAxKSAqIHAsCiAgICAgIGkgPSBNYXRoLmZsb29yKGgpLAogICAgICBhID0gK2YoYXJyYXlbaV0sIGksIGFycmF5KSwKICAgICAgYiA9ICtmKGFycmF5W2kgKyAxXSwgaSArIDEsIGFycmF5KTsKICByZXR1cm4gYSArIChiIC0gYSkgKiAoaCAtIGkpOwp9Cgp2YXIgZnJlZWRtYW5EaWFjb25pcyA9IGZ1bmN0aW9uKHZhbHVlcywgbWluLCBtYXgpIHsKICB2YWx1ZXMgPSBtYXAuY2FsbCh2YWx1ZXMsIG51bWJlcikuc29ydChhc2NlbmRpbmcpOwogIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoMiAqICh0aHJlc2hvbGQodmFsdWVzLCAwLjc1KSAtIHRocmVzaG9sZCh2YWx1ZXMsIDAuMjUpKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsKfQoKdmFyIHNjb3R0ID0gZnVuY3Rpb24odmFsdWVzLCBtaW4sIG1heCkgewogIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoMy41ICogZGV2aWF0aW9uKHZhbHVlcykgKiBNYXRoLnBvdyh2YWx1ZXMubGVuZ3RoLCAtMSAvIDMpKSk7Cn0KCnZhciBtYXggPSBmdW5jdGlvbihhcnJheSwgZikgewogIHZhciBpID0gLTEsCiAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgIGEsCiAgICAgIGI7CgogIGlmIChmID09IG51bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID49IGIpIHsgYSA9IGI7IGJyZWFrOyB9CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiOwogIH0KCiAgZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsICYmIGIgPj0gYikgeyBhID0gYjsgYnJlYWs7IH0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmKGFycmF5W2ldLCBpLCBhcnJheSkpICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiOwogIH0KCiAgcmV0dXJuIGE7Cn0KCnZhciBtZWFuID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICB2YXIgcyA9IDAsCiAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgIGEsCiAgICAgIGkgPSAtMSwKICAgICAgaiA9IG47CgogIGlmIChmID09IG51bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWlzTmFOKGEgPSBudW1iZXIoYXJyYXlbaV0pKSkgcyArPSBhOyBlbHNlIC0tajsKICB9CgogIGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9IG51bWJlcihmKGFycmF5W2ldLCBpLCBhcnJheSkpKSkgcyArPSBhOyBlbHNlIC0tajsKICB9CgogIGlmIChqKSByZXR1cm4gcyAvIGo7Cn0KCnZhciBtZWRpYW4gPSBmdW5jdGlvbihhcnJheSwgZikgewogIHZhciBudW1iZXJzID0gW10sCiAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgIGEsCiAgICAgIGkgPSAtMTsKCiAgaWYgKGYgPT0gbnVsbCkgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9IG51bWJlcihhcnJheVtpXSkpKSBudW1iZXJzLnB1c2goYSk7CiAgfQoKICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWlzTmFOKGEgPSBudW1iZXIoZihhcnJheVtpXSwgaSwgYXJyYXkpKSkpIG51bWJlcnMucHVzaChhKTsKICB9CgogIHJldHVybiB0aHJlc2hvbGQobnVtYmVycy5zb3J0KGFzY2VuZGluZyksIDAuNSk7Cn0KCnZhciBtZXJnZSA9IGZ1bmN0aW9uKGFycmF5cykgewogIHZhciBuID0gYXJyYXlzLmxlbmd0aCwKICAgICAgbSwKICAgICAgaSA9IC0xLAogICAgICBqID0gMCwKICAgICAgbWVyZ2VkLAogICAgICBhcnJheTsKCiAgd2hpbGUgKCsraSA8IG4pIGogKz0gYXJyYXlzW2ldLmxlbmd0aDsKICBtZXJnZWQgPSBuZXcgQXJyYXkoaik7CgogIHdoaWxlICgtLW4gPj0gMCkgewogICAgYXJyYXkgPSBhcnJheXNbbl07CiAgICBtID0gYXJyYXkubGVuZ3RoOwogICAgd2hpbGUgKC0tbSA+PSAwKSB7CiAgICAgIG1lcmdlZFstLWpdID0gYXJyYXlbbV07CiAgICB9CiAgfQoKICByZXR1cm4gbWVyZ2VkOwp9Cgp2YXIgbWluID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICB2YXIgaSA9IC0xLAogICAgICBuID0gYXJyYXkubGVuZ3RoLAogICAgICBhLAogICAgICBiOwoKICBpZiAoZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+PSBiKSB7IGEgPSBiOyBicmVhazsgfQogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsKICB9CgogIGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYoYXJyYXlbaV0sIGksIGFycmF5KSkgIT0gbnVsbCAmJiBiID49IGIpIHsgYSA9IGI7IGJyZWFrOyB9CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsKICB9CgogIHJldHVybiBhOwp9Cgp2YXIgcGFpcnMgPSBmdW5jdGlvbihhcnJheSkgewogIHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aCAtIDEsIHAgPSBhcnJheVswXSwgcGFpcnMgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7CiAgd2hpbGUgKGkgPCBuKSBwYWlyc1tpXSA9IFtwLCBwID0gYXJyYXlbKytpXV07CiAgcmV0dXJuIHBhaXJzOwp9Cgp2YXIgcGVybXV0ZSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7CiAgdmFyIGkgPSBpbmRleGVzLmxlbmd0aCwgcGVybXV0ZXMgPSBuZXcgQXJyYXkoaSk7CiAgd2hpbGUgKGktLSkgcGVybXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTsKICByZXR1cm4gcGVybXV0ZXM7Cn0KCnZhciBzY2FuID0gZnVuY3Rpb24oYXJyYXksIGNvbXBhcmUpIHsKICBpZiAoIShuID0gYXJyYXkubGVuZ3RoKSkgcmV0dXJuOwogIHZhciBpID0gMCwKICAgICAgbiwKICAgICAgaiA9IDAsCiAgICAgIHhpLAogICAgICB4aiA9IGFycmF5W2pdOwoKICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7CgogIHdoaWxlICgrK2kgPCBuKSBpZiAoY29tcGFyZSh4aSA9IGFycmF5W2ldLCB4aikgPCAwIHx8IGNvbXBhcmUoeGosIHhqKSAhPT0gMCkgeGogPSB4aSwgaiA9IGk7CgogIGlmIChjb21wYXJlKHhqLCB4aikgPT09IDApIHJldHVybiBqOwp9Cgp2YXIgc2h1ZmZsZSA9IGZ1bmN0aW9uKGFycmF5LCBpMCwgaTEpIHsKICB2YXIgbSA9IChpMSA9PSBudWxsID8gYXJyYXkubGVuZ3RoIDogaTEpIC0gKGkwID0gaTAgPT0gbnVsbCA/IDAgOiAraTApLAogICAgICB0LAogICAgICBpOwoKICB3aGlsZSAobSkgewogICAgaSA9IE1hdGgucmFuZG9tKCkgKiBtLS0gfCAwOwogICAgdCA9IGFycmF5W20gKyBpMF07CiAgICBhcnJheVttICsgaTBdID0gYXJyYXlbaSArIGkwXTsKICAgIGFycmF5W2kgKyBpMF0gPSB0OwogIH0KCiAgcmV0dXJuIGFycmF5Owp9Cgp2YXIgc3VtID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICB2YXIgcyA9IDAsCiAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgIGEsCiAgICAgIGkgPSAtMTsKCiAgaWYgKGYgPT0gbnVsbCkgewogICAgd2hpbGUgKCsraSA8IG4pIGlmIChhID0gK2FycmF5W2ldKSBzICs9IGE7IC8vIE5vdGU6IHplcm8gYW5kIG51bGwgYXJlIGVxdWl2YWxlbnQuCiAgfQoKICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoYSA9ICtmKGFycmF5W2ldLCBpLCBhcnJheSkpIHMgKz0gYTsKICB9CgogIHJldHVybiBzOwp9Cgp2YXIgdHJhbnNwb3NlID0gZnVuY3Rpb24obWF0cml4KSB7CiAgaWYgKCEobiA9IG1hdHJpeC5sZW5ndGgpKSByZXR1cm4gW107CiAgZm9yICh2YXIgaSA9IC0xLCBtID0gbWluKG1hdHJpeCwgbGVuZ3RoKSwgdHJhbnNwb3NlID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgewogICAgZm9yICh2YXIgaiA9IC0xLCBuLCByb3cgPSB0cmFuc3Bvc2VbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8IG47KSB7CiAgICAgIHJvd1tqXSA9IG1hdHJpeFtqXVtpXTsKICAgIH0KICB9CiAgcmV0dXJuIHRyYW5zcG9zZTsKfQoKZnVuY3Rpb24gbGVuZ3RoKGQpIHsKICByZXR1cm4gZC5sZW5ndGg7Cn0KCnZhciB6aXAgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdHJhbnNwb3NlKGFyZ3VtZW50cyk7Cn0KCnZhciBwcmVmaXggPSAiJCI7CgpmdW5jdGlvbiBNYXAoKSB7fQoKTWFwLnByb3RvdHlwZSA9IG1hcCQxLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogTWFwLAogIGhhczogZnVuY3Rpb24oa2V5KSB7CiAgICByZXR1cm4gKHByZWZpeCArIGtleSkgaW4gdGhpczsKICB9LAogIGdldDogZnVuY3Rpb24oa2V5KSB7CiAgICByZXR1cm4gdGhpc1twcmVmaXggKyBrZXldOwogIH0sCiAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICB0aGlzW3ByZWZpeCArIGtleV0gPSB2YWx1ZTsKICAgIHJldHVybiB0aGlzOwogIH0sCiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsKICAgIHZhciBwcm9wZXJ0eSA9IHByZWZpeCArIGtleTsKICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsKICB9LAogIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBkZWxldGUgdGhpc1twcm9wZXJ0eV07CiAgfSwKICBrZXlzOiBmdW5jdGlvbigpIHsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkga2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKTsKICAgIHJldHVybiBrZXlzOwogIH0sCiAgdmFsdWVzOiBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSB2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSk7CiAgICByZXR1cm4gdmFsdWVzOwogIH0sCiAgZW50cmllczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZW50cmllcyA9IFtdOwogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGVudHJpZXMucHVzaCh7a2V5OiBwcm9wZXJ0eS5zbGljZSgxKSwgdmFsdWU6IHRoaXNbcHJvcGVydHldfSk7CiAgICByZXR1cm4gZW50cmllczsKICB9LAogIHNpemU6IGZ1bmN0aW9uKCkgewogICAgdmFyIHNpemUgPSAwOwogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpICsrc2l6ZTsKICAgIHJldHVybiBzaXplOwogIH0sCiAgZW1wdHk6IGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0sCiAgZWFjaDogZnVuY3Rpb24oZikgewogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGYodGhpc1twcm9wZXJ0eV0sIHByb3BlcnR5LnNsaWNlKDEpLCB0aGlzKTsKICB9Cn07CgpmdW5jdGlvbiBtYXAkMShvYmplY3QsIGYpIHsKICB2YXIgbWFwID0gbmV3IE1hcDsKCiAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pOwoKICAvLyBJbmRleCBhcnJheSBieSBudW1lcmljIGluZGV4IG9yIHNwZWNpZmllZCBrZXkgZnVuY3Rpb24uCiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7CiAgICB2YXIgaSA9IC0xLAogICAgICAgIG4gPSBvYmplY3QubGVuZ3RoLAogICAgICAgIG87CgogICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoaSwgb2JqZWN0W2ldKTsKICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoZihvID0gb2JqZWN0W2ldLCBpLCBvYmplY3QpLCBvKTsKICB9CgogIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC4KICBlbHNlIGlmIChvYmplY3QpIGZvciAodmFyIGtleSBpbiBvYmplY3QpIG1hcC5zZXQoa2V5LCBvYmplY3Rba2V5XSk7CgogIHJldHVybiBtYXA7Cn0KCnZhciBuZXN0ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGtleXMgPSBbXSwKICAgICAgc29ydEtleXMgPSBbXSwKICAgICAgc29ydFZhbHVlcywKICAgICAgcm9sbHVwLAogICAgICBuZXN0OwoKICBmdW5jdGlvbiBhcHBseShhcnJheSwgZGVwdGgsIGNyZWF0ZVJlc3VsdCwgc2V0UmVzdWx0KSB7CiAgICBpZiAoZGVwdGggPj0ga2V5cy5sZW5ndGgpIHJldHVybiByb2xsdXAgIT0gbnVsbAogICAgICAgID8gcm9sbHVwKGFycmF5KSA6IChzb3J0VmFsdWVzICE9IG51bGwKICAgICAgICA/IGFycmF5LnNvcnQoc29ydFZhbHVlcykKICAgICAgICA6IGFycmF5KTsKCiAgICB2YXIgaSA9IC0xLAogICAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSwKICAgICAgICBrZXlWYWx1ZSwKICAgICAgICB2YWx1ZSwKICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCQxKCksCiAgICAgICAgdmFsdWVzLAogICAgICAgIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpOwoKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkodmFsdWUgPSBhcnJheVtpXSkgKyAiIikpIHsKICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbdmFsdWVdKTsKICAgICAgfQogICAgfQoKICAgIHZhbHVlc0J5S2V5LmVhY2goZnVuY3Rpb24odmFsdWVzLCBrZXkpIHsKICAgICAgc2V0UmVzdWx0KHJlc3VsdCwga2V5LCBhcHBseSh2YWx1ZXMsIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkpOwogICAgfSk7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIGVudHJpZXMobWFwLCBkZXB0aCkgewogICAgaWYgKCsrZGVwdGggPiBrZXlzLmxlbmd0aCkgcmV0dXJuIG1hcDsKICAgIHZhciBhcnJheSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRoIC0gMV07CiAgICBpZiAocm9sbHVwICE9IG51bGwgJiYgZGVwdGggPj0ga2V5cy5sZW5ndGgpIGFycmF5ID0gbWFwLmVudHJpZXMoKTsKICAgIGVsc2UgYXJyYXkgPSBbXSwgbWFwLmVhY2goZnVuY3Rpb24odiwgaykgeyBhcnJheS5wdXNoKHtrZXk6IGssIHZhbHVlczogZW50cmllcyh2LCBkZXB0aCl9KTsgfSk7CiAgICByZXR1cm4gc29ydEtleSAhPSBudWxsID8gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7IH0pIDogYXJyYXk7CiAgfQoKICByZXR1cm4gbmVzdCA9IHsKICAgIG9iamVjdDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVPYmplY3QsIHNldE9iamVjdCk7IH0sCiAgICBtYXA6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApOyB9LAogICAgZW50cmllczogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGVudHJpZXMoYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU1hcCwgc2V0TWFwKSwgMCk7IH0sCiAgICBrZXk6IGZ1bmN0aW9uKGQpIHsga2V5cy5wdXNoKGQpOyByZXR1cm4gbmVzdDsgfSwKICAgIHNvcnRLZXlzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LAogICAgc29ydFZhbHVlczogZnVuY3Rpb24ob3JkZXIpIHsgc29ydFZhbHVlcyA9IG9yZGVyOyByZXR1cm4gbmVzdDsgfSwKICAgIHJvbGx1cDogZnVuY3Rpb24oZikgeyByb2xsdXAgPSBmOyByZXR1cm4gbmVzdDsgfQogIH07Cn0KCmZ1bmN0aW9uIGNyZWF0ZU9iamVjdCgpIHsKICByZXR1cm4ge307Cn0KCmZ1bmN0aW9uIHNldE9iamVjdChvYmplY3QsIGtleSwgdmFsdWUpIHsKICBvYmplY3Rba2V5XSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBjcmVhdGVNYXAoKSB7CiAgcmV0dXJuIG1hcCQxKCk7Cn0KCmZ1bmN0aW9uIHNldE1hcChtYXAsIGtleSwgdmFsdWUpIHsKICBtYXAuc2V0KGtleSwgdmFsdWUpOwp9CgpmdW5jdGlvbiBTZXQoKSB7fQoKdmFyIHByb3RvID0gbWFwJDEucHJvdG90eXBlOwoKU2V0LnByb3RvdHlwZSA9IHNldC5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFNldCwKICBoYXM6IHByb3RvLmhhcywKICBhZGQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICB2YWx1ZSArPSAiIjsKICAgIHRoaXNbcHJlZml4ICsgdmFsdWVdID0gdmFsdWU7CiAgICByZXR1cm4gdGhpczsKICB9LAogIHJlbW92ZTogcHJvdG8ucmVtb3ZlLAogIGNsZWFyOiBwcm90by5jbGVhciwKICB2YWx1ZXM6IHByb3RvLmtleXMsCiAgc2l6ZTogcHJvdG8uc2l6ZSwKICBlbXB0eTogcHJvdG8uZW1wdHksCiAgZWFjaDogcHJvdG8uZWFjaAp9OwoKZnVuY3Rpb24gc2V0KG9iamVjdCwgZikgewogIHZhciBzZXQgPSBuZXcgU2V0OwoKICAvLyBDb3B5IGNvbnN0cnVjdG9yLgogIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXQpIG9iamVjdC5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IHNldC5hZGQodmFsdWUpOyB9KTsKCiAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaXTDosKAwplzIGFuIGFycmF5LgogIGVsc2UgaWYgKG9iamVjdCkgewogICAgdmFyIGkgPSAtMSwgbiA9IG9iamVjdC5sZW5ndGg7CiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChvYmplY3RbaV0pOwogICAgZWxzZSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChmKG9iamVjdFtpXSwgaSwgb2JqZWN0KSk7CiAgfQoKICByZXR1cm4gc2V0Owp9Cgp2YXIga2V5cyA9IGZ1bmN0aW9uKG1hcCkgewogIHZhciBrZXlzID0gW107CiAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7CiAgcmV0dXJuIGtleXM7Cn0KCnZhciB2YWx1ZXMgPSBmdW5jdGlvbihtYXApIHsKICB2YXIgdmFsdWVzID0gW107CiAgZm9yICh2YXIga2V5IGluIG1hcCkgdmFsdWVzLnB1c2gobWFwW2tleV0pOwogIHJldHVybiB2YWx1ZXM7Cn0KCnZhciBlbnRyaWVzID0gZnVuY3Rpb24obWFwKSB7CiAgdmFyIGVudHJpZXMgPSBbXTsKICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogbWFwW2tleV19KTsKICByZXR1cm4gZW50cmllczsKfQoKdmFyIHVuaWZvcm0gPSBmdW5jdGlvbihtaW4sIG1heCkgewogIG1pbiA9IG1pbiA9PSBudWxsID8gMCA6ICttaW47CiAgbWF4ID0gbWF4ID09IG51bGwgPyAxIDogK21heDsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgbWF4ID0gbWluLCBtaW4gPSAwOwogIGVsc2UgbWF4IC09IG1pbjsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIG1heCArIG1pbjsKICB9Owp9Cgp2YXIgbm9ybWFsID0gZnVuY3Rpb24obXUsIHNpZ21hKSB7CiAgdmFyIHgsIHI7CiAgbXUgPSBtdSA9PSBudWxsID8gMCA6ICttdTsKICBzaWdtYSA9IHNpZ21hID09IG51bGwgPyAxIDogK3NpZ21hOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciB5OwoKICAgIC8vIElmIGF2YWlsYWJsZSwgdXNlIHRoZSBzZWNvbmQgcHJldmlvdXNseS1nZW5lcmF0ZWQgdW5pZm9ybSByYW5kb20uCiAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7CgogICAgLy8gT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhIG5ldyB4IGFuZCB5LgogICAgZWxzZSBkbyB7CiAgICAgIHggPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7CiAgICAgIHkgPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7CiAgICAgIHIgPSB4ICogeCArIHkgKiB5OwogICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpOwoKICAgIHJldHVybiBtdSArIHNpZ21hICogeSAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7CiAgfTsKfQoKdmFyIGxvZ05vcm1hbCA9IGZ1bmN0aW9uKCkgewogIHZhciByYW5kb21Ob3JtYWwgPSBub3JtYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWF0aC5leHAocmFuZG9tTm9ybWFsKCkpOwogIH07Cn0KCnZhciBpcndpbkhhbGwgPSBmdW5jdGlvbihuKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgc3VtID0gMCwgaSA9IDA7IGkgPCBuOyArK2kpIHN1bSArPSBNYXRoLnJhbmRvbSgpOwogICAgcmV0dXJuIHN1bTsKICB9Owp9Cgp2YXIgYmF0ZXMgPSBmdW5jdGlvbihuKSB7CiAgdmFyIHJhbmRvbUlyd2luSGFsbCA9IGlyd2luSGFsbChuKTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcmFuZG9tSXJ3aW5IYWxsKCkgLyBuOwogIH07Cn0KCnZhciBleHBvbmVudGlhbCA9IGZ1bmN0aW9uKGxhbWJkYSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiAtTWF0aC5sb2coMSAtIE1hdGgucmFuZG9tKCkpIC8gbGFtYmRhOwogIH07Cn0KCmZ1bmN0aW9uIGxpbmVhcih0KSB7CiAgcmV0dXJuICt0Owp9CgpmdW5jdGlvbiBxdWFkSW4odCkgewogIHJldHVybiB0ICogdDsKfQoKZnVuY3Rpb24gcXVhZE91dCh0KSB7CiAgcmV0dXJuIHQgKiAoMiAtIHQpOwp9CgpmdW5jdGlvbiBxdWFkSW5PdXQodCkgewogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0IDogLS10ICogKDIgLSB0KSArIDEpIC8gMjsKfQoKZnVuY3Rpb24gY3ViaWNJbih0KSB7CiAgcmV0dXJuIHQgKiB0ICogdDsKfQoKZnVuY3Rpb24gY3ViaWNPdXQodCkgewogIHJldHVybiAtLXQgKiB0ICogdCArIDE7Cn0KCmZ1bmN0aW9uIGN1YmljSW5PdXQodCkgewogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7Cn0KCnZhciBleHBvbmVudCA9IDM7Cgp2YXIgcG9seUluID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7CiAgZSA9ICtlOwoKICBmdW5jdGlvbiBwb2x5SW4odCkgewogICAgcmV0dXJuIE1hdGgucG93KHQsIGUpOwogIH0KCiAgcG9seUluLmV4cG9uZW50ID0gY3VzdG9tOwoKICByZXR1cm4gcG9seUluOwp9KShleHBvbmVudCk7Cgp2YXIgcG9seU91dCA9IChmdW5jdGlvbiBjdXN0b20oZSkgewogIGUgPSArZTsKCiAgZnVuY3Rpb24gcG9seU91dCh0KSB7CiAgICByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB0LCBlKTsKICB9CgogIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207CgogIHJldHVybiBwb2x5T3V0Owp9KShleHBvbmVudCk7Cgp2YXIgcG9seUluT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7CiAgZSA9ICtlOwoKICBmdW5jdGlvbiBwb2x5SW5PdXQodCkgewogICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gTWF0aC5wb3codCwgZSkgOiAyIC0gTWF0aC5wb3coMiAtIHQsIGUpKSAvIDI7CiAgfQoKICBwb2x5SW5PdXQuZXhwb25lbnQgPSBjdXN0b207CgogIHJldHVybiBwb2x5SW5PdXQ7Cn0pKGV4cG9uZW50KTsKCnZhciBwaSA9IE1hdGguUEk7CnZhciBoYWxmUGkgPSBwaSAvIDI7CgpmdW5jdGlvbiBzaW5Jbih0KSB7CiAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogaGFsZlBpKTsKfQoKZnVuY3Rpb24gc2luT3V0KHQpIHsKICByZXR1cm4gTWF0aC5zaW4odCAqIGhhbGZQaSk7Cn0KCmZ1bmN0aW9uIHNpbkluT3V0KHQpIHsKICByZXR1cm4gKDEgLSBNYXRoLmNvcyhwaSAqIHQpKSAvIDI7Cn0KCmZ1bmN0aW9uIGV4cEluKHQpIHsKICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiB0IC0gMTApOwp9CgpmdW5jdGlvbiBleHBPdXQodCkgewogIHJldHVybiAxIC0gTWF0aC5wb3coMiwgLTEwICogdCk7Cn0KCmZ1bmN0aW9uIGV4cEluT3V0KHQpIHsKICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyBNYXRoLnBvdygyLCAxMCAqIHQgLSAxMCkgOiAyIC0gTWF0aC5wb3coMiwgMTAgLSAxMCAqIHQpKSAvIDI7Cn0KCmZ1bmN0aW9uIGNpcmNsZUluKHQpIHsKICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpOwp9CgpmdW5jdGlvbiBjaXJjbGVPdXQodCkgewogIHJldHVybiBNYXRoLnNxcnQoMSAtIC0tdCAqIHQpOwp9CgpmdW5jdGlvbiBjaXJjbGVJbk91dCh0KSB7CiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpIDogTWF0aC5zcXJ0KDEgLSAodCAtPSAyKSAqIHQpICsgMSkgLyAyOwp9Cgp2YXIgYjEgPSA0IC8gMTE7CnZhciBiMiA9IDYgLyAxMTsKdmFyIGIzID0gOCAvIDExOwp2YXIgYjQgPSAzIC8gNDsKdmFyIGI1ID0gOSAvIDExOwp2YXIgYjYgPSAxMCAvIDExOwp2YXIgYjcgPSAxNSAvIDE2Owp2YXIgYjggPSAyMSAvIDIyOwp2YXIgYjkgPSA2MyAvIDY0Owp2YXIgYjAgPSAxIC8gYjEgLyBiMTsKCmZ1bmN0aW9uIGJvdW5jZUluKHQpIHsKICByZXR1cm4gMSAtIGJvdW5jZU91dCgxIC0gdCk7Cn0KCmZ1bmN0aW9uIGJvdW5jZU91dCh0KSB7CiAgcmV0dXJuICh0ID0gK3QpIDwgYjEgPyBiMCAqIHQgKiB0IDogdCA8IGIzID8gYjAgKiAodCAtPSBiMikgKiB0ICsgYjQgOiB0IDwgYjYgPyBiMCAqICh0IC09IGI1KSAqIHQgKyBiNyA6IGIwICogKHQgLT0gYjgpICogdCArIGI5Owp9CgpmdW5jdGlvbiBib3VuY2VJbk91dCh0KSB7CiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gMSAtIGJvdW5jZU91dCgxIC0gdCkgOiBib3VuY2VPdXQodCAtIDEpICsgMSkgLyAyOwp9Cgp2YXIgb3ZlcnNob290ID0gMS43MDE1ODsKCnZhciBiYWNrSW4gPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsKICBzID0gK3M7CgogIGZ1bmN0aW9uIGJhY2tJbih0KSB7CiAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTsKICB9CgogIGJhY2tJbi5vdmVyc2hvb3QgPSBjdXN0b207CgogIHJldHVybiBiYWNrSW47Cn0pKG92ZXJzaG9vdCk7Cgp2YXIgYmFja091dCA9IChmdW5jdGlvbiBjdXN0b20ocykgewogIHMgPSArczsKCiAgZnVuY3Rpb24gYmFja091dCh0KSB7CiAgICByZXR1cm4gLS10ICogdCAqICgocyArIDEpICogdCArIHMpICsgMTsKICB9CgogIGJhY2tPdXQub3ZlcnNob290ID0gY3VzdG9tOwoKICByZXR1cm4gYmFja091dDsKfSkob3ZlcnNob290KTsKCnZhciBiYWNrSW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsKICBzID0gK3M7CgogIGZ1bmN0aW9uIGJhY2tJbk91dCh0KSB7CiAgICByZXR1cm4gKCh0ICo9IDIpIDwgMSA/IHQgKiB0ICogKChzICsgMSkgKiB0IC0gcykgOiAodCAtPSAyKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDIpIC8gMjsKICB9CgogIGJhY2tJbk91dC5vdmVyc2hvb3QgPSBjdXN0b207CgogIHJldHVybiBiYWNrSW5PdXQ7Cn0pKG92ZXJzaG9vdCk7Cgp2YXIgdGF1ID0gMiAqIE1hdGguUEk7CnZhciBhbXBsaXR1ZGUgPSAxOwp2YXIgcGVyaW9kID0gMC4zOwoKdmFyIGVsYXN0aWNJbiA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkgewogIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAocCAvPSB0YXUpOwoKICBmdW5jdGlvbiBlbGFzdGljSW4odCkgewogICAgcmV0dXJuIGEgKiBNYXRoLnBvdygyLCAxMCAqIC0tdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcCk7CiAgfQoKICBlbGFzdGljSW4uYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9OwogIGVsYXN0aWNJbi5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07CgogIHJldHVybiBlbGFzdGljSW47Cn0pKGFtcGxpdHVkZSwgcGVyaW9kKTsKCnZhciBlbGFzdGljT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7CiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7CgogIGZ1bmN0aW9uIGVsYXN0aWNPdXQodCkgewogICAgcmV0dXJuIDEgLSBhICogTWF0aC5wb3coMiwgLTEwICogKHQgPSArdCkpICogTWF0aC5zaW4oKHQgKyBzKSAvIHApOwogIH0KCiAgZWxhc3RpY091dC5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07CiAgZWxhc3RpY091dC5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07CgogIHJldHVybiBlbGFzdGljT3V0Owp9KShhbXBsaXR1ZGUsIHBlcmlvZCk7Cgp2YXIgZWxhc3RpY0luT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7CiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7CgogIGZ1bmN0aW9uIGVsYXN0aWNJbk91dCh0KSB7CiAgICByZXR1cm4gKCh0ID0gdCAqIDIgLSAxKSA8IDAKICAgICAgICA/IGEgKiBNYXRoLnBvdygyLCAxMCAqIHQpICogTWF0aC5zaW4oKHMgLSB0KSAvIHApCiAgICAgICAgOiAyIC0gYSAqIE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHMgKyB0KSAvIHApKSAvIDI7CiAgfQoKICBlbGFzdGljSW5PdXQuYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9OwogIGVsYXN0aWNJbk91dC5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07CgogIHJldHVybiBlbGFzdGljSW5PdXQ7Cn0pKGFtcGxpdHVkZSwgcGVyaW9kKTsKCnZhciBhcmVhID0gZnVuY3Rpb24ocG9seWdvbikgewogIHZhciBpID0gLTEsCiAgICAgIG4gPSBwb2x5Z29uLmxlbmd0aCwKICAgICAgYSwKICAgICAgYiA9IHBvbHlnb25bbiAtIDFdLAogICAgICBhcmVhID0gMDsKCiAgd2hpbGUgKCsraSA8IG4pIHsKICAgIGEgPSBiOwogICAgYiA9IHBvbHlnb25baV07CiAgICBhcmVhICs9IGFbMV0gKiBiWzBdIC0gYVswXSAqIGJbMV07CiAgfQoKICByZXR1cm4gYXJlYSAvIDI7Cn0KCnZhciBjZW50cm9pZCA9IGZ1bmN0aW9uKHBvbHlnb24pIHsKICB2YXIgaSA9IC0xLAogICAgICBuID0gcG9seWdvbi5sZW5ndGgsCiAgICAgIHggPSAwLAogICAgICB5ID0gMCwKICAgICAgYSwKICAgICAgYiA9IHBvbHlnb25bbiAtIDFdLAogICAgICBjLAogICAgICBrID0gMDsKCiAgd2hpbGUgKCsraSA8IG4pIHsKICAgIGEgPSBiOwogICAgYiA9IHBvbHlnb25baV07CiAgICBrICs9IGMgPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdOwogICAgeCArPSAoYVswXSArIGJbMF0pICogYzsKICAgIHkgKz0gKGFbMV0gKyBiWzFdKSAqIGM7CiAgfQoKICByZXR1cm4gayAqPSAzLCBbeCAvIGssIHkgLyBrXTsKfQoKLy8gUmV0dXJucyB0aGUgMkQgY3Jvc3MgcHJvZHVjdCBvZiBBQiBhbmQgQUMgdmVjdG9ycywgaS5lLiwgdGhlIHotY29tcG9uZW50IG9mCi8vIHRoZSAzRCBjcm9zcyBwcm9kdWN0IGluIGEgcXVhZHJhbnQgSSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0gKCt4IGlzCi8vIHJpZ2h0LCAreSBpcyB1cCkuIFJldHVybnMgYSBwb3NpdGl2ZSB2YWx1ZSBpZiBBQkMgaXMgY291bnRlci1jbG9ja3dpc2UsCi8vIG5lZ2F0aXZlIGlmIGNsb2Nrd2lzZSwgYW5kIHplcm8gaWYgdGhlIHBvaW50cyBhcmUgY29sbGluZWFyLgp2YXIgY3Jvc3MgPSBmdW5jdGlvbihhLCBiLCBjKSB7CiAgcmV0dXJuIChiWzBdIC0gYVswXSkgKiAoY1sxXSAtIGFbMV0pIC0gKGJbMV0gLSBhWzFdKSAqIChjWzBdIC0gYVswXSk7Cn0KCmZ1bmN0aW9uIGxleGljb2dyYXBoaWNPcmRlcihhLCBiKSB7CiAgcmV0dXJuIGFbMF0gLSBiWzBdIHx8IGFbMV0gLSBiWzFdOwp9CgovLyBDb21wdXRlcyB0aGUgdXBwZXIgY29udmV4IGh1bGwgcGVyIHRoZSBtb25vdG9uZSBjaGFpbiBhbGdvcml0aG0uCi8vIEFzc3VtZXMgcG9pbnRzLmxlbmd0aCA+PSAzLCBpcyBzb3J0ZWQgYnkgeCwgdW5pcXVlIGluIHkuCi8vIFJldHVybnMgYW4gYXJyYXkgb2YgaW5kaWNlcyBpbnRvIHBvaW50cyBpbiBsZWZ0LXRvLXJpZ2h0IG9yZGVyLgpmdW5jdGlvbiBjb21wdXRlVXBwZXJIdWxsSW5kZXhlcyhwb2ludHMpIHsKICB2YXIgbiA9IHBvaW50cy5sZW5ndGgsCiAgICAgIGluZGV4ZXMgPSBbMCwgMV0sCiAgICAgIHNpemUgPSAyOwoKICBmb3IgKHZhciBpID0gMjsgaSA8IG47ICsraSkgewogICAgd2hpbGUgKHNpemUgPiAxICYmIGNyb3NzKHBvaW50c1tpbmRleGVzW3NpemUgLSAyXV0sIHBvaW50c1tpbmRleGVzW3NpemUgLSAxXV0sIHBvaW50c1tpXSkgPD0gMCkgLS1zaXplOwogICAgaW5kZXhlc1tzaXplKytdID0gaTsKICB9CgogIHJldHVybiBpbmRleGVzLnNsaWNlKDAsIHNpemUpOyAvLyByZW1vdmUgcG9wcGVkIHBvaW50cwp9Cgp2YXIgaHVsbCA9IGZ1bmN0aW9uKHBvaW50cykgewogIGlmICgobiA9IHBvaW50cy5sZW5ndGgpIDwgMykgcmV0dXJuIG51bGw7CgogIHZhciBpLAogICAgICBuLAogICAgICBzb3J0ZWRQb2ludHMgPSBuZXcgQXJyYXkobiksCiAgICAgIGZsaXBwZWRQb2ludHMgPSBuZXcgQXJyYXkobik7CgogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNvcnRlZFBvaW50c1tpXSA9IFsrcG9pbnRzW2ldWzBdLCArcG9pbnRzW2ldWzFdLCBpXTsKICBzb3J0ZWRQb2ludHMuc29ydChsZXhpY29ncmFwaGljT3JkZXIpOwogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGZsaXBwZWRQb2ludHNbaV0gPSBbc29ydGVkUG9pbnRzW2ldWzBdLCAtc29ydGVkUG9pbnRzW2ldWzFdXTsKCiAgdmFyIHVwcGVySW5kZXhlcyA9IGNvbXB1dGVVcHBlckh1bGxJbmRleGVzKHNvcnRlZFBvaW50cyksCiAgICAgIGxvd2VySW5kZXhlcyA9IGNvbXB1dGVVcHBlckh1bGxJbmRleGVzKGZsaXBwZWRQb2ludHMpOwoKICAvLyBDb25zdHJ1Y3QgdGhlIGh1bGwgcG9seWdvbiwgcmVtb3ZpbmcgcG9zc2libGUgZHVwbGljYXRlIGVuZHBvaW50cy4KICB2YXIgc2tpcExlZnQgPSBsb3dlckluZGV4ZXNbMF0gPT09IHVwcGVySW5kZXhlc1swXSwKICAgICAgc2tpcFJpZ2h0ID0gbG93ZXJJbmRleGVzW2xvd2VySW5kZXhlcy5sZW5ndGggLSAxXSA9PT0gdXBwZXJJbmRleGVzW3VwcGVySW5kZXhlcy5sZW5ndGggLSAxXSwKICAgICAgaHVsbCA9IFtdOwoKICAvLyBBZGQgdXBwZXIgaHVsbCBpbiByaWdodC10by1sIG9yZGVyLgogIC8vIFRoZW4gYWRkIGxvd2VyIGh1bGwgaW4gbGVmdC10by1yaWdodCBvcmRlci4KICBmb3IgKGkgPSB1cHBlckluZGV4ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIGh1bGwucHVzaChwb2ludHNbc29ydGVkUG9pbnRzW3VwcGVySW5kZXhlc1tpXV1bMl1dKTsKICBmb3IgKGkgPSArc2tpcExlZnQ7IGkgPCBsb3dlckluZGV4ZXMubGVuZ3RoIC0gc2tpcFJpZ2h0OyArK2kpIGh1bGwucHVzaChwb2ludHNbc29ydGVkUG9pbnRzW2xvd2VySW5kZXhlc1tpXV1bMl1dKTsKCiAgcmV0dXJuIGh1bGw7Cn0KCnZhciBjb250YWlucyA9IGZ1bmN0aW9uKHBvbHlnb24sIHBvaW50KSB7CiAgdmFyIG4gPSBwb2x5Z29uLmxlbmd0aCwKICAgICAgcCA9IHBvbHlnb25bbiAtIDFdLAogICAgICB4ID0gcG9pbnRbMF0sIHkgPSBwb2ludFsxXSwKICAgICAgeDAgPSBwWzBdLCB5MCA9IHBbMV0sCiAgICAgIHgxLCB5MSwKICAgICAgaW5zaWRlID0gZmFsc2U7CgogIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBwID0gcG9seWdvbltpXSwgeDEgPSBwWzBdLCB5MSA9IHBbMV07CiAgICBpZiAoKCh5MSA+IHkpICE9PSAoeTAgPiB5KSkgJiYgKHggPCAoeDAgLSB4MSkgKiAoeSAtIHkxKSAvICh5MCAtIHkxKSArIHgxKSkgaW5zaWRlID0gIWluc2lkZTsKICAgIHgwID0geDEsIHkwID0geTE7CiAgfQoKICByZXR1cm4gaW5zaWRlOwp9Cgp2YXIgbGVuZ3RoJDEgPSBmdW5jdGlvbihwb2x5Z29uKSB7CiAgdmFyIGkgPSAtMSwKICAgICAgbiA9IHBvbHlnb24ubGVuZ3RoLAogICAgICBiID0gcG9seWdvbltuIC0gMV0sCiAgICAgIHhhLAogICAgICB5YSwKICAgICAgeGIgPSBiWzBdLAogICAgICB5YiA9IGJbMV0sCiAgICAgIHBlcmltZXRlciA9IDA7CgogIHdoaWxlICgrK2kgPCBuKSB7CiAgICB4YSA9IHhiOwogICAgeWEgPSB5YjsKICAgIGIgPSBwb2x5Z29uW2ldOwogICAgeGIgPSBiWzBdOwogICAgeWIgPSBiWzFdOwogICAgeGEgLT0geGI7CiAgICB5YSAtPSB5YjsKICAgIHBlcmltZXRlciArPSBNYXRoLnNxcnQoeGEgKiB4YSArIHlhICogeWEpOwogIH0KCiAgcmV0dXJuIHBlcmltZXRlcjsKfQoKdmFyIHBpJDEgPSBNYXRoLlBJOwp2YXIgdGF1JDEgPSAyICogcGkkMTsKdmFyIGVwc2lsb24gPSAxZS02Owp2YXIgdGF1RXBzaWxvbiA9IHRhdSQxIC0gZXBzaWxvbjsKCmZ1bmN0aW9uIFBhdGgoKSB7CiAgdGhpcy5feDAgPSB0aGlzLl95MCA9IC8vIHN0YXJ0IG9mIGN1cnJlbnQgc3VicGF0aAogIHRoaXMuX3gxID0gdGhpcy5feTEgPSBudWxsOyAvLyBlbmQgb2YgY3VycmVudCBzdWJwYXRoCiAgdGhpcy5fID0gW107Cn0KCmZ1bmN0aW9uIHBhdGgoKSB7CiAgcmV0dXJuIG5ldyBQYXRoOwp9CgpQYXRoLnByb3RvdHlwZSA9IHBhdGgucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBQYXRoLAogIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgewogICAgdGhpcy5fLnB1c2goIk0iLCB0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gsICIsIiwgdGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KTsKICB9LAogIGNsb3NlUGF0aDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5feDEgIT09IG51bGwpIHsKICAgICAgdGhpcy5feDEgPSB0aGlzLl94MCwgdGhpcy5feTEgPSB0aGlzLl95MDsKICAgICAgdGhpcy5fLnB1c2goIloiKTsKICAgIH0KICB9LAogIGxpbmVUbzogZnVuY3Rpb24oeCwgeSkgewogICAgdGhpcy5fLnB1c2goIkwiLCB0aGlzLl94MSA9ICt4LCAiLCIsIHRoaXMuX3kxID0gK3kpOwogIH0sCiAgcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4LCB5KSB7CiAgICB0aGlzLl8ucHVzaCgiUSIsICt4MSwgIiwiLCAreTEsICIsIiwgdGhpcy5feDEgPSAreCwgIiwiLCB0aGlzLl95MSA9ICt5KTsKICB9LAogIGJlemllckN1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7CiAgICB0aGlzLl8ucHVzaCgiQyIsICt4MSwgIiwiLCAreTEsICIsIiwgK3gyLCAiLCIsICt5MiwgIiwiLCB0aGlzLl94MSA9ICt4LCAiLCIsIHRoaXMuX3kxID0gK3kpOwogIH0sCiAgYXJjVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCByKSB7CiAgICB4MSA9ICt4MSwgeTEgPSAreTEsIHgyID0gK3gyLCB5MiA9ICt5MiwgciA9ICtyOwogICAgdmFyIHgwID0gdGhpcy5feDEsCiAgICAgICAgeTAgPSB0aGlzLl95MSwKICAgICAgICB4MjEgPSB4MiAtIHgxLAogICAgICAgIHkyMSA9IHkyIC0geTEsCiAgICAgICAgeDAxID0geDAgLSB4MSwKICAgICAgICB5MDEgPSB5MCAtIHkxLAogICAgICAgIGwwMV8yID0geDAxICogeDAxICsgeTAxICogeTAxOwoKICAgIC8vIElzIHRoZSByYWRpdXMgbmVnYXRpdmU/IEVycm9yLgogICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIiArIHIpOwoKICAgIC8vIElzIHRoaXMgcGF0aCBlbXB0eT8gTW92ZSB0byAoeDEseTEpLgogICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7CiAgICAgIHRoaXMuXy5wdXNoKAogICAgICAgICJNIiwgdGhpcy5feDEgPSB4MSwgIiwiLCB0aGlzLl95MSA9IHkxCiAgICAgICk7CiAgICB9CgogICAgLy8gT3IsIGlzICh4MSx5MSkgY29pbmNpZGVudCB3aXRoICh4MCx5MCk/IERvIG5vdGhpbmcuCiAgICBlbHNlIGlmICghKGwwMV8yID4gZXBzaWxvbikpIHt9CgogICAgLy8gT3IsIGFyZSAoeDAseTApLCAoeDEseTEpIGFuZCAoeDIseTIpIGNvbGxpbmVhcj8KICAgIC8vIEVxdWl2YWxlbnRseSwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgyLHkyKT8KICAgIC8vIE9yLCBpcyB0aGUgcmFkaXVzIHplcm8/IExpbmUgdG8gKHgxLHkxKS4KICAgIGVsc2UgaWYgKCEoTWF0aC5hYnMoeTAxICogeDIxIC0geTIxICogeDAxKSA+IGVwc2lsb24pIHx8ICFyKSB7CiAgICAgIHRoaXMuXy5wdXNoKAogICAgICAgICJMIiwgdGhpcy5feDEgPSB4MSwgIiwiLCB0aGlzLl95MSA9IHkxCiAgICAgICk7CiAgICB9CgogICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFyYyEKICAgIGVsc2UgewogICAgICB2YXIgeDIwID0geDIgLSB4MCwKICAgICAgICAgIHkyMCA9IHkyIC0geTAsCiAgICAgICAgICBsMjFfMiA9IHgyMSAqIHgyMSArIHkyMSAqIHkyMSwKICAgICAgICAgIGwyMF8yID0geDIwICogeDIwICsgeTIwICogeTIwLAogICAgICAgICAgbDIxID0gTWF0aC5zcXJ0KGwyMV8yKSwKICAgICAgICAgIGwwMSA9IE1hdGguc3FydChsMDFfMiksCiAgICAgICAgICBsID0gciAqIE1hdGgudGFuKChwaSQxIC0gTWF0aC5hY29zKChsMjFfMiArIGwwMV8yIC0gbDIwXzIpIC8gKDIgKiBsMjEgKiBsMDEpKSkgLyAyKSwKICAgICAgICAgIHQwMSA9IGwgLyBsMDEsCiAgICAgICAgICB0MjEgPSBsIC8gbDIxOwoKICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNvaW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLgogICAgICBpZiAoTWF0aC5hYnModDAxIC0gMSkgPiBlcHNpbG9uKSB7CiAgICAgICAgdGhpcy5fLnB1c2goCiAgICAgICAgICAiTCIsIHgxICsgdDAxICogeDAxLCAiLCIsIHkxICsgdDAxICogeTAxCiAgICAgICAgKTsKICAgICAgfQoKICAgICAgdGhpcy5fLnB1c2goCiAgICAgICAgIkEiLCByLCAiLCIsIHIsICIsMCwwLCIsICsoeTAxICogeDIwID4geDAxICogeTIwKSwgIiwiLCB0aGlzLl94MSA9IHgxICsgdDIxICogeDIxLCAiLCIsIHRoaXMuX3kxID0geTEgKyB0MjEgKiB5MjEKICAgICAgKTsKICAgIH0KICB9LAogIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBjY3cpIHsKICAgIHggPSAreCwgeSA9ICt5LCByID0gK3I7CiAgICB2YXIgZHggPSByICogTWF0aC5jb3MoYTApLAogICAgICAgIGR5ID0gciAqIE1hdGguc2luKGEwKSwKICAgICAgICB4MCA9IHggKyBkeCwKICAgICAgICB5MCA9IHkgKyBkeSwKICAgICAgICBjdyA9IDEgXiBjY3csCiAgICAgICAgZGEgPSBjY3cgPyBhMCAtIGExIDogYTEgLSBhMDsKCiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci4KICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIgKyByKTsKCiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgwLHkwKS4KICAgIGlmICh0aGlzLl94MSA9PT0gbnVsbCkgewogICAgICB0aGlzLl8ucHVzaCgKICAgICAgICAiTSIsIHgwLCAiLCIsIHkwCiAgICAgICk7CiAgICB9CgogICAgLy8gT3IsIGlzICh4MCx5MCkgbm90IGNvaW5jaWRlbnQgd2l0aCB0aGUgcHJldmlvdXMgcG9pbnQ/IExpbmUgdG8gKHgwLHkwKS4KICAgIGVsc2UgaWYgKE1hdGguYWJzKHRoaXMuX3gxIC0geDApID4gZXBzaWxvbiB8fCBNYXRoLmFicyh0aGlzLl95MSAtIHkwKSA+IGVwc2lsb24pIHsKICAgICAgdGhpcy5fLnB1c2goCiAgICAgICAgIkwiLCB4MCwgIiwiLCB5MAogICAgICApOwogICAgfQoKICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZcOiwoDCmXJlIGRvbmUuCiAgICBpZiAoIXIpIHJldHVybjsKCiAgICAvLyBJcyB0aGlzIGEgY29tcGxldGUgY2lyY2xlPyBEcmF3IHR3byBhcmNzIHRvIGNvbXBsZXRlIHRoZSBjaXJjbGUuCiAgICBpZiAoZGEgPiB0YXVFcHNpbG9uKSB7CiAgICAgIHRoaXMuXy5wdXNoKAogICAgICAgICJBIiwgciwgIiwiLCByLCAiLDAsMSwiLCBjdywgIiwiLCB4IC0gZHgsICIsIiwgeSAtIGR5LAogICAgICAgICJBIiwgciwgIiwiLCByLCAiLDAsMSwiLCBjdywgIiwiLCB0aGlzLl94MSA9IHgwLCAiLCIsIHRoaXMuX3kxID0geTAKICAgICAgKTsKICAgIH0KCiAgICAvLyBPdGhlcndpc2UsIGRyYXcgYW4gYXJjIQogICAgZWxzZSB7CiAgICAgIGlmIChkYSA8IDApIGRhID0gZGEgJSB0YXUkMSArIHRhdSQxOwogICAgICB0aGlzLl8ucHVzaCgKICAgICAgICAiQSIsIHIsICIsIiwgciwgIiwwLCIsICsoZGEgPj0gcGkkMSksICIsIiwgY3csICIsIiwgdGhpcy5feDEgPSB4ICsgciAqIE1hdGguY29zKGExKSwgIiwiLCB0aGlzLl95MSA9IHkgKyByICogTWF0aC5zaW4oYTEpCiAgICAgICk7CiAgICB9CiAgfSwKICByZWN0OiBmdW5jdGlvbih4LCB5LCB3LCBoKSB7CiAgICB0aGlzLl8ucHVzaCgiTSIsIHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCwgIiwiLCB0aGlzLl95MCA9IHRoaXMuX3kxID0gK3ksICJoIiwgK3csICJ2IiwgK2gsICJoIiwgLXcsICJaIik7CiAgfSwKICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5fLmpvaW4oIiIpOwogIH0KfTsKCnZhciB0cmVlX2FkZCA9IGZ1bmN0aW9uKGQpIHsKICB2YXIgeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCksCiAgICAgIHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpOwogIHJldHVybiBhZGQodGhpcy5jb3Zlcih4LCB5KSwgeCwgeSwgZCk7Cn0KCmZ1bmN0aW9uIGFkZCh0cmVlLCB4LCB5LCBkKSB7CiAgaWYgKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSByZXR1cm4gdHJlZTsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzCgogIHZhciBwYXJlbnQsCiAgICAgIG5vZGUgPSB0cmVlLl9yb290LAogICAgICBsZWFmID0ge2RhdGE6IGR9LAogICAgICB4MCA9IHRyZWUuX3gwLAogICAgICB5MCA9IHRyZWUuX3kwLAogICAgICB4MSA9IHRyZWUuX3gxLAogICAgICB5MSA9IHRyZWUuX3kxLAogICAgICB4bSwKICAgICAgeW0sCiAgICAgIHhwLAogICAgICB5cCwKICAgICAgcmlnaHQsCiAgICAgIGJvdHRvbSwKICAgICAgaSwKICAgICAgajsKCiAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFmLgogIGlmICghbm9kZSkgcmV0dXJuIHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlOwoKICAvLyBGaW5kIHRoZSBleGlzdGluZyBsZWFmIGZvciB0aGUgbmV3IHBvaW50LCBvciBhZGQgaXQuCiAgd2hpbGUgKG5vZGUubGVuZ3RoKSB7CiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07CiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltOwogICAgaWYgKHBhcmVudCA9IG5vZGUsICEobm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHBhcmVudFtpXSA9IGxlYWYsIHRyZWU7CiAgfQoKICAvLyBJcyB0aGUgbmV3IHBvaW50IGlzIGV4YWN0bHkgY29pbmNpZGVudCB3aXRoIHRoZSBleGlzdGluZyBwb2ludD8KICB4cCA9ICt0cmVlLl94LmNhbGwobnVsbCwgbm9kZS5kYXRhKTsKICB5cCA9ICt0cmVlLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKTsKICBpZiAoeCA9PT0geHAgJiYgeSA9PT0geXApIHJldHVybiBsZWFmLm5leHQgPSBub2RlLCBwYXJlbnQgPyBwYXJlbnRbaV0gPSBsZWFmIDogdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7CgogIC8vIE90aGVyd2lzZSwgc3BsaXQgdGhlIGxlYWYgbm9kZSB1bnRpbCB0aGUgb2xkIGFuZCBuZXcgcG9pbnQgYXJlIHNlcGFyYXRlZC4KICBkbyB7CiAgICBwYXJlbnQgPSBwYXJlbnQgPyBwYXJlbnRbaV0gPSBuZXcgQXJyYXkoNCkgOiB0cmVlLl9yb290ID0gbmV3IEFycmF5KDQpOwogICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTsKICB9IHdoaWxlICgoaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHQpID09PSAoaiA9ICh5cCA+PSB5bSkgPDwgMSB8ICh4cCA+PSB4bSkpKTsKICByZXR1cm4gcGFyZW50W2pdID0gbm9kZSwgcGFyZW50W2ldID0gbGVhZiwgdHJlZTsKfQoKZnVuY3Rpb24gYWRkQWxsKGRhdGEpIHsKICB2YXIgZCwgaSwgbiA9IGRhdGEubGVuZ3RoLAogICAgICB4LAogICAgICB5LAogICAgICB4eiA9IG5ldyBBcnJheShuKSwKICAgICAgeXogPSBuZXcgQXJyYXkobiksCiAgICAgIHgwID0gSW5maW5pdHksCiAgICAgIHkwID0gSW5maW5pdHksCiAgICAgIHgxID0gLUluZmluaXR5LAogICAgICB5MSA9IC1JbmZpbml0eTsKCiAgLy8gQ29tcHV0ZSB0aGUgcG9pbnRzIGFuZCB0aGVpciBleHRlbnQuCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgaWYgKGlzTmFOKHggPSArdGhpcy5feC5jYWxsKG51bGwsIGQgPSBkYXRhW2ldKSkgfHwgaXNOYU4oeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCkpKSBjb250aW51ZTsKICAgIHh6W2ldID0geDsKICAgIHl6W2ldID0geTsKICAgIGlmICh4IDwgeDApIHgwID0geDsKICAgIGlmICh4ID4geDEpIHgxID0geDsKICAgIGlmICh5IDwgeTApIHkwID0geTsKICAgIGlmICh5ID4geTEpIHkxID0geTsKICB9CgogIC8vIElmIHRoZXJlIHdlcmUgbm8gKHZhbGlkKSBwb2ludHMsIGluaGVyaXQgdGhlIGV4aXN0aW5nIGV4dGVudC4KICBpZiAoeDEgPCB4MCkgeDAgPSB0aGlzLl94MCwgeDEgPSB0aGlzLl94MTsKICBpZiAoeTEgPCB5MCkgeTAgPSB0aGlzLl95MCwgeTEgPSB0aGlzLl95MTsKCiAgLy8gRXhwYW5kIHRoZSB0cmVlIHRvIGNvdmVyIHRoZSBuZXcgcG9pbnRzLgogIHRoaXMuY292ZXIoeDAsIHkwKS5jb3Zlcih4MSwgeTEpOwoKICAvLyBBZGQgdGhlIG5ldyBwb2ludHMuCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgYWRkKHRoaXMsIHh6W2ldLCB5eltpXSwgZGF0YVtpXSk7CiAgfQoKICByZXR1cm4gdGhpczsKfQoKdmFyIHRyZWVfY292ZXIgPSBmdW5jdGlvbih4LCB5KSB7CiAgaWYgKGlzTmFOKHggPSAreCkgfHwgaXNOYU4oeSA9ICt5KSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50cwoKICB2YXIgeDAgPSB0aGlzLl94MCwKICAgICAgeTAgPSB0aGlzLl95MCwKICAgICAgeDEgPSB0aGlzLl94MSwKICAgICAgeTEgPSB0aGlzLl95MTsKCiAgLy8gSWYgdGhlIHF1YWR0cmVlIGhhcyBubyBleHRlbnQsIGluaXRpYWxpemUgdGhlbS4KICAvLyBJbnRlZ2VyIGV4dGVudCBhcmUgbmVjZXNzYXJ5IHNvIHRoYXQgaWYgd2UgbGF0ZXIgZG91YmxlIHRoZSBleHRlbnQsCiAgLy8gdGhlIGV4aXN0aW5nIHF1YWRyYW50IGJvdW5kYXJpZXMgZG9uw6LCgMKZdCBjaGFuZ2UgZHVlIHRvIGZsb2F0aW5nIHBvaW50IGVycm9yIQogIGlmIChpc05hTih4MCkpIHsKICAgIHgxID0gKHgwID0gTWF0aC5mbG9vcih4KSkgKyAxOwogICAgeTEgPSAoeTAgPSBNYXRoLmZsb29yKHkpKSArIDE7CiAgfQoKICAvLyBPdGhlcndpc2UsIGRvdWJsZSByZXBlYXRlZGx5IHRvIGNvdmVyLgogIGVsc2UgaWYgKHgwID4geCB8fCB4ID4geDEgfHwgeTAgPiB5IHx8IHkgPiB5MSkgewogICAgdmFyIHogPSB4MSAtIHgwLAogICAgICAgIG5vZGUgPSB0aGlzLl9yb290LAogICAgICAgIHBhcmVudCwKICAgICAgICBpOwoKICAgIHN3aXRjaCAoaSA9ICh5IDwgKHkwICsgeTEpIC8gMikgPDwgMSB8ICh4IDwgKHgwICsgeDEpIC8gMikpIHsKICAgICAgY2FzZSAwOiB7CiAgICAgICAgZG8gcGFyZW50ID0gbmV3IEFycmF5KDQpLCBwYXJlbnRbaV0gPSBub2RlLCBub2RlID0gcGFyZW50OwogICAgICAgIHdoaWxlICh6ICo9IDIsIHgxID0geDAgKyB6LCB5MSA9IHkwICsgeiwgeCA+IHgxIHx8IHkgPiB5MSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAxOiB7CiAgICAgICAgZG8gcGFyZW50ID0gbmV3IEFycmF5KDQpLCBwYXJlbnRbaV0gPSBub2RlLCBub2RlID0gcGFyZW50OwogICAgICAgIHdoaWxlICh6ICo9IDIsIHgwID0geDEgLSB6LCB5MSA9IHkwICsgeiwgeDAgPiB4IHx8IHkgPiB5MSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAyOiB7CiAgICAgICAgZG8gcGFyZW50ID0gbmV3IEFycmF5KDQpLCBwYXJlbnRbaV0gPSBub2RlLCBub2RlID0gcGFyZW50OwogICAgICAgIHdoaWxlICh6ICo9IDIsIHgxID0geDAgKyB6LCB5MCA9IHkxIC0geiwgeCA+IHgxIHx8IHkwID4geSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAzOiB7CiAgICAgICAgZG8gcGFyZW50ID0gbmV3IEFycmF5KDQpLCBwYXJlbnRbaV0gPSBub2RlLCBub2RlID0gcGFyZW50OwogICAgICAgIHdoaWxlICh6ICo9IDIsIHgwID0geDEgLSB6LCB5MCA9IHkxIC0geiwgeDAgPiB4IHx8IHkwID4geSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7CiAgfQoKICAvLyBJZiB0aGUgcXVhZHRyZWUgY292ZXJzIHRoZSBwb2ludCBhbHJlYWR5LCBqdXN0IHJldHVybi4KICBlbHNlIHJldHVybiB0aGlzOwoKICB0aGlzLl94MCA9IHgwOwogIHRoaXMuX3kwID0geTA7CiAgdGhpcy5feDEgPSB4MTsKICB0aGlzLl95MSA9IHkxOwogIHJldHVybiB0aGlzOwp9Cgp2YXIgdHJlZV9kYXRhID0gZnVuY3Rpb24oKSB7CiAgdmFyIGRhdGEgPSBbXTsKICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHsKICAgIGlmICghbm9kZS5sZW5ndGgpIGRvIGRhdGEucHVzaChub2RlLmRhdGEpOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4dCkKICB9KTsKICByZXR1cm4gZGF0YTsKfQoKdmFyIHRyZWVfZXh0ZW50ID0gZnVuY3Rpb24oXykgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgID8gdGhpcy5jb3ZlcigrX1swXVswXSwgK19bMF1bMV0pLmNvdmVyKCtfWzFdWzBdLCArX1sxXVsxXSkKICAgICAgOiBpc05hTih0aGlzLl94MCkgPyB1bmRlZmluZWQgOiBbW3RoaXMuX3gwLCB0aGlzLl95MF0sIFt0aGlzLl94MSwgdGhpcy5feTFdXTsKfQoKdmFyIFF1YWQgPSBmdW5jdGlvbihub2RlLCB4MCwgeTAsIHgxLCB5MSkgewogIHRoaXMubm9kZSA9IG5vZGU7CiAgdGhpcy54MCA9IHgwOwogIHRoaXMueTAgPSB5MDsKICB0aGlzLngxID0geDE7CiAgdGhpcy55MSA9IHkxOwp9Cgp2YXIgdHJlZV9maW5kID0gZnVuY3Rpb24oeCwgeSwgcmFkaXVzKSB7CiAgdmFyIGRhdGEsCiAgICAgIHgwID0gdGhpcy5feDAsCiAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgIHgxLAogICAgICB5MSwKICAgICAgeDIsCiAgICAgIHkyLAogICAgICB4MyA9IHRoaXMuX3gxLAogICAgICB5MyA9IHRoaXMuX3kxLAogICAgICBxdWFkcyA9IFtdLAogICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgcSwKICAgICAgaTsKCiAgaWYgKG5vZGUpIHF1YWRzLnB1c2gobmV3IFF1YWQobm9kZSwgeDAsIHkwLCB4MywgeTMpKTsKICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5OwogIGVsc2UgewogICAgeDAgPSB4IC0gcmFkaXVzLCB5MCA9IHkgLSByYWRpdXM7CiAgICB4MyA9IHggKyByYWRpdXMsIHkzID0geSArIHJhZGl1czsKICAgIHJhZGl1cyAqPSByYWRpdXM7CiAgfQoKICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7CgogICAgLy8gU3RvcCBzZWFyY2hpbmcgaWYgdGhpcyBxdWFkcmFudCBjYW7DosKAwpl0IGNvbnRhaW4gYSBjbG9zZXIgbm9kZS4KICAgIGlmICghKG5vZGUgPSBxLm5vZGUpCiAgICAgICAgfHwgKHgxID0gcS54MCkgPiB4MwogICAgICAgIHx8ICh5MSA9IHEueTApID4geTMKICAgICAgICB8fCAoeDIgPSBxLngxKSA8IHgwCiAgICAgICAgfHwgKHkyID0gcS55MSkgPCB5MCkgY29udGludWU7CgogICAgLy8gQmlzZWN0IHRoZSBjdXJyZW50IHF1YWRyYW50LgogICAgaWYgKG5vZGUubGVuZ3RoKSB7CiAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAvIDIsCiAgICAgICAgICB5bSA9ICh5MSArIHkyKSAvIDI7CgogICAgICBxdWFkcy5wdXNoKAogICAgICAgIG5ldyBRdWFkKG5vZGVbM10sIHhtLCB5bSwgeDIsIHkyKSwKICAgICAgICBuZXcgUXVhZChub2RlWzJdLCB4MSwgeW0sIHhtLCB5MiksCiAgICAgICAgbmV3IFF1YWQobm9kZVsxXSwgeG0sIHkxLCB4MiwgeW0pLAogICAgICAgIG5ldyBRdWFkKG5vZGVbMF0sIHgxLCB5MSwgeG0sIHltKQogICAgICApOwoKICAgICAgLy8gVmlzaXQgdGhlIGNsb3Nlc3QgcXVhZHJhbnQgZmlyc3QuCiAgICAgIGlmIChpID0gKHkgPj0geW0pIDw8IDEgfCAoeCA+PSB4bSkpIHsKICAgICAgICBxID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV07CiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV0gPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV07CiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldID0gcTsKICAgICAgfQogICAgfQoKICAgIC8vIFZpc2l0IHRoaXMgcG9pbnQuIChWaXNpdGluZyBjb2luY2lkZW50IHBvaW50cyBpc27DosKAwpl0IG5lY2Vzc2FyeSEpCiAgICBlbHNlIHsKICAgICAgdmFyIGR4ID0geCAtICt0aGlzLl94LmNhbGwobnVsbCwgbm9kZS5kYXRhKSwKICAgICAgICAgIGR5ID0geSAtICt0aGlzLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKSwKICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7CiAgICAgIGlmIChkMiA8IHJhZGl1cykgewogICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KHJhZGl1cyA9IGQyKTsKICAgICAgICB4MCA9IHggLSBkLCB5MCA9IHkgLSBkOwogICAgICAgIHgzID0geCArIGQsIHkzID0geSArIGQ7CiAgICAgICAgZGF0YSA9IG5vZGUuZGF0YTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGRhdGE7Cn0KCnZhciB0cmVlX3JlbW92ZSA9IGZ1bmN0aW9uKGQpIHsKICBpZiAoaXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50cwoKICB2YXIgcGFyZW50LAogICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgcmV0YWluZXIsCiAgICAgIHByZXZpb3VzLAogICAgICBuZXh0LAogICAgICB4MCA9IHRoaXMuX3gwLAogICAgICB5MCA9IHRoaXMuX3kwLAogICAgICB4MSA9IHRoaXMuX3gxLAogICAgICB5MSA9IHRoaXMuX3kxLAogICAgICB4LAogICAgICB5LAogICAgICB4bSwKICAgICAgeW0sCiAgICAgIHJpZ2h0LAogICAgICBib3R0b20sCiAgICAgIGksCiAgICAgIGo7CgogIC8vIElmIHRoZSB0cmVlIGlzIGVtcHR5LCBpbml0aWFsaXplIHRoZSByb290IGFzIGEgbGVhZi4KICBpZiAoIW5vZGUpIHJldHVybiB0aGlzOwoKICAvLyBGaW5kIHRoZSBsZWFmIG5vZGUgZm9yIHRoZSBwb2ludC4KICAvLyBXaGlsZSBkZXNjZW5kaW5nLCBhbHNvIHJldGFpbiB0aGUgZGVlcGVzdCBwYXJlbnQgd2l0aCBhIG5vbi1yZW1vdmVkIHNpYmxpbmcuCiAgaWYgKG5vZGUubGVuZ3RoKSB3aGlsZSAodHJ1ZSkgewogICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTsKICAgIGlmICghKHBhcmVudCA9IG5vZGUsIG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkpIHJldHVybiB0aGlzOwogICAgaWYgKCFub2RlLmxlbmd0aCkgYnJlYWs7CiAgICBpZiAocGFyZW50WyhpICsgMSkgJiAzXSB8fCBwYXJlbnRbKGkgKyAyKSAmIDNdIHx8IHBhcmVudFsoaSArIDMpICYgM10pIHJldGFpbmVyID0gcGFyZW50LCBqID0gaTsKICB9CgogIC8vIEZpbmQgdGhlIHBvaW50IHRvIHJlbW92ZS4KICB3aGlsZSAobm9kZS5kYXRhICE9PSBkKSBpZiAoIShwcmV2aW91cyA9IG5vZGUsIG5vZGUgPSBub2RlLm5leHQpKSByZXR1cm4gdGhpczsKICBpZiAobmV4dCA9IG5vZGUubmV4dCkgZGVsZXRlIG5vZGUubmV4dDsKCiAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvaW5jaWRlbnQgcG9pbnRzLCByZW1vdmUganVzdCB0aGUgcG9pbnQuCiAgaWYgKHByZXZpb3VzKSByZXR1cm4gKG5leHQgPyBwcmV2aW91cy5uZXh0ID0gbmV4dCA6IGRlbGV0ZSBwcmV2aW91cy5uZXh0KSwgdGhpczsKCiAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBwb2ludCwgcmVtb3ZlIGl0LgogIGlmICghcGFyZW50KSByZXR1cm4gdGhpcy5fcm9vdCA9IG5leHQsIHRoaXM7CgogIC8vIFJlbW92ZSB0aGlzIGxlYWYuCiAgbmV4dCA/IHBhcmVudFtpXSA9IG5leHQgOiBkZWxldGUgcGFyZW50W2ldOwoKICAvLyBJZiB0aGUgcGFyZW50IG5vdyBjb250YWlucyBleGFjdGx5IG9uZSBsZWFmLCBjb2xsYXBzZSBzdXBlcmZsdW91cyBwYXJlbnRzLgogIGlmICgobm9kZSA9IHBhcmVudFswXSB8fCBwYXJlbnRbMV0gfHwgcGFyZW50WzJdIHx8IHBhcmVudFszXSkKICAgICAgJiYgbm9kZSA9PT0gKHBhcmVudFszXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFswXSkKICAgICAgJiYgIW5vZGUubGVuZ3RoKSB7CiAgICBpZiAocmV0YWluZXIpIHJldGFpbmVyW2pdID0gbm9kZTsKICAgIGVsc2UgdGhpcy5fcm9vdCA9IG5vZGU7CiAgfQoKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24gcmVtb3ZlQWxsKGRhdGEpIHsKICBmb3IgKHZhciBpID0gMCwgbiA9IGRhdGEubGVuZ3RoOyBpIDwgbjsgKytpKSB0aGlzLnJlbW92ZShkYXRhW2ldKTsKICByZXR1cm4gdGhpczsKfQoKdmFyIHRyZWVfcm9vdCA9IGZ1bmN0aW9uKCkgewogIHJldHVybiB0aGlzLl9yb290Owp9Cgp2YXIgdHJlZV9zaXplID0gZnVuY3Rpb24oKSB7CiAgdmFyIHNpemUgPSAwOwogIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkgewogICAgaWYgKCFub2RlLmxlbmd0aCkgZG8gKytzaXplOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4dCkKICB9KTsKICByZXR1cm4gc2l6ZTsKfQoKdmFyIHRyZWVfdmlzaXQgPSBmdW5jdGlvbihjYWxsYmFjaykgewogIHZhciBxdWFkcyA9IFtdLCBxLCBub2RlID0gdGhpcy5fcm9vdCwgY2hpbGQsIHgwLCB5MCwgeDEsIHkxOwogIGlmIChub2RlKSBxdWFkcy5wdXNoKG5ldyBRdWFkKG5vZGUsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSk7CiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkgewogICAgaWYgKCFjYWxsYmFjayhub2RlID0gcS5ub2RlLCB4MCA9IHEueDAsIHkwID0gcS55MCwgeDEgPSBxLngxLCB5MSA9IHEueTEpICYmIG5vZGUubGVuZ3RoKSB7CiAgICAgIHZhciB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsgeTEpIC8gMjsKICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHltLCB4MSwgeTEpKTsKICAgICAgaWYgKGNoaWxkID0gbm9kZVsyXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHltLCB4bSwgeTEpKTsKICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTsKICAgICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHkwLCB4bSwgeW0pKTsKICAgIH0KICB9CiAgcmV0dXJuIHRoaXM7Cn0KCnZhciB0cmVlX3Zpc2l0QWZ0ZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogIHZhciBxdWFkcyA9IFtdLCBuZXh0ID0gW10sIHE7CiAgaWYgKHRoaXMuX3Jvb3QpIHF1YWRzLnB1c2gobmV3IFF1YWQodGhpcy5fcm9vdCwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTsKICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7CiAgICB2YXIgbm9kZSA9IHEubm9kZTsKICAgIGlmIChub2RlLmxlbmd0aCkgewogICAgICB2YXIgY2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMF0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5MCwgeG0sIHltKSk7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5MCwgeDEsIHltKSk7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5bSwgeDEsIHkxKSk7CiAgICB9CiAgICBuZXh0LnB1c2gocSk7CiAgfQogIHdoaWxlIChxID0gbmV4dC5wb3AoKSkgewogICAgY2FsbGJhY2socS5ub2RlLCBxLngwLCBxLnkwLCBxLngxLCBxLnkxKTsKICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRYKGQpIHsKICByZXR1cm4gZFswXTsKfQoKdmFyIHRyZWVfeCA9IGZ1bmN0aW9uKF8pIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl94ID0gXywgdGhpcykgOiB0aGlzLl94Owp9CgpmdW5jdGlvbiBkZWZhdWx0WShkKSB7CiAgcmV0dXJuIGRbMV07Cn0KCnZhciB0cmVlX3kgPSBmdW5jdGlvbihfKSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5feSA9IF8sIHRoaXMpIDogdGhpcy5feTsKfQoKZnVuY3Rpb24gcXVhZHRyZWUobm9kZXMsIHgsIHkpIHsKICB2YXIgdHJlZSA9IG5ldyBRdWFkdHJlZSh4ID09IG51bGwgPyBkZWZhdWx0WCA6IHgsIHkgPT0gbnVsbCA/IGRlZmF1bHRZIDogeSwgTmFOLCBOYU4sIE5hTiwgTmFOKTsKICByZXR1cm4gbm9kZXMgPT0gbnVsbCA/IHRyZWUgOiB0cmVlLmFkZEFsbChub2Rlcyk7Cn0KCmZ1bmN0aW9uIFF1YWR0cmVlKHgsIHksIHgwLCB5MCwgeDEsIHkxKSB7CiAgdGhpcy5feCA9IHg7CiAgdGhpcy5feSA9IHk7CiAgdGhpcy5feDAgPSB4MDsKICB0aGlzLl95MCA9IHkwOwogIHRoaXMuX3gxID0geDE7CiAgdGhpcy5feTEgPSB5MTsKICB0aGlzLl9yb290ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBsZWFmX2NvcHkobGVhZikgewogIHZhciBjb3B5ID0ge2RhdGE6IGxlYWYuZGF0YX0sIG5leHQgPSBjb3B5OwogIHdoaWxlIChsZWFmID0gbGVhZi5uZXh0KSBuZXh0ID0gbmV4dC5uZXh0ID0ge2RhdGE6IGxlYWYuZGF0YX07CiAgcmV0dXJuIGNvcHk7Cn0KCnZhciB0cmVlUHJvdG8gPSBxdWFkdHJlZS5wcm90b3R5cGUgPSBRdWFkdHJlZS5wcm90b3R5cGU7Cgp0cmVlUHJvdG8uY29weSA9IGZ1bmN0aW9uKCkgewogIHZhciBjb3B5ID0gbmV3IFF1YWR0cmVlKHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSwKICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsCiAgICAgIG5vZGVzLAogICAgICBjaGlsZDsKCiAgaWYgKCFub2RlKSByZXR1cm4gY29weTsKCiAgaWYgKCFub2RlLmxlbmd0aCkgcmV0dXJuIGNvcHkuX3Jvb3QgPSBsZWFmX2NvcHkobm9kZSksIGNvcHk7CgogIG5vZGVzID0gW3tzb3VyY2U6IG5vZGUsIHRhcmdldDogY29weS5fcm9vdCA9IG5ldyBBcnJheSg0KX1dOwogIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgIGlmIChjaGlsZCA9IG5vZGUuc291cmNlW2ldKSB7CiAgICAgICAgaWYgKGNoaWxkLmxlbmd0aCkgbm9kZXMucHVzaCh7c291cmNlOiBjaGlsZCwgdGFyZ2V0OiBub2RlLnRhcmdldFtpXSA9IG5ldyBBcnJheSg0KX0pOwogICAgICAgIGVsc2Ugbm9kZS50YXJnZXRbaV0gPSBsZWFmX2NvcHkoY2hpbGQpOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gY29weTsKfTsKCnRyZWVQcm90by5hZGQgPSB0cmVlX2FkZDsKdHJlZVByb3RvLmFkZEFsbCA9IGFkZEFsbDsKdHJlZVByb3RvLmNvdmVyID0gdHJlZV9jb3ZlcjsKdHJlZVByb3RvLmRhdGEgPSB0cmVlX2RhdGE7CnRyZWVQcm90by5leHRlbnQgPSB0cmVlX2V4dGVudDsKdHJlZVByb3RvLmZpbmQgPSB0cmVlX2ZpbmQ7CnRyZWVQcm90by5yZW1vdmUgPSB0cmVlX3JlbW92ZTsKdHJlZVByb3RvLnJlbW92ZUFsbCA9IHJlbW92ZUFsbDsKdHJlZVByb3RvLnJvb3QgPSB0cmVlX3Jvb3Q7CnRyZWVQcm90by5zaXplID0gdHJlZV9zaXplOwp0cmVlUHJvdG8udmlzaXQgPSB0cmVlX3Zpc2l0Owp0cmVlUHJvdG8udmlzaXRBZnRlciA9IHRyZWVfdmlzaXRBZnRlcjsKdHJlZVByb3RvLnggPSB0cmVlX3g7CnRyZWVQcm90by55ID0gdHJlZV95OwoKdmFyIHNsaWNlJDEgPSBbXS5zbGljZTsKCnZhciBub2Fib3J0ID0ge307CgpmdW5jdGlvbiBRdWV1ZShzaXplKSB7CiAgaWYgKCEoc2l6ZSA+PSAxKSkgdGhyb3cgbmV3IEVycm9yOwogIHRoaXMuX3NpemUgPSBzaXplOwogIHRoaXMuX2NhbGwgPQogIHRoaXMuX2Vycm9yID0gbnVsbDsKICB0aGlzLl90YXNrcyA9IFtdOwogIHRoaXMuX2RhdGEgPSBbXTsKICB0aGlzLl93YWl0aW5nID0KICB0aGlzLl9hY3RpdmUgPQogIHRoaXMuX2VuZGVkID0KICB0aGlzLl9zdGFydCA9IDA7IC8vIGluc2lkZSBhIHN5bmNocm9ub3VzIHRhc2sgY2FsbGJhY2s/Cn0KClF1ZXVlLnByb3RvdHlwZSA9IHF1ZXVlLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogUXVldWUsCiAgZGVmZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iIHx8IHRoaXMuX2NhbGwpIHRocm93IG5ldyBFcnJvcjsKICAgIGlmICh0aGlzLl9lcnJvciAhPSBudWxsKSByZXR1cm4gdGhpczsKICAgIHZhciB0ID0gc2xpY2UkMS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICB0LnB1c2goY2FsbGJhY2spOwogICAgKyt0aGlzLl93YWl0aW5nLCB0aGlzLl90YXNrcy5wdXNoKHQpOwogICAgcG9rZSh0aGlzKTsKICAgIHJldHVybiB0aGlzOwogIH0sCiAgYWJvcnQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuX2Vycm9yID09IG51bGwpIGFib3J0KHRoaXMsIG5ldyBFcnJvcigiYWJvcnQiKSk7CiAgICByZXR1cm4gdGhpczsKICB9LAogIGF3YWl0OiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIiB8fCB0aGlzLl9jYWxsKSB0aHJvdyBuZXcgRXJyb3I7CiAgICB0aGlzLl9jYWxsID0gZnVuY3Rpb24oZXJyb3IsIHJlc3VsdHMpIHsgY2FsbGJhY2suYXBwbHkobnVsbCwgW2Vycm9yXS5jb25jYXQocmVzdWx0cykpOyB9OwogICAgbWF5YmVOb3RpZnkodGhpcyk7CiAgICByZXR1cm4gdGhpczsKICB9LAogIGF3YWl0QWxsOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIiB8fCB0aGlzLl9jYWxsKSB0aHJvdyBuZXcgRXJyb3I7CiAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7CiAgICBtYXliZU5vdGlmeSh0aGlzKTsKICAgIHJldHVybiB0aGlzOwogIH0KfTsKCmZ1bmN0aW9uIHBva2UocSkgewogIGlmICghcS5fc3RhcnQpIHsKICAgIHRyeSB7IHN0YXJ0KHEpOyB9IC8vIGxldCB0aGUgY3VycmVudCB0YXNrIGNvbXBsZXRlCiAgICBjYXRjaCAoZSkgewogICAgICBpZiAocS5fdGFza3NbcS5fZW5kZWQgKyBxLl9hY3RpdmUgLSAxXSkgYWJvcnQocSwgZSk7IC8vIHRhc2sgZXJyb3JlZCBzeW5jaHJvbm91c2x5CiAgICAgIGVsc2UgaWYgKCFxLl9kYXRhKSB0aHJvdyBlOyAvLyBhd2FpdCBjYWxsYmFjayBlcnJvcmVkIHN5bmNocm9ub3VzbHkKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHN0YXJ0KHEpIHsKICB3aGlsZSAocS5fc3RhcnQgPSBxLl93YWl0aW5nICYmIHEuX2FjdGl2ZSA8IHEuX3NpemUpIHsKICAgIHZhciBpID0gcS5fZW5kZWQgKyBxLl9hY3RpdmUsCiAgICAgICAgdCA9IHEuX3Rhc2tzW2ldLAogICAgICAgIGogPSB0Lmxlbmd0aCAtIDEsCiAgICAgICAgYyA9IHRbal07CiAgICB0W2pdID0gZW5kKHEsIGkpOwogICAgLS1xLl93YWl0aW5nLCArK3EuX2FjdGl2ZTsKICAgIHQgPSBjLmFwcGx5KG51bGwsIHQpOwogICAgaWYgKCFxLl90YXNrc1tpXSkgY29udGludWU7IC8vIHRhc2sgZmluaXNoZWQgc3luY2hyb25vdXNseQogICAgcS5fdGFza3NbaV0gPSB0IHx8IG5vYWJvcnQ7CiAgfQp9CgpmdW5jdGlvbiBlbmQocSwgaSkgewogIHJldHVybiBmdW5jdGlvbihlLCByKSB7CiAgICBpZiAoIXEuX3Rhc2tzW2ldKSByZXR1cm47IC8vIGlnbm9yZSBtdWx0aXBsZSBjYWxsYmFja3MKICAgIC0tcS5fYWN0aXZlLCArK3EuX2VuZGVkOwogICAgcS5fdGFza3NbaV0gPSBudWxsOwogICAgaWYgKHEuX2Vycm9yICE9IG51bGwpIHJldHVybjsgLy8gaWdub3JlIHNlY29uZGFyeSBlcnJvcnMKICAgIGlmIChlICE9IG51bGwpIHsKICAgICAgYWJvcnQocSwgZSk7CiAgICB9IGVsc2UgewogICAgICBxLl9kYXRhW2ldID0gcjsKICAgICAgaWYgKHEuX3dhaXRpbmcpIHBva2UocSk7CiAgICAgIGVsc2UgbWF5YmVOb3RpZnkocSk7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gYWJvcnQocSwgZSkgewogIHZhciBpID0gcS5fdGFza3MubGVuZ3RoLCB0OwogIHEuX2Vycm9yID0gZTsgLy8gaWdub3JlIGFjdGl2ZSBjYWxsYmFja3MKICBxLl9kYXRhID0gdW5kZWZpbmVkOyAvLyBhbGxvdyBnYwogIHEuX3dhaXRpbmcgPSBOYU47IC8vIHByZXZlbnQgc3RhcnRpbmcKCiAgd2hpbGUgKC0taSA+PSAwKSB7CiAgICBpZiAodCA9IHEuX3Rhc2tzW2ldKSB7CiAgICAgIHEuX3Rhc2tzW2ldID0gbnVsbDsKICAgICAgaWYgKHQuYWJvcnQpIHsKICAgICAgICB0cnkgeyB0LmFib3J0KCk7IH0KICAgICAgICBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfQogICAgICB9CiAgICB9CiAgfQoKICBxLl9hY3RpdmUgPSBOYU47IC8vIGFsbG93IG5vdGlmaWNhdGlvbgogIG1heWJlTm90aWZ5KHEpOwp9CgpmdW5jdGlvbiBtYXliZU5vdGlmeShxKSB7CiAgaWYgKCFxLl9hY3RpdmUgJiYgcS5fY2FsbCkgewogICAgdmFyIGQgPSBxLl9kYXRhOwogICAgcS5fZGF0YSA9IHVuZGVmaW5lZDsgLy8gYWxsb3cgZ2MKICAgIHEuX2NhbGwocS5fZXJyb3IsIGQpOwogIH0KfQoKZnVuY3Rpb24gcXVldWUoY29uY3VycmVuY3kpIHsKICByZXR1cm4gbmV3IFF1ZXVlKGFyZ3VtZW50cy5sZW5ndGggPyArY29uY3VycmVuY3kgOiBJbmZpbml0eSk7Cn0KCnZhciBjb25zdGFudCQyID0gZnVuY3Rpb24oeCkgewogIHJldHVybiBmdW5jdGlvbiBjb25zdGFudCgpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCnZhciBlcHNpbG9uJDEgPSAxZS0xMjsKdmFyIHBpJDIgPSBNYXRoLlBJOwp2YXIgaGFsZlBpJDEgPSBwaSQyIC8gMjsKdmFyIHRhdSQyID0gMiAqIHBpJDI7CgpmdW5jdGlvbiBhcmNJbm5lclJhZGl1cyhkKSB7CiAgcmV0dXJuIGQuaW5uZXJSYWRpdXM7Cn0KCmZ1bmN0aW9uIGFyY091dGVyUmFkaXVzKGQpIHsKICByZXR1cm4gZC5vdXRlclJhZGl1czsKfQoKZnVuY3Rpb24gYXJjU3RhcnRBbmdsZShkKSB7CiAgcmV0dXJuIGQuc3RhcnRBbmdsZTsKfQoKZnVuY3Rpb24gYXJjRW5kQW5nbGUoZCkgewogIHJldHVybiBkLmVuZEFuZ2xlOwp9CgpmdW5jdGlvbiBhcmNQYWRBbmdsZShkKSB7CiAgcmV0dXJuIGQgJiYgZC5wYWRBbmdsZTsgLy8gTm90ZTogb3B0aW9uYWwhCn0KCmZ1bmN0aW9uIGFzaW4oeCkgewogIHJldHVybiB4ID49IDEgPyBoYWxmUGkkMSA6IHggPD0gLTEgPyAtaGFsZlBpJDEgOiBNYXRoLmFzaW4oeCk7Cn0KCmZ1bmN0aW9uIGludGVyc2VjdCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHsKICB2YXIgeDEwID0geDEgLSB4MCwgeTEwID0geTEgLSB5MCwKICAgICAgeDMyID0geDMgLSB4MiwgeTMyID0geTMgLSB5MiwKICAgICAgdCA9ICh4MzIgKiAoeTAgLSB5MikgLSB5MzIgKiAoeDAgLSB4MikpIC8gKHkzMiAqIHgxMCAtIHgzMiAqIHkxMCk7CiAgcmV0dXJuIFt4MCArIHQgKiB4MTAsIHkwICsgdCAqIHkxMF07Cn0KCi8vIENvbXB1dGUgcGVycGVuZGljdWxhciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuCi8vIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5jb20vQ2lyY2xlLUxpbmVJbnRlcnNlY3Rpb24uaHRtbApmdW5jdGlvbiBjb3JuZXJUYW5nZW50cyh4MCwgeTAsIHgxLCB5MSwgcjEsIHJjLCBjdykgewogIHZhciB4MDEgPSB4MCAtIHgxLAogICAgICB5MDEgPSB5MCAtIHkxLAogICAgICBsbyA9IChjdyA/IHJjIDogLXJjKSAvIE1hdGguc3FydCh4MDEgKiB4MDEgKyB5MDEgKiB5MDEpLAogICAgICBveCA9IGxvICogeTAxLAogICAgICBveSA9IC1sbyAqIHgwMSwKICAgICAgeDExID0geDAgKyBveCwKICAgICAgeTExID0geTAgKyBveSwKICAgICAgeDEwID0geDEgKyBveCwKICAgICAgeTEwID0geTEgKyBveSwKICAgICAgeDAwID0gKHgxMSArIHgxMCkgLyAyLAogICAgICB5MDAgPSAoeTExICsgeTEwKSAvIDIsCiAgICAgIGR4ID0geDEwIC0geDExLAogICAgICBkeSA9IHkxMCAtIHkxMSwKICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwKICAgICAgciA9IHIxIC0gcmMsCiAgICAgIEQgPSB4MTEgKiB5MTAgLSB4MTAgKiB5MTEsCiAgICAgIGQgPSAoZHkgPCAwID8gLTEgOiAxKSAqIE1hdGguc3FydChNYXRoLm1heCgwLCByICogciAqIGQyIC0gRCAqIEQpKSwKICAgICAgY3gwID0gKEQgKiBkeSAtIGR4ICogZCkgLyBkMiwKICAgICAgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsCiAgICAgIGN4MSA9IChEICogZHkgKyBkeCAqIGQpIC8gZDIsCiAgICAgIGN5MSA9ICgtRCAqIGR4ICsgZHkgKiBkKSAvIGQyLAogICAgICBkeDAgPSBjeDAgLSB4MDAsCiAgICAgIGR5MCA9IGN5MCAtIHkwMCwKICAgICAgZHgxID0gY3gxIC0geDAwLAogICAgICBkeTEgPSBjeTEgLSB5MDA7CgogIC8vIFBpY2sgdGhlIGNsb3NlciBvZiB0aGUgdHdvIGludGVyc2VjdGlvbiBwb2ludHMuCiAgLy8gVE9ETyBJcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGludGVyc2VjdGlvbiB0byB1c2U/CiAgaWYgKGR4MCAqIGR4MCArIGR5MCAqIGR5MCA+IGR4MSAqIGR4MSArIGR5MSAqIGR5MSkgY3gwID0gY3gxLCBjeTAgPSBjeTE7CgogIHJldHVybiB7CiAgICBjeDogY3gwLAogICAgY3k6IGN5MCwKICAgIHgwMTogLW94LAogICAgeTAxOiAtb3ksCiAgICB4MTE6IGN4MCAqIChyMSAvIHIgLSAxKSwKICAgIHkxMTogY3kwICogKHIxIC8gciAtIDEpCiAgfTsKfQoKdmFyIGFyYyA9IGZ1bmN0aW9uKCkgewogIHZhciBpbm5lclJhZGl1cyA9IGFyY0lubmVyUmFkaXVzLAogICAgICBvdXRlclJhZGl1cyA9IGFyY091dGVyUmFkaXVzLAogICAgICBjb3JuZXJSYWRpdXMgPSBjb25zdGFudCQyKDApLAogICAgICBwYWRSYWRpdXMgPSBudWxsLAogICAgICBzdGFydEFuZ2xlID0gYXJjU3RhcnRBbmdsZSwKICAgICAgZW5kQW5nbGUgPSBhcmNFbmRBbmdsZSwKICAgICAgcGFkQW5nbGUgPSBhcmNQYWRBbmdsZSwKICAgICAgY29udGV4dCA9IG51bGw7CgogIGZ1bmN0aW9uIGFyYygpIHsKICAgIHZhciBidWZmZXIsCiAgICAgICAgciwKICAgICAgICByMCA9ICtpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHIxID0gK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGkkMSwKICAgICAgICBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGkkMSwKICAgICAgICBkYSA9IE1hdGguYWJzKGExIC0gYTApLAogICAgICAgIGN3ID0gYTEgPiBhMDsKCiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7CgogICAgLy8gRW5zdXJlIHRoYXQgdGhlIG91dGVyIHJhZGl1cyBpcyBhbHdheXMgbGFyZ2VyIHRoYW4gdGhlIGlubmVyIHJhZGl1cy4KICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjsKCiAgICAvLyBJcyBpdCBhIHBvaW50PwogICAgaWYgKCEocjEgPiBlcHNpbG9uJDEpKSBjb250ZXh0Lm1vdmVUbygwLCAwKTsKCiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzPwogICAgZWxzZSBpZiAoZGEgPiB0YXUkMiAtIGVwc2lsb24kMSkgewogICAgICBjb250ZXh0Lm1vdmVUbyhyMSAqIE1hdGguY29zKGEwKSwgcjEgKiBNYXRoLnNpbihhMCkpOwogICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAsIGExLCAhY3cpOwogICAgICBpZiAocjAgPiBlcHNpbG9uJDEpIHsKICAgICAgICBjb250ZXh0Lm1vdmVUbyhyMCAqIE1hdGguY29zKGExKSwgcjAgKiBNYXRoLnNpbihhMSkpOwogICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMSwgYTAsIGN3KTsKICAgICAgfQogICAgfQoKICAgIC8vIE9yIGlzIGl0IGEgY2lyY3VsYXIgb3IgYW5udWxhciBzZWN0b3I/CiAgICBlbHNlIHsKICAgICAgdmFyIGEwMSA9IGEwLAogICAgICAgICAgYTExID0gYTEsCiAgICAgICAgICBhMDAgPSBhMCwKICAgICAgICAgIGExMCA9IGExLAogICAgICAgICAgZGEwID0gZGEsCiAgICAgICAgICBkYTEgPSBkYSwKICAgICAgICAgIGFwID0gcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAvIDIsCiAgICAgICAgICBycCA9IChhcCA+IGVwc2lsb24kMSkgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IE1hdGguc3FydChyMCAqIHIwICsgcjEgKiByMSkpLAogICAgICAgICAgcmMgPSBNYXRoLm1pbihNYXRoLmFicyhyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSksCiAgICAgICAgICByYzAgPSByYywKICAgICAgICAgIHJjMSA9IHJjLAogICAgICAgICAgdDAsCiAgICAgICAgICB0MTsKCiAgICAgIC8vIEFwcGx5IHBhZGRpbmc/IE5vdGUgdGhhdCBzaW5jZSByMSDDosKJwqUgcjAsIGRhMSDDosKJwqUgZGEwLgogICAgICBpZiAocnAgPiBlcHNpbG9uJDEpIHsKICAgICAgICB2YXIgcDAgPSBhc2luKHJwIC8gcjAgKiBNYXRoLnNpbihhcCkpLAogICAgICAgICAgICBwMSA9IGFzaW4ocnAgLyByMSAqIE1hdGguc2luKGFwKSk7CiAgICAgICAgaWYgKChkYTAgLT0gcDAgKiAyKSA+IGVwc2lsb24kMSkgcDAgKj0gKGN3ID8gMSA6IC0xKSwgYTAwICs9IHAwLCBhMTAgLT0gcDA7CiAgICAgICAgZWxzZSBkYTAgPSAwLCBhMDAgPSBhMTAgPSAoYTAgKyBhMSkgLyAyOwogICAgICAgIGlmICgoZGExIC09IHAxICogMikgPiBlcHNpbG9uJDEpIHAxICo9IChjdyA/IDEgOiAtMSksIGEwMSArPSBwMSwgYTExIC09IHAxOwogICAgICAgIGVsc2UgZGExID0gMCwgYTAxID0gYTExID0gKGEwICsgYTEpIC8gMjsKICAgICAgfQoKICAgICAgdmFyIHgwMSA9IHIxICogTWF0aC5jb3MoYTAxKSwKICAgICAgICAgIHkwMSA9IHIxICogTWF0aC5zaW4oYTAxKSwKICAgICAgICAgIHgxMCA9IHIwICogTWF0aC5jb3MoYTEwKSwKICAgICAgICAgIHkxMCA9IHIwICogTWF0aC5zaW4oYTEwKTsKCiAgICAgIC8vIEFwcGx5IHJvdW5kZWQgY29ybmVycz8KICAgICAgaWYgKHJjID4gZXBzaWxvbiQxKSB7CiAgICAgICAgdmFyIHgxMSA9IHIxICogTWF0aC5jb3MoYTExKSwKICAgICAgICAgICAgeTExID0gcjEgKiBNYXRoLnNpbihhMTEpLAogICAgICAgICAgICB4MDAgPSByMCAqIE1hdGguY29zKGEwMCksCiAgICAgICAgICAgIHkwMCA9IHIwICogTWF0aC5zaW4oYTAwKTsKCiAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGNvcm5lciByYWRpdXMgYWNjb3JkaW5nIHRvIHRoZSBzZWN0b3IgYW5nbGUuCiAgICAgICAgaWYgKGRhIDwgcGkkMikgewogICAgICAgICAgdmFyIG9jID0gZGEwID4gZXBzaWxvbiQxID8gaW50ZXJzZWN0KHgwMSwgeTAxLCB4MDAsIHkwMCwgeDExLCB5MTEsIHgxMCwgeTEwKSA6IFt4MTAsIHkxMF0sCiAgICAgICAgICAgICAgYXggPSB4MDEgLSBvY1swXSwKICAgICAgICAgICAgICBheSA9IHkwMSAtIG9jWzFdLAogICAgICAgICAgICAgIGJ4ID0geDExIC0gb2NbMF0sCiAgICAgICAgICAgICAgYnkgPSB5MTEgLSBvY1sxXSwKICAgICAgICAgICAgICBrYyA9IDEgLyBNYXRoLnNpbihNYXRoLmFjb3MoKGF4ICogYnggKyBheSAqIGJ5KSAvIChNYXRoLnNxcnQoYXggKiBheCArIGF5ICogYXkpICogTWF0aC5zcXJ0KGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksCiAgICAgICAgICAgICAgbGMgPSBNYXRoLnNxcnQob2NbMF0gKiBvY1swXSArIG9jWzFdICogb2NbMV0pOwogICAgICAgICAgcmMwID0gTWF0aC5taW4ocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTsKICAgICAgICAgIHJjMSA9IE1hdGgubWluKHJjLCAocjEgLSBsYykgLyAoa2MgKyAxKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJcyB0aGUgc2VjdG9yIGNvbGxhcHNlZCB0byBhIGxpbmU/CiAgICAgIGlmICghKGRhMSA+IGVwc2lsb24kMSkpIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKTsKCiAgICAgIC8vIERvZXMgdGhlIHNlY3RvcsOiwoDCmXMgb3V0ZXIgcmluZyBoYXZlIHJvdW5kZWQgY29ybmVycz8KICAgICAgZWxzZSBpZiAocmMxID4gZXBzaWxvbiQxKSB7CiAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MDAsIHkwMCwgeDAxLCB5MDEsIHIxLCByYzEsIGN3KTsKICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgxMSwgeTExLCB4MTAsIHkxMCwgcjEsIHJjMSwgY3cpOwoKICAgICAgICBjb250ZXh0Lm1vdmVUbyh0MC5jeCArIHQwLngwMSwgdDAuY3kgKyB0MC55MDEpOwoKICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD8KICAgICAgICBpZiAocmMxIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBNYXRoLmF0YW4yKHQwLnkwMSwgdDAueDAxKSwgTWF0aC5hdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7CgogICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLgogICAgICAgIGVsc2UgewogICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIE1hdGguYXRhbjIodDAueTAxLCB0MC54MDEpLCBNYXRoLmF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTsKICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBNYXRoLmF0YW4yKHQwLmN5ICsgdDAueTExLCB0MC5jeCArIHQwLngxMSksIE1hdGguYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgIWN3KTsKICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMxLCBNYXRoLmF0YW4yKHQxLnkxMSwgdDEueDExKSwgTWF0aC5hdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBPciBpcyB0aGUgb3V0ZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjPwogICAgICBlbHNlIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKSwgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwMSwgYTExLCAhY3cpOwoKICAgICAgLy8gSXMgdGhlcmUgbm8gaW5uZXIgcmluZywgYW5kIGl0w6LCgMKZcyBhIGNpcmN1bGFyIHNlY3Rvcj8KICAgICAgLy8gT3IgcGVyaGFwcyBpdMOiwoDCmXMgYW4gYW5udWxhciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nPwogICAgICBpZiAoIShyMCA+IGVwc2lsb24kMSkgfHwgIShkYTAgPiBlcHNpbG9uJDEpKSBjb250ZXh0LmxpbmVUbyh4MTAsIHkxMCk7CgogICAgICAvLyBEb2VzIHRoZSBzZWN0b3LDosKAwplzIGlubmVyIHJpbmcgKG9yIHBvaW50KSBoYXZlIHJvdW5kZWQgY29ybmVycz8KICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbiQxKSB7CiAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MTAsIHkxMCwgeDExLCB5MTEsIHIwLCAtcmMwLCBjdyk7CiAgICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MDEsIHkwMSwgeDAwLCB5MDAsIHIwLCAtcmMwLCBjdyk7CgogICAgICAgIGNvbnRleHQubGluZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7CgogICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkPwogICAgICAgIGlmIChyYzAgPCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIE1hdGguYXRhbjIodDAueTAxLCB0MC54MDEpLCBNYXRoLmF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTsKCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgTWF0aC5hdGFuMih0MC55MDEsIHQwLngwMSksIE1hdGguYXRhbjIodDAueTExLCB0MC54MTEpLCAhY3cpOwogICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjAsIE1hdGguYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgTWF0aC5hdGFuMih0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCBjdyk7CiAgICAgICAgICBjb250ZXh0LmFyYyh0MS5jeCwgdDEuY3ksIHJjMCwgTWF0aC5hdGFuMih0MS55MTEsIHQxLngxMSksIE1hdGguYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gT3IgaXMgdGhlIGlubmVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz8KICAgICAgZWxzZSBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEwLCBhMDAsIGN3KTsKICAgIH0KCiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOwoKICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICB9CgogIGFyYy5jZW50cm9pZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHIgPSAoK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyLAogICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSQyIC8gMjsKICAgIHJldHVybiBbTWF0aC5jb3MoYSkgKiByLCBNYXRoLnNpbihhKSAqIHJdOwogIH07CgogIGFyYy5pbm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlubmVyUmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIGFyYykgOiBpbm5lclJhZGl1czsKICB9OwoKICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdXRlclJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoK18pLCBhcmMpIDogb3V0ZXJSYWRpdXM7CiAgfTsKCiAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvcm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoK18pLCBhcmMpIDogY29ybmVyUmFkaXVzOwogIH07CgogIGFyYy5wYWRSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRSYWRpdXMgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIGFyYykgOiBwYWRSYWRpdXM7CiAgfTsKCiAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIGFyYykgOiBzdGFydEFuZ2xlOwogIH07CgogIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIGFyYykgOiBlbmRBbmdsZTsKICB9OwoKICBhcmMucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoK18pLCBhcmMpIDogcGFkQW5nbGU7CiAgfTsKCiAgYXJjLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgYXJjKSA6IGNvbnRleHQ7CiAgfTsKCiAgcmV0dXJuIGFyYzsKfQoKZnVuY3Rpb24gTGluZWFyKGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKTGluZWFyLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwKICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgeCA9ICt4LCB5ID0gK3k7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyAvLyBwcm9jZWVkCiAgICAgIGRlZmF1bHQ6IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpOyBicmVhazsKICAgIH0KICB9Cn07Cgp2YXIgY3VydmVMaW5lYXIgPSBmdW5jdGlvbihjb250ZXh0KSB7CiAgcmV0dXJuIG5ldyBMaW5lYXIoY29udGV4dCk7Cn0KCmZ1bmN0aW9uIHgocCkgewogIHJldHVybiBwWzBdOwp9CgpmdW5jdGlvbiB5KHApIHsKICByZXR1cm4gcFsxXTsKfQoKdmFyIGxpbmUgPSBmdW5jdGlvbigpIHsKICB2YXIgeCQkMSA9IHgsCiAgICAgIHkkJDEgPSB5LAogICAgICBkZWZpbmVkID0gY29uc3RhbnQkMih0cnVlKSwKICAgICAgY29udGV4dCA9IG51bGwsCiAgICAgIGN1cnZlID0gY3VydmVMaW5lYXIsCiAgICAgIG91dHB1dCA9IG51bGw7CgogIGZ1bmN0aW9uIGxpbmUoZGF0YSkgewogICAgdmFyIGksCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgIGQsCiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSwKICAgICAgICBidWZmZXI7CgogICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgb3V0cHV0ID0gY3VydmUoYnVmZmVyID0gcGF0aCgpKTsKCiAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkgewogICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7CiAgICAgICAgaWYgKGRlZmluZWQwID0gIWRlZmluZWQwKSBvdXRwdXQubGluZVN0YXJ0KCk7CiAgICAgICAgZWxzZSBvdXRwdXQubGluZUVuZCgpOwogICAgICB9CiAgICAgIGlmIChkZWZpbmVkMCkgb3V0cHV0LnBvaW50KCt4JCQxKGQsIGksIGRhdGEpLCAreSQkMShkLCBpLCBkYXRhKSk7CiAgICB9CgogICAgaWYgKGJ1ZmZlcikgcmV0dXJuIG91dHB1dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgfQoKICBsaW5lLnggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4JCQxID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIGxpbmUpIDogeCQkMTsKICB9OwoKICBsaW5lLnkgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5JCQxID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIGxpbmUpIDogeSQkMTsKICB9OwoKICBsaW5lLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMighIV8pLCBsaW5lKSA6IGRlZmluZWQ7CiAgfTsKCiAgbGluZS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGxpbmUpIDogY3VydmU7CiAgfTsKCiAgbGluZS5jb250ZXh0ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGxpbmUpIDogY29udGV4dDsKICB9OwoKICByZXR1cm4gbGluZTsKfQoKdmFyIGFyZWEkMSA9IGZ1bmN0aW9uKCkgewogIHZhciB4MCA9IHgsCiAgICAgIHgxID0gbnVsbCwKICAgICAgeTAgPSBjb25zdGFudCQyKDApLAogICAgICB5MSA9IHksCiAgICAgIGRlZmluZWQgPSBjb25zdGFudCQyKHRydWUpLAogICAgICBjb250ZXh0ID0gbnVsbCwKICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhciwKICAgICAgb3V0cHV0ID0gbnVsbDsKCiAgZnVuY3Rpb24gYXJlYShkYXRhKSB7CiAgICB2YXIgaSwKICAgICAgICBqLAogICAgICAgIGssCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgIGQsCiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSwKICAgICAgICBidWZmZXIsCiAgICAgICAgeDB6ID0gbmV3IEFycmF5KG4pLAogICAgICAgIHkweiA9IG5ldyBBcnJheShuKTsKCiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpOwoKICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7CiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9PT0gZGVmaW5lZDApIHsKICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHsKICAgICAgICAgIGogPSBpOwogICAgICAgICAgb3V0cHV0LmFyZWFTdGFydCgpOwogICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXRwdXQubGluZUVuZCgpOwogICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOwogICAgICAgICAgZm9yIChrID0gaSAtIDE7IGsgPj0gajsgLS1rKSB7CiAgICAgICAgICAgIG91dHB1dC5wb2ludCh4MHpba10sIHkweltrXSk7CiAgICAgICAgICB9CiAgICAgICAgICBvdXRwdXQubGluZUVuZCgpOwogICAgICAgICAgb3V0cHV0LmFyZWFFbmQoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlZmluZWQwKSB7CiAgICAgICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7CiAgICAgICAgb3V0cHV0LnBvaW50KHgxID8gK3gxKGQsIGksIGRhdGEpIDogeDB6W2ldLCB5MSA/ICt5MShkLCBpLCBkYXRhKSA6IHkweltpXSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYnVmZmVyKSByZXR1cm4gb3V0cHV0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICB9CgogIGZ1bmN0aW9uIGFyZWFsaW5lKCkgewogICAgcmV0dXJuIGxpbmUoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGN1cnZlKS5jb250ZXh0KGNvbnRleHQpOwogIH0KCiAgYXJlYS54ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQyKCtfKSwgeDEgPSBudWxsLCBhcmVhKSA6IHgwOwogIH07CgogIGFyZWEueDAgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoK18pLCBhcmVhKSA6IHgwOwogIH07CgogIGFyZWEueDEgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MSA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQyKCtfKSwgYXJlYSkgOiB4MTsKICB9OwoKICBhcmVhLnkgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoK18pLCB5MSA9IG51bGwsIGFyZWEpIDogeTA7CiAgfTsKCiAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIGFyZWEpIDogeTA7CiAgfTsKCiAgYXJlYS55MSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoK18pLCBhcmVhKSA6IHkxOwogIH07CgogIGFyZWEubGluZVgwID0KICBhcmVhLmxpbmVZMCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MCkueSh5MCk7CiAgfTsKCiAgYXJlYS5saW5lWTEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTEpOwogIH07CgogIGFyZWEubGluZVgxID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgxKS55KHkwKTsKICB9OwoKICBhcmVhLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMighIV8pLCBhcmVhKSA6IGRlZmluZWQ7CiAgfTsKCiAgYXJlYS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGFyZWEpIDogY3VydmU7CiAgfTsKCiAgYXJlYS5jb250ZXh0ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGFyZWEpIDogY29udGV4dDsKICB9OwoKICByZXR1cm4gYXJlYTsKfQoKdmFyIGRlc2NlbmRpbmckMSA9IGZ1bmN0aW9uKGEsIGIpIHsKICByZXR1cm4gYiA8IGEgPyAtMSA6IGIgPiBhID8gMSA6IGIgPj0gYSA/IDAgOiBOYU47Cn0KCnZhciBpZGVudGl0eSQxID0gZnVuY3Rpb24oZCkgewogIHJldHVybiBkOwp9Cgp2YXIgcGllID0gZnVuY3Rpb24oKSB7CiAgdmFyIHZhbHVlID0gaWRlbnRpdHkkMSwKICAgICAgc29ydFZhbHVlcyA9IGRlc2NlbmRpbmckMSwKICAgICAgc29ydCA9IG51bGwsCiAgICAgIHN0YXJ0QW5nbGUgPSBjb25zdGFudCQyKDApLAogICAgICBlbmRBbmdsZSA9IGNvbnN0YW50JDIodGF1JDIpLAogICAgICBwYWRBbmdsZSA9IGNvbnN0YW50JDIoMCk7CgogIGZ1bmN0aW9uIHBpZShkYXRhKSB7CiAgICB2YXIgaSwKICAgICAgICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgaiwKICAgICAgICBrLAogICAgICAgIHN1bSA9IDAsCiAgICAgICAgaW5kZXggPSBuZXcgQXJyYXkobiksCiAgICAgICAgYXJjcyA9IG5ldyBBcnJheShuKSwKICAgICAgICBhMCA9ICtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgZGEgPSBNYXRoLm1pbih0YXUkMiwgTWF0aC5tYXgoLXRhdSQyLCBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gYTApKSwKICAgICAgICBhMSwKICAgICAgICBwID0gTWF0aC5taW4oTWF0aC5hYnMoZGEpIC8gbiwgcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSksCiAgICAgICAgcGEgPSBwICogKGRhIDwgMCA/IC0xIDogMSksCiAgICAgICAgdjsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmICgodiA9IGFyY3NbaW5kZXhbaV0gPSBpXSA9ICt2YWx1ZShkYXRhW2ldLCBpLCBkYXRhKSkgPiAwKSB7CiAgICAgICAgc3VtICs9IHY7CiAgICAgIH0KICAgIH0KCiAgICAvLyBPcHRpb25hbGx5IHNvcnQgdGhlIGFyY3MgYnkgcHJldmlvdXNseS1jb21wdXRlZCB2YWx1ZXMgb3IgYnkgZGF0YS4KICAgIGlmIChzb3J0VmFsdWVzICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydFZhbHVlcyhhcmNzW2ldLCBhcmNzW2pdKTsgfSk7CiAgICBlbHNlIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7CgogICAgLy8gQ29tcHV0ZSB0aGUgYXJjcyEgVGhleSBhcmUgc3RvcmVkIGluIHRoZSBvcmlnaW5hbCBkYXRhJ3Mgb3JkZXIuCiAgICBmb3IgKGkgPSAwLCBrID0gc3VtID8gKGRhIC0gbiAqIHBhKSAvIHN1bSA6IDA7IGkgPCBuOyArK2ksIGEwID0gYTEpIHsKICAgICAgaiA9IGluZGV4W2ldLCB2ID0gYXJjc1tqXSwgYTEgPSBhMCArICh2ID4gMCA/IHYgKiBrIDogMCkgKyBwYSwgYXJjc1tqXSA9IHsKICAgICAgICBkYXRhOiBkYXRhW2pdLAogICAgICAgIGluZGV4OiBpLAogICAgICAgIHZhbHVlOiB2LAogICAgICAgIHN0YXJ0QW5nbGU6IGEwLAogICAgICAgIGVuZEFuZ2xlOiBhMSwKICAgICAgICBwYWRBbmdsZTogcAogICAgICB9OwogICAgfQoKICAgIHJldHVybiBhcmNzOwogIH0KCiAgcGllLnZhbHVlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQyKCtfKSwgcGllKSA6IHZhbHVlOwogIH07CgogIHBpZS5zb3J0VmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydFZhbHVlcyA9IF8sIHNvcnQgPSBudWxsLCBwaWUpIDogc29ydFZhbHVlczsKICB9OwoKICBwaWUuc29ydCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnQgPSBfLCBzb3J0VmFsdWVzID0gbnVsbCwgcGllKSA6IHNvcnQ7CiAgfTsKCiAgcGllLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIHBpZSkgOiBzdGFydEFuZ2xlOwogIH07CgogIHBpZS5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIHBpZSkgOiBlbmRBbmdsZTsKICB9OwoKICBwaWUucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoK18pLCBwaWUpIDogcGFkQW5nbGU7CiAgfTsKCiAgcmV0dXJuIHBpZTsKfQoKdmFyIGN1cnZlUmFkaWFsTGluZWFyID0gY3VydmVSYWRpYWwoY3VydmVMaW5lYXIpOwoKZnVuY3Rpb24gUmFkaWFsKGN1cnZlKSB7CiAgdGhpcy5fY3VydmUgPSBjdXJ2ZTsKfQoKUmFkaWFsLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fY3VydmUuYXJlYVN0YXJ0KCk7CiAgfSwKICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2N1cnZlLmFyZWFFbmQoKTsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKTsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fY3VydmUubGluZUVuZCgpOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKGEsIHIpIHsKICAgIHRoaXMuX2N1cnZlLnBvaW50KHIgKiBNYXRoLnNpbihhKSwgciAqIC1NYXRoLmNvcyhhKSk7CiAgfQp9OwoKZnVuY3Rpb24gY3VydmVSYWRpYWwoY3VydmUpIHsKCiAgZnVuY3Rpb24gcmFkaWFsKGNvbnRleHQpIHsKICAgIHJldHVybiBuZXcgUmFkaWFsKGN1cnZlKGNvbnRleHQpKTsKICB9CgogIHJhZGlhbC5fY3VydmUgPSBjdXJ2ZTsKCiAgcmV0dXJuIHJhZGlhbDsKfQoKZnVuY3Rpb24gcmFkaWFsTGluZShsKSB7CiAgdmFyIGMgPSBsLmN1cnZlOwoKICBsLmFuZ2xlID0gbC54LCBkZWxldGUgbC54OwogIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55OwoKICBsLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7CiAgfTsKCiAgcmV0dXJuIGw7Cn0KCnZhciByYWRpYWxMaW5lJDEgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gcmFkaWFsTGluZShsaW5lKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpKTsKfQoKdmFyIHJhZGlhbEFyZWEgPSBmdW5jdGlvbigpIHsKICB2YXIgYSA9IGFyZWEkMSgpLmN1cnZlKGN1cnZlUmFkaWFsTGluZWFyKSwKICAgICAgYyA9IGEuY3VydmUsCiAgICAgIHgwID0gYS5saW5lWDAsCiAgICAgIHgxID0gYS5saW5lWDEsCiAgICAgIHkwID0gYS5saW5lWTAsCiAgICAgIHkxID0gYS5saW5lWTE7CgogIGEuYW5nbGUgPSBhLngsIGRlbGV0ZSBhLng7CiAgYS5zdGFydEFuZ2xlID0gYS54MCwgZGVsZXRlIGEueDA7CiAgYS5lbmRBbmdsZSA9IGEueDEsIGRlbGV0ZSBhLngxOwogIGEucmFkaXVzID0gYS55LCBkZWxldGUgYS55OwogIGEuaW5uZXJSYWRpdXMgPSBhLnkwLCBkZWxldGUgYS55MDsKICBhLm91dGVyUmFkaXVzID0gYS55MSwgZGVsZXRlIGEueTE7CiAgYS5saW5lU3RhcnRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmFkaWFsTGluZSh4MCgpKTsgfSwgZGVsZXRlIGEubGluZVgwOwogIGEubGluZUVuZEFuZ2xlID0gZnVuY3Rpb24oKSB7IHJldHVybiByYWRpYWxMaW5lKHgxKCkpOyB9LCBkZWxldGUgYS5saW5lWDE7CiAgYS5saW5lSW5uZXJSYWRpdXMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHJhZGlhbExpbmUoeTAoKSk7IH0sIGRlbGV0ZSBhLmxpbmVZMDsKICBhLmxpbmVPdXRlclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmFkaWFsTGluZSh5MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxOwoKICBhLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7CiAgfTsKCiAgcmV0dXJuIGE7Cn0KCnZhciBjaXJjbGUgPSB7CiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIHBpJDIpOwogICAgY29udGV4dC5tb3ZlVG8ociwgMCk7CiAgICBjb250ZXh0LmFyYygwLCAwLCByLCAwLCB0YXUkMik7CiAgfQp9OwoKdmFyIGNyb3NzJDEgPSB7CiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjsKICAgIGNvbnRleHQubW92ZVRvKC0zICogciwgLXIpOwogICAgY29udGV4dC5saW5lVG8oLXIsIC1yKTsKICAgIGNvbnRleHQubGluZVRvKC1yLCAtMyAqIHIpOwogICAgY29udGV4dC5saW5lVG8ociwgLTMgKiByKTsKICAgIGNvbnRleHQubGluZVRvKHIsIC1yKTsKICAgIGNvbnRleHQubGluZVRvKDMgKiByLCAtcik7CiAgICBjb250ZXh0LmxpbmVUbygzICogciwgcik7CiAgICBjb250ZXh0LmxpbmVUbyhyLCByKTsKICAgIGNvbnRleHQubGluZVRvKHIsIDMgKiByKTsKICAgIGNvbnRleHQubGluZVRvKC1yLCAzICogcik7CiAgICBjb250ZXh0LmxpbmVUbygtciwgcik7CiAgICBjb250ZXh0LmxpbmVUbygtMyAqIHIsIHIpOwogICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICB9Cn07Cgp2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpOwp2YXIgdGFuMzBfMiA9IHRhbjMwICogMjsKCnZhciBkaWFtb25kID0gewogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgIHZhciB5ID0gTWF0aC5zcXJ0KHNpemUgLyB0YW4zMF8yKSwKICAgICAgICB4ID0geSAqIHRhbjMwOwogICAgY29udGV4dC5tb3ZlVG8oMCwgLXkpOwogICAgY29udGV4dC5saW5lVG8oeCwgMCk7CiAgICBjb250ZXh0LmxpbmVUbygwLCB5KTsKICAgIGNvbnRleHQubGluZVRvKC14LCAwKTsKICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgfQp9OwoKdmFyIGthID0gMC44OTA4MTMwOTE1MjkyODUyMjgxMDsKdmFyIGtyID0gTWF0aC5zaW4ocGkkMiAvIDEwKSAvIE1hdGguc2luKDcgKiBwaSQyIC8gMTApOwp2YXIga3ggPSBNYXRoLnNpbih0YXUkMiAvIDEwKSAqIGtyOwp2YXIga3kgPSAtTWF0aC5jb3ModGF1JDIgLyAxMCkgKiBrcjsKCnZhciBzdGFyID0gewogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgKiBrYSksCiAgICAgICAgeCA9IGt4ICogciwKICAgICAgICB5ID0ga3kgKiByOwogICAgY29udGV4dC5tb3ZlVG8oMCwgLXIpOwogICAgY29udGV4dC5saW5lVG8oeCwgeSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7ICsraSkgewogICAgICB2YXIgYSA9IHRhdSQyICogaSAvIDUsCiAgICAgICAgICBjID0gTWF0aC5jb3MoYSksCiAgICAgICAgICBzID0gTWF0aC5zaW4oYSk7CiAgICAgIGNvbnRleHQubGluZVRvKHMgKiByLCAtYyAqIHIpOwogICAgICBjb250ZXh0LmxpbmVUbyhjICogeCAtIHMgKiB5LCBzICogeCArIGMgKiB5KTsKICAgIH0KICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgfQp9OwoKdmFyIHNxdWFyZSA9IHsKICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICB2YXIgdyA9IE1hdGguc3FydChzaXplKSwKICAgICAgICB4ID0gLXcgLyAyOwogICAgY29udGV4dC5yZWN0KHgsIHgsIHcsIHcpOwogIH0KfTsKCnZhciBzcXJ0MyA9IE1hdGguc3FydCgzKTsKCnZhciB0cmlhbmdsZSA9IHsKICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICB2YXIgeSA9IC1NYXRoLnNxcnQoc2l6ZSAvIChzcXJ0MyAqIDMpKTsKICAgIGNvbnRleHQubW92ZVRvKDAsIHkgKiAyKTsKICAgIGNvbnRleHQubGluZVRvKC1zcXJ0MyAqIHksIC15KTsKICAgIGNvbnRleHQubGluZVRvKHNxcnQzICogeSwgLXkpOwogICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICB9Cn07Cgp2YXIgYyA9IC0wLjU7CnZhciBzID0gTWF0aC5zcXJ0KDMpIC8gMjsKdmFyIGsgPSAxIC8gTWF0aC5zcXJ0KDEyKTsKdmFyIGEgPSAoayAvIDIgKyAxKSAqIDM7Cgp2YXIgd3llID0gewogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyBhKSwKICAgICAgICB4MCA9IHIgLyAyLAogICAgICAgIHkwID0gciAqIGssCiAgICAgICAgeDEgPSB4MCwKICAgICAgICB5MSA9IHIgKiBrICsgciwKICAgICAgICB4MiA9IC14MSwKICAgICAgICB5MiA9IHkxOwogICAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTsKICAgIGNvbnRleHQubGluZVRvKHgxLCB5MSk7CiAgICBjb250ZXh0LmxpbmVUbyh4MiwgeTIpOwogICAgY29udGV4dC5saW5lVG8oYyAqIHgwIC0gcyAqIHkwLCBzICogeDAgKyBjICogeTApOwogICAgY29udGV4dC5saW5lVG8oYyAqIHgxIC0gcyAqIHkxLCBzICogeDEgKyBjICogeTEpOwogICAgY29udGV4dC5saW5lVG8oYyAqIHgyIC0gcyAqIHkyLCBzICogeDIgKyBjICogeTIpOwogICAgY29udGV4dC5saW5lVG8oYyAqIHgwICsgcyAqIHkwLCBjICogeTAgLSBzICogeDApOwogICAgY29udGV4dC5saW5lVG8oYyAqIHgxICsgcyAqIHkxLCBjICogeTEgLSBzICogeDEpOwogICAgY29udGV4dC5saW5lVG8oYyAqIHgyICsgcyAqIHkyLCBjICogeTIgLSBzICogeDIpOwogICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICB9Cn07Cgp2YXIgc3ltYm9scyA9IFsKICBjaXJjbGUsCiAgY3Jvc3MkMSwKICBkaWFtb25kLAogIHNxdWFyZSwKICBzdGFyLAogIHRyaWFuZ2xlLAogIHd5ZQpdOwoKdmFyIHN5bWJvbCA9IGZ1bmN0aW9uKCkgewogIHZhciB0eXBlID0gY29uc3RhbnQkMihjaXJjbGUpLAogICAgICBzaXplID0gY29uc3RhbnQkMig2NCksCiAgICAgIGNvbnRleHQgPSBudWxsOwoKICBmdW5jdGlvbiBzeW1ib2woKSB7CiAgICB2YXIgYnVmZmVyOwogICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpOwogICAgdHlwZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLmRyYXcoY29udGV4dCwgK3NpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgfQoKICBzeW1ib2wudHlwZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR5cGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQyKF8pLCBzeW1ib2wpIDogdHlwZTsKICB9OwoKICBzeW1ib2wuc2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNpemUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQyKCtfKSwgc3ltYm9sKSA6IHNpemU7CiAgfTsKCiAgc3ltYm9sLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8sIHN5bWJvbCkgOiBjb250ZXh0OwogIH07CgogIHJldHVybiBzeW1ib2w7Cn0KCnZhciBub29wID0gZnVuY3Rpb24oKSB7fQoKZnVuY3Rpb24gcG9pbnQodGhhdCwgeCwgeSkgewogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygKICAgICgyICogdGhhdC5feDAgKyB0aGF0Ll94MSkgLyAzLAogICAgKDIgKiB0aGF0Ll95MCArIHRoYXQuX3kxKSAvIDMsCiAgICAodGhhdC5feDAgKyAyICogdGhhdC5feDEpIC8gMywKICAgICh0aGF0Ll95MCArIDIgKiB0aGF0Ll95MSkgLyAzLAogICAgKHRoYXQuX3gwICsgNCAqIHRoYXQuX3gxICsgeCkgLyA2LAogICAgKHRoYXQuX3kwICsgNCAqIHRoYXQuX3kxICsgeSkgLyA2CiAgKTsKfQoKZnVuY3Rpb24gQmFzaXMoY29udGV4dCkgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Owp9CgpCYXNpcy5wcm90b3R5cGUgPSB7CiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSAwOwogIH0sCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gTmFOOwogIH0sCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IE5hTjsKICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICBjYXNlIDM6IHBvaW50KHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IC8vIHByb2NlZWQKICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhazsKICAgIH0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsKICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fY29udGV4dC5saW5lVG8oKDUgKiB0aGlzLl94MCArIHRoaXMuX3gxKSAvIDYsICg1ICogdGhpcy5feTAgKyB0aGlzLl95MSkgLyA2KTsgLy8gcHJvY2VlZAogICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7CiAgICB9CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7CiAgfQp9OwoKdmFyIGJhc2lzID0gZnVuY3Rpb24oY29udGV4dCkgewogIHJldHVybiBuZXcgQmFzaXMoY29udGV4dCk7Cn0KCmZ1bmN0aW9uIEJhc2lzQ2xvc2VkKGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKQmFzaXNDbG9zZWQucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogbm9vcCwKICBhcmVhRW5kOiBub29wLAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSBOYU47CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAxOiB7CiAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsIHRoaXMuX3kyKTsKICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMjogewogICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MiArIDIgKiB0aGlzLl94MykgLyAzLCAodGhpcy5feTIgKyAyICogdGhpcy5feTMpIC8gMyk7CiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oKHRoaXMuX3gzICsgMiAqIHRoaXMuX3gyKSAvIDMsICh0aGlzLl95MyArIDIgKiB0aGlzLl95MikgLyAzKTsKICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMzogewogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDIsIHRoaXMuX3kyKTsKICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gzLCB0aGlzLl95Myk7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NCwgdGhpcy5feTQpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgeCA9ICt4LCB5ID0gK3k7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MiA9IHgsIHRoaXMuX3kyID0geTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geTsgdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwICsgNCAqIHRoaXMuX3gxICsgeCkgLyA2LCAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDYpOyBicmVhazsKICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrOwogICAgfQogICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4OwogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5OwogIH0KfTsKCnZhciBiYXNpc0Nsb3NlZCA9IGZ1bmN0aW9uKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IEJhc2lzQ2xvc2VkKGNvbnRleHQpOwp9CgpmdW5jdGlvbiBCYXNpc09wZW4oY29udGV4dCkgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Owp9CgpCYXNpc09wZW4ucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOwogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB2YXIgeDAgPSAodGhpcy5feDAgKyA0ICogdGhpcy5feDEgKyB4KSAvIDYsIHkwID0gKHRoaXMuX3kwICsgNCAqIHRoaXMuX3kxICsgeSkgLyA2OyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeDAsIHkwKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgwLCB5MCk7IGJyZWFrOwogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7CiAgICB9CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7CiAgfQp9OwoKdmFyIGJhc2lzT3BlbiA9IGZ1bmN0aW9uKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IEJhc2lzT3Blbihjb250ZXh0KTsKfQoKZnVuY3Rpb24gQnVuZGxlKGNvbnRleHQsIGJldGEpIHsKICB0aGlzLl9iYXNpcyA9IG5ldyBCYXNpcyhjb250ZXh0KTsKICB0aGlzLl9iZXRhID0gYmV0YTsKfQoKQnVuZGxlLnByb3RvdHlwZSA9IHsKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5feCA9IFtdOwogICAgdGhpcy5feSA9IFtdOwogICAgdGhpcy5fYmFzaXMubGluZVN0YXJ0KCk7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHZhciB4ID0gdGhpcy5feCwKICAgICAgICB5ID0gdGhpcy5feSwKICAgICAgICBqID0geC5sZW5ndGggLSAxOwoKICAgIGlmIChqID4gMCkgewogICAgICB2YXIgeDAgPSB4WzBdLAogICAgICAgICAgeTAgPSB5WzBdLAogICAgICAgICAgZHggPSB4W2pdIC0geDAsCiAgICAgICAgICBkeSA9IHlbal0gLSB5MCwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgIHQ7CgogICAgICB3aGlsZSAoKytpIDw9IGopIHsKICAgICAgICB0ID0gaSAvIGo7CiAgICAgICAgdGhpcy5fYmFzaXMucG9pbnQoCiAgICAgICAgICB0aGlzLl9iZXRhICogeFtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeDAgKyB0ICogZHgpLAogICAgICAgICAgdGhpcy5fYmV0YSAqIHlbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHkwICsgdCAqIGR5KQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7CiAgICB0aGlzLl9iYXNpcy5saW5lRW5kKCk7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgdGhpcy5feC5wdXNoKCt4KTsKICAgIHRoaXMuX3kucHVzaCgreSk7CiAgfQp9OwoKdmFyIGJ1bmRsZSA9IChmdW5jdGlvbiBjdXN0b20oYmV0YSkgewoKICBmdW5jdGlvbiBidW5kbGUoY29udGV4dCkgewogICAgcmV0dXJuIGJldGEgPT09IDEgPyBuZXcgQmFzaXMoY29udGV4dCkgOiBuZXcgQnVuZGxlKGNvbnRleHQsIGJldGEpOwogIH0KCiAgYnVuZGxlLmJldGEgPSBmdW5jdGlvbihiZXRhKSB7CiAgICByZXR1cm4gY3VzdG9tKCtiZXRhKTsKICB9OwoKICByZXR1cm4gYnVuZGxlOwp9KSgwLjg1KTsKCmZ1bmN0aW9uIHBvaW50JDEodGhhdCwgeCwgeSkgewogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygKICAgIHRoYXQuX3gxICsgdGhhdC5fayAqICh0aGF0Ll94MiAtIHRoYXQuX3gwKSwKICAgIHRoYXQuX3kxICsgdGhhdC5fayAqICh0aGF0Ll95MiAtIHRoYXQuX3kwKSwKICAgIHRoYXQuX3gyICsgdGhhdC5fayAqICh0aGF0Ll94MSAtIHgpLAogICAgdGhhdC5feTIgKyB0aGF0Ll9rICogKHRoYXQuX3kxIC0geSksCiAgICB0aGF0Ll94MiwKICAgIHRoYXQuX3kyCiAgKTsKfQoKZnVuY3Rpb24gQ2FyZGluYWwoY29udGV4dCwgdGVuc2lvbikgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjsKfQoKQ2FyZGluYWwucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOOwogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMjogdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7CiAgICAgIGNhc2UgMzogcG9pbnQkMSh0aGlzLCB0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhazsKICAgIH0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsKICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX3gxID0geCwgdGhpcy5feTEgPSB5OyBicmVhazsKICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWQKICAgICAgZGVmYXVsdDogcG9pbnQkMSh0aGlzLCB4LCB5KTsgYnJlYWs7CiAgICB9CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7CiAgfQp9OwoKdmFyIGNhcmRpbmFsID0gKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7CgogIGZ1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpIHsKICAgIHJldHVybiBuZXcgQ2FyZGluYWwoY29udGV4dCwgdGVuc2lvbik7CiAgfQoKICBjYXJkaW5hbC50ZW5zaW9uID0gZnVuY3Rpb24odGVuc2lvbikgewogICAgcmV0dXJuIGN1c3RvbSgrdGVuc2lvbik7CiAgfTsKCiAgcmV0dXJuIGNhcmRpbmFsOwp9KSgwKTsKCmZ1bmN0aW9uIENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIHRlbnNpb24pIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7Cn0KCkNhcmRpbmFsQ2xvc2VkLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IG5vb3AsCiAgYXJlYUVuZDogbm9vcCwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsKICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MywgdGhpcy5feTMpOwogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAyOiB7CiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMzogewogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5feTUpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgeCA9ICt4LCB5ID0gK3k7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5feDUgPSB4LCB0aGlzLl95NSA9IHk7IGJyZWFrOwogICAgICBkZWZhdWx0OiBwb2ludCQxKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2YXIgY2FyZGluYWxDbG9zZWQgPSAoZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pIHsKCiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgewogICAgcmV0dXJuIG5ldyBDYXJkaW5hbENsb3NlZChjb250ZXh0LCB0ZW5zaW9uKTsKICB9CgogIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7CiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTsKICB9OwoKICByZXR1cm4gY2FyZGluYWw7Cn0pKDApOwoKZnVuY3Rpb24gQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7Cn0KCkNhcmRpbmFsT3Blbi5wcm90b3R5cGUgPSB7CiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSAwOwogIH0sCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gTmFOOwogIH0sCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOwogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICBkZWZhdWx0OiBwb2ludCQxKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2YXIgY2FyZGluYWxPcGVuID0gKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7CgogIGZ1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpIHsKICAgIHJldHVybiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pOwogIH0KCiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHsKICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOwogIH07CgogIHJldHVybiBjYXJkaW5hbDsKfSkoMCk7CgpmdW5jdGlvbiBwb2ludCQyKHRoYXQsIHgsIHkpIHsKICB2YXIgeDEgPSB0aGF0Ll94MSwKICAgICAgeTEgPSB0aGF0Ll95MSwKICAgICAgeDIgPSB0aGF0Ll94MiwKICAgICAgeTIgPSB0aGF0Ll95MjsKCiAgaWYgKHRoYXQuX2wwMV9hID4gZXBzaWxvbiQxKSB7CiAgICB2YXIgYSA9IDIgKiB0aGF0Ll9sMDFfMmEgKyAzICogdGhhdC5fbDAxX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSwKICAgICAgICBuID0gMyAqIHRoYXQuX2wwMV9hICogKHRoYXQuX2wwMV9hICsgdGhhdC5fbDEyX2EpOwogICAgeDEgPSAoeDEgKiBhIC0gdGhhdC5feDAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll94MiAqIHRoYXQuX2wwMV8yYSkgLyBuOwogICAgeTEgPSAoeTEgKiBhIC0gdGhhdC5feTAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll95MiAqIHRoYXQuX2wwMV8yYSkgLyBuOwogIH0KCiAgaWYgKHRoYXQuX2wyM19hID4gZXBzaWxvbiQxKSB7CiAgICB2YXIgYiA9IDIgKiB0aGF0Ll9sMjNfMmEgKyAzICogdGhhdC5fbDIzX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSwKICAgICAgICBtID0gMyAqIHRoYXQuX2wyM19hICogKHRoYXQuX2wyM19hICsgdGhhdC5fbDEyX2EpOwogICAgeDIgPSAoeDIgKiBiICsgdGhhdC5feDEgKiB0aGF0Ll9sMjNfMmEgLSB4ICogdGhhdC5fbDEyXzJhKSAvIG07CiAgICB5MiA9ICh5MiAqIGIgKyB0aGF0Ll95MSAqIHRoYXQuX2wyM18yYSAtIHkgKiB0aGF0Ll9sMTJfMmEpIC8gbTsKICB9CgogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5MiwgdGhhdC5feDIsIHRoYXQuX3kyKTsKfQoKZnVuY3Rpb24gQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogIHRoaXMuX2FscGhhID0gYWxwaGE7Cn0KCkNhdG11bGxSb20ucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOOwogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0KICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsKICAgICAgY2FzZSAzOiB0aGlzLnBvaW50KHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgfQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHggPSAreCwgeSA9ICt5OwoKICAgIGlmICh0aGlzLl9wb2ludCkgewogICAgICB2YXIgeDIzID0gdGhpcy5feDIgLSB4LAogICAgICAgICAgeTIzID0gdGhpcy5feTIgLSB5OwogICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7CiAgICB9CgogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyAvLyBwcm9jZWVkCiAgICAgIGRlZmF1bHQ6IHBvaW50JDIodGhpcywgeCwgeSk7IGJyZWFrOwogICAgfQoKICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EsIHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2E7CiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsKICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2YXIgY2F0bXVsbFJvbSA9IChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHsKCiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7CiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWwoY29udGV4dCwgMCk7CiAgfQoKICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHsKICAgIHJldHVybiBjdXN0b20oK2FscGhhKTsKICB9OwoKICByZXR1cm4gY2F0bXVsbFJvbTsKfSkoMC41KTsKCmZ1bmN0aW9uIENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICB0aGlzLl9hbHBoYSA9IGFscGhhOwp9CgpDYXRtdWxsUm9tQ2xvc2VkLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IG5vb3AsCiAgYXJlYUVuZDogbm9vcCwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsKICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9CiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMTogewogICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLCB0aGlzLl95Myk7CiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIDI6IHsKICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MywgdGhpcy5feTMpOwogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAzOiB7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpOwogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDQsIHRoaXMuX3k0KTsKICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g1LCB0aGlzLl95NSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKCiAgICBpZiAodGhpcy5fcG9pbnQpIHsKICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwKICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTsKICAgICAgdGhpcy5fbDIzX2EgPSBNYXRoLnNxcnQodGhpcy5fbDIzXzJhID0gTWF0aC5wb3coeDIzICogeDIzICsgeTIzICogeTIzLCB0aGlzLl9hbHBoYSkpOwogICAgfQoKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsKICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0ID0geCwgdGhpcy5feTQgPSB5KTsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NSA9IHgsIHRoaXMuX3k1ID0geTsgYnJlYWs7CiAgICAgIGRlZmF1bHQ6IHBvaW50JDIodGhpcywgeCwgeSk7IGJyZWFrOwogICAgfQoKICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EsIHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2E7CiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsKICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2YXIgY2F0bXVsbFJvbUNsb3NlZCA9IChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHsKCiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7CiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbUNsb3NlZChjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgMCk7CiAgfQoKICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHsKICAgIHJldHVybiBjdXN0b20oK2FscGhhKTsKICB9OwoKICByZXR1cm4gY2F0bXVsbFJvbTsKfSkoMC41KTsKCmZ1bmN0aW9uIENhdG11bGxSb21PcGVuKGNvbnRleHQsIGFscGhhKSB7CiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5fYWxwaGEgPSBhbHBoYTsKfQoKQ2F0bXVsbFJvbU9wZW4ucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOOwogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0KICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKCiAgICBpZiAodGhpcy5fcG9pbnQpIHsKICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwKICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTsKICAgICAgdGhpcy5fbDIzX2EgPSBNYXRoLnNxcnQodGhpcy5fbDIzXzJhID0gTWF0aC5wb3coeDIzICogeDIzICsgeTIzICogeTIzLCB0aGlzLl9hbHBoYSkpOwogICAgfQoKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOwogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICBkZWZhdWx0OiBwb2ludCQyKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KCiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hLCB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hOwogICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhLCB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmE7CiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7CiAgfQp9OwoKdmFyIGNhdG11bGxSb21PcGVuID0gKGZ1bmN0aW9uIGN1c3RvbShhbHBoYSkgewoKICBmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpIHsKICAgIHJldHVybiBhbHBoYSA/IG5ldyBDYXRtdWxsUm9tT3Blbihjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQsIDApOwogIH0KCiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7CiAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7CiAgfTsKCiAgcmV0dXJuIGNhdG11bGxSb207Cn0pKDAuNSk7CgpmdW5jdGlvbiBMaW5lYXJDbG9zZWQoY29udGV4dCkgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Owp9CgpMaW5lYXJDbG9zZWQucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogbm9vcCwKICBhcmVhRW5kOiBub29wLAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLl9wb2ludCkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIGlmICh0aGlzLl9wb2ludCkgdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7CiAgICBlbHNlIHRoaXMuX3BvaW50ID0gMSwgdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7CiAgfQp9OwoKdmFyIGxpbmVhckNsb3NlZCA9IGZ1bmN0aW9uKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IExpbmVhckNsb3NlZChjb250ZXh0KTsKfQoKZnVuY3Rpb24gc2lnbih4KSB7CiAgcmV0dXJuIHggPCAwID8gLTEgOiAxOwp9CgovLyBDYWxjdWxhdGUgdGhlIHNsb3BlcyBvZiB0aGUgdGFuZ2VudHMgKEhlcm1pdGUtdHlwZSBpbnRlcnBvbGF0aW9uKSBiYXNlZCBvbgovLyB0aGUgZm9sbG93aW5nIHBhcGVyOiBTdGVmZmVuLCBNLiAxOTkwLiBBIFNpbXBsZSBNZXRob2QgZm9yIE1vbm90b25pYwovLyBJbnRlcnBvbGF0aW9uIGluIE9uZSBEaW1lbnNpb24uIEFzdHJvbm9teSBhbmQgQXN0cm9waHlzaWNzLCBWb2wuIDIzOSwgTk8uCi8vIE5PVihJSSksIFAuIDQ0MywgMTk5MC4KZnVuY3Rpb24gc2xvcGUzKHRoYXQsIHgyLCB5MikgewogIHZhciBoMCA9IHRoYXQuX3gxIC0gdGhhdC5feDAsCiAgICAgIGgxID0geDIgLSB0aGF0Ll94MSwKICAgICAgczAgPSAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyAoaDAgfHwgaDEgPCAwICYmIC0wKSwKICAgICAgczEgPSAoeTIgLSB0aGF0Ll95MSkgLyAoaDEgfHwgaDAgPCAwICYmIC0wKSwKICAgICAgcCA9IChzMCAqIGgxICsgczEgKiBoMCkgLyAoaDAgKyBoMSk7CiAgcmV0dXJuIChzaWduKHMwKSArIHNpZ24oczEpKSAqIE1hdGgubWluKE1hdGguYWJzKHMwKSwgTWF0aC5hYnMoczEpLCAwLjUgKiBNYXRoLmFicyhwKSkgfHwgMDsKfQoKLy8gQ2FsY3VsYXRlIGEgb25lLXNpZGVkIHNsb3BlLgpmdW5jdGlvbiBzbG9wZTIodGhhdCwgdCkgewogIHZhciBoID0gdGhhdC5feDEgLSB0aGF0Ll94MDsKICByZXR1cm4gaCA/ICgzICogKHRoYXQuX3kxIC0gdGhhdC5feTApIC8gaCAtIHQpIC8gMiA6IHQ7Cn0KCi8vIEFjY29yZGluZyB0byBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19IZXJtaXRlX3NwbGluZSNSZXByZXNlbnRhdGlvbnMKLy8gInlvdSBjYW4gZXhwcmVzcyBjdWJpYyBIZXJtaXRlIGludGVycG9sYXRpb24gaW4gdGVybXMgb2YgY3ViaWMgQsODwql6aWVyIGN1cnZlcwovLyB3aXRoIHJlc3BlY3QgdG8gdGhlIGZvdXIgdmFsdWVzIHAwLCBwMCArIG0wIC8gMywgcDEgLSBtMSAvIDMsIHAxIi4KZnVuY3Rpb24gcG9pbnQkMyh0aGF0LCB0MCwgdDEpIHsKICB2YXIgeDAgPSB0aGF0Ll94MCwKICAgICAgeTAgPSB0aGF0Ll95MCwKICAgICAgeDEgPSB0aGF0Ll94MSwKICAgICAgeTEgPSB0aGF0Ll95MSwKICAgICAgZHggPSAoeDEgLSB4MCkgLyAzOwogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCArIGR4LCB5MCArIGR4ICogdDAsIHgxIC0gZHgsIHkxIC0gZHggKiB0MSwgeDEsIHkxKTsKfQoKZnVuY3Rpb24gTW9ub3RvbmVYKGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKTW9ub3RvbmVYLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwKICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0KICAgIHRoaXMuX3QwID0gTmFOOwogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMjogdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsIHRoaXMuX3kxKTsgYnJlYWs7CiAgICAgIGNhc2UgMzogcG9pbnQkMyh0aGlzLCB0aGlzLl90MCwgc2xvcGUyKHRoaXMsIHRoaXMuX3QwKSk7IGJyZWFrOwogICAgfQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHZhciB0MSA9IE5hTjsKCiAgICB4ID0gK3gsIHkgPSAreTsKICAgIGlmICh4ID09PSB0aGlzLl94MSAmJiB5ID09PSB0aGlzLl95MSkgcmV0dXJuOyAvLyBJZ25vcmUgY29pbmNpZGVudCBwb2ludHMuCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsKICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHBvaW50JDModGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhazsKICAgICAgZGVmYXVsdDogcG9pbnQkMyh0aGlzLCB0aGlzLl90MCwgdDEgPSBzbG9wZTModGhpcywgeCwgeSkpOyBicmVhazsKICAgIH0KCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7CiAgICB0aGlzLl90MCA9IHQxOwogIH0KfQoKZnVuY3Rpb24gTW9ub3RvbmVZKGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gbmV3IFJlZmxlY3RDb250ZXh0KGNvbnRleHQpOwp9CgooTW9ub3RvbmVZLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9ub3RvbmVYLnByb3RvdHlwZSkpLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkgewogIE1vbm90b25lWC5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLCB5LCB4KTsKfTsKCmZ1bmN0aW9uIFJlZmxlY3RDb250ZXh0KGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKUmVmbGVjdENvbnRleHQucHJvdG90eXBlID0gewogIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh5LCB4KTsgfSwKICBjbG9zZVBhdGg6IGZ1bmN0aW9uKCkgeyB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOyB9LAogIGxpbmVUbzogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLl9jb250ZXh0LmxpbmVUbyh5LCB4KTsgfSwKICBiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeCwgeSkgeyB0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oeTEsIHgxLCB5MiwgeDIsIHksIHgpOyB9Cn07CgpmdW5jdGlvbiBtb25vdG9uZVgoY29udGV4dCkgewogIHJldHVybiBuZXcgTW9ub3RvbmVYKGNvbnRleHQpOwp9CgpmdW5jdGlvbiBtb25vdG9uZVkoY29udGV4dCkgewogIHJldHVybiBuZXcgTW9ub3RvbmVZKGNvbnRleHQpOwp9CgpmdW5jdGlvbiBOYXR1cmFsKGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKTmF0dXJhbC5wcm90b3R5cGUgPSB7CiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSAwOwogIH0sCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gTmFOOwogIH0sCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3ggPSBbXTsKICAgIHRoaXMuX3kgPSBbXTsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIHggPSB0aGlzLl94LAogICAgICAgIHkgPSB0aGlzLl95LAogICAgICAgIG4gPSB4Lmxlbmd0aDsKCiAgICBpZiAobikgewogICAgICB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeFswXSwgeVswXSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4WzBdLCB5WzBdKTsKICAgICAgaWYgKG4gPT09IDIpIHsKICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzFdLCB5WzFdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcHggPSBjb250cm9sUG9pbnRzKHgpLAogICAgICAgICAgICBweSA9IGNvbnRyb2xQb2ludHMoeSk7CiAgICAgICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDE7IGkxIDwgbjsgKytpMCwgKytpMSkgewogICAgICAgICAgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHB4WzBdW2kwXSwgcHlbMF1baTBdLCBweFsxXVtpMF0sIHB5WzFdW2kwXSwgeFtpMV0sIHlbaTFdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiBuID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICAgIHRoaXMuX3ggPSB0aGlzLl95ID0gbnVsbDsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB0aGlzLl94LnB1c2goK3gpOwogICAgdGhpcy5feS5wdXNoKCt5KTsKICB9Cn07CgovLyBTZWUgaHR0cHM6Ly93d3cucGFydGljbGVpbmNlbGwuY29tLzIwMTIvYmV6aWVyLXNwbGluZXMvIGZvciBkZXJpdmF0aW9uLgpmdW5jdGlvbiBjb250cm9sUG9pbnRzKHgpIHsKICB2YXIgaSwKICAgICAgbiA9IHgubGVuZ3RoIC0gMSwKICAgICAgbSwKICAgICAgYSA9IG5ldyBBcnJheShuKSwKICAgICAgYiA9IG5ldyBBcnJheShuKSwKICAgICAgciA9IG5ldyBBcnJheShuKTsKICBhWzBdID0gMCwgYlswXSA9IDIsIHJbMF0gPSB4WzBdICsgMiAqIHhbMV07CiAgZm9yIChpID0gMTsgaSA8IG4gLSAxOyArK2kpIGFbaV0gPSAxLCBiW2ldID0gNCwgcltpXSA9IDQgKiB4W2ldICsgMiAqIHhbaSArIDFdOwogIGFbbiAtIDFdID0gMiwgYltuIC0gMV0gPSA3LCByW24gLSAxXSA9IDggKiB4W24gLSAxXSArIHhbbl07CiAgZm9yIChpID0gMTsgaSA8IG47ICsraSkgbSA9IGFbaV0gLyBiW2kgLSAxXSwgYltpXSAtPSBtLCByW2ldIC09IG0gKiByW2kgLSAxXTsKICBhW24gLSAxXSA9IHJbbiAtIDFdIC8gYltuIC0gMV07CiAgZm9yIChpID0gbiAtIDI7IGkgPj0gMDsgLS1pKSBhW2ldID0gKHJbaV0gLSBhW2kgKyAxXSkgLyBiW2ldOwogIGJbbiAtIDFdID0gKHhbbl0gKyBhW24gLSAxXSkgLyAyOwogIGZvciAoaSA9IDA7IGkgPCBuIC0gMTsgKytpKSBiW2ldID0gMiAqIHhbaSArIDFdIC0gYVtpICsgMV07CiAgcmV0dXJuIFthLCBiXTsKfQoKdmFyIG5hdHVyYWwgPSBmdW5jdGlvbihjb250ZXh0KSB7CiAgcmV0dXJuIG5ldyBOYXR1cmFsKGNvbnRleHQpOwp9CgpmdW5jdGlvbiBTdGVwKGNvbnRleHQsIHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICB0aGlzLl90ID0gdDsKfQoKU3RlcC5wcm90b3R5cGUgPSB7CiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSAwOwogIH0sCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gTmFOOwogIH0sCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3ggPSB0aGlzLl95ID0gTmFOOwogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAoMCA8IHRoaXMuX3QgJiYgdGhpcy5fdCA8IDEgJiYgdGhpcy5fcG9pbnQgPT09IDIpIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsIHRoaXMuX3kpOwogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgaWYgKHRoaXMuX2xpbmUgPj0gMCkgdGhpcy5fdCA9IDEgLSB0aGlzLl90LCB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgeCA9ICt4LCB5ID0gK3k7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyAvLyBwcm9jZWVkCiAgICAgIGRlZmF1bHQ6IHsKICAgICAgICBpZiAodGhpcy5fdCA8PSAwKSB7CiAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LCB5KTsKICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgeDEgPSB0aGlzLl94ICogKDEgLSB0aGlzLl90KSArIHggKiB0aGlzLl90OwogICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeDEsIHRoaXMuX3kpOwogICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeDEsIHkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdGhpcy5feCA9IHgsIHRoaXMuX3kgPSB5OwogIH0KfTsKCnZhciBzdGVwID0gZnVuY3Rpb24oY29udGV4dCkgewogIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAwLjUpOwp9CgpmdW5jdGlvbiBzdGVwQmVmb3JlKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IFN0ZXAoY29udGV4dCwgMCk7Cn0KCmZ1bmN0aW9uIHN0ZXBBZnRlcihjb250ZXh0KSB7CiAgcmV0dXJuIG5ldyBTdGVwKGNvbnRleHQsIDEpOwp9Cgp2YXIgc2xpY2UkMiA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKCnZhciBub25lID0gZnVuY3Rpb24oc2VyaWVzLCBvcmRlcikgewogIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAxKSkgcmV0dXJuOwogIGZvciAodmFyIGkgPSAxLCBzMCwgczEgPSBzZXJpZXNbb3JkZXJbMF1dLCBuLCBtID0gczEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICBzMCA9IHMxLCBzMSA9IHNlcmllc1tvcmRlcltpXV07CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraikgewogICAgICBzMVtqXVsxXSArPSBzMVtqXVswXSA9IGlzTmFOKHMwW2pdWzFdKSA/IHMwW2pdWzBdIDogczBbal1bMV07CiAgICB9CiAgfQp9Cgp2YXIgbm9uZSQxID0gZnVuY3Rpb24oc2VyaWVzKSB7CiAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLCBvID0gbmV3IEFycmF5KG4pOwogIHdoaWxlICgtLW4gPj0gMCkgb1tuXSA9IG47CiAgcmV0dXJuIG87Cn0KCmZ1bmN0aW9uIHN0YWNrVmFsdWUoZCwga2V5KSB7CiAgcmV0dXJuIGRba2V5XTsKfQoKdmFyIHN0YWNrID0gZnVuY3Rpb24oKSB7CiAgdmFyIGtleXMgPSBjb25zdGFudCQyKFtdKSwKICAgICAgb3JkZXIgPSBub25lJDEsCiAgICAgIG9mZnNldCA9IG5vbmUsCiAgICAgIHZhbHVlID0gc3RhY2tWYWx1ZTsKCiAgZnVuY3Rpb24gc3RhY2soZGF0YSkgewogICAgdmFyIGt6ID0ga2V5cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIGksCiAgICAgICAgbSA9IGRhdGEubGVuZ3RoLAogICAgICAgIG4gPSBrei5sZW5ndGgsCiAgICAgICAgc3ogPSBuZXcgQXJyYXkobiksCiAgICAgICAgb3o7CgogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBmb3IgKHZhciBraSA9IGt6W2ldLCBzaSA9IHN6W2ldID0gbmV3IEFycmF5KG0pLCBqID0gMCwgc2lqOyBqIDwgbTsgKytqKSB7CiAgICAgICAgc2lbal0gPSBzaWogPSBbMCwgK3ZhbHVlKGRhdGFbal0sIGtpLCBqLCBkYXRhKV07CiAgICAgICAgc2lqLmRhdGEgPSBkYXRhW2pdOwogICAgICB9CiAgICAgIHNpLmtleSA9IGtpOwogICAgfQoKICAgIGZvciAoaSA9IDAsIG96ID0gb3JkZXIoc3opOyBpIDwgbjsgKytpKSB7CiAgICAgIHN6W296W2ldXS5pbmRleCA9IGk7CiAgICB9CgogICAgb2Zmc2V0KHN6LCBveik7CiAgICByZXR1cm4gc3o7CiAgfQoKICBzdGFjay5rZXlzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoa2V5cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoc2xpY2UkMi5jYWxsKF8pKSwgc3RhY2spIDoga2V5czsKICB9OwoKICBzdGFjay52YWx1ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMigrXyksIHN0YWNrKSA6IHZhbHVlOwogIH07CgogIHN0YWNrLm9yZGVyID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JkZXIgPSBfID09IG51bGwgPyBub25lJDEgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQyKHNsaWNlJDIuY2FsbChfKSksIHN0YWNrKSA6IG9yZGVyOwogIH07CgogIHN0YWNrLm9mZnNldCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldCA9IF8gPT0gbnVsbCA/IG5vbmUgOiBfLCBzdGFjaykgOiBvZmZzZXQ7CiAgfTsKCiAgcmV0dXJuIHN0YWNrOwp9Cgp2YXIgZXhwYW5kID0gZnVuY3Rpb24oc2VyaWVzLCBvcmRlcikgewogIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSkgcmV0dXJuOwogIGZvciAodmFyIGksIG4sIGogPSAwLCBtID0gc2VyaWVzWzBdLmxlbmd0aCwgeTsgaiA8IG07ICsraikgewogICAgZm9yICh5ID0gaSA9IDA7IGkgPCBuOyArK2kpIHkgKz0gc2VyaWVzW2ldW2pdWzFdIHx8IDA7CiAgICBpZiAoeSkgZm9yIChpID0gMDsgaSA8IG47ICsraSkgc2VyaWVzW2ldW2pdWzFdIC89IHk7CiAgfQogIG5vbmUoc2VyaWVzLCBvcmRlcik7Cn0KCnZhciBzaWxob3VldHRlID0gZnVuY3Rpb24oc2VyaWVzLCBvcmRlcikgewogIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSkgcmV0dXJuOwogIGZvciAodmFyIGogPSAwLCBzMCA9IHNlcmllc1tvcmRlclswXV0sIG4sIG0gPSBzMC5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGkgPSAwLCB5ID0gMDsgaSA8IG47ICsraSkgeSArPSBzZXJpZXNbaV1bal1bMV0gfHwgMDsKICAgIHMwW2pdWzFdICs9IHMwW2pdWzBdID0gLXkgLyAyOwogIH0KICBub25lKHNlcmllcywgb3JkZXIpOwp9Cgp2YXIgd2lnZ2xlID0gZnVuY3Rpb24oc2VyaWVzLCBvcmRlcikgewogIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSB8fCAhKChtID0gKHMwID0gc2VyaWVzW29yZGVyWzBdXSkubGVuZ3RoKSA+IDApKSByZXR1cm47CiAgZm9yICh2YXIgeSA9IDAsIGogPSAxLCBzMCwgbSwgbjsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgaSA9IDAsIHMxID0gMCwgczIgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHZhciBzaSA9IHNlcmllc1tvcmRlcltpXV0sCiAgICAgICAgICBzaWowID0gc2lbal1bMV0gfHwgMCwKICAgICAgICAgIHNpajEgPSBzaVtqIC0gMV1bMV0gfHwgMCwKICAgICAgICAgIHMzID0gKHNpajAgLSBzaWoxKSAvIDI7CiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaTsgKytrKSB7CiAgICAgICAgdmFyIHNrID0gc2VyaWVzW29yZGVyW2tdXSwKICAgICAgICAgICAgc2tqMCA9IHNrW2pdWzFdIHx8IDAsCiAgICAgICAgICAgIHNrajEgPSBza1tqIC0gMV1bMV0gfHwgMDsKICAgICAgICBzMyArPSBza2owIC0gc2tqMTsKICAgICAgfQogICAgICBzMSArPSBzaWowLCBzMiArPSBzMyAqIHNpajA7CiAgICB9CiAgICBzMFtqIC0gMV1bMV0gKz0gczBbaiAtIDFdWzBdID0geTsKICAgIGlmIChzMSkgeSAtPSBzMiAvIHMxOwogIH0KICBzMFtqIC0gMV1bMV0gKz0gczBbaiAtIDFdWzBdID0geTsKICBub25lKHNlcmllcywgb3JkZXIpOwp9Cgp2YXIgYXNjZW5kaW5nJDEgPSBmdW5jdGlvbihzZXJpZXMpIHsKICB2YXIgc3VtcyA9IHNlcmllcy5tYXAoc3VtJDEpOwogIHJldHVybiBub25lJDEoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHN1bXNbYV0gLSBzdW1zW2JdOyB9KTsKfQoKZnVuY3Rpb24gc3VtJDEoc2VyaWVzKSB7CiAgdmFyIHMgPSAwLCBpID0gLTEsIG4gPSBzZXJpZXMubGVuZ3RoLCB2OwogIHdoaWxlICgrK2kgPCBuKSBpZiAodiA9ICtzZXJpZXNbaV1bMV0pIHMgKz0gdjsKICByZXR1cm4gczsKfQoKdmFyIGRlc2NlbmRpbmckMiA9IGZ1bmN0aW9uKHNlcmllcykgewogIHJldHVybiBhc2NlbmRpbmckMShzZXJpZXMpLnJldmVyc2UoKTsKfQoKdmFyIGluc2lkZU91dCA9IGZ1bmN0aW9uKHNlcmllcykgewogIHZhciBuID0gc2VyaWVzLmxlbmd0aCwKICAgICAgaSwKICAgICAgaiwKICAgICAgc3VtcyA9IHNlcmllcy5tYXAoc3VtJDEpLAogICAgICBvcmRlciA9IG5vbmUkMShzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gc3Vtc1tiXSAtIHN1bXNbYV07IH0pLAogICAgICB0b3AgPSAwLAogICAgICBib3R0b20gPSAwLAogICAgICB0b3BzID0gW10sCiAgICAgIGJvdHRvbXMgPSBbXTsKCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgaiA9IG9yZGVyW2ldOwogICAgaWYgKHRvcCA8IGJvdHRvbSkgewogICAgICB0b3AgKz0gc3Vtc1tqXTsKICAgICAgdG9wcy5wdXNoKGopOwogICAgfSBlbHNlIHsKICAgICAgYm90dG9tICs9IHN1bXNbal07CiAgICAgIGJvdHRvbXMucHVzaChqKTsKICAgIH0KICB9CgogIHJldHVybiBib3R0b21zLnJldmVyc2UoKS5jb25jYXQodG9wcyk7Cn0KCnZhciByZXZlcnNlID0gZnVuY3Rpb24oc2VyaWVzKSB7CiAgcmV0dXJuIG5vbmUkMShzZXJpZXMpLnJldmVyc2UoKTsKfQoKdmFyIGRlZmluZSA9IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTsKICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKfQoKZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikgewogIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpOwogIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTsKICByZXR1cm4gcHJvdG90eXBlOwp9CgpmdW5jdGlvbiBDb2xvcigpIHt9Cgp2YXIgZGFya2VyID0gMC43Owp2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyOwoKdmFyIHJlSGV4MyA9IC9eIyhbMC05YS1mXXszfSkkLzsKdmFyIHJlSGV4NiA9IC9eIyhbMC05YS1mXXs2fSkkLzsKdmFyIHJlUmdiSW50ZWdlciA9IC9ecmdiXChccyooWy0rXT9cZCspXHMqLFxzKihbLStdP1xkKylccyosXHMqKFstK10/XGQrKVxzKlwpJC87CnZhciByZVJnYlBlcmNlbnQgPSAvXnJnYlwoXHMqKFstK10/XGQrKD86XC5cZCspPyklXHMqLFxzKihbLStdP1xkKyg/OlwuXGQrKT8pJVxzKixccyooWy0rXT9cZCsoPzpcLlxkKyk/KSVccypcKSQvOwp2YXIgcmVSZ2JhSW50ZWdlciA9IC9ecmdiYVwoXHMqKFstK10/XGQrKVxzKixccyooWy0rXT9cZCspXHMqLFxzKihbLStdP1xkKylccyosXHMqKFstK10/XGQrKD86XC5cZCspPylccypcKSQvOwp2YXIgcmVSZ2JhUGVyY2VudCA9IC9ecmdiYVwoXHMqKFstK10/XGQrKD86XC5cZCspPyklXHMqLFxzKihbLStdP1xkKyg/OlwuXGQrKT8pJVxzKixccyooWy0rXT9cZCsoPzpcLlxkKyk/KSVccyosXHMqKFstK10/XGQrKD86XC5cZCspPylccypcKSQvOwp2YXIgcmVIc2xQZXJjZW50ID0gL15oc2xcKFxzKihbLStdP1xkKyg/OlwuXGQrKT8pXHMqLFxzKihbLStdP1xkKyg/OlwuXGQrKT8pJVxzKixccyooWy0rXT9cZCsoPzpcLlxkKyk/KSVccypcKSQvOwp2YXIgcmVIc2xhUGVyY2VudCA9IC9eaHNsYVwoXHMqKFstK10/XGQrKD86XC5cZCspPylccyosXHMqKFstK10/XGQrKD86XC5cZCspPyklXHMqLFxzKihbLStdP1xkKyg/OlwuXGQrKT8pJVxzKixccyooWy0rXT9cZCsoPzpcLlxkKyk/KVxzKlwpJC87Cgp2YXIgbmFtZWQgPSB7CiAgYWxpY2VibHVlOiAweGYwZjhmZiwKICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogIGFxdWE6IDB4MDBmZmZmLAogIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LAogIGF6dXJlOiAweGYwZmZmZiwKICBiZWlnZTogMHhmNWY1ZGMsCiAgYmlzcXVlOiAweGZmZTRjNCwKICBibGFjazogMHgwMDAwMDAsCiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLAogIGJsdWU6IDB4MDAwMGZmLAogIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogIGJyb3duOiAweGE1MmEyYSwKICBidXJseXdvb2Q6IDB4ZGViODg3LAogIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsCiAgY2hvY29sYXRlOiAweGQyNjkxZSwKICBjb3JhbDogMHhmZjdmNTAsCiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLAogIGNvcm5zaWxrOiAweGZmZjhkYywKICBjcmltc29uOiAweGRjMTQzYywKICBjeWFuOiAweDAwZmZmZiwKICBkYXJrYmx1ZTogMHgwMDAwOGIsCiAgZGFya2N5YW46IDB4MDA4YjhiLAogIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLAogIGRhcmtncmF5OiAweGE5YTlhOSwKICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogIGRhcmtncmV5OiAweGE5YTlhOSwKICBkYXJra2hha2k6IDB4YmRiNzZiLAogIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsCiAgZGFya29yYW5nZTogMHhmZjhjMDAsCiAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgZGFya3JlZDogMHg4YjAwMDAsCiAgZGFya3NhbG1vbjogMHhlOTk2N2EsCiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YiwKICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZiwKICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSwKICBkYXJrdmlvbGV0OiAweDk0MDBkMywKICBkZWVwcGluazogMHhmZjE0OTMsCiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLAogIGRpbWdyYXk6IDB4Njk2OTY5LAogIGRpbWdyZXk6IDB4Njk2OTY5LAogIGRvZGdlcmJsdWU6IDB4MWU5MGZmLAogIGZpcmVicmljazogMHhiMjIyMjIsCiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogIGZvcmVzdGdyZWVuOiAweDIyOGIyMiwKICBmdWNoc2lhOiAweGZmMDBmZiwKICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogIGdob3N0d2hpdGU6IDB4ZjhmOGZmLAogIGdvbGQ6IDB4ZmZkNzAwLAogIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgZ3JheTogMHg4MDgwODAsCiAgZ3JlZW46IDB4MDA4MDAwLAogIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICBncmV5OiAweDgwODA4MCwKICBob25leWRldzogMHhmMGZmZjAsCiAgaG90cGluazogMHhmZjY5YjQsCiAgaW5kaWFucmVkOiAweGNkNWM1YywKICBpbmRpZ286IDB4NGIwMDgyLAogIGl2b3J5OiAweGZmZmZmMCwKICBraGFraTogMHhmMGU2OGMsCiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLAogIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogIGxhd25ncmVlbjogMHg3Y2ZjMDAsCiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCwKICBsaWdodGJsdWU6IDB4YWRkOGU2LAogIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLAogIGxpZ2h0Y3lhbjogMHhlMGZmZmYsCiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogIGxpZ2h0Z3JheTogMHhkM2QzZDMsCiAgbGlnaHRncmVlbjogMHg5MGVlOTAsCiAgbGlnaHRncmV5OiAweGQzZDNkMywKICBsaWdodHBpbms6IDB4ZmZiNmMxLAogIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSwKICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLAogIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSwKICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLAogIGxpZ2h0eWVsbG93OiAweGZmZmZlMCwKICBsaW1lOiAweDAwZmYwMCwKICBsaW1lZ3JlZW46IDB4MzJjZDMyLAogIGxpbmVuOiAweGZhZjBlNiwKICBtYWdlbnRhOiAweGZmMDBmZiwKICBtYXJvb246IDB4ODAwMDAwLAogIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLAogIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsCiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYiwKICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSwKICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsCiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LAogIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsCiAgbWludGNyZWFtOiAweGY1ZmZmYSwKICBtaXN0eXJvc2U6IDB4ZmZlNGUxLAogIG1vY2Nhc2luOiAweGZmZTRiNSwKICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgbmF2eTogMHgwMDAwODAsCiAgb2xkbGFjZTogMHhmZGY1ZTYsCiAgb2xpdmU6IDB4ODA4MDAwLAogIG9saXZlZHJhYjogMHg2YjhlMjMsCiAgb3JhbmdlOiAweGZmYTUwMCwKICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogIG9yY2hpZDogMHhkYTcwZDYsCiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsCiAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSwKICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MywKICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LAogIHBlcnU6IDB4Y2Q4NTNmLAogIHBpbms6IDB4ZmZjMGNiLAogIHBsdW06IDB4ZGRhMGRkLAogIHBvd2RlcmJsdWU6IDB4YjBlMGU2LAogIHB1cnBsZTogMHg4MDAwODAsCiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksCiAgcmVkOiAweGZmMDAwMCwKICByb3N5YnJvd246IDB4YmM4ZjhmLAogIHJveWFsYmx1ZTogMHg0MTY5ZTEsCiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLAogIHNhbG1vbjogMHhmYTgwNzIsCiAgc2FuZHlicm93bjogMHhmNGE0NjAsCiAgc2VhZ3JlZW46IDB4MmU4YjU3LAogIHNlYXNoZWxsOiAweGZmZjVlZSwKICBzaWVubmE6IDB4YTA1MjJkLAogIHNpbHZlcjogMHhjMGMwYzAsCiAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgc2xhdGVibHVlOiAweDZhNWFjZCwKICBzbGF0ZWdyYXk6IDB4NzA4MDkwLAogIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgc25vdzogMHhmZmZhZmEsCiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLAogIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgdGFuOiAweGQyYjQ4YywKICB0ZWFsOiAweDAwODA4MCwKICB0aGlzdGxlOiAweGQ4YmZkOCwKICB0b21hdG86IDB4ZmY2MzQ3LAogIHR1cnF1b2lzZTogMHg0MGUwZDAsCiAgdmlvbGV0OiAweGVlODJlZSwKICB3aGVhdDogMHhmNWRlYjMsCiAgd2hpdGU6IDB4ZmZmZmZmLAogIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogIHllbGxvdzogMHhmZmZmMDAsCiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyCn07CgpkZWZpbmUoQ29sb3IsIGNvbG9yLCB7CiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTsKICB9LAogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJnYigpICsgIiI7CiAgfQp9KTsKCmZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkgewogIHZhciBtOwogIGZvcm1hdCA9IChmb3JtYXQgKyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgcmV0dXJuIChtID0gcmVIZXgzLmV4ZWMoZm9ybWF0KSkgPyAobSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweDBmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkpIC8vICNmMDAKICAgICAgOiAobSA9IHJlSGV4Ni5leGVjKGZvcm1hdCkpID8gcmdibihwYXJzZUludChtWzFdLCAxNikpIC8vICNmZjAwMDAKICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKQogICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpCiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKQogICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKQogICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkKICAgICAgOiBmb3JtYXQgPT09ICJ0cmFuc3BhcmVudCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApCiAgICAgIDogbnVsbDsKfQoKZnVuY3Rpb24gcmdibihuKSB7CiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTsKfQoKZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7CiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpOwp9CgpmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHsKICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7CiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjsKICBvID0gby5yZ2IoKTsKICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwp9CgpmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwp9CgpmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkgewogIHRoaXMuciA9ICtyOwogIHRoaXMuZyA9ICtnOwogIHRoaXMuYiA9ICtiOwogIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5Owp9CgpkZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwgewogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsKICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7CiAgfSwKICByZ2I6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gKDAgPD0gdGhpcy5yICYmIHRoaXMuciA8PSAyNTUpCiAgICAgICAgJiYgKDAgPD0gdGhpcy5nICYmIHRoaXMuZyA8PSAyNTUpCiAgICAgICAgJiYgKDAgPD0gdGhpcy5iICYmIHRoaXMuYiA8PSAyNTUpCiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsKICB9LAogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOwogICAgcmV0dXJuIChhID09PSAxID8gInJnYigiIDogInJnYmEoIikKICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmcpIHx8IDApKSArICIsICIKICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmIpIHx8IDApKQogICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgfQp9KSk7CgpmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47CiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47CiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOOwogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpOwp9CgpmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHsKICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7CiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDsKICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87CiAgbyA9IG8ucmdiKCk7CiAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgaCA9IE5hTiwKICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICBpZiAocykgewogICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7CiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7CiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwogICAgaCAqPSA2MDsKICB9IGVsc2UgewogICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAgfQogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgdGhpcy5oID0gK2g7CiAgdGhpcy5zID0gK3M7CiAgdGhpcy5sID0gK2w7CiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7Cn0KCmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7CiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTsKICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsKICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgcmdiOiBmdW5jdGlvbigpIHsKICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICBsID0gdGhpcy5sLAogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSwKICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLAogICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSwKICAgICAgdGhpcy5vcGFjaXR5CiAgICApOwogIH0sCiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKQogICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSkKICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogIH0KfSkpOwoKLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqLwpmdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikgewogIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjAKICAgICAgOiBoIDwgMTgwID8gbTIKICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MAogICAgICA6IG0xKSAqIDI1NTsKfQoKdmFyIGRlZzJyYWQgPSBNYXRoLlBJIC8gMTgwOwp2YXIgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7Cgp2YXIgS24gPSAxODsKdmFyIFhuID0gMC45NTA0NzA7CnZhciBZbiA9IDE7CnZhciBabiA9IDEuMDg4ODMwOwp2YXIgdDAgPSA0IC8gMjk7CnZhciB0MSA9IDYgLyAyOTsKdmFyIHQyID0gMyAqIHQxICogdDE7CnZhciB0MyA9IHQxICogdDEgKiB0MTsKCmZ1bmN0aW9uIGxhYkNvbnZlcnQobykgewogIGlmIChvIGluc3RhbmNlb2YgTGFiKSByZXR1cm4gbmV3IExhYihvLmwsIG8uYSwgby5iLCBvLm9wYWNpdHkpOwogIGlmIChvIGluc3RhbmNlb2YgSGNsKSB7CiAgICB2YXIgaCA9IG8uaCAqIGRlZzJyYWQ7CiAgICByZXR1cm4gbmV3IExhYihvLmwsIE1hdGguY29zKGgpICogby5jLCBNYXRoLnNpbihoKSAqIG8uYywgby5vcGFjaXR5KTsKICB9CiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pOwogIHZhciBiID0gcmdiMnh5eihvLnIpLAogICAgICBhID0gcmdiMnh5eihvLmcpLAogICAgICBsID0gcmdiMnh5eihvLmIpLAogICAgICB4ID0geHl6MmxhYigoMC40MTI0NTY0ICogYiArIDAuMzU3NTc2MSAqIGEgKyAwLjE4MDQzNzUgKiBsKSAvIFhuKSwKICAgICAgeSA9IHh5ejJsYWIoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiksCiAgICAgIHogPSB4eXoybGFiKCgwLjAxOTMzMzkgKiBiICsgMC4xMTkxOTIwICogYSArIDAuOTUwMzA0MSAqIGwpIC8gWm4pOwogIHJldHVybiBuZXcgTGFiKDExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KSwgby5vcGFjaXR5KTsKfQoKZnVuY3Rpb24gbGFiKGwsIGEsIGIsIG9wYWNpdHkpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQobCkgOiBuZXcgTGFiKGwsIGEsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKfQoKZnVuY3Rpb24gTGFiKGwsIGEsIGIsIG9wYWNpdHkpIHsKICB0aGlzLmwgPSArbDsKICB0aGlzLmEgPSArYTsKICB0aGlzLmIgPSArYjsKICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKfQoKZGVmaW5lKExhYiwgbGFiLCBleHRlbmQoQ29sb3IsIHsKICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICB9LAogIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sIC0gS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICB9LAogIHJnYjogZnVuY3Rpb24oKSB7CiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsCiAgICAgICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCwKICAgICAgICB6ID0gaXNOYU4odGhpcy5iKSA/IHkgOiB5IC0gdGhpcy5iIC8gMjAwOwogICAgeSA9IFluICogbGFiMnh5eih5KTsKICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7CiAgICB6ID0gWm4gKiBsYWIyeHl6KHopOwogICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIHh5ejJyZ2IoIDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCCiAgICAgIHh5ejJyZ2IoLTAuOTY5MjY2MCAqIHggKyAxLjg3NjAxMDggKiB5ICsgMC4wNDE1NTYwICogeiksCiAgICAgIHh5ejJyZ2IoIDAuMDU1NjQzNCAqIHggLSAwLjIwNDAyNTkgKiB5ICsgMS4wNTcyMjUyICogeiksCiAgICAgIHRoaXMub3BhY2l0eQogICAgKTsKICB9Cn0pKTsKCmZ1bmN0aW9uIHh5ejJsYWIodCkgewogIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDsKfQoKZnVuY3Rpb24gbGFiMnh5eih0KSB7CiAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7Cn0KCmZ1bmN0aW9uIHh5ejJyZ2IoeCkgewogIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpOwp9CgpmdW5jdGlvbiByZ2IyeHl6KHgpIHsKICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTsKfQoKZnVuY3Rpb24gaGNsQ29udmVydChvKSB7CiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBuZXcgSGNsKG8uaCwgby5jLCBvLmwsIG8ub3BhY2l0eSk7CiAgaWYgKCEobyBpbnN0YW5jZW9mIExhYikpIG8gPSBsYWJDb252ZXJ0KG8pOwogIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiByYWQyZGVnOwogIHJldHVybiBuZXcgSGNsKGggPCAwID8gaCArIDM2MCA6IGgsIE1hdGguc3FydChvLmEgKiBvLmEgKyBvLmIgKiBvLmIpLCBvLmwsIG8ub3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIGhjbChoLCBjLCBsLCBvcGFjaXR5KSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGgpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIEhjbChoLCBjLCBsLCBvcGFjaXR5KSB7CiAgdGhpcy5oID0gK2g7CiAgdGhpcy5jID0gK2M7CiAgdGhpcy5sID0gK2w7CiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7Cn0KCmRlZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7CiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7CiAgfSwKICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgLSBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7CiAgfSwKICByZ2I6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGxhYkNvbnZlcnQodGhpcykucmdiKCk7CiAgfQp9KSk7Cgp2YXIgQSA9IC0wLjE0ODYxOwp2YXIgQiA9ICsxLjc4Mjc3Owp2YXIgQyA9IC0wLjI5MjI3Owp2YXIgRCA9IC0wLjkwNjQ5Owp2YXIgRSA9ICsxLjk3Mjk0Owp2YXIgRUQgPSBFICogRDsKdmFyIEVCID0gRSAqIEI7CnZhciBCQ19EQSA9IEIgKiBDIC0gRCAqIEE7CgpmdW5jdGlvbiBjdWJlaGVsaXhDb252ZXJ0KG8pIHsKICBpZiAobyBpbnN0YW5jZW9mIEN1YmVoZWxpeCkgcmV0dXJuIG5ldyBDdWJlaGVsaXgoby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7CiAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIGwgPSAoQkNfREEgKiBiICsgRUQgKiByIC0gRUIgKiBnKSAvIChCQ19EQSArIEVEIC0gRUIpLAogICAgICBibCA9IGIgLSBsLAogICAgICBrID0gKEUgKiAoZyAtIGwpIC0gQyAqIGJsKSAvIEQsCiAgICAgIHMgPSBNYXRoLnNxcnQoayAqIGsgKyBibCAqIGJsKSAvIChFICogbCAqICgxIC0gbCkpLCAvLyBOYU4gaWYgbD0wIG9yIGw9MQogICAgICBoID0gcyA/IE1hdGguYXRhbjIoaywgYmwpICogcmFkMmRlZyAtIDEyMCA6IE5hTjsKICByZXR1cm4gbmV3IEN1YmVoZWxpeChoIDwgMCA/IGggKyAzNjAgOiBoLCBzLCBsLCBvLm9wYWNpdHkpOwp9CgpmdW5jdGlvbiBjdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY3ViZWhlbGl4Q29udmVydChoKSA6IG5ldyBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwp9CgpmdW5jdGlvbiBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkgewogIHRoaXMuaCA9ICtoOwogIHRoaXMucyA9ICtzOwogIHRoaXMubCA9ICtsOwogIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5Owp9CgpkZWZpbmUoQ3ViZWhlbGl4LCBjdWJlaGVsaXgsIGV4dGVuZChDb2xvciwgewogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICB9LAogIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7CiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICB9LAogIHJnYjogZnVuY3Rpb24oKSB7CiAgICB2YXIgaCA9IGlzTmFOKHRoaXMuaCkgPyAwIDogKHRoaXMuaCArIDEyMCkgKiBkZWcycmFkLAogICAgICAgIGwgPSArdGhpcy5sLAogICAgICAgIGEgPSBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyAqIGwgKiAoMSAtIGwpLAogICAgICAgIGNvc2ggPSBNYXRoLmNvcyhoKSwKICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7CiAgICByZXR1cm4gbmV3IFJnYigKICAgICAgMjU1ICogKGwgKyBhICogKEEgKiBjb3NoICsgQiAqIHNpbmgpKSwKICAgICAgMjU1ICogKGwgKyBhICogKEMgKiBjb3NoICsgRCAqIHNpbmgpKSwKICAgICAgMjU1ICogKGwgKyBhICogKEUgKiBjb3NoKSksCiAgICAgIHRoaXMub3BhY2l0eQogICAgKTsKICB9Cn0pKTsKCmZ1bmN0aW9uIGJhc2lzJDEodDEsIHYwLCB2MSwgdjIsIHYzKSB7CiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxOwogIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MAogICAgICArICg0IC0gNiAqIHQyICsgMyAqIHQzKSAqIHYxCiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjIKICAgICAgKyB0MyAqIHYzKSAvIDY7Cn0KCnZhciBiYXNpcyQyID0gZnVuY3Rpb24odmFsdWVzKSB7CiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSwKICAgICAgICB2MSA9IHZhbHVlc1tpXSwKICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sCiAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MiwKICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTsKICAgIHJldHVybiBiYXNpcyQxKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpOwogIH07Cn0KCnZhciBiYXNpc0Nsb3NlZCQxID0gZnVuY3Rpb24odmFsdWVzKSB7CiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoOwogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksCiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSwKICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sCiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLAogICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTsKICAgIHJldHVybiBiYXNpcyQxKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpOwogIH07Cn0KCnZhciBjb25zdGFudCQzID0gZnVuY3Rpb24oeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCmZ1bmN0aW9uIGxpbmVhciQxKGEsIGQpIHsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgcmV0dXJuIGEgKyB0ICogZDsKICB9Owp9CgpmdW5jdGlvbiBleHBvbmVudGlhbCQxKGEsIGIsIHkpIHsKICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOwogIH07Cn0KCmZ1bmN0aW9uIGh1ZShhLCBiKSB7CiAgdmFyIGQgPSBiIC0gYTsKICByZXR1cm4gZCA/IGxpbmVhciQxKGEsIGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpIDogY29uc3RhbnQkMyhpc05hTihhKSA/IGIgOiBhKTsKfQoKZnVuY3Rpb24gZ2FtbWEoeSkgewogIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7CiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbCQxKGEsIGIsIHkpIDogY29uc3RhbnQkMyhpc05hTihhKSA/IGIgOiBhKTsKICB9Owp9CgpmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHsKICB2YXIgZCA9IGIgLSBhOwogIHJldHVybiBkID8gbGluZWFyJDEoYSwgZCkgOiBjb25zdGFudCQzKGlzTmFOKGEpID8gYiA6IGEpOwp9Cgp2YXIgaW50ZXJwb2xhdGVSZ2IgPSAoZnVuY3Rpb24gcmdiR2FtbWEoeSkgewogIHZhciBjb2xvciQkMSA9IGdhbW1hKHkpOwoKICBmdW5jdGlvbiByZ2IkJDEoc3RhcnQsIGVuZCkgewogICAgdmFyIHIgPSBjb2xvciQkMSgoc3RhcnQgPSByZ2Ioc3RhcnQpKS5yLCAoZW5kID0gcmdiKGVuZCkpLnIpLAogICAgICAgIGcgPSBjb2xvciQkMShzdGFydC5nLCBlbmQuZyksCiAgICAgICAgYiA9IGNvbG9yJCQxKHN0YXJ0LmIsIGVuZC5iKSwKICAgICAgICBvcGFjaXR5ID0gY29sb3IkJDEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgIHN0YXJ0LmcgPSBnKHQpOwogICAgICBzdGFydC5iID0gYih0KTsKICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgIHJldHVybiBzdGFydCArICIiOwogICAgfTsKICB9CgogIHJnYiQkMS5nYW1tYSA9IHJnYkdhbW1hOwoKICByZXR1cm4gcmdiJCQxOwp9KSgxKTsKCmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHsKICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7CiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsCiAgICAgICAgciA9IG5ldyBBcnJheShuKSwKICAgICAgICBnID0gbmV3IEFycmF5KG4pLAogICAgICAgIGIgPSBuZXcgQXJyYXkobiksCiAgICAgICAgaSwgY29sb3IkJDE7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGNvbG9yJCQxID0gcmdiKGNvbG9yc1tpXSk7CiAgICAgIHJbaV0gPSBjb2xvciQkMS5yIHx8IDA7CiAgICAgIGdbaV0gPSBjb2xvciQkMS5nIHx8IDA7CiAgICAgIGJbaV0gPSBjb2xvciQkMS5iIHx8IDA7CiAgICB9CiAgICByID0gc3BsaW5lKHIpOwogICAgZyA9IHNwbGluZShnKTsKICAgIGIgPSBzcGxpbmUoYik7CiAgICBjb2xvciQkMS5vcGFjaXR5ID0gMTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIGNvbG9yJCQxLnIgPSByKHQpOwogICAgICBjb2xvciQkMS5nID0gZyh0KTsKICAgICAgY29sb3IkJDEuYiA9IGIodCk7CiAgICAgIHJldHVybiBjb2xvciQkMSArICIiOwogICAgfTsKICB9Owp9Cgp2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMkMik7CnZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCQxKTsKCnZhciBhcnJheSQxID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsCiAgICAgIG5hID0gYSA/IE1hdGgubWluKG5iLCBhLmxlbmd0aCkgOiAwLAogICAgICB4ID0gbmV3IEFycmF5KG5iKSwKICAgICAgYyA9IG5ldyBBcnJheShuYiksCiAgICAgIGk7CgogIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gaW50ZXJwb2xhdGUoYVtpXSwgYltpXSk7CiAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTsKCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSBjW2ldID0geFtpXSh0KTsKICAgIHJldHVybiBjOwogIH07Cn0KCnZhciBkYXRlID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBkID0gbmV3IERhdGU7CiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKyBiICogdCksIGQ7CiAgfTsKfQoKdmFyIGludGVycG9sYXRlTnVtYmVyID0gZnVuY3Rpb24oYSwgYikgewogIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkgewogICAgcmV0dXJuIGEgKyBiICogdDsKICB9Owp9Cgp2YXIgb2JqZWN0ID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBpID0ge30sCiAgICAgIGMgPSB7fSwKICAgICAgazsKCiAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09ICJvYmplY3QiKSBhID0ge307CiAgaWYgKGIgPT09IG51bGwgfHwgdHlwZW9mIGIgIT09ICJvYmplY3QiKSBiID0ge307CgogIGZvciAoayBpbiBiKSB7CiAgICBpZiAoayBpbiBhKSB7CiAgICAgIGlba10gPSBpbnRlcnBvbGF0ZShhW2tdLCBiW2tdKTsKICAgIH0gZWxzZSB7CiAgICAgIGNba10gPSBiW2tdOwogICAgfQogIH0KCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTsKICAgIHJldHVybiBjOwogIH07Cn0KCnZhciByZUEgPSAvWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2c7CnZhciByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsICJnIik7CgpmdW5jdGlvbiB6ZXJvKGIpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gYjsKICB9Owp9CgpmdW5jdGlvbiBvbmUoYikgewogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gYih0KSArICIiOwogIH07Cn0KCnZhciBpbnRlcnBvbGF0ZVN0cmluZyA9IGZ1bmN0aW9uKGEsIGIpIHsKICB2YXIgYmkgPSByZUEubGFzdEluZGV4ID0gcmVCLmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGIKICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYQogICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiCiAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueQogICAgICBpID0gLTEsIC8vIGluZGV4IGluIHMKICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMKICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycwoKICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuCiAgYSA9IGEgKyAiIiwgYiA9IGIgKyAiIjsKCiAgLy8gSW50ZXJwb2xhdGUgcGFpcnMgb2YgbnVtYmVycyBpbiBhICYgYi4KICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpCiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkgewogICAgaWYgKChicyA9IGJtLmluZGV4KSA+IGJpKSB7IC8vIGEgc3RyaW5nIHByZWNlZGVzIHRoZSBuZXh0IG51bWJlciBpbiBiCiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcKICAgICAgZWxzZSBzWysraV0gPSBiczsKICAgIH0KICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoCiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICBlbHNlIHNbKytpXSA9IGJtOwogICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnMKICAgICAgc1srK2ldID0gbnVsbDsKICAgICAgcS5wdXNoKHtpOiBpLCB4OiBpbnRlcnBvbGF0ZU51bWJlcihhbSwgYm0pfSk7CiAgICB9CiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7CiAgfQoKICAvLyBBZGQgcmVtYWlucyBvZiBiLgogIGlmIChiaSA8IGIubGVuZ3RoKSB7CiAgICBicyA9IGIuc2xpY2UoYmkpOwogICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICBlbHNlIHNbKytpXSA9IGJzOwogIH0KCiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy4KICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF0KICAgICAgPyBvbmUocVswXS54KQogICAgICA6IHplcm8oYikpCiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkgewogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICAgIH0pOwp9Cgp2YXIgaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihhLCBiKSB7CiAgdmFyIHQgPSB0eXBlb2YgYiwgYzsKICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09ICJib29sZWFuIiA/IGNvbnN0YW50JDMoYikKICAgICAgOiAodCA9PT0gIm51bWJlciIgPyBpbnRlcnBvbGF0ZU51bWJlcgogICAgICA6IHQgPT09ICJzdHJpbmciID8gKChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYikgOiBpbnRlcnBvbGF0ZVN0cmluZykKICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYgogICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZQogICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBhcnJheSQxCiAgICAgIDogaXNOYU4oYikgPyBvYmplY3QKICAgICAgOiBpbnRlcnBvbGF0ZU51bWJlcikoYSwgYik7Cn0KCnZhciBpbnRlcnBvbGF0ZVJvdW5kID0gZnVuY3Rpb24oYSwgYikgewogIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkgewogICAgcmV0dXJuIE1hdGgucm91bmQoYSArIGIgKiB0KTsKICB9Owp9Cgp2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7Cgp2YXIgaWRlbnRpdHkkMiA9IHsKICB0cmFuc2xhdGVYOiAwLAogIHRyYW5zbGF0ZVk6IDAsCiAgcm90YXRlOiAwLAogIHNrZXdYOiAwLAogIHNjYWxlWDogMSwKICBzY2FsZVk6IDEKfTsKCnZhciBkZWNvbXBvc2UgPSBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7CiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDsKICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7CiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYOwogIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7CiAgcmV0dXJuIHsKICAgIHRyYW5zbGF0ZVg6IGUsCiAgICB0cmFuc2xhdGVZOiBmLAogICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcywKICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcywKICAgIHNjYWxlWDogc2NhbGVYLAogICAgc2NhbGVZOiBzY2FsZVkKICB9Owp9Cgp2YXIgY3NzTm9kZTsKdmFyIGNzc1Jvb3Q7CnZhciBjc3NWaWV3Owp2YXIgc3ZnTm9kZTsKCmZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7CiAgaWYgKHZhbHVlID09PSAibm9uZSIpIHJldHVybiBpZGVudGl0eSQyOwogIGlmICghY3NzTm9kZSkgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLCBjc3NSb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBjc3NWaWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7CiAgY3NzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB2YWx1ZTsKICB2YWx1ZSA9IGNzc1ZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290LmFwcGVuZENoaWxkKGNzc05vZGUpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsKICBjc3NSb290LnJlbW92ZUNoaWxkKGNzc05vZGUpOwogIHZhbHVlID0gdmFsdWUuc2xpY2UoNywgLTEpLnNwbGl0KCIsIik7CiAgcmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sICt2YWx1ZVsxXSwgK3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsKfQoKZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHsKICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5JDI7CiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJnIik7CiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHZhbHVlKTsKICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eSQyOwogIHZhbHVlID0gdmFsdWUubWF0cml4OwogIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7Cn0KCmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikgewoKICBmdW5jdGlvbiBwb3AocykgewogICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArICIgIiA6ICIiOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7CiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBpbnRlcnBvbGF0ZU51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlcih5YSwgeWIpfSk7CiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7CiAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHsKICAgIGlmIChhICE9PSBiKSB7CiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aAogICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyKGEsIGIpfSk7CiAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiArIGIgKyBkZWdQYXJlbik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7CiAgICBpZiAoYSAhPT0gYikgewogICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAic2tld1goIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIoYSwgYil9KTsKICAgIH0gZWxzZSBpZiAoYikgewogICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7CiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArICJzY2FsZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGludGVycG9sYXRlTnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyKHlhLCB5Yil9KTsKICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHsKICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycwogICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTsKICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpOwogICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7CiAgICBhID0gYiA9IG51bGw7IC8vIGdjCiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87CiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CiAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgfTsKICB9Owp9Cgp2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgInB4LCAiLCAicHgpIiwgImRlZykiKTsKdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIsICIpIiwgIikiKTsKCnZhciByaG8gPSBNYXRoLlNRUlQyOwp2YXIgcmhvMiA9IDI7CnZhciByaG80ID0gNDsKdmFyIGVwc2lsb24yID0gMWUtMTI7CgpmdW5jdGlvbiBjb3NoKHgpIHsKICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsKfQoKZnVuY3Rpb24gc2luaCh4KSB7CiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7Cn0KCmZ1bmN0aW9uIHRhbmgoeCkgewogIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpOwp9CgovLyBwMCA9IFt1eDAsIHV5MCwgdzBdCi8vIHAxID0gW3V4MSwgdXkxLCB3MV0KdmFyIGludGVycG9sYXRlWm9vbSA9IGZ1bmN0aW9uKHAwLCBwMSkgewogIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sCiAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSwKICAgICAgZHggPSB1eDEgLSB1eDAsCiAgICAgIGR5ID0gdXkxIC0gdXkwLAogICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LAogICAgICBpLAogICAgICBTOwoKICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIMOiwonChSB1MS4KICBpZiAoZDIgPCBlcHNpbG9uMikgewogICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvOwogICAgaSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICB1eDAgKyB0ICogZHgsCiAgICAgICAgdXkwICsgdCAqIGR5LAogICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpCiAgICAgIF07CiAgICB9CiAgfQoKICAvLyBHZW5lcmFsIGNhc2UuCiAgZWxzZSB7CiAgICB2YXIgZDEgPSBNYXRoLnNxcnQoZDIpLAogICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLAogICAgICAgIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gcmhvNCAqIGQyKSAvICgyICogdzEgKiByaG8yICogZDEpLAogICAgICAgIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSwKICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7CiAgICBTID0gKHIxIC0gcjApIC8gcmhvOwogICAgaSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdmFyIHMgPSB0ICogUywKICAgICAgICAgIGNvc2hyMCA9IGNvc2gocjApLAogICAgICAgICAgdSA9IHcwIC8gKHJobzIgKiBkMSkgKiAoY29zaHIwICogdGFuaChyaG8gKiBzICsgcjApIC0gc2luaChyMCkpOwogICAgICByZXR1cm4gWwogICAgICAgIHV4MCArIHUgKiBkeCwKICAgICAgICB1eTAgKyB1ICogZHksCiAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMCkKICAgICAgXTsKICAgIH0KICB9CgogIGkuZHVyYXRpb24gPSBTICogMTAwMDsKCiAgcmV0dXJuIGk7Cn0KCmZ1bmN0aW9uIGhzbCQxKGh1ZSQkMSkgewogIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICB2YXIgaCA9IGh1ZSQkMSgoc3RhcnQgPSBoc2woc3RhcnQpKS5oLCAoZW5kID0gaHNsKGVuZCkpLmgpLAogICAgICAgIHMgPSBub2dhbW1hKHN0YXJ0LnMsIGVuZC5zKSwKICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksCiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgc3RhcnQuaCA9IGgodCk7CiAgICAgIHN0YXJ0LnMgPSBzKHQpOwogICAgICBzdGFydC5sID0gbCh0KTsKICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgIHJldHVybiBzdGFydCArICIiOwogICAgfTsKICB9Cn0KCnZhciBoc2wkMiA9IGhzbCQxKGh1ZSk7CnZhciBoc2xMb25nID0gaHNsJDEobm9nYW1tYSk7CgpmdW5jdGlvbiBsYWIkMShzdGFydCwgZW5kKSB7CiAgdmFyIGwgPSBub2dhbW1hKChzdGFydCA9IGxhYihzdGFydCkpLmwsIChlbmQgPSBsYWIoZW5kKSkubCksCiAgICAgIGEgPSBub2dhbW1hKHN0YXJ0LmEsIGVuZC5hKSwKICAgICAgYiA9IG5vZ2FtbWEoc3RhcnQuYiwgZW5kLmIpLAogICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHN0YXJ0LmwgPSBsKHQpOwogICAgc3RhcnQuYSA9IGEodCk7CiAgICBzdGFydC5iID0gYih0KTsKICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgfTsKfQoKZnVuY3Rpb24gaGNsJDEoaHVlJCQxKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGhjbChzdGFydCkpLmgsIChlbmQgPSBoY2woZW5kKSkuaCksCiAgICAgICAgYyA9IG5vZ2FtbWEoc3RhcnQuYywgZW5kLmMpLAogICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwKICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICBzdGFydC5oID0gaCh0KTsKICAgICAgc3RhcnQuYyA9IGModCk7CiAgICAgIHN0YXJ0LmwgPSBsKHQpOwogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICB9OwogIH0KfQoKdmFyIGhjbCQyID0gaGNsJDEoaHVlKTsKdmFyIGhjbExvbmcgPSBoY2wkMShub2dhbW1hKTsKCmZ1bmN0aW9uIGN1YmVoZWxpeCQxKGh1ZSQkMSkgewogIHJldHVybiAoZnVuY3Rpb24gY3ViZWhlbGl4R2FtbWEoeSkgewogICAgeSA9ICt5OwoKICAgIGZ1bmN0aW9uIGN1YmVoZWxpeCQkMShzdGFydCwgZW5kKSB7CiAgICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGN1YmVoZWxpeChzdGFydCkpLmgsIChlbmQgPSBjdWJlaGVsaXgoZW5kKSkuaCksCiAgICAgICAgICBzID0gbm9nYW1tYShzdGFydC5zLCBlbmQucyksCiAgICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksCiAgICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgc3RhcnQuaCA9IGgodCk7CiAgICAgICAgc3RhcnQucyA9IHModCk7CiAgICAgICAgc3RhcnQubCA9IGwoTWF0aC5wb3codCwgeSkpOwogICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgICAgIHJldHVybiBzdGFydCArICIiOwogICAgICB9OwogICAgfQoKICAgIGN1YmVoZWxpeCQkMS5nYW1tYSA9IGN1YmVoZWxpeEdhbW1hOwoKICAgIHJldHVybiBjdWJlaGVsaXgkJDE7CiAgfSkoMSk7Cn0KCnZhciBjdWJlaGVsaXgkMiA9IGN1YmVoZWxpeCQxKGh1ZSk7CnZhciBjdWJlaGVsaXhMb25nID0gY3ViZWhlbGl4JDEobm9nYW1tYSk7Cgp2YXIgcXVhbnRpemUgPSBmdW5jdGlvbihpbnRlcnBvbGF0b3IsIG4pIHsKICB2YXIgc2FtcGxlcyA9IG5ldyBBcnJheShuKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgc2FtcGxlc1tpXSA9IGludGVycG9sYXRvcihpIC8gKG4gLSAxKSk7CiAgcmV0dXJuIHNhbXBsZXM7Cn0KCnZhciBub29wJDEgPSB7dmFsdWU6IGZ1bmN0aW9uKCkge319OwoKZnVuY3Rpb24gZGlzcGF0Y2goKSB7CiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHsKICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyAiIikgfHwgKHQgaW4gXykpIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiICsgdCk7CiAgICBfW3RdID0gW107CiAgfQogIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7Cn0KCmZ1bmN0aW9uIERpc3BhdGNoKF8pIHsKICB0aGlzLl8gPSBfOwp9CgpmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7CiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdCk7CiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogIH0pOwp9CgpEaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IERpc3BhdGNoLAogIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHsKICAgIHZhciBfID0gdGhpcy5fLAogICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArICIiLCBfKSwKICAgICAgICB0LAogICAgICAgIGkgPSAtMSwKICAgICAgICBuID0gVC5sZW5ndGg7CgogICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuCiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIiArIGNhbGxiYWNrKTsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldCQyKF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTsKICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQkMihfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAogIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXzsKICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTsKICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7CiAgfSwKICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7CiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07CiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTsKICB9LAogIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7CiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgfQp9OwoKZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHsKICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7CiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7CiAgICAgIHJldHVybiBjLnZhbHVlOwogICAgfQogIH0KfQoKZnVuY3Rpb24gc2V0JDIodHlwZSwgbmFtZSwgY2FsbGJhY2spIHsKICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgIHR5cGVbaV0gPSBub29wJDEsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTsKICByZXR1cm4gdHlwZTsKfQoKZnVuY3Rpb24gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpIHsKICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwgInJldHVybiB7IiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uKG5hbWUsIGkpIHsKICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArICI6IGRbIiArIGkgKyAiXSI7CiAgfSkuam9pbigiLCIpICsgIn0iKTsKfQoKZnVuY3Rpb24gY3VzdG9tQ29udmVydGVyKGNvbHVtbnMsIGYpIHsKICB2YXIgb2JqZWN0ID0gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpOwogIHJldHVybiBmdW5jdGlvbihyb3csIGkpIHsKICAgIHJldHVybiBmKG9iamVjdChyb3cpLCBpLCBjb2x1bW5zKTsKICB9Owp9CgovLyBDb21wdXRlIHVuaXF1ZSBjb2x1bW5zIGluIG9yZGVyIG9mIGRpc2NvdmVyeS4KZnVuY3Rpb24gaW5mZXJDb2x1bW5zKHJvd3MpIHsKICB2YXIgY29sdW1uU2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKSwKICAgICAgY29sdW1ucyA9IFtdOwoKICByb3dzLmZvckVhY2goZnVuY3Rpb24ocm93KSB7CiAgICBmb3IgKHZhciBjb2x1bW4gaW4gcm93KSB7CiAgICAgIGlmICghKGNvbHVtbiBpbiBjb2x1bW5TZXQpKSB7CiAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtblNldFtjb2x1bW5dID0gY29sdW1uKTsKICAgICAgfQogICAgfQogIH0pOwoKICByZXR1cm4gY29sdW1uczsKfQoKdmFyIGRzdiA9IGZ1bmN0aW9uKGRlbGltaXRlcikgewogIHZhciByZUZvcm1hdCA9IG5ldyBSZWdFeHAoIltcIiIgKyBkZWxpbWl0ZXIgKyAiXG5dIiksCiAgICAgIGRlbGltaXRlckNvZGUgPSBkZWxpbWl0ZXIuY2hhckNvZGVBdCgwKTsKCiAgZnVuY3Rpb24gcGFyc2UodGV4dCwgZikgewogICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3MgPSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7CiAgICAgIGlmIChjb252ZXJ0KSByZXR1cm4gY29udmVydChyb3csIGkgLSAxKTsKICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpOwogICAgfSk7CiAgICByb3dzLmNvbHVtbnMgPSBjb2x1bW5zOwogICAgcmV0dXJuIHJvd3M7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVJvd3ModGV4dCwgZikgewogICAgdmFyIEVPTCA9IHt9LCAvLyBzZW50aW5lbCB2YWx1ZSBmb3IgZW5kLW9mLWxpbmUKICAgICAgICBFT0YgPSB7fSwgLy8gc2VudGluZWwgdmFsdWUgZm9yIGVuZC1vZi1maWxlCiAgICAgICAgcm93cyA9IFtdLCAvLyBvdXRwdXQgcm93cwogICAgICAgIE4gPSB0ZXh0Lmxlbmd0aCwKICAgICAgICBJID0gMCwgLy8gY3VycmVudCBjaGFyYWN0ZXIgaW5kZXgKICAgICAgICBuID0gMCwgLy8gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIKICAgICAgICB0LCAvLyB0aGUgY3VycmVudCB0b2tlbgogICAgICAgIGVvbDsgLy8gaXMgdGhlIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9MPwoKICAgIGZ1bmN0aW9uIHRva2VuKCkgewogICAgICBpZiAoSSA+PSBOKSByZXR1cm4gRU9GOyAvLyBzcGVjaWFsIGNhc2U6IGVuZCBvZiBmaWxlCiAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MOyAvLyBzcGVjaWFsIGNhc2U6IGVuZCBvZiBsaW5lCgogICAgICAvLyBzcGVjaWFsIGNhc2U6IHF1b3RlcwogICAgICB2YXIgaiA9IEksIGM7CiAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IDM0KSB7CiAgICAgICAgdmFyIGkgPSBqOwogICAgICAgIHdoaWxlIChpKysgPCBOKSB7CiAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkpID09PSAzNCkgewogICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAxKSAhPT0gMzQpIGJyZWFrOwogICAgICAgICAgICArK2k7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEkgPSBpICsgMjsKICAgICAgICBjID0gdGV4dC5jaGFyQ29kZUF0KGkgKyAxKTsKICAgICAgICBpZiAoYyA9PT0gMTMpIHsKICAgICAgICAgIGVvbCA9IHRydWU7CiAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAyKSA9PT0gMTApICsrSTsKICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDEwKSB7CiAgICAgICAgICBlb2wgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSkucmVwbGFjZSgvIiIvZywgIlwiIik7CiAgICAgIH0KCiAgICAgIC8vIGNvbW1vbiBjYXNlOiBmaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUKICAgICAgd2hpbGUgKEkgPCBOKSB7CiAgICAgICAgdmFyIGsgPSAxOwogICAgICAgIGMgPSB0ZXh0LmNoYXJDb2RlQXQoSSsrKTsKICAgICAgICBpZiAoYyA9PT0gMTApIGVvbCA9IHRydWU7IC8vIFxuCiAgICAgICAgZWxzZSBpZiAoYyA9PT0gMTMpIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gMTApICsrSSwgKytrOyB9IC8vIFxyfFxyXG4KICAgICAgICBlbHNlIGlmIChjICE9PSBkZWxpbWl0ZXJDb2RlKSBjb250aW51ZTsKICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqLCBJIC0gayk7CiAgICAgIH0KCiAgICAgIC8vIHNwZWNpYWwgY2FzZTogbGFzdCB0b2tlbiBiZWZvcmUgRU9GCiAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGopOwogICAgfQoKICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHsKICAgICAgdmFyIGEgPSBbXTsKICAgICAgd2hpbGUgKHQgIT09IEVPTCAmJiB0ICE9PSBFT0YpIHsKICAgICAgICBhLnB1c2godCk7CiAgICAgICAgdCA9IHRva2VuKCk7CiAgICAgIH0KICAgICAgaWYgKGYgJiYgKGEgPSBmKGEsIG4rKykpID09IG51bGwpIGNvbnRpbnVlOwogICAgICByb3dzLnB1c2goYSk7CiAgICB9CgogICAgcmV0dXJuIHJvd3M7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXQocm93cywgY29sdW1ucykgewogICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTsKICAgIHJldHVybiBbY29sdW1ucy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKV0uY29uY2F0KHJvd3MubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTsKICAgICAgfSkuam9pbihkZWxpbWl0ZXIpOwogICAgfSkpLmpvaW4oIlxuIik7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRSb3dzKHJvd3MpIHsKICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oIlxuIik7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRSb3cocm93KSB7CiAgICByZXR1cm4gcm93Lm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodGV4dCkgewogICAgcmV0dXJuIHRleHQgPT0gbnVsbCA/ICIiCiAgICAgICAgOiByZUZvcm1hdC50ZXN0KHRleHQgKz0gIiIpID8gIlwiIiArIHRleHQucmVwbGFjZSgvXCIvZywgIlwiXCIiKSArICJcIiIKICAgICAgICA6IHRleHQ7CiAgfQoKICByZXR1cm4gewogICAgcGFyc2U6IHBhcnNlLAogICAgcGFyc2VSb3dzOiBwYXJzZVJvd3MsCiAgICBmb3JtYXQ6IGZvcm1hdCwKICAgIGZvcm1hdFJvd3M6IGZvcm1hdFJvd3MKICB9Owp9Cgp2YXIgY3N2ID0gZHN2KCIsIik7Cgp2YXIgY3N2UGFyc2UgPSBjc3YucGFyc2U7CnZhciBjc3ZQYXJzZVJvd3MgPSBjc3YucGFyc2VSb3dzOwp2YXIgY3N2Rm9ybWF0ID0gY3N2LmZvcm1hdDsKdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0Um93czsKCnZhciB0c3YgPSBkc3YoIlx0Iik7Cgp2YXIgdHN2UGFyc2UgPSB0c3YucGFyc2U7CnZhciB0c3ZQYXJzZVJvd3MgPSB0c3YucGFyc2VSb3dzOwp2YXIgdHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDsKdmFyIHRzdkZvcm1hdFJvd3MgPSB0c3YuZm9ybWF0Um93czsKCnZhciByZXF1ZXN0ID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewogIHZhciByZXF1ZXN0LAogICAgICBldmVudCA9IGRpc3BhdGNoKCJiZWZvcmVzZW5kIiwgInByb2dyZXNzIiwgImxvYWQiLCAiZXJyb3IiKSwKICAgICAgbWltZVR5cGUsCiAgICAgIGhlYWRlcnMgPSBtYXAkMSgpLAogICAgICB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QsCiAgICAgIHVzZXIgPSBudWxsLAogICAgICBwYXNzd29yZCA9IG51bGwsCiAgICAgIHJlc3BvbnNlLAogICAgICByZXNwb25zZVR5cGUsCiAgICAgIHRpbWVvdXQgPSAwOwoKICAvLyBJZiBJRSBkb2VzIG5vdCBzdXBwb3J0IENPUlMsIHVzZSBYRG9tYWluUmVxdWVzdC4KICBpZiAodHlwZW9mIFhEb21haW5SZXF1ZXN0ICE9PSAidW5kZWZpbmVkIgogICAgICAmJiAhKCJ3aXRoQ3JlZGVudGlhbHMiIGluIHhocikKICAgICAgJiYgL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KHVybCkpIHhociA9IG5ldyBYRG9tYWluUmVxdWVzdDsKCiAgIm9ubG9hZCIgaW4geGhyCiAgICAgID8geGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IHJlc3BvbmQKICAgICAgOiB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24obykgeyB4aHIucmVhZHlTdGF0ZSA+IDMgJiYgcmVzcG9uZChvKTsgfTsKCiAgZnVuY3Rpb24gcmVzcG9uZChvKSB7CiAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cywgcmVzdWx0OwogICAgaWYgKCFzdGF0dXMgJiYgaGFzUmVzcG9uc2UoeGhyKQogICAgICAgIHx8IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwCiAgICAgICAgfHwgc3RhdHVzID09PSAzMDQpIHsKICAgICAgaWYgKHJlc3BvbnNlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlLmNhbGwocmVxdWVzdCwgeGhyKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBldmVudC5jYWxsKCJlcnJvciIsIHJlcXVlc3QsIGUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSB4aHI7CiAgICAgIH0KICAgICAgZXZlbnQuY2FsbCgibG9hZCIsIHJlcXVlc3QsIHJlc3VsdCk7CiAgICB9IGVsc2UgewogICAgICBldmVudC5jYWxsKCJlcnJvciIsIHJlcXVlc3QsIG8pOwogICAgfQogIH0KCiAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbihlKSB7CiAgICBldmVudC5jYWxsKCJwcm9ncmVzcyIsIHJlcXVlc3QsIGUpOwogIH07CgogIHJlcXVlc3QgPSB7CiAgICBoZWFkZXI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICAgIG5hbWUgPSAobmFtZSArICIiKS50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBoZWFkZXJzLmdldChuYW1lKTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIGhlYWRlcnMucmVtb3ZlKG5hbWUpOwogICAgICBlbHNlIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlICsgIiIpOwogICAgICByZXR1cm4gcmVxdWVzdDsKICAgIH0sCgogICAgLy8gSWYgbWltZVR5cGUgaXMgbm9uLW51bGwgYW5kIG5vIEFjY2VwdCBoZWFkZXIgaXMgc2V0LCBhIGRlZmF1bHQgaXMgdXNlZC4KICAgIG1pbWVUeXBlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBtaW1lVHlwZTsKICAgICAgbWltZVR5cGUgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlICsgIiI7CiAgICAgIHJldHVybiByZXF1ZXN0OwogICAgfSwKCiAgICAvLyBTcGVjaWZpZXMgd2hhdCB0eXBlIHRoZSByZXNwb25zZSB2YWx1ZSBzaG91bGQgdGFrZTsKICAgIC8vIGZvciBpbnN0YW5jZSwgYXJyYXlidWZmZXIsIGJsb2IsIGRvY3VtZW50LCBvciB0ZXh0LgogICAgcmVzcG9uc2VUeXBlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByZXNwb25zZVR5cGU7CiAgICAgIHJlc3BvbnNlVHlwZSA9IHZhbHVlOwogICAgICByZXR1cm4gcmVxdWVzdDsKICAgIH0sCgogICAgdGltZW91dDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGltZW91dDsKICAgICAgdGltZW91dCA9ICt2YWx1ZTsKICAgICAgcmV0dXJuIHJlcXVlc3Q7CiAgICB9LAoKICAgIHVzZXI6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IHVzZXIgOiAodXNlciA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUgKyAiIiwgcmVxdWVzdCk7CiAgICB9LAoKICAgIHBhc3N3b3JkOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyBwYXNzd29yZCA6IChwYXNzd29yZCA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUgKyAiIiwgcmVxdWVzdCk7CiAgICB9LAoKICAgIC8vIFNwZWNpZnkgaG93IHRvIGNvbnZlcnQgdGhlIHJlc3BvbnNlIGNvbnRlbnQgdG8gYSBzcGVjaWZpYyB0eXBlOwogICAgLy8gY2hhbmdlcyB0aGUgY2FsbGJhY2sgdmFsdWUgb24gImxvYWQiIGV2ZW50cy4KICAgIHJlc3BvbnNlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXNwb25zZSA9IHZhbHVlOwogICAgICByZXR1cm4gcmVxdWVzdDsKICAgIH0sCgogICAgLy8gQWxpYXMgZm9yIHNlbmQoIkdFVCIsIMOiwoDCpikuCiAgICBnZXQ6IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgIHJldHVybiByZXF1ZXN0LnNlbmQoIkdFVCIsIGRhdGEsIGNhbGxiYWNrKTsKICAgIH0sCgogICAgLy8gQWxpYXMgZm9yIHNlbmQoIlBPU1QiLCDDosKAwqYpLgogICAgcG9zdDogZnVuY3Rpb24oZGF0YSwgY2FsbGJhY2spIHsKICAgICAgcmV0dXJuIHJlcXVlc3Quc2VuZCgiUE9TVCIsIGRhdGEsIGNhbGxiYWNrKTsKICAgIH0sCgogICAgLy8gSWYgY2FsbGJhY2sgaXMgbm9uLW51bGwsIGl0IHdpbGwgYmUgdXNlZCBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLgogICAgc2VuZDogZnVuY3Rpb24obWV0aG9kLCBkYXRhLCBjYWxsYmFjaykgewogICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSwgdXNlciwgcGFzc3dvcmQpOwogICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiAhaGVhZGVycy5oYXMoImFjY2VwdCIpKSBoZWFkZXJzLnNldCgiYWNjZXB0IiwgbWltZVR5cGUgKyAiLCovKiIpOwogICAgICBpZiAoeGhyLnNldFJlcXVlc3RIZWFkZXIpIGhlYWRlcnMuZWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkgeyB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSk7IH0pOwogICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSkgeGhyLm92ZXJyaWRlTWltZVR5cGUobWltZVR5cGUpOwogICAgICBpZiAocmVzcG9uc2VUeXBlICE9IG51bGwpIHhoci5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7CiAgICAgIGlmICh0aW1lb3V0ID4gMCkgeGhyLnRpbWVvdXQgPSB0aW1lb3V0OwogICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSA9PT0gImZ1bmN0aW9uIikgY2FsbGJhY2sgPSBkYXRhLCBkYXRhID0gbnVsbDsKICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgY2FsbGJhY2subGVuZ3RoID09PSAxKSBjYWxsYmFjayA9IGZpeENhbGxiYWNrKGNhbGxiYWNrKTsKICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHJlcXVlc3Qub24oImVycm9yIiwgY2FsbGJhY2spLm9uKCJsb2FkIiwgZnVuY3Rpb24oeGhyKSB7IGNhbGxiYWNrKG51bGwsIHhocik7IH0pOwogICAgICBldmVudC5jYWxsKCJiZWZvcmVzZW5kIiwgcmVxdWVzdCwgeGhyKTsKICAgICAgeGhyLnNlbmQoZGF0YSA9PSBudWxsID8gbnVsbCA6IGRhdGEpOwogICAgICByZXR1cm4gcmVxdWVzdDsKICAgIH0sCgogICAgYWJvcnQ6IGZ1bmN0aW9uKCkgewogICAgICB4aHIuYWJvcnQoKTsKICAgICAgcmV0dXJuIHJlcXVlc3Q7CiAgICB9LAoKICAgIG9uOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbHVlID0gZXZlbnQub24uYXBwbHkoZXZlbnQsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gZXZlbnQgPyByZXF1ZXN0IDogdmFsdWU7CiAgICB9CiAgfTsKCiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIiArIGNhbGxiYWNrKTsKICAgIHJldHVybiByZXF1ZXN0LmdldChjYWxsYmFjayk7CiAgfQoKICByZXR1cm4gcmVxdWVzdDsKfQoKZnVuY3Rpb24gZml4Q2FsbGJhY2soY2FsbGJhY2spIHsKICByZXR1cm4gZnVuY3Rpb24oZXJyb3IsIHhocikgewogICAgY2FsbGJhY2soZXJyb3IgPT0gbnVsbCA/IHhociA6IG51bGwpOwogIH07Cn0KCmZ1bmN0aW9uIGhhc1Jlc3BvbnNlKHhocikgewogIHZhciB0eXBlID0geGhyLnJlc3BvbnNlVHlwZTsKICByZXR1cm4gdHlwZSAmJiB0eXBlICE9PSAidGV4dCIKICAgICAgPyB4aHIucmVzcG9uc2UgLy8gbnVsbCBvbiBlcnJvcgogICAgICA6IHhoci5yZXNwb25zZVRleHQ7IC8vICIiIG9uIGVycm9yCn0KCnZhciB0eXBlID0gZnVuY3Rpb24oZGVmYXVsdE1pbWVUeXBlLCByZXNwb25zZSkgewogIHJldHVybiBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CiAgICB2YXIgciA9IHJlcXVlc3QodXJsKS5taW1lVHlwZShkZWZhdWx0TWltZVR5cGUpLnJlc3BvbnNlKHJlc3BvbnNlKTsKICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIiArIGNhbGxiYWNrKTsKICAgICAgcmV0dXJuIHIuZ2V0KGNhbGxiYWNrKTsKICAgIH0KICAgIHJldHVybiByOwogIH07Cn0KCnZhciBodG1sID0gdHlwZSgidGV4dC9odG1sIiwgZnVuY3Rpb24oeGhyKSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHhoci5yZXNwb25zZVRleHQpOwp9KTsKCnZhciBqc29uID0gdHlwZSgiYXBwbGljYXRpb24vanNvbiIsIGZ1bmN0aW9uKHhocikgewogIHJldHVybiBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwp9KTsKCnZhciB0ZXh0ID0gdHlwZSgidGV4dC9wbGFpbiIsIGZ1bmN0aW9uKHhocikgewogIHJldHVybiB4aHIucmVzcG9uc2VUZXh0Owp9KTsKCnZhciB4bWwgPSB0eXBlKCJhcHBsaWNhdGlvbi94bWwiLCBmdW5jdGlvbih4aHIpIHsKICB2YXIgeG1sID0geGhyLnJlc3BvbnNlWE1MOwogIGlmICgheG1sKSB0aHJvdyBuZXcgRXJyb3IoInBhcnNlIGVycm9yIik7CiAgcmV0dXJuIHhtbDsKfSk7Cgp2YXIgZHN2JDEgPSBmdW5jdGlvbihkZWZhdWx0TWltZVR5cGUsIHBhcnNlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHVybCwgcm93LCBjYWxsYmFjaykgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBjYWxsYmFjayA9IHJvdywgcm93ID0gbnVsbDsKICAgIHZhciByID0gcmVxdWVzdCh1cmwpLm1pbWVUeXBlKGRlZmF1bHRNaW1lVHlwZSk7CiAgICByLnJvdyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByLnJlc3BvbnNlKHJlc3BvbnNlT2YocGFyc2UsIHJvdyA9IF8pKSA6IHJvdzsgfTsKICAgIHIucm93KHJvdyk7CiAgICByZXR1cm4gY2FsbGJhY2sgPyByLmdldChjYWxsYmFjaykgOiByOwogIH07Cn0KCmZ1bmN0aW9uIHJlc3BvbnNlT2YocGFyc2UsIHJvdykgewogIHJldHVybiBmdW5jdGlvbihyZXF1ZXN0JCQxKSB7CiAgICByZXR1cm4gcGFyc2UocmVxdWVzdCQkMS5yZXNwb25zZVRleHQsIHJvdyk7CiAgfTsKfQoKdmFyIGNzdiQxID0gZHN2JDEoInRleHQvY3N2IiwgY3N2UGFyc2UpOwoKdmFyIHRzdiQxID0gZHN2JDEoInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLCB0c3ZQYXJzZSk7Cgp2YXIgZnJhbWUgPSAwOwp2YXIgdGltZW91dCA9IDA7CnZhciBpbnRlcnZhbCA9IDA7CnZhciBwb2tlRGVsYXkgPSAxMDAwOwp2YXIgdGFza0hlYWQ7CnZhciB0YXNrVGFpbDsKdmFyIGNsb2NrTGFzdCA9IDA7CnZhciBjbG9ja05vdyA9IDA7CnZhciBjbG9ja1NrZXcgPSAwOwp2YXIgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICJvYmplY3QiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZTsKdmFyIHNldEZyYW1lID0gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gImZ1bmN0aW9uIiA/IHJlcXVlc3RBbmltYXRpb25GcmFtZSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91dChmLCAxNyk7IH07CgpmdW5jdGlvbiBub3coKSB7CiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOwp9CgpmdW5jdGlvbiBjbGVhck5vdygpIHsKICBjbG9ja05vdyA9IDA7Cn0KCmZ1bmN0aW9uIFRpbWVyKCkgewogIHRoaXMuX2NhbGwgPQogIHRoaXMuX3RpbWUgPQogIHRoaXMuX25leHQgPSBudWxsOwp9CgpUaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFRpbWVyLAogIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgaWYgKCF0aGlzLl9uZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7CiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzOwogICAgICBlbHNlIHRhc2tIZWFkID0gdGhpczsKICAgICAgdGFza1RhaWwgPSB0aGlzOwogICAgfQogICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgdGhpcy5fdGltZSA9IHRpbWU7CiAgICBzbGVlcCgpOwogIH0sCiAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fY2FsbCkgewogICAgICB0aGlzLl9jYWxsID0gbnVsbDsKICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5OwogICAgICBzbGVlcCgpOwogICAgfQogIH0KfTsKCmZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogIHZhciB0ID0gbmV3IFRpbWVyOwogIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogIHJldHVybiB0Owp9CgpmdW5jdGlvbiB0aW1lckZsdXNoKCkgewogIG5vdygpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSwgaWYgbm90IGFscmVhZHkgc2V0LgogICsrZnJhbWU7IC8vIFByZXRlbmQgd2XDosKAwpl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVuw6LCgMKZdCBhbHJlYWR5LgogIHZhciB0ID0gdGFza0hlYWQsIGU7CiAgd2hpbGUgKHQpIHsKICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpOwogICAgdCA9IHQuX25leHQ7CiAgfQogIC0tZnJhbWU7Cn0KCmZ1bmN0aW9uIHdha2UoKSB7CiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3OwogIGZyYW1lID0gdGltZW91dCA9IDA7CiAgdHJ5IHsKICAgIHRpbWVyRmx1c2goKTsKICB9IGZpbmFsbHkgewogICAgZnJhbWUgPSAwOwogICAgbmFwKCk7CiAgICBjbG9ja05vdyA9IDA7CiAgfQp9CgpmdW5jdGlvbiBwb2tlJDEoKSB7CiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDsKICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93Owp9CgpmdW5jdGlvbiBuYXAoKSB7CiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5OwogIHdoaWxlICh0MSkgewogICAgaWYgKHQxLl9jYWxsKSB7CiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTsKICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDsKICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyOwogICAgfQogIH0KICB0YXNrVGFpbCA9IHQwOwogIHNsZWVwKHRpbWUpOwp9CgpmdW5jdGlvbiBzbGVlcCh0aW1lKSB7CiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuCiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OwogIGlmIChkZWxheSA+IDI0KSB7CiAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCBkZWxheSk7CiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIGlmICghaW50ZXJ2YWwpIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSQxLCBwb2tlRGVsYXkpOwogICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTsKICB9Cn0KCnZhciB0aW1lb3V0JDEgPSBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICB2YXIgdCA9IG5ldyBUaW1lcjsKICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5OwogIHQucmVzdGFydChmdW5jdGlvbihlbGFwc2VkKSB7CiAgICB0LnN0b3AoKTsKICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7CiAgfSwgZGVsYXksIHRpbWUpOwogIHJldHVybiB0Owp9Cgp2YXIgaW50ZXJ2YWwkMSA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogIHZhciB0ID0gbmV3IFRpbWVyLCB0b3RhbCA9IGRlbGF5OwogIGlmIChkZWxheSA9PSBudWxsKSByZXR1cm4gdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSksIHQ7CiAgZGVsYXkgPSArZGVsYXksIHRpbWUgPSB0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lOwogIHQucmVzdGFydChmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHsKICAgIGVsYXBzZWQgKz0gdG90YWw7CiAgICB0LnJlc3RhcnQodGljaywgdG90YWwgKz0gZGVsYXksIHRpbWUpOwogICAgY2FsbGJhY2soZWxhcHNlZCk7CiAgfSwgZGVsYXksIHRpbWUpOwogIHJldHVybiB0Owp9Cgp2YXIgdDAkMSA9IG5ldyBEYXRlOwp2YXIgdDEkMSA9IG5ldyBEYXRlOwoKZnVuY3Rpb24gbmV3SW50ZXJ2YWwoZmxvb3JpLCBvZmZzZXRpLCBjb3VudCwgZmllbGQpIHsKCiAgZnVuY3Rpb24gaW50ZXJ2YWwoZGF0ZSkgewogICAgcmV0dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoK2RhdGUpKSwgZGF0ZTsKICB9CgogIGludGVydmFsLmZsb29yID0gaW50ZXJ2YWw7CgogIGludGVydmFsLmNlaWwgPSBmdW5jdGlvbihkYXRlKSB7CiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBuZXcgRGF0ZShkYXRlIC0gMSkpLCBvZmZzZXRpKGRhdGUsIDEpLCBmbG9vcmkoZGF0ZSksIGRhdGU7CiAgfTsKCiAgaW50ZXJ2YWwucm91bmQgPSBmdW5jdGlvbihkYXRlKSB7CiAgICB2YXIgZDAgPSBpbnRlcnZhbChkYXRlKSwKICAgICAgICBkMSA9IGludGVydmFsLmNlaWwoZGF0ZSk7CiAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTsKICB9OwoKICBpbnRlcnZhbC5vZmZzZXQgPSBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICByZXR1cm4gb2Zmc2V0aShkYXRlID0gbmV3IERhdGUoK2RhdGUpLCBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKSksIGRhdGU7CiAgfTsKCiAgaW50ZXJ2YWwucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgewogICAgdmFyIHJhbmdlID0gW107CiAgICBzdGFydCA9IGludGVydmFsLmNlaWwoc3RhcnQpOwogICAgc3RlcCA9IHN0ZXAgPT0gbnVsbCA/IDEgOiBNYXRoLmZsb29yKHN0ZXApOwogICAgaWYgKCEoc3RhcnQgPCBzdG9wKSB8fCAhKHN0ZXAgPiAwKSkgcmV0dXJuIHJhbmdlOyAvLyBhbHNvIGhhbmRsZXMgSW52YWxpZCBEYXRlCiAgICBkbyByYW5nZS5wdXNoKG5ldyBEYXRlKCtzdGFydCkpOyB3aGlsZSAob2Zmc2V0aShzdGFydCwgc3RlcCksIGZsb29yaShzdGFydCksIHN0YXJ0IDwgc3RvcCkKICAgIHJldHVybiByYW5nZTsKICB9OwoKICBpbnRlcnZhbC5maWx0ZXIgPSBmdW5jdGlvbih0ZXN0KSB7CiAgICByZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgICBpZiAoZGF0ZSA+PSBkYXRlKSB3aGlsZSAoZmxvb3JpKGRhdGUpLCAhdGVzdChkYXRlKSkgZGF0ZS5zZXRUaW1lKGRhdGUgLSAxKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgaWYgKGRhdGUgPj0gZGF0ZSkgd2hpbGUgKC0tc3RlcCA+PSAwKSB3aGlsZSAob2Zmc2V0aShkYXRlLCAxKSwgIXRlc3QoZGF0ZSkpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHkKICAgIH0pOwogIH07CgogIGlmIChjb3VudCkgewogICAgaW50ZXJ2YWwuY291bnQgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHQwJDEuc2V0VGltZSgrc3RhcnQpLCB0MSQxLnNldFRpbWUoK2VuZCk7CiAgICAgIGZsb29yaSh0MCQxKSwgZmxvb3JpKHQxJDEpOwogICAgICByZXR1cm4gTWF0aC5mbG9vcihjb3VudCh0MCQxLCB0MSQxKSk7CiAgICB9OwoKICAgIGludGVydmFsLmV2ZXJ5ID0gZnVuY3Rpb24oc3RlcCkgewogICAgICBzdGVwID0gTWF0aC5mbG9vcihzdGVwKTsKICAgICAgcmV0dXJuICFpc0Zpbml0ZShzdGVwKSB8fCAhKHN0ZXAgPiAwKSA/IG51bGwKICAgICAgICAgIDogIShzdGVwID4gMSkgPyBpbnRlcnZhbAogICAgICAgICAgOiBpbnRlcnZhbC5maWx0ZXIoZmllbGQKICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZpZWxkKGQpICUgc3RlcCA9PT0gMDsgfQogICAgICAgICAgICAgIDogZnVuY3Rpb24oZCkgeyByZXR1cm4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwOyB9KTsKICAgIH07CiAgfQoKICByZXR1cm4gaW50ZXJ2YWw7Cn0KCnZhciBtaWxsaXNlY29uZCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKCkgewogIC8vIG5vb3AKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXApOwp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIGVuZCAtIHN0YXJ0Owp9KTsKCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4KbWlsbGlzZWNvbmQuZXZlcnkgPSBmdW5jdGlvbihrKSB7CiAgayA9IE1hdGguZmxvb3Ioayk7CiAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7CiAgaWYgKCEoayA+IDEpKSByZXR1cm4gbWlsbGlzZWNvbmQ7CiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBrKSAqIGspOwogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBrKTsKICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGs7CiAgfSk7Cn07Cgp2YXIgbWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmQucmFuZ2U7Cgp2YXIgZHVyYXRpb25TZWNvbmQgPSAxZTM7CnZhciBkdXJhdGlvbk1pbnV0ZSA9IDZlNDsKdmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7CnZhciBkdXJhdGlvbkRheSA9IDg2NGU1Owp2YXIgZHVyYXRpb25XZWVrID0gNjA0OGU1OwoKdmFyIHNlY29uZCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldFRpbWUoTWF0aC5mbG9vcihkYXRlIC8gZHVyYXRpb25TZWNvbmQpICogZHVyYXRpb25TZWNvbmQpOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uU2Vjb25kKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25TZWNvbmQ7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENTZWNvbmRzKCk7Cn0pOwoKdmFyIHNlY29uZHMgPSBzZWNvbmQucmFuZ2U7Cgp2YXIgbWludXRlID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBkdXJhdGlvbk1pbnV0ZSkgKiBkdXJhdGlvbk1pbnV0ZSk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUpOwp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTsKfSk7Cgp2YXIgbWludXRlcyA9IG1pbnV0ZS5yYW5nZTsKCnZhciBob3VyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiBkdXJhdGlvbk1pbnV0ZSAlIGR1cmF0aW9uSG91cjsKICBpZiAob2Zmc2V0IDwgMCkgb2Zmc2V0ICs9IGR1cmF0aW9uSG91cjsKICBkYXRlLnNldFRpbWUoTWF0aC5mbG9vcigoK2RhdGUgLSBvZmZzZXQpIC8gZHVyYXRpb25Ib3VyKSAqIGR1cmF0aW9uSG91ciArIG9mZnNldCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25Ib3VyOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKTsKfSk7Cgp2YXIgaG91cnMgPSBob3VyLnJhbmdlOwoKdmFyIGRheSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbkRheTsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldERhdGUoKSAtIDE7Cn0pOwoKdmFyIGRheXMgPSBkYXkucmFuZ2U7CgpmdW5jdGlvbiB3ZWVrZGF5KGkpIHsKICByZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gKGRhdGUuZ2V0RGF5KCkgKyA3IC0gaSkgJSA3KTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCAqIDcpOwogIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgIHJldHVybiAoZW5kIC0gc3RhcnQgLSAoZW5kLmdldFRpbWV6b25lT2Zmc2V0KCkgLSBzdGFydC5nZXRUaW1lem9uZU9mZnNldCgpKSAqIGR1cmF0aW9uTWludXRlKSAvIGR1cmF0aW9uV2VlazsKICB9KTsKfQoKdmFyIHN1bmRheSA9IHdlZWtkYXkoMCk7CnZhciBtb25kYXkgPSB3ZWVrZGF5KDEpOwp2YXIgdHVlc2RheSA9IHdlZWtkYXkoMik7CnZhciB3ZWRuZXNkYXkgPSB3ZWVrZGF5KDMpOwp2YXIgdGh1cnNkYXkgPSB3ZWVrZGF5KDQpOwp2YXIgZnJpZGF5ID0gd2Vla2RheSg1KTsKdmFyIHNhdHVyZGF5ID0gd2Vla2RheSg2KTsKCnZhciBzdW5kYXlzID0gc3VuZGF5LnJhbmdlOwp2YXIgbW9uZGF5cyA9IG1vbmRheS5yYW5nZTsKdmFyIHR1ZXNkYXlzID0gdHVlc2RheS5yYW5nZTsKdmFyIHdlZG5lc2RheXMgPSB3ZWRuZXNkYXkucmFuZ2U7CnZhciB0aHVyc2RheXMgPSB0aHVyc2RheS5yYW5nZTsKdmFyIGZyaWRheXMgPSBmcmlkYXkucmFuZ2U7CnZhciBzYXR1cmRheXMgPSBzYXR1cmRheS5yYW5nZTsKCnZhciBtb250aCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldERhdGUoMSk7CiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gZW5kLmdldE1vbnRoKCkgLSBzdGFydC5nZXRNb250aCgpICsgKGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKSkgKiAxMjsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldE1vbnRoKCk7Cn0pOwoKdmFyIG1vbnRocyA9IG1vbnRoLnJhbmdlOwoKdmFyIHllYXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRNb250aCgwLCAxKTsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiBlbmQuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0LmdldEZ1bGxZZWFyKCk7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpOwp9KTsKCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4KeWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHsKICByZXR1cm4gIWlzRmluaXRlKGsgPSBNYXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRGdWxsWWVhcigpIC8gaykgKiBrKTsKICAgIGRhdGUuc2V0TW9udGgoMCwgMSk7CiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIGspOwogIH0pOwp9OwoKdmFyIHllYXJzID0geWVhci5yYW5nZTsKCnZhciB1dGNNaW51dGUgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENTZWNvbmRzKDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENNaW51dGVzKCk7Cn0pOwoKdmFyIHV0Y01pbnV0ZXMgPSB1dGNNaW51dGUucmFuZ2U7Cgp2YXIgdXRjSG91ciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldFVUQ01pbnV0ZXMoMCwgMCwgMCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25Ib3VyOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0VVRDSG91cnMoKTsKfSk7Cgp2YXIgdXRjSG91cnMgPSB1dGNIb3VyLnJhbmdlOwoKdmFyIHV0Y0RheSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uRGF5Owp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0VVRDRGF0ZSgpIC0gMTsKfSk7Cgp2YXIgdXRjRGF5cyA9IHV0Y0RheS5yYW5nZTsKCmZ1bmN0aW9uIHV0Y1dlZWtkYXkoaSkgewogIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpOwogICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7CiAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbldlZWs7CiAgfSk7Cn0KCnZhciB1dGNTdW5kYXkgPSB1dGNXZWVrZGF5KDApOwp2YXIgdXRjTW9uZGF5ID0gdXRjV2Vla2RheSgxKTsKdmFyIHV0Y1R1ZXNkYXkgPSB1dGNXZWVrZGF5KDIpOwp2YXIgdXRjV2VkbmVzZGF5ID0gdXRjV2Vla2RheSgzKTsKdmFyIHV0Y1RodXJzZGF5ID0gdXRjV2Vla2RheSg0KTsKdmFyIHV0Y0ZyaWRheSA9IHV0Y1dlZWtkYXkoNSk7CnZhciB1dGNTYXR1cmRheSA9IHV0Y1dlZWtkYXkoNik7Cgp2YXIgdXRjU3VuZGF5cyA9IHV0Y1N1bmRheS5yYW5nZTsKdmFyIHV0Y01vbmRheXMgPSB1dGNNb25kYXkucmFuZ2U7CnZhciB1dGNUdWVzZGF5cyA9IHV0Y1R1ZXNkYXkucmFuZ2U7CnZhciB1dGNXZWRuZXNkYXlzID0gdXRjV2VkbmVzZGF5LnJhbmdlOwp2YXIgdXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXkucmFuZ2U7CnZhciB1dGNGcmlkYXlzID0gdXRjRnJpZGF5LnJhbmdlOwp2YXIgdXRjU2F0dXJkYXlzID0gdXRjU2F0dXJkYXkucmFuZ2U7Cgp2YXIgdXRjTW9udGggPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENEYXRlKDEpOwogIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFVUQ01vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSArIHN0ZXApOwp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIGVuZC5nZXRVVENNb250aCgpIC0gc3RhcnQuZ2V0VVRDTW9udGgoKSArIChlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCkpICogMTI7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENNb250aCgpOwp9KTsKCnZhciB1dGNNb250aHMgPSB1dGNNb250aC5yYW5nZTsKCnZhciB1dGNZZWFyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7CiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKTsKfSk7CgovLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuCnV0Y1llYXIuZXZlcnkgPSBmdW5jdGlvbihrKSB7CiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgZGF0ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAvIGspICogayk7CiAgICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpOwogICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArIHN0ZXAgKiBrKTsKICB9KTsKfTsKCnZhciB1dGNZZWFycyA9IHV0Y1llYXIucmFuZ2U7CgovLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoCi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLgovLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbCgxLjIzKSByZXR1cm5zIFsiMTIzIiwgMF0uCnZhciBmb3JtYXREZWNpbWFsID0gZnVuY3Rpb24oeCwgcCkgewogIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMOCwrFJbmZpbml0eQogIHZhciBpLCBjb2VmZmljaWVudCA9IHguc2xpY2UoMCwgaSk7CgogIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxkXC5cZCtlWy0rXVxkKwogIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxkZVstK11cZCsgKGUuZy4sIDFlKzMpLgogIHJldHVybiBbCiAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LAogICAgK3guc2xpY2UoaSArIDEpCiAgXTsKfQoKdmFyIGV4cG9uZW50JDEgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47Cn0KCnZhciBmb3JtYXRHcm91cCA9IGZ1bmN0aW9uKGdyb3VwaW5nLCB0aG91c2FuZHMpIHsKICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7CiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCwKICAgICAgICB0ID0gW10sCiAgICAgICAgaiA9IDAsCiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLAogICAgICAgIGxlbmd0aCA9IDA7CgogICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7CiAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpOwogICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTsKICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrOwogICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdOwogICAgfQoKICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7CiAgfTsKfQoKdmFyIGZvcm1hdERlZmF1bHQgPSBmdW5jdGlvbih4LCBwKSB7CiAgeCA9IHgudG9QcmVjaXNpb24ocCk7CgogIG91dDogZm9yICh2YXIgbiA9IHgubGVuZ3RoLCBpID0gMSwgaTAgPSAtMSwgaTE7IGkgPCBuOyArK2kpIHsKICAgIHN3aXRjaCAoeFtpXSkgewogICAgICBjYXNlICIuIjogaTAgPSBpMSA9IGk7IGJyZWFrOwogICAgICBjYXNlICIwIjogaWYgKGkwID09PSAwKSBpMCA9IGk7IGkxID0gaTsgYnJlYWs7CiAgICAgIGNhc2UgImUiOiBicmVhayBvdXQ7CiAgICAgIGRlZmF1bHQ6IGlmIChpMCA+IDApIGkwID0gMDsgYnJlYWs7CiAgICB9CiAgfQoKICByZXR1cm4gaTAgPiAwID8geC5zbGljZSgwLCBpMCkgKyB4LnNsaWNlKGkxICsgMSkgOiB4Owp9Cgp2YXIgcHJlZml4RXhwb25lbnQ7Cgp2YXIgZm9ybWF0UHJlZml4QXV0byA9IGZ1bmN0aW9uKHgsIHApIHsKICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7CiAgaWYgKCFkKSByZXR1cm4geCArICIiOwogIHZhciBjb2VmZmljaWVudCA9IGRbMF0sCiAgICAgIGV4cG9uZW50ID0gZFsxXSwKICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLAogICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoOwogIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnQKICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbigiMCIpCiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArICIuIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpCiAgICAgIDogIjAuIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbigiMCIpICsgZm9ybWF0RGVjaW1hbCh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IQp9Cgp2YXIgZm9ybWF0Um91bmRlZCA9IGZ1bmN0aW9uKHgsIHApIHsKICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7CiAgaWYgKCFkKSByZXR1cm4geCArICIiOwogIHZhciBjb2VmZmljaWVudCA9IGRbMF0sCiAgICAgIGV4cG9uZW50ID0gZFsxXTsKICByZXR1cm4gZXhwb25lbnQgPCAwID8gIjAuIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oIjAiKSArIGNvZWZmaWNpZW50CiAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArICIuIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSkKICAgICAgOiBjb2VmZmljaWVudCArIG5ldyBBcnJheShleHBvbmVudCAtIGNvZWZmaWNpZW50Lmxlbmd0aCArIDIpLmpvaW4oIjAiKTsKfQoKdmFyIGZvcm1hdFR5cGVzID0gewogICIiOiBmb3JtYXREZWZhdWx0LAogICIlIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gKHggKiAxMDApLnRvRml4ZWQocCk7IH0sCiAgImIiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpOyB9LAogICJjIjogZnVuY3Rpb24oeCkgeyByZXR1cm4geCArICIiOyB9LAogICJkIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxMCk7IH0sCiAgImUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRXhwb25lbnRpYWwocCk7IH0sCiAgImYiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRml4ZWQocCk7IH0sCiAgImciOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvUHJlY2lzaW9uKHApOyB9LAogICJvIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KTsgfSwKICAicCI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCk7IH0sCiAgInIiOiBmb3JtYXRSb3VuZGVkLAogICJzIjogZm9ybWF0UHJlZml4QXV0bywKICAiWCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH0sCiAgIngiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KTsgfQp9OwoKLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXQp2YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXC1cKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyhbYS16JV0pPyQvaTsKCnZhciBmb3JtYXRTcGVjaWZpZXIgPSBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpOwp9CgpmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7CiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiICsgc3BlY2lmaWVyKTsKCiAgdmFyIG1hdGNoLAogICAgICBmaWxsID0gbWF0Y2hbMV0gfHwgIiAiLAogICAgICBhbGlnbiA9IG1hdGNoWzJdIHx8ICI+IiwKICAgICAgc2lnbiA9IG1hdGNoWzNdIHx8ICItIiwKICAgICAgc3ltYm9sID0gbWF0Y2hbNF0gfHwgIiIsCiAgICAgIHplcm8gPSAhIW1hdGNoWzVdLAogICAgICB3aWR0aCA9IG1hdGNoWzZdICYmICttYXRjaFs2XSwKICAgICAgY29tbWEgPSAhIW1hdGNoWzddLAogICAgICBwcmVjaXNpb24gPSBtYXRjaFs4XSAmJiArbWF0Y2hbOF0uc2xpY2UoMSksCiAgICAgIHR5cGUgPSBtYXRjaFs5XSB8fCAiIjsKCiAgLy8gVGhlICJuIiB0eXBlIGlzIGFuIGFsaWFzIGZvciAiLGciLgogIGlmICh0eXBlID09PSAibiIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9ICJnIjsKCiAgLy8gTWFwIGludmFsaWQgdHlwZXMgdG8gdGhlIGRlZmF1bHQgZm9ybWF0LgogIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgdHlwZSA9ICIiOwoKICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy4KICBpZiAoemVybyB8fCAoZmlsbCA9PT0gIjAiICYmIGFsaWduID09PSAiPSIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9ICIwIiwgYWxpZ24gPSAiPSI7CgogIHRoaXMuZmlsbCA9IGZpbGw7CiAgdGhpcy5hbGlnbiA9IGFsaWduOwogIHRoaXMuc2lnbiA9IHNpZ247CiAgdGhpcy5zeW1ib2wgPSBzeW1ib2w7CiAgdGhpcy56ZXJvID0gemVybzsKICB0aGlzLndpZHRoID0gd2lkdGg7CiAgdGhpcy5jb21tYSA9IGNvbW1hOwogIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uOwogIHRoaXMudHlwZSA9IHR5cGU7Cn0KCkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5maWxsCiAgICAgICsgdGhpcy5hbGlnbgogICAgICArIHRoaXMuc2lnbgogICAgICArIHRoaXMuc3ltYm9sCiAgICAgICsgKHRoaXMuemVybyA/ICIwIiA6ICIiKQogICAgICArICh0aGlzLndpZHRoID09IG51bGwgPyAiIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSkKICAgICAgKyAodGhpcy5jb21tYSA/ICIsIiA6ICIiKQogICAgICArICh0aGlzLnByZWNpc2lvbiA9PSBudWxsID8gIiIgOiAiLiIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKQogICAgICArIHRoaXMudHlwZTsKfTsKCnZhciBwcmVmaXhlcyA9IFsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiXHhCNSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdOwoKZnVuY3Rpb24gaWRlbnRpdHkkMyh4KSB7CiAgcmV0dXJuIHg7Cn0KCnZhciBmb3JtYXRMb2NhbGUgPSBmdW5jdGlvbihsb2NhbGUpIHsKICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgJiYgbG9jYWxlLnRob3VzYW5kcyA/IGZvcm1hdEdyb3VwKGxvY2FsZS5ncm91cGluZywgbG9jYWxlLnRob3VzYW5kcykgOiBpZGVudGl0eSQzLAogICAgICBjdXJyZW5jeSA9IGxvY2FsZS5jdXJyZW5jeSwKICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsOwoKICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyKSB7CiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTsKCiAgICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLAogICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLAogICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbiwKICAgICAgICBzeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sLAogICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybywKICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCwKICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSwKICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLAogICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTsKCiAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4KICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLgogICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gIiQiID8gY3VycmVuY3lbMF0gOiBzeW1ib2wgPT09ICIjIiAmJiAvW2JveFhdLy50ZXN0KHR5cGUpID8gIjAiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogIiIsCiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSAiJCIgPyBjdXJyZW5jeVsxXSA6IC9bJXBdLy50ZXN0KHR5cGUpID8gIiUiIDogIiI7CgogICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT8KICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlPwogICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj8KICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sCiAgICAgICAgbWF5YmVTdWZmaXggPSAhdHlwZSB8fCAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTsKCiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsCiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLgogICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLgogICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLgogICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAodHlwZSA/IDYgOiAxMikKICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSkKICAgICAgICA6IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTsKCiAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHsKICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LAogICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsCiAgICAgICAgICBpLCBuLCBjOwoKICAgICAgaWYgKHR5cGUgPT09ICJjIikgewogICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICB2YWx1ZSA9ICIiOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlID0gK3ZhbHVlOwoKICAgICAgICAvLyBDb252ZXJ0IG5lZ2F0aXZlIHRvIHBvc2l0aXZlLCBhbmQgY29tcHV0ZSB0aGUgcHJlZml4LgogICAgICAgIC8vIE5vdGUgdGhhdCAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhCiAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSAodmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDApICYmICh2YWx1ZSAqPSAtMSwgdHJ1ZSk7CgogICAgICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgZm9ybWF0dGluZy4KICAgICAgICB2YWx1ZSA9IGZvcm1hdFR5cGUodmFsdWUsIHByZWNpc2lvbik7CgogICAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgbmVnYXRpdmUsIGl0IG1heSBiZSByb3VuZGVkIHRvIHplcm8gZHVyaW5nCiAgICAgICAgLy8gZm9ybWF0dGluZzsgdHJlYXQgdGhpcyBhcyAocG9zaXRpdmUpIHplcm8uCiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUpIHsKICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDsKICAgICAgICAgIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTsKICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgKDQ4IDwgYyAmJiBjIDwgNTgpCiAgICAgICAgICAgICAgICB8fCAodHlwZSA9PT0gIngiICYmIDk2IDwgYyAmJiBjIDwgMTAzKQogICAgICAgICAgICAgICAgfHwgKHR5cGUgPT09ICJYIiAmJiA2NCA8IGMgJiYgYyA8IDcxKSkgewogICAgICAgICAgICAgIHZhbHVlTmVnYXRpdmUgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4KICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09ICIoIiA/IHNpZ24gOiAiLSIpIDogc2lnbiA9PT0gIi0iIHx8IHNpZ24gPT09ICIoIiA/ICIiIDogc2lnbikgKyB2YWx1ZVByZWZpeDsKICAgICAgICB2YWx1ZVN1ZmZpeCA9IHZhbHVlU3VmZml4ICsgKHR5cGUgPT09ICJzIiA/IHByZWZpeGVzWzggKyBwcmVmaXhFeHBvbmVudCAvIDNdIDogIiIpICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gIigiID8gIikiIDogIiIpOwoKICAgICAgICAvLyBCcmVhayB0aGUgZm9ybWF0dGVkIHZhbHVlIGludG8gdGhlIGludGVnZXIgw6LCgMKcdmFsdWXDosKAwp0gcGFydCB0aGF0IGNhbiBiZQogICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIMOiwoDCnHN1ZmZpeMOiwoDCnSBwYXJ0IHRoYXQgaXMgbm90LgogICAgICAgIGlmIChtYXliZVN1ZmZpeCkgewogICAgICAgICAgaSA9IC0xLCBuID0gdmFsdWUubGVuZ3RoOwogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7CiAgICAgICAgICAgICAgdmFsdWVTdWZmaXggPSAoYyA9PT0gNDYgPyBkZWNpbWFsICsgdmFsdWUuc2xpY2UoaSArIDEpIDogdmFsdWUuc2xpY2UoaSkpICsgdmFsdWVTdWZmaXg7CiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCAiMCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuCiAgICAgIGlmIChjb21tYSAmJiAhemVybykgdmFsdWUgPSBncm91cCh2YWx1ZSwgSW5maW5pdHkpOwoKICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy4KICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCwKICAgICAgICAgIHBhZGRpbmcgPSBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgOiAiIjsKCiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyAiMCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYWZ0ZXIgcGFkZGluZy4KICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gIiI7CgogICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgZmluYWwgb3V0cHV0IGJhc2VkIG9uIHRoZSBkZXNpcmVkIGFsaWdubWVudC4KICAgICAgc3dpdGNoIChhbGlnbikgewogICAgICAgIGNhc2UgIjwiOiByZXR1cm4gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsKICAgICAgICBjYXNlICI9IjogcmV0dXJuIHZhbHVlUHJlZml4ICsgcGFkZGluZyArIHZhbHVlICsgdmFsdWVTdWZmaXg7CiAgICAgICAgY2FzZSAiXiI6IHJldHVybiBwYWRkaW5nLnNsaWNlKDAsIGxlbmd0aCA9IHBhZGRpbmcubGVuZ3RoID4+IDEpICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZy5zbGljZShsZW5ndGgpOwogICAgICB9CiAgICAgIHJldHVybiBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OwogICAgfQoKICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3BlY2lmaWVyICsgIiI7CiAgICB9OwoKICAgIHJldHVybiBmb3JtYXQ7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkgewogICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9ICJmIiwgc3BlY2lmaWVyKSksCiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50JDEodmFsdWUpIC8gMykpKSAqIDMsCiAgICAgICAgayA9IE1hdGgucG93KDEwLCAtZSksCiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTsKICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4OwogICAgfTsKICB9CgogIHJldHVybiB7CiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCwKICAgIGZvcm1hdFByZWZpeDogZm9ybWF0UHJlZml4CiAgfTsKfQoKdmFyIGxvY2FsZSQxOwoKCgpkZWZhdWx0TG9jYWxlKHsKICBkZWNpbWFsOiAiLiIsCiAgdGhvdXNhbmRzOiAiLCIsCiAgZ3JvdXBpbmc6IFszXSwKICBjdXJyZW5jeTogWyIkIiwgIiJdCn0pOwoKZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7CiAgbG9jYWxlJDEgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7CiAgZXhwb3J0cy5mb3JtYXQgPSBsb2NhbGUkMS5mb3JtYXQ7CiAgZXhwb3J0cy5mb3JtYXRQcmVmaXggPSBsb2NhbGUkMS5mb3JtYXRQcmVmaXg7CiAgcmV0dXJuIGxvY2FsZSQxOwp9Cgp2YXIgcHJlY2lzaW9uRml4ZWQgPSBmdW5jdGlvbihzdGVwKSB7CiAgcmV0dXJuIE1hdGgubWF4KDAsIC1leHBvbmVudCQxKE1hdGguYWJzKHN0ZXApKSk7Cn0KCnZhciBwcmVjaXNpb25QcmVmaXggPSBmdW5jdGlvbihzdGVwLCB2YWx1ZSkgewogIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCQxKHZhbHVlKSAvIDMpKSkgKiAzIC0gZXhwb25lbnQkMShNYXRoLmFicyhzdGVwKSkpOwp9Cgp2YXIgcHJlY2lzaW9uUm91bmQgPSBmdW5jdGlvbihzdGVwLCBtYXgpIHsKICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJzKG1heCkgLSBzdGVwOwogIHJldHVybiBNYXRoLm1heCgwLCBleHBvbmVudCQxKG1heCkgLSBleHBvbmVudCQxKHN0ZXApKSArIDE7Cn0KCmZ1bmN0aW9uIGxvY2FsRGF0ZShkKSB7CiAgaWYgKDAgPD0gZC55ICYmIGQueSA8IDEwMCkgewogICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgtMSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCk7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGQueSk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgcmV0dXJuIG5ldyBEYXRlKGQueSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCk7Cn0KCmZ1bmN0aW9uIHV0Y0RhdGUoZCkgewogIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHsKICAgIHZhciBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTsKICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZC55KTsKICAgIHJldHVybiBkYXRlOwogIH0KICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7Cn0KCmZ1bmN0aW9uIG5ld1llYXIoeSkgewogIHJldHVybiB7eTogeSwgbTogMCwgZDogMSwgSDogMCwgTTogMCwgUzogMCwgTDogMH07Cn0KCmZ1bmN0aW9uIGZvcm1hdExvY2FsZSQxKGxvY2FsZSkgewogIHZhciBsb2NhbGVfZGF0ZVRpbWUgPSBsb2NhbGUuZGF0ZVRpbWUsCiAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsCiAgICAgIGxvY2FsZV90aW1lID0gbG9jYWxlLnRpbWUsCiAgICAgIGxvY2FsZV9wZXJpb2RzID0gbG9jYWxlLnBlcmlvZHMsCiAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLAogICAgICBsb2NhbGVfc2hvcnRXZWVrZGF5cyA9IGxvY2FsZS5zaG9ydERheXMsCiAgICAgIGxvY2FsZV9tb250aHMgPSBsb2NhbGUubW9udGhzLAogICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7CgogIHZhciBwZXJpb2RSZSA9IGZvcm1hdFJlKGxvY2FsZV9wZXJpb2RzKSwKICAgICAgcGVyaW9kTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9wZXJpb2RzKSwKICAgICAgd2Vla2RheVJlID0gZm9ybWF0UmUobG9jYWxlX3dlZWtkYXlzKSwKICAgICAgd2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfd2Vla2RheXMpLAogICAgICBzaG9ydFdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwKICAgICAgc2hvcnRXZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwKICAgICAgbW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9tb250aHMpLAogICAgICBtb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfbW9udGhzKSwKICAgICAgc2hvcnRNb250aFJlID0gZm9ybWF0UmUobG9jYWxlX3Nob3J0TW9udGhzKSwKICAgICAgc2hvcnRNb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRNb250aHMpOwoKICB2YXIgZm9ybWF0cyA9IHsKICAgICJhIjogZm9ybWF0U2hvcnRXZWVrZGF5LAogICAgIkEiOiBmb3JtYXRXZWVrZGF5LAogICAgImIiOiBmb3JtYXRTaG9ydE1vbnRoLAogICAgIkIiOiBmb3JtYXRNb250aCwKICAgICJjIjogbnVsbCwKICAgICJkIjogZm9ybWF0RGF5T2ZNb250aCwKICAgICJlIjogZm9ybWF0RGF5T2ZNb250aCwKICAgICJIIjogZm9ybWF0SG91cjI0LAogICAgIkkiOiBmb3JtYXRIb3VyMTIsCiAgICAiaiI6IGZvcm1hdERheU9mWWVhciwKICAgICJMIjogZm9ybWF0TWlsbGlzZWNvbmRzLAogICAgIm0iOiBmb3JtYXRNb250aE51bWJlciwKICAgICJNIjogZm9ybWF0TWludXRlcywKICAgICJwIjogZm9ybWF0UGVyaW9kLAogICAgIlMiOiBmb3JtYXRTZWNvbmRzLAogICAgIlUiOiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5LAogICAgInciOiBmb3JtYXRXZWVrZGF5TnVtYmVyLAogICAgIlciOiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5LAogICAgIngiOiBudWxsLAogICAgIlgiOiBudWxsLAogICAgInkiOiBmb3JtYXRZZWFyLAogICAgIlkiOiBmb3JtYXRGdWxsWWVhciwKICAgICJaIjogZm9ybWF0Wm9uZSwKICAgICIlIjogZm9ybWF0TGl0ZXJhbFBlcmNlbnQKICB9OwoKICB2YXIgdXRjRm9ybWF0cyA9IHsKICAgICJhIjogZm9ybWF0VVRDU2hvcnRXZWVrZGF5LAogICAgIkEiOiBmb3JtYXRVVENXZWVrZGF5LAogICAgImIiOiBmb3JtYXRVVENTaG9ydE1vbnRoLAogICAgIkIiOiBmb3JtYXRVVENNb250aCwKICAgICJjIjogbnVsbCwKICAgICJkIjogZm9ybWF0VVRDRGF5T2ZNb250aCwKICAgICJlIjogZm9ybWF0VVRDRGF5T2ZNb250aCwKICAgICJIIjogZm9ybWF0VVRDSG91cjI0LAogICAgIkkiOiBmb3JtYXRVVENIb3VyMTIsCiAgICAiaiI6IGZvcm1hdFVUQ0RheU9mWWVhciwKICAgICJMIjogZm9ybWF0VVRDTWlsbGlzZWNvbmRzLAogICAgIm0iOiBmb3JtYXRVVENNb250aE51bWJlciwKICAgICJNIjogZm9ybWF0VVRDTWludXRlcywKICAgICJwIjogZm9ybWF0VVRDUGVyaW9kLAogICAgIlMiOiBmb3JtYXRVVENTZWNvbmRzLAogICAgIlUiOiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5LAogICAgInciOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyLAogICAgIlciOiBmb3JtYXRVVENXZWVrTnVtYmVyTW9uZGF5LAogICAgIngiOiBudWxsLAogICAgIlgiOiBudWxsLAogICAgInkiOiBmb3JtYXRVVENZZWFyLAogICAgIlkiOiBmb3JtYXRVVENGdWxsWWVhciwKICAgICJaIjogZm9ybWF0VVRDWm9uZSwKICAgICIlIjogZm9ybWF0TGl0ZXJhbFBlcmNlbnQKICB9OwoKICB2YXIgcGFyc2VzID0gewogICAgImEiOiBwYXJzZVNob3J0V2Vla2RheSwKICAgICJBIjogcGFyc2VXZWVrZGF5LAogICAgImIiOiBwYXJzZVNob3J0TW9udGgsCiAgICAiQiI6IHBhcnNlTW9udGgsCiAgICAiYyI6IHBhcnNlTG9jYWxlRGF0ZVRpbWUsCiAgICAiZCI6IHBhcnNlRGF5T2ZNb250aCwKICAgICJlIjogcGFyc2VEYXlPZk1vbnRoLAogICAgIkgiOiBwYXJzZUhvdXIyNCwKICAgICJJIjogcGFyc2VIb3VyMjQsCiAgICAiaiI6IHBhcnNlRGF5T2ZZZWFyLAogICAgIkwiOiBwYXJzZU1pbGxpc2Vjb25kcywKICAgICJtIjogcGFyc2VNb250aE51bWJlciwKICAgICJNIjogcGFyc2VNaW51dGVzLAogICAgInAiOiBwYXJzZVBlcmlvZCwKICAgICJTIjogcGFyc2VTZWNvbmRzLAogICAgIlUiOiBwYXJzZVdlZWtOdW1iZXJTdW5kYXksCiAgICAidyI6IHBhcnNlV2Vla2RheU51bWJlciwKICAgICJXIjogcGFyc2VXZWVrTnVtYmVyTW9uZGF5LAogICAgIngiOiBwYXJzZUxvY2FsZURhdGUsCiAgICAiWCI6IHBhcnNlTG9jYWxlVGltZSwKICAgICJ5IjogcGFyc2VZZWFyLAogICAgIlkiOiBwYXJzZUZ1bGxZZWFyLAogICAgIloiOiBwYXJzZVpvbmUsCiAgICAiJSI6IHBhcnNlTGl0ZXJhbFBlcmNlbnQKICB9OwoKICAvLyBUaGVzZSByZWN1cnNpdmUgZGlyZWN0aXZlIGRlZmluaXRpb25zIG11c3QgYmUgZGVmZXJyZWQuCiAgZm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCBmb3JtYXRzKTsKICBmb3JtYXRzLlggPSBuZXdGb3JtYXQobG9jYWxlX3RpbWUsIGZvcm1hdHMpOwogIGZvcm1hdHMuYyA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsIGZvcm1hdHMpOwogIHV0Y0Zvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZSwgdXRjRm9ybWF0cyk7CiAgdXRjRm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCB1dGNGb3JtYXRzKTsKICB1dGNGb3JtYXRzLmMgPSBuZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLCB1dGNGb3JtYXRzKTsKCiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllciwgZm9ybWF0cykgewogICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgdmFyIHN0cmluZyA9IFtdLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgaiA9IDAsCiAgICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCwKICAgICAgICAgIGMsCiAgICAgICAgICBwYWQsCiAgICAgICAgICBmb3JtYXQ7CgogICAgICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIGRhdGUgPSBuZXcgRGF0ZSgrZGF0ZSk7CgogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGlmIChzcGVjaWZpZXIuY2hhckNvZGVBdChpKSA9PT0gMzcpIHsKICAgICAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7CiAgICAgICAgICBpZiAoKHBhZCA9IHBhZHNbYyA9IHNwZWNpZmllci5jaGFyQXQoKytpKV0pICE9IG51bGwpIGMgPSBzcGVjaWZpZXIuY2hhckF0KCsraSk7CiAgICAgICAgICBlbHNlIHBhZCA9IGMgPT09ICJlIiA/ICIgIiA6ICIwIjsKICAgICAgICAgIGlmIChmb3JtYXQgPSBmb3JtYXRzW2NdKSBjID0gZm9ybWF0KGRhdGUsIHBhZCk7CiAgICAgICAgICBzdHJpbmcucHVzaChjKTsKICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7CiAgICAgIHJldHVybiBzdHJpbmcuam9pbigiIik7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gbmV3UGFyc2Uoc3BlY2lmaWVyLCBuZXdEYXRlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgIHZhciBkID0gbmV3WWVhcigxOTAwKSwKICAgICAgICAgIGkgPSBwYXJzZVNwZWNpZmllcihkLCBzcGVjaWZpZXIsIHN0cmluZyArPSAiIiwgMCk7CiAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsOwoKICAgICAgLy8gVGhlIGFtLXBtIGZsYWcgaXMgMCBmb3IgQU0sIGFuZCAxIGZvciBQTS4KICAgICAgaWYgKCJwIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyOwoKICAgICAgLy8gQ29udmVydCBkYXktb2Ytd2VlayBhbmQgd2Vlay1vZi15ZWFyIHRvIGRheS1vZi15ZWFyLgogICAgICBpZiAoIlciIGluIGQgfHwgIlUiIGluIGQpIHsKICAgICAgICBpZiAoISgidyIgaW4gZCkpIGQudyA9ICJXIiBpbiBkID8gMSA6IDA7CiAgICAgICAgdmFyIGRheSQkMSA9ICJaIiBpbiBkID8gdXRjRGF0ZShuZXdZZWFyKGQueSkpLmdldFVUQ0RheSgpIDogbmV3RGF0ZShuZXdZZWFyKGQueSkpLmdldERheSgpOwogICAgICAgIGQubSA9IDA7CiAgICAgICAgZC5kID0gIlciIGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXkkJDEgKyA1KSAlIDcgOiBkLncgKyBkLlUgKiA3IC0gKGRheSQkMSArIDYpICUgNzsKICAgICAgfQoKICAgICAgLy8gSWYgYSB0aW1lIHpvbmUgaXMgc3BlY2lmaWVkLCBhbGwgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcyBVVEMgYW5kIHRoZW4KICAgICAgLy8gb2Zmc2V0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHRpbWUgem9uZS4KICAgICAgaWYgKCJaIiBpbiBkKSB7CiAgICAgICAgZC5IICs9IGQuWiAvIDEwMCB8IDA7CiAgICAgICAgZC5NICs9IGQuWiAlIDEwMDsKICAgICAgICByZXR1cm4gdXRjRGF0ZShkKTsKICAgICAgfQoKICAgICAgLy8gT3RoZXJ3aXNlLCBhbGwgZmllbGRzIGFyZSBpbiBsb2NhbCB0aW1lLgogICAgICByZXR1cm4gbmV3RGF0ZShkKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNwZWNpZmllcihkLCBzcGVjaWZpZXIsIHN0cmluZywgaikgewogICAgdmFyIGkgPSAwLAogICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLAogICAgICAgIG0gPSBzdHJpbmcubGVuZ3RoLAogICAgICAgIGMsCiAgICAgICAgcGFyc2U7CgogICAgd2hpbGUgKGkgPCBuKSB7CiAgICAgIGlmIChqID49IG0pIHJldHVybiAtMTsKICAgICAgYyA9IHNwZWNpZmllci5jaGFyQ29kZUF0KGkrKyk7CiAgICAgIGlmIChjID09PSAzNykgewogICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckF0KGkrKyk7CiAgICAgICAgcGFyc2UgPSBwYXJzZXNbYyBpbiBwYWRzID8gc3BlY2lmaWVyLmNoYXJBdChpKyspIDogY107CiAgICAgICAgaWYgKCFwYXJzZSB8fCAoKGogPSBwYXJzZShkLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7CiAgICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGo7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVBlcmlvZChkLCBzdHJpbmcsIGkpIHsKICAgIHZhciBuID0gcGVyaW9kUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC5wID0gcGVyaW9kTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU2hvcnRXZWVrZGF5KGQsIHN0cmluZywgaSkgewogICAgdmFyIG4gPSBzaG9ydFdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLncgPSBzaG9ydFdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGQsIHN0cmluZywgaSkgewogICAgdmFyIG4gPSB3ZWVrZGF5UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC53ID0gd2Vla2RheUxvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNob3J0TW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgICB2YXIgbiA9IHNob3J0TW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLm0gPSBzaG9ydE1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlTW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgICB2YXIgbiA9IG1vbnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC5tID0gbW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlVGltZShkLCBzdHJpbmcsIGkpIHsKICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZVRpbWUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZUxvY2FsZURhdGUoZCwgc3RyaW5nLCBpKSB7CiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX2RhdGUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZUxvY2FsZVRpbWUoZCwgc3RyaW5nLCBpKSB7CiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX3RpbWUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRTaG9ydFdlZWtkYXkoZCkgewogICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0RGF5KCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0V2Vla2RheShkKSB7CiAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0RGF5KCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRNb250aChkKSB7CiAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRNb250aChkKSB7CiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldE1vbnRoKCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0UGVyaW9kKGQpIHsKICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0SG91cnMoKSA+PSAxMildOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VVRDU2hvcnRXZWVrZGF5KGQpIHsKICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tkLmdldFVUQ0RheSgpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXkoZCkgewogICAgcmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldFVUQ0RheSgpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0TW9udGgoZCkgewogICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdldFVUQ01vbnRoKCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VVRDTW9udGgoZCkgewogICAgcmV0dXJuIGxvY2FsZV9tb250aHNbZC5nZXRVVENNb250aCgpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFVUQ1BlcmlvZChkKSB7CiAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldFVUQ0hvdXJzKCkgPj0gMTIpXTsKICB9CgogIHJldHVybiB7CiAgICBmb3JtYXQ6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIGZvcm1hdHMpOwogICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgIHJldHVybiBmOwogICAgfSwKICAgIHBhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gIiIsIGxvY2FsRGF0ZSk7CiAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsKICAgICAgcmV0dXJuIHA7CiAgICB9LAogICAgdXRjRm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoc3BlY2lmaWVyICs9ICIiLCB1dGNGb3JtYXRzKTsKICAgICAgZi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9OwogICAgICByZXR1cm4gZjsKICAgIH0sCiAgICB1dGNQYXJzZTogZnVuY3Rpb24oc3BlY2lmaWVyKSB7CiAgICAgIHZhciBwID0gbmV3UGFyc2Uoc3BlY2lmaWVyLCB1dGNEYXRlKTsKICAgICAgcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9OwogICAgICByZXR1cm4gcDsKICAgIH0KICB9Owp9Cgp2YXIgcGFkcyA9IHsiLSI6ICIiLCAiXyI6ICIgIiwgIjAiOiAiMCJ9Owp2YXIgbnVtYmVyUmUgPSAvXlxzKlxkKy87CnZhciBwZXJjZW50UmUgPSAvXiUvOwp2YXIgcmVxdW90ZVJlID0gL1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nOwoKZnVuY3Rpb24gcGFkKHZhbHVlLCBmaWxsLCB3aWR0aCkgewogIHZhciBzaWduID0gdmFsdWUgPCAwID8gIi0iIDogIiIsCiAgICAgIHN0cmluZyA9IChzaWduID8gLXZhbHVlIDogdmFsdWUpICsgIiIsCiAgICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7CiAgcmV0dXJuIHNpZ24gKyAobGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpICsgc3RyaW5nIDogc3RyaW5nKTsKfQoKZnVuY3Rpb24gcmVxdW90ZShzKSB7CiAgcmV0dXJuIHMucmVwbGFjZShyZXF1b3RlUmUsICJcXCQmIik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFJlKG5hbWVzKSB7CiAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKHJlcXVvdGUpLmpvaW4oInwiKSArICIpIiwgImkiKTsKfQoKZnVuY3Rpb24gZm9ybWF0TG9va3VwKG5hbWVzKSB7CiAgdmFyIG1hcCA9IHt9LCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgd2hpbGUgKCsraSA8IG4pIG1hcFtuYW1lc1tpXS50b0xvd2VyQ2FzZSgpXSA9IGk7CiAgcmV0dXJuIG1hcDsKfQoKZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTsKICByZXR1cm4gbiA/IChkLncgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJTdW5kYXkoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgcmV0dXJuIG4gPyAoZC5VID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VXZWVrTnVtYmVyTW9uZGF5KGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogIHJldHVybiBuID8gKGQuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlRnVsbFllYXIoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgNCkpOwogIHJldHVybiBuID8gKGQueSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlWWVhcihkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4gPyAoZC55ID0gK25bMF0gKyAoK25bMF0gPiA2OCA/IDE5MDAgOiAyMDAwKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVpvbmUoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSAvXihaKXwoWystXVxkXGQpKD86XDo/KFxkXGQpKT8vLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7CiAgcmV0dXJuIG4gPyAoZC5aID0gblsxXSA/IDAgOiAtKG5bMl0gKyAoblszXSB8fCAiMDAiKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VNb250aE51bWJlcihkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4gPyAoZC5tID0gblswXSAtIDEsIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VEYXlPZk1vbnRoKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZURheU9mWWVhcihkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7CiAgcmV0dXJuIG4gPyAoZC5tID0gMCwgZC5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VIb3VyMjQoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogIHJldHVybiBuID8gKGQuSCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlTWludXRlcyhkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4gPyAoZC5NID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VTZWNvbmRzKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkLlMgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZU1pbGxpc2Vjb25kcyhkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7CiAgcmV0dXJuIG4gPyAoZC5MID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VMaXRlcmFsUGVyY2VudChkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IHBlcmNlbnRSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogIHJldHVybiBuID8gaSArIG5bMF0ubGVuZ3RoIDogLTE7Cn0KCmZ1bmN0aW9uIGZvcm1hdERheU9mTW9udGgoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXREYXRlKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRIb3VyMjQoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRIb3VycygpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0SG91cjEyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0RGF5T2ZZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkKDEgKyBkYXkuY291bnQoeWVhcihkKSwgZCksIHAsIDMpOwp9CgpmdW5jdGlvbiBmb3JtYXRNaWxsaXNlY29uZHMoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRNaWxsaXNlY29uZHMoKSwgcCwgMyk7Cn0KCmZ1bmN0aW9uIGZvcm1hdE1vbnRoTnVtYmVyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0TW9udGgoKSArIDEsIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRNaW51dGVzKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0TWludXRlcygpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0U2Vjb25kcyhkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFNlY29uZHMoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJTdW5kYXkoZCwgcCkgewogIHJldHVybiBwYWQoc3VuZGF5LmNvdW50KHllYXIoZCksIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlcihkKSB7CiAgcmV0dXJuIGQuZ2V0RGF5KCk7Cn0KCmZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJNb25kYXkoZCwgcCkgewogIHJldHVybiBwYWQobW9uZGF5LmNvdW50KHllYXIoZCksIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0WWVhcihkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldEZ1bGxZZWFyKCkgJSAxMDAsIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRGdWxsWWVhcihkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldEZ1bGxZZWFyKCkgJSAxMDAwMCwgcCwgNCk7Cn0KCmZ1bmN0aW9uIGZvcm1hdFpvbmUoZCkgewogIHZhciB6ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpOwogIHJldHVybiAoeiA+IDAgPyAiLSIgOiAoeiAqPSAtMSwgIisiKSkKICAgICAgKyBwYWQoeiAvIDYwIHwgMCwgIjAiLCAyKQogICAgICArIHBhZCh6ICUgNjAsICIwIiwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ0RheU9mTW9udGgoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRVVENEYXRlKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENIb3VyMjQoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRVVENIb3VycygpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDSG91cjEyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0VVRDSG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDRGF5T2ZZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkKDEgKyB1dGNEYXkuY291bnQodXRjWWVhcihkKSwgZCksIHAsIDMpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENNaWxsaXNlY29uZHMoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRVVENNaWxsaXNlY29uZHMoKSwgcCwgMyk7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ01vbnRoTnVtYmVyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEsIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0VVRDTWludXRlcygpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDU2Vjb25kcyhkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFVUQ1NlY29uZHMoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJTdW5kYXkoZCwgcCkgewogIHJldHVybiBwYWQodXRjU3VuZGF5LmNvdW50KHV0Y1llYXIoZCksIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlcihkKSB7CiAgcmV0dXJuIGQuZ2V0VVRDRGF5KCk7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXkoZCwgcCkgewogIHJldHVybiBwYWQodXRjTW9uZGF5LmNvdW50KHV0Y1llYXIoZCksIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDWWVhcihkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAsIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENGdWxsWWVhcihkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAwMCwgcCwgNCk7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ1pvbmUoKSB7CiAgcmV0dXJuICIrMDAwMCI7Cn0KCmZ1bmN0aW9uIGZvcm1hdExpdGVyYWxQZXJjZW50KCkgewogIHJldHVybiAiJSI7Cn0KCnZhciBsb2NhbGUkMjsKCgoKCgpkZWZhdWx0TG9jYWxlJDEoewogIGRhdGVUaW1lOiAiJXgsICVYIiwKICBkYXRlOiAiJS1tLyUtZC8lWSIsCiAgdGltZTogIiUtSTolTTolUyAlcCIsCiAgcGVyaW9kczogWyJBTSIsICJQTSJdLAogIGRheXM6IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXSwKICBzaG9ydERheXM6IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il0sCiAgbW9udGhzOiBbIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICBzaG9ydE1vbnRoczogWyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdCn0pOwoKZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQxKGRlZmluaXRpb24pIHsKICBsb2NhbGUkMiA9IGZvcm1hdExvY2FsZSQxKGRlZmluaXRpb24pOwogIGV4cG9ydHMudGltZUZvcm1hdCA9IGxvY2FsZSQyLmZvcm1hdDsKICBleHBvcnRzLnRpbWVQYXJzZSA9IGxvY2FsZSQyLnBhcnNlOwogIGV4cG9ydHMudXRjRm9ybWF0ID0gbG9jYWxlJDIudXRjRm9ybWF0OwogIGV4cG9ydHMudXRjUGFyc2UgPSBsb2NhbGUkMi51dGNQYXJzZTsKICByZXR1cm4gbG9jYWxlJDI7Cn0KCnZhciBpc29TcGVjaWZpZXIgPSAiJVktJW0tJWRUJUg6JU06JVMuJUxaIjsKCmZ1bmN0aW9uIGZvcm1hdElzb05hdGl2ZShkYXRlKSB7CiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKTsKfQoKdmFyIGZvcm1hdElzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nCiAgICA/IGZvcm1hdElzb05hdGl2ZQogICAgOiBleHBvcnRzLnV0Y0Zvcm1hdChpc29TcGVjaWZpZXIpOwoKZnVuY3Rpb24gcGFyc2VJc29OYXRpdmUoc3RyaW5nKSB7CiAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcpOwogIHJldHVybiBpc05hTihkYXRlKSA/IG51bGwgOiBkYXRlOwp9Cgp2YXIgcGFyc2VJc28gPSArbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpCiAgICA/IHBhcnNlSXNvTmF0aXZlCiAgICA6IGV4cG9ydHMudXRjUGFyc2UoaXNvU3BlY2lmaWVyKTsKCnZhciBhcnJheSQyID0gQXJyYXkucHJvdG90eXBlOwoKdmFyIG1hcCQzID0gYXJyYXkkMi5tYXA7CnZhciBzbGljZSQzID0gYXJyYXkkMi5zbGljZTsKCnZhciBpbXBsaWNpdCA9IHtuYW1lOiAiaW1wbGljaXQifTsKCmZ1bmN0aW9uIG9yZGluYWwocmFuZ2UpIHsKICB2YXIgaW5kZXggPSBtYXAkMSgpLAogICAgICBkb21haW4gPSBbXSwKICAgICAgdW5rbm93biA9IGltcGxpY2l0OwoKICByYW5nZSA9IHJhbmdlID09IG51bGwgPyBbXSA6IHNsaWNlJDMuY2FsbChyYW5nZSk7CgogIGZ1bmN0aW9uIHNjYWxlKGQpIHsKICAgIHZhciBrZXkgPSBkICsgIiIsIGkgPSBpbmRleC5nZXQoa2V5KTsKICAgIGlmICghaSkgewogICAgICBpZiAodW5rbm93biAhPT0gaW1wbGljaXQpIHJldHVybiB1bmtub3duOwogICAgICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpOwogICAgfQogICAgcmV0dXJuIHJhbmdlWyhpIC0gMSkgJSByYW5nZS5sZW5ndGhdOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7CiAgICBkb21haW4gPSBbXSwgaW5kZXggPSBtYXAkMSgpOwogICAgdmFyIGkgPSAtMSwgbiA9IF8ubGVuZ3RoLCBkLCBrZXk7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoa2V5ID0gKGQgPSBfW2ldKSArICIiKSkgaW5kZXguc2V0KGtleSwgZG9tYWluLnB1c2goZCkpOwogICAgcmV0dXJuIHNjYWxlOwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZSQzLmNhbGwoXyksIHNjYWxlKSA6IHJhbmdlLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwogIH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBvcmRpbmFsKCkKICAgICAgICAuZG9tYWluKGRvbWFpbikKICAgICAgICAucmFuZ2UocmFuZ2UpCiAgICAgICAgLnVua25vd24odW5rbm93bik7CiAgfTsKCiAgcmV0dXJuIHNjYWxlOwp9CgpmdW5jdGlvbiBiYW5kKCkgewogIHZhciBzY2FsZSA9IG9yZGluYWwoKS51bmtub3duKHVuZGVmaW5lZCksCiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbiwKICAgICAgb3JkaW5hbFJhbmdlID0gc2NhbGUucmFuZ2UsCiAgICAgIHJhbmdlJCQxID0gWzAsIDFdLAogICAgICBzdGVwLAogICAgICBiYW5kd2lkdGgsCiAgICAgIHJvdW5kID0gZmFsc2UsCiAgICAgIHBhZGRpbmdJbm5lciA9IDAsCiAgICAgIHBhZGRpbmdPdXRlciA9IDAsCiAgICAgIGFsaWduID0gMC41OwoKICBkZWxldGUgc2NhbGUudW5rbm93bjsKCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgIHZhciBuID0gZG9tYWluKCkubGVuZ3RoLAogICAgICAgIHJldmVyc2UgPSByYW5nZSQkMVsxXSA8IHJhbmdlJCQxWzBdLAogICAgICAgIHN0YXJ0ID0gcmFuZ2UkJDFbcmV2ZXJzZSAtIDBdLAogICAgICAgIHN0b3AgPSByYW5nZSQkMVsxIC0gcmV2ZXJzZV07CiAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgxLCBuIC0gcGFkZGluZ0lubmVyICsgcGFkZGluZ091dGVyICogMik7CiAgICBpZiAocm91bmQpIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApOwogICAgc3RhcnQgKz0gKHN0b3AgLSBzdGFydCAtIHN0ZXAgKiAobiAtIHBhZGRpbmdJbm5lcikpICogYWxpZ247CiAgICBiYW5kd2lkdGggPSBzdGVwICogKDEgLSBwYWRkaW5nSW5uZXIpOwogICAgaWYgKHJvdW5kKSBzdGFydCA9IE1hdGgucm91bmQoc3RhcnQpLCBiYW5kd2lkdGggPSBNYXRoLnJvdW5kKGJhbmR3aWR0aCk7CiAgICB2YXIgdmFsdWVzID0gcmFuZ2UobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pOwogICAgcmV0dXJuIG9yZGluYWxSYW5nZShyZXZlcnNlID8gdmFsdWVzLnJldmVyc2UoKSA6IHZhbHVlcyk7CiAgfQoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4oXyksIHJlc2NhbGUoKSkgOiBkb21haW4oKTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gWytfWzBdLCArX1sxXV0sIHJlc2NhbGUoKSkgOiByYW5nZSQkMS5zbGljZSgpOwogIH07CgogIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gcmFuZ2UkJDEgPSBbK19bMF0sICtfWzFdXSwgcm91bmQgPSB0cnVlLCByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUuYmFuZHdpZHRoID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gYmFuZHdpZHRoOwogIH07CgogIHNjYWxlLnN0ZXAgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBzdGVwOwogIH07CgogIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIV8sIHJlc2NhbGUoKSkgOiByb3VuZDsKICB9OwoKICBzY2FsZS5wYWRkaW5nID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gcGFkZGluZ091dGVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyOwogIH07CgogIHNjYWxlLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjsKICB9OwoKICBzY2FsZS5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nT3V0ZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBwYWRkaW5nT3V0ZXI7CiAgfTsKCiAgc2NhbGUuYWxpZ24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbGlnbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IGFsaWduOwogIH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBiYW5kKCkKICAgICAgICAuZG9tYWluKGRvbWFpbigpKQogICAgICAgIC5yYW5nZShyYW5nZSQkMSkKICAgICAgICAucm91bmQocm91bmQpCiAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpCiAgICAgICAgLnBhZGRpbmdPdXRlcihwYWRkaW5nT3V0ZXIpCiAgICAgICAgLmFsaWduKGFsaWduKTsKICB9OwoKICByZXR1cm4gcmVzY2FsZSgpOwp9CgpmdW5jdGlvbiBwb2ludGlzaChzY2FsZSkgewogIHZhciBjb3B5ID0gc2NhbGUuY29weTsKCiAgc2NhbGUucGFkZGluZyA9IHNjYWxlLnBhZGRpbmdPdXRlcjsKICBkZWxldGUgc2NhbGUucGFkZGluZ0lubmVyOwogIGRlbGV0ZSBzY2FsZS5wYWRkaW5nT3V0ZXI7CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBwb2ludGlzaChjb3B5KCkpOwogIH07CgogIHJldHVybiBzY2FsZTsKfQoKZnVuY3Rpb24gcG9pbnQkNCgpIHsKICByZXR1cm4gcG9pbnRpc2goYmFuZCgpLnBhZGRpbmdJbm5lcigxKSk7Cn0KCnZhciBjb25zdGFudCQ0ID0gZnVuY3Rpb24oeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCnZhciBudW1iZXIkMSA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4gK3g7Cn0KCnZhciB1bml0ID0gWzAsIDFdOwoKZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZUxpbmVhcihhLCBiKSB7CiAgcmV0dXJuIChiIC09IChhID0gK2EpKQogICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgLyBiOyB9CiAgICAgIDogY29uc3RhbnQkNChiKTsKfQoKZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZUNsYW1wKGRlaW50ZXJwb2xhdGUpIHsKICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgdmFyIGQgPSBkZWludGVycG9sYXRlKGEgPSArYSwgYiA9ICtiKTsKICAgIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiB4IDw9IGEgPyAwIDogeCA+PSBiID8gMSA6IGQoeCk7IH07CiAgfTsKfQoKZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZUNsYW1wKHJlaW50ZXJwb2xhdGUpIHsKICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgdmFyIHIgPSByZWludGVycG9sYXRlKGEgPSArYSwgYiA9ICtiKTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7IHJldHVybiB0IDw9IDAgPyBhIDogdCA+PSAxID8gYiA6IHIodCk7IH07CiAgfTsKfQoKZnVuY3Rpb24gYmltYXAoZG9tYWluLCByYW5nZSQkMSwgZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkgewogIHZhciBkMCA9IGRvbWFpblswXSwgZDEgPSBkb21haW5bMV0sIHIwID0gcmFuZ2UkJDFbMF0sIHIxID0gcmFuZ2UkJDFbMV07CiAgaWYgKGQxIDwgZDApIGQwID0gZGVpbnRlcnBvbGF0ZShkMSwgZDApLCByMCA9IHJlaW50ZXJwb2xhdGUocjEsIHIwKTsKICBlbHNlIGQwID0gZGVpbnRlcnBvbGF0ZShkMCwgZDEpLCByMCA9IHJlaW50ZXJwb2xhdGUocjAsIHIxKTsKICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gcjAoZDAoeCkpOyB9Owp9CgpmdW5jdGlvbiBwb2x5bWFwKGRvbWFpbiwgcmFuZ2UkJDEsIGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsKICB2YXIgaiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlJCQxLmxlbmd0aCkgLSAxLAogICAgICBkID0gbmV3IEFycmF5KGopLAogICAgICByID0gbmV3IEFycmF5KGopLAogICAgICBpID0gLTE7CgogIC8vIFJldmVyc2UgZGVzY2VuZGluZyBkb21haW5zLgogIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHsKICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpLnJldmVyc2UoKTsKICAgIHJhbmdlJCQxID0gcmFuZ2UkJDEuc2xpY2UoKS5yZXZlcnNlKCk7CiAgfQoKICB3aGlsZSAoKytpIDwgaikgewogICAgZFtpXSA9IGRlaW50ZXJwb2xhdGUoZG9tYWluW2ldLCBkb21haW5baSArIDFdKTsKICAgIHJbaV0gPSByZWludGVycG9sYXRlKHJhbmdlJCQxW2ldLCByYW5nZSQkMVtpICsgMV0pOwogIH0KCiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgIHZhciBpID0gYmlzZWN0UmlnaHQoZG9tYWluLCB4LCAxLCBqKSAtIDE7CiAgICByZXR1cm4gcltpXShkW2ldKHgpKTsKICB9Owp9CgpmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7CiAgcmV0dXJuIHRhcmdldAogICAgICAuZG9tYWluKHNvdXJjZS5kb21haW4oKSkKICAgICAgLnJhbmdlKHNvdXJjZS5yYW5nZSgpKQogICAgICAuaW50ZXJwb2xhdGUoc291cmNlLmludGVycG9sYXRlKCkpCiAgICAgIC5jbGFtcChzb3VyY2UuY2xhbXAoKSk7Cn0KCi8vIGRlaW50ZXJwb2xhdGUoYSwgYikoeCkgdGFrZXMgYSBkb21haW4gdmFsdWUgeCBpbiBbYSxiXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgdCBpbiBbMCwxXS4KLy8gcmVpbnRlcnBvbGF0ZShhLCBiKSh0KSB0YWtlcyBhIHBhcmFtZXRlciB0IGluIFswLDFdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGRvbWFpbiB2YWx1ZSB4IGluIFthLGJdLgpmdW5jdGlvbiBjb250aW51b3VzKGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsKICB2YXIgZG9tYWluID0gdW5pdCwKICAgICAgcmFuZ2UkJDEgPSB1bml0LAogICAgICBpbnRlcnBvbGF0ZSQkMSA9IGludGVycG9sYXRlLAogICAgICBjbGFtcCA9IGZhbHNlLAogICAgICBwaWVjZXdpc2UsCiAgICAgIG91dHB1dCwKICAgICAgaW5wdXQ7CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICBwaWVjZXdpc2UgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGgpID4gMiA/IHBvbHltYXAgOiBiaW1hcDsKICAgIG91dHB1dCA9IGlucHV0ID0gbnVsbDsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgIHJldHVybiAob3V0cHV0IHx8IChvdXRwdXQgPSBwaWVjZXdpc2UoZG9tYWluLCByYW5nZSQkMSwgY2xhbXAgPyBkZWludGVycG9sYXRlQ2xhbXAoZGVpbnRlcnBvbGF0ZSkgOiBkZWludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSQkMSkpKSgreCk7CiAgfQoKICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7CiAgICByZXR1cm4gKGlucHV0IHx8IChpbnB1dCA9IHBpZWNld2lzZShyYW5nZSQkMSwgZG9tYWluLCBkZWludGVycG9sYXRlTGluZWFyLCBjbGFtcCA/IHJlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKSA6IHJlaW50ZXJwb2xhdGUpKSkoK3kpOwogIH07CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQzLmNhbGwoXywgbnVtYmVyJDEpLCByZXNjYWxlKCkpIDogZG9tYWluLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSQkMSA9IHNsaWNlJDMuY2FsbChfKSwgcmVzY2FsZSgpKSA6IHJhbmdlJCQxLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiByYW5nZSQkMSA9IHNsaWNlJDMuY2FsbChfKSwgaW50ZXJwb2xhdGUkJDEgPSBpbnRlcnBvbGF0ZVJvdW5kLCByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9ICEhXywgcmVzY2FsZSgpKSA6IGNsYW1wOwogIH07CgogIHNjYWxlLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUkJDEgPSBfLCByZXNjYWxlKCkpIDogaW50ZXJwb2xhdGUkJDE7CiAgfTsKCiAgcmV0dXJuIHJlc2NhbGUoKTsKfQoKdmFyIHRpY2tGb3JtYXQgPSBmdW5jdGlvbihkb21haW4sIGNvdW50LCBzcGVjaWZpZXIpIHsKICB2YXIgc3RhcnQgPSBkb21haW5bMF0sCiAgICAgIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdLAogICAgICBzdGVwID0gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KSwKICAgICAgcHJlY2lzaW9uOwogIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIgPT0gbnVsbCA/ICIsZiIgOiBzcGVjaWZpZXIpOwogIHN3aXRjaCAoc3BlY2lmaWVyLnR5cGUpIHsKICAgIGNhc2UgInMiOiB7CiAgICAgIHZhciB2YWx1ZSA9IE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpOwogICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25QcmVmaXgoc3RlcCwgdmFsdWUpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbjsKICAgICAgcmV0dXJuIGV4cG9ydHMuZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpOwogICAgfQogICAgY2FzZSAiIjoKICAgIGNhc2UgImUiOgogICAgY2FzZSAiZyI6CiAgICBjYXNlICJwIjoKICAgIGNhc2UgInIiOiB7CiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvblJvdW5kKHN0ZXAsIE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09ICJlIik7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAiZiI6CiAgICBjYXNlICIlIjogewogICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25GaXhlZChzdGVwKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09ICIlIikgKiAyOwogICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIGV4cG9ydHMuZm9ybWF0KHNwZWNpZmllcik7Cn0KCmZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkgewogIHZhciBkb21haW4gPSBzY2FsZS5kb21haW47CgogIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHsKICAgIHZhciBkID0gZG9tYWluKCk7CiAgICByZXR1cm4gdGlja3MoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCk7CiAgfTsKCiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHsKICAgIHJldHVybiB0aWNrRm9ybWF0KGRvbWFpbigpLCBjb3VudCwgc3BlY2lmaWVyKTsKICB9OwoKICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oY291bnQpIHsKICAgIHZhciBkID0gZG9tYWluKCksCiAgICAgICAgaSA9IGQubGVuZ3RoIC0gMSwKICAgICAgICBuID0gY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQsCiAgICAgICAgc3RhcnQgPSBkWzBdLAogICAgICAgIHN0b3AgPSBkW2ldLAogICAgICAgIHN0ZXAgPSB0aWNrU3RlcChzdGFydCwgc3RvcCwgbik7CgogICAgaWYgKHN0ZXApIHsKICAgICAgc3RlcCA9IHRpY2tTdGVwKE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXAsIE1hdGguY2VpbChzdG9wIC8gc3RlcCkgKiBzdGVwLCBuKTsKICAgICAgZFswXSA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7CiAgICAgIGRbaV0gPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsKICAgICAgZG9tYWluKGQpOwogICAgfQoKICAgIHJldHVybiBzY2FsZTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIGxpbmVhciQyKCkgewogIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZUxpbmVhciwgaW50ZXJwb2xhdGVOdW1iZXIpOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gY29weShzY2FsZSwgbGluZWFyJDIoKSk7CiAgfTsKCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7Cn0KCmZ1bmN0aW9uIGlkZW50aXR5JDQoKSB7CiAgdmFyIGRvbWFpbiA9IFswLCAxXTsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuICt4OwogIH0KCiAgc2NhbGUuaW52ZXJ0ID0gc2NhbGU7CgogIHNjYWxlLmRvbWFpbiA9IHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDMuY2FsbChfLCBudW1iZXIkMSksIHNjYWxlKSA6IGRvbWFpbi5zbGljZSgpOwogIH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBpZGVudGl0eSQ0KCkuZG9tYWluKGRvbWFpbik7CiAgfTsKCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7Cn0KCnZhciBuaWNlID0gZnVuY3Rpb24oZG9tYWluLCBpbnRlcnZhbCkgewogIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpOwoKICB2YXIgaTAgPSAwLAogICAgICBpMSA9IGRvbWFpbi5sZW5ndGggLSAxLAogICAgICB4MCA9IGRvbWFpbltpMF0sCiAgICAgIHgxID0gZG9tYWluW2kxXSwKICAgICAgdDsKCiAgaWYgKHgxIDwgeDApIHsKICAgIHQgPSBpMCwgaTAgPSBpMSwgaTEgPSB0OwogICAgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7CiAgfQoKICBkb21haW5baTBdID0gaW50ZXJ2YWwuZmxvb3IoeDApOwogIGRvbWFpbltpMV0gPSBpbnRlcnZhbC5jZWlsKHgxKTsKICByZXR1cm4gZG9tYWluOwp9CgpmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsIGIpIHsKICByZXR1cm4gKGIgPSBNYXRoLmxvZyhiIC8gYSkpCiAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5sb2coeCAvIGEpIC8gYjsgfQogICAgICA6IGNvbnN0YW50JDQoYik7Cn0KCmZ1bmN0aW9uIHJlaW50ZXJwb2xhdGUoYSwgYikgewogIHJldHVybiBhIDwgMAogICAgICA/IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIC1NYXRoLnBvdygtYiwgdCkgKiBNYXRoLnBvdygtYSwgMSAtIHQpOyB9CiAgICAgIDogZnVuY3Rpb24odCkgeyByZXR1cm4gTWF0aC5wb3coYiwgdCkgKiBNYXRoLnBvdyhhLCAxIC0gdCk7IH07Cn0KCmZ1bmN0aW9uIHBvdzEwKHgpIHsKICByZXR1cm4gaXNGaW5pdGUoeCkgPyArKCIxZSIgKyB4KSA6IHggPCAwID8gMCA6IHg7Cn0KCmZ1bmN0aW9uIHBvd3AoYmFzZSkgewogIHJldHVybiBiYXNlID09PSAxMCA/IHBvdzEwCiAgICAgIDogYmFzZSA9PT0gTWF0aC5FID8gTWF0aC5leHAKICAgICAgOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnBvdyhiYXNlLCB4KTsgfTsKfQoKZnVuY3Rpb24gbG9ncChiYXNlKSB7CiAgcmV0dXJuIGJhc2UgPT09IE1hdGguRSA/IE1hdGgubG9nCiAgICAgIDogYmFzZSA9PT0gMTAgJiYgTWF0aC5sb2cxMAogICAgICB8fCBiYXNlID09PSAyICYmIE1hdGgubG9nMgogICAgICB8fCAoYmFzZSA9IE1hdGgubG9nKGJhc2UpLCBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4KSAvIGJhc2U7IH0pOwp9CgpmdW5jdGlvbiByZWZsZWN0KGYpIHsKICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIC1mKC14KTsKICB9Owp9CgpmdW5jdGlvbiBsb2coKSB7CiAgdmFyIHNjYWxlID0gY29udGludW91cyhkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKS5kb21haW4oWzEsIDEwXSksCiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbiwKICAgICAgYmFzZSA9IDEwLAogICAgICBsb2dzID0gbG9ncCgxMCksCiAgICAgIHBvd3MgPSBwb3dwKDEwKTsKCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgIGxvZ3MgPSBsb2dwKGJhc2UpLCBwb3dzID0gcG93cChiYXNlKTsKICAgIGlmIChkb21haW4oKVswXSA8IDApIGxvZ3MgPSByZWZsZWN0KGxvZ3MpLCBwb3dzID0gcmVmbGVjdChwb3dzKTsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIHNjYWxlLmJhc2UgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXNlID0gK18sIHJlc2NhbGUoKSkgOiBiYXNlOwogIH07CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpOwogIH07CgogIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHsKICAgIHZhciBkID0gZG9tYWluKCksCiAgICAgICAgdSA9IGRbMF0sCiAgICAgICAgdiA9IGRbZC5sZW5ndGggLSAxXSwKICAgICAgICByOwoKICAgIGlmIChyID0gdiA8IHUpIGkgPSB1LCB1ID0gdiwgdiA9IGk7CgogICAgdmFyIGkgPSBsb2dzKHUpLAogICAgICAgIGogPSBsb2dzKHYpLAogICAgICAgIHAsCiAgICAgICAgaywKICAgICAgICB0LAogICAgICAgIG4gPSBjb3VudCA9PSBudWxsID8gMTAgOiArY291bnQsCiAgICAgICAgeiA9IFtdOwoKICAgIGlmICghKGJhc2UgJSAxKSAmJiBqIC0gaSA8IG4pIHsKICAgICAgaSA9IE1hdGgucm91bmQoaSkgLSAxLCBqID0gTWF0aC5yb3VuZChqKSArIDE7CiAgICAgIGlmICh1ID4gMCkgZm9yICg7IGkgPCBqOyArK2kpIHsKICAgICAgICBmb3IgKGsgPSAxLCBwID0gcG93cyhpKTsgayA8IGJhc2U7ICsraykgewogICAgICAgICAgdCA9IHAgKiBrOwogICAgICAgICAgaWYgKHQgPCB1KSBjb250aW51ZTsKICAgICAgICAgIGlmICh0ID4gdikgYnJlYWs7CiAgICAgICAgICB6LnB1c2godCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgZm9yICg7IGkgPCBqOyArK2kpIHsKICAgICAgICBmb3IgKGsgPSBiYXNlIC0gMSwgcCA9IHBvd3MoaSk7IGsgPj0gMTsgLS1rKSB7CiAgICAgICAgICB0ID0gcCAqIGs7CiAgICAgICAgICBpZiAodCA8IHUpIGNvbnRpbnVlOwogICAgICAgICAgaWYgKHQgPiB2KSBicmVhazsKICAgICAgICAgIHoucHVzaCh0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHogPSB0aWNrcyhpLCBqLCBNYXRoLm1pbihqIC0gaSwgbikpLm1hcChwb3dzKTsKICAgIH0KCiAgICByZXR1cm4gciA/IHoucmV2ZXJzZSgpIDogejsKICB9OwoKICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgewogICAgaWYgKHNwZWNpZmllciA9PSBudWxsKSBzcGVjaWZpZXIgPSBiYXNlID09PSAxMCA/ICIuMGUiIDogIiwiOwogICAgaWYgKHR5cGVvZiBzcGVjaWZpZXIgIT09ICJmdW5jdGlvbiIpIHNwZWNpZmllciA9IGV4cG9ydHMuZm9ybWF0KHNwZWNpZmllcik7CiAgICBpZiAoY291bnQgPT09IEluZmluaXR5KSByZXR1cm4gc3BlY2lmaWVyOwogICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMTA7CiAgICB2YXIgayA9IE1hdGgubWF4KDEsIGJhc2UgKiBjb3VudCAvIHNjYWxlLnRpY2tzKCkubGVuZ3RoKTsgLy8gVE9ETyBmYXN0IGVzdGltYXRlPwogICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsKICAgICAgdmFyIGkgPSBkIC8gcG93cyhNYXRoLnJvdW5kKGxvZ3MoZCkpKTsKICAgICAgaWYgKGkgKiBiYXNlIDwgYmFzZSAtIDAuNSkgaSAqPSBiYXNlOwogICAgICByZXR1cm4gaSA8PSBrID8gc3BlY2lmaWVyKGQpIDogIiI7CiAgICB9OwogIH07CgogIHNjYWxlLm5pY2UgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkb21haW4obmljZShkb21haW4oKSwgewogICAgICBmbG9vcjogZnVuY3Rpb24oeCkgeyByZXR1cm4gcG93cyhNYXRoLmZsb29yKGxvZ3MoeCkpKTsgfSwKICAgICAgY2VpbDogZnVuY3Rpb24oeCkgeyByZXR1cm4gcG93cyhNYXRoLmNlaWwobG9ncyh4KSkpOyB9CiAgICB9KSk7CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxvZygpLmJhc2UoYmFzZSkpOwogIH07CgogIHJldHVybiBzY2FsZTsKfQoKZnVuY3Rpb24gcmFpc2UoeCwgZXhwb25lbnQpIHsKICByZXR1cm4geCA8IDAgPyAtTWF0aC5wb3coLXgsIGV4cG9uZW50KSA6IE1hdGgucG93KHgsIGV4cG9uZW50KTsKfQoKZnVuY3Rpb24gcG93KCkgewogIHZhciBleHBvbmVudCA9IDEsCiAgICAgIHNjYWxlID0gY29udGludW91cyhkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKSwKICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluOwoKICBmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsIGIpIHsKICAgIHJldHVybiAoYiA9IHJhaXNlKGIsIGV4cG9uZW50KSAtIChhID0gcmFpc2UoYSwgZXhwb25lbnQpKSkKICAgICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIChyYWlzZSh4LCBleHBvbmVudCkgLSBhKSAvIGI7IH0KICAgICAgICA6IGNvbnN0YW50JDQoYik7CiAgfQoKICBmdW5jdGlvbiByZWludGVycG9sYXRlKGEsIGIpIHsKICAgIGIgPSByYWlzZShiLCBleHBvbmVudCkgLSAoYSA9IHJhaXNlKGEsIGV4cG9uZW50KSk7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgeyByZXR1cm4gcmFpc2UoYSArIGIgKiB0LCAxIC8gZXhwb25lbnQpOyB9OwogIH0KCiAgc2NhbGUuZXhwb25lbnQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHBvbmVudCA9ICtfLCBkb21haW4oZG9tYWluKCkpKSA6IGV4cG9uZW50OwogIH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBjb3B5KHNjYWxlLCBwb3coKS5leHBvbmVudChleHBvbmVudCkpOwogIH07CgogIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOwp9CgpmdW5jdGlvbiBzcXJ0KCkgewogIHJldHVybiBwb3coKS5leHBvbmVudCgwLjUpOwp9CgpmdW5jdGlvbiBxdWFudGlsZSQkMSgpIHsKICB2YXIgZG9tYWluID0gW10sCiAgICAgIHJhbmdlJCQxID0gW10sCiAgICAgIHRocmVzaG9sZHMgPSBbXTsKCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgIHZhciBpID0gMCwgbiA9IE1hdGgubWF4KDEsIHJhbmdlJCQxLmxlbmd0aCk7CiAgICB0aHJlc2hvbGRzID0gbmV3IEFycmF5KG4gLSAxKTsKICAgIHdoaWxlICgrK2kgPCBuKSB0aHJlc2hvbGRzW2kgLSAxXSA9IHRocmVzaG9sZChkb21haW4sIGkgLyBuKTsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgIGlmICghaXNOYU4oeCA9ICt4KSkgcmV0dXJuIHJhbmdlJCQxW2Jpc2VjdFJpZ2h0KHRocmVzaG9sZHMsIHgpXTsKICB9CgogIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsKICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0gOiBbCiAgICAgIGkgPiAwID8gdGhyZXNob2xkc1tpIC0gMV0gOiBkb21haW5bMF0sCiAgICAgIGkgPCB0aHJlc2hvbGRzLmxlbmd0aCA/IHRocmVzaG9sZHNbaV0gOiBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdCiAgICBdOwogIH07CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpOwogICAgZG9tYWluID0gW107CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IF8ubGVuZ3RoLCBkOyBpIDwgbjsgKytpKSBpZiAoZCA9IF9baV0sIGQgIT0gbnVsbCAmJiAhaXNOYU4oZCA9ICtkKSkgZG9tYWluLnB1c2goZCk7CiAgICBkb21haW4uc29ydChhc2NlbmRpbmcpOwogICAgcmV0dXJuIHJlc2NhbGUoKTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gc2xpY2UkMy5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2UkJDEuc2xpY2UoKTsKICB9OwoKICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aHJlc2hvbGRzLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHF1YW50aWxlJCQxKCkKICAgICAgICAuZG9tYWluKGRvbWFpbikKICAgICAgICAucmFuZ2UocmFuZ2UkJDEpOwogIH07CgogIHJldHVybiBzY2FsZTsKfQoKZnVuY3Rpb24gcXVhbnRpemUkMSgpIHsKICB2YXIgeDAgPSAwLAogICAgICB4MSA9IDEsCiAgICAgIG4gPSAxLAogICAgICBkb21haW4gPSBbMC41XSwKICAgICAgcmFuZ2UkJDEgPSBbMCwgMV07CgogIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgIGlmICh4IDw9IHgpIHJldHVybiByYW5nZSQkMVtiaXNlY3RSaWdodChkb21haW4sIHgsIDAsIG4pXTsKICB9CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICB2YXIgaSA9IC0xOwogICAgZG9tYWluID0gbmV3IEFycmF5KG4pOwogICAgd2hpbGUgKCsraSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAxKTsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gK19bMF0sIHgxID0gK19bMV0sIHJlc2NhbGUoKSkgOiBbeDAsIHgxXTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG4gPSAocmFuZ2UkJDEgPSBzbGljZSQzLmNhbGwoXykpLmxlbmd0aCAtIDEsIHJlc2NhbGUoKSkgOiByYW5nZSQkMS5zbGljZSgpOwogIH07CgogIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsKICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0KICAgICAgICA6IGkgPCAxID8gW3gwLCBkb21haW5bMF1dCiAgICAgICAgOiBpID49IG4gPyBbZG9tYWluW24gLSAxXSwgeDFdCiAgICAgICAgOiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcXVhbnRpemUkMSgpCiAgICAgICAgLmRvbWFpbihbeDAsIHgxXSkKICAgICAgICAucmFuZ2UocmFuZ2UkJDEpOwogIH07CgogIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOwp9CgpmdW5jdGlvbiB0aHJlc2hvbGQkMSgpIHsKICB2YXIgZG9tYWluID0gWzAuNV0sCiAgICAgIHJhbmdlJCQxID0gWzAsIDFdLAogICAgICBuID0gMTsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlJCQxW2Jpc2VjdFJpZ2h0KGRvbWFpbiwgeCwgMCwgbildOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gc2xpY2UkMy5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UkJDEubGVuZ3RoIC0gMSksIHNjYWxlKSA6IGRvbWFpbi5zbGljZSgpOwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZSQzLmNhbGwoXyksIG4gPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGggLSAxKSwgc2NhbGUpIDogcmFuZ2UkJDEuc2xpY2UoKTsKICB9OwoKICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7CiAgICB2YXIgaSA9IHJhbmdlJCQxLmluZGV4T2YoeSk7CiAgICByZXR1cm4gW2RvbWFpbltpIC0gMV0sIGRvbWFpbltpXV07CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRocmVzaG9sZCQxKCkKICAgICAgICAuZG9tYWluKGRvbWFpbikKICAgICAgICAucmFuZ2UocmFuZ2UkJDEpOwogIH07CgogIHJldHVybiBzY2FsZTsKfQoKdmFyIGR1cmF0aW9uU2Vjb25kJDEgPSAxMDAwOwp2YXIgZHVyYXRpb25NaW51dGUkMSA9IGR1cmF0aW9uU2Vjb25kJDEgKiA2MDsKdmFyIGR1cmF0aW9uSG91ciQxID0gZHVyYXRpb25NaW51dGUkMSAqIDYwOwp2YXIgZHVyYXRpb25EYXkkMSA9IGR1cmF0aW9uSG91ciQxICogMjQ7CnZhciBkdXJhdGlvbldlZWskMSA9IGR1cmF0aW9uRGF5JDEgKiA3Owp2YXIgZHVyYXRpb25Nb250aCA9IGR1cmF0aW9uRGF5JDEgKiAzMDsKdmFyIGR1cmF0aW9uWWVhciA9IGR1cmF0aW9uRGF5JDEgKiAzNjU7CgpmdW5jdGlvbiBkYXRlJDEodCkgewogIHJldHVybiBuZXcgRGF0ZSh0KTsKfQoKZnVuY3Rpb24gbnVtYmVyJDIodCkgewogIHJldHVybiB0IGluc3RhbmNlb2YgRGF0ZSA/ICt0IDogK25ldyBEYXRlKCt0KTsKfQoKZnVuY3Rpb24gY2FsZW5kYXIoeWVhciQkMSwgbW9udGgkJDEsIHdlZWssIGRheSQkMSwgaG91ciQkMSwgbWludXRlJCQxLCBzZWNvbmQkJDEsIG1pbGxpc2Vjb25kJCQxLCBmb3JtYXQpIHsKICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGRlaW50ZXJwb2xhdGVMaW5lYXIsIGludGVycG9sYXRlTnVtYmVyKSwKICAgICAgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0LAogICAgICBkb21haW4gPSBzY2FsZS5kb21haW47CgogIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdCgiLiVMIiksCiAgICAgIGZvcm1hdFNlY29uZCA9IGZvcm1hdCgiOiVTIiksCiAgICAgIGZvcm1hdE1pbnV0ZSA9IGZvcm1hdCgiJUk6JU0iKSwKICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdCgiJUkgJXAiKSwKICAgICAgZm9ybWF0RGF5ID0gZm9ybWF0KCIlYSAlZCIpLAogICAgICBmb3JtYXRXZWVrID0gZm9ybWF0KCIlYiAlZCIpLAogICAgICBmb3JtYXRNb250aCA9IGZvcm1hdCgiJUIiKSwKICAgICAgZm9ybWF0WWVhciA9IGZvcm1hdCgiJVkiKTsKCiAgdmFyIHRpY2tJbnRlcnZhbHMgPSBbCiAgICBbc2Vjb25kJCQxLCAgMSwgICAgICBkdXJhdGlvblNlY29uZCQxXSwKICAgIFtzZWNvbmQkJDEsICA1LCAgNSAqIGR1cmF0aW9uU2Vjb25kJDFdLAogICAgW3NlY29uZCQkMSwgMTUsIDE1ICogZHVyYXRpb25TZWNvbmQkMV0sCiAgICBbc2Vjb25kJCQxLCAzMCwgMzAgKiBkdXJhdGlvblNlY29uZCQxXSwKICAgIFttaW51dGUkJDEsICAxLCAgICAgIGR1cmF0aW9uTWludXRlJDFdLAogICAgW21pbnV0ZSQkMSwgIDUsICA1ICogZHVyYXRpb25NaW51dGUkMV0sCiAgICBbbWludXRlJCQxLCAxNSwgMTUgKiBkdXJhdGlvbk1pbnV0ZSQxXSwKICAgIFttaW51dGUkJDEsIDMwLCAzMCAqIGR1cmF0aW9uTWludXRlJDFdLAogICAgWyAgaG91ciQkMSwgIDEsICAgICAgZHVyYXRpb25Ib3VyJDEgIF0sCiAgICBbICBob3VyJCQxLCAgMywgIDMgKiBkdXJhdGlvbkhvdXIkMSAgXSwKICAgIFsgIGhvdXIkJDEsICA2LCAgNiAqIGR1cmF0aW9uSG91ciQxICBdLAogICAgWyAgaG91ciQkMSwgMTIsIDEyICogZHVyYXRpb25Ib3VyJDEgIF0sCiAgICBbICAgZGF5JCQxLCAgMSwgICAgICBkdXJhdGlvbkRheSQxICAgXSwKICAgIFsgICBkYXkkJDEsICAyLCAgMiAqIGR1cmF0aW9uRGF5JDEgICBdLAogICAgWyAgd2VlaywgIDEsICAgICAgZHVyYXRpb25XZWVrJDEgIF0sCiAgICBbIG1vbnRoJCQxLCAgMSwgICAgICBkdXJhdGlvbk1vbnRoIF0sCiAgICBbIG1vbnRoJCQxLCAgMywgIDMgKiBkdXJhdGlvbk1vbnRoIF0sCiAgICBbICB5ZWFyJCQxLCAgMSwgICAgICBkdXJhdGlvblllYXIgIF0KICBdOwoKICBmdW5jdGlvbiB0aWNrRm9ybWF0KGRhdGUpIHsKICAgIHJldHVybiAoc2Vjb25kJCQxKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbGxpc2Vjb25kCiAgICAgICAgOiBtaW51dGUkJDEoZGF0ZSkgPCBkYXRlID8gZm9ybWF0U2Vjb25kCiAgICAgICAgOiBob3VyJCQxKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbnV0ZQogICAgICAgIDogZGF5JCQxKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdEhvdXIKICAgICAgICA6IG1vbnRoJCQxKGRhdGUpIDwgZGF0ZSA/ICh3ZWVrKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdERheSA6IGZvcm1hdFdlZWspCiAgICAgICAgOiB5ZWFyJCQxKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1vbnRoCiAgICAgICAgOiBmb3JtYXRZZWFyKShkYXRlKTsKICB9CgogIGZ1bmN0aW9uIHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgc3RhcnQsIHN0b3AsIHN0ZXApIHsKICAgIGlmIChpbnRlcnZhbCA9PSBudWxsKSBpbnRlcnZhbCA9IDEwOwoKICAgIC8vIElmIGEgZGVzaXJlZCB0aWNrIGNvdW50IGlzIHNwZWNpZmllZCwgcGljayBhIHJlYXNvbmFibGUgdGljayBpbnRlcnZhbAogICAgLy8gYmFzZWQgb24gdGhlIGV4dGVudCBvZiB0aGUgZG9tYWluIGFuZCBhIHJvdWdoIGVzdGltYXRlIG9mIHRpY2sgc2l6ZS4KICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIGludGVydmFsIGlzIGFscmVhZHkgYSB0aW1lIGludGVydmFsIGFuZCB1c2UgaXQuCiAgICBpZiAodHlwZW9mIGludGVydmFsID09PSAibnVtYmVyIikgewogICAgICB2YXIgdGFyZ2V0ID0gTWF0aC5hYnMoc3RvcCAtIHN0YXJ0KSAvIGludGVydmFsLAogICAgICAgICAgaSA9IGJpc2VjdG9yKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIGlbMl07IH0pLnJpZ2h0KHRpY2tJbnRlcnZhbHMsIHRhcmdldCk7CiAgICAgIGlmIChpID09PSB0aWNrSW50ZXJ2YWxzLmxlbmd0aCkgewogICAgICAgIHN0ZXAgPSB0aWNrU3RlcChzdGFydCAvIGR1cmF0aW9uWWVhciwgc3RvcCAvIGR1cmF0aW9uWWVhciwgaW50ZXJ2YWwpOwogICAgICAgIGludGVydmFsID0geWVhciQkMTsKICAgICAgfSBlbHNlIGlmIChpKSB7CiAgICAgICAgaSA9IHRpY2tJbnRlcnZhbHNbdGFyZ2V0IC8gdGlja0ludGVydmFsc1tpIC0gMV1bMl0gPCB0aWNrSW50ZXJ2YWxzW2ldWzJdIC8gdGFyZ2V0ID8gaSAtIDEgOiBpXTsKICAgICAgICBzdGVwID0gaVsxXTsKICAgICAgICBpbnRlcnZhbCA9IGlbMF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RlcCA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBpbnRlcnZhbCk7CiAgICAgICAgaW50ZXJ2YWwgPSBtaWxsaXNlY29uZCQkMTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBzdGVwID09IG51bGwgPyBpbnRlcnZhbCA6IGludGVydmFsLmV2ZXJ5KHN0ZXApOwogIH0KCiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgewogICAgcmV0dXJuIG5ldyBEYXRlKGludmVydCh5KSk7CiAgfTsKCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBkb21haW4obWFwJDMuY2FsbChfLCBudW1iZXIkMikpIDogZG9tYWluKCkubWFwKGRhdGUkMSk7CiAgfTsKCiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihpbnRlcnZhbCwgc3RlcCkgewogICAgdmFyIGQgPSBkb21haW4oKSwKICAgICAgICB0MCA9IGRbMF0sCiAgICAgICAgdDEgPSBkW2QubGVuZ3RoIC0gMV0sCiAgICAgICAgciA9IHQxIDwgdDAsCiAgICAgICAgdDsKICAgIGlmIChyKSB0ID0gdDAsIHQwID0gdDEsIHQxID0gdDsKICAgIHQgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHQwLCB0MSwgc3RlcCk7CiAgICB0ID0gdCA/IHQucmFuZ2UodDAsIHQxICsgMSkgOiBbXTsgLy8gaW5jbHVzaXZlIHN0b3AKICAgIHJldHVybiByID8gdC5yZXZlcnNlKCkgOiB0OwogIH07CgogIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7CiAgICByZXR1cm4gc3BlY2lmaWVyID09IG51bGwgPyB0aWNrRm9ybWF0IDogZm9ybWF0KHNwZWNpZmllcik7CiAgfTsKCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7CiAgICB2YXIgZCA9IGRvbWFpbigpOwogICAgcmV0dXJuIChpbnRlcnZhbCA9IHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBzdGVwKSkKICAgICAgICA/IGRvbWFpbihuaWNlKGQsIGludGVydmFsKSkKICAgICAgICA6IHNjYWxlOwogIH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBjb3B5KHNjYWxlLCBjYWxlbmRhcih5ZWFyJCQxLCBtb250aCQkMSwgd2VlaywgZGF5JCQxLCBob3VyJCQxLCBtaW51dGUkJDEsIHNlY29uZCQkMSwgbWlsbGlzZWNvbmQkJDEsIGZvcm1hdCkpOwogIH07CgogIHJldHVybiBzY2FsZTsKfQoKdmFyIHRpbWUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gY2FsZW5kYXIoeWVhciwgbW9udGgsIHN1bmRheSwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGV4cG9ydHMudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyMDAwLCAwLCAxKSwgbmV3IERhdGUoMjAwMCwgMCwgMildKTsKfQoKdmFyIHV0Y1RpbWUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gY2FsZW5kYXIodXRjWWVhciwgdXRjTW9udGgsIHV0Y1N1bmRheSwgdXRjRGF5LCB1dGNIb3VyLCB1dGNNaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGV4cG9ydHMudXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDIwMDAsIDAsIDEpLCBEYXRlLlVUQygyMDAwLCAwLCAyKV0pOwp9Cgp2YXIgY29sb3JzID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzLm1hdGNoKC8uezZ9L2cpLm1hcChmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gIiMiICsgeDsKICB9KTsKfQoKdmFyIGNhdGVnb3J5MTAgPSBjb2xvcnMoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpOwoKdmFyIGNhdGVnb3J5MjBiID0gY29sb3JzKCIzOTNiNzk1MjU0YTM2YjZlY2Y5YzllZGU2Mzc5Mzk4Y2EyNTJiNWNmNmJjZWRiOWM4YzZkMzFiZDllMzllN2JhNTJlN2NiOTQ4NDNjMzlhZDQ5NGFkNjYxNmJlNzk2OWM3YjQxNzNhNTUxOTRjZTZkYmRkZTllZDYiKTsKCnZhciBjYXRlZ29yeTIwYyA9IGNvbG9ycygiMzE4MmJkNmJhZWQ2OWVjYWUxYzZkYmVmZTY1NTBkZmQ4ZDNjZmRhZTZiZmRkMGEyMzFhMzU0NzRjNDc2YTFkOTliYzdlOWMwNzU2YmIxOWU5YWM4YmNiZGRjZGFkYWViNjM2MzYzOTY5Njk2YmRiZGJkZDlkOWQ5Iik7Cgp2YXIgY2F0ZWdvcnkyMCA9IGNvbG9ycygiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1Iik7Cgp2YXIgY3ViZWhlbGl4JDMgPSBjdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgzMDAsIDAuNSwgMC4wKSwgY3ViZWhlbGl4KC0yNDAsIDAuNSwgMS4wKSk7Cgp2YXIgd2FybSA9IGN1YmVoZWxpeExvbmcoY3ViZWhlbGl4KC0xMDAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOwoKdmFyIGNvb2wgPSBjdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgyNjAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOwoKdmFyIHJhaW5ib3cgPSBjdWJlaGVsaXgoKTsKCnZhciByYWluYm93JDEgPSBmdW5jdGlvbih0KSB7CiAgaWYgKHQgPCAwIHx8IHQgPiAxKSB0IC09IE1hdGguZmxvb3IodCk7CiAgdmFyIHRzID0gTWF0aC5hYnModCAtIDAuNSk7CiAgcmFpbmJvdy5oID0gMzYwICogdCAtIDEwMDsKICByYWluYm93LnMgPSAxLjUgLSAxLjUgKiB0czsKICByYWluYm93LmwgPSAwLjggLSAwLjkgKiB0czsKICByZXR1cm4gcmFpbmJvdyArICIiOwp9CgpmdW5jdGlvbiByYW1wKHJhbmdlKSB7CiAgdmFyIG4gPSByYW5nZS5sZW5ndGg7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRoLm1pbihuIC0gMSwgTWF0aC5mbG9vcih0ICogbikpKV07CiAgfTsKfQoKdmFyIHZpcmlkaXMgPSByYW1wKGNvbG9ycygiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpOwoKdmFyIG1hZ21hID0gcmFtcChjb2xvcnMoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKTsKCnZhciBpbmZlcm5vID0gcmFtcChjb2xvcnMoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKTsKCnZhciBwbGFzbWEgPSByYW1wKGNvbG9ycygiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpOwoKZnVuY3Rpb24gc2VxdWVudGlhbChpbnRlcnBvbGF0b3IpIHsKICB2YXIgeDAgPSAwLAogICAgICB4MSA9IDEsCiAgICAgIGNsYW1wID0gZmFsc2U7CgogIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgIHZhciB0ID0gKHggLSB4MCkgLyAoeDEgLSB4MCk7CiAgICByZXR1cm4gaW50ZXJwb2xhdG9yKGNsYW1wID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdCkpIDogdCk7CiAgfQoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdLCB4MSA9ICtfWzFdLCBzY2FsZSkgOiBbeDAsIHgxXTsKICB9OwoKICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gISFfLCBzY2FsZSkgOiBjbGFtcDsKICB9OwoKICBzY2FsZS5pbnRlcnBvbGF0b3IgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHNlcXVlbnRpYWwoaW50ZXJwb2xhdG9yKS5kb21haW4oW3gwLCB4MV0pLmNsYW1wKGNsYW1wKTsKICB9OwoKICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKfQoKdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwoKdmFyIG5hbWVzcGFjZXMgPSB7CiAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogIHhodG1sOiB4aHRtbCwKICB4bGluazogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLAogIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKfTsKCnZhciBuYW1lc3BhY2UgPSBmdW5jdGlvbihuYW1lKSB7CiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOwogIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSAieG1sbnMiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7CiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOwp9CgpmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LAogICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJOwogICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwKICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkKICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpOwogIH07Cn0KCmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgfTsKfQoKdmFyIGNyZWF0b3IgPSBmdW5jdGlvbihuYW1lKSB7CiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpOwogIHJldHVybiAoZnVsbG5hbWUubG9jYWwKICAgICAgPyBjcmVhdG9yRml4ZWQKICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpOwp9Cgp2YXIgbmV4dElkID0gMDsKCmZ1bmN0aW9uIGxvY2FsKCkgewogIHJldHVybiBuZXcgTG9jYWw7Cn0KCmZ1bmN0aW9uIExvY2FsKCkgewogIHRoaXMuXyA9ICJAIiArICgrK25leHRJZCkudG9TdHJpbmcoMzYpOwp9CgpMb2NhbC5wcm90b3R5cGUgPSBsb2NhbC5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IExvY2FsLAogIGdldDogZnVuY3Rpb24obm9kZSkgewogICAgdmFyIGlkID0gdGhpcy5fOwogICAgd2hpbGUgKCEoaWQgaW4gbm9kZSkpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47CiAgICByZXR1cm4gbm9kZVtpZF07CiAgfSwKICBzZXQ6IGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7CiAgICByZXR1cm4gbm9kZVt0aGlzLl9dID0gdmFsdWU7CiAgfSwKICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJldHVybiB0aGlzLl8gaW4gbm9kZSAmJiBkZWxldGUgbm9kZVt0aGlzLl9dOwogIH0sCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuXzsKICB9Cn07Cgp2YXIgbWF0Y2hlciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7CiAgfTsKfTsKCmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgaWYgKCFlbGVtZW50Lm1hdGNoZXMpIHsKICAgIHZhciB2ZW5kb3JNYXRjaGVzID0gZWxlbWVudC53ZWJraXRNYXRjaGVzU2VsZWN0b3IKICAgICAgICB8fCBlbGVtZW50Lm1zTWF0Y2hlc1NlbGVjdG9yCiAgICAgICAgfHwgZWxlbWVudC5tb3pNYXRjaGVzU2VsZWN0b3IKICAgICAgICB8fCBlbGVtZW50Lm9NYXRjaGVzU2VsZWN0b3I7CiAgICBtYXRjaGVyID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB2ZW5kb3JNYXRjaGVzLmNhbGwodGhpcywgc2VsZWN0b3IpOwogICAgICB9OwogICAgfTsKICB9Cn0KCnZhciBtYXRjaGVyJDEgPSBtYXRjaGVyOwoKdmFyIGZpbHRlckV2ZW50cyA9IHt9OwoKZXhwb3J0cy5ldmVudCA9IG51bGw7CgppZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogIHZhciBlbGVtZW50JDEgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgaWYgKCEoIm9ubW91c2VlbnRlciIgaW4gZWxlbWVudCQxKSkgewogICAgZmlsdGVyRXZlbnRzID0ge21vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQifTsKICB9Cn0KCmZ1bmN0aW9uIGZpbHRlckNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7CiAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCk7CiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICB2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CiAgICBpZiAoIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRoaXMgJiYgIShyZWxhdGVkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpICYgOCkpKSB7CiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50MSkgewogICAgdmFyIGV2ZW50MCA9IGV4cG9ydHMuZXZlbnQ7IC8vIEV2ZW50cyBjYW4gYmUgcmVlbnRyYW50IChlLmcuLCBmb2N1cykuCiAgICBleHBvcnRzLmV2ZW50ID0gZXZlbnQxOwogICAgdHJ5IHsKICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCB0aGlzLl9fZGF0YV9fLCBpbmRleCwgZ3JvdXApOwogICAgfSBmaW5hbGx5IHsKICAgICAgZXhwb3J0cy5ldmVudCA9IGV2ZW50MDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyQxKHR5cGVuYW1lcykgewogIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KSB7CiAgICB2YXIgbmFtZSA9ICIiLCBpID0gdC5pbmRleE9mKCIuIik7CiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTsKICB9KTsKfQoKZnVuY3Rpb24gb25SZW1vdmUodHlwZW5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgb24gPSB0aGlzLl9fb247CiAgICBpZiAoIW9uKSByZXR1cm47CiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb25bKytpXSA9IG87CiAgICAgIH0KICAgIH0KICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7CiAgICBlbHNlIGRlbGV0ZSB0aGlzLl9fb247CiAgfTsKfQoKZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7CiAgdmFyIHdyYXAgPSBmaWx0ZXJFdmVudHMuaGFzT3duUHJvcGVydHkodHlwZW5hbWUudHlwZSkgPyBmaWx0ZXJDb250ZXh0TGlzdGVuZXIgOiBjb250ZXh0TGlzdGVuZXI7CiAgcmV0dXJuIGZ1bmN0aW9uKGQsIGksIGdyb3VwKSB7CiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gd3JhcCh2YWx1ZSwgaSwgZ3JvdXApOwogICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsKICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpOwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIgPSBsaXN0ZW5lciwgby5jYXB0dXJlID0gY2FwdHVyZSk7CiAgICAgICAgby52YWx1ZSA9IHZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKTsKICAgIG8gPSB7dHlwZTogdHlwZW5hbWUudHlwZSwgbmFtZTogdHlwZW5hbWUubmFtZSwgdmFsdWU6IHZhbHVlLCBsaXN0ZW5lcjogbGlzdGVuZXIsIGNhcHR1cmU6IGNhcHR1cmV9OwogICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dOwogICAgZWxzZSBvbi5wdXNoKG8pOwogIH07Cn0KCnZhciBzZWxlY3Rpb25fb24gPSBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHsKICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXMkMSh0eXBlbmFtZSArICIiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7CgogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjsKICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHsKICAgICAgICAgIHJldHVybiBvLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuOwogIH0KCiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7CiAgaWYgKGNhcHR1cmUgPT0gbnVsbCkgY2FwdHVyZSA9IGZhbHNlOwogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBjYXB0dXJlKSk7CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIGN1c3RvbUV2ZW50KGV2ZW50MSwgbGlzdGVuZXIsIHRoYXQsIGFyZ3MpIHsKICB2YXIgZXZlbnQwID0gZXhwb3J0cy5ldmVudDsKICBldmVudDEuc291cmNlRXZlbnQgPSBleHBvcnRzLmV2ZW50OwogIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7CiAgdHJ5IHsKICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmdzKTsKICB9IGZpbmFsbHkgewogICAgZXhwb3J0cy5ldmVudCA9IGV2ZW50MDsKICB9Cn0KCnZhciBzb3VyY2VFdmVudCA9IGZ1bmN0aW9uKCkgewogIHZhciBjdXJyZW50ID0gZXhwb3J0cy5ldmVudCwgc291cmNlOwogIHdoaWxlIChzb3VyY2UgPSBjdXJyZW50LnNvdXJjZUV2ZW50KSBjdXJyZW50ID0gc291cmNlOwogIHJldHVybiBjdXJyZW50Owp9Cgp2YXIgcG9pbnQkNSA9IGZ1bmN0aW9uKG5vZGUsIGV2ZW50KSB7CiAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7CgogIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHsKICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOwogICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZOwogICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpOwogICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTsKICB9CgogIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTsKfQoKdmFyIG1vdXNlID0gZnVuY3Rpb24obm9kZSkgewogIHZhciBldmVudCA9IHNvdXJjZUV2ZW50KCk7CiAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSBldmVudCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdOwogIHJldHVybiBwb2ludCQ1KG5vZGUsIGV2ZW50KTsKfQoKZnVuY3Rpb24gbm9uZSQyKCkge30KCnZhciBzZWxlY3RvciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lJDIgOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogIH07Cn0KCnZhciBzZWxlY3Rpb25fc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0KSB7CiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKfQoKZnVuY3Rpb24gZW1wdHkoKSB7CiAgcmV0dXJuIFtdOwp9Cgp2YXIgc2VsZWN0b3JBbGwgPSBmdW5jdGlvbihzZWxlY3RvcikgewogIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogIH07Cn0KCnZhciBzZWxlY3Rpb25fc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0KSB7CiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7CiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpOwp9Cgp2YXIgc2VsZWN0aW9uX2ZpbHRlciA9IGZ1bmN0aW9uKG1hdGNoKSB7CiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyJDEobWF0Y2gpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKfQoKdmFyIHNwYXJzZSA9IGZ1bmN0aW9uKHVwZGF0ZSkgewogIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7Cn0KCnZhciBzZWxlY3Rpb25fZW50ZXIgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwp9CgpmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkgewogIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50OwogIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTsKICB0aGlzLl9uZXh0ID0gbnVsbDsKICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtOwp9CgpFbnRlck5vZGUucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsCiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSwKICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSwKICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LAogIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH0KfTsKCnZhciBjb25zdGFudCQ1ID0gZnVuY3Rpb24oeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCnZhciBrZXlQcmVmaXggPSAiJCI7IC8vIFByb3RlY3QgYWdhaW5zdCBrZXlzIGxpa2Ugw6LCgMKcX19wcm90b19fw6LCgMKdLgoKZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICB2YXIgaSA9IDAsCiAgICAgIG5vZGUsCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CgogIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuCiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLgogIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgfSBlbHNlIHsKICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7CiAgICB9CiAgfQoKICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9uw6LCgMKZdCBmaXQgaW50byBleGl0LgogIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICBleGl0W2ldID0gbm9kZTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7CiAgdmFyIGksCiAgICAgIG5vZGUsCiAgICAgIG5vZGVCeUtleVZhbHVlID0ge30sCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgIGtleVZhbHVlOwoKICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS4KICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuCiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXlQcmVmaXggKyBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgIGlmIChrZXlWYWx1ZSBpbiBub2RlQnlLZXlWYWx1ZSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLgogIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci4KICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICBrZXlWYWx1ZSA9IGtleVByZWZpeCArIGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSk7CiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkgewogICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pOwogICAgfQogIH0KCiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuCiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVzW2ldXSA9PT0gbm9kZSkpIHsKICAgICAgZXhpdFtpXSA9IG5vZGU7CiAgICB9CiAgfQp9Cgp2YXIgc2VsZWN0aW9uX2RhdGEgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgaWYgKCF2YWx1ZSkgewogICAgZGF0YSA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGogPSAtMTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbihkKSB7IGRhdGFbKytqXSA9IGQ7IH0pOwogICAgcmV0dXJuIGRhdGE7CiAgfQoKICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsCiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLAogICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7CgogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQkNSh2YWx1ZSk7CgogIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sCiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sCiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgICAgZGF0YSA9IHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSwKICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwoKICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTsKCiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQKICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsCiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS4KICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7CiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTsKICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7CiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7CiAgICAgIH0KICAgIH0KICB9CgogIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTsKICB1cGRhdGUuX2VudGVyID0gZW50ZXI7CiAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICByZXR1cm4gdXBkYXRlOwp9Cgp2YXIgc2VsZWN0aW9uX2V4aXQgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7Cn0KCnZhciBzZWxlY3Rpb25fbWVyZ2UgPSBmdW5jdGlvbihzZWxlY3Rpb24pIHsKCiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgbWVyZ2VbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQoKICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07CiAgfQoKICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpOwp9Cgp2YXIgc2VsZWN0aW9uX29yZGVyID0gZnVuY3Rpb24oKSB7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09IG5vZGUubmV4dFNpYmxpbmcpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7CiAgICAgICAgbmV4dCA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiB0aGlzOwp9Cgp2YXIgc2VsZWN0aW9uX3NvcnQgPSBmdW5jdGlvbihjb21wYXJlKSB7CiAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nJDI7CgogIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHsKICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjsKICB9CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7CiAgICAgIH0KICAgIH0KICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTsKICB9CgogIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7Cn0KCmZ1bmN0aW9uIGFzY2VuZGluZyQyKGEsIGIpIHsKICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47Cn0KCnZhciBzZWxlY3Rpb25fY2FsbCA9IGZ1bmN0aW9uKCkgewogIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTsKICBhcmd1bWVudHNbMF0gPSB0aGlzOwogIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgcmV0dXJuIHRoaXM7Cn0KCnZhciBzZWxlY3Rpb25fbm9kZXMgPSBmdW5jdGlvbigpIHsKICB2YXIgbm9kZXMgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBpID0gLTE7CiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyBub2Rlc1srK2ldID0gdGhpczsgfSk7CiAgcmV0dXJuIG5vZGVzOwp9Cgp2YXIgc2VsZWN0aW9uX25vZGUgPSBmdW5jdGlvbigpIHsKCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOwogICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKdmFyIHNlbGVjdGlvbl9zaXplID0gZnVuY3Rpb24oKSB7CiAgdmFyIHNpemUgPSAwOwogIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgKytzaXplOyB9KTsKICByZXR1cm4gc2l6ZTsKfQoKdmFyIHNlbGVjdGlvbl9lbXB0eSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAhdGhpcy5ub2RlKCk7Cn0KCnZhciBzZWxlY3Rpb25fZWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICB9CiAgfQoKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgdmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTsKICB9Owp9Cgp2YXIgc2VsZWN0aW9uX2F0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOwogICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsCiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCkKICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTsKICB9CgogIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwKICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikKICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTsKfQoKdmFyIHdpbmRvdyA9IGZ1bmN0aW9uKG5vZGUpIHsKICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlCiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3cKICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50Cn0KCmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpOwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7CiAgfTsKfQoKdmFyIHNlbGVjdGlvbl9zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogIHZhciBub2RlOwogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQogICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvbgogICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpCiAgICAgIDogd2luZG93KG5vZGUgPSB0aGlzLm5vZGUoKSkKICAgICAgICAgIC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpCiAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsKfQoKZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIGRlbGV0ZSB0aGlzW25hbWVdOwogIH07Cn0KCmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzW25hbWVdID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdOwogICAgZWxzZSB0aGlzW25hbWVdID0gdjsKICB9Owp9Cgp2YXIgc2VsZWN0aW9uX3Byb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEKICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwKICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvbgogICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpCiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07Cn0KCmZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7CiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XHMrLyk7Cn0KCmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7CiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7Cn0KCmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7CiAgdGhpcy5fbm9kZSA9IG5vZGU7CiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKfQoKQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHsKICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgIGlmIChpIDwgMCkgewogICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgfQogIH0sCiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7CiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7CiAgICBpZiAoaSA+PSAwKSB7CiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsKICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsKICAgIH0KICB9LAogIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwOwogIH0KfTsKCmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHsKICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7Cn0KCmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHsKICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7Cn0KCmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7CiAgfTsKfQoKZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7CiAgfTsKfQoKZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTsKICB9Owp9Cgp2YXIgc2VsZWN0aW9uX2NsYXNzZWQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlCiAgICAgID8gY2xhc3NlZFRydWUKICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpOwp9CgpmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkgewogIHRoaXMudGV4dENvbnRlbnQgPSAiIjsKfQoKZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogIH07Cn0KCmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgfTsKfQoKdmFyIHNlbGVjdGlvbl90ZXh0ID0gZnVuY3Rpb24odmFsdWUpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IHRleHRGdW5jdGlvbgogICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSkKICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDsKfQoKZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsKICB0aGlzLmlubmVySFRNTCA9ICIiOwp9CgpmdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlOwogIH07Cn0KCmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gIiIgOiB2OwogIH07Cn0KCnZhciBzZWxlY3Rpb25faHRtbCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbAogICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBodG1sRnVuY3Rpb24KICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpCiAgICAgIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiByYWlzZSQxKCkgewogIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7Cn0KCnZhciBzZWxlY3Rpb25fcmFpc2UgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlJDEpOwp9CgpmdW5jdGlvbiBsb3dlcigpIHsKICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOwp9Cgp2YXIgc2VsZWN0aW9uX2xvd2VyID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7Cn0KCnZhciBzZWxlY3Rpb25fYXBwZW5kID0gZnVuY3Rpb24obmFtZSkgewogIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpOwogIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICB9KTsKfQoKZnVuY3Rpb24gY29uc3RhbnROdWxsKCkgewogIHJldHVybiBudWxsOwp9Cgp2YXIgc2VsZWN0aW9uX2luc2VydCA9IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkgewogIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLAogICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09ICJmdW5jdGlvbiIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpOwogIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSgpIHsKICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKfQoKdmFyIHNlbGVjdGlvbl9yZW1vdmUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7Cn0KCnZhciBzZWxlY3Rpb25fZGF0dW0gPSBmdW5jdGlvbih2YWx1ZSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgID8gdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLCB2YWx1ZSkKICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXzsKfQoKZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHsKICB2YXIgd2luZG93JCQxID0gd2luZG93KG5vZGUpLAogICAgICBldmVudCA9IHdpbmRvdyQkMS5DdXN0b21FdmVudDsKCiAgaWYgKGV2ZW50KSB7CiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpOwogIH0gZWxzZSB7CiAgICBldmVudCA9IHdpbmRvdyQkMS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTsKICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsOwogICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTsKICB9CgogIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7Cn0KCmZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTsKICB9Owp9CgpmdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICB9Owp9Cgp2YXIgc2VsZWN0aW9uX2Rpc3BhdGNoID0gZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7CiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gImZ1bmN0aW9uIgogICAgICA/IGRpc3BhdGNoRnVuY3Rpb24KICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTsKfQoKdmFyIHJvb3QgPSBbbnVsbF07CgpmdW5jdGlvbiBTZWxlY3Rpb24oZ3JvdXBzLCBwYXJlbnRzKSB7CiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7Cn0KClNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sCiAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0LAogIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCwKICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsCiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsCiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlciwKICBleGl0OiBzZWxlY3Rpb25fZXhpdCwKICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLAogIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsCiAgc29ydDogc2VsZWN0aW9uX3NvcnQsCiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsCiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcywKICBub2RlOiBzZWxlY3Rpb25fbm9kZSwKICBzaXplOiBzZWxlY3Rpb25fc2l6ZSwKICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LAogIGVhY2g6IHNlbGVjdGlvbl9lYWNoLAogIGF0dHI6IHNlbGVjdGlvbl9hdHRyLAogIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsCiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSwKICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCwKICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCwKICBodG1sOiBzZWxlY3Rpb25faHRtbCwKICByYWlzZTogc2VsZWN0aW9uX3JhaXNlLAogIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsCiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLAogIGluc2VydDogc2VsZWN0aW9uX2luc2VydCwKICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsCiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSwKICBvbjogc2VsZWN0aW9uX29uLAogIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gKfTsKCnZhciBzZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgewogIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciCiAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQogICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTsKfQoKdmFyIHNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgPyBuZXcgU2VsZWN0aW9uKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQogICAgICA6IG5ldyBTZWxlY3Rpb24oW3NlbGVjdG9yID09IG51bGwgPyBbXSA6IHNlbGVjdG9yXSwgcm9vdCk7Cn0KCnZhciB0b3VjaCA9IGZ1bmN0aW9uKG5vZGUsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGlkZW50aWZpZXIgPSB0b3VjaGVzLCB0b3VjaGVzID0gc291cmNlRXZlbnQoKS5jaGFuZ2VkVG91Y2hlczsKCiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkgewogICAgaWYgKCh0b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHsKICAgICAgcmV0dXJuIHBvaW50JDUobm9kZSwgdG91Y2gpOwogICAgfQogIH0KCiAgcmV0dXJuIG51bGw7Cn0KCnZhciB0b3VjaGVzID0gZnVuY3Rpb24obm9kZSwgdG91Y2hlcykgewogIGlmICh0b3VjaGVzID09IG51bGwpIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLnRvdWNoZXM7CgogIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcyA/IHRvdWNoZXMubGVuZ3RoIDogMCwgcG9pbnRzID0gbmV3IEFycmF5KG4pOyBpIDwgbjsgKytpKSB7CiAgICBwb2ludHNbaV0gPSBwb2ludCQ1KG5vZGUsIHRvdWNoZXNbaV0pOwogIH0KCiAgcmV0dXJuIHBvaW50czsKfQoKdmFyIGVtcHR5T24gPSBkaXNwYXRjaCgic3RhcnQiLCAiZW5kIiwgImludGVycnVwdCIpOwp2YXIgZW1wdHlUd2VlbiA9IFtdOwoKdmFyIENSRUFURUQgPSAwOwp2YXIgU0NIRURVTEVEID0gMTsKdmFyIFNUQVJUSU5HID0gMjsKdmFyIFNUQVJURUQgPSAzOwp2YXIgUlVOTklORyA9IDQ7CnZhciBFTkRJTkcgPSA1Owp2YXIgRU5ERUQgPSA2OwoKdmFyIHNjaGVkdWxlID0gZnVuY3Rpb24obm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7CiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uOwogIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9OwogIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuOwogIGNyZWF0ZShub2RlLCBpZCwgewogICAgbmFtZTogbmFtZSwKICAgIGluZGV4OiBpbmRleCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLgogICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suCiAgICBvbjogZW1wdHlPbiwKICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLAogICAgdGltZTogdGltaW5nLnRpbWUsCiAgICBkZWxheTogdGltaW5nLmRlbGF5LAogICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbiwKICAgIGVhc2U6IHRpbWluZy5lYXNlLAogICAgdGltZXI6IG51bGwsCiAgICBzdGF0ZTogQ1JFQVRFRAogIH0pOwp9CgpmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7CiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247CiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSB8fCBzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTsKICByZXR1cm4gc2NoZWR1bGU7Cn0KCmZ1bmN0aW9uIHNldCQzKG5vZGUsIGlkKSB7CiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247CiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSB8fCBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7CiAgcmV0dXJuIHNjaGVkdWxlOwp9CgpmdW5jdGlvbiBnZXQkMShub2RlLCBpZCkgewogIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOwogIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTsKICByZXR1cm4gc2NoZWR1bGU7Cn0KCmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikgewogIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgdHdlZW47CgogIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLgogIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIQogIHNjaGVkdWxlc1tpZF0gPSBzZWxmOwogIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkgewogICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDsKICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsKCiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS4KICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsKICAgIHZhciBpLCBqLCBuLCBvOwoKICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC4KICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7CgogICAgZm9yIChpIGluIHNjaGVkdWxlcykgewogICAgICBvID0gc2NoZWR1bGVzW2ldOwogICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlOwoKICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSwKICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhCiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhCiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dCQxKHN0YXJ0KTsKCiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS4KICAgICAgLy8gRGlzcGF0Y2ggdGhlIGludGVycnVwdCBldmVudC4KICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHsKICAgICAgICBvLnN0YXRlID0gRU5ERUQ7CiAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgby5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTsKICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgICB9CgogICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuIE5vIGludGVycnVwdCBldmVudCBpcyBkaXNwYXRjaGVkCiAgICAgIC8vIGJlY2F1c2UgdGhlIGNhbmNlbGxlZCB0cmFuc2l0aW9ucyBuZXZlciBzdGFydGVkLiBOb3RlIHRoYXQgdGhpcyBhbHNvCiAgICAgIC8vIHJlbW92ZXMgdGhpcyB0cmFuc2l0aW9uIGZyb20gdGhlIHBlbmRpbmcgbGlzdCEKICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICBvLnRpbWVyLnN0b3AoKTsKICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgICB9CiAgICB9CgogICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni4KICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shCiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhCiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suCiAgICB0aW1lb3V0JDEoZnVuY3Rpb24oKSB7CiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7CiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7CiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7CiAgICAgICAgdGljayhlbGFwc2VkKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LgogICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC4KICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORzsKICAgIHNlbGYub24uY2FsbCgic3RhcnQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTsKICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZAogICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7CgogICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uCiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7CiAgICAgICAgdHdlZW5bKytqXSA9IG87CiAgICAgIH0KICAgIH0KICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOwogIH0KCiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7CiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7CgogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgdHdlZW5baV0uY2FsbChudWxsLCB0KTsKICAgIH0KCiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LgogICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykgewogICAgICBzZWxmLm9uLmNhbGwoImVuZCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApOwogICAgICBzdG9wKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzdG9wKCkgewogICAgc2VsZi5zdGF0ZSA9IEVOREVEOwogICAgc2VsZi50aW1lci5zdG9wKCk7CiAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTsKICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjsKICB9Cn0KCnZhciBpbnRlcnJ1cHQgPSBmdW5jdGlvbihub2RlLCBuYW1lKSB7CiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAgICBzY2hlZHVsZSwKICAgICAgYWN0aXZlLAogICAgICBlbXB0eSA9IHRydWUsCiAgICAgIGk7CgogIGlmICghc2NoZWR1bGVzKSByZXR1cm47CgogIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArICIiOwoKICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9CiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA9PT0gU1RBUlRFRDsKICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7CiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7CiAgICBpZiAoYWN0aXZlKSBzY2hlZHVsZS5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICB9CgogIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uOwp9Cgp2YXIgc2VsZWN0aW9uX2ludGVycnVwdCA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpOwogIH0pOwp9CgpmdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkgewogIHZhciB0d2VlbjAsIHR3ZWVuMTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMyh0aGlzLCBpZCksCiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjsKCiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdlw6LCgMKZcmUgZG9uZSEKICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOwogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpOwogICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOwogIH07Cn0KCmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7CiAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMyh0aGlzLCBpZCksCiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjsKCiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdlw6LCgMKZcmUgZG9uZSEKICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpOwogICAgfQoKICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOwogIH07Cn0KCnZhciB0cmFuc2l0aW9uX3R3ZWVuID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgbmFtZSArPSAiIjsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICB2YXIgdHdlZW4gPSBnZXQkMSh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuOwogICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICByZXR1cm4gdC52YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTsKfQoKZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkgewogIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkOwoKICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMyh0aGlzLCBpZCk7CiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfSk7CgogIHJldHVybiBmdW5jdGlvbihub2RlKSB7CiAgICByZXR1cm4gZ2V0JDEobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogIH07Cn0KCnZhciBpbnRlcnBvbGF0ZSQxID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBjOwogIHJldHVybiAodHlwZW9mIGIgPT09ICJudW1iZXIiID8gaW50ZXJwb2xhdGVOdW1iZXIKICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYgogICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYikKICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7Cn0KCmZ1bmN0aW9uIGF0dHJSZW1vdmUkMShuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0clJlbW92ZU5TJDEoZnVsbG5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0ckNvbnN0YW50JDEobmFtZSwgaW50ZXJwb2xhdGUkJDEsIHZhbHVlMSkgewogIHZhciB2YWx1ZTAwLAogICAgICBpbnRlcnBvbGF0ZTA7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbAogICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSQkMSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TJDEoZnVsbG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZTEpIHsKICB2YXIgdmFsdWUwMCwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZTAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsCiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlJCQxKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMSk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0ckZ1bmN0aW9uJDEobmFtZSwgaW50ZXJwb2xhdGUkJDEsIHZhbHVlKSB7CiAgdmFyIHZhbHVlMDAsCiAgICAgIHZhbHVlMTAsCiAgICAgIGludGVycG9sYXRlMDsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgdmFsdWUwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsKICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICB2YWx1ZTAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTsKICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwKICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCAmJiB2YWx1ZTEgPT09IHZhbHVlMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlJCQxKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TJDEoZnVsbG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZSkgewogIHZhciB2YWx1ZTAwLAogICAgICB2YWx1ZTEwLAogICAgICBpbnRlcnBvbGF0ZTA7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlMCwgdmFsdWUxID0gdmFsdWUodGhpcyk7CiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwKICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCAmJiB2YWx1ZTEgPT09IHZhbHVlMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlJCQxKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpOwogIH07Cn0KCnZhciB0cmFuc2l0aW9uX2F0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSAidHJhbnNmb3JtIiA/IGludGVycG9sYXRlVHJhbnNmb3JtU3ZnIDogaW50ZXJwb2xhdGUkMTsKICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkMSA6IGF0dHJGdW5jdGlvbiQxKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCAiYXR0ci4iICsgbmFtZSwgdmFsdWUpKQogICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkMSA6IGF0dHJSZW1vdmUkMSkoZnVsbG5hbWUpCiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMkMSA6IGF0dHJDb25zdGFudCQxKShmdWxsbmFtZSwgaSwgdmFsdWUpKTsKfQoKZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgZnVuY3Rpb24gdHdlZW4oKSB7CiAgICB2YXIgbm9kZSA9IHRoaXMsIGkgPSB2YWx1ZS5hcHBseShub2RlLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGkgJiYgZnVuY3Rpb24odCkgewogICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaSh0KSk7CiAgICB9OwogIH0KICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICByZXR1cm4gdHdlZW47Cn0KCmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkgewogIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTsKICAgIHJldHVybiBpICYmIGZ1bmN0aW9uKHQpIHsKICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgaSh0KSk7CiAgICB9OwogIH0KICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICByZXR1cm4gdHdlZW47Cn0KCnZhciB0cmFuc2l0aW9uX2F0dHJUd2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgdmFyIGtleSA9ICJhdHRyLiIgKyBuYW1lOwogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTsKfQoKZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07Cn0KCmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHsKICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7CiAgfTsKfQoKdmFyIHRyYW5zaXRpb25fZGVsYXkgPSBmdW5jdGlvbih2YWx1ZSkgewogIHZhciBpZCA9IHRoaXMuX2lkOwoKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb24KICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSkKICAgICAgOiBnZXQkMSh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5Owp9CgpmdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHNldCQzKHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07Cn0KCmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHsKICAgIHNldCQzKHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlOwogIH07Cn0KCnZhciB0cmFuc2l0aW9uX2R1cmF0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsKICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uCiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpCiAgICAgIDogZ2V0JDEodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjsKfQoKZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkgewogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBzZXQkMyh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlOwogIH07Cn0KCnZhciB0cmFuc2l0aW9uX2Vhc2UgPSBmdW5jdGlvbih2YWx1ZSkgewogIHZhciBpZCA9IHRoaXMuX2lkOwoKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSkKICAgICAgOiBnZXQkMSh0aGlzLm5vZGUoKSwgaWQpLmVhc2U7Cn0KCnZhciB0cmFuc2l0aW9uX2ZpbHRlciA9IGZ1bmN0aW9uKG1hdGNoKSB7CiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyJDEobWF0Y2gpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpOwp9Cgp2YXIgdHJhbnNpdGlvbl9tZXJnZSA9IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHsKICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7CgogIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsKICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIGZvciAoOyBqIDwgbTA7ICsraikgewogICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICB9CgogIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKfQoKZnVuY3Rpb24gc3RhcnQkMShuYW1lKSB7CiAgcmV0dXJuIChuYW1lICsgIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7CiAgICB2YXIgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICByZXR1cm4gIXQgfHwgdCA9PT0gInN0YXJ0IjsKICB9KTsKfQoKZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHsKICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0JDEobmFtZSkgPyBpbml0IDogc2V0JDM7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHNjaGVkdWxlID0gc2l0KHRoaXMsIGlkKSwKICAgICAgICBvbiA9IHNjaGVkdWxlLm9uOwoKICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZcOiwoDCmXJlIGRvbmUhCiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7CgogICAgc2NoZWR1bGUub24gPSBvbjE7CiAgfTsKfQoKdmFyIHRyYW5zaXRpb25fb24gPSBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikgewogIHZhciBpZCA9IHRoaXMuX2lkOwoKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIKICAgICAgPyBnZXQkMSh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpCiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7Cn0KCmZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjsKICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICB9Owp9Cgp2YXIgdHJhbnNpdGlvbl9yZW1vdmUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7Cn0KCnZhciB0cmFuc2l0aW9uX3NlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdCQkMSkgewogIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKCiAgaWYgKHR5cGVvZiBzZWxlY3QkJDEgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCQkMSA9IHNlbGVjdG9yKHNlbGVjdCQkMSk7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0JCQxLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTsKICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQkMShub2RlLCBpZCkpOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7Cn0KCnZhciB0cmFuc2l0aW9uX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdCQkMSkgewogIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKCiAgaWYgKHR5cGVvZiBzZWxlY3QkJDEgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCQkMSA9IHNlbGVjdG9yQWxsKHNlbGVjdCQkMSk7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0JCQxLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldCQxKG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHsKICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7CiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7CiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7Cn0KCnZhciBTZWxlY3Rpb24kMSA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7Cgp2YXIgdHJhbnNpdGlvbl9zZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7Cn0KCmZ1bmN0aW9uIHN0eWxlUmVtb3ZlJDEobmFtZSwgaW50ZXJwb2xhdGUkJDEpIHsKICB2YXIgdmFsdWUwMCwKICAgICAgdmFsdWUxMCwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBzdHlsZSA9IHdpbmRvdyh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpLAogICAgICAgIHZhbHVlMCA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSksCiAgICAgICAgdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkpOwogICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbAogICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwICYmIHZhbHVlMSA9PT0gdmFsdWUxMCA/IGludGVycG9sYXRlMAogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUkJDEodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxMCA9IHZhbHVlMSk7CiAgfTsKfQoKZnVuY3Rpb24gc3R5bGVSZW1vdmVFbmQobmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgfTsKfQoKZnVuY3Rpb24gc3R5bGVDb25zdGFudCQxKG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZTEpIHsKICB2YXIgdmFsdWUwMCwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZTAgPSB3aW5kb3codGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwogICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbAogICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSQkMSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEpOwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24kMShuYW1lLCBpbnRlcnBvbGF0ZSQkMSwgdmFsdWUpIHsKICB2YXIgdmFsdWUwMCwKICAgICAgdmFsdWUxMCwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBzdHlsZSA9IHdpbmRvdyh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpLAogICAgICAgIHZhbHVlMCA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSksCiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyk7CiAgICBpZiAodmFsdWUxID09IG51bGwpIHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTsKICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwKICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCAmJiB2YWx1ZTEgPT09IHZhbHVlMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlJCQxKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpOwogIH07Cn0KCnZhciB0cmFuc2l0aW9uX3N0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgdmFyIGkgPSAobmFtZSArPSAiIikgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgOiBpbnRlcnBvbGF0ZSQxOwogIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpcwogICAgICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVSZW1vdmUkMShuYW1lLCBpKSkKICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBzdHlsZVJlbW92ZUVuZChuYW1lKSkKICAgICAgOiB0aGlzLnN0eWxlVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IHN0eWxlRnVuY3Rpb24kMShuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsICJzdHlsZS4iICsgbmFtZSwgdmFsdWUpKQogICAgICAgICAgOiBzdHlsZUNvbnN0YW50JDEobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSk7Cn0KCmZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgZnVuY3Rpb24gdHdlZW4oKSB7CiAgICB2YXIgbm9kZSA9IHRoaXMsIGkgPSB2YWx1ZS5hcHBseShub2RlLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGkgJiYgZnVuY3Rpb24odCkgewogICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkodCksIHByaW9yaXR5KTsKICAgIH07CiAgfQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogIHJldHVybiB0d2VlbjsKfQoKdmFyIHRyYW5zaXRpb25fc3R5bGVUd2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogIHZhciBrZXkgPSAic3R5bGUuIiArIChuYW1lICs9ICIiKTsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9yaXR5KSk7Cn0KCmZ1bmN0aW9uIHRleHRDb25zdGFudCQxKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogIH07Cn0KCmZ1bmN0aW9uIHRleHRGdW5jdGlvbiQxKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpOwogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7CiAgfTsKfQoKdmFyIHRyYW5zaXRpb25fdGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgcmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgPyB0ZXh0RnVuY3Rpb24kMSh0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKQogICAgICA6IHRleHRDb25zdGFudCQxKHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiIpKTsKfQoKdmFyIHRyYW5zaXRpb25fdHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkgewogIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQwID0gdGhpcy5faWQsCiAgICAgIGlkMSA9IG5ld0lkKCk7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIHZhciBpbmhlcml0ID0gZ2V0JDEobm9kZSwgaWQwKTsKICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7CiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgIGRlbGF5OiAwLAogICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sCiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICB9KTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsKfQoKdmFyIGlkID0gMDsKCmZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkgewogIHRoaXMuX2dyb3VwcyA9IGdyb3VwczsKICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICB0aGlzLl9uYW1lID0gbmFtZTsKICB0aGlzLl9pZCA9IGlkOwp9CgpmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHsKICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTsKfQoKZnVuY3Rpb24gbmV3SWQoKSB7CiAgcmV0dXJuICsraWQ7Cn0KCnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTsKClRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sCiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCwKICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsLAogIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsCiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsCiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbiwKICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sCiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLAogIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLAogIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSwKICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsCiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksCiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLAogIG9uOiB0cmFuc2l0aW9uX29uLAogIGF0dHI6IHRyYW5zaXRpb25fYXR0ciwKICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLAogIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLAogIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbiwKICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsCiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSwKICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbiwKICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSwKICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbiwKICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UKfTsKCnZhciBkZWZhdWx0VGltaW5nID0gewogIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuCiAgZGVsYXk6IDAsCiAgZHVyYXRpb246IDI1MCwKICBlYXNlOiBjdWJpY0luT3V0Cn07CgpmdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7CiAgdmFyIHRpbWluZzsKICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHsKICAgICAgcmV0dXJuIGRlZmF1bHRUaW1pbmcudGltZSA9IG5vdygpLCBkZWZhdWx0VGltaW5nOwogICAgfQogIH0KICByZXR1cm4gdGltaW5nOwp9Cgp2YXIgc2VsZWN0aW9uX3RyYW5zaXRpb24gPSBmdW5jdGlvbihuYW1lKSB7CiAgdmFyIGlkLAogICAgICB0aW1pbmc7CgogIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikgewogICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7CiAgfSBlbHNlIHsKICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CiAgfQoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKfQoKc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0OwpzZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsKCnZhciByb290JDEgPSBbbnVsbF07Cgp2YXIgYWN0aXZlID0gZnVuY3Rpb24obm9kZSwgbmFtZSkgewogIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgc2NoZWR1bGUsCiAgICAgIGk7CgogIGlmIChzY2hlZHVsZXMpIHsKICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArICIiOwogICAgZm9yIChpIGluIHNjaGVkdWxlcykgewogICAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5zdGF0ZSA+IFNDSEVEVUxFRCAmJiBzY2hlZHVsZS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKFtbbm9kZV1dLCByb290JDEsIG5hbWUsICtpKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG51bGw7Cn0KCnZhciBzbGljZSQ0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKdmFyIGlkZW50aXR5JDUgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIHg7Cn0KCnZhciB0b3AgPSAxOwp2YXIgcmlnaHQgPSAyOwp2YXIgYm90dG9tID0gMzsKdmFyIGxlZnQgPSA0Owp2YXIgZXBzaWxvbiQyID0gMWUtNjsKCmZ1bmN0aW9uIHRyYW5zbGF0ZVgoc2NhbGUwLCBzY2FsZTEsIGQpIHsKICB2YXIgeCA9IHNjYWxlMChkKTsKICByZXR1cm4gInRyYW5zbGF0ZSgiICsgKGlzRmluaXRlKHgpID8geCA6IHNjYWxlMShkKSkgKyAiLDApIjsKfQoKZnVuY3Rpb24gdHJhbnNsYXRlWShzY2FsZTAsIHNjYWxlMSwgZCkgewogIHZhciB5ID0gc2NhbGUwKGQpOwogIHJldHVybiAidHJhbnNsYXRlKDAsIiArIChpc0Zpbml0ZSh5KSA/IHkgOiBzY2FsZTEoZCkpICsgIikiOwp9CgpmdW5jdGlvbiBjZW50ZXIoc2NhbGUpIHsKICB2YXIgb2Zmc2V0ID0gc2NhbGUuYmFuZHdpZHRoKCkgLyAyOwogIGlmIChzY2FsZS5yb3VuZCgpKSBvZmZzZXQgPSBNYXRoLnJvdW5kKG9mZnNldCk7CiAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiBzY2FsZShkKSArIG9mZnNldDsKICB9Owp9CgpmdW5jdGlvbiBlbnRlcmluZygpIHsKICByZXR1cm4gIXRoaXMuX19heGlzOwp9CgpmdW5jdGlvbiBheGlzKG9yaWVudCwgc2NhbGUpIHsKICB2YXIgdGlja0FyZ3VtZW50cyA9IFtdLAogICAgICB0aWNrVmFsdWVzID0gbnVsbCwKICAgICAgdGlja0Zvcm1hdCA9IG51bGwsCiAgICAgIHRpY2tTaXplSW5uZXIgPSA2LAogICAgICB0aWNrU2l6ZU91dGVyID0gNiwKICAgICAgdGlja1BhZGRpbmcgPSAzOwoKICBmdW5jdGlvbiBheGlzKGNvbnRleHQpIHsKICAgIHZhciB2YWx1ZXMgPSB0aWNrVmFsdWVzID09IG51bGwgPyAoc2NhbGUudGlja3MgPyBzY2FsZS50aWNrcy5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBzY2FsZS5kb21haW4oKSkgOiB0aWNrVmFsdWVzLAogICAgICAgIGZvcm1hdCA9IHRpY2tGb3JtYXQgPT0gbnVsbCA/IChzY2FsZS50aWNrRm9ybWF0ID8gc2NhbGUudGlja0Zvcm1hdC5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBpZGVudGl0eSQ1KSA6IHRpY2tGb3JtYXQsCiAgICAgICAgc3BhY2luZyA9IE1hdGgubWF4KHRpY2tTaXplSW5uZXIsIDApICsgdGlja1BhZGRpbmcsCiAgICAgICAgdHJhbnNmb3JtID0gb3JpZW50ID09PSB0b3AgfHwgb3JpZW50ID09PSBib3R0b20gPyB0cmFuc2xhdGVYIDogdHJhbnNsYXRlWSwKICAgICAgICByYW5nZSA9IHNjYWxlLnJhbmdlKCksCiAgICAgICAgcmFuZ2UwID0gcmFuZ2VbMF0gKyAwLjUsCiAgICAgICAgcmFuZ2UxID0gcmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gKyAwLjUsCiAgICAgICAgcG9zaXRpb24gPSAoc2NhbGUuYmFuZHdpZHRoID8gY2VudGVyIDogaWRlbnRpdHkkNSkoc2NhbGUuY29weSgpKSwKICAgICAgICBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0LAogICAgICAgIHBhdGggPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLAogICAgICAgIHRpY2sgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCIudGljayIpLmRhdGEodmFsdWVzLCBzY2FsZSkub3JkZXIoKSwKICAgICAgICB0aWNrRXhpdCA9IHRpY2suZXhpdCgpLAogICAgICAgIHRpY2tFbnRlciA9IHRpY2suZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJ0aWNrIiksCiAgICAgICAgbGluZSA9IHRpY2suc2VsZWN0KCJsaW5lIiksCiAgICAgICAgdGV4dCA9IHRpY2suc2VsZWN0KCJ0ZXh0IiksCiAgICAgICAgayA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9PT0gbGVmdCA/IC0xIDogMSwKICAgICAgICB4LCB5ID0gb3JpZW50ID09PSBsZWZ0IHx8IG9yaWVudCA9PT0gcmlnaHQgPyAoeCA9ICJ4IiwgInkiKSA6ICh4ID0gInkiLCAieCIpOwoKICAgIHBhdGggPSBwYXRoLm1lcmdlKHBhdGguZW50ZXIoKS5pbnNlcnQoInBhdGgiLCAiLnRpY2siKQogICAgICAgIC5hdHRyKCJjbGFzcyIsICJkb21haW4iKQogICAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzAwMCIpKTsKCiAgICB0aWNrID0gdGljay5tZXJnZSh0aWNrRW50ZXIpOwoKICAgIGxpbmUgPSBsaW5lLm1lcmdlKHRpY2tFbnRlci5hcHBlbmQoImxpbmUiKQogICAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzAwMCIpCiAgICAgICAgLmF0dHIoeCArICIyIiwgayAqIHRpY2tTaXplSW5uZXIpCiAgICAgICAgLmF0dHIoeSArICIxIiwgMC41KQogICAgICAgIC5hdHRyKHkgKyAiMiIsIDAuNSkpOwoKICAgIHRleHQgPSB0ZXh0Lm1lcmdlKHRpY2tFbnRlci5hcHBlbmQoInRleHQiKQogICAgICAgIC5hdHRyKCJmaWxsIiwgIiMwMDAiKQogICAgICAgIC5hdHRyKHgsIGsgKiBzcGFjaW5nKQogICAgICAgIC5hdHRyKHksIDAuNSkKICAgICAgICAuYXR0cigiZHkiLCBvcmllbnQgPT09IHRvcCA/ICIwZW0iIDogb3JpZW50ID09PSBib3R0b20gPyAiMC43MWVtIiA6ICIwLjMyZW0iKSk7CgogICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICBwYXRoID0gcGF0aC50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICB0aWNrID0gdGljay50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICBsaW5lID0gbGluZS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICB0ZXh0ID0gdGV4dC50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAgdGlja0V4aXQgPSB0aWNrRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpCiAgICAgICAgICAuYXR0cigib3BhY2l0eSIsIGVwc2lsb24kMikKICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiB0cmFuc2Zvcm0ocG9zaXRpb24sIHRoaXMucGFyZW50Tm9kZS5fX2F4aXMgfHwgcG9zaXRpb24sIGQpOyB9KTsKCiAgICAgIHRpY2tFbnRlcgogICAgICAgICAgLmF0dHIoIm9wYWNpdHkiLCBlcHNpbG9uJDIpCiAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gdHJhbnNmb3JtKHRoaXMucGFyZW50Tm9kZS5fX2F4aXMgfHwgcG9zaXRpb24sIHBvc2l0aW9uLCBkKTsgfSk7CiAgICB9CgogICAgdGlja0V4aXQucmVtb3ZlKCk7CgogICAgcGF0aAogICAgICAgIC5hdHRyKCJkIiwgb3JpZW50ID09PSBsZWZ0IHx8IG9yaWVudCA9PSByaWdodAogICAgICAgICAgICA/ICJNIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIiwiICsgcmFuZ2UwICsgIkgwLjVWIiArIHJhbmdlMSArICJIIiArIGsgKiB0aWNrU2l6ZU91dGVyCiAgICAgICAgICAgIDogIk0iICsgcmFuZ2UwICsgIiwiICsgayAqIHRpY2tTaXplT3V0ZXIgKyAiVjAuNUgiICsgcmFuZ2UxICsgIlYiICsgayAqIHRpY2tTaXplT3V0ZXIpOwoKICAgIHRpY2sKICAgICAgICAuYXR0cigib3BhY2l0eSIsIDEpCiAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRyYW5zZm9ybShwb3NpdGlvbiwgcG9zaXRpb24sIGQpOyB9KTsKCiAgICBsaW5lCiAgICAgICAgLmF0dHIoeCArICIyIiwgayAqIHRpY2tTaXplSW5uZXIpOwoKICAgIHRleHQKICAgICAgICAuYXR0cih4LCBrICogc3BhY2luZykKICAgICAgICAudGV4dChmb3JtYXQpOwoKICAgIHNlbGVjdGlvbi5maWx0ZXIoZW50ZXJpbmcpCiAgICAgICAgLmF0dHIoImZpbGwiLCAibm9uZSIpCiAgICAgICAgLmF0dHIoImZvbnQtc2l6ZSIsIDEwKQogICAgICAgIC5hdHRyKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCBvcmllbnQgPT09IHJpZ2h0ID8gInN0YXJ0IiA6IG9yaWVudCA9PT0gbGVmdCA/ICJlbmQiIDogIm1pZGRsZSIpOwoKICAgIHNlbGVjdGlvbgogICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkgeyB0aGlzLl9fYXhpcyA9IHBvc2l0aW9uOyB9KTsKICB9CgogIGF4aXMuc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGF4aXMpIDogc2NhbGU7CiAgfTsKCiAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRpY2tBcmd1bWVudHMgPSBzbGljZSQ0LmNhbGwoYXJndW1lbnRzKSwgYXhpczsKICB9OwoKICBheGlzLnRpY2tBcmd1bWVudHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrQXJndW1lbnRzID0gXyA9PSBudWxsID8gW10gOiBzbGljZSQ0LmNhbGwoXyksIGF4aXMpIDogdGlja0FyZ3VtZW50cy5zbGljZSgpOwogIH07CgogIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tWYWx1ZXMgPSBfID09IG51bGwgPyBudWxsIDogc2xpY2UkNC5jYWxsKF8pLCBheGlzKSA6IHRpY2tWYWx1ZXMgJiYgdGlja1ZhbHVlcy5zbGljZSgpOwogIH07CgogIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tGb3JtYXQgPSBfLCBheGlzKSA6IHRpY2tGb3JtYXQ7CiAgfTsKCiAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplSW5uZXIgPSB0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsKICB9OwoKICBheGlzLnRpY2tTaXplSW5uZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZUlubmVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsKICB9OwoKICBheGlzLnRpY2tTaXplT3V0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVPdXRlcjsKICB9OwoKICBheGlzLnRpY2tQYWRkaW5nID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1BhZGRpbmcgPSArXywgYXhpcykgOiB0aWNrUGFkZGluZzsKICB9OwoKICByZXR1cm4gYXhpczsKfQoKZnVuY3Rpb24gYXhpc1RvcChzY2FsZSkgewogIHJldHVybiBheGlzKHRvcCwgc2NhbGUpOwp9CgpmdW5jdGlvbiBheGlzUmlnaHQoc2NhbGUpIHsKICByZXR1cm4gYXhpcyhyaWdodCwgc2NhbGUpOwp9CgpmdW5jdGlvbiBheGlzQm90dG9tKHNjYWxlKSB7CiAgcmV0dXJuIGF4aXMoYm90dG9tLCBzY2FsZSk7Cn0KCmZ1bmN0aW9uIGF4aXNMZWZ0KHNjYWxlKSB7CiAgcmV0dXJuIGF4aXMobGVmdCwgc2NhbGUpOwp9CgpmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7CiAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyOwp9CgpmdW5jdGlvbiBtZWFuWChjaGlsZHJlbikgewogIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UobWVhblhSZWR1Y2UsIDApIC8gY2hpbGRyZW4ubGVuZ3RoOwp9CgpmdW5jdGlvbiBtZWFuWFJlZHVjZSh4LCBjKSB7CiAgcmV0dXJuIHggKyBjLng7Cn0KCmZ1bmN0aW9uIG1heFkoY2hpbGRyZW4pIHsKICByZXR1cm4gMSArIGNoaWxkcmVuLnJlZHVjZShtYXhZUmVkdWNlLCAwKTsKfQoKZnVuY3Rpb24gbWF4WVJlZHVjZSh5LCBjKSB7CiAgcmV0dXJuIE1hdGgubWF4KHksIGMueSk7Cn0KCmZ1bmN0aW9uIGxlYWZMZWZ0KG5vZGUpIHsKICB2YXIgY2hpbGRyZW47CiAgd2hpbGUgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuWzBdOwogIHJldHVybiBub2RlOwp9CgpmdW5jdGlvbiBsZWFmUmlnaHQobm9kZSkgewogIHZhciBjaGlsZHJlbjsKICB3aGlsZSAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgcmV0dXJuIG5vZGU7Cn0KCnZhciBjbHVzdGVyID0gZnVuY3Rpb24oKSB7CiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbiwKICAgICAgZHggPSAxLAogICAgICBkeSA9IDEsCiAgICAgIG5vZGVTaXplID0gZmFsc2U7CgogIGZ1bmN0aW9uIGNsdXN0ZXIocm9vdCkgewogICAgdmFyIHByZXZpb3VzTm9kZSwKICAgICAgICB4ID0gMDsKCiAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRpbmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLgogICAgcm9vdC5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkgewogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICBpZiAoY2hpbGRyZW4pIHsKICAgICAgICBub2RlLnggPSBtZWFuWChjaGlsZHJlbik7CiAgICAgICAgbm9kZS55ID0gbWF4WShjaGlsZHJlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwOwogICAgICAgIG5vZGUueSA9IDA7CiAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIGxlZnQgPSBsZWFmTGVmdChyb290KSwKICAgICAgICByaWdodCA9IGxlYWZSaWdodChyb290KSwKICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwKICAgICAgICB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7CgogICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuCiAgICByZXR1cm4gcm9vdC5lYWNoQWZ0ZXIobm9kZVNpemUgPyBmdW5jdGlvbihub2RlKSB7CiAgICAgIG5vZGUueCA9IChub2RlLnggLSByb290LngpICogZHg7CiAgICAgIG5vZGUueSA9IChyb290LnkgLSBub2RlLnkpICogZHk7CiAgICB9IDogZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogZHg7CiAgICAgIG5vZGUueSA9ICgxIC0gKHJvb3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIGR5OwogICAgfSk7CiAgfQoKICBjbHVzdGVyLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZXBhcmF0aW9uID0geCwgY2x1c3RlcikgOiBzZXBhcmF0aW9uOwogIH07CgogIGNsdXN0ZXIuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXplID8gbnVsbCA6IFtkeCwgZHldKTsKICB9OwoKICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBjbHVzdGVyKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7CiAgfTsKCiAgcmV0dXJuIGNsdXN0ZXI7Cn0KCnZhciBub2RlX2VhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykgewogIHZhciBub2RlID0gdGhpcywgY3VycmVudCwgbmV4dCA9IFtub2RlXSwgY2hpbGRyZW4sIGksIG47CiAgZG8gewogICAgY3VycmVudCA9IG5leHQucmV2ZXJzZSgpLCBuZXh0ID0gW107CiAgICB3aGlsZSAobm9kZSA9IGN1cnJlbnQucG9wKCkpIHsKICAgICAgY2FsbGJhY2sobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgbmV4dC5wdXNoKGNoaWxkcmVuW2ldKTsKICAgICAgfQogICAgfQogIH0gd2hpbGUgKG5leHQubGVuZ3RoKTsKICByZXR1cm4gdGhpczsKfQoKdmFyIG5vZGVfZWFjaEJlZm9yZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXSwgY2hpbGRyZW4sIGk7CiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewogICAgY2FsbGJhY2sobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgIGlmIChjaGlsZHJlbikgZm9yIChpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgbm9kZXMucHVzaChjaGlsZHJlbltpXSk7CiAgICB9CiAgfQogIHJldHVybiB0aGlzOwp9Cgp2YXIgbm9kZV9lYWNoQWZ0ZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIG5leHQgPSBbXSwgY2hpbGRyZW4sIGksIG47CiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewogICAgbmV4dC5wdXNoKG5vZGUpLCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgbm9kZXMucHVzaChjaGlsZHJlbltpXSk7CiAgICB9CiAgfQogIHdoaWxlIChub2RlID0gbmV4dC5wb3AoKSkgewogICAgY2FsbGJhY2sobm9kZSk7CiAgfQogIHJldHVybiB0aGlzOwp9Cgp2YXIgbm9kZV9zdW0gPSBmdW5jdGlvbih2YWx1ZSkgewogIHJldHVybiB0aGlzLmVhY2hBZnRlcihmdW5jdGlvbihub2RlKSB7CiAgICB2YXIgc3VtID0gK3ZhbHVlKG5vZGUuZGF0YSkgfHwgMCwKICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sCiAgICAgICAgaSA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aDsKICAgIHdoaWxlICgtLWkgPj0gMCkgc3VtICs9IGNoaWxkcmVuW2ldLnZhbHVlOwogICAgbm9kZS52YWx1ZSA9IHN1bTsKICB9KTsKfQoKdmFyIG5vZGVfc29ydCA9IGZ1bmN0aW9uKGNvbXBhcmUpIHsKICByZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsKICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAgIG5vZGUuY2hpbGRyZW4uc29ydChjb21wYXJlKTsKICAgIH0KICB9KTsKfQoKdmFyIG5vZGVfcGF0aCA9IGZ1bmN0aW9uKGVuZCkgewogIHZhciBzdGFydCA9IHRoaXMsCiAgICAgIGFuY2VzdG9yID0gbGVhc3RDb21tb25BbmNlc3RvcihzdGFydCwgZW5kKSwKICAgICAgbm9kZXMgPSBbc3RhcnRdOwogIHdoaWxlIChzdGFydCAhPT0gYW5jZXN0b3IpIHsKICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50OwogICAgbm9kZXMucHVzaChzdGFydCk7CiAgfQogIHZhciBrID0gbm9kZXMubGVuZ3RoOwogIHdoaWxlIChlbmQgIT09IGFuY2VzdG9yKSB7CiAgICBub2Rlcy5zcGxpY2UoaywgMCwgZW5kKTsKICAgIGVuZCA9IGVuZC5wYXJlbnQ7CiAgfQogIHJldHVybiBub2RlczsKfQoKZnVuY3Rpb24gbGVhc3RDb21tb25BbmNlc3RvcihhLCBiKSB7CiAgaWYgKGEgPT09IGIpIHJldHVybiBhOwogIHZhciBhTm9kZXMgPSBhLmFuY2VzdG9ycygpLAogICAgICBiTm9kZXMgPSBiLmFuY2VzdG9ycygpLAogICAgICBjID0gbnVsbDsKICBhID0gYU5vZGVzLnBvcCgpOwogIGIgPSBiTm9kZXMucG9wKCk7CiAgd2hpbGUgKGEgPT09IGIpIHsKICAgIGMgPSBhOwogICAgYSA9IGFOb2Rlcy5wb3AoKTsKICAgIGIgPSBiTm9kZXMucG9wKCk7CiAgfQogIHJldHVybiBjOwp9Cgp2YXIgbm9kZV9hbmNlc3RvcnMgPSBmdW5jdGlvbigpIHsKICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdOwogIHdoaWxlIChub2RlID0gbm9kZS5wYXJlbnQpIHsKICAgIG5vZGVzLnB1c2gobm9kZSk7CiAgfQogIHJldHVybiBub2RlczsKfQoKdmFyIG5vZGVfZGVzY2VuZGFudHMgPSBmdW5jdGlvbigpIHsKICB2YXIgbm9kZXMgPSBbXTsKICB0aGlzLmVhY2goZnVuY3Rpb24obm9kZSkgewogICAgbm9kZXMucHVzaChub2RlKTsKICB9KTsKICByZXR1cm4gbm9kZXM7Cn0KCnZhciBub2RlX2xlYXZlcyA9IGZ1bmN0aW9uKCkgewogIHZhciBsZWF2ZXMgPSBbXTsKICB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgewogICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7CiAgICAgIGxlYXZlcy5wdXNoKG5vZGUpOwogICAgfQogIH0pOwogIHJldHVybiBsZWF2ZXM7Cn0KCnZhciBub2RlX2xpbmtzID0gZnVuY3Rpb24oKSB7CiAgdmFyIHJvb3QgPSB0aGlzLCBsaW5rcyA9IFtdOwogIHJvb3QuZWFjaChmdW5jdGlvbihub2RlKSB7CiAgICBpZiAobm9kZSAhPT0gcm9vdCkgeyAvLyBEb27DosKAwpl0IGluY2x1ZGUgdGhlIHJvb3TDosKAwplzIHBhcmVudCwgaWYgYW55LgogICAgICBsaW5rcy5wdXNoKHtzb3VyY2U6IG5vZGUucGFyZW50LCB0YXJnZXQ6IG5vZGV9KTsKICAgIH0KICB9KTsKICByZXR1cm4gbGlua3M7Cn0KCmZ1bmN0aW9uIGhpZXJhcmNoeShkYXRhLCBjaGlsZHJlbikgewogIHZhciByb290ID0gbmV3IE5vZGUoZGF0YSksCiAgICAgIHZhbHVlZCA9ICtkYXRhLnZhbHVlICYmIChyb290LnZhbHVlID0gZGF0YS52YWx1ZSksCiAgICAgIG5vZGUsCiAgICAgIG5vZGVzID0gW3Jvb3RdLAogICAgICBjaGlsZCwKICAgICAgY2hpbGRzLAogICAgICBpLAogICAgICBuOwoKICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgY2hpbGRyZW4gPSBkZWZhdWx0Q2hpbGRyZW47CgogIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHsKICAgIGlmICh2YWx1ZWQpIG5vZGUudmFsdWUgPSArbm9kZS5kYXRhLnZhbHVlOwogICAgaWYgKChjaGlsZHMgPSBjaGlsZHJlbihub2RlLmRhdGEpKSAmJiAobiA9IGNoaWxkcy5sZW5ndGgpKSB7CiAgICAgIG5vZGUuY2hpbGRyZW4gPSBuZXcgQXJyYXkobik7CiAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIG5vZGVzLnB1c2goY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldID0gbmV3IE5vZGUoY2hpbGRzW2ldKSk7CiAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTsKICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gcm9vdC5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpOwp9CgpmdW5jdGlvbiBub2RlX2NvcHkoKSB7CiAgcmV0dXJuIGhpZXJhcmNoeSh0aGlzKS5lYWNoQmVmb3JlKGNvcHlEYXRhKTsKfQoKZnVuY3Rpb24gZGVmYXVsdENoaWxkcmVuKGQpIHsKICByZXR1cm4gZC5jaGlsZHJlbjsKfQoKZnVuY3Rpb24gY29weURhdGEobm9kZSkgewogIG5vZGUuZGF0YSA9IG5vZGUuZGF0YS5kYXRhOwp9CgpmdW5jdGlvbiBjb21wdXRlSGVpZ2h0KG5vZGUpIHsKICB2YXIgaGVpZ2h0ID0gMDsKICBkbyBub2RlLmhlaWdodCA9IGhlaWdodDsKICB3aGlsZSAoKG5vZGUgPSBub2RlLnBhcmVudCkgJiYgKG5vZGUuaGVpZ2h0IDwgKytoZWlnaHQpKTsKfQoKZnVuY3Rpb24gTm9kZShkYXRhKSB7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmRlcHRoID0KICB0aGlzLmhlaWdodCA9IDA7CiAgdGhpcy5wYXJlbnQgPSBudWxsOwp9CgpOb2RlLnByb3RvdHlwZSA9IGhpZXJhcmNoeS5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IE5vZGUsCiAgZWFjaDogbm9kZV9lYWNoLAogIGVhY2hBZnRlcjogbm9kZV9lYWNoQWZ0ZXIsCiAgZWFjaEJlZm9yZTogbm9kZV9lYWNoQmVmb3JlLAogIHN1bTogbm9kZV9zdW0sCiAgc29ydDogbm9kZV9zb3J0LAogIHBhdGg6IG5vZGVfcGF0aCwKICBhbmNlc3RvcnM6IG5vZGVfYW5jZXN0b3JzLAogIGRlc2NlbmRhbnRzOiBub2RlX2Rlc2NlbmRhbnRzLAogIGxlYXZlczogbm9kZV9sZWF2ZXMsCiAgbGlua3M6IG5vZGVfbGlua3MsCiAgY29weTogbm9kZV9jb3B5Cn07CgpmdW5jdGlvbiBOb2RlJDIodmFsdWUpIHsKICB0aGlzLl8gPSB2YWx1ZTsKICB0aGlzLm5leHQgPSBudWxsOwp9Cgp2YXIgc2h1ZmZsZSQxID0gZnVuY3Rpb24oYXJyYXkpIHsKICB2YXIgaSwKICAgICAgbiA9IChhcnJheSA9IGFycmF5LnNsaWNlKCkpLmxlbmd0aCwKICAgICAgaGVhZCA9IG51bGwsCiAgICAgIG5vZGUgPSBoZWFkOwoKICB3aGlsZSAobikgewogICAgdmFyIG5leHQgPSBuZXcgTm9kZSQyKGFycmF5W24gLSAxXSk7CiAgICBpZiAobm9kZSkgbm9kZSA9IG5vZGUubmV4dCA9IG5leHQ7CiAgICBlbHNlIG5vZGUgPSBoZWFkID0gbmV4dDsKICAgIGFycmF5W2ldID0gYXJyYXlbLS1uXTsKICB9CgogIHJldHVybiB7CiAgICBoZWFkOiBoZWFkLAogICAgdGFpbDogbm9kZQogIH07Cn0KCnZhciBlbmNsb3NlID0gZnVuY3Rpb24oY2lyY2xlcykgewogIHJldHVybiBlbmNsb3NlTihzaHVmZmxlJDEoY2lyY2xlcyksIFtdKTsKfQoKZnVuY3Rpb24gZW5jbG9zZXMoYSwgYikgewogIHZhciBkeCA9IGIueCAtIGEueCwKICAgICAgZHkgPSBiLnkgLSBhLnksCiAgICAgIGRyID0gYS5yIC0gYi5yOwogIHJldHVybiBkciAqIGRyICsgMWUtNiA+IGR4ICogZHggKyBkeSAqIGR5Owp9CgovLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCBjaXJjbGUgdGhhdCBjb250YWlucyBjaXJjbGVzIEwgYW5kIGludGVyc2VjdHMgY2lyY2xlcyBCLgpmdW5jdGlvbiBlbmNsb3NlTihMLCBCKSB7CiAgdmFyIGNpcmNsZSwKICAgICAgbDAgPSBudWxsLAogICAgICBsMSA9IEwuaGVhZCwKICAgICAgbDIsCiAgICAgIHAxOwoKICBzd2l0Y2ggKEIubGVuZ3RoKSB7CiAgICBjYXNlIDE6IGNpcmNsZSA9IGVuY2xvc2UxKEJbMF0pOyBicmVhazsKICAgIGNhc2UgMjogY2lyY2xlID0gZW5jbG9zZTIoQlswXSwgQlsxXSk7IGJyZWFrOwogICAgY2FzZSAzOiBjaXJjbGUgPSBlbmNsb3NlMyhCWzBdLCBCWzFdLCBCWzJdKTsgYnJlYWs7CiAgfQoKICB3aGlsZSAobDEpIHsKICAgIHAxID0gbDEuXywgbDIgPSBsMS5uZXh0OwogICAgaWYgKCFjaXJjbGUgfHwgIWVuY2xvc2VzKGNpcmNsZSwgcDEpKSB7CgogICAgICAvLyBUZW1wb3JhcmlseSB0cnVuY2F0ZSBMIGJlZm9yZSBsMS4KICAgICAgaWYgKGwwKSBMLnRhaWwgPSBsMCwgbDAubmV4dCA9IG51bGw7CiAgICAgIGVsc2UgTC5oZWFkID0gTC50YWlsID0gbnVsbDsKCiAgICAgIEIucHVzaChwMSk7CiAgICAgIGNpcmNsZSA9IGVuY2xvc2VOKEwsIEIpOyAvLyBOb3RlOiByZW9yZGVycyBMIQogICAgICBCLnBvcCgpOwoKICAgICAgLy8gTW92ZSBsMSB0byB0aGUgZnJvbnQgb2YgTCBhbmQgcmVjb25uZWN0IHRoZSB0cnVuY2F0ZWQgbGlzdCBMLgogICAgICBpZiAoTC5oZWFkKSBsMS5uZXh0ID0gTC5oZWFkLCBMLmhlYWQgPSBsMTsKICAgICAgZWxzZSBsMS5uZXh0ID0gbnVsbCwgTC5oZWFkID0gTC50YWlsID0gbDE7CiAgICAgIGwwID0gTC50YWlsLCBsMC5uZXh0ID0gbDI7CgogICAgfSBlbHNlIHsKICAgICAgbDAgPSBsMTsKICAgIH0KICAgIGwxID0gbDI7CiAgfQoKICBMLnRhaWwgPSBsMDsKICByZXR1cm4gY2lyY2xlOwp9CgpmdW5jdGlvbiBlbmNsb3NlMShhKSB7CiAgcmV0dXJuIHsKICAgIHg6IGEueCwKICAgIHk6IGEueSwKICAgIHI6IGEucgogIH07Cn0KCmZ1bmN0aW9uIGVuY2xvc2UyKGEsIGIpIHsKICB2YXIgeDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEuciwKICAgICAgeDIgPSBiLngsIHkyID0gYi55LCByMiA9IGIuciwKICAgICAgeDIxID0geDIgLSB4MSwgeTIxID0geTIgLSB5MSwgcjIxID0gcjIgLSByMSwKICAgICAgbCA9IE1hdGguc3FydCh4MjEgKiB4MjEgKyB5MjEgKiB5MjEpOwogIHJldHVybiB7CiAgICB4OiAoeDEgKyB4MiArIHgyMSAvIGwgKiByMjEpIC8gMiwKICAgIHk6ICh5MSArIHkyICsgeTIxIC8gbCAqIHIyMSkgLyAyLAogICAgcjogKGwgKyByMSArIHIyKSAvIDIKICB9Owp9CgpmdW5jdGlvbiBlbmNsb3NlMyhhLCBiLCBjKSB7CiAgdmFyIHgxID0gYS54LCB5MSA9IGEueSwgcjEgPSBhLnIsCiAgICAgIHgyID0gYi54LCB5MiA9IGIueSwgcjIgPSBiLnIsCiAgICAgIHgzID0gYy54LCB5MyA9IGMueSwgcjMgPSBjLnIsCiAgICAgIGEyID0gMiAqICh4MSAtIHgyKSwKICAgICAgYjIgPSAyICogKHkxIC0geTIpLAogICAgICBjMiA9IDIgKiAocjIgLSByMSksCiAgICAgIGQyID0geDEgKiB4MSArIHkxICogeTEgLSByMSAqIHIxIC0geDIgKiB4MiAtIHkyICogeTIgKyByMiAqIHIyLAogICAgICBhMyA9IDIgKiAoeDEgLSB4MyksCiAgICAgIGIzID0gMiAqICh5MSAtIHkzKSwKICAgICAgYzMgPSAyICogKHIzIC0gcjEpLAogICAgICBkMyA9IHgxICogeDEgKyB5MSAqIHkxIC0gcjEgKiByMSAtIHgzICogeDMgLSB5MyAqIHkzICsgcjMgKiByMywKICAgICAgYWIgPSBhMyAqIGIyIC0gYTIgKiBiMywKICAgICAgeGEgPSAoYjIgKiBkMyAtIGIzICogZDIpIC8gYWIgLSB4MSwKICAgICAgeGIgPSAoYjMgKiBjMiAtIGIyICogYzMpIC8gYWIsCiAgICAgIHlhID0gKGEzICogZDIgLSBhMiAqIGQzKSAvIGFiIC0geTEsCiAgICAgIHliID0gKGEyICogYzMgLSBhMyAqIGMyKSAvIGFiLAogICAgICBBID0geGIgKiB4YiArIHliICogeWIgLSAxLAogICAgICBCID0gMiAqICh4YSAqIHhiICsgeWEgKiB5YiArIHIxKSwKICAgICAgQyA9IHhhICogeGEgKyB5YSAqIHlhIC0gcjEgKiByMSwKICAgICAgciA9ICgtQiAtIE1hdGguc3FydChCICogQiAtIDQgKiBBICogQykpIC8gKDIgKiBBKTsKICByZXR1cm4gewogICAgeDogeGEgKyB4YiAqIHIgKyB4MSwKICAgIHk6IHlhICsgeWIgKiByICsgeTEsCiAgICByOiByCiAgfTsKfQoKZnVuY3Rpb24gcGxhY2UoYSwgYiwgYykgewogIHZhciBheCA9IGEueCwKICAgICAgYXkgPSBhLnksCiAgICAgIGRhID0gYi5yICsgYy5yLAogICAgICBkYiA9IGEuciArIGMuciwKICAgICAgZHggPSBiLnggLSBheCwKICAgICAgZHkgPSBiLnkgLSBheSwKICAgICAgZGMgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICBpZiAoZGMpIHsKICAgIHZhciB4ID0gMC41ICsgKChkYiAqPSBkYikgLSAoZGEgKj0gZGEpKSAvICgyICogZGMpLAogICAgICAgIHkgPSBNYXRoLnNxcnQoTWF0aC5tYXgoMCwgMiAqIGRhICogKGRiICsgZGMpIC0gKGRiIC09IGRjKSAqIGRiIC0gZGEgKiBkYSkpIC8gKDIgKiBkYyk7CiAgICBjLnggPSBheCArIHggKiBkeCArIHkgKiBkeTsKICAgIGMueSA9IGF5ICsgeCAqIGR5IC0geSAqIGR4OwogIH0gZWxzZSB7CiAgICBjLnggPSBheCArIGRiOwogICAgYy55ID0gYXk7CiAgfQp9CgpmdW5jdGlvbiBpbnRlcnNlY3RzKGEsIGIpIHsKICB2YXIgZHggPSBiLnggLSBhLngsCiAgICAgIGR5ID0gYi55IC0gYS55LAogICAgICBkciA9IGEuciArIGIucjsKICByZXR1cm4gZHIgKiBkciA+IGR4ICogZHggKyBkeSAqIGR5Owp9CgpmdW5jdGlvbiBkaXN0YW5jZTIoY2lyY2xlLCB4LCB5KSB7CiAgdmFyIGR4ID0gY2lyY2xlLnggLSB4LAogICAgICBkeSA9IGNpcmNsZS55IC0geTsKICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7Cn0KCmZ1bmN0aW9uIE5vZGUkMShjaXJjbGUpIHsKICB0aGlzLl8gPSBjaXJjbGU7CiAgdGhpcy5uZXh0ID0gbnVsbDsKICB0aGlzLnByZXZpb3VzID0gbnVsbDsKfQoKZnVuY3Rpb24gcGFja0VuY2xvc2UoY2lyY2xlcykgewogIGlmICghKG4gPSBjaXJjbGVzLmxlbmd0aCkpIHJldHVybiAwOwoKICB2YXIgYSwgYiwgYywgbjsKCiAgLy8gUGxhY2UgdGhlIGZpcnN0IGNpcmNsZS4KICBhID0gY2lyY2xlc1swXSwgYS54ID0gMCwgYS55ID0gMDsKICBpZiAoIShuID4gMSkpIHJldHVybiBhLnI7CgogIC8vIFBsYWNlIHRoZSBzZWNvbmQgY2lyY2xlLgogIGIgPSBjaXJjbGVzWzFdLCBhLnggPSAtYi5yLCBiLnggPSBhLnIsIGIueSA9IDA7CiAgaWYgKCEobiA+IDIpKSByZXR1cm4gYS5yICsgYi5yOwoKICAvLyBQbGFjZSB0aGUgdGhpcmQgY2lyY2xlLgogIHBsYWNlKGIsIGEsIGMgPSBjaXJjbGVzWzJdKTsKCiAgLy8gSW5pdGlhbGl6ZSB0aGUgd2VpZ2h0ZWQgY2VudHJvaWQuCiAgdmFyIGFhID0gYS5yICogYS5yLAogICAgICBiYSA9IGIuciAqIGIuciwKICAgICAgY2EgPSBjLnIgKiBjLnIsCiAgICAgIG9hID0gYWEgKyBiYSArIGNhLAogICAgICBveCA9IGFhICogYS54ICsgYmEgKiBiLnggKyBjYSAqIGMueCwKICAgICAgb3kgPSBhYSAqIGEueSArIGJhICogYi55ICsgY2EgKiBjLnksCiAgICAgIGN4LCBjeSwgaSwgaiwgaywgc2osIHNrOwoKICAvLyBJbml0aWFsaXplIHRoZSBmcm9udC1jaGFpbiB1c2luZyB0aGUgZmlyc3QgdGhyZWUgY2lyY2xlcyBhLCBiIGFuZCBjLgogIGEgPSBuZXcgTm9kZSQxKGEpLCBiID0gbmV3IE5vZGUkMShiKSwgYyA9IG5ldyBOb2RlJDEoYyk7CiAgYS5uZXh0ID0gYy5wcmV2aW91cyA9IGI7CiAgYi5uZXh0ID0gYS5wcmV2aW91cyA9IGM7CiAgYy5uZXh0ID0gYi5wcmV2aW91cyA9IGE7CgogIC8vIEF0dGVtcHQgdG8gcGxhY2UgZWFjaCByZW1haW5pbmcgY2lyY2xlw6LCgMKmCiAgcGFjazogZm9yIChpID0gMzsgaSA8IG47ICsraSkgewogICAgcGxhY2UoYS5fLCBiLl8sIGMgPSBjaXJjbGVzW2ldKSwgYyA9IG5ldyBOb2RlJDEoYyk7CgogICAgLy8gSWYgdGhlcmUgYXJlIG9ubHkgdGhyZWUgZWxlbWVudHMgaW4gdGhlIGZyb250LWNoYWluw6LCgMKmCiAgICBpZiAoKGsgPSBhLnByZXZpb3VzKSA9PT0gKGogPSBiLm5leHQpKSB7CiAgICAgIC8vIElmIHRoZSBuZXcgY2lyY2xlIGludGVyc2VjdHMgdGhlIHRoaXJkIGNpcmNsZSwKICAgICAgLy8gcm90YXRlIHRoZSBmcm9udCBjaGFpbiB0byB0cnkgdGhlIG5leHQgcG9zaXRpb24uCiAgICAgIGlmIChpbnRlcnNlY3RzKGouXywgYy5fKSkgewogICAgICAgIGEgPSBiLCBiID0gaiwgLS1pOwogICAgICAgIGNvbnRpbnVlIHBhY2s7CiAgICAgIH0KICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IGludGVyc2VjdGluZyBjaXJjbGUgb24gdGhlIGZyb250LWNoYWluLCBpZiBhbnkuCiAgICBlbHNlIHsKICAgICAgc2ogPSBqLl8uciwgc2sgPSBrLl8ucjsKICAgICAgZG8gewogICAgICAgIGlmIChzaiA8PSBzaykgewogICAgICAgICAgaWYgKGludGVyc2VjdHMoai5fLCBjLl8pKSB7CiAgICAgICAgICAgIGIgPSBqLCBhLm5leHQgPSBiLCBiLnByZXZpb3VzID0gYSwgLS1pOwogICAgICAgICAgICBjb250aW51ZSBwYWNrOwogICAgICAgICAgfQogICAgICAgICAgaiA9IGoubmV4dCwgc2ogKz0gai5fLnI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChpbnRlcnNlY3RzKGsuXywgYy5fKSkgewogICAgICAgICAgICBhID0gaywgYS5uZXh0ID0gYiwgYi5wcmV2aW91cyA9IGEsIC0taTsKICAgICAgICAgICAgY29udGludWUgcGFjazsKICAgICAgICAgIH0KICAgICAgICAgIGsgPSBrLnByZXZpb3VzLCBzayArPSBrLl8ucjsKICAgICAgICB9CiAgICAgIH0gd2hpbGUgKGogIT09IGsubmV4dCk7CiAgICB9CgogICAgLy8gU3VjY2VzcyEgSW5zZXJ0IHRoZSBuZXcgY2lyY2xlIGMgYmV0d2VlbiBhIGFuZCBiLgogICAgYy5wcmV2aW91cyA9IGEsIGMubmV4dCA9IGIsIGEubmV4dCA9IGIucHJldmlvdXMgPSBiID0gYzsKCiAgICAvLyBVcGRhdGUgdGhlIHdlaWdodGVkIGNlbnRyb2lkLgogICAgb2EgKz0gY2EgPSBjLl8uciAqIGMuXy5yOwogICAgb3ggKz0gY2EgKiBjLl8ueDsKICAgIG95ICs9IGNhICogYy5fLnk7CgogICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGNsb3Nlc3QgY2lyY2xlIGEgdG8gY2VudHJvaWQuCiAgICBhYSA9IGRpc3RhbmNlMihhLl8sIGN4ID0gb3ggLyBvYSwgY3kgPSBveSAvIG9hKTsKICAgIHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIHsKICAgICAgaWYgKChjYSA9IGRpc3RhbmNlMihjLl8sIGN4LCBjeSkpIDwgYWEpIHsKICAgICAgICBhID0gYywgYWEgPSBjYTsKICAgICAgfQogICAgfQogICAgYiA9IGEubmV4dDsKICB9CgogIC8vIENvbXB1dGUgdGhlIGVuY2xvc2luZyBjaXJjbGUgb2YgdGhlIGZyb250IGNoYWluLgogIGEgPSBbYi5fXSwgYyA9IGI7IHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIGEucHVzaChjLl8pOyBjID0gZW5jbG9zZShhKTsKCiAgLy8gVHJhbnNsYXRlIHRoZSBjaXJjbGVzIHRvIHB1dCB0aGUgZW5jbG9zaW5nIGNpcmNsZSBhcm91bmQgdGhlIG9yaWdpbi4KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBhID0gY2lyY2xlc1tpXSwgYS54IC09IGMueCwgYS55IC09IGMueTsKCiAgcmV0dXJuIGMucjsKfQoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oY2lyY2xlcykgewogIHBhY2tFbmNsb3NlKGNpcmNsZXMpOwogIHJldHVybiBjaXJjbGVzOwp9CgpmdW5jdGlvbiBvcHRpb25hbChmKSB7CiAgcmV0dXJuIGYgPT0gbnVsbCA/IG51bGwgOiByZXF1aXJlZChmKTsKfQoKZnVuY3Rpb24gcmVxdWlyZWQoZikgewogIGlmICh0eXBlb2YgZiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogIHJldHVybiBmOwp9CgpmdW5jdGlvbiBjb25zdGFudFplcm8oKSB7CiAgcmV0dXJuIDA7Cn0KCnZhciBjb25zdGFudCQ2ID0gZnVuY3Rpb24oeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCmZ1bmN0aW9uIGRlZmF1bHRSYWRpdXMoZCkgewogIHJldHVybiBNYXRoLnNxcnQoZC52YWx1ZSk7Cn0KCnZhciBpbmRleCA9IGZ1bmN0aW9uKCkgewogIHZhciByYWRpdXMgPSBudWxsLAogICAgICBkeCA9IDEsCiAgICAgIGR5ID0gMSwKICAgICAgcGFkZGluZyA9IGNvbnN0YW50WmVybzsKCiAgZnVuY3Rpb24gcGFjayhyb290KSB7CiAgICByb290LnggPSBkeCAvIDIsIHJvb3QueSA9IGR5IC8gMjsKICAgIGlmIChyYWRpdXMpIHsKICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYocmFkaXVzKSkKICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0NoaWxkcmVuKHBhZGRpbmcsIDAuNSkpCiAgICAgICAgICAuZWFjaEJlZm9yZSh0cmFuc2xhdGVDaGlsZCgxKSk7CiAgICB9IGVsc2UgewogICAgICByb290LmVhY2hCZWZvcmUocmFkaXVzTGVhZihkZWZhdWx0UmFkaXVzKSkKICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0NoaWxkcmVuKGNvbnN0YW50WmVybywgMSkpCiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCByb290LnIgLyBNYXRoLm1pbihkeCwgZHkpKSkKICAgICAgICAgIC5lYWNoQmVmb3JlKHRyYW5zbGF0ZUNoaWxkKE1hdGgubWluKGR4LCBkeSkgLyAoMiAqIHJvb3QucikpKTsKICAgIH0KICAgIHJldHVybiByb290OwogIH0KCiAgcGFjay5yYWRpdXMgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSBvcHRpb25hbCh4KSwgcGFjaykgOiByYWRpdXM7CiAgfTsKCiAgcGFjay5zaXplID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFjaykgOiBbZHgsIGR5XTsKICB9OwoKICBwYWNrLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkNigreCksIHBhY2spIDogcGFkZGluZzsKICB9OwoKICByZXR1cm4gcGFjazsKfQoKZnVuY3Rpb24gcmFkaXVzTGVhZihyYWRpdXMpIHsKICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7CiAgICAgIG5vZGUuciA9IE1hdGgubWF4KDAsICtyYWRpdXMobm9kZSkgfHwgMCk7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gcGFja0NoaWxkcmVuKHBhZGRpbmcsIGspIHsKICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgewogICAgICB2YXIgY2hpbGRyZW4sCiAgICAgICAgICBpLAogICAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCwKICAgICAgICAgIHIgPSBwYWRkaW5nKG5vZGUpICogayB8fCAwLAogICAgICAgICAgZTsKCiAgICAgIGlmIChyKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJlbltpXS5yICs9IHI7CiAgICAgIGUgPSBwYWNrRW5jbG9zZShjaGlsZHJlbik7CiAgICAgIGlmIChyKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJlbltpXS5yIC09IHI7CiAgICAgIG5vZGUuciA9IGUgKyByOwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zbGF0ZUNoaWxkKGspIHsKICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgbm9kZS5yICo9IGs7CiAgICBpZiAocGFyZW50KSB7CiAgICAgIG5vZGUueCA9IHBhcmVudC54ICsgayAqIG5vZGUueDsKICAgICAgbm9kZS55ID0gcGFyZW50LnkgKyBrICogbm9kZS55OwogICAgfQogIH07Cn0KCnZhciByb3VuZE5vZGUgPSBmdW5jdGlvbihub2RlKSB7CiAgbm9kZS54MCA9IE1hdGgucm91bmQobm9kZS54MCk7CiAgbm9kZS55MCA9IE1hdGgucm91bmQobm9kZS55MCk7CiAgbm9kZS54MSA9IE1hdGgucm91bmQobm9kZS54MSk7CiAgbm9kZS55MSA9IE1hdGgucm91bmQobm9kZS55MSk7Cn0KCnZhciB0cmVlbWFwRGljZSA9IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgIG5vZGUsCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgayA9IHBhcmVudC52YWx1ZSAmJiAoeDEgLSB4MCkgLyBwYXJlbnQudmFsdWU7CgogIHdoaWxlICgrK2kgPCBuKSB7CiAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkxOwogICAgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDAgKz0gbm9kZS52YWx1ZSAqIGs7CiAgfQp9Cgp2YXIgcGFydGl0aW9uID0gZnVuY3Rpb24oKSB7CiAgdmFyIGR4ID0gMSwKICAgICAgZHkgPSAxLAogICAgICBwYWRkaW5nID0gMCwKICAgICAgcm91bmQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gcGFydGl0aW9uKHJvb3QpIHsKICAgIHZhciBuID0gcm9vdC5oZWlnaHQgKyAxOwogICAgcm9vdC54MCA9CiAgICByb290LnkwID0gcGFkZGluZzsKICAgIHJvb3QueDEgPSBkeDsKICAgIHJvb3QueTEgPSBkeSAvIG47CiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKGR5LCBuKSk7CiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpOwogICAgcmV0dXJuIHJvb3Q7CiAgfQoKICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUoZHksIG4pIHsKICAgIHJldHVybiBmdW5jdGlvbihub2RlKSB7CiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAgICAgdHJlZW1hcERpY2Uobm9kZSwgbm9kZS54MCwgZHkgKiAobm9kZS5kZXB0aCArIDEpIC8gbiwgbm9kZS54MSwgZHkgKiAobm9kZS5kZXB0aCArIDIpIC8gbik7CiAgICAgIH0KICAgICAgdmFyIHgwID0gbm9kZS54MCwKICAgICAgICAgIHkwID0gbm9kZS55MCwKICAgICAgICAgIHgxID0gbm9kZS54MSAtIHBhZGRpbmcsCiAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwYWRkaW5nOwogICAgICBpZiAoeDEgPCB4MCkgeDAgPSB4MSA9ICh4MCArIHgxKSAvIDI7CiAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjsKICAgICAgbm9kZS54MCA9IHgwOwogICAgICBub2RlLnkwID0geTA7CiAgICAgIG5vZGUueDEgPSB4MTsKICAgICAgbm9kZS55MSA9IHkxOwogICAgfTsKICB9CgogIHBhcnRpdGlvbi5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCBwYXJ0aXRpb24pIDogcm91bmQ7CiAgfTsKCiAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYXJ0aXRpb24pIDogW2R4LCBkeV07CiAgfTsKCiAgcGFydGl0aW9uLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nID0gK3gsIHBhcnRpdGlvbikgOiBwYWRkaW5nOwogIH07CgogIHJldHVybiBwYXJ0aXRpb247Cn0KCnZhciBrZXlQcmVmaXgkMSA9ICIkIjsKdmFyIHByZXJvb3QgPSB7ZGVwdGg6IC0xfTsKdmFyIGFtYmlndW91cyA9IHt9OwoKZnVuY3Rpb24gZGVmYXVsdElkKGQpIHsKICByZXR1cm4gZC5pZDsKfQoKZnVuY3Rpb24gZGVmYXVsdFBhcmVudElkKGQpIHsKICByZXR1cm4gZC5wYXJlbnRJZDsKfQoKdmFyIHN0cmF0aWZ5ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGlkID0gZGVmYXVsdElkLAogICAgICBwYXJlbnRJZCA9IGRlZmF1bHRQYXJlbnRJZDsKCiAgZnVuY3Rpb24gc3RyYXRpZnkoZGF0YSkgewogICAgdmFyIGQsCiAgICAgICAgaSwKICAgICAgICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgcm9vdCwKICAgICAgICBwYXJlbnQsCiAgICAgICAgbm9kZSwKICAgICAgICBub2RlcyA9IG5ldyBBcnJheShuKSwKICAgICAgICBub2RlSWQsCiAgICAgICAgbm9kZUtleSwKICAgICAgICBub2RlQnlLZXkgPSB7fTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGQgPSBkYXRhW2ldLCBub2RlID0gbm9kZXNbaV0gPSBuZXcgTm9kZShkKTsKICAgICAgaWYgKChub2RlSWQgPSBpZChkLCBpLCBkYXRhKSkgIT0gbnVsbCAmJiAobm9kZUlkICs9ICIiKSkgewogICAgICAgIG5vZGVLZXkgPSBrZXlQcmVmaXgkMSArIChub2RlLmlkID0gbm9kZUlkKTsKICAgICAgICBub2RlQnlLZXlbbm9kZUtleV0gPSBub2RlS2V5IGluIG5vZGVCeUtleSA/IGFtYmlndW91cyA6IG5vZGU7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZUlkID0gcGFyZW50SWQoZGF0YVtpXSwgaSwgZGF0YSk7CiAgICAgIGlmIChub2RlSWQgPT0gbnVsbCB8fCAhKG5vZGVJZCArPSAiIikpIHsKICAgICAgICBpZiAocm9vdCkgdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSByb290cyIpOwogICAgICAgIHJvb3QgPSBub2RlOwogICAgICB9IGVsc2UgewogICAgICAgIHBhcmVudCA9IG5vZGVCeUtleVtrZXlQcmVmaXgkMSArIG5vZGVJZF07CiAgICAgICAgaWYgKCFwYXJlbnQpIHRocm93IG5ldyBFcnJvcigibWlzc2luZzogIiArIG5vZGVJZCk7CiAgICAgICAgaWYgKHBhcmVudCA9PT0gYW1iaWd1b3VzKSB0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIiArIG5vZGVJZCk7CiAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbikgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7CiAgICAgICAgZWxzZSBwYXJlbnQuY2hpbGRyZW4gPSBbbm9kZV07CiAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIXJvb3QpIHRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpOwogICAgcm9vdC5wYXJlbnQgPSBwcmVyb290OwogICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS5kZXB0aCA9IG5vZGUucGFyZW50LmRlcHRoICsgMTsgLS1uOyB9KS5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpOwogICAgcm9vdC5wYXJlbnQgPSBudWxsOwogICAgaWYgKG4gPiAwKSB0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7CgogICAgcmV0dXJuIHJvb3Q7CiAgfQoKICBzdHJhdGlmeS5pZCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlkID0gcmVxdWlyZWQoeCksIHN0cmF0aWZ5KSA6IGlkOwogIH07CgogIHN0cmF0aWZ5LnBhcmVudElkID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFyZW50SWQgPSByZXF1aXJlZCh4KSwgc3RyYXRpZnkpIDogcGFyZW50SWQ7CiAgfTsKCiAgcmV0dXJuIHN0cmF0aWZ5Owp9CgpmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbiQxKGEsIGIpIHsKICByZXR1cm4gYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDI7Cn0KCi8vIGZ1bmN0aW9uIHJhZGlhbFNlcGFyYXRpb24oYSwgYikgewovLyAgIHJldHVybiAoYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDIpIC8gYS5kZXB0aDsKLy8gfQoKLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSBsZWZ0IGNvbnRvdXIgb2YgYSBzdWJ0cmVlIChvcgovLyBzdWJmb3Jlc3QpLiBJdCByZXR1cm5zIHRoZSBzdWNjZXNzb3Igb2YgdiBvbiB0aGlzIGNvbnRvdXIuIFRoaXMgc3VjY2Vzc29yIGlzCi8vIGVpdGhlciBnaXZlbiBieSB0aGUgbGVmdG1vc3QgY2hpbGQgb2YgdiBvciBieSB0aGUgdGhyZWFkIG9mIHYuIFRoZSBmdW5jdGlvbgovLyByZXR1cm5zIG51bGwgaWYgYW5kIG9ubHkgaWYgdiBpcyBvbiB0aGUgaGlnaGVzdCBsZXZlbCBvZiBpdHMgc3VidHJlZS4KZnVuY3Rpb24gbmV4dExlZnQodikgewogIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW47CiAgcmV0dXJuIGNoaWxkcmVuID8gY2hpbGRyZW5bMF0gOiB2LnQ7Cn0KCi8vIFRoaXMgZnVuY3Rpb24gd29ya3MgYW5hbG9nb3VzbHkgdG8gbmV4dExlZnQuCmZ1bmN0aW9uIG5leHRSaWdodCh2KSB7CiAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbjsKICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSA6IHYudDsKfQoKLy8gU2hpZnRzIHRoZSBjdXJyZW50IHN1YnRyZWUgcm9vdGVkIGF0IHcrLiBUaGlzIGlzIGRvbmUgYnkgaW5jcmVhc2luZwovLyBwcmVsaW0odyspIGFuZCBtb2QodyspIGJ5IHNoaWZ0LgpmdW5jdGlvbiBtb3ZlU3VidHJlZSh3bSwgd3AsIHNoaWZ0KSB7CiAgdmFyIGNoYW5nZSA9IHNoaWZ0IC8gKHdwLmkgLSB3bS5pKTsKICB3cC5jIC09IGNoYW5nZTsKICB3cC5zICs9IHNoaWZ0OwogIHdtLmMgKz0gY2hhbmdlOwogIHdwLnogKz0gc2hpZnQ7CiAgd3AubSArPSBzaGlmdDsKfQoKLy8gQWxsIG90aGVyIHNoaWZ0cywgYXBwbGllZCB0byB0aGUgc21hbGxlciBzdWJ0cmVlcyBiZXR3ZWVuIHctIGFuZCB3KywgYXJlCi8vIHBlcmZvcm1lZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBwcmVwYXJlIHRoZSBzaGlmdHMsIHdlIGhhdmUgdG8gYWRqdXN0Ci8vIGNoYW5nZSh3KyksIHNoaWZ0KHcrKSwgYW5kIGNoYW5nZSh3LSkuCmZ1bmN0aW9uIGV4ZWN1dGVTaGlmdHModikgewogIHZhciBzaGlmdCA9IDAsCiAgICAgIGNoYW5nZSA9IDAsCiAgICAgIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwKICAgICAgaSA9IGNoaWxkcmVuLmxlbmd0aCwKICAgICAgdzsKICB3aGlsZSAoLS1pID49IDApIHsKICAgIHcgPSBjaGlsZHJlbltpXTsKICAgIHcueiArPSBzaGlmdDsKICAgIHcubSArPSBzaGlmdDsKICAgIHNoaWZ0ICs9IHcucyArIChjaGFuZ2UgKz0gdy5jKTsKICB9Cn0KCi8vIElmIHZpLcOiwoDCmXMgYW5jZXN0b3IgaXMgYSBzaWJsaW5nIG9mIHYsIHJldHVybnMgdmktw6LCgMKZcyBhbmNlc3Rvci4gT3RoZXJ3aXNlLAovLyByZXR1cm5zIHRoZSBzcGVjaWZpZWQgKGRlZmF1bHQpIGFuY2VzdG9yLgpmdW5jdGlvbiBuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3RvcikgewogIHJldHVybiB2aW0uYS5wYXJlbnQgPT09IHYucGFyZW50ID8gdmltLmEgOiBhbmNlc3RvcjsKfQoKZnVuY3Rpb24gVHJlZU5vZGUobm9kZSwgaSkgewogIHRoaXMuXyA9IG5vZGU7CiAgdGhpcy5wYXJlbnQgPSBudWxsOwogIHRoaXMuY2hpbGRyZW4gPSBudWxsOwogIHRoaXMuQSA9IG51bGw7IC8vIGRlZmF1bHQgYW5jZXN0b3IKICB0aGlzLmEgPSB0aGlzOyAvLyBhbmNlc3RvcgogIHRoaXMueiA9IDA7IC8vIHByZWxpbQogIHRoaXMubSA9IDA7IC8vIG1vZAogIHRoaXMuYyA9IDA7IC8vIGNoYW5nZQogIHRoaXMucyA9IDA7IC8vIHNoaWZ0CiAgdGhpcy50ID0gbnVsbDsgLy8gdGhyZWFkCiAgdGhpcy5pID0gaTsgLy8gbnVtYmVyCn0KClRyZWVOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTm9kZS5wcm90b3R5cGUpOwoKZnVuY3Rpb24gdHJlZVJvb3Qocm9vdCkgewogIHZhciB0cmVlID0gbmV3IFRyZWVOb2RlKHJvb3QsIDApLAogICAgICBub2RlLAogICAgICBub2RlcyA9IFt0cmVlXSwKICAgICAgY2hpbGQsCiAgICAgIGNoaWxkcmVuLAogICAgICBpLAogICAgICBuOwoKICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICBpZiAoY2hpbGRyZW4gPSBub2RlLl8uY2hpbGRyZW4pIHsKICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuID0gY2hpbGRyZW4ubGVuZ3RoKTsKICAgICAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgbm9kZXMucHVzaChjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV0gPSBuZXcgVHJlZU5vZGUoY2hpbGRyZW5baV0sIGkpKTsKICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlOwogICAgICB9CiAgICB9CiAgfQoKICAodHJlZS5wYXJlbnQgPSBuZXcgVHJlZU5vZGUobnVsbCwgMCkpLmNoaWxkcmVuID0gW3RyZWVdOwogIHJldHVybiB0cmVlOwp9CgovLyBOb2RlLWxpbmsgdHJlZSBkaWFncmFtIHVzaW5nIHRoZSBSZWluZ29sZC1UaWxmb3JkICJ0aWR5IiBhbGdvcml0aG0KdmFyIHRyZWUgPSBmdW5jdGlvbigpIHsKICB2YXIgc2VwYXJhdGlvbiA9IGRlZmF1bHRTZXBhcmF0aW9uJDEsCiAgICAgIGR4ID0gMSwKICAgICAgZHkgPSAxLAogICAgICBub2RlU2l6ZSA9IG51bGw7CgogIGZ1bmN0aW9uIHRyZWUocm9vdCkgewogICAgdmFyIHQgPSB0cmVlUm9vdChyb290KTsKCiAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQgdXNpbmcgQnVjaGhlaW0gZXQgYWwuw6LCgMKZcyBhbGdvcml0aG0uCiAgICB0LmVhY2hBZnRlcihmaXJzdFdhbGspLCB0LnBhcmVudC5tID0gLXQuejsKICAgIHQuZWFjaEJlZm9yZShzZWNvbmRXYWxrKTsKCiAgICAvLyBJZiBhIGZpeGVkIG5vZGUgc2l6ZSBpcyBzcGVjaWZpZWQsIHNjYWxlIHggYW5kIHkuCiAgICBpZiAobm9kZVNpemUpIHJvb3QuZWFjaEJlZm9yZShzaXplTm9kZSk7CgogICAgLy8gSWYgYSBmaXhlZCB0cmVlIHNpemUgaXMgc3BlY2lmaWVkLCBzY2FsZSB4IGFuZCB5IGJhc2VkIG9uIHRoZSBleHRlbnQuCiAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLgogICAgZWxzZSB7CiAgICAgIHZhciBsZWZ0ID0gcm9vdCwKICAgICAgICAgIHJpZ2h0ID0gcm9vdCwKICAgICAgICAgIGJvdHRvbSA9IHJvb3Q7CiAgICAgIHJvb3QuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7CiAgICAgICAgaWYgKG5vZGUueCA8IGxlZnQueCkgbGVmdCA9IG5vZGU7CiAgICAgICAgaWYgKG5vZGUueCA+IHJpZ2h0LngpIHJpZ2h0ID0gbm9kZTsKICAgICAgICBpZiAobm9kZS5kZXB0aCA+IGJvdHRvbS5kZXB0aCkgYm90dG9tID0gbm9kZTsKICAgICAgfSk7CiAgICAgIHZhciBzID0gbGVmdCA9PT0gcmlnaHQgPyAxIDogc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLAogICAgICAgICAgdHggPSBzIC0gbGVmdC54LAogICAgICAgICAga3ggPSBkeCAvIChyaWdodC54ICsgcyArIHR4KSwKICAgICAgICAgIGt5ID0gZHkgLyAoYm90dG9tLmRlcHRoIHx8IDEpOwogICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgewogICAgICAgIG5vZGUueCA9IChub2RlLnggKyB0eCkgKiBreDsKICAgICAgICBub2RlLnkgPSBub2RlLmRlcHRoICoga3k7CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiByb290OwogIH0KCiAgLy8gQ29tcHV0ZXMgYSBwcmVsaW1pbmFyeSB4LWNvb3JkaW5hdGUgZm9yIHYuIEJlZm9yZSB0aGF0LCBGSVJTVCBXQUxLIGlzCiAgLy8gYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgY2hpbGRyZW4gb2YgdiwgYXMgd2VsbCBhcyB0aGUgZnVuY3Rpb24KICAvLyBBUFBPUlRJT04uIEFmdGVyIHNwYWNpbmcgb3V0IHRoZSBjaGlsZHJlbiBieSBjYWxsaW5nIEVYRUNVVEUgU0hJRlRTLCB0aGUKICAvLyBub2RlIHYgaXMgcGxhY2VkIHRvIHRoZSBtaWRwb2ludCBvZiBpdHMgb3V0ZXJtb3N0IGNoaWxkcmVuLgogIGZ1bmN0aW9uIGZpcnN0V2Fsayh2KSB7CiAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLAogICAgICAgIHNpYmxpbmdzID0gdi5wYXJlbnQuY2hpbGRyZW4sCiAgICAgICAgdyA9IHYuaSA/IHNpYmxpbmdzW3YuaSAtIDFdIDogbnVsbDsKICAgIGlmIChjaGlsZHJlbikgewogICAgICBleGVjdXRlU2hpZnRzKHYpOwogICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjsKICAgICAgaWYgKHcpIHsKICAgICAgICB2LnogPSB3LnogKyBzZXBhcmF0aW9uKHYuXywgdy5fKTsKICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2LnogPSBtaWRwb2ludDsKICAgICAgfQogICAgfSBlbHNlIGlmICh3KSB7CiAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pOwogICAgfQogICAgdi5wYXJlbnQuQSA9IGFwcG9ydGlvbih2LCB3LCB2LnBhcmVudC5BIHx8IHNpYmxpbmdzWzBdKTsKICB9CgogIC8vIENvbXB1dGVzIGFsbCByZWFsIHgtY29vcmRpbmF0ZXMgYnkgc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIHJlY3Vyc2l2ZWx5LgogIGZ1bmN0aW9uIHNlY29uZFdhbGsodikgewogICAgdi5fLnggPSB2LnogKyB2LnBhcmVudC5tOwogICAgdi5tICs9IHYucGFyZW50Lm07CiAgfQoKICAvLyBUaGUgY29yZSBvZiB0aGUgYWxnb3JpdGhtLiBIZXJlLCBhIG5ldyBzdWJ0cmVlIGlzIGNvbWJpbmVkIHdpdGggdGhlCiAgLy8gcHJldmlvdXMgc3VidHJlZXMuIFRocmVhZHMgYXJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGluc2lkZSBhbmQgb3V0c2lkZQogIC8vIGNvbnRvdXJzIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlIHVwIHRvIHRoZSBoaWdoZXN0IGNvbW1vbiBsZXZlbC4gVGhlCiAgLy8gdmVydGljZXMgdXNlZCBmb3IgdGhlIHRyYXZlcnNhbHMgYXJlIHZpKywgdmktLCB2by0sIGFuZCB2byssIHdoZXJlIHRoZQogIC8vIHN1cGVyc2NyaXB0IG8gbWVhbnMgb3V0c2lkZSBhbmQgaSBtZWFucyBpbnNpZGUsIHRoZSBzdWJzY3JpcHQgLSBtZWFucyBsZWZ0CiAgLy8gc3VidHJlZSBhbmQgKyBtZWFucyByaWdodCBzdWJ0cmVlLiBGb3Igc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIGFsb25nIHRoZQogIC8vIGNvbnRvdXIsIHdlIHVzZSByZXNwZWN0aXZlIHZhcmlhYmxlcyBzaSssIHNpLSwgc28tLCBhbmQgc28rLiBXaGVuZXZlciB0d28KICAvLyBub2RlcyBvZiB0aGUgaW5zaWRlIGNvbnRvdXJzIGNvbmZsaWN0LCB3ZSBjb21wdXRlIHRoZSBsZWZ0IG9uZSBvZiB0aGUKICAvLyBncmVhdGVzdCB1bmNvbW1vbiBhbmNlc3RvcnMgdXNpbmcgdGhlIGZ1bmN0aW9uIEFOQ0VTVE9SIGFuZCBjYWxsIE1PVkUKICAvLyBTVUJUUkVFIHRvIHNoaWZ0IHRoZSBzdWJ0cmVlIGFuZCBwcmVwYXJlIHRoZSBzaGlmdHMgb2Ygc21hbGxlciBzdWJ0cmVlcy4KICAvLyBGaW5hbGx5LCB3ZSBhZGQgYSBuZXcgdGhyZWFkIChpZiBuZWNlc3NhcnkpLgogIGZ1bmN0aW9uIGFwcG9ydGlvbih2LCB3LCBhbmNlc3RvcikgewogICAgaWYgKHcpIHsKICAgICAgdmFyIHZpcCA9IHYsCiAgICAgICAgICB2b3AgPSB2LAogICAgICAgICAgdmltID0gdywKICAgICAgICAgIHZvbSA9IHZpcC5wYXJlbnQuY2hpbGRyZW5bMF0sCiAgICAgICAgICBzaXAgPSB2aXAubSwKICAgICAgICAgIHNvcCA9IHZvcC5tLAogICAgICAgICAgc2ltID0gdmltLm0sCiAgICAgICAgICBzb20gPSB2b20ubSwKICAgICAgICAgIHNoaWZ0OwogICAgICB3aGlsZSAodmltID0gbmV4dFJpZ2h0KHZpbSksIHZpcCA9IG5leHRMZWZ0KHZpcCksIHZpbSAmJiB2aXApIHsKICAgICAgICB2b20gPSBuZXh0TGVmdCh2b20pOwogICAgICAgIHZvcCA9IG5leHRSaWdodCh2b3ApOwogICAgICAgIHZvcC5hID0gdjsKICAgICAgICBzaGlmdCA9IHZpbS56ICsgc2ltIC0gdmlwLnogLSBzaXAgKyBzZXBhcmF0aW9uKHZpbS5fLCB2aXAuXyk7CiAgICAgICAgaWYgKHNoaWZ0ID4gMCkgewogICAgICAgICAgbW92ZVN1YnRyZWUobmV4dEFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpLCB2LCBzaGlmdCk7CiAgICAgICAgICBzaXAgKz0gc2hpZnQ7CiAgICAgICAgICBzb3AgKz0gc2hpZnQ7CiAgICAgICAgfQogICAgICAgIHNpbSArPSB2aW0ubTsKICAgICAgICBzaXAgKz0gdmlwLm07CiAgICAgICAgc29tICs9IHZvbS5tOwogICAgICAgIHNvcCArPSB2b3AubTsKICAgICAgfQogICAgICBpZiAodmltICYmICFuZXh0UmlnaHQodm9wKSkgewogICAgICAgIHZvcC50ID0gdmltOwogICAgICAgIHZvcC5tICs9IHNpbSAtIHNvcDsKICAgICAgfQogICAgICBpZiAodmlwICYmICFuZXh0TGVmdCh2b20pKSB7CiAgICAgICAgdm9tLnQgPSB2aXA7CiAgICAgICAgdm9tLm0gKz0gc2lwIC0gc29tOwogICAgICAgIGFuY2VzdG9yID0gdjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGFuY2VzdG9yOwogIH0KCiAgZnVuY3Rpb24gc2l6ZU5vZGUobm9kZSkgewogICAgbm9kZS54ICo9IGR4OwogICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGR5OwogIH0KCiAgdHJlZS5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIHRyZWUpIDogc2VwYXJhdGlvbjsKICB9OwoKICB0cmVlLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IGZhbHNlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IG51bGwgOiBbZHgsIGR5XSk7CiAgfTsKCiAgdHJlZS5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gdHJ1ZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUgPyBbZHgsIGR5XSA6IG51bGwpOwogIH07CgogIHJldHVybiB0cmVlOwp9Cgp2YXIgdHJlZW1hcFNsaWNlID0gZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbiwKICAgICAgbm9kZSwKICAgICAgaSA9IC0xLAogICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICBrID0gcGFyZW50LnZhbHVlICYmICh5MSAtIHkwKSAvIHBhcmVudC52YWx1ZTsKCiAgd2hpbGUgKCsraSA8IG4pIHsKICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDE7CiAgICBub2RlLnkwID0geTAsIG5vZGUueTEgPSB5MCArPSBub2RlLnZhbHVlICogazsKICB9Cn0KCnZhciBwaGkgPSAoMSArIE1hdGguc3FydCg1KSkgLyAyOwoKZnVuY3Rpb24gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogIHZhciByb3dzID0gW10sCiAgICAgIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLAogICAgICByb3csCiAgICAgIG5vZGVWYWx1ZSwKICAgICAgaTAgPSAwLAogICAgICBpMSwKICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgZHgsIGR5LAogICAgICB2YWx1ZSA9IHBhcmVudC52YWx1ZSwKICAgICAgc3VtVmFsdWUsCiAgICAgIG1pblZhbHVlLAogICAgICBtYXhWYWx1ZSwKICAgICAgbmV3UmF0aW8sCiAgICAgIG1pblJhdGlvLAogICAgICBhbHBoYSwKICAgICAgYmV0YTsKCiAgd2hpbGUgKGkwIDwgbikgewogICAgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTA7CiAgICBtaW5WYWx1ZSA9IG1heFZhbHVlID0gc3VtVmFsdWUgPSBub2Rlc1tpMF0udmFsdWU7CiAgICBhbHBoYSA9IE1hdGgubWF4KGR5IC8gZHgsIGR4IC8gZHkpIC8gKHZhbHVlICogcmF0aW8pOwogICAgYmV0YSA9IHN1bVZhbHVlICogc3VtVmFsdWUgKiBhbHBoYTsKICAgIG1pblJhdGlvID0gTWF0aC5tYXgobWF4VmFsdWUgLyBiZXRhLCBiZXRhIC8gbWluVmFsdWUpOwoKICAgIC8vIEtlZXAgYWRkaW5nIG5vZGVzIHdoaWxlIHRoZSBhc3BlY3QgcmF0aW8gbWFpbnRhaW5zIG9yIGltcHJvdmVzLgogICAgZm9yIChpMSA9IGkwICsgMTsgaTEgPCBuOyArK2kxKSB7CiAgICAgIHN1bVZhbHVlICs9IG5vZGVWYWx1ZSA9IG5vZGVzW2kxXS52YWx1ZTsKICAgICAgaWYgKG5vZGVWYWx1ZSA8IG1pblZhbHVlKSBtaW5WYWx1ZSA9IG5vZGVWYWx1ZTsKICAgICAgaWYgKG5vZGVWYWx1ZSA+IG1heFZhbHVlKSBtYXhWYWx1ZSA9IG5vZGVWYWx1ZTsKICAgICAgYmV0YSA9IHN1bVZhbHVlICogc3VtVmFsdWUgKiBhbHBoYTsKICAgICAgbmV3UmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7CiAgICAgIGlmIChuZXdSYXRpbyA+IG1pblJhdGlvKSB7IHN1bVZhbHVlIC09IG5vZGVWYWx1ZTsgYnJlYWs7IH0KICAgICAgbWluUmF0aW8gPSBuZXdSYXRpbzsKICAgIH0KCiAgICAvLyBQb3NpdGlvbiBhbmQgcmVjb3JkIHRoZSByb3cgb3JpZW50YXRpb24uCiAgICByb3dzLnB1c2gocm93ID0ge3ZhbHVlOiBzdW1WYWx1ZSwgZGljZTogZHggPCBkeSwgY2hpbGRyZW46IG5vZGVzLnNsaWNlKGkwLCBpMSl9KTsKICAgIGlmIChyb3cuZGljZSkgdHJlZW1hcERpY2Uocm93LCB4MCwgeTAsIHgxLCB2YWx1ZSA/IHkwICs9IGR5ICogc3VtVmFsdWUgLyB2YWx1ZSA6IHkxKTsKICAgIGVsc2UgdHJlZW1hcFNsaWNlKHJvdywgeDAsIHkwLCB2YWx1ZSA/IHgwICs9IGR4ICogc3VtVmFsdWUgLyB2YWx1ZSA6IHgxLCB5MSk7CiAgICB2YWx1ZSAtPSBzdW1WYWx1ZSwgaTAgPSBpMTsKICB9CgogIHJldHVybiByb3dzOwp9Cgp2YXIgc3F1YXJpZnkgPSAoZnVuY3Rpb24gY3VzdG9tKHJhdGlvKSB7CgogIGZ1bmN0aW9uIHNxdWFyaWZ5KHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICAgIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpOwogIH0KCiAgc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gpID4gMSA/IHggOiAxKTsKICB9OwoKICByZXR1cm4gc3F1YXJpZnk7Cn0pKHBoaSk7Cgp2YXIgaW5kZXgkMSA9IGZ1bmN0aW9uKCkgewogIHZhciB0aWxlID0gc3F1YXJpZnksCiAgICAgIHJvdW5kID0gZmFsc2UsCiAgICAgIGR4ID0gMSwKICAgICAgZHkgPSAxLAogICAgICBwYWRkaW5nU3RhY2sgPSBbMF0sCiAgICAgIHBhZGRpbmdJbm5lciA9IGNvbnN0YW50WmVybywKICAgICAgcGFkZGluZ1RvcCA9IGNvbnN0YW50WmVybywKICAgICAgcGFkZGluZ1JpZ2h0ID0gY29uc3RhbnRaZXJvLAogICAgICBwYWRkaW5nQm90dG9tID0gY29uc3RhbnRaZXJvLAogICAgICBwYWRkaW5nTGVmdCA9IGNvbnN0YW50WmVybzsKCiAgZnVuY3Rpb24gdHJlZW1hcChyb290KSB7CiAgICByb290LngwID0KICAgIHJvb3QueTAgPSAwOwogICAgcm9vdC54MSA9IGR4OwogICAgcm9vdC55MSA9IGR5OwogICAgcm9vdC5lYWNoQmVmb3JlKHBvc2l0aW9uTm9kZSk7CiAgICBwYWRkaW5nU3RhY2sgPSBbMF07CiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpOwogICAgcmV0dXJuIHJvb3Q7CiAgfQoKICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUobm9kZSkgewogICAgdmFyIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aF0sCiAgICAgICAgeDAgPSBub2RlLngwICsgcCwKICAgICAgICB5MCA9IG5vZGUueTAgKyBwLAogICAgICAgIHgxID0gbm9kZS54MSAtIHAsCiAgICAgICAgeTEgPSBub2RlLnkxIC0gcDsKICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjsKICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjsKICAgIG5vZGUueDAgPSB4MDsKICAgIG5vZGUueTAgPSB5MDsKICAgIG5vZGUueDEgPSB4MTsKICAgIG5vZGUueTEgPSB5MTsKICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAgIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aCArIDFdID0gcGFkZGluZ0lubmVyKG5vZGUpIC8gMjsKICAgICAgeDAgKz0gcGFkZGluZ0xlZnQobm9kZSkgLSBwOwogICAgICB5MCArPSBwYWRkaW5nVG9wKG5vZGUpIC0gcDsKICAgICAgeDEgLT0gcGFkZGluZ1JpZ2h0KG5vZGUpIC0gcDsKICAgICAgeTEgLT0gcGFkZGluZ0JvdHRvbShub2RlKSAtIHA7CiAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjsKICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyOwogICAgICB0aWxlKG5vZGUsIHgwLCB5MCwgeDEsIHkxKTsKICAgIH0KICB9CgogIHRyZWVtYXAucm91bmQgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgdHJlZW1hcCkgOiByb3VuZDsKICB9OwoKICB0cmVlbWFwLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlbWFwKSA6IFtkeCwgZHldOwogIH07CgogIHRyZWVtYXAudGlsZSA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpbGUgPSByZXF1aXJlZCh4KSwgdHJlZW1hcCkgOiB0aWxlOwogIH07CgogIHRyZWVtYXAucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nSW5uZXIoeCkucGFkZGluZ091dGVyKHgpIDogdHJlZW1hcC5wYWRkaW5nSW5uZXIoKTsKICB9OwoKICB0cmVlbWFwLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50JDYoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdJbm5lcjsKICB9OwoKICB0cmVlbWFwLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nVG9wKHgpLnBhZGRpbmdSaWdodCh4KS5wYWRkaW5nQm90dG9tKHgpLnBhZGRpbmdMZWZ0KHgpIDogdHJlZW1hcC5wYWRkaW5nVG9wKCk7CiAgfTsKCiAgdHJlZW1hcC5wYWRkaW5nVG9wID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ1RvcCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50JDYoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdUb3A7CiAgfTsKCiAgdHJlZW1hcC5wYWRkaW5nUmlnaHQgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nUmlnaHQgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCQ2KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nUmlnaHQ7CiAgfTsKCiAgdHJlZW1hcC5wYWRkaW5nQm90dG9tID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0JvdHRvbSA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50JDYoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdCb3R0b207CiAgfTsKCiAgdHJlZW1hcC5wYWRkaW5nTGVmdCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdMZWZ0ID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkNigreCksIHRyZWVtYXApIDogcGFkZGluZ0xlZnQ7CiAgfTsKCiAgcmV0dXJuIHRyZWVtYXA7Cn0KCnZhciBiaW5hcnkgPSBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLAogICAgICBpLCBuID0gbm9kZXMubGVuZ3RoLAogICAgICBzdW0sIHN1bXMgPSBuZXcgQXJyYXkobiArIDEpOwoKICBmb3IgKHN1bXNbMF0gPSBzdW0gPSBpID0gMDsgaSA8IG47ICsraSkgewogICAgc3Vtc1tpICsgMV0gPSBzdW0gKz0gbm9kZXNbaV0udmFsdWU7CiAgfQoKICBwYXJ0aXRpb24oMCwgbiwgcGFyZW50LnZhbHVlLCB4MCwgeTAsIHgxLCB5MSk7CgogIGZ1bmN0aW9uIHBhcnRpdGlvbihpLCBqLCB2YWx1ZSwgeDAsIHkwLCB4MSwgeTEpIHsKICAgIGlmIChpID49IGogLSAxKSB7CiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07CiAgICAgIG5vZGUueDAgPSB4MCwgbm9kZS55MCA9IHkwOwogICAgICBub2RlLngxID0geDEsIG5vZGUueTEgPSB5MTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciB2YWx1ZU9mZnNldCA9IHN1bXNbaV0sCiAgICAgICAgdmFsdWVUYXJnZXQgPSAodmFsdWUgLyAyKSArIHZhbHVlT2Zmc2V0LAogICAgICAgIGsgPSBpICsgMSwKICAgICAgICBoaSA9IGogLSAxOwoKICAgIHdoaWxlIChrIDwgaGkpIHsKICAgICAgdmFyIG1pZCA9IGsgKyBoaSA+Pj4gMTsKICAgICAgaWYgKHN1bXNbbWlkXSA8IHZhbHVlVGFyZ2V0KSBrID0gbWlkICsgMTsKICAgICAgZWxzZSBoaSA9IG1pZDsKICAgIH0KCiAgICB2YXIgdmFsdWVMZWZ0ID0gc3Vtc1trXSAtIHZhbHVlT2Zmc2V0LAogICAgICAgIHZhbHVlUmlnaHQgPSB2YWx1ZSAtIHZhbHVlTGVmdDsKCiAgICBpZiAoKHkxIC0geTApID4gKHgxIC0geDApKSB7CiAgICAgIHZhciB5ayA9ICh5MCAqIHZhbHVlUmlnaHQgKyB5MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZTsKICAgICAgcGFydGl0aW9uKGksIGssIHZhbHVlTGVmdCwgeDAsIHkwLCB4MSwgeWspOwogICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeDAsIHlrLCB4MSwgeTEpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHhrID0gKHgwICogdmFsdWVSaWdodCArIHgxICogdmFsdWVMZWZ0KSAvIHZhbHVlOwogICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHhrLCB5MSk7CiAgICAgIHBhcnRpdGlvbihrLCBqLCB2YWx1ZVJpZ2h0LCB4aywgeTAsIHgxLCB5MSk7CiAgICB9CiAgfQp9Cgp2YXIgc2xpY2VEaWNlID0gZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogIChwYXJlbnQuZGVwdGggJiAxID8gdHJlZW1hcFNsaWNlIDogdHJlZW1hcERpY2UpKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpOwp9Cgp2YXIgcmVzcXVhcmlmeSA9IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHsKCiAgZnVuY3Rpb24gcmVzcXVhcmlmeShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICBpZiAoKHJvd3MgPSBwYXJlbnQuX3NxdWFyaWZ5KSAmJiAocm93cy5yYXRpbyA9PT0gcmF0aW8pKSB7CiAgICAgIHZhciByb3dzLAogICAgICAgICAgcm93LAogICAgICAgICAgbm9kZXMsCiAgICAgICAgICBpLAogICAgICAgICAgaiA9IC0xLAogICAgICAgICAgbiwKICAgICAgICAgIG0gPSByb3dzLmxlbmd0aCwKICAgICAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlOwoKICAgICAgd2hpbGUgKCsraiA8IG0pIHsKICAgICAgICByb3cgPSByb3dzW2pdLCBub2RlcyA9IHJvdy5jaGlsZHJlbjsKICAgICAgICBmb3IgKGkgPSByb3cudmFsdWUgPSAwLCBuID0gbm9kZXMubGVuZ3RoOyBpIDwgbjsgKytpKSByb3cudmFsdWUgKz0gbm9kZXNbaV0udmFsdWU7CiAgICAgICAgaWYgKHJvdy5kaWNlKSB0cmVlbWFwRGljZShyb3csIHgwLCB5MCwgeDEsIHkwICs9ICh5MSAtIHkwKSAqIHJvdy52YWx1ZSAvIHZhbHVlKTsKICAgICAgICBlbHNlIHRyZWVtYXBTbGljZShyb3csIHgwLCB5MCwgeDAgKz0gKHgxIC0geDApICogcm93LnZhbHVlIC8gdmFsdWUsIHkxKTsKICAgICAgICB2YWx1ZSAtPSByb3cudmFsdWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHBhcmVudC5fc3F1YXJpZnkgPSByb3dzID0gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSk7CiAgICAgIHJvd3MucmF0aW8gPSByYXRpbzsKICAgIH0KICB9CgogIHJlc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gpID4gMSA/IHggOiAxKTsKICB9OwoKICByZXR1cm4gcmVzcXVhcmlmeTsKfSkocGhpKTsKCnZhciBjZW50ZXIkMSA9IGZ1bmN0aW9uKHgsIHkpIHsKICB2YXIgbm9kZXM7CgogIGlmICh4ID09IG51bGwpIHggPSAwOwogIGlmICh5ID09IG51bGwpIHkgPSAwOwoKICBmdW5jdGlvbiBmb3JjZSgpIHsKICAgIHZhciBpLAogICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgbm9kZSwKICAgICAgICBzeCA9IDAsCiAgICAgICAgc3kgPSAwOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgbm9kZSA9IG5vZGVzW2ldLCBzeCArPSBub2RlLngsIHN5ICs9IG5vZGUueTsKICAgIH0KCiAgICBmb3IgKHN4ID0gc3ggLyBuIC0geCwgc3kgPSBzeSAvIG4gLSB5LCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueCAtPSBzeCwgbm9kZS55IC09IHN5OwogICAgfQogIH0KCiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIG5vZGVzID0gXzsKICB9OwoKICBmb3JjZS54ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9ICtfLCBmb3JjZSkgOiB4OwogIH07CgogIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gK18sIGZvcmNlKSA6IHk7CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9Cgp2YXIgY29uc3RhbnQkNyA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9Cgp2YXIgamlnZ2xlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDFlLTY7Cn0KCmZ1bmN0aW9uIHgkMShkKSB7CiAgcmV0dXJuIGQueCArIGQudng7Cn0KCmZ1bmN0aW9uIHkkMShkKSB7CiAgcmV0dXJuIGQueSArIGQudnk7Cn0KCnZhciBjb2xsaWRlID0gZnVuY3Rpb24ocmFkaXVzKSB7CiAgdmFyIG5vZGVzLAogICAgICByYWRpaSwKICAgICAgc3RyZW5ndGggPSAxLAogICAgICBpdGVyYXRpb25zID0gMTsKCiAgaWYgKHR5cGVvZiByYWRpdXMgIT09ICJmdW5jdGlvbiIpIHJhZGl1cyA9IGNvbnN0YW50JDcocmFkaXVzID09IG51bGwgPyAxIDogK3JhZGl1cyk7CgogIGZ1bmN0aW9uIGZvcmNlKCkgewogICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgdHJlZSwKICAgICAgICBub2RlLAogICAgICAgIHhpLAogICAgICAgIHlpLAogICAgICAgIHJpLAogICAgICAgIHJpMjsKCiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAgICB0cmVlID0gcXVhZHRyZWUobm9kZXMsIHgkMSwgeSQxKS52aXNpdEFmdGVyKHByZXBhcmUpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgIHJpID0gcmFkaWlbaV0sIHJpMiA9IHJpICogcmk7CiAgICAgICAgeGkgPSBub2RlLnggKyBub2RlLnZ4OwogICAgICAgIHlpID0gbm9kZS55ICsgbm9kZS52eTsKICAgICAgICB0cmVlLnZpc2l0KGFwcGx5KTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5KHF1YWQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgIHZhciBkYXRhID0gcXVhZC5kYXRhLCByaiA9IHF1YWQuciwgciA9IHJpICsgcmo7CiAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgaWYgKGRhdGEuaW5kZXggPiBpKSB7CiAgICAgICAgICB2YXIgeCA9IHhpIC0gZGF0YS54IC0gZGF0YS52eCwKICAgICAgICAgICAgICB5ID0geWkgLSBkYXRhLnkgLSBkYXRhLnZ5LAogICAgICAgICAgICAgIGwgPSB4ICogeCArIHkgKiB5OwogICAgICAgICAgaWYgKGwgPCByICogcikgewogICAgICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZSgpLCBsICs9IHggKiB4OwogICAgICAgICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZSgpLCBsICs9IHkgKiB5OwogICAgICAgICAgICBsID0gKHIgLSAobCA9IE1hdGguc3FydChsKSkpIC8gbCAqIHN0cmVuZ3RoOwogICAgICAgICAgICBub2RlLnZ4ICs9ICh4ICo9IGwpICogKHIgPSAocmogKj0gcmopIC8gKHJpMiArIHJqKSk7CiAgICAgICAgICAgIG5vZGUudnkgKz0gKHkgKj0gbCkgKiByOwogICAgICAgICAgICBkYXRhLnZ4IC09IHggKiAociA9IDEgLSByKTsKICAgICAgICAgICAgZGF0YS52eSAtPSB5ICogcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB4MCA+IHhpICsgciB8fCB4MSA8IHhpIC0gciB8fCB5MCA+IHlpICsgciB8fCB5MSA8IHlpIC0gcjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHByZXBhcmUocXVhZCkgewogICAgaWYgKHF1YWQuZGF0YSkgcmV0dXJuIHF1YWQuciA9IHJhZGlpW3F1YWQuZGF0YS5pbmRleF07CiAgICBmb3IgKHZhciBpID0gcXVhZC5yID0gMDsgaSA8IDQ7ICsraSkgewogICAgICBpZiAocXVhZFtpXSAmJiBxdWFkW2ldLnIgPiBxdWFkLnIpIHsKICAgICAgICBxdWFkLnIgPSBxdWFkW2ldLnI7CiAgICAgIH0KICAgIH0KICB9CgogIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7CiAgICB2YXIgaSwgbiA9IChub2RlcyA9IF8pLmxlbmd0aDsgcmFkaWkgPSBuZXcgQXJyYXkobik7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSByYWRpaVtpXSA9ICtyYWRpdXMobm9kZXNbaV0sIGksIG5vZGVzKTsKICB9OwoKICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaXRlcmF0aW9ucyA9ICtfLCBmb3JjZSkgOiBpdGVyYXRpb25zOwogIH07CgogIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSArXywgZm9yY2UpIDogc3RyZW5ndGg7CiAgfTsKCiAgZm9yY2UucmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGZvcmNlKSA6IHJhZGl1czsKICB9OwoKICByZXR1cm4gZm9yY2U7Cn0KCmZ1bmN0aW9uIGluZGV4JDIoZCwgaSkgewogIHJldHVybiBpOwp9Cgp2YXIgbGluayA9IGZ1bmN0aW9uKGxpbmtzKSB7CiAgdmFyIGlkID0gaW5kZXgkMiwKICAgICAgc3RyZW5ndGggPSBkZWZhdWx0U3RyZW5ndGgsCiAgICAgIHN0cmVuZ3RocywKICAgICAgZGlzdGFuY2UgPSBjb25zdGFudCQ3KDMwKSwKICAgICAgZGlzdGFuY2VzLAogICAgICBub2RlcywKICAgICAgY291bnQsCiAgICAgIGJpYXMsCiAgICAgIGl0ZXJhdGlvbnMgPSAxOwoKICBpZiAobGlua3MgPT0gbnVsbCkgbGlua3MgPSBbXTsKCiAgZnVuY3Rpb24gZGVmYXVsdFN0cmVuZ3RoKGxpbmspIHsKICAgIHJldHVybiAxIC8gTWF0aC5taW4oY291bnRbbGluay5zb3VyY2UuaW5kZXhdLCBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0pOwogIH0KCiAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHsKICAgIGZvciAodmFyIGsgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBrIDwgaXRlcmF0aW9uczsgKytrKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsaW5rLCBzb3VyY2UsIHRhcmdldCwgeCwgeSwgbCwgYjsgaSA8IG47ICsraSkgewogICAgICAgIGxpbmsgPSBsaW5rc1tpXSwgc291cmNlID0gbGluay5zb3VyY2UsIHRhcmdldCA9IGxpbmsudGFyZ2V0OwogICAgICAgIHggPSB0YXJnZXQueCArIHRhcmdldC52eCAtIHNvdXJjZS54IC0gc291cmNlLnZ4IHx8IGppZ2dsZSgpOwogICAgICAgIHkgPSB0YXJnZXQueSArIHRhcmdldC52eSAtIHNvdXJjZS55IC0gc291cmNlLnZ5IHx8IGppZ2dsZSgpOwogICAgICAgIGwgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7CiAgICAgICAgbCA9IChsIC0gZGlzdGFuY2VzW2ldKSAvIGwgKiBhbHBoYSAqIHN0cmVuZ3Roc1tpXTsKICAgICAgICB4ICo9IGwsIHkgKj0gbDsKICAgICAgICB0YXJnZXQudnggLT0geCAqIChiID0gYmlhc1tpXSk7CiAgICAgICAgdGFyZ2V0LnZ5IC09IHkgKiBiOwogICAgICAgIHNvdXJjZS52eCArPSB4ICogKGIgPSAxIC0gYik7CiAgICAgICAgc291cmNlLnZ5ICs9IHkgKiBiOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwoKICAgIHZhciBpLAogICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCwKICAgICAgICBub2RlQnlJZCA9IG1hcCQxKG5vZGVzLCBpZCksCiAgICAgICAgbGluazsKCiAgICBmb3IgKGkgPSAwLCBjb3VudCA9IG5ldyBBcnJheShuKTsgaSA8IG47ICsraSkgewogICAgICBjb3VudFtpXSA9IDA7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICBsaW5rID0gbGlua3NbaV0sIGxpbmsuaW5kZXggPSBpOwogICAgICBpZiAodHlwZW9mIGxpbmsuc291cmNlICE9PSAib2JqZWN0IikgbGluay5zb3VyY2UgPSBub2RlQnlJZC5nZXQobGluay5zb3VyY2UpOwogICAgICBpZiAodHlwZW9mIGxpbmsudGFyZ2V0ICE9PSAib2JqZWN0IikgbGluay50YXJnZXQgPSBub2RlQnlJZC5nZXQobGluay50YXJnZXQpOwogICAgICArK2NvdW50W2xpbmsuc291cmNlLmluZGV4XSwgKytjb3VudFtsaW5rLnRhcmdldC5pbmRleF07CiAgICB9CgogICAgZm9yIChpID0gMCwgYmlhcyA9IG5ldyBBcnJheShtKTsgaSA8IG07ICsraSkgewogICAgICBsaW5rID0gbGlua3NbaV0sIGJpYXNbaV0gPSBjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gLyAoY291bnRbbGluay5zb3VyY2UuaW5kZXhdICsgY291bnRbbGluay50YXJnZXQuaW5kZXhdKTsKICAgIH0KCiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobSksIGluaXRpYWxpemVTdHJlbmd0aCgpOwogICAgZGlzdGFuY2VzID0gbmV3IEFycmF5KG0pLCBpbml0aWFsaXplRGlzdGFuY2UoKTsKICB9CgogIGZ1bmN0aW9uIGluaXRpYWxpemVTdHJlbmd0aCgpIHsKICAgIGlmICghbm9kZXMpIHJldHVybjsKCiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICBzdHJlbmd0aHNbaV0gPSArc3RyZW5ndGgobGlua3NbaV0sIGksIGxpbmtzKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluaXRpYWxpemVEaXN0YW5jZSgpIHsKICAgIGlmICghbm9kZXMpIHJldHVybjsKCiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICBkaXN0YW5jZXNbaV0gPSArZGlzdGFuY2UobGlua3NbaV0sIGksIGxpbmtzKTsKICAgIH0KICB9CgogIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7CiAgICBub2RlcyA9IF87CiAgICBpbml0aWFsaXplKCk7CiAgfTsKCiAgZm9yY2UubGlua3MgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsaW5rcyA9IF8sIGluaXRpYWxpemUoKSwgZm9yY2UpIDogbGlua3M7CiAgfTsKCiAgZm9yY2UuaWQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IF8sIGZvcmNlKSA6IGlkOwogIH07CgogIGZvcmNlLml0ZXJhdGlvbnMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpdGVyYXRpb25zID0gK18sIGZvcmNlKSA6IGl0ZXJhdGlvbnM7CiAgfTsKCiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplU3RyZW5ndGgoKSwgZm9yY2UpIDogc3RyZW5ndGg7CiAgfTsKCiAgZm9yY2UuZGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplRGlzdGFuY2UoKSwgZm9yY2UpIDogZGlzdGFuY2U7CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9CgpmdW5jdGlvbiB4JDIoZCkgewogIHJldHVybiBkLng7Cn0KCmZ1bmN0aW9uIHkkMihkKSB7CiAgcmV0dXJuIGQueTsKfQoKdmFyIGluaXRpYWxSYWRpdXMgPSAxMDsKdmFyIGluaXRpYWxBbmdsZSA9IE1hdGguUEkgKiAoMyAtIE1hdGguc3FydCg1KSk7Cgp2YXIgc2ltdWxhdGlvbiA9IGZ1bmN0aW9uKG5vZGVzKSB7CiAgdmFyIHNpbXVsYXRpb24sCiAgICAgIGFscGhhID0gMSwKICAgICAgYWxwaGFNaW4gPSAwLjAwMSwKICAgICAgYWxwaGFEZWNheSA9IDEgLSBNYXRoLnBvdyhhbHBoYU1pbiwgMSAvIDMwMCksCiAgICAgIGFscGhhVGFyZ2V0ID0gMCwKICAgICAgdmVsb2NpdHlEZWNheSA9IDAuNiwKICAgICAgZm9yY2VzID0gbWFwJDEoKSwKICAgICAgc3RlcHBlciA9IHRpbWVyKHN0ZXApLAogICAgICBldmVudCA9IGRpc3BhdGNoKCJ0aWNrIiwgImVuZCIpOwoKICBpZiAobm9kZXMgPT0gbnVsbCkgbm9kZXMgPSBbXTsKCiAgZnVuY3Rpb24gc3RlcCgpIHsKICAgIHRpY2soKTsKICAgIGV2ZW50LmNhbGwoInRpY2siLCBzaW11bGF0aW9uKTsKICAgIGlmIChhbHBoYSA8IGFscGhhTWluKSB7CiAgICAgIHN0ZXBwZXIuc3RvcCgpOwogICAgICBldmVudC5jYWxsKCJlbmQiLCBzaW11bGF0aW9uKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRpY2soKSB7CiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsKCiAgICBhbHBoYSArPSAoYWxwaGFUYXJnZXQgLSBhbHBoYSkgKiBhbHBoYURlY2F5OwoKICAgIGZvcmNlcy5lYWNoKGZ1bmN0aW9uKGZvcmNlKSB7CiAgICAgIGZvcmNlKGFscGhhKTsKICAgIH0pOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICBpZiAobm9kZS5meCA9PSBudWxsKSBub2RlLnggKz0gbm9kZS52eCAqPSB2ZWxvY2l0eURlY2F5OwogICAgICBlbHNlIG5vZGUueCA9IG5vZGUuZngsIG5vZGUudnggPSAwOwogICAgICBpZiAobm9kZS5meSA9PSBudWxsKSBub2RlLnkgKz0gbm9kZS52eSAqPSB2ZWxvY2l0eURlY2F5OwogICAgICBlbHNlIG5vZGUueSA9IG5vZGUuZnksIG5vZGUudnkgPSAwOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCkgewogICAgZm9yICh2YXIgaSA9IDAsIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLmluZGV4ID0gaTsKICAgICAgaWYgKGlzTmFOKG5vZGUueCkgfHwgaXNOYU4obm9kZS55KSkgewogICAgICAgIHZhciByYWRpdXMgPSBpbml0aWFsUmFkaXVzICogTWF0aC5zcXJ0KGkpLCBhbmdsZSA9IGkgKiBpbml0aWFsQW5nbGU7CiAgICAgICAgbm9kZS54ID0gcmFkaXVzICogTWF0aC5jb3MoYW5nbGUpOwogICAgICAgIG5vZGUueSA9IHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKTsKICAgICAgfQogICAgICBpZiAoaXNOYU4obm9kZS52eCkgfHwgaXNOYU4obm9kZS52eSkpIHsKICAgICAgICBub2RlLnZ4ID0gbm9kZS52eSA9IDA7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGluaXRpYWxpemVGb3JjZShmb3JjZSkgewogICAgaWYgKGZvcmNlLmluaXRpYWxpemUpIGZvcmNlLmluaXRpYWxpemUobm9kZXMpOwogICAgcmV0dXJuIGZvcmNlOwogIH0KCiAgaW5pdGlhbGl6ZU5vZGVzKCk7CgogIHJldHVybiBzaW11bGF0aW9uID0gewogICAgdGljazogdGljaywKCiAgICByZXN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHN0ZXBwZXIucmVzdGFydChzdGVwKSwgc2ltdWxhdGlvbjsKICAgIH0sCgogICAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzdGVwcGVyLnN0b3AoKSwgc2ltdWxhdGlvbjsKICAgIH0sCgogICAgbm9kZXM6IGZ1bmN0aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZXMgPSBfLCBpbml0aWFsaXplTm9kZXMoKSwgZm9yY2VzLmVhY2goaW5pdGlhbGl6ZUZvcmNlKSwgc2ltdWxhdGlvbikgOiBub2RlczsKICAgIH0sCgogICAgYWxwaGE6IGZ1bmN0aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGEgPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYTsKICAgIH0sCgogICAgYWxwaGFNaW46IGZ1bmN0aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFNaW4gPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYU1pbjsKICAgIH0sCgogICAgYWxwaGFEZWNheTogZnVuY3Rpb24oXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYURlY2F5ID0gK18sIHNpbXVsYXRpb24pIDogK2FscGhhRGVjYXk7CiAgICB9LAoKICAgIGFscGhhVGFyZ2V0OiBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhVGFyZ2V0ID0gK18sIHNpbXVsYXRpb24pIDogYWxwaGFUYXJnZXQ7CiAgICB9LAoKICAgIHZlbG9jaXR5RGVjYXk6IGZ1bmN0aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmVsb2NpdHlEZWNheSA9IDEgLSBfLCBzaW11bGF0aW9uKSA6IDEgLSB2ZWxvY2l0eURlY2F5OwogICAgfSwKCiAgICBmb3JjZTogZnVuY3Rpb24obmFtZSwgXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoKF8gPT0gbnVsbCA/IGZvcmNlcy5yZW1vdmUobmFtZSkgOiBmb3JjZXMuc2V0KG5hbWUsIGluaXRpYWxpemVGb3JjZShfKSkpLCBzaW11bGF0aW9uKSA6IGZvcmNlcy5nZXQobmFtZSk7CiAgICB9LAoKICAgIGZpbmQ6IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykgewogICAgICB2YXIgaSA9IDAsCiAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgZHgsCiAgICAgICAgICBkeSwKICAgICAgICAgIGQyLAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGNsb3Nlc3Q7CgogICAgICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5OwogICAgICBlbHNlIHJhZGl1cyAqPSByYWRpdXM7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgIGR4ID0geCAtIG5vZGUueDsKICAgICAgICBkeSA9IHkgLSBub2RlLnk7CiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICBpZiAoZDIgPCByYWRpdXMpIGNsb3Nlc3QgPSBub2RlLCByYWRpdXMgPSBkMjsKICAgICAgfQoKICAgICAgcmV0dXJuIGNsb3Nlc3Q7CiAgICB9LAoKICAgIG9uOiBmdW5jdGlvbihuYW1lLCBfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMSA/IChldmVudC5vbihuYW1lLCBfKSwgc2ltdWxhdGlvbikgOiBldmVudC5vbihuYW1lKTsKICAgIH0KICB9Owp9Cgp2YXIgbWFueUJvZHkgPSBmdW5jdGlvbigpIHsKICB2YXIgbm9kZXMsCiAgICAgIG5vZGUsCiAgICAgIGFscGhhLAogICAgICBzdHJlbmd0aCA9IGNvbnN0YW50JDcoLTMwKSwKICAgICAgc3RyZW5ndGhzLAogICAgICBkaXN0YW5jZU1pbjIgPSAxLAogICAgICBkaXN0YW5jZU1heDIgPSBJbmZpbml0eSwKICAgICAgdGhldGEyID0gMC44MTsKCiAgZnVuY3Rpb24gZm9yY2UoXykgewogICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIHRyZWUgPSBxdWFkdHJlZShub2RlcywgeCQyLCB5JDIpLnZpc2l0QWZ0ZXIoYWNjdW11bGF0ZSk7CiAgICBmb3IgKGFscGhhID0gXywgaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgdHJlZS52aXNpdChhcHBseSk7CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwogICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGg7CiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzdHJlbmd0aHNbaV0gPSArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTsKICB9CgogIGZ1bmN0aW9uIGFjY3VtdWxhdGUocXVhZCkgewogICAgdmFyIHN0cmVuZ3RoID0gMCwgcSwgYywgeCQkMSwgeSQkMSwgaTsKCiAgICAvLyBGb3IgaW50ZXJuYWwgbm9kZXMsIGFjY3VtdWxhdGUgZm9yY2VzIGZyb20gY2hpbGQgcXVhZHJhbnRzLgogICAgaWYgKHF1YWQubGVuZ3RoKSB7CiAgICAgIGZvciAoeCQkMSA9IHkkJDEgPSBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgIGlmICgocSA9IHF1YWRbaV0pICYmIChjID0gcS52YWx1ZSkpIHsKICAgICAgICAgIHN0cmVuZ3RoICs9IGMsIHgkJDEgKz0gYyAqIHEueCwgeSQkMSArPSBjICogcS55OwogICAgICAgIH0KICAgICAgfQogICAgICBxdWFkLnggPSB4JCQxIC8gc3RyZW5ndGg7CiAgICAgIHF1YWQueSA9IHkkJDEgLyBzdHJlbmd0aDsKICAgIH0KCiAgICAvLyBGb3IgbGVhZiBub2RlcywgYWNjdW11bGF0ZSBmb3JjZXMgZnJvbSBjb2luY2lkZW50IHF1YWRyYW50cy4KICAgIGVsc2UgewogICAgICBxID0gcXVhZDsKICAgICAgcS54ID0gcS5kYXRhLng7CiAgICAgIHEueSA9IHEuZGF0YS55OwogICAgICBkbyBzdHJlbmd0aCArPSBzdHJlbmd0aHNbcS5kYXRhLmluZGV4XTsKICAgICAgd2hpbGUgKHEgPSBxLm5leHQpOwogICAgfQoKICAgIHF1YWQudmFsdWUgPSBzdHJlbmd0aDsKICB9CgogIGZ1bmN0aW9uIGFwcGx5KHF1YWQsIHgxLCBfLCB4MikgewogICAgaWYgKCFxdWFkLnZhbHVlKSByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgeCQkMSA9IHF1YWQueCAtIG5vZGUueCwKICAgICAgICB5JCQxID0gcXVhZC55IC0gbm9kZS55LAogICAgICAgIHcgPSB4MiAtIHgxLAogICAgICAgIGwgPSB4JCQxICogeCQkMSArIHkkJDEgKiB5JCQxOwoKICAgIC8vIEFwcGx5IHRoZSBCYXJuZXMtSHV0IGFwcHJveGltYXRpb24gaWYgcG9zc2libGUuCiAgICAvLyBMaW1pdCBmb3JjZXMgZm9yIHZlcnkgY2xvc2Ugbm9kZXM7IHJhbmRvbWl6ZSBkaXJlY3Rpb24gaWYgY29pbmNpZGVudC4KICAgIGlmICh3ICogdyAvIHRoZXRhMiA8IGwpIHsKICAgICAgaWYgKGwgPCBkaXN0YW5jZU1heDIpIHsKICAgICAgICBpZiAoeCQkMSA9PT0gMCkgeCQkMSA9IGppZ2dsZSgpLCBsICs9IHgkJDEgKiB4JCQxOwogICAgICAgIGlmICh5JCQxID09PSAwKSB5JCQxID0gamlnZ2xlKCksIGwgKz0geSQkMSAqIHkkJDE7CiAgICAgICAgaWYgKGwgPCBkaXN0YW5jZU1pbjIpIGwgPSBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yICogbCk7CiAgICAgICAgbm9kZS52eCArPSB4JCQxICogcXVhZC52YWx1ZSAqIGFscGhhIC8gbDsKICAgICAgICBub2RlLnZ5ICs9IHkkJDEgKiBxdWFkLnZhbHVlICogYWxwaGEgLyBsOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIE90aGVyd2lzZSwgcHJvY2VzcyBwb2ludHMgZGlyZWN0bHkuCiAgICBlbHNlIGlmIChxdWFkLmxlbmd0aCB8fCBsID49IGRpc3RhbmNlTWF4MikgcmV0dXJuOwoKICAgIC8vIExpbWl0IGZvcmNlcyBmb3IgdmVyeSBjbG9zZSBub2RlczsgcmFuZG9taXplIGRpcmVjdGlvbiBpZiBjb2luY2lkZW50LgogICAgaWYgKHF1YWQuZGF0YSAhPT0gbm9kZSB8fCBxdWFkLm5leHQpIHsKICAgICAgaWYgKHgkJDEgPT09IDApIHgkJDEgPSBqaWdnbGUoKSwgbCArPSB4JCQxICogeCQkMTsKICAgICAgaWYgKHkkJDEgPT09IDApIHkkJDEgPSBqaWdnbGUoKSwgbCArPSB5JCQxICogeSQkMTsKICAgICAgaWYgKGwgPCBkaXN0YW5jZU1pbjIpIGwgPSBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yICogbCk7CiAgICB9CgogICAgZG8gaWYgKHF1YWQuZGF0YSAhPT0gbm9kZSkgewogICAgICB3ID0gc3RyZW5ndGhzW3F1YWQuZGF0YS5pbmRleF0gKiBhbHBoYSAvIGw7CiAgICAgIG5vZGUudnggKz0geCQkMSAqIHc7CiAgICAgIG5vZGUudnkgKz0geSQkMSAqIHc7CiAgICB9IHdoaWxlIChxdWFkID0gcXVhZC5uZXh0KTsKICB9CgogIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7CiAgICBub2RlcyA9IF87CiAgICBpbml0aWFsaXplKCk7CiAgfTsKCiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoOwogIH07CgogIGZvcmNlLmRpc3RhbmNlTWluID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNaW4yID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1pbjIpOwogIH07CgogIGZvcmNlLmRpc3RhbmNlTWF4ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNYXgyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1heDIpOwogIH07CgogIGZvcmNlLnRoZXRhID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhldGEyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydCh0aGV0YTIpOwogIH07CgogIHJldHVybiBmb3JjZTsKfQoKdmFyIHgkMyA9IGZ1bmN0aW9uKHgpIHsKICB2YXIgc3RyZW5ndGggPSBjb25zdGFudCQ3KDAuMSksCiAgICAgIG5vZGVzLAogICAgICBzdHJlbmd0aHMsCiAgICAgIHh6OwoKICBpZiAodHlwZW9mIHggIT09ICJmdW5jdGlvbiIpIHggPSBjb25zdGFudCQ3KHggPT0gbnVsbCA/IDAgOiAreCk7CgogIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUudnggKz0gKHh6W2ldIC0gbm9kZS54KSAqIHN0cmVuZ3Roc1tpXSAqIGFscGhhOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKICAgIGlmICghbm9kZXMpIHJldHVybjsKICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoOwogICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG4pOwogICAgeHogPSBuZXcgQXJyYXkobik7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHN0cmVuZ3Roc1tpXSA9IGlzTmFOKHh6W2ldID0gK3gobm9kZXNbaV0sIGksIG5vZGVzKSkgPyAwIDogK3N0cmVuZ3RoKG5vZGVzW2ldLCBpLCBub2Rlcyk7CiAgICB9CiAgfQoKICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgbm9kZXMgPSBfOwogICAgaW5pdGlhbGl6ZSgpOwogIH07CgogIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDsKICB9OwoKICBmb3JjZS54ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHg7CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9Cgp2YXIgeSQzID0gZnVuY3Rpb24oeSkgewogIHZhciBzdHJlbmd0aCA9IGNvbnN0YW50JDcoMC4xKSwKICAgICAgbm9kZXMsCiAgICAgIHN0cmVuZ3RocywKICAgICAgeXo7CgogIGlmICh0eXBlb2YgeSAhPT0gImZ1bmN0aW9uIikgeSA9IGNvbnN0YW50JDcoeSA9PSBudWxsID8gMCA6ICt5KTsKCiAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS52eSArPSAoeXpbaV0gLSBub2RlLnkpICogc3RyZW5ndGhzW2ldICogYWxwaGE7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwogICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGg7CiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7CiAgICB5eiA9IG5ldyBBcnJheShuKTsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgc3RyZW5ndGhzW2ldID0gaXNOYU4oeXpbaV0gPSAreShub2Rlc1tpXSwgaSwgbm9kZXMpKSA/IDAgOiArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTsKICAgIH0KICB9CgogIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7CiAgICBub2RlcyA9IF87CiAgICBpbml0aWFsaXplKCk7CiAgfTsKCiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoOwogIH07CgogIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogeTsKICB9OwoKICByZXR1cm4gZm9yY2U7Cn0KCmZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oKSB7CiAgZXhwb3J0cy5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfQoKdmFyIG5vZXZlbnQgPSBmdW5jdGlvbigpIHsKICBleHBvcnRzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgZXhwb3J0cy5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfQoKdmFyIGRyYWdEaXNhYmxlID0gZnVuY3Rpb24odmlldykgewogIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCiAgICAgIHNlbGVjdGlvbiQkMSA9IHNlbGVjdCh2aWV3KS5vbigiZHJhZ3N0YXJ0LmRyYWciLCBub2V2ZW50LCB0cnVlKTsKICBpZiAoIm9uc2VsZWN0c3RhcnQiIGluIHJvb3QpIHsKICAgIHNlbGVjdGlvbiQkMS5vbigic2VsZWN0c3RhcnQuZHJhZyIsIG5vZXZlbnQsIHRydWUpOwogIH0gZWxzZSB7CiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7CiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSAibm9uZSI7CiAgfQp9CgpmdW5jdGlvbiB5ZXNkcmFnKHZpZXcsIG5vY2xpY2spIHsKICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICBzZWxlY3Rpb24kJDEgPSBzZWxlY3Qodmlldykub24oImRyYWdzdGFydC5kcmFnIiwgbnVsbCk7CiAgaWYgKG5vY2xpY2spIHsKICAgIHNlbGVjdGlvbiQkMS5vbigiY2xpY2suZHJhZyIsIG5vZXZlbnQsIHRydWUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uJCQxLm9uKCJjbGljay5kcmFnIiwgbnVsbCk7IH0sIDApOwogIH0KICBpZiAoIm9uc2VsZWN0c3RhcnQiIGluIHJvb3QpIHsKICAgIHNlbGVjdGlvbiQkMS5vbigic2VsZWN0c3RhcnQuZHJhZyIsIG51bGwpOwogIH0gZWxzZSB7CiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7CiAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0OwogIH0KfQoKdmFyIGNvbnN0YW50JDggPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rpb24gRHJhZ0V2ZW50KHRhcmdldCwgdHlwZSwgc3ViamVjdCwgaWQsIGFjdGl2ZSwgeCwgeSwgZHgsIGR5LCBkaXNwYXRjaCkgewogIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogIHRoaXMudHlwZSA9IHR5cGU7CiAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDsKICB0aGlzLmlkZW50aWZpZXIgPSBpZDsKICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKICB0aGlzLnggPSB4OwogIHRoaXMueSA9IHk7CiAgdGhpcy5keCA9IGR4OwogIHRoaXMuZHkgPSBkeTsKICB0aGlzLl8gPSBkaXNwYXRjaDsKfQoKRHJhZ0V2ZW50LnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCkgewogIHZhciB2YWx1ZSA9IHRoaXMuXy5vbi5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7CiAgcmV0dXJuIHZhbHVlID09PSB0aGlzLl8gPyB0aGlzIDogdmFsdWU7Cn07CgovLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS4KZnVuY3Rpb24gZGVmYXVsdEZpbHRlcigpIHsKICByZXR1cm4gIWV4cG9ydHMuZXZlbnQuYnV0dG9uOwp9CgpmdW5jdGlvbiBkZWZhdWx0Q29udGFpbmVyKCkgewogIHJldHVybiB0aGlzLnBhcmVudE5vZGU7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRTdWJqZWN0KGQpIHsKICByZXR1cm4gZCA9PSBudWxsID8ge3g6IGV4cG9ydHMuZXZlbnQueCwgeTogZXhwb3J0cy5ldmVudC55fSA6IGQ7Cn0KCnZhciBkcmFnID0gZnVuY3Rpb24oKSB7CiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsCiAgICAgIGNvbnRhaW5lciA9IGRlZmF1bHRDb250YWluZXIsCiAgICAgIHN1YmplY3QgPSBkZWZhdWx0U3ViamVjdCwKICAgICAgZ2VzdHVyZXMgPSB7fSwKICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goInN0YXJ0IiwgImRyYWciLCAiZW5kIiksCiAgICAgIGFjdGl2ZSA9IDAsCiAgICAgIG1vdXNlbW92aW5nLAogICAgICB0b3VjaGVuZGluZzsKCiAgZnVuY3Rpb24gZHJhZyhzZWxlY3Rpb24kJDEpIHsKICAgIHNlbGVjdGlvbiQkMQogICAgICAgIC5vbigibW91c2Vkb3duLmRyYWciLCBtb3VzZWRvd25lZCkKICAgICAgICAub24oInRvdWNoc3RhcnQuZHJhZyIsIHRvdWNoc3RhcnRlZCkKICAgICAgICAub24oInRvdWNobW92ZS5kcmFnIiwgdG91Y2htb3ZlZCkKICAgICAgICAub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIsIHRvdWNoZW5kZWQpCiAgICAgICAgLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCAicmdiYSgwLDAsMCwwKSIpOwogIH0KCiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoKSB7CiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47CiAgICB2YXIgZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KCJtb3VzZSIsIGNvbnRhaW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBtb3VzZSwgdGhpcywgYXJndW1lbnRzKTsKICAgIGlmICghZ2VzdHVyZSkgcmV0dXJuOwogICAgc2VsZWN0KGV4cG9ydHMuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oIm1vdXNldXAuZHJhZyIsIG1vdXNldXBwZWQsIHRydWUpOwogICAgZHJhZ0Rpc2FibGUoZXhwb3J0cy5ldmVudC52aWV3KTsKICAgIG5vcHJvcGFnYXRpb24oKTsKICAgIG1vdXNlbW92aW5nID0gZmFsc2U7CiAgICBnZXN0dXJlKCJzdGFydCIpOwogIH0KCiAgZnVuY3Rpb24gbW91c2Vtb3ZlZCgpIHsKICAgIG5vZXZlbnQoKTsKICAgIG1vdXNlbW92aW5nID0gdHJ1ZTsKICAgIGdlc3R1cmVzLm1vdXNlKCJkcmFnIik7CiAgfQoKICBmdW5jdGlvbiBtb3VzZXVwcGVkKCkgewogICAgc2VsZWN0KGV4cG9ydHMuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIsIG51bGwpOwogICAgeWVzZHJhZyhleHBvcnRzLmV2ZW50LnZpZXcsIG1vdXNlbW92aW5nKTsKICAgIG5vZXZlbnQoKTsKICAgIGdlc3R1cmVzLm1vdXNlKCJlbmQiKTsKICB9CgogIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZCgpIHsKICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgIHZhciB0b3VjaGVzJCQxID0gZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlcywKICAgICAgICBjID0gY29udGFpbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgbiA9IHRvdWNoZXMkJDEubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0b3VjaGVzJCQxW2ldLmlkZW50aWZpZXIsIGMsIHRvdWNoLCB0aGlzLCBhcmd1bWVudHMpKSB7CiAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAgICAgIGdlc3R1cmUoInN0YXJ0Iik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHRvdWNobW92ZWQoKSB7CiAgICB2YXIgdG91Y2hlcyQkMSA9IGV4cG9ydHMuZXZlbnQuY2hhbmdlZFRvdWNoZXMsCiAgICAgICAgbiA9IHRvdWNoZXMkJDEubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzJCQxW2ldLmlkZW50aWZpZXJdKSB7CiAgICAgICAgbm9ldmVudCgpOwogICAgICAgIGdlc3R1cmUoImRyYWciKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gdG91Y2hlbmRlZCgpIHsKICAgIHZhciB0b3VjaGVzJCQxID0gZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlcywKICAgICAgICBuID0gdG91Y2hlcyQkMS5sZW5ndGgsIGksIGdlc3R1cmU7CgogICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpOwogICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCEKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzJCQxW2ldLmlkZW50aWZpZXJdKSB7CiAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAgICAgIGdlc3R1cmUoImVuZCIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBiZWZvcmVzdGFydChpZCwgY29udGFpbmVyLCBwb2ludCwgdGhhdCwgYXJncykgewogICAgdmFyIHAgPSBwb2ludChjb250YWluZXIsIGlkKSwgcywgZHgsIGR5LAogICAgICAgIHN1Ymxpc3RlbmVycyA9IGxpc3RlbmVycy5jb3B5KCk7CgogICAgaWYgKCFjdXN0b21FdmVudChuZXcgRHJhZ0V2ZW50KGRyYWcsICJiZWZvcmVzdGFydCIsIHMsIGlkLCBhY3RpdmUsIHBbMF0sIHBbMV0sIDAsIDAsIHN1Ymxpc3RlbmVycyksIGZ1bmN0aW9uKCkgewogICAgICBpZiAoKGV4cG9ydHMuZXZlbnQuc3ViamVjdCA9IHMgPSBzdWJqZWN0LmFwcGx5KHRoYXQsIGFyZ3MpKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGR4ID0gcy54IC0gcFswXSB8fCAwOwogICAgICBkeSA9IHMueSAtIHBbMV0gfHwgMDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KSkgcmV0dXJuOwoKICAgIHJldHVybiBmdW5jdGlvbiBnZXN0dXJlKHR5cGUpIHsKICAgICAgdmFyIHAwID0gcCwgbjsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAic3RhcnQiOiBnZXN0dXJlc1tpZF0gPSBnZXN0dXJlLCBuID0gYWN0aXZlKys7IGJyZWFrOwogICAgICAgIGNhc2UgImVuZCI6IGRlbGV0ZSBnZXN0dXJlc1tpZF0sIC0tYWN0aXZlOyAvLyBub2JyZWFrCiAgICAgICAgY2FzZSAiZHJhZyI6IHAgPSBwb2ludChjb250YWluZXIsIGlkKSwgbiA9IGFjdGl2ZTsgYnJlYWs7CiAgICAgIH0KICAgICAgY3VzdG9tRXZlbnQobmV3IERyYWdFdmVudChkcmFnLCB0eXBlLCBzLCBpZCwgbiwgcFswXSArIGR4LCBwWzFdICsgZHksIHBbMF0gLSBwMFswXSwgcFsxXSAtIHAwWzFdLCBzdWJsaXN0ZW5lcnMpLCBzdWJsaXN0ZW5lcnMuYXBwbHksIHN1Ymxpc3RlbmVycywgW3R5cGUsIHRoYXQsIGFyZ3NdKTsKICAgIH07CiAgfQoKICBkcmFnLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDgoISFfKSwgZHJhZykgOiBmaWx0ZXI7CiAgfTsKCiAgZHJhZy5jb250YWluZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb250YWluZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ4KF8pLCBkcmFnKSA6IGNvbnRhaW5lcjsKICB9OwoKICBkcmFnLnN1YmplY3QgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdWJqZWN0ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkOChfKSwgZHJhZykgOiBzdWJqZWN0OwogIH07CgogIGRyYWcub24gPSBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IGRyYWcgOiB2YWx1ZTsKICB9OwoKICByZXR1cm4gZHJhZzsKfQoKdmFyIGNvbnN0YW50JDkgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rpb24geCQ0KGQpIHsKICByZXR1cm4gZFswXTsKfQoKZnVuY3Rpb24geSQ0KGQpIHsKICByZXR1cm4gZFsxXTsKfQoKZnVuY3Rpb24gUmVkQmxhY2tUcmVlKCkgewogIHRoaXMuXyA9IG51bGw7IC8vIHJvb3Qgbm9kZQp9CgpmdW5jdGlvbiBSZWRCbGFja05vZGUobm9kZSkgewogIG5vZGUuVSA9IC8vIHBhcmVudCBub2RlCiAgbm9kZS5DID0gLy8gY29sb3IgLSB0cnVlIGZvciByZWQsIGZhbHNlIGZvciBibGFjawogIG5vZGUuTCA9IC8vIGxlZnQgbm9kZQogIG5vZGUuUiA9IC8vIHJpZ2h0IG5vZGUKICBub2RlLlAgPSAvLyBwcmV2aW91cyBub2RlCiAgbm9kZS5OID0gbnVsbDsgLy8gbmV4dCBub2RlCn0KClJlZEJsYWNrVHJlZS5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFJlZEJsYWNrVHJlZSwKCiAgaW5zZXJ0OiBmdW5jdGlvbihhZnRlciwgbm9kZSkgewogICAgdmFyIHBhcmVudCwgZ3JhbmRwYSwgdW5jbGU7CgogICAgaWYgKGFmdGVyKSB7CiAgICAgIG5vZGUuUCA9IGFmdGVyOwogICAgICBub2RlLk4gPSBhZnRlci5OOwogICAgICBpZiAoYWZ0ZXIuTikgYWZ0ZXIuTi5QID0gbm9kZTsKICAgICAgYWZ0ZXIuTiA9IG5vZGU7CiAgICAgIGlmIChhZnRlci5SKSB7CiAgICAgICAgYWZ0ZXIgPSBhZnRlci5SOwogICAgICAgIHdoaWxlIChhZnRlci5MKSBhZnRlciA9IGFmdGVyLkw7CiAgICAgICAgYWZ0ZXIuTCA9IG5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWZ0ZXIuUiA9IG5vZGU7CiAgICAgIH0KICAgICAgcGFyZW50ID0gYWZ0ZXI7CiAgICB9IGVsc2UgaWYgKHRoaXMuXykgewogICAgICBhZnRlciA9IFJlZEJsYWNrRmlyc3QodGhpcy5fKTsKICAgICAgbm9kZS5QID0gbnVsbDsKICAgICAgbm9kZS5OID0gYWZ0ZXI7CiAgICAgIGFmdGVyLlAgPSBhZnRlci5MID0gbm9kZTsKICAgICAgcGFyZW50ID0gYWZ0ZXI7CiAgICB9IGVsc2UgewogICAgICBub2RlLlAgPSBub2RlLk4gPSBudWxsOwogICAgICB0aGlzLl8gPSBub2RlOwogICAgICBwYXJlbnQgPSBudWxsOwogICAgfQogICAgbm9kZS5MID0gbm9kZS5SID0gbnVsbDsKICAgIG5vZGUuVSA9IHBhcmVudDsKICAgIG5vZGUuQyA9IHRydWU7CgogICAgYWZ0ZXIgPSBub2RlOwogICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuQykgewogICAgICBncmFuZHBhID0gcGFyZW50LlU7CiAgICAgIGlmIChwYXJlbnQgPT09IGdyYW5kcGEuTCkgewogICAgICAgIHVuY2xlID0gZ3JhbmRwYS5SOwogICAgICAgIGlmICh1bmNsZSAmJiB1bmNsZS5DKSB7CiAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTsKICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7CiAgICAgICAgICBhZnRlciA9IGdyYW5kcGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LlIpIHsKICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHBhcmVudCk7CiAgICAgICAgICAgIGFmdGVyID0gcGFyZW50OwogICAgICAgICAgICBwYXJlbnQgPSBhZnRlci5VOwogICAgICAgICAgfQogICAgICAgICAgcGFyZW50LkMgPSBmYWxzZTsKICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7CiAgICAgICAgICBSZWRCbGFja1JvdGF0ZVJpZ2h0KHRoaXMsIGdyYW5kcGEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB1bmNsZSA9IGdyYW5kcGEuTDsKICAgICAgICBpZiAodW5jbGUgJiYgdW5jbGUuQykgewogICAgICAgICAgcGFyZW50LkMgPSB1bmNsZS5DID0gZmFsc2U7CiAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlOwogICAgICAgICAgYWZ0ZXIgPSBncmFuZHBhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoYWZ0ZXIgPT09IHBhcmVudC5MKSB7CiAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgYWZ0ZXIgPSBwYXJlbnQ7CiAgICAgICAgICAgIHBhcmVudCA9IGFmdGVyLlU7CiAgICAgICAgICB9CiAgICAgICAgICBwYXJlbnQuQyA9IGZhbHNlOwogICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTsKICAgICAgICAgIFJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBncmFuZHBhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGFyZW50ID0gYWZ0ZXIuVTsKICAgIH0KICAgIHRoaXMuXy5DID0gZmFsc2U7CiAgfSwKCiAgcmVtb3ZlOiBmdW5jdGlvbihub2RlKSB7CiAgICBpZiAobm9kZS5OKSBub2RlLk4uUCA9IG5vZGUuUDsKICAgIGlmIChub2RlLlApIG5vZGUuUC5OID0gbm9kZS5OOwogICAgbm9kZS5OID0gbm9kZS5QID0gbnVsbDsKCiAgICB2YXIgcGFyZW50ID0gbm9kZS5VLAogICAgICAgIHNpYmxpbmcsCiAgICAgICAgbGVmdCA9IG5vZGUuTCwKICAgICAgICByaWdodCA9IG5vZGUuUiwKICAgICAgICBuZXh0LAogICAgICAgIHJlZDsKCiAgICBpZiAoIWxlZnQpIG5leHQgPSByaWdodDsKICAgIGVsc2UgaWYgKCFyaWdodCkgbmV4dCA9IGxlZnQ7CiAgICBlbHNlIG5leHQgPSBSZWRCbGFja0ZpcnN0KHJpZ2h0KTsKCiAgICBpZiAocGFyZW50KSB7CiAgICAgIGlmIChwYXJlbnQuTCA9PT0gbm9kZSkgcGFyZW50LkwgPSBuZXh0OwogICAgICBlbHNlIHBhcmVudC5SID0gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuXyA9IG5leHQ7CiAgICB9CgogICAgaWYgKGxlZnQgJiYgcmlnaHQpIHsKICAgICAgcmVkID0gbmV4dC5DOwogICAgICBuZXh0LkMgPSBub2RlLkM7CiAgICAgIG5leHQuTCA9IGxlZnQ7CiAgICAgIGxlZnQuVSA9IG5leHQ7CiAgICAgIGlmIChuZXh0ICE9PSByaWdodCkgewogICAgICAgIHBhcmVudCA9IG5leHQuVTsKICAgICAgICBuZXh0LlUgPSBub2RlLlU7CiAgICAgICAgbm9kZSA9IG5leHQuUjsKICAgICAgICBwYXJlbnQuTCA9IG5vZGU7CiAgICAgICAgbmV4dC5SID0gcmlnaHQ7CiAgICAgICAgcmlnaHQuVSA9IG5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV4dC5VID0gcGFyZW50OwogICAgICAgIHBhcmVudCA9IG5leHQ7CiAgICAgICAgbm9kZSA9IG5leHQuUjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVkID0gbm9kZS5DOwogICAgICBub2RlID0gbmV4dDsKICAgIH0KCiAgICBpZiAobm9kZSkgbm9kZS5VID0gcGFyZW50OwogICAgaWYgKHJlZCkgcmV0dXJuOwogICAgaWYgKG5vZGUgJiYgbm9kZS5DKSB7IG5vZGUuQyA9IGZhbHNlOyByZXR1cm47IH0KCiAgICBkbyB7CiAgICAgIGlmIChub2RlID09PSB0aGlzLl8pIGJyZWFrOwogICAgICBpZiAobm9kZSA9PT0gcGFyZW50LkwpIHsKICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgaWYgKHNpYmxpbmcuQykgewogICAgICAgICAgc2libGluZy5DID0gZmFsc2U7CiAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7CiAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTsKICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuUjsKICAgICAgICB9CiAgICAgICAgaWYgKChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMpCiAgICAgICAgICAgIHx8IChzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpKSB7CiAgICAgICAgICBpZiAoIXNpYmxpbmcuUiB8fCAhc2libGluZy5SLkMpIHsKICAgICAgICAgICAgc2libGluZy5MLkMgPSBmYWxzZTsKICAgICAgICAgICAgc2libGluZy5DID0gdHJ1ZTsKICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBzaWJsaW5nKTsKICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5SOwogICAgICAgICAgfQogICAgICAgICAgc2libGluZy5DID0gcGFyZW50LkM7CiAgICAgICAgICBwYXJlbnQuQyA9IHNpYmxpbmcuUi5DID0gZmFsc2U7CiAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTsKICAgICAgICAgIG5vZGUgPSB0aGlzLl87CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAgICAgIGlmIChzaWJsaW5nLkMpIHsKICAgICAgICAgIHNpYmxpbmcuQyA9IGZhbHNlOwogICAgICAgICAgcGFyZW50LkMgPSB0cnVlOwogICAgICAgICAgUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBwYXJlbnQpOwogICAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAgICAgIH0KICAgICAgICBpZiAoKHNpYmxpbmcuTCAmJiBzaWJsaW5nLkwuQykKICAgICAgICAgIHx8IChzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpKSB7CiAgICAgICAgICBpZiAoIXNpYmxpbmcuTCB8fCAhc2libGluZy5MLkMpIHsKICAgICAgICAgICAgc2libGluZy5SLkMgPSBmYWxzZTsKICAgICAgICAgICAgc2libGluZy5DID0gdHJ1ZTsKICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHNpYmxpbmcpOwogICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7CiAgICAgICAgICB9CiAgICAgICAgICBzaWJsaW5nLkMgPSBwYXJlbnQuQzsKICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5MLkMgPSBmYWxzZTsKICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTsKICAgICAgICAgIG5vZGUgPSB0aGlzLl87CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2libGluZy5DID0gdHJ1ZTsKICAgICAgbm9kZSA9IHBhcmVudDsKICAgICAgcGFyZW50ID0gcGFyZW50LlU7CiAgICB9IHdoaWxlICghbm9kZS5DKTsKCiAgICBpZiAobm9kZSkgbm9kZS5DID0gZmFsc2U7CiAgfQp9OwoKZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVMZWZ0KHRyZWUsIG5vZGUpIHsKICB2YXIgcCA9IG5vZGUsCiAgICAgIHEgPSBub2RlLlIsCiAgICAgIHBhcmVudCA9IHAuVTsKCiAgaWYgKHBhcmVudCkgewogICAgaWYgKHBhcmVudC5MID09PSBwKSBwYXJlbnQuTCA9IHE7CiAgICBlbHNlIHBhcmVudC5SID0gcTsKICB9IGVsc2UgewogICAgdHJlZS5fID0gcTsKICB9CgogIHEuVSA9IHBhcmVudDsKICBwLlUgPSBxOwogIHAuUiA9IHEuTDsKICBpZiAocC5SKSBwLlIuVSA9IHA7CiAgcS5MID0gcDsKfQoKZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVSaWdodCh0cmVlLCBub2RlKSB7CiAgdmFyIHAgPSBub2RlLAogICAgICBxID0gbm9kZS5MLAogICAgICBwYXJlbnQgPSBwLlU7CgogIGlmIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuTCA9PT0gcCkgcGFyZW50LkwgPSBxOwogICAgZWxzZSBwYXJlbnQuUiA9IHE7CiAgfSBlbHNlIHsKICAgIHRyZWUuXyA9IHE7CiAgfQoKICBxLlUgPSBwYXJlbnQ7CiAgcC5VID0gcTsKICBwLkwgPSBxLlI7CiAgaWYgKHAuTCkgcC5MLlUgPSBwOwogIHEuUiA9IHA7Cn0KCmZ1bmN0aW9uIFJlZEJsYWNrRmlyc3Qobm9kZSkgewogIHdoaWxlIChub2RlLkwpIG5vZGUgPSBub2RlLkw7CiAgcmV0dXJuIG5vZGU7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUVkZ2UobGVmdCwgcmlnaHQsIHYwLCB2MSkgewogIHZhciBlZGdlID0gW251bGwsIG51bGxdLAogICAgICBpbmRleCA9IGVkZ2VzLnB1c2goZWRnZSkgLSAxOwogIGVkZ2UubGVmdCA9IGxlZnQ7CiAgZWRnZS5yaWdodCA9IHJpZ2h0OwogIGlmICh2MCkgc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdodCwgdjApOwogIGlmICh2MSkgc2V0RWRnZUVuZChlZGdlLCByaWdodCwgbGVmdCwgdjEpOwogIGNlbGxzW2xlZnQuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKGluZGV4KTsKICBjZWxsc1tyaWdodC5pbmRleF0uaGFsZmVkZ2VzLnB1c2goaW5kZXgpOwogIHJldHVybiBlZGdlOwp9CgpmdW5jdGlvbiBjcmVhdGVCb3JkZXJFZGdlKGxlZnQsIHYwLCB2MSkgewogIHZhciBlZGdlID0gW3YwLCB2MV07CiAgZWRnZS5sZWZ0ID0gbGVmdDsKICByZXR1cm4gZWRnZTsKfQoKZnVuY3Rpb24gc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdodCwgdmVydGV4KSB7CiAgaWYgKCFlZGdlWzBdICYmICFlZGdlWzFdKSB7CiAgICBlZGdlWzBdID0gdmVydGV4OwogICAgZWRnZS5sZWZ0ID0gbGVmdDsKICAgIGVkZ2UucmlnaHQgPSByaWdodDsKICB9IGVsc2UgaWYgKGVkZ2UubGVmdCA9PT0gcmlnaHQpIHsKICAgIGVkZ2VbMV0gPSB2ZXJ0ZXg7CiAgfSBlbHNlIHsKICAgIGVkZ2VbMF0gPSB2ZXJ0ZXg7CiAgfQp9CgovLyBMaWFuZ8OiwoDCk0JhcnNreSBsaW5lIGNsaXBwaW5nLgpmdW5jdGlvbiBjbGlwRWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewogIHZhciBhID0gZWRnZVswXSwKICAgICAgYiA9IGVkZ2VbMV0sCiAgICAgIGF4ID0gYVswXSwKICAgICAgYXkgPSBhWzFdLAogICAgICBieCA9IGJbMF0sCiAgICAgIGJ5ID0gYlsxXSwKICAgICAgdDAgPSAwLAogICAgICB0MSA9IDEsCiAgICAgIGR4ID0gYnggLSBheCwKICAgICAgZHkgPSBieSAtIGF5LAogICAgICByOwoKICByID0geDAgLSBheDsKICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47CiAgciAvPSBkeDsKICBpZiAoZHggPCAwKSB7CiAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgfSBlbHNlIGlmIChkeCA+IDApIHsKICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgIGlmIChyID4gdDApIHQwID0gcjsKICB9CgogIHIgPSB4MSAtIGF4OwogIGlmICghZHggJiYgciA8IDApIHJldHVybjsKICByIC89IGR4OwogIGlmIChkeCA8IDApIHsKICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgIGlmIChyID4gdDApIHQwID0gcjsKICB9IGVsc2UgaWYgKGR4ID4gMCkgewogICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEgPSByOwogIH0KCiAgciA9IHkwIC0gYXk7CiAgaWYgKCFkeSAmJiByID4gMCkgcmV0dXJuOwogIHIgLz0gZHk7CiAgaWYgKGR5IDwgMCkgewogICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEgPSByOwogIH0gZWxzZSBpZiAoZHkgPiAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgfQoKICByID0geTEgLSBheTsKICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47CiAgciAvPSBkeTsKICBpZiAoZHkgPCAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgfSBlbHNlIGlmIChkeSA+IDApIHsKICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICB9CgogIGlmICghKHQwID4gMCkgJiYgISh0MSA8IDEpKSByZXR1cm4gdHJ1ZTsgLy8gVE9ETyBCZXR0ZXIgY2hlY2s/CgogIGlmICh0MCA+IDApIGVkZ2VbMF0gPSBbYXggKyB0MCAqIGR4LCBheSArIHQwICogZHldOwogIGlmICh0MSA8IDEpIGVkZ2VbMV0gPSBbYXggKyB0MSAqIGR4LCBheSArIHQxICogZHldOwogIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBjb25uZWN0RWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewogIHZhciB2MSA9IGVkZ2VbMV07CiAgaWYgKHYxKSByZXR1cm4gdHJ1ZTsKCiAgdmFyIHYwID0gZWRnZVswXSwKICAgICAgbGVmdCA9IGVkZ2UubGVmdCwKICAgICAgcmlnaHQgPSBlZGdlLnJpZ2h0LAogICAgICBseCA9IGxlZnRbMF0sCiAgICAgIGx5ID0gbGVmdFsxXSwKICAgICAgcnggPSByaWdodFswXSwKICAgICAgcnkgPSByaWdodFsxXSwKICAgICAgZnggPSAobHggKyByeCkgLyAyLAogICAgICBmeSA9IChseSArIHJ5KSAvIDIsCiAgICAgIGZtLAogICAgICBmYjsKCiAgaWYgKHJ5ID09PSBseSkgewogICAgaWYgKGZ4IDwgeDAgfHwgZnggPj0geDEpIHJldHVybjsKICAgIGlmIChseCA+IHJ4KSB7CiAgICAgIGlmICghdjApIHYwID0gW2Z4LCB5MF07CiAgICAgIGVsc2UgaWYgKHYwWzFdID49IHkxKSByZXR1cm47CiAgICAgIHYxID0gW2Z4LCB5MV07CiAgICB9IGVsc2UgewogICAgICBpZiAoIXYwKSB2MCA9IFtmeCwgeTFdOwogICAgICBlbHNlIGlmICh2MFsxXSA8IHkwKSByZXR1cm47CiAgICAgIHYxID0gW2Z4LCB5MF07CiAgICB9CiAgfSBlbHNlIHsKICAgIGZtID0gKGx4IC0gcngpIC8gKHJ5IC0gbHkpOwogICAgZmIgPSBmeSAtIGZtICogZng7CiAgICBpZiAoZm0gPCAtMSB8fCBmbSA+IDEpIHsKICAgICAgaWYgKGx4ID4gcngpIHsKICAgICAgICBpZiAoIXYwKSB2MCA9IFsoeTAgLSBmYikgLyBmbSwgeTBdOwogICAgICAgIGVsc2UgaWYgKHYwWzFdID49IHkxKSByZXR1cm47CiAgICAgICAgdjEgPSBbKHkxIC0gZmIpIC8gZm0sIHkxXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXYwKSB2MCA9IFsoeTEgLSBmYikgLyBmbSwgeTFdOwogICAgICAgIGVsc2UgaWYgKHYwWzFdIDwgeTApIHJldHVybjsKICAgICAgICB2MSA9IFsoeTAgLSBmYikgLyBmbSwgeTBdOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobHkgPCByeSkgewogICAgICAgIGlmICghdjApIHYwID0gW3gwLCBmbSAqIHgwICsgZmJdOwogICAgICAgIGVsc2UgaWYgKHYwWzBdID49IHgxKSByZXR1cm47CiAgICAgICAgdjEgPSBbeDEsIGZtICogeDEgKyBmYl07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCF2MCkgdjAgPSBbeDEsIGZtICogeDEgKyBmYl07CiAgICAgICAgZWxzZSBpZiAodjBbMF0gPCB4MCkgcmV0dXJuOwogICAgICAgIHYxID0gW3gwLCBmbSAqIHgwICsgZmJdOwogICAgICB9CiAgICB9CiAgfQoKICBlZGdlWzBdID0gdjA7CiAgZWRnZVsxXSA9IHYxOwogIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBjbGlwRWRnZXMoeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgaSA9IGVkZ2VzLmxlbmd0aCwKICAgICAgZWRnZTsKCiAgd2hpbGUgKGktLSkgewogICAgaWYgKCFjb25uZWN0RWRnZShlZGdlID0gZWRnZXNbaV0sIHgwLCB5MCwgeDEsIHkxKQogICAgICAgIHx8ICFjbGlwRWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkKICAgICAgICB8fCAhKE1hdGguYWJzKGVkZ2VbMF1bMF0gLSBlZGdlWzFdWzBdKSA+IGVwc2lsb24kMwogICAgICAgICAgICB8fCBNYXRoLmFicyhlZGdlWzBdWzFdIC0gZWRnZVsxXVsxXSkgPiBlcHNpbG9uJDMpKSB7CiAgICAgIGRlbGV0ZSBlZGdlc1tpXTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNlbGwoc2l0ZSkgewogIHJldHVybiBjZWxsc1tzaXRlLmluZGV4XSA9IHsKICAgIHNpdGU6IHNpdGUsCiAgICBoYWxmZWRnZXM6IFtdCiAgfTsKfQoKZnVuY3Rpb24gY2VsbEhhbGZlZGdlQW5nbGUoY2VsbCwgZWRnZSkgewogIHZhciBzaXRlID0gY2VsbC5zaXRlLAogICAgICB2YSA9IGVkZ2UubGVmdCwKICAgICAgdmIgPSBlZGdlLnJpZ2h0OwogIGlmIChzaXRlID09PSB2YikgdmIgPSB2YSwgdmEgPSBzaXRlOwogIGlmICh2YikgcmV0dXJuIE1hdGguYXRhbjIodmJbMV0gLSB2YVsxXSwgdmJbMF0gLSB2YVswXSk7CiAgaWYgKHNpdGUgPT09IHZhKSB2YSA9IGVkZ2VbMV0sIHZiID0gZWRnZVswXTsKICBlbHNlIHZhID0gZWRnZVswXSwgdmIgPSBlZGdlWzFdOwogIHJldHVybiBNYXRoLmF0YW4yKHZhWzBdIC0gdmJbMF0sIHZiWzFdIC0gdmFbMV0pOwp9CgpmdW5jdGlvbiBjZWxsSGFsZmVkZ2VTdGFydChjZWxsLCBlZGdlKSB7CiAgcmV0dXJuIGVkZ2VbKyhlZGdlLmxlZnQgIT09IGNlbGwuc2l0ZSldOwp9CgpmdW5jdGlvbiBjZWxsSGFsZmVkZ2VFbmQoY2VsbCwgZWRnZSkgewogIHJldHVybiBlZGdlWysoZWRnZS5sZWZ0ID09PSBjZWxsLnNpdGUpXTsKfQoKZnVuY3Rpb24gc29ydENlbGxIYWxmZWRnZXMoKSB7CiAgZm9yICh2YXIgaSA9IDAsIG4gPSBjZWxscy5sZW5ndGgsIGNlbGwsIGhhbGZlZGdlcywgaiwgbTsgaSA8IG47ICsraSkgewogICAgaWYgKChjZWxsID0gY2VsbHNbaV0pICYmIChtID0gKGhhbGZlZGdlcyA9IGNlbGwuaGFsZmVkZ2VzKS5sZW5ndGgpKSB7CiAgICAgIHZhciBpbmRleCA9IG5ldyBBcnJheShtKSwKICAgICAgICAgIGFycmF5ID0gbmV3IEFycmF5KG0pOwogICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSBpbmRleFtqXSA9IGosIGFycmF5W2pdID0gY2VsbEhhbGZlZGdlQW5nbGUoY2VsbCwgZWRnZXNbaGFsZmVkZ2VzW2pdXSk7CiAgICAgIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gYXJyYXlbal0gLSBhcnJheVtpXTsgfSk7CiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIGFycmF5W2pdID0gaGFsZmVkZ2VzW2luZGV4W2pdXTsKICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgaGFsZmVkZ2VzW2pdID0gYXJyYXlbal07CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbGlwQ2VsbHMoeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgbkNlbGxzID0gY2VsbHMubGVuZ3RoLAogICAgICBpQ2VsbCwKICAgICAgY2VsbCwKICAgICAgc2l0ZSwKICAgICAgaUhhbGZlZGdlLAogICAgICBoYWxmZWRnZXMsCiAgICAgIG5IYWxmZWRnZXMsCiAgICAgIHN0YXJ0LAogICAgICBzdGFydFgsCiAgICAgIHN0YXJ0WSwKICAgICAgZW5kLAogICAgICBlbmRYLAogICAgICBlbmRZLAogICAgICBjb3ZlciA9IHRydWU7CgogIGZvciAoaUNlbGwgPSAwOyBpQ2VsbCA8IG5DZWxsczsgKytpQ2VsbCkgewogICAgaWYgKGNlbGwgPSBjZWxsc1tpQ2VsbF0pIHsKICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRnZXM7CiAgICAgIGlIYWxmZWRnZSA9IGhhbGZlZGdlcy5sZW5ndGg7CgogICAgICAvLyBSZW1vdmUgYW55IGRhbmdsaW5nIGNsaXBwZWQgZWRnZXMuCiAgICAgIHdoaWxlIChpSGFsZmVkZ2UtLSkgewogICAgICAgIGlmICghZWRnZXNbaGFsZmVkZ2VzW2lIYWxmZWRnZV1dKSB7CiAgICAgICAgICBoYWxmZWRnZXMuc3BsaWNlKGlIYWxmZWRnZSwgMSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJbnNlcnQgYW55IGJvcmRlciBlZGdlcyBhcyBuZWNlc3NhcnkuCiAgICAgIGlIYWxmZWRnZSA9IDAsIG5IYWxmZWRnZXMgPSBoYWxmZWRnZXMubGVuZ3RoOwogICAgICB3aGlsZSAoaUhhbGZlZGdlIDwgbkhhbGZlZGdlcykgewogICAgICAgIGVuZCA9IGNlbGxIYWxmZWRnZUVuZChjZWxsLCBlZGdlc1toYWxmZWRnZXNbaUhhbGZlZGdlXV0pLCBlbmRYID0gZW5kWzBdLCBlbmRZID0gZW5kWzFdOwogICAgICAgIHN0YXJ0ID0gY2VsbEhhbGZlZGdlU3RhcnQoY2VsbCwgZWRnZXNbaGFsZmVkZ2VzWysraUhhbGZlZGdlICUgbkhhbGZlZGdlc11dKSwgc3RhcnRYID0gc3RhcnRbMF0sIHN0YXJ0WSA9IHN0YXJ0WzFdOwogICAgICAgIGlmIChNYXRoLmFicyhlbmRYIC0gc3RhcnRYKSA+IGVwc2lsb24kMyB8fCBNYXRoLmFicyhlbmRZIC0gc3RhcnRZKSA+IGVwc2lsb24kMykgewogICAgICAgICAgaGFsZmVkZ2VzLnNwbGljZShpSGFsZmVkZ2UsIDAsIGVkZ2VzLnB1c2goY3JlYXRlQm9yZGVyRWRnZShzaXRlLCBlbmQsCiAgICAgICAgICAgICAgTWF0aC5hYnMoZW5kWCAtIHgwKSA8IGVwc2lsb24kMyAmJiB5MSAtIGVuZFkgPiBlcHNpbG9uJDMgPyBbeDAsIE1hdGguYWJzKHN0YXJ0WCAtIHgwKSA8IGVwc2lsb24kMyA/IHN0YXJ0WSA6IHkxXQogICAgICAgICAgICAgIDogTWF0aC5hYnMoZW5kWSAtIHkxKSA8IGVwc2lsb24kMyAmJiB4MSAtIGVuZFggPiBlcHNpbG9uJDMgPyBbTWF0aC5hYnMoc3RhcnRZIC0geTEpIDwgZXBzaWxvbiQzID8gc3RhcnRYIDogeDEsIHkxXQogICAgICAgICAgICAgIDogTWF0aC5hYnMoZW5kWCAtIHgxKSA8IGVwc2lsb24kMyAmJiBlbmRZIC0geTAgPiBlcHNpbG9uJDMgPyBbeDEsIE1hdGguYWJzKHN0YXJ0WCAtIHgxKSA8IGVwc2lsb24kMyA/IHN0YXJ0WSA6IHkwXQogICAgICAgICAgICAgIDogTWF0aC5hYnMoZW5kWSAtIHkwKSA8IGVwc2lsb24kMyAmJiBlbmRYIC0geDAgPiBlcHNpbG9uJDMgPyBbTWF0aC5hYnMoc3RhcnRZIC0geTApIDwgZXBzaWxvbiQzID8gc3RhcnRYIDogeDAsIHkwXQogICAgICAgICAgICAgIDogbnVsbCkpIC0gMSk7CiAgICAgICAgICArK25IYWxmZWRnZXM7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAobkhhbGZlZGdlcykgY292ZXIgPSBmYWxzZTsKICAgIH0KICB9CgogIC8vIElmIHRoZXJlIHdlcmVuw6LCgMKZdCBhbnkgZWRnZXMsIGhhdmUgdGhlIGNsb3Nlc3Qgc2l0ZSBjb3ZlciB0aGUgZXh0ZW50LgogIC8vIEl0IGRvZXNuw6LCgMKZdCBtYXR0ZXIgd2hpY2ggY29ybmVyIG9mIHRoZSBleHRlbnQgd2UgbWVhc3VyZSEKICBpZiAoY292ZXIpIHsKICAgIHZhciBkeCwgZHksIGQyLCBkYyA9IEluZmluaXR5OwoKICAgIGZvciAoaUNlbGwgPSAwLCBjb3ZlciA9IG51bGw7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7CiAgICAgIGlmIChjZWxsID0gY2VsbHNbaUNlbGxdKSB7CiAgICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgICBkeCA9IHNpdGVbMF0gLSB4MDsKICAgICAgICBkeSA9IHNpdGVbMV0gLSB5MDsKICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgICAgIGlmIChkMiA8IGRjKSBkYyA9IGQyLCBjb3ZlciA9IGNlbGw7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoY292ZXIpIHsKICAgICAgdmFyIHYwMCA9IFt4MCwgeTBdLCB2MDEgPSBbeDAsIHkxXSwgdjExID0gW3gxLCB5MV0sIHYxMCA9IFt4MSwgeTBdOwogICAgICBjb3Zlci5oYWxmZWRnZXMucHVzaCgKICAgICAgICBlZGdlcy5wdXNoKGNyZWF0ZUJvcmRlckVkZ2Uoc2l0ZSA9IGNvdmVyLnNpdGUsIHYwMCwgdjAxKSkgLSAxLAogICAgICAgIGVkZ2VzLnB1c2goY3JlYXRlQm9yZGVyRWRnZShzaXRlLCB2MDEsIHYxMSkpIC0gMSwKICAgICAgICBlZGdlcy5wdXNoKGNyZWF0ZUJvcmRlckVkZ2Uoc2l0ZSwgdjExLCB2MTApKSAtIDEsCiAgICAgICAgZWRnZXMucHVzaChjcmVhdGVCb3JkZXJFZGdlKHNpdGUsIHYxMCwgdjAwKSkgLSAxCiAgICAgICk7CiAgICB9CiAgfQoKICAvLyBMYXN0bHkgZGVsZXRlIGFueSBjZWxscyB3aXRoIG5vIGVkZ2VzOyB0aGVzZSB3ZXJlIGVudGlyZWx5IGNsaXBwZWQuCiAgZm9yIChpQ2VsbCA9IDA7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7CiAgICBpZiAoY2VsbCA9IGNlbGxzW2lDZWxsXSkgewogICAgICBpZiAoIWNlbGwuaGFsZmVkZ2VzLmxlbmd0aCkgewogICAgICAgIGRlbGV0ZSBjZWxsc1tpQ2VsbF07CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBjaXJjbGVQb29sID0gW107Cgp2YXIgZmlyc3RDaXJjbGU7CgpmdW5jdGlvbiBDaXJjbGUoKSB7CiAgUmVkQmxhY2tOb2RlKHRoaXMpOwogIHRoaXMueCA9CiAgdGhpcy55ID0KICB0aGlzLmFyYyA9CiAgdGhpcy5zaXRlID0KICB0aGlzLmN5ID0gbnVsbDsKfQoKZnVuY3Rpb24gYXR0YWNoQ2lyY2xlKGFyYykgewogIHZhciBsQXJjID0gYXJjLlAsCiAgICAgIHJBcmMgPSBhcmMuTjsKCiAgaWYgKCFsQXJjIHx8ICFyQXJjKSByZXR1cm47CgogIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwKICAgICAgY1NpdGUgPSBhcmMuc2l0ZSwKICAgICAgclNpdGUgPSByQXJjLnNpdGU7CgogIGlmIChsU2l0ZSA9PT0gclNpdGUpIHJldHVybjsKCiAgdmFyIGJ4ID0gY1NpdGVbMF0sCiAgICAgIGJ5ID0gY1NpdGVbMV0sCiAgICAgIGF4ID0gbFNpdGVbMF0gLSBieCwKICAgICAgYXkgPSBsU2l0ZVsxXSAtIGJ5LAogICAgICBjeCA9IHJTaXRlWzBdIC0gYngsCiAgICAgIGN5ID0gclNpdGVbMV0gLSBieTsKCiAgdmFyIGQgPSAyICogKGF4ICogY3kgLSBheSAqIGN4KTsKICBpZiAoZCA+PSAtZXBzaWxvbjIkMSkgcmV0dXJuOwoKICB2YXIgaGEgPSBheCAqIGF4ICsgYXkgKiBheSwKICAgICAgaGMgPSBjeCAqIGN4ICsgY3kgKiBjeSwKICAgICAgeCA9IChjeSAqIGhhIC0gYXkgKiBoYykgLyBkLAogICAgICB5ID0gKGF4ICogaGMgLSBjeCAqIGhhKSAvIGQ7CgogIHZhciBjaXJjbGUgPSBjaXJjbGVQb29sLnBvcCgpIHx8IG5ldyBDaXJjbGU7CiAgY2lyY2xlLmFyYyA9IGFyYzsKICBjaXJjbGUuc2l0ZSA9IGNTaXRlOwogIGNpcmNsZS54ID0geCArIGJ4OwogIGNpcmNsZS55ID0gKGNpcmNsZS5jeSA9IHkgKyBieSkgKyBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7IC8vIHkgYm90dG9tCgogIGFyYy5jaXJjbGUgPSBjaXJjbGU7CgogIHZhciBiZWZvcmUgPSBudWxsLAogICAgICBub2RlID0gY2lyY2xlcy5fOwoKICB3aGlsZSAobm9kZSkgewogICAgaWYgKGNpcmNsZS55IDwgbm9kZS55IHx8IChjaXJjbGUueSA9PT0gbm9kZS55ICYmIGNpcmNsZS54IDw9IG5vZGUueCkpIHsKICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDsKICAgICAgZWxzZSB7IGJlZm9yZSA9IG5vZGUuUDsgYnJlYWs7IH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChub2RlLlIpIG5vZGUgPSBub2RlLlI7CiAgICAgIGVsc2UgeyBiZWZvcmUgPSBub2RlOyBicmVhazsgfQogICAgfQogIH0KCiAgY2lyY2xlcy5pbnNlcnQoYmVmb3JlLCBjaXJjbGUpOwogIGlmICghYmVmb3JlKSBmaXJzdENpcmNsZSA9IGNpcmNsZTsKfQoKZnVuY3Rpb24gZGV0YWNoQ2lyY2xlKGFyYykgewogIHZhciBjaXJjbGUgPSBhcmMuY2lyY2xlOwogIGlmIChjaXJjbGUpIHsKICAgIGlmICghY2lyY2xlLlApIGZpcnN0Q2lyY2xlID0gY2lyY2xlLk47CiAgICBjaXJjbGVzLnJlbW92ZShjaXJjbGUpOwogICAgY2lyY2xlUG9vbC5wdXNoKGNpcmNsZSk7CiAgICBSZWRCbGFja05vZGUoY2lyY2xlKTsKICAgIGFyYy5jaXJjbGUgPSBudWxsOwogIH0KfQoKdmFyIGJlYWNoUG9vbCA9IFtdOwoKZnVuY3Rpb24gQmVhY2goKSB7CiAgUmVkQmxhY2tOb2RlKHRoaXMpOwogIHRoaXMuZWRnZSA9CiAgdGhpcy5zaXRlID0KICB0aGlzLmNpcmNsZSA9IG51bGw7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUJlYWNoKHNpdGUpIHsKICB2YXIgYmVhY2ggPSBiZWFjaFBvb2wucG9wKCkgfHwgbmV3IEJlYWNoOwogIGJlYWNoLnNpdGUgPSBzaXRlOwogIHJldHVybiBiZWFjaDsKfQoKZnVuY3Rpb24gZGV0YWNoQmVhY2goYmVhY2gpIHsKICBkZXRhY2hDaXJjbGUoYmVhY2gpOwogIGJlYWNoZXMucmVtb3ZlKGJlYWNoKTsKICBiZWFjaFBvb2wucHVzaChiZWFjaCk7CiAgUmVkQmxhY2tOb2RlKGJlYWNoKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQmVhY2goYmVhY2gpIHsKICB2YXIgY2lyY2xlID0gYmVhY2guY2lyY2xlLAogICAgICB4ID0gY2lyY2xlLngsCiAgICAgIHkgPSBjaXJjbGUuY3ksCiAgICAgIHZlcnRleCA9IFt4LCB5XSwKICAgICAgcHJldmlvdXMgPSBiZWFjaC5QLAogICAgICBuZXh0ID0gYmVhY2guTiwKICAgICAgZGlzYXBwZWFyaW5nID0gW2JlYWNoXTsKCiAgZGV0YWNoQmVhY2goYmVhY2gpOwoKICB2YXIgbEFyYyA9IHByZXZpb3VzOwogIHdoaWxlIChsQXJjLmNpcmNsZQogICAgICAmJiBNYXRoLmFicyh4IC0gbEFyYy5jaXJjbGUueCkgPCBlcHNpbG9uJDMKICAgICAgJiYgTWF0aC5hYnMoeSAtIGxBcmMuY2lyY2xlLmN5KSA8IGVwc2lsb24kMykgewogICAgcHJldmlvdXMgPSBsQXJjLlA7CiAgICBkaXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTsKICAgIGRldGFjaEJlYWNoKGxBcmMpOwogICAgbEFyYyA9IHByZXZpb3VzOwogIH0KCiAgZGlzYXBwZWFyaW5nLnVuc2hpZnQobEFyYyk7CiAgZGV0YWNoQ2lyY2xlKGxBcmMpOwoKICB2YXIgckFyYyA9IG5leHQ7CiAgd2hpbGUgKHJBcmMuY2lyY2xlCiAgICAgICYmIE1hdGguYWJzKHggLSByQXJjLmNpcmNsZS54KSA8IGVwc2lsb24kMwogICAgICAmJiBNYXRoLmFicyh5IC0gckFyYy5jaXJjbGUuY3kpIDwgZXBzaWxvbiQzKSB7CiAgICBuZXh0ID0gckFyYy5OOwogICAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7CiAgICBkZXRhY2hCZWFjaChyQXJjKTsKICAgIHJBcmMgPSBuZXh0OwogIH0KCiAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7CiAgZGV0YWNoQ2lyY2xlKHJBcmMpOwoKICB2YXIgbkFyY3MgPSBkaXNhcHBlYXJpbmcubGVuZ3RoLAogICAgICBpQXJjOwogIGZvciAoaUFyYyA9IDE7IGlBcmMgPCBuQXJjczsgKytpQXJjKSB7CiAgICByQXJjID0gZGlzYXBwZWFyaW5nW2lBcmNdOwogICAgbEFyYyA9IGRpc2FwcGVhcmluZ1tpQXJjIC0gMV07CiAgICBzZXRFZGdlRW5kKHJBcmMuZWRnZSwgbEFyYy5zaXRlLCByQXJjLnNpdGUsIHZlcnRleCk7CiAgfQoKICBsQXJjID0gZGlzYXBwZWFyaW5nWzBdOwogIHJBcmMgPSBkaXNhcHBlYXJpbmdbbkFyY3MgLSAxXTsKICByQXJjLmVkZ2UgPSBjcmVhdGVFZGdlKGxBcmMuc2l0ZSwgckFyYy5zaXRlLCBudWxsLCB2ZXJ0ZXgpOwoKICBhdHRhY2hDaXJjbGUobEFyYyk7CiAgYXR0YWNoQ2lyY2xlKHJBcmMpOwp9CgpmdW5jdGlvbiBhZGRCZWFjaChzaXRlKSB7CiAgdmFyIHggPSBzaXRlWzBdLAogICAgICBkaXJlY3RyaXggPSBzaXRlWzFdLAogICAgICBsQXJjLAogICAgICByQXJjLAogICAgICBkeGwsCiAgICAgIGR4ciwKICAgICAgbm9kZSA9IGJlYWNoZXMuXzsKCiAgd2hpbGUgKG5vZGUpIHsKICAgIGR4bCA9IGxlZnRCcmVha1BvaW50KG5vZGUsIGRpcmVjdHJpeCkgLSB4OwogICAgaWYgKGR4bCA+IGVwc2lsb24kMykgbm9kZSA9IG5vZGUuTDsgZWxzZSB7CiAgICAgIGR4ciA9IHggLSByaWdodEJyZWFrUG9pbnQobm9kZSwgZGlyZWN0cml4KTsKICAgICAgaWYgKGR4ciA+IGVwc2lsb24kMykgewogICAgICAgIGlmICghbm9kZS5SKSB7CiAgICAgICAgICBsQXJjID0gbm9kZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBub2RlID0gbm9kZS5SOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChkeGwgPiAtZXBzaWxvbiQzKSB7CiAgICAgICAgICBsQXJjID0gbm9kZS5QOwogICAgICAgICAgckFyYyA9IG5vZGU7CiAgICAgICAgfSBlbHNlIGlmIChkeHIgPiAtZXBzaWxvbiQzKSB7CiAgICAgICAgICBsQXJjID0gbm9kZTsKICAgICAgICAgIHJBcmMgPSBub2RlLk47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxBcmMgPSByQXJjID0gbm9kZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIGNyZWF0ZUNlbGwoc2l0ZSk7CiAgdmFyIG5ld0FyYyA9IGNyZWF0ZUJlYWNoKHNpdGUpOwogIGJlYWNoZXMuaW5zZXJ0KGxBcmMsIG5ld0FyYyk7CgogIGlmICghbEFyYyAmJiAhckFyYykgcmV0dXJuOwoKICBpZiAobEFyYyA9PT0gckFyYykgewogICAgZGV0YWNoQ2lyY2xlKGxBcmMpOwogICAgckFyYyA9IGNyZWF0ZUJlYWNoKGxBcmMuc2l0ZSk7CiAgICBiZWFjaGVzLmluc2VydChuZXdBcmMsIHJBcmMpOwogICAgbmV3QXJjLmVkZ2UgPSByQXJjLmVkZ2UgPSBjcmVhdGVFZGdlKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpOwogICAgYXR0YWNoQ2lyY2xlKGxBcmMpOwogICAgYXR0YWNoQ2lyY2xlKHJBcmMpOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKCFyQXJjKSB7IC8vICYmIGxBcmMKICAgIG5ld0FyYy5lZGdlID0gY3JlYXRlRWRnZShsQXJjLnNpdGUsIG5ld0FyYy5zaXRlKTsKICAgIHJldHVybjsKICB9CgogIC8vIGVsc2UgbEFyYyAhPT0gckFyYwogIGRldGFjaENpcmNsZShsQXJjKTsKICBkZXRhY2hDaXJjbGUockFyYyk7CgogIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwKICAgICAgYXggPSBsU2l0ZVswXSwKICAgICAgYXkgPSBsU2l0ZVsxXSwKICAgICAgYnggPSBzaXRlWzBdIC0gYXgsCiAgICAgIGJ5ID0gc2l0ZVsxXSAtIGF5LAogICAgICByU2l0ZSA9IHJBcmMuc2l0ZSwKICAgICAgY3ggPSByU2l0ZVswXSAtIGF4LAogICAgICBjeSA9IHJTaXRlWzFdIC0gYXksCiAgICAgIGQgPSAyICogKGJ4ICogY3kgLSBieSAqIGN4KSwKICAgICAgaGIgPSBieCAqIGJ4ICsgYnkgKiBieSwKICAgICAgaGMgPSBjeCAqIGN4ICsgY3kgKiBjeSwKICAgICAgdmVydGV4ID0gWyhjeSAqIGhiIC0gYnkgKiBoYykgLyBkICsgYXgsIChieCAqIGhjIC0gY3ggKiBoYikgLyBkICsgYXldOwoKICBzZXRFZGdlRW5kKHJBcmMuZWRnZSwgbFNpdGUsIHJTaXRlLCB2ZXJ0ZXgpOwogIG5ld0FyYy5lZGdlID0gY3JlYXRlRWRnZShsU2l0ZSwgc2l0ZSwgbnVsbCwgdmVydGV4KTsKICByQXJjLmVkZ2UgPSBjcmVhdGVFZGdlKHNpdGUsIHJTaXRlLCBudWxsLCB2ZXJ0ZXgpOwogIGF0dGFjaENpcmNsZShsQXJjKTsKICBhdHRhY2hDaXJjbGUockFyYyk7Cn0KCmZ1bmN0aW9uIGxlZnRCcmVha1BvaW50KGFyYywgZGlyZWN0cml4KSB7CiAgdmFyIHNpdGUgPSBhcmMuc2l0ZSwKICAgICAgcmZvY3ggPSBzaXRlWzBdLAogICAgICByZm9jeSA9IHNpdGVbMV0sCiAgICAgIHBieTIgPSByZm9jeSAtIGRpcmVjdHJpeDsKCiAgaWYgKCFwYnkyKSByZXR1cm4gcmZvY3g7CgogIHZhciBsQXJjID0gYXJjLlA7CiAgaWYgKCFsQXJjKSByZXR1cm4gLUluZmluaXR5OwoKICBzaXRlID0gbEFyYy5zaXRlOwogIHZhciBsZm9jeCA9IHNpdGVbMF0sCiAgICAgIGxmb2N5ID0gc2l0ZVsxXSwKICAgICAgcGxieTIgPSBsZm9jeSAtIGRpcmVjdHJpeDsKCiAgaWYgKCFwbGJ5MikgcmV0dXJuIGxmb2N4OwoKICB2YXIgaGwgPSBsZm9jeCAtIHJmb2N4LAogICAgICBhYnkyID0gMSAvIHBieTIgLSAxIC8gcGxieTIsCiAgICAgIGIgPSBobCAvIHBsYnkyOwoKICBpZiAoYWJ5MikgcmV0dXJuICgtYiArIE1hdGguc3FydChiICogYiAtIDIgKiBhYnkyICogKGhsICogaGwgLyAoLTIgKiBwbGJ5MikgLSBsZm9jeSArIHBsYnkyIC8gMiArIHJmb2N5IC0gcGJ5MiAvIDIpKSkgLyBhYnkyICsgcmZvY3g7CgogIHJldHVybiAocmZvY3ggKyBsZm9jeCkgLyAyOwp9CgpmdW5jdGlvbiByaWdodEJyZWFrUG9pbnQoYXJjLCBkaXJlY3RyaXgpIHsKICB2YXIgckFyYyA9IGFyYy5OOwogIGlmIChyQXJjKSByZXR1cm4gbGVmdEJyZWFrUG9pbnQockFyYywgZGlyZWN0cml4KTsKICB2YXIgc2l0ZSA9IGFyYy5zaXRlOwogIHJldHVybiBzaXRlWzFdID09PSBkaXJlY3RyaXggPyBzaXRlWzBdIDogSW5maW5pdHk7Cn0KCnZhciBlcHNpbG9uJDMgPSAxZS02Owp2YXIgZXBzaWxvbjIkMSA9IDFlLTEyOwp2YXIgYmVhY2hlczsKdmFyIGNlbGxzOwp2YXIgY2lyY2xlczsKdmFyIGVkZ2VzOwoKZnVuY3Rpb24gdHJpYW5nbGVBcmVhKGEsIGIsIGMpIHsKICByZXR1cm4gKGFbMF0gLSBjWzBdKSAqIChiWzFdIC0gYVsxXSkgLSAoYVswXSAtIGJbMF0pICogKGNbMV0gLSBhWzFdKTsKfQoKZnVuY3Rpb24gbGV4aWNvZ3JhcGhpYyhhLCBiKSB7CiAgcmV0dXJuIGJbMV0gLSBhWzFdCiAgICAgIHx8IGJbMF0gLSBhWzBdOwp9CgpmdW5jdGlvbiBEaWFncmFtKHNpdGVzLCBleHRlbnQpIHsKICB2YXIgc2l0ZSA9IHNpdGVzLnNvcnQobGV4aWNvZ3JhcGhpYykucG9wKCksCiAgICAgIHgsCiAgICAgIHksCiAgICAgIGNpcmNsZTsKCiAgZWRnZXMgPSBbXTsKICBjZWxscyA9IG5ldyBBcnJheShzaXRlcy5sZW5ndGgpOwogIGJlYWNoZXMgPSBuZXcgUmVkQmxhY2tUcmVlOwogIGNpcmNsZXMgPSBuZXcgUmVkQmxhY2tUcmVlOwoKICB3aGlsZSAodHJ1ZSkgewogICAgY2lyY2xlID0gZmlyc3RDaXJjbGU7CiAgICBpZiAoc2l0ZSAmJiAoIWNpcmNsZSB8fCBzaXRlWzFdIDwgY2lyY2xlLnkgfHwgKHNpdGVbMV0gPT09IGNpcmNsZS55ICYmIHNpdGVbMF0gPCBjaXJjbGUueCkpKSB7CiAgICAgIGlmIChzaXRlWzBdICE9PSB4IHx8IHNpdGVbMV0gIT09IHkpIHsKICAgICAgICBhZGRCZWFjaChzaXRlKTsKICAgICAgICB4ID0gc2l0ZVswXSwgeSA9IHNpdGVbMV07CiAgICAgIH0KICAgICAgc2l0ZSA9IHNpdGVzLnBvcCgpOwogICAgfSBlbHNlIGlmIChjaXJjbGUpIHsKICAgICAgcmVtb3ZlQmVhY2goY2lyY2xlLmFyYyk7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9CgogIHNvcnRDZWxsSGFsZmVkZ2VzKCk7CgogIGlmIChleHRlbnQpIHsKICAgIHZhciB4MCA9ICtleHRlbnRbMF1bMF0sCiAgICAgICAgeTAgPSArZXh0ZW50WzBdWzFdLAogICAgICAgIHgxID0gK2V4dGVudFsxXVswXSwKICAgICAgICB5MSA9ICtleHRlbnRbMV1bMV07CiAgICBjbGlwRWRnZXMoeDAsIHkwLCB4MSwgeTEpOwogICAgY2xpcENlbGxzKHgwLCB5MCwgeDEsIHkxKTsKICB9CgogIHRoaXMuZWRnZXMgPSBlZGdlczsKICB0aGlzLmNlbGxzID0gY2VsbHM7CgogIGJlYWNoZXMgPQogIGNpcmNsZXMgPQogIGVkZ2VzID0KICBjZWxscyA9IG51bGw7Cn0KCkRpYWdyYW0ucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBEaWFncmFtLAoKICBwb2x5Z29uczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzOwoKICAgIHJldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihjZWxsKSB7CiAgICAgIHZhciBwb2x5Z29uID0gY2VsbC5oYWxmZWRnZXMubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIGNlbGxIYWxmZWRnZVN0YXJ0KGNlbGwsIGVkZ2VzW2ldKTsgfSk7CiAgICAgIHBvbHlnb24uZGF0YSA9IGNlbGwuc2l0ZS5kYXRhOwogICAgICByZXR1cm4gcG9seWdvbjsKICAgIH0pOwogIH0sCgogIHRyaWFuZ2xlczogZnVuY3Rpb24oKSB7CiAgICB2YXIgdHJpYW5nbGVzID0gW10sCiAgICAgICAgZWRnZXMgPSB0aGlzLmVkZ2VzOwoKICAgIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihjZWxsLCBpKSB7CiAgICAgIHZhciBzaXRlID0gY2VsbC5zaXRlLAogICAgICAgICAgaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRnZXMsCiAgICAgICAgICBqID0gLTEsCiAgICAgICAgICBtID0gaGFsZmVkZ2VzLmxlbmd0aCwKICAgICAgICAgIHMwLAogICAgICAgICAgZTEgPSBlZGdlc1toYWxmZWRnZXNbbSAtIDFdXSwKICAgICAgICAgIHMxID0gZTEubGVmdCA9PT0gc2l0ZSA/IGUxLnJpZ2h0IDogZTEubGVmdDsKCiAgICAgIHdoaWxlICgrK2ogPCBtKSB7CiAgICAgICAgczAgPSBzMTsKICAgICAgICBlMSA9IGVkZ2VzW2hhbGZlZGdlc1tqXV07CiAgICAgICAgczEgPSBlMS5sZWZ0ID09PSBzaXRlID8gZTEucmlnaHQgOiBlMS5sZWZ0OwogICAgICAgIGlmIChpIDwgczAuaW5kZXggJiYgaSA8IHMxLmluZGV4ICYmIHRyaWFuZ2xlQXJlYShzaXRlLCBzMCwgczEpIDwgMCkgewogICAgICAgICAgdHJpYW5nbGVzLnB1c2goW3NpdGUuZGF0YSwgczAuZGF0YSwgczEuZGF0YV0pOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgcmV0dXJuIHRyaWFuZ2xlczsKICB9LAoKICBsaW5rczogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoZnVuY3Rpb24oZWRnZSkgewogICAgICByZXR1cm4gZWRnZS5yaWdodDsKICAgIH0pLm1hcChmdW5jdGlvbihlZGdlKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgc291cmNlOiBlZGdlLmxlZnQuZGF0YSwKICAgICAgICB0YXJnZXQ6IGVkZ2UucmlnaHQuZGF0YQogICAgICB9OwogICAgfSk7CiAgfQp9Cgp2YXIgdm9yb25vaSA9IGZ1bmN0aW9uKCkgewogIHZhciB4JCQxID0geCQ0LAogICAgICB5JCQxID0geSQ0LAogICAgICBleHRlbnQgPSBudWxsOwoKICBmdW5jdGlvbiB2b3Jvbm9pKGRhdGEpIHsKICAgIHJldHVybiBuZXcgRGlhZ3JhbShkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7CiAgICAgIHZhciBzID0gW01hdGgucm91bmQoeCQkMShkLCBpLCBkYXRhKSAvIGVwc2lsb24kMykgKiBlcHNpbG9uJDMsIE1hdGgucm91bmQoeSQkMShkLCBpLCBkYXRhKSAvIGVwc2lsb24kMykgKiBlcHNpbG9uJDNdOwogICAgICBzLmluZGV4ID0gaTsKICAgICAgcy5kYXRhID0gZDsKICAgICAgcmV0dXJuIHM7CiAgICB9KSwgZXh0ZW50KTsKICB9CgogIHZvcm9ub2kucG9seWdvbnMgPSBmdW5jdGlvbihkYXRhKSB7CiAgICByZXR1cm4gdm9yb25vaShkYXRhKS5wb2x5Z29ucygpOwogIH07CgogIHZvcm9ub2kubGlua3MgPSBmdW5jdGlvbihkYXRhKSB7CiAgICByZXR1cm4gdm9yb25vaShkYXRhKS5saW5rcygpOwogIH07CgogIHZvcm9ub2kudHJpYW5nbGVzID0gZnVuY3Rpb24oZGF0YSkgewogICAgcmV0dXJuIHZvcm9ub2koZGF0YSkudHJpYW5nbGVzKCk7CiAgfTsKCiAgdm9yb25vaS54ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCQkMSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDkoK18pLCB2b3Jvbm9pKSA6IHgkJDE7CiAgfTsKCiAgdm9yb25vaS55ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSQkMSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDkoK18pLCB2b3Jvbm9pKSA6IHkkJDE7CiAgfTsKCiAgdm9yb25vaS5leHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSBfID09IG51bGwgPyBudWxsIDogW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0sIHZvcm9ub2kpIDogZXh0ZW50ICYmIFtbZXh0ZW50WzBdWzBdLCBleHRlbnRbMF1bMV1dLCBbZXh0ZW50WzFdWzBdLCBleHRlbnRbMV1bMV1dXTsKICB9OwoKICB2b3Jvbm9pLnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSBfID09IG51bGwgPyBudWxsIDogW1swLCAwXSwgWytfWzBdLCArX1sxXV1dLCB2b3Jvbm9pKSA6IGV4dGVudCAmJiBbZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV1dOwogIH07CgogIHJldHVybiB2b3Jvbm9pOwp9Cgp2YXIgY29uc3RhbnQkMTAgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rpb24gWm9vbUV2ZW50KHRhcmdldCwgdHlwZSwgdHJhbnNmb3JtKSB7CiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CiAgdGhpcy50eXBlID0gdHlwZTsKICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKfQoKZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKICB0aGlzLmsgPSBrOwogIHRoaXMueCA9IHg7CiAgdGhpcy55ID0geTsKfQoKVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLAogIHNjYWxlOiBmdW5jdGlvbihrKSB7CiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTsKICB9LAogIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkgewogICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTsKICB9LAogIGFwcGx5OiBmdW5jdGlvbihwb2ludCkgewogICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwogIH0sCiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDsKICB9LAogIGFwcGx5WTogZnVuY3Rpb24oeSkgewogICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7CiAgfSwKICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7CiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwogIH0sCiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkgewogICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuazsKICB9LAogIGludmVydFk6IGZ1bmN0aW9uKHkpIHsKICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7CiAgfSwKICByZXNjYWxlWDogZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CiAgfSwKICByZXNjYWxlWTogZnVuY3Rpb24oeSkgewogICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7CiAgfSwKICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgdGhpcy54ICsgIiwiICsgdGhpcy55ICsgIikgc2NhbGUoIiArIHRoaXMuayArICIpIjsKICB9Cn07Cgp2YXIgaWRlbnRpdHkkNiA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7Cgp0cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTsKCmZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7CiAgcmV0dXJuIG5vZGUuX196b29tIHx8IGlkZW50aXR5JDY7Cn0KCmZ1bmN0aW9uIG5vcHJvcGFnYXRpb24kMSgpIHsKICBleHBvcnRzLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwp9Cgp2YXIgbm9ldmVudCQxID0gZnVuY3Rpb24oKSB7CiAgZXhwb3J0cy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogIGV4cG9ydHMuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7Cn0KCi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LgpmdW5jdGlvbiBkZWZhdWx0RmlsdGVyJDEoKSB7CiAgcmV0dXJuICFleHBvcnRzLmV2ZW50LmJ1dHRvbjsKfQoKZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHsKICB2YXIgZSA9IHRoaXMsIHcsIGg7CiAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7CiAgICBlID0gZS5vd25lclNWR0VsZW1lbnQgfHwgZTsKICAgIHcgPSBlLndpZHRoLmJhc2VWYWwudmFsdWU7CiAgICBoID0gZS5oZWlnaHQuYmFzZVZhbC52YWx1ZTsKICB9IGVsc2UgewogICAgdyA9IGUuY2xpZW50V2lkdGg7CiAgICBoID0gZS5jbGllbnRIZWlnaHQ7CiAgfQogIHJldHVybiBbWzAsIDBdLCBbdywgaF1dOwp9CgpmdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCkgewogIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eSQ2Owp9Cgp2YXIgem9vbSA9IGZ1bmN0aW9uKCkgewogIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyJDEsCiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsCiAgICAgIGswID0gMCwKICAgICAgazEgPSBJbmZpbml0eSwKICAgICAgeDAgPSAtazEsCiAgICAgIHgxID0gazEsCiAgICAgIHkwID0geDAsCiAgICAgIHkxID0geDEsCiAgICAgIGR1cmF0aW9uID0gMjUwLAogICAgICBnZXN0dXJlcyA9IFtdLAogICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaCgic3RhcnQiLCAiem9vbSIsICJlbmQiKSwKICAgICAgdG91Y2hzdGFydGluZywKICAgICAgdG91Y2hlbmRpbmcsCiAgICAgIHRvdWNoRGVsYXkgPSA1MDAsCiAgICAgIHdoZWVsRGVsYXkgPSAxNTA7CgogIGZ1bmN0aW9uIHpvb20oc2VsZWN0aW9uJCQxKSB7CiAgICBzZWxlY3Rpb24kJDEKICAgICAgICAub24oIndoZWVsLnpvb20iLCB3aGVlbGVkKQogICAgICAgIC5vbigibW91c2Vkb3duLnpvb20iLCBtb3VzZWRvd25lZCkKICAgICAgICAub24oImRibGNsaWNrLnpvb20iLCBkYmxjbGlja2VkKQogICAgICAgIC5vbigidG91Y2hzdGFydC56b29tIiwgdG91Y2hzdGFydGVkKQogICAgICAgIC5vbigidG91Y2htb3ZlLnpvb20iLCB0b3VjaG1vdmVkKQogICAgICAgIC5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIiwgdG91Y2hlbmRlZCkKICAgICAgICAuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsICJyZ2JhKDAsMCwwLDApIikKICAgICAgICAucHJvcGVydHkoIl9fem9vbSIsIGRlZmF1bHRUcmFuc2Zvcm0pOwogIH0KCiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0pIHsKICAgIHZhciBzZWxlY3Rpb24kJDEgPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uOwogICAgc2VsZWN0aW9uJCQxLnByb3BlcnR5KCJfX3pvb20iLCBkZWZhdWx0VHJhbnNmb3JtKTsKICAgIGlmIChjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24kJDEpIHsKICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtKTsKICAgIH0gZWxzZSB7CiAgICAgIHNlbGVjdGlvbiQkMS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKQogICAgICAgICAgICAuc3RhcnQoKQogICAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSAiZnVuY3Rpb24iID8gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pCiAgICAgICAgICAgIC5lbmQoKTsKICAgICAgfSk7CiAgICB9CiAgfTsKCiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uJCQxLCBrKSB7CiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uJCQxLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uaywKICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09ICJmdW5jdGlvbiIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrOwogICAgICByZXR1cm4gazAgKiBrMTsKICAgIH0pOwogIH07CgogIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiQkMSwgaykgewogICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uJCQxLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sCiAgICAgICAgICBwMCA9IGNlbnRyb2lkKGUpLAogICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLAogICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gImZ1bmN0aW9uIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7CiAgICAgIHJldHVybiBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUpOwogICAgfSk7CiAgfTsKCiAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiQkMSwgeCwgeSkgewogICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uJCQxLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoCiAgICAgICAgdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LAogICAgICAgIHR5cGVvZiB5ID09PSAiZnVuY3Rpb24iID8geS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeQogICAgICApLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICB9KTsKICB9OwoKICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHsKICAgIGsgPSBNYXRoLm1heChrMCwgTWF0aC5taW4oazEsIGspKTsKICAgIHJldHVybiBrID09PSB0cmFuc2Zvcm0uayA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0oaywgdHJhbnNmb3JtLngsIHRyYW5zZm9ybS55KTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHAwLCBwMSkgewogICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7CiAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTsKICB9CgogIGZ1bmN0aW9uIGNvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCkgewogICAgdmFyIGR4ID0gTWF0aC5taW4oMCwgdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHgwKSB8fCBNYXRoLm1heCgwLCB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMV1bMF0pIC0geDEpLAogICAgICAgIGR5ID0gTWF0aC5taW4oMCwgdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzBdWzFdKSAtIHkwKSB8fCBNYXRoLm1heCgwLCB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0geTEpOwogICAgcmV0dXJuIGR4IHx8IGR5ID8gdHJhbnNmb3JtLnRyYW5zbGF0ZShkeCwgZHkpIDogdHJhbnNmb3JtOwogIH0KCiAgZnVuY3Rpb24gY2VudHJvaWQoZXh0ZW50KSB7CiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07CiAgfQoKICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uJCQxLCB0cmFuc2Zvcm0sIGNlbnRlcikgewogICAgdHJhbnNpdGlvbiQkMQogICAgICAgIC5vbigic3RhcnQuem9vbSIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuc3RhcnQoKTsgfSkKICAgICAgICAub24oImludGVycnVwdC56b29tIGVuZC56b29tIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5lbmQoKTsgfSkKICAgICAgICAudHdlZW4oInpvb20iLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLAogICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLAogICAgICAgICAgICAgIGUgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyksCiAgICAgICAgICAgICAgcCA9IGNlbnRlciB8fCBjZW50cm9pZChlKSwKICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSwKICAgICAgICAgICAgICBhID0gdGhhdC5fX3pvb20sCiAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09ICJmdW5jdGlvbiIgPyB0cmFuc2Zvcm0uYXBwbHkodGhhdCwgYXJncykgOiB0cmFuc2Zvcm0sCiAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlWm9vbShhLmludmVydChwKS5jb25jYXQodyAvIGEuayksIGIuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYi5rKSk7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC4KICAgICAgICAgICAgZWxzZSB7IHZhciBsID0gaSh0KSwgayA9IHcgLyBsWzJdOyB0ID0gbmV3IFRyYW5zZm9ybShrLCBwWzBdIC0gbFswXSAqIGssIHBbMV0gLSBsWzFdICogayk7IH0KICAgICAgICAgICAgZy56b29tKG51bGwsIHQpOwogICAgICAgICAgfTsKICAgICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGdlc3R1cmUodGhhdCwgYXJncykgewogICAgZm9yICh2YXIgaSA9IDAsIG4gPSBnZXN0dXJlcy5sZW5ndGgsIGc7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChnID0gZ2VzdHVyZXNbaV0pLnRoYXQgPT09IHRoYXQpIHsKICAgICAgICByZXR1cm4gZzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpOwogIH0KCiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7CiAgICB0aGlzLnRoYXQgPSB0aGF0OwogICAgdGhpcy5hcmdzID0gYXJnczsKICAgIHRoaXMuaW5kZXggPSAtMTsKICAgIHRoaXMuYWN0aXZlID0gMDsKICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpOwogIH0KCiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7CiAgICBzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7CiAgICAgICAgdGhpcy5pbmRleCA9IGdlc3R1cmVzLnB1c2godGhpcykgLSAxOwogICAgICAgIHRoaXMuZW1pdCgic3RhcnQiKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkgewogICAgICBpZiAodGhpcy5tb3VzZSAmJiBrZXkgIT09ICJtb3VzZSIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pOwogICAgICBpZiAodGhpcy50b3VjaDAgJiYga2V5ICE9PSAidG91Y2giKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pOwogICAgICBpZiAodGhpcy50b3VjaDEgJiYga2V5ICE9PSAidG91Y2giKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pOwogICAgICB0aGlzLnRoYXQuX196b29tID0gdHJhbnNmb3JtOwogICAgICB0aGlzLmVtaXQoInpvb20iKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgZW5kOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHsKICAgICAgICBnZXN0dXJlcy5zcGxpY2UodGhpcy5pbmRleCwgMSk7CiAgICAgICAgdGhpcy5pbmRleCA9IC0xOwogICAgICAgIHRoaXMuZW1pdCgiZW5kIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgZW1pdDogZnVuY3Rpb24odHlwZSkgewogICAgICBjdXN0b21FdmVudChuZXcgWm9vbUV2ZW50KHpvb20sIHR5cGUsIHRoaXMudGhhdC5fX3pvb20pLCBsaXN0ZW5lcnMuYXBwbHksIGxpc3RlbmVycywgW3R5cGUsIHRoaXMudGhhdCwgdGhpcy5hcmdzXSk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gd2hlZWxlZCgpIHsKICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHQgPSB0aGlzLl9fem9vbSwKICAgICAgICBrID0gTWF0aC5tYXgoazAsIE1hdGgubWluKGsxLCB0LmsgKiBNYXRoLnBvdygyLCAtZXhwb3J0cy5ldmVudC5kZWx0YVkgKiAoZXhwb3J0cy5ldmVudC5kZWx0YU1vZGUgPyAxMjAgOiAxKSAvIDUwMCkpKSwKICAgICAgICBwID0gbW91c2UodGhpcyk7CgogICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuCiAgICAvLyBJZiB0aGVyZSB3ZXJlIHJlY2VudCB3aGVlbCBldmVudHMsIHJlc2V0IHRoZSB3aGVlbCBpZGxlIHRpbWVvdXQuCiAgICBpZiAoZy53aGVlbCkgewogICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7CiAgICAgICAgZy5tb3VzZVsxXSA9IHQuaW52ZXJ0KGcubW91c2VbMF0gPSBwKTsKICAgICAgfQogICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7CiAgICB9CgogICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b27DosKAwpl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuCiAgICBlbHNlIGlmICh0LmsgPT09IGspIHJldHVybjsKCiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuCiAgICBlbHNlIHsKICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07CiAgICAgIGludGVycnVwdCh0aGlzKTsKICAgICAgZy5zdGFydCgpOwogICAgfQoKICAgIG5vZXZlbnQkMSgpOwogICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7CiAgICBnLnpvb20oIm1vdXNlIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50KSk7CgogICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHsKICAgICAgZy53aGVlbCA9IG51bGw7CiAgICAgIGcuZW5kKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3VzZWRvd25lZCgpIHsKICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHYgPSBzZWxlY3QoZXhwb3J0cy5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLCBtb3VzZW1vdmVkLCB0cnVlKS5vbigibW91c2V1cC56b29tIiwgbW91c2V1cHBlZCwgdHJ1ZSksCiAgICAgICAgcCA9IG1vdXNlKHRoaXMpOwoKICAgIGRyYWdEaXNhYmxlKGV4cG9ydHMuZXZlbnQudmlldyk7CiAgICBub3Byb3BhZ2F0aW9uJDEoKTsKICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTsKICAgIGludGVycnVwdCh0aGlzKTsKICAgIGcuc3RhcnQoKTsKCiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKCkgewogICAgICBub2V2ZW50JDEoKTsKICAgICAgZy5tb3ZlZCA9IHRydWU7CiAgICAgIGcuem9vbSgibW91c2UiLCBjb25zdHJhaW4odHJhbnNsYXRlKGcudGhhdC5fX3pvb20sIGcubW91c2VbMF0gPSBtb3VzZShnLnRoYXQpLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKCkgewogICAgICB2Lm9uKCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb20iLCBudWxsKTsKICAgICAgeWVzZHJhZyhleHBvcnRzLmV2ZW50LnZpZXcsIGcubW92ZWQpOwogICAgICBub2V2ZW50JDEoKTsKICAgICAgZy5lbmQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRibGNsaWNrZWQoKSB7CiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47CiAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSwKICAgICAgICBwMCA9IG1vdXNlKHRoaXMpLAogICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSwKICAgICAgICBrMSA9IHQwLmsgKiAoZXhwb3J0cy5ldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLAogICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CgogICAgbm9ldmVudCQxKCk7CiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDApOwogICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEpOwogIH0KCiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKCkgewogICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuOwogICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgdG91Y2hlcyQkMSA9IGV4cG9ydHMuZXZlbnQuY2hhbmdlZFRvdWNoZXMsCiAgICAgICAgbiA9IHRvdWNoZXMkJDEubGVuZ3RoLCBpLCB0LCBwOwoKICAgIG5vcHJvcGFnYXRpb24kMSgpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICB0ID0gdG91Y2hlcyQkMVtpXSwgcCA9IHRvdWNoKHRoaXMsIHRvdWNoZXMkJDEsIHQuaWRlbnRpZmllcik7CiAgICAgIHAgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApLCB0LmlkZW50aWZpZXJdOwogICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHA7CiAgICAgIGVsc2UgaWYgKCFnLnRvdWNoMSkgZy50b3VjaDEgPSBwOwogICAgfQogICAgaWYgKHRvdWNoc3RhcnRpbmcpIHsKICAgICAgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTsKICAgICAgaWYgKCFnLnRvdWNoMSkgcmV0dXJuIGcuZW5kKCksIGRibGNsaWNrZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0KICAgIGlmIChleHBvcnRzLmV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSBuKSB7CiAgICAgIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7CiAgICAgIGludGVycnVwdCh0aGlzKTsKICAgICAgZy5zdGFydCgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG91Y2htb3ZlZCgpIHsKICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHRvdWNoZXMkJDEgPSBleHBvcnRzLmV2ZW50LmNoYW5nZWRUb3VjaGVzLAogICAgICAgIG4gPSB0b3VjaGVzJCQxLmxlbmd0aCwgaSwgdCwgcCwgbDsKCiAgICBub2V2ZW50JDEoKTsKICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICB0ID0gdG91Y2hlcyQkMVtpXSwgcCA9IHRvdWNoKHRoaXMsIHRvdWNoZXMkJDEsIHQuaWRlbnRpZmllcik7CiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMFswXSA9IHA7CiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gxWzBdID0gcDsKICAgIH0KICAgIHQgPSBnLnRoYXQuX196b29tOwogICAgaWYgKGcudG91Y2gxKSB7CiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLAogICAgICAgICAgcDEgPSBnLnRvdWNoMVswXSwgbDEgPSBnLnRvdWNoMVsxXSwKICAgICAgICAgIGRwID0gKGRwID0gcDFbMF0gLSBwMFswXSkgKiBkcCArIChkcCA9IHAxWzFdIC0gcDBbMV0pICogZHAsCiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsOwogICAgICB0ID0gc2NhbGUodCwgTWF0aC5zcXJ0KGRwIC8gZGwpKTsKICAgICAgcCA9IFsocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyXTsKICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTsKICAgIH0KICAgIGVsc2UgaWYgKGcudG91Y2gwKSBwID0gZy50b3VjaDBbMF0sIGwgPSBnLnRvdWNoMFsxXTsKICAgIGVsc2UgcmV0dXJuOwogICAgZy56b29tKCJ0b3VjaCIsIGNvbnN0cmFpbih0cmFuc2xhdGUodCwgcCwgbCksIGcuZXh0ZW50KSk7CiAgfQoKICBmdW5jdGlvbiB0b3VjaGVuZGVkKCkgewogICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgdG91Y2hlcyQkMSA9IGV4cG9ydHMuZXZlbnQuY2hhbmdlZFRvdWNoZXMsCiAgICAgICAgbiA9IHRvdWNoZXMkJDEubGVuZ3RoLCBpLCB0OwoKICAgIG5vcHJvcGFnYXRpb24kMSgpOwogICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpOwogICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICB0ID0gdG91Y2hlcyQkMVtpXTsKICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMDsKICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxOwogICAgfQogICAgaWYgKGcudG91Y2gxICYmICFnLnRvdWNoMCkgZy50b3VjaDAgPSBnLnRvdWNoMSwgZGVsZXRlIGcudG91Y2gxOwogICAgaWYgKCFnLnRvdWNoMCkgZy5lbmQoKTsKICB9CgogIHpvb20uZmlsdGVyID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMTAoISFfKSwgem9vbSkgOiBmaWx0ZXI7CiAgfTsKCiAgem9vbS5leHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQxMChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIHpvb20pIDogZXh0ZW50OwogIH07CgogIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrMCA9ICtfWzBdLCBrMSA9ICtfWzFdLCB6b29tKSA6IFtrMCwgazFdOwogIH07CgogIHpvb20udHJhbnNsYXRlRXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSArX1swXVswXSwgeDEgPSArX1sxXVswXSwgeTAgPSArX1swXVsxXSwgeTEgPSArX1sxXVsxXSwgem9vbSkgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICB9OwoKICB6b29tLmR1cmF0aW9uID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjsKICB9OwoKICB6b29tLm9uID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyB6b29tIDogdmFsdWU7CiAgfTsKCiAgcmV0dXJuIHpvb207Cn0KCnZhciBjb25zdGFudCQxMSA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9Cgp2YXIgQnJ1c2hFdmVudCA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgc2VsZWN0aW9uKSB7CiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CiAgdGhpcy50eXBlID0gdHlwZTsKICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKfQoKZnVuY3Rpb24gbm9wcm9wYWdhdGlvbiQyKCkgewogIGV4cG9ydHMuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7Cn0KCnZhciBub2V2ZW50JDIgPSBmdW5jdGlvbigpIHsKICBleHBvcnRzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgZXhwb3J0cy5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfQoKdmFyIE1PREVfRFJBRyA9IHtuYW1lOiAiZHJhZyJ9Owp2YXIgTU9ERV9TUEFDRSA9IHtuYW1lOiAic3BhY2UifTsKdmFyIE1PREVfSEFORExFID0ge25hbWU6ICJoYW5kbGUifTsKdmFyIE1PREVfQ0VOVEVSID0ge25hbWU6ICJjZW50ZXIifTsKCnZhciBYID0gewogIG5hbWU6ICJ4IiwKICBoYW5kbGVzOiBbImUiLCAidyJdLm1hcCh0eXBlJDEpLAogIGlucHV0OiBmdW5jdGlvbih4LCBlKSB7IHJldHVybiB4ICYmIFtbeFswXSwgZVswXVsxXV0sIFt4WzFdLCBlWzFdWzFdXV07IH0sCiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgJiYgW3h5WzBdWzBdLCB4eVsxXVswXV07IH0KfTsKCnZhciBZID0gewogIG5hbWU6ICJ5IiwKICBoYW5kbGVzOiBbIm4iLCAicyJdLm1hcCh0eXBlJDEpLAogIGlucHV0OiBmdW5jdGlvbih5LCBlKSB7IHJldHVybiB5ICYmIFtbZVswXVswXSwgeVswXV0sIFtlWzFdWzBdLCB5WzFdXV07IH0sCiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgJiYgW3h5WzBdWzFdLCB4eVsxXVsxXV07IH0KfTsKCnZhciBYWSA9IHsKICBuYW1lOiAieHkiLAogIGhhbmRsZXM6IFsibiIsICJlIiwgInMiLCAidyIsICJudyIsICJuZSIsICJzZSIsICJzdyJdLm1hcCh0eXBlJDEpLAogIGlucHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHk7IH0sCiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHk7IH0KfTsKCnZhciBjdXJzb3JzID0gewogIG92ZXJsYXk6ICJjcm9zc2hhaXIiLAogIHNlbGVjdGlvbjogIm1vdmUiLAogIG46ICJucy1yZXNpemUiLAogIGU6ICJldy1yZXNpemUiLAogIHM6ICJucy1yZXNpemUiLAogIHc6ICJldy1yZXNpemUiLAogIG53OiAibndzZS1yZXNpemUiLAogIG5lOiAibmVzdy1yZXNpemUiLAogIHNlOiAibndzZS1yZXNpemUiLAogIHN3OiAibmVzdy1yZXNpemUiCn07Cgp2YXIgZmxpcFggPSB7CiAgZTogInciLAogIHc6ICJlIiwKICBudzogIm5lIiwKICBuZTogIm53IiwKICBzZTogInN3IiwKICBzdzogInNlIgp9OwoKdmFyIGZsaXBZID0gewogIG46ICJzIiwKICBzOiAibiIsCiAgbnc6ICJzdyIsCiAgbmU6ICJzZSIsCiAgc2U6ICJuZSIsCiAgc3c6ICJudyIKfTsKCnZhciBzaWduc1ggPSB7CiAgb3ZlcmxheTogKzEsCiAgc2VsZWN0aW9uOiArMSwKICBuOiBudWxsLAogIGU6ICsxLAogIHM6IG51bGwsCiAgdzogLTEsCiAgbnc6IC0xLAogIG5lOiArMSwKICBzZTogKzEsCiAgc3c6IC0xCn07Cgp2YXIgc2lnbnNZID0gewogIG92ZXJsYXk6ICsxLAogIHNlbGVjdGlvbjogKzEsCiAgbjogLTEsCiAgZTogbnVsbCwKICBzOiArMSwKICB3OiBudWxsLAogIG53OiAtMSwKICBuZTogLTEsCiAgc2U6ICsxLAogIHN3OiArMQp9OwoKZnVuY3Rpb24gdHlwZSQxKHQpIHsKICByZXR1cm4ge3R5cGU6IHR9Owp9CgovLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS4KZnVuY3Rpb24gZGVmYXVsdEZpbHRlciQyKCkgewogIHJldHVybiAhZXhwb3J0cy5ldmVudC5idXR0b247Cn0KCmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQkMSgpIHsKICB2YXIgc3ZnID0gdGhpcy5vd25lclNWR0VsZW1lbnQgfHwgdGhpczsKICByZXR1cm4gW1swLCAwXSwgW3N2Zy53aWR0aC5iYXNlVmFsLnZhbHVlLCBzdmcuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTsKfQoKLy8gTGlrZSBkMy5sb2NhbCwgYnV0IHdpdGggdGhlIG5hbWUgw6LCgMKcX19icnVzaMOiwoDCnSByYXRoZXIgdGhhbiBhdXRvLWdlbmVyYXRlZC4KZnVuY3Rpb24gbG9jYWwkMShub2RlKSB7CiAgd2hpbGUgKCFub2RlLl9fYnJ1c2gpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47CiAgcmV0dXJuIG5vZGUuX19icnVzaDsKfQoKZnVuY3Rpb24gZW1wdHkkMShleHRlbnQpIHsKICByZXR1cm4gZXh0ZW50WzBdWzBdID09PSBleHRlbnRbMV1bMF0KICAgICAgfHwgZXh0ZW50WzBdWzFdID09PSBleHRlbnRbMV1bMV07Cn0KCmZ1bmN0aW9uIGJydXNoU2VsZWN0aW9uKG5vZGUpIHsKICB2YXIgc3RhdGUgPSBub2RlLl9fYnJ1c2g7CiAgcmV0dXJuIHN0YXRlID8gc3RhdGUuZGltLm91dHB1dChzdGF0ZS5zZWxlY3Rpb24pIDogbnVsbDsKfQoKZnVuY3Rpb24gYnJ1c2hYKCkgewogIHJldHVybiBicnVzaCQxKFgpOwp9CgpmdW5jdGlvbiBicnVzaFkoKSB7CiAgcmV0dXJuIGJydXNoJDEoWSk7Cn0KCnZhciBicnVzaCA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBicnVzaCQxKFhZKTsKfQoKZnVuY3Rpb24gYnJ1c2gkMShkaW0pIHsKICB2YXIgZXh0ZW50ID0gZGVmYXVsdEV4dGVudCQxLAogICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyJDIsCiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKGJydXNoLCAic3RhcnQiLCAiYnJ1c2giLCAiZW5kIiksCiAgICAgIGhhbmRsZVNpemUgPSA2LAogICAgICB0b3VjaGVuZGluZzsKCiAgZnVuY3Rpb24gYnJ1c2goZ3JvdXApIHsKICAgIHZhciBvdmVybGF5ID0gZ3JvdXAKICAgICAgICAucHJvcGVydHkoIl9fYnJ1c2giLCBpbml0aWFsaXplKQogICAgICAuc2VsZWN0QWxsKCIub3ZlcmxheSIpCiAgICAgIC5kYXRhKFt0eXBlJDEoIm92ZXJsYXkiKV0pOwoKICAgIG92ZXJsYXkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAgIC5hdHRyKCJjbGFzcyIsICJvdmVybGF5IikKICAgICAgICAuYXR0cigicG9pbnRlci1ldmVudHMiLCAiYWxsIikKICAgICAgICAuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5vdmVybGF5KQogICAgICAubWVyZ2Uob3ZlcmxheSkKICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBleHRlbnQgPSBsb2NhbCQxKHRoaXMpLmV4dGVudDsKICAgICAgICAgIHNlbGVjdCh0aGlzKQogICAgICAgICAgICAgIC5hdHRyKCJ4IiwgZXh0ZW50WzBdWzBdKQogICAgICAgICAgICAgIC5hdHRyKCJ5IiwgZXh0ZW50WzBdWzFdKQogICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIGV4dGVudFsxXVswXSAtIGV4dGVudFswXVswXSkKICAgICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgZXh0ZW50WzFdWzFdIC0gZXh0ZW50WzBdWzFdKTsKICAgICAgICB9KTsKCiAgICBncm91cC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKQogICAgICAuZGF0YShbdHlwZSQxKCJzZWxlY3Rpb24iKV0pCiAgICAgIC5lbnRlcigpLmFwcGVuZCgicmVjdCIpCiAgICAgICAgLmF0dHIoImNsYXNzIiwgInNlbGVjdGlvbiIpCiAgICAgICAgLmF0dHIoImN1cnNvciIsIGN1cnNvcnMuc2VsZWN0aW9uKQogICAgICAgIC5hdHRyKCJmaWxsIiwgIiM3NzciKQogICAgICAgIC5hdHRyKCJmaWxsLW9wYWNpdHkiLCAwLjMpCiAgICAgICAgLmF0dHIoInN0cm9rZSIsICIjZmZmIikKICAgICAgICAuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwgImNyaXNwRWRnZXMiKTsKCiAgICB2YXIgaGFuZGxlID0gZ3JvdXAuc2VsZWN0QWxsKCIuaGFuZGxlIikKICAgICAgLmRhdGEoZGltLmhhbmRsZXMsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZTsgfSk7CgogICAgaGFuZGxlLmV4aXQoKS5yZW1vdmUoKTsKCiAgICBoYW5kbGUuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAgIC5hdHRyKCJjbGFzcyIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJoYW5kbGUgaGFuZGxlLS0iICsgZC50eXBlOyB9KQogICAgICAgIC5hdHRyKCJjdXJzb3IiLCBmdW5jdGlvbihkKSB7IHJldHVybiBjdXJzb3JzW2QudHlwZV07IH0pOwoKICAgIGdyb3VwCiAgICAgICAgLmVhY2gocmVkcmF3KQogICAgICAgIC5hdHRyKCJmaWxsIiwgIm5vbmUiKQogICAgICAgIC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQogICAgICAgIC5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCkiKQogICAgICAgIC5vbigibW91c2Vkb3duLmJydXNoIHRvdWNoc3RhcnQuYnJ1c2giLCBzdGFydGVkKTsKICB9CgogIGJydXNoLm1vdmUgPSBmdW5jdGlvbihncm91cCwgc2VsZWN0aW9uJCQxKSB7CiAgICBpZiAoZ3JvdXAuc2VsZWN0aW9uKSB7CiAgICAgIGdyb3VwCiAgICAgICAgICAub24oInN0YXJ0LmJydXNoIiwgZnVuY3Rpb24oKSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCk7IH0pCiAgICAgICAgICAub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLCBmdW5jdGlvbigpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KQogICAgICAgICAgLnR3ZWVuKCJicnVzaCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCwKICAgICAgICAgICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICBzZWxlY3Rpb24wID0gc3RhdGUuc2VsZWN0aW9uLAogICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Ygc2VsZWN0aW9uJCQxID09PSAiZnVuY3Rpb24iID8gc2VsZWN0aW9uJCQxLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBzZWxlY3Rpb24kJDEsIHN0YXRlLmV4dGVudCksCiAgICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoc2VsZWN0aW9uMCwgc2VsZWN0aW9uMSk7CgogICAgICAgICAgICBmdW5jdGlvbiB0d2Vlbih0KSB7CiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gdCA9PT0gMSAmJiBlbXB0eSQxKHNlbGVjdGlvbjEpID8gbnVsbCA6IGkodCk7CiAgICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgICAgICAgZW1pdC5icnVzaCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uMCAmJiBzZWxlY3Rpb24xID8gdHdlZW4gOiB0d2VlbigxKTsKICAgICAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZ3JvdXAKICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLAogICAgICAgICAgICAgICAgc3RhdGUgPSB0aGF0Ll9fYnJ1c2gsCiAgICAgICAgICAgICAgICBzZWxlY3Rpb24xID0gZGltLmlucHV0KHR5cGVvZiBzZWxlY3Rpb24kJDEgPT09ICJmdW5jdGlvbiIgPyBzZWxlY3Rpb24kJDEuYXBwbHkodGhhdCwgYXJncykgOiBzZWxlY3Rpb24kJDEsIHN0YXRlLmV4dGVudCksCiAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmdzKS5iZWZvcmVzdGFydCgpOwoKICAgICAgICAgICAgaW50ZXJydXB0KHRoYXQpOwogICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBzZWxlY3Rpb24xID09IG51bGwgfHwgZW1wdHkkMShzZWxlY3Rpb24xKSA/IG51bGwgOiBzZWxlY3Rpb24xOwogICAgICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTsKICAgICAgICAgICAgZW1pdC5zdGFydCgpLmJydXNoKCkuZW5kKCk7CiAgICAgICAgICB9KTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiByZWRyYXcoKSB7CiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QodGhpcyksCiAgICAgICAgc2VsZWN0aW9uJCQxID0gbG9jYWwkMSh0aGlzKS5zZWxlY3Rpb247CgogICAgaWYgKHNlbGVjdGlvbiQkMSkgewogICAgICBncm91cC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKQogICAgICAgICAgLnN0eWxlKCJkaXNwbGF5IiwgbnVsbCkKICAgICAgICAgIC5hdHRyKCJ4Iiwgc2VsZWN0aW9uJCQxWzBdWzBdKQogICAgICAgICAgLmF0dHIoInkiLCBzZWxlY3Rpb24kJDFbMF1bMV0pCiAgICAgICAgICAuYXR0cigid2lkdGgiLCBzZWxlY3Rpb24kJDFbMV1bMF0gLSBzZWxlY3Rpb24kJDFbMF1bMF0pCiAgICAgICAgICAuYXR0cigiaGVpZ2h0Iiwgc2VsZWN0aW9uJCQxWzFdWzFdIC0gc2VsZWN0aW9uJCQxWzBdWzFdKTsKCiAgICAgIGdyb3VwLnNlbGVjdEFsbCgiLmhhbmRsZSIpCiAgICAgICAgICAuc3R5bGUoImRpc3BsYXkiLCBudWxsKQogICAgICAgICAgLmF0dHIoIngiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGVbZC50eXBlLmxlbmd0aCAtIDFdID09PSAiZSIgPyBzZWxlY3Rpb24kJDFbMV1bMF0gLSBoYW5kbGVTaXplIC8gMiA6IHNlbGVjdGlvbiQkMVswXVswXSAtIGhhbmRsZVNpemUgLyAyOyB9KQogICAgICAgICAgLmF0dHIoInkiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGVbMF0gPT09ICJzIiA/IHNlbGVjdGlvbiQkMVsxXVsxXSAtIGhhbmRsZVNpemUgLyAyIDogc2VsZWN0aW9uJCQxWzBdWzFdIC0gaGFuZGxlU2l6ZSAvIDI7IH0pCiAgICAgICAgICAuYXR0cigid2lkdGgiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJuIiB8fCBkLnR5cGUgPT09ICJzIiA/IHNlbGVjdGlvbiQkMVsxXVswXSAtIHNlbGVjdGlvbiQkMVswXVswXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KQogICAgICAgICAgLmF0dHIoImhlaWdodCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZSA9PT0gImUiIHx8IGQudHlwZSA9PT0gInciID8gc2VsZWN0aW9uJCQxWzFdWzFdIC0gc2VsZWN0aW9uJCQxWzBdWzFdICsgaGFuZGxlU2l6ZSA6IGhhbmRsZVNpemU7IH0pOwogICAgfQoKICAgIGVsc2UgewogICAgICBncm91cC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24sLmhhbmRsZSIpCiAgICAgICAgICAuc3R5bGUoImRpc3BsYXkiLCAibm9uZSIpCiAgICAgICAgICAuYXR0cigieCIsIG51bGwpCiAgICAgICAgICAuYXR0cigieSIsIG51bGwpCiAgICAgICAgICAuYXR0cigid2lkdGgiLCBudWxsKQogICAgICAgICAgLmF0dHIoImhlaWdodCIsIG51bGwpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZW1pdHRlcih0aGF0LCBhcmdzKSB7CiAgICByZXR1cm4gdGhhdC5fX2JydXNoLmVtaXR0ZXIgfHwgbmV3IEVtaXR0ZXIodGhhdCwgYXJncyk7CiAgfQoKICBmdW5jdGlvbiBFbWl0dGVyKHRoYXQsIGFyZ3MpIHsKICAgIHRoaXMudGhhdCA9IHRoYXQ7CiAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgdGhpcy5zdGF0ZSA9IHRoYXQuX19icnVzaDsKICAgIHRoaXMuYWN0aXZlID0gMDsKICB9CgogIEVtaXR0ZXIucHJvdG90eXBlID0gewogICAgYmVmb3Jlc3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkgdGhpcy5zdGF0ZS5lbWl0dGVyID0gdGhpcywgdGhpcy5zdGFydGluZyA9IHRydWU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIHN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuc3RhcnRpbmcpIHRoaXMuc3RhcnRpbmcgPSBmYWxzZSwgdGhpcy5lbWl0KCJzdGFydCIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICBicnVzaDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuZW1pdCgiYnJ1c2giKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgZW5kOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsIHRoaXMuZW1pdCgiZW5kIik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIGVtaXQ6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgY3VzdG9tRXZlbnQobmV3IEJydXNoRXZlbnQoYnJ1c2gsIHR5cGUsIGRpbS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSwgbGlzdGVuZXJzLmFwcGx5LCBsaXN0ZW5lcnMsIFt0eXBlLCB0aGlzLnRoYXQsIHRoaXMuYXJnc10pOwogICAgfQogIH07CgogIGZ1bmN0aW9uIHN0YXJ0ZWQoKSB7CiAgICBpZiAoZXhwb3J0cy5ldmVudC50b3VjaGVzKSB7IGlmIChleHBvcnRzLmV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA8IGV4cG9ydHMuZXZlbnQudG91Y2hlcy5sZW5ndGgpIHJldHVybiBub2V2ZW50JDIoKTsgfQogICAgZWxzZSBpZiAodG91Y2hlbmRpbmcpIHJldHVybjsKICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKCiAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgdHlwZSA9IGV4cG9ydHMuZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsCiAgICAgICAgbW9kZSA9IChleHBvcnRzLmV2ZW50Lm1ldGFLZXkgPyB0eXBlID0gIm92ZXJsYXkiIDogdHlwZSkgPT09ICJzZWxlY3Rpb24iID8gTU9ERV9EUkFHIDogKGV4cG9ydHMuZXZlbnQuYWx0S2V5ID8gTU9ERV9DRU5URVIgOiBNT0RFX0hBTkRMRSksCiAgICAgICAgc2lnblggPSBkaW0gPT09IFkgPyBudWxsIDogc2lnbnNYW3R5cGVdLAogICAgICAgIHNpZ25ZID0gZGltID09PSBYID8gbnVsbCA6IHNpZ25zWVt0eXBlXSwKICAgICAgICBzdGF0ZSA9IGxvY2FsJDEodGhhdCksCiAgICAgICAgZXh0ZW50ID0gc3RhdGUuZXh0ZW50LAogICAgICAgIHNlbGVjdGlvbiQkMSA9IHN0YXRlLnNlbGVjdGlvbiwKICAgICAgICBXID0gZXh0ZW50WzBdWzBdLCB3MCwgdzEsCiAgICAgICAgTiA9IGV4dGVudFswXVsxXSwgbjAsIG4xLAogICAgICAgIEUgPSBleHRlbnRbMV1bMF0sIGUwLCBlMSwKICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEsCiAgICAgICAgZHgsCiAgICAgICAgZHksCiAgICAgICAgbW92aW5nLAogICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblkgJiYgZXhwb3J0cy5ldmVudC5zaGlmdEtleSwKICAgICAgICBsb2NrWCwKICAgICAgICBsb2NrWSwKICAgICAgICBwb2ludDAgPSBtb3VzZSh0aGF0KSwKICAgICAgICBwb2ludCA9IHBvaW50MCwKICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7CgogICAgaWYgKHR5cGUgPT09ICJvdmVybGF5IikgewogICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBzZWxlY3Rpb24kJDEgPSBbCiAgICAgICAgW3cwID0gZGltID09PSBZID8gVyA6IHBvaW50MFswXSwgbjAgPSBkaW0gPT09IFggPyBOIDogcG9pbnQwWzFdXSwKICAgICAgICBbZTAgPSBkaW0gPT09IFkgPyBFIDogdzAsIHMwID0gZGltID09PSBYID8gUyA6IG4wXQogICAgICBdOwogICAgfSBlbHNlIHsKICAgICAgdzAgPSBzZWxlY3Rpb24kJDFbMF1bMF07CiAgICAgIG4wID0gc2VsZWN0aW9uJCQxWzBdWzFdOwogICAgICBlMCA9IHNlbGVjdGlvbiQkMVsxXVswXTsKICAgICAgczAgPSBzZWxlY3Rpb24kJDFbMV1bMV07CiAgICB9CgogICAgdzEgPSB3MDsKICAgIG4xID0gbjA7CiAgICBlMSA9IGUwOwogICAgczEgPSBzMDsKCiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QodGhhdCkKICAgICAgICAuYXR0cigicG9pbnRlci1ldmVudHMiLCAibm9uZSIpOwoKICAgIHZhciBvdmVybGF5ID0gZ3JvdXAuc2VsZWN0QWxsKCIub3ZlcmxheSIpCiAgICAgICAgLmF0dHIoImN1cnNvciIsIGN1cnNvcnNbdHlwZV0pOwoKICAgIGlmIChleHBvcnRzLmV2ZW50LnRvdWNoZXMpIHsKICAgICAgZ3JvdXAKICAgICAgICAgIC5vbigidG91Y2htb3ZlLmJydXNoIiwgbW92ZWQsIHRydWUpCiAgICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIiwgZW5kZWQsIHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHZpZXcgPSBzZWxlY3QoZXhwb3J0cy5ldmVudC52aWV3KQogICAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwga2V5ZG93bmVkLCB0cnVlKQogICAgICAgICAgLm9uKCJrZXl1cC5icnVzaCIsIGtleXVwcGVkLCB0cnVlKQogICAgICAgICAgLm9uKCJtb3VzZW1vdmUuYnJ1c2giLCBtb3ZlZCwgdHJ1ZSkKICAgICAgICAgIC5vbigibW91c2V1cC5icnVzaCIsIGVuZGVkLCB0cnVlKTsKCiAgICAgIGRyYWdEaXNhYmxlKGV4cG9ydHMuZXZlbnQudmlldyk7CiAgICB9CgogICAgbm9wcm9wYWdhdGlvbiQyKCk7CiAgICBpbnRlcnJ1cHQodGhhdCk7CiAgICByZWRyYXcuY2FsbCh0aGF0KTsKICAgIGVtaXQuc3RhcnQoKTsKCiAgICBmdW5jdGlvbiBtb3ZlZCgpIHsKICAgICAgdmFyIHBvaW50MSA9IG1vdXNlKHRoYXQpOwogICAgICBpZiAoc2hpZnRpbmcgJiYgIWxvY2tYICYmICFsb2NrWSkgewogICAgICAgIGlmIChNYXRoLmFicyhwb2ludDFbMF0gLSBwb2ludFswXSkgPiBNYXRoLmFicyhwb2ludDFbMV0gLSBwb2ludFsxXSkpIGxvY2tZID0gdHJ1ZTsKICAgICAgICBlbHNlIGxvY2tYID0gdHJ1ZTsKICAgICAgfQogICAgICBwb2ludCA9IHBvaW50MTsKICAgICAgbW92aW5nID0gdHJ1ZTsKICAgICAgbm9ldmVudCQyKCk7CiAgICAgIG1vdmUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlKCkgewogICAgICB2YXIgdDsKCiAgICAgIGR4ID0gcG9pbnRbMF0gLSBwb2ludDBbMF07CiAgICAgIGR5ID0gcG9pbnRbMV0gLSBwb2ludDBbMV07CgogICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICBjYXNlIE1PREVfU1BBQ0U6CiAgICAgICAgY2FzZSBNT0RFX0RSQUc6IHsKICAgICAgICAgIGlmIChzaWduWCkgZHggPSBNYXRoLm1heChXIC0gdzAsIE1hdGgubWluKEUgLSBlMCwgZHgpKSwgdzEgPSB3MCArIGR4LCBlMSA9IGUwICsgZHg7CiAgICAgICAgICBpZiAoc2lnblkpIGR5ID0gTWF0aC5tYXgoTiAtIG4wLCBNYXRoLm1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgTU9ERV9IQU5ETEU6IHsKICAgICAgICAgIGlmIChzaWduWCA8IDApIGR4ID0gTWF0aC5tYXgoVyAtIHcwLCBNYXRoLm1pbihFIC0gdzAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMDsKICAgICAgICAgIGVsc2UgaWYgKHNpZ25YID4gMCkgZHggPSBNYXRoLm1heChXIC0gZTAsIE1hdGgubWluKEUgLSBlMCwgZHgpKSwgdzEgPSB3MCwgZTEgPSBlMCArIGR4OwogICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgZHkgPSBNYXRoLm1heChOIC0gbjAsIE1hdGgubWluKFMgLSBuMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwOwogICAgICAgICAgZWxzZSBpZiAoc2lnblkgPiAwKSBkeSA9IE1hdGgubWF4KE4gLSBzMCwgTWF0aC5taW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wLCBzMSA9IHMwICsgZHk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSBNT0RFX0NFTlRFUjogewogICAgICAgICAgaWYgKHNpZ25YKSB3MSA9IE1hdGgubWF4KFcsIE1hdGgubWluKEUsIHcwIC0gZHggKiBzaWduWCkpLCBlMSA9IE1hdGgubWF4KFcsIE1hdGgubWluKEUsIGUwICsgZHggKiBzaWduWCkpOwogICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIHMwICsgZHkgKiBzaWduWSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoZTEgPCB3MSkgewogICAgICAgIHNpZ25YICo9IC0xOwogICAgICAgIHQgPSB3MCwgdzAgPSBlMCwgZTAgPSB0OwogICAgICAgIHQgPSB3MSwgdzEgPSBlMSwgZTEgPSB0OwogICAgICAgIGlmICh0eXBlIGluIGZsaXBYKSBvdmVybGF5LmF0dHIoImN1cnNvciIsIGN1cnNvcnNbdHlwZSA9IGZsaXBYW3R5cGVdXSk7CiAgICAgIH0KCiAgICAgIGlmIChzMSA8IG4xKSB7CiAgICAgICAgc2lnblkgKj0gLTE7CiAgICAgICAgdCA9IG4wLCBuMCA9IHMwLCBzMCA9IHQ7CiAgICAgICAgdCA9IG4xLCBuMSA9IHMxLCBzMSA9IHQ7CiAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFkpIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29yc1t0eXBlID0gZmxpcFlbdHlwZV1dKTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbikgc2VsZWN0aW9uJCQxID0gc3RhdGUuc2VsZWN0aW9uOyAvLyBNYXkgYmUgc2V0IGJ5IGJydXNoLm1vdmUhCiAgICAgIGlmIChsb2NrWCkgdzEgPSBzZWxlY3Rpb24kJDFbMF1bMF0sIGUxID0gc2VsZWN0aW9uJCQxWzFdWzBdOwogICAgICBpZiAobG9ja1kpIG4xID0gc2VsZWN0aW9uJCQxWzBdWzFdLCBzMSA9IHNlbGVjdGlvbiQkMVsxXVsxXTsKCiAgICAgIGlmIChzZWxlY3Rpb24kJDFbMF1bMF0gIT09IHcxCiAgICAgICAgICB8fCBzZWxlY3Rpb24kJDFbMF1bMV0gIT09IG4xCiAgICAgICAgICB8fCBzZWxlY3Rpb24kJDFbMV1bMF0gIT09IGUxCiAgICAgICAgICB8fCBzZWxlY3Rpb24kJDFbMV1bMV0gIT09IHMxKSB7CiAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gW1t3MSwgbjFdLCBbZTEsIHMxXV07CiAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgZW1pdC5icnVzaCgpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZW5kZWQoKSB7CiAgICAgIG5vcHJvcGFnYXRpb24kMigpOwogICAgICBpZiAoZXhwb3J0cy5ldmVudC50b3VjaGVzKSB7CiAgICAgICAgaWYgKGV4cG9ydHMuZXZlbnQudG91Y2hlcy5sZW5ndGgpIHJldHVybjsKICAgICAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7CiAgICAgICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCEKICAgICAgICBncm91cC5vbigidG91Y2htb3ZlLmJydXNoIHRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIiwgbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgeWVzZHJhZyhleHBvcnRzLmV2ZW50LnZpZXcsIG1vdmluZyk7CiAgICAgICAgdmlldy5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsIG51bGwpOwogICAgICB9CiAgICAgIGdyb3VwLmF0dHIoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpOwogICAgICBvdmVybGF5LmF0dHIoImN1cnNvciIsIGN1cnNvcnMub3ZlcmxheSk7CiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiQkMSA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIChvbiBzdGFydCkhCiAgICAgIGlmIChlbXB0eSQxKHNlbGVjdGlvbiQkMSkpIHN0YXRlLnNlbGVjdGlvbiA9IG51bGwsIHJlZHJhdy5jYWxsKHRoYXQpOwogICAgICBlbWl0LmVuZCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGtleWRvd25lZCgpIHsKICAgICAgc3dpdGNoIChleHBvcnRzLmV2ZW50LmtleUNvZGUpIHsKICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUCiAgICAgICAgICBzaGlmdGluZyA9IHNpZ25YICYmIHNpZ25ZOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgMTg6IHsgLy8gQUxUCiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUpIHsKICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7CiAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblksIG4wID0gbjEgKyBkeSAqIHNpZ25ZOwogICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7CiAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFOyB0YWtlcyBwcmlvcml0eSBvdmVyIEFMVAogICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfSEFORExFIHx8IG1vZGUgPT09IE1PREVfQ0VOVEVSKSB7CiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTEgLSBkeDsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxIC0gZHg7CiAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczEgLSBkeTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xIC0gZHk7CiAgICAgICAgICAgIG1vZGUgPSBNT0RFX1NQQUNFOwogICAgICAgICAgICBvdmVybGF5LmF0dHIoImN1cnNvciIsIGN1cnNvcnMuc2VsZWN0aW9uKTsKICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6IHJldHVybjsKICAgICAgfQogICAgICBub2V2ZW50JDIoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBrZXl1cHBlZCgpIHsKICAgICAgc3dpdGNoIChleHBvcnRzLmV2ZW50LmtleUNvZGUpIHsKICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUCiAgICAgICAgICBpZiAoc2hpZnRpbmcpIHsKICAgICAgICAgICAgbG9ja1ggPSBsb2NrWSA9IHNoaWZ0aW5nID0gZmFsc2U7CiAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIDE4OiB7IC8vIEFMVAogICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfQ0VOVEVSKSB7CiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTsKICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xOwogICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7CiAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFCiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9TUEFDRSkgewogICAgICAgICAgICBpZiAoZXhwb3J0cy5ldmVudC5hbHRLZXkpIHsKICAgICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsgZHggKiBzaWduWDsKICAgICAgICAgICAgICBpZiAoc2lnblkpIHMwID0gczEgLSBkeSAqIHNpZ25ZLCBuMCA9IG4xICsgZHkgKiBzaWduWTsKICAgICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxOwogICAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczE7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMTsKICAgICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3ZlcmxheS5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzW3R5cGVdKTsKICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6IHJldHVybjsKICAgICAgfQogICAgICBub2V2ZW50JDIoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICB2YXIgc3RhdGUgPSB0aGlzLl9fYnJ1c2ggfHwge3NlbGVjdGlvbjogbnVsbH07CiAgICBzdGF0ZS5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHN0YXRlLmRpbSA9IGRpbTsKICAgIHJldHVybiBzdGF0ZTsKICB9CgogIGJydXNoLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDExKFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dKSwgYnJ1c2gpIDogZXh0ZW50OwogIH07CgogIGJydXNoLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDExKCEhXyksIGJydXNoKSA6IGZpbHRlcjsKICB9OwoKICBicnVzaC5oYW5kbGVTaXplID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaGFuZGxlU2l6ZSA9ICtfLCBicnVzaCkgOiBoYW5kbGVTaXplOwogIH07CgogIGJydXNoLm9uID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBicnVzaCA6IHZhbHVlOwogIH07CgogIHJldHVybiBicnVzaDsKfQoKdmFyIGNvcyA9IE1hdGguY29zOwp2YXIgc2luID0gTWF0aC5zaW47CnZhciBwaSQzID0gTWF0aC5QSTsKdmFyIGhhbGZQaSQyID0gcGkkMyAvIDI7CnZhciB0YXUkMyA9IHBpJDMgKiAyOwp2YXIgbWF4JDEgPSBNYXRoLm1heDsKCmZ1bmN0aW9uIGNvbXBhcmVWYWx1ZShjb21wYXJlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsKICAgIHJldHVybiBjb21wYXJlKAogICAgICBhLnNvdXJjZS52YWx1ZSArIGEudGFyZ2V0LnZhbHVlLAogICAgICBiLnNvdXJjZS52YWx1ZSArIGIudGFyZ2V0LnZhbHVlCiAgICApOwogIH07Cn0KCnZhciBjaG9yZCA9IGZ1bmN0aW9uKCkgewogIHZhciBwYWRBbmdsZSA9IDAsCiAgICAgIHNvcnRHcm91cHMgPSBudWxsLAogICAgICBzb3J0U3ViZ3JvdXBzID0gbnVsbCwKICAgICAgc29ydENob3JkcyA9IG51bGw7CgogIGZ1bmN0aW9uIGNob3JkKG1hdHJpeCkgewogICAgdmFyIG4gPSBtYXRyaXgubGVuZ3RoLAogICAgICAgIGdyb3VwU3VtcyA9IFtdLAogICAgICAgIGdyb3VwSW5kZXggPSByYW5nZShuKSwKICAgICAgICBzdWJncm91cEluZGV4ID0gW10sCiAgICAgICAgY2hvcmRzID0gW10sCiAgICAgICAgZ3JvdXBzID0gY2hvcmRzLmdyb3VwcyA9IG5ldyBBcnJheShuKSwKICAgICAgICBzdWJncm91cHMgPSBuZXcgQXJyYXkobiAqIG4pLAogICAgICAgIGssCiAgICAgICAgeCwKICAgICAgICB4MCwKICAgICAgICBkeCwKICAgICAgICBpLAogICAgICAgIGo7CgogICAgLy8gQ29tcHV0ZSB0aGUgc3VtLgogICAgayA9IDAsIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgeCA9IDAsIGogPSAtMTsgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICB4ICs9IG1hdHJpeFtpXVtqXTsKICAgICAgfQogICAgICBncm91cFN1bXMucHVzaCh4KTsKICAgICAgc3ViZ3JvdXBJbmRleC5wdXNoKHJhbmdlKG4pKTsKICAgICAgayArPSB4OwogICAgfQoKICAgIC8vIFNvcnQgZ3JvdXBzw6LCgMKmCiAgICBpZiAoc29ydEdyb3VwcykgZ3JvdXBJbmRleC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgcmV0dXJuIHNvcnRHcm91cHMoZ3JvdXBTdW1zW2FdLCBncm91cFN1bXNbYl0pOwogICAgfSk7CgogICAgLy8gU29ydCBzdWJncm91cHPDosKAwqYKICAgIGlmIChzb3J0U3ViZ3JvdXBzKSBzdWJncm91cEluZGV4LmZvckVhY2goZnVuY3Rpb24oZCwgaSkgewogICAgICBkLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBzb3J0U3ViZ3JvdXBzKG1hdHJpeFtpXVthXSwgbWF0cml4W2ldW2JdKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICAvLyBDb252ZXJ0IHRoZSBzdW0gdG8gc2NhbGluZyBmYWN0b3IgZm9yIFswLCAycGldLgogICAgLy8gVE9ETyBBbGxvdyBzdGFydCBhbmQgZW5kIGFuZ2xlIHRvIGJlIHNwZWNpZmllZD8KICAgIC8vIFRPRE8gQWxsb3cgcGFkZGluZyB0byBiZSBzcGVjaWZpZWQgYXMgcGVyY2VudGFnZT8KICAgIGsgPSBtYXgkMSgwLCB0YXUkMyAtIHBhZEFuZ2xlICogbikgLyBrOwogICAgZHggPSBrID8gcGFkQW5nbGUgOiB0YXUkMyAvIG47CgogICAgLy8gQ29tcHV0ZSB0aGUgc3RhcnQgYW5kIGVuZCBhbmdsZSBmb3IgZWFjaCBncm91cCBhbmQgc3ViZ3JvdXAuCiAgICAvLyBOb3RlOiBPcGVyYSBoYXMgYSBidWcgcmVvcmRlcmluZyBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0aWVzIQogICAgeCA9IDAsIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgeDAgPSB4LCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7CiAgICAgICAgdmFyIGRpID0gZ3JvdXBJbmRleFtpXSwKICAgICAgICAgICAgZGogPSBzdWJncm91cEluZGV4W2RpXVtqXSwKICAgICAgICAgICAgdiA9IG1hdHJpeFtkaV1bZGpdLAogICAgICAgICAgICBhMCA9IHgsCiAgICAgICAgICAgIGExID0geCArPSB2ICogazsKICAgICAgICBzdWJncm91cHNbZGogKiBuICsgZGldID0gewogICAgICAgICAgaW5kZXg6IGRpLAogICAgICAgICAgc3ViaW5kZXg6IGRqLAogICAgICAgICAgc3RhcnRBbmdsZTogYTAsCiAgICAgICAgICBlbmRBbmdsZTogYTEsCiAgICAgICAgICB2YWx1ZTogdgogICAgICAgIH07CiAgICAgIH0KICAgICAgZ3JvdXBzW2RpXSA9IHsKICAgICAgICBpbmRleDogZGksCiAgICAgICAgc3RhcnRBbmdsZTogeDAsCiAgICAgICAgZW5kQW5nbGU6IHgsCiAgICAgICAgdmFsdWU6IGdyb3VwU3Vtc1tkaV0KICAgICAgfTsKICAgICAgeCArPSBkeDsKICAgIH0KCiAgICAvLyBHZW5lcmF0ZSBjaG9yZHMgZm9yIGVhY2ggKG5vbi1lbXB0eSkgc3ViZ3JvdXAtc3ViZ3JvdXAgbGluay4KICAgIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgaiA9IGkgLSAxOyB3aGlsZSAoKytqIDwgbikgewogICAgICAgIHZhciBzb3VyY2UgPSBzdWJncm91cHNbaiAqIG4gKyBpXSwKICAgICAgICAgICAgdGFyZ2V0ID0gc3ViZ3JvdXBzW2kgKiBuICsgal07CiAgICAgICAgaWYgKHNvdXJjZS52YWx1ZSB8fCB0YXJnZXQudmFsdWUpIHsKICAgICAgICAgIGNob3Jkcy5wdXNoKHNvdXJjZS52YWx1ZSA8IHRhcmdldC52YWx1ZQogICAgICAgICAgICAgID8ge3NvdXJjZTogdGFyZ2V0LCB0YXJnZXQ6IHNvdXJjZX0KICAgICAgICAgICAgICA6IHtzb3VyY2U6IHNvdXJjZSwgdGFyZ2V0OiB0YXJnZXR9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc29ydENob3JkcyA/IGNob3Jkcy5zb3J0KHNvcnRDaG9yZHMpIDogY2hvcmRzOwogIH0KCiAgY2hvcmQucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IG1heCQxKDAsIF8pLCBjaG9yZCkgOiBwYWRBbmdsZTsKICB9OwoKICBjaG9yZC5zb3J0R3JvdXBzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydEdyb3VwcyA9IF8sIGNob3JkKSA6IHNvcnRHcm91cHM7CiAgfTsKCiAgY2hvcmQuc29ydFN1Ymdyb3VwcyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnRTdWJncm91cHMgPSBfLCBjaG9yZCkgOiBzb3J0U3ViZ3JvdXBzOwogIH07CgogIGNob3JkLnNvcnRDaG9yZHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBzb3J0Q2hvcmRzID0gbnVsbCA6IChzb3J0Q2hvcmRzID0gY29tcGFyZVZhbHVlKF8pKS5fID0gXywgY2hvcmQpIDogc29ydENob3JkcyAmJiBzb3J0Q2hvcmRzLl87CiAgfTsKCiAgcmV0dXJuIGNob3JkOwp9Cgp2YXIgc2xpY2UkNSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKCnZhciBjb25zdGFudCQxMiA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9CgpmdW5jdGlvbiBkZWZhdWx0U291cmNlKGQpIHsKICByZXR1cm4gZC5zb3VyY2U7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRUYXJnZXQoZCkgewogIHJldHVybiBkLnRhcmdldDsKfQoKZnVuY3Rpb24gZGVmYXVsdFJhZGl1cyQxKGQpIHsKICByZXR1cm4gZC5yYWRpdXM7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRTdGFydEFuZ2xlKGQpIHsKICByZXR1cm4gZC5zdGFydEFuZ2xlOwp9CgpmdW5jdGlvbiBkZWZhdWx0RW5kQW5nbGUoZCkgewogIHJldHVybiBkLmVuZEFuZ2xlOwp9Cgp2YXIgcmliYm9uID0gZnVuY3Rpb24oKSB7CiAgdmFyIHNvdXJjZSA9IGRlZmF1bHRTb3VyY2UsCiAgICAgIHRhcmdldCA9IGRlZmF1bHRUYXJnZXQsCiAgICAgIHJhZGl1cyA9IGRlZmF1bHRSYWRpdXMkMSwKICAgICAgc3RhcnRBbmdsZSA9IGRlZmF1bHRTdGFydEFuZ2xlLAogICAgICBlbmRBbmdsZSA9IGRlZmF1bHRFbmRBbmdsZSwKICAgICAgY29udGV4dCA9IG51bGw7CgogIGZ1bmN0aW9uIHJpYmJvbigpIHsKICAgIHZhciBidWZmZXIsCiAgICAgICAgYXJndiA9IHNsaWNlJDUuY2FsbChhcmd1bWVudHMpLAogICAgICAgIHMgPSBzb3VyY2UuYXBwbHkodGhpcywgYXJndiksCiAgICAgICAgdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmd2KSwKICAgICAgICBzciA9ICtyYWRpdXMuYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSBzLCBhcmd2KSksCiAgICAgICAgc2EwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd2KSAtIGhhbGZQaSQyLAogICAgICAgIHNhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3YpIC0gaGFsZlBpJDIsCiAgICAgICAgc3gwID0gc3IgKiBjb3Moc2EwKSwKICAgICAgICBzeTAgPSBzciAqIHNpbihzYTApLAogICAgICAgIHRyID0gK3JhZGl1cy5hcHBseSh0aGlzLCAoYXJndlswXSA9IHQsIGFyZ3YpKSwKICAgICAgICB0YTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3YpIC0gaGFsZlBpJDIsCiAgICAgICAgdGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkMjsKCiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7CgogICAgY29udGV4dC5tb3ZlVG8oc3gwLCBzeTApOwogICAgY29udGV4dC5hcmMoMCwgMCwgc3IsIHNhMCwgc2ExKTsKICAgIGlmIChzYTAgIT09IHRhMCB8fCBzYTEgIT09IHRhMSkgeyAvLyBUT0RPIHNyICE9PSB0cj8KICAgICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKDAsIDAsIHRyICogY29zKHRhMCksIHRyICogc2luKHRhMCkpOwogICAgICBjb250ZXh0LmFyYygwLCAwLCB0ciwgdGEwLCB0YTEpOwogICAgfQogICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKDAsIDAsIHN4MCwgc3kwKTsKICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CgogICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyAiIiB8fCBudWxsOwogIH0KCiAgcmliYm9uLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDEyKCtfKSwgcmliYm9uKSA6IHJhZGl1czsKICB9OwoKICByaWJib24uc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQxMigrXyksIHJpYmJvbikgOiBzdGFydEFuZ2xlOwogIH07CgogIHJpYmJvbi5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMTIoK18pLCByaWJib24pIDogZW5kQW5nbGU7CiAgfTsKCiAgcmliYm9uLnNvdXJjZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvdXJjZSA9IF8sIHJpYmJvbikgOiBzb3VyY2U7CiAgfTsKCiAgcmliYm9uLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcmdldCA9IF8sIHJpYmJvbikgOiB0YXJnZXQ7CiAgfTsKCiAgcmliYm9uLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgcmliYm9uKSA6IGNvbnRleHQ7CiAgfTsKCiAgcmV0dXJuIHJpYmJvbjsKfQoKLy8gQWRkcyBmbG9hdGluZyBwb2ludCBudW1iZXJzIHdpdGggdHdpY2UgdGhlIG5vcm1hbCBwcmVjaXNpb24uCi8vIFJlZmVyZW5jZTogSi4gUi4gU2hld2NodWssIEFkYXB0aXZlIFByZWNpc2lvbiBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljIGFuZAovLyBGYXN0IFJvYnVzdCBHZW9tZXRyaWMgUHJlZGljYXRlcywgRGlzY3JldGUgJiBDb21wdXRhdGlvbmFsIEdlb21ldHJ5IDE4KDMpCi8vIDMwNcOiwoDCkzM2MyAoMTk5NykuCi8vIENvZGUgYWRhcHRlZCBmcm9tIEdlb2dyYXBoaWNMaWIgYnkgQ2hhcmxlcyBGLiBGLiBLYXJuZXksCi8vIGh0dHA6Ly9nZW9ncmFwaGljbGliLnNvdXJjZWZvcmdlLm5ldC8KCnZhciBhZGRlciA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgQWRkZXI7Cn0KCmZ1bmN0aW9uIEFkZGVyKCkgewogIHRoaXMucmVzZXQoKTsKfQoKQWRkZXIucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBBZGRlciwKICByZXNldDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnMgPSAvLyByb3VuZGVkIHZhbHVlCiAgICB0aGlzLnQgPSAwOyAvLyBleGFjdCBlcnJvcgogIH0sCiAgYWRkOiBmdW5jdGlvbih5KSB7CiAgICBhZGQkMSh0ZW1wLCB5LCB0aGlzLnQpOwogICAgYWRkJDEodGhpcywgdGVtcC5zLCB0aGlzLnMpOwogICAgaWYgKHRoaXMucykgdGhpcy50ICs9IHRlbXAudDsKICAgIGVsc2UgdGhpcy5zID0gdGVtcC50OwogIH0sCiAgdmFsdWVPZjogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5zOwogIH0KfTsKCnZhciB0ZW1wID0gbmV3IEFkZGVyOwoKZnVuY3Rpb24gYWRkJDEoYWRkZXIsIGEsIGIpIHsKICB2YXIgeCA9IGFkZGVyLnMgPSBhICsgYiwKICAgICAgYnYgPSB4IC0gYSwKICAgICAgYXYgPSB4IC0gYnY7CiAgYWRkZXIudCA9IChhIC0gYXYpICsgKGIgLSBidik7Cn0KCnZhciBlcHNpbG9uJDQgPSAxZS02Owp2YXIgZXBzaWxvbjIkMiA9IDFlLTEyOwp2YXIgcGkkNCA9IE1hdGguUEk7CnZhciBoYWxmUGkkMyA9IHBpJDQgLyAyOwp2YXIgcXVhcnRlclBpID0gcGkkNCAvIDQ7CnZhciB0YXUkNCA9IHBpJDQgKiAyOwoKdmFyIGRlZ3JlZXMkMSA9IDE4MCAvIHBpJDQ7CnZhciByYWRpYW5zID0gcGkkNCAvIDE4MDsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIGF0YW4gPSBNYXRoLmF0YW47CnZhciBhdGFuMiA9IE1hdGguYXRhbjI7CnZhciBjb3MkMSA9IE1hdGguY29zOwp2YXIgY2VpbCA9IE1hdGguY2VpbDsKdmFyIGV4cCA9IE1hdGguZXhwOwoKdmFyIGxvZyQxID0gTWF0aC5sb2c7CnZhciBwb3ckMSA9IE1hdGgucG93Owp2YXIgc2luJDEgPSBNYXRoLnNpbjsKdmFyIHNpZ24kMSA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbih4KSB7IHJldHVybiB4ID4gMCA/IDEgOiB4IDwgMCA/IC0xIDogMDsgfTsKdmFyIHNxcnQkMSA9IE1hdGguc3FydDsKdmFyIHRhbiA9IE1hdGgudGFuOwoKZnVuY3Rpb24gYWNvcyh4KSB7CiAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IHBpJDQgOiBNYXRoLmFjb3MoeCk7Cn0KCmZ1bmN0aW9uIGFzaW4kMSh4KSB7CiAgcmV0dXJuIHggPiAxID8gaGFsZlBpJDMgOiB4IDwgLTEgPyAtaGFsZlBpJDMgOiBNYXRoLmFzaW4oeCk7Cn0KCmZ1bmN0aW9uIGhhdmVyc2luKHgpIHsKICByZXR1cm4gKHggPSBzaW4kMSh4IC8gMikpICogeDsKfQoKZnVuY3Rpb24gbm9vcCQyKCkge30KCmZ1bmN0aW9uIHN0cmVhbUdlb21ldHJ5KGdlb21ldHJ5LCBzdHJlYW0pIHsKICBpZiAoZ2VvbWV0cnkgJiYgc3RyZWFtR2VvbWV0cnlUeXBlLmhhc093blByb3BlcnR5KGdlb21ldHJ5LnR5cGUpKSB7CiAgICBzdHJlYW1HZW9tZXRyeVR5cGVbZ2VvbWV0cnkudHlwZV0oZ2VvbWV0cnksIHN0cmVhbSk7CiAgfQp9Cgp2YXIgc3RyZWFtT2JqZWN0VHlwZSA9IHsKICBGZWF0dXJlOiBmdW5jdGlvbihmZWF0dXJlLCBzdHJlYW0pIHsKICAgIHN0cmVhbUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIHN0cmVhbSk7CiAgfSwKICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgIHZhciBmZWF0dXJlcyA9IG9iamVjdC5mZWF0dXJlcywgaSA9IC0xLCBuID0gZmVhdHVyZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUdlb21ldHJ5KGZlYXR1cmVzW2ldLmdlb21ldHJ5LCBzdHJlYW0pOwogIH0KfTsKCnZhciBzdHJlYW1HZW9tZXRyeVR5cGUgPSB7CiAgU3BoZXJlOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgc3RyZWFtLnNwaGVyZSgpOwogIH0sCiAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICBvYmplY3QgPSBvYmplY3QuY29vcmRpbmF0ZXM7CiAgICBzdHJlYW0ucG9pbnQob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSk7CiAgfSwKICBNdWx0aVBvaW50OiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICB3aGlsZSAoKytpIDwgbikgb2JqZWN0ID0gY29vcmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTsKICB9LAogIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICBzdHJlYW1MaW5lKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtLCAwKTsKICB9LAogIE11bHRpTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSwgMCk7CiAgfSwKICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgc3RyZWFtUG9seWdvbihvYmplY3QuY29vcmRpbmF0ZXMsIHN0cmVhbSk7CiAgfSwKICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0pOwogIH0sCiAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgdmFyIGdlb21ldHJpZXMgPSBvYmplY3QuZ2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7CiAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgc3RyZWFtKTsKICB9Cn07CgpmdW5jdGlvbiBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzLCBzdHJlYW0sIGNsb3NlZCkgewogIHZhciBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGggLSBjbG9zZWQsIGNvb3JkaW5hdGU7CiAgc3RyZWFtLmxpbmVTdGFydCgpOwogIHdoaWxlICgrK2kgPCBuKSBjb29yZGluYXRlID0gY29vcmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChjb29yZGluYXRlWzBdLCBjb29yZGluYXRlWzFdLCBjb29yZGluYXRlWzJdKTsKICBzdHJlYW0ubGluZUVuZCgpOwp9CgpmdW5jdGlvbiBzdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzLCBzdHJlYW0pIHsKICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICB3aGlsZSAoKytpIDwgbikgc3RyZWFtTGluZShjb29yZGluYXRlc1tpXSwgc3RyZWFtLCAxKTsKICBzdHJlYW0ucG9seWdvbkVuZCgpOwp9Cgp2YXIgZ2VvU3RyZWFtID0gZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICBpZiAob2JqZWN0ICYmIHN0cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7CiAgICBzdHJlYW1PYmplY3RUeXBlW29iamVjdC50eXBlXShvYmplY3QsIHN0cmVhbSk7CiAgfSBlbHNlIHsKICAgIHN0cmVhbUdlb21ldHJ5KG9iamVjdCwgc3RyZWFtKTsKICB9Cn0KCnZhciBhcmVhUmluZ1N1bSA9IGFkZGVyKCk7Cgp2YXIgYXJlYVN1bSA9IGFkZGVyKCk7CnZhciBsYW1iZGEwMDsKdmFyIHBoaTAwOwp2YXIgbGFtYmRhMDsKdmFyIGNvc1BoaTA7CnZhciBzaW5QaGkwOwoKdmFyIGFyZWFTdHJlYW0gPSB7CiAgcG9pbnQ6IG5vb3AkMiwKICBsaW5lU3RhcnQ6IG5vb3AkMiwKICBsaW5lRW5kOiBub29wJDIsCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIGFyZWFSaW5nU3VtLnJlc2V0KCk7CiAgICBhcmVhU3RyZWFtLmxpbmVTdGFydCA9IGFyZWFSaW5nU3RhcnQ7CiAgICBhcmVhU3RyZWFtLmxpbmVFbmQgPSBhcmVhUmluZ0VuZDsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGFyZWFSaW5nID0gK2FyZWFSaW5nU3VtOwogICAgYXJlYVN1bS5hZGQoYXJlYVJpbmcgPCAwID8gdGF1JDQgKyBhcmVhUmluZyA6IGFyZWFSaW5nKTsKICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5saW5lRW5kID0gdGhpcy5wb2ludCA9IG5vb3AkMjsKICB9LAogIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICBhcmVhU3VtLmFkZCh0YXUkNCk7CiAgfQp9OwoKZnVuY3Rpb24gYXJlYVJpbmdTdGFydCgpIHsKICBhcmVhU3RyZWFtLnBvaW50ID0gYXJlYVBvaW50Rmlyc3Q7Cn0KCmZ1bmN0aW9uIGFyZWFSaW5nRW5kKCkgewogIGFyZWFQb2ludChsYW1iZGEwMCwgcGhpMDApOwp9CgpmdW5jdGlvbiBhcmVhUG9pbnRGaXJzdChsYW1iZGEsIHBoaSkgewogIGFyZWFTdHJlYW0ucG9pbnQgPSBhcmVhUG9pbnQ7CiAgbGFtYmRhMDAgPSBsYW1iZGEsIHBoaTAwID0gcGhpOwogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICBsYW1iZGEwID0gbGFtYmRhLCBjb3NQaGkwID0gY29zJDEocGhpID0gcGhpIC8gMiArIHF1YXJ0ZXJQaSksIHNpblBoaTAgPSBzaW4kMShwaGkpOwp9CgpmdW5jdGlvbiBhcmVhUG9pbnQobGFtYmRhLCBwaGkpIHsKICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7CiAgcGhpID0gcGhpIC8gMiArIHF1YXJ0ZXJQaTsgLy8gaGFsZiB0aGUgYW5ndWxhciBkaXN0YW5jZSBmcm9tIHNvdXRoIHBvbGUKCiAgLy8gU3BoZXJpY2FsIGV4Y2VzcyBFIGZvciBhIHNwaGVyaWNhbCB0cmlhbmdsZSB3aXRoIHZlcnRpY2VzOiBzb3V0aCBwb2xlLAogIC8vIHByZXZpb3VzIHBvaW50LCBjdXJyZW50IHBvaW50LiAgVXNlcyBhIGZvcm11bGEgZGVyaXZlZCBmcm9tIENhZ25vbGnDosKAwplzCiAgLy8gdGhlb3JlbS4gIFNlZSBUb2RodW50ZXIsIFNwaGVyaWNhbCBUcmlnLiAoMTg3MSksIFNlYy4gMTAzLCBFcS4gKDIpLgogIHZhciBkTGFtYmRhID0gbGFtYmRhIC0gbGFtYmRhMCwKICAgICAgc2RMYW1iZGEgPSBkTGFtYmRhID49IDAgPyAxIDogLTEsCiAgICAgIGFkTGFtYmRhID0gc2RMYW1iZGEgKiBkTGFtYmRhLAogICAgICBjb3NQaGkgPSBjb3MkMShwaGkpLAogICAgICBzaW5QaGkgPSBzaW4kMShwaGkpLAogICAgICBrID0gc2luUGhpMCAqIHNpblBoaSwKICAgICAgdSA9IGNvc1BoaTAgKiBjb3NQaGkgKyBrICogY29zJDEoYWRMYW1iZGEpLAogICAgICB2ID0gayAqIHNkTGFtYmRhICogc2luJDEoYWRMYW1iZGEpOwogIGFyZWFSaW5nU3VtLmFkZChhdGFuMih2LCB1KSk7CgogIC8vIEFkdmFuY2UgdGhlIHByZXZpb3VzIHBvaW50cy4KICBsYW1iZGEwID0gbGFtYmRhLCBjb3NQaGkwID0gY29zUGhpLCBzaW5QaGkwID0gc2luUGhpOwp9Cgp2YXIgYXJlYSQyID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgYXJlYVN1bS5yZXNldCgpOwogIGdlb1N0cmVhbShvYmplY3QsIGFyZWFTdHJlYW0pOwogIHJldHVybiBhcmVhU3VtICogMjsKfQoKZnVuY3Rpb24gc3BoZXJpY2FsKGNhcnRlc2lhbikgewogIHJldHVybiBbYXRhbjIoY2FydGVzaWFuWzFdLCBjYXJ0ZXNpYW5bMF0pLCBhc2luJDEoY2FydGVzaWFuWzJdKV07Cn0KCmZ1bmN0aW9uIGNhcnRlc2lhbihzcGhlcmljYWwpIHsKICB2YXIgbGFtYmRhID0gc3BoZXJpY2FsWzBdLCBwaGkgPSBzcGhlcmljYWxbMV0sIGNvc1BoaSA9IGNvcyQxKHBoaSk7CiAgcmV0dXJuIFtjb3NQaGkgKiBjb3MkMShsYW1iZGEpLCBjb3NQaGkgKiBzaW4kMShsYW1iZGEpLCBzaW4kMShwaGkpXTsKfQoKZnVuY3Rpb24gY2FydGVzaWFuRG90KGEsIGIpIHsKICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdOwp9CgpmdW5jdGlvbiBjYXJ0ZXNpYW5Dcm9zcyhhLCBiKSB7CiAgcmV0dXJuIFthWzFdICogYlsyXSAtIGFbMl0gKiBiWzFdLCBhWzJdICogYlswXSAtIGFbMF0gKiBiWzJdLCBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdXTsKfQoKLy8gVE9ETyByZXR1cm4gYQpmdW5jdGlvbiBjYXJ0ZXNpYW5BZGRJblBsYWNlKGEsIGIpIHsKICBhWzBdICs9IGJbMF0sIGFbMV0gKz0gYlsxXSwgYVsyXSArPSBiWzJdOwp9CgpmdW5jdGlvbiBjYXJ0ZXNpYW5TY2FsZSh2ZWN0b3IsIGspIHsKICByZXR1cm4gW3ZlY3RvclswXSAqIGssIHZlY3RvclsxXSAqIGssIHZlY3RvclsyXSAqIGtdOwp9CgovLyBUT0RPIHJldHVybiBkCmZ1bmN0aW9uIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoZCkgewogIHZhciBsID0gc3FydCQxKGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV0gKyBkWzJdICogZFsyXSk7CiAgZFswXSAvPSBsLCBkWzFdIC89IGwsIGRbMl0gLz0gbDsKfQoKdmFyIGxhbWJkYTAkMTsKdmFyIHBoaTA7CnZhciBsYW1iZGExOwp2YXIgcGhpMTsKdmFyIGxhbWJkYTI7CnZhciBsYW1iZGEwMCQxOwp2YXIgcGhpMDAkMTsKdmFyIHAwOwp2YXIgZGVsdGFTdW0gPSBhZGRlcigpOwp2YXIgcmFuZ2VzOwp2YXIgcmFuZ2UkMTsKCnZhciBib3VuZHNTdHJlYW0gPSB7CiAgcG9pbnQ6IGJvdW5kc1BvaW50LAogIGxpbmVTdGFydDogYm91bmRzTGluZVN0YXJ0LAogIGxpbmVFbmQ6IGJvdW5kc0xpbmVFbmQsCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIGJvdW5kc1N0cmVhbS5wb2ludCA9IGJvdW5kc1JpbmdQb2ludDsKICAgIGJvdW5kc1N0cmVhbS5saW5lU3RhcnQgPSBib3VuZHNSaW5nU3RhcnQ7CiAgICBib3VuZHNTdHJlYW0ubGluZUVuZCA9IGJvdW5kc1JpbmdFbmQ7CiAgICBkZWx0YVN1bS5yZXNldCgpOwogICAgYXJlYVN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgYXJlYVN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICBib3VuZHNTdHJlYW0ucG9pbnQgPSBib3VuZHNQb2ludDsKICAgIGJvdW5kc1N0cmVhbS5saW5lU3RhcnQgPSBib3VuZHNMaW5lU3RhcnQ7CiAgICBib3VuZHNTdHJlYW0ubGluZUVuZCA9IGJvdW5kc0xpbmVFbmQ7CiAgICBpZiAoYXJlYVJpbmdTdW0gPCAwKSBsYW1iZGEwJDEgPSAtKGxhbWJkYTEgPSAxODApLCBwaGkwID0gLShwaGkxID0gOTApOwogICAgZWxzZSBpZiAoZGVsdGFTdW0gPiBlcHNpbG9uJDQpIHBoaTEgPSA5MDsKICAgIGVsc2UgaWYgKGRlbHRhU3VtIDwgLWVwc2lsb24kNCkgcGhpMCA9IC05MDsKICAgIHJhbmdlJDFbMF0gPSBsYW1iZGEwJDEsIHJhbmdlJDFbMV0gPSBsYW1iZGExOwogIH0KfTsKCmZ1bmN0aW9uIGJvdW5kc1BvaW50KGxhbWJkYSwgcGhpKSB7CiAgcmFuZ2VzLnB1c2gocmFuZ2UkMSA9IFtsYW1iZGEwJDEgPSBsYW1iZGEsIGxhbWJkYTEgPSBsYW1iZGFdKTsKICBpZiAocGhpIDwgcGhpMCkgcGhpMCA9IHBoaTsKICBpZiAocGhpID4gcGhpMSkgcGhpMSA9IHBoaTsKfQoKZnVuY3Rpb24gbGluZVBvaW50KGxhbWJkYSwgcGhpKSB7CiAgdmFyIHAgPSBjYXJ0ZXNpYW4oW2xhbWJkYSAqIHJhZGlhbnMsIHBoaSAqIHJhZGlhbnNdKTsKICBpZiAocDApIHsKICAgIHZhciBub3JtYWwgPSBjYXJ0ZXNpYW5Dcm9zcyhwMCwgcCksCiAgICAgICAgZXF1YXRvcmlhbCA9IFtub3JtYWxbMV0sIC1ub3JtYWxbMF0sIDBdLAogICAgICAgIGluZmxlY3Rpb24gPSBjYXJ0ZXNpYW5Dcm9zcyhlcXVhdG9yaWFsLCBub3JtYWwpOwogICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShpbmZsZWN0aW9uKTsKICAgIGluZmxlY3Rpb24gPSBzcGhlcmljYWwoaW5mbGVjdGlvbik7CiAgICB2YXIgZGVsdGEgPSBsYW1iZGEgLSBsYW1iZGEyLAogICAgICAgIHNpZ24kJDEgPSBkZWx0YSA+IDAgPyAxIDogLTEsCiAgICAgICAgbGFtYmRhaSA9IGluZmxlY3Rpb25bMF0gKiBkZWdyZWVzJDEgKiBzaWduJCQxLAogICAgICAgIHBoaWksCiAgICAgICAgYW50aW1lcmlkaWFuID0gYWJzKGRlbHRhKSA+IDE4MDsKICAgIGlmIChhbnRpbWVyaWRpYW4gXiAoc2lnbiQkMSAqIGxhbWJkYTIgPCBsYW1iZGFpICYmIGxhbWJkYWkgPCBzaWduJCQxICogbGFtYmRhKSkgewogICAgICBwaGlpID0gaW5mbGVjdGlvblsxXSAqIGRlZ3JlZXMkMTsKICAgICAgaWYgKHBoaWkgPiBwaGkxKSBwaGkxID0gcGhpaTsKICAgIH0gZWxzZSBpZiAobGFtYmRhaSA9IChsYW1iZGFpICsgMzYwKSAlIDM2MCAtIDE4MCwgYW50aW1lcmlkaWFuIF4gKHNpZ24kJDEgKiBsYW1iZGEyIDwgbGFtYmRhaSAmJiBsYW1iZGFpIDwgc2lnbiQkMSAqIGxhbWJkYSkpIHsKICAgICAgcGhpaSA9IC1pbmZsZWN0aW9uWzFdICogZGVncmVlcyQxOwogICAgICBpZiAocGhpaSA8IHBoaTApIHBoaTAgPSBwaGlpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHBoaSA8IHBoaTApIHBoaTAgPSBwaGk7CiAgICAgIGlmIChwaGkgPiBwaGkxKSBwaGkxID0gcGhpOwogICAgfQogICAgaWYgKGFudGltZXJpZGlhbikgewogICAgICBpZiAobGFtYmRhIDwgbGFtYmRhMikgewogICAgICAgIGlmIChhbmdsZShsYW1iZGEwJDEsIGxhbWJkYSkgPiBhbmdsZShsYW1iZGEwJDEsIGxhbWJkYTEpKSBsYW1iZGExID0gbGFtYmRhOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChhbmdsZShsYW1iZGEsIGxhbWJkYTEpID4gYW5nbGUobGFtYmRhMCQxLCBsYW1iZGExKSkgbGFtYmRhMCQxID0gbGFtYmRhOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobGFtYmRhMSA+PSBsYW1iZGEwJDEpIHsKICAgICAgICBpZiAobGFtYmRhIDwgbGFtYmRhMCQxKSBsYW1iZGEwJDEgPSBsYW1iZGE7CiAgICAgICAgaWYgKGxhbWJkYSA+IGxhbWJkYTEpIGxhbWJkYTEgPSBsYW1iZGE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGxhbWJkYSA+IGxhbWJkYTIpIHsKICAgICAgICAgIGlmIChhbmdsZShsYW1iZGEwJDEsIGxhbWJkYSkgPiBhbmdsZShsYW1iZGEwJDEsIGxhbWJkYTEpKSBsYW1iZGExID0gbGFtYmRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoYW5nbGUobGFtYmRhLCBsYW1iZGExKSA+IGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhMSkpIGxhbWJkYTAkMSA9IGxhbWJkYTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgYm91bmRzUG9pbnQobGFtYmRhLCBwaGkpOwogIH0KICBwMCA9IHAsIGxhbWJkYTIgPSBsYW1iZGE7Cn0KCmZ1bmN0aW9uIGJvdW5kc0xpbmVTdGFydCgpIHsKICBib3VuZHNTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7Cn0KCmZ1bmN0aW9uIGJvdW5kc0xpbmVFbmQoKSB7CiAgcmFuZ2UkMVswXSA9IGxhbWJkYTAkMSwgcmFuZ2UkMVsxXSA9IGxhbWJkYTE7CiAgYm91bmRzU3RyZWFtLnBvaW50ID0gYm91bmRzUG9pbnQ7CiAgcDAgPSBudWxsOwp9CgpmdW5jdGlvbiBib3VuZHNSaW5nUG9pbnQobGFtYmRhLCBwaGkpIHsKICBpZiAocDApIHsKICAgIHZhciBkZWx0YSA9IGxhbWJkYSAtIGxhbWJkYTI7CiAgICBkZWx0YVN1bS5hZGQoYWJzKGRlbHRhKSA+IDE4MCA/IGRlbHRhICsgKGRlbHRhID4gMCA/IDM2MCA6IC0zNjApIDogZGVsdGEpOwogIH0gZWxzZSB7CiAgICBsYW1iZGEwMCQxID0gbGFtYmRhLCBwaGkwMCQxID0gcGhpOwogIH0KICBhcmVhU3RyZWFtLnBvaW50KGxhbWJkYSwgcGhpKTsKICBsaW5lUG9pbnQobGFtYmRhLCBwaGkpOwp9CgpmdW5jdGlvbiBib3VuZHNSaW5nU3RhcnQoKSB7CiAgYXJlYVN0cmVhbS5saW5lU3RhcnQoKTsKfQoKZnVuY3Rpb24gYm91bmRzUmluZ0VuZCgpIHsKICBib3VuZHNSaW5nUG9pbnQobGFtYmRhMDAkMSwgcGhpMDAkMSk7CiAgYXJlYVN0cmVhbS5saW5lRW5kKCk7CiAgaWYgKGFicyhkZWx0YVN1bSkgPiBlcHNpbG9uJDQpIGxhbWJkYTAkMSA9IC0obGFtYmRhMSA9IDE4MCk7CiAgcmFuZ2UkMVswXSA9IGxhbWJkYTAkMSwgcmFuZ2UkMVsxXSA9IGxhbWJkYTE7CiAgcDAgPSBudWxsOwp9CgovLyBGaW5kcyB0aGUgbGVmdC1yaWdodCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBsb25naXR1ZGVzLgovLyBUaGlzIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyAobGFtYmRhMSAtIGxhbWJkYTAgKyAzNjDDgsKwKSAlIDM2MMOCwrAsIGV4Y2VwdCB0aGF0IHdlIHdhbnQKLy8gdGhlIGRpc3RhbmNlIGJldHdlZW4gw4LCsTE4MMOCwrAgdG8gYmUgMzYww4LCsC4KZnVuY3Rpb24gYW5nbGUobGFtYmRhMCwgbGFtYmRhMSkgewogIHJldHVybiAobGFtYmRhMSAtPSBsYW1iZGEwKSA8IDAgPyBsYW1iZGExICsgMzYwIDogbGFtYmRhMTsKfQoKZnVuY3Rpb24gcmFuZ2VDb21wYXJlKGEsIGIpIHsKICByZXR1cm4gYVswXSAtIGJbMF07Cn0KCmZ1bmN0aW9uIHJhbmdlQ29udGFpbnMocmFuZ2UsIHgpIHsKICByZXR1cm4gcmFuZ2VbMF0gPD0gcmFuZ2VbMV0gPyByYW5nZVswXSA8PSB4ICYmIHggPD0gcmFuZ2VbMV0gOiB4IDwgcmFuZ2VbMF0gfHwgcmFuZ2VbMV0gPCB4Owp9Cgp2YXIgYm91bmRzID0gZnVuY3Rpb24oZmVhdHVyZSkgewogIHZhciBpLCBuLCBhLCBiLCBtZXJnZWQsIGRlbHRhTWF4LCBkZWx0YTsKCiAgcGhpMSA9IGxhbWJkYTEgPSAtKGxhbWJkYTAkMSA9IHBoaTAgPSBJbmZpbml0eSk7CiAgcmFuZ2VzID0gW107CiAgZ2VvU3RyZWFtKGZlYXR1cmUsIGJvdW5kc1N0cmVhbSk7CgogIC8vIEZpcnN0LCBzb3J0IHJhbmdlcyBieSB0aGVpciBtaW5pbXVtIGxvbmdpdHVkZXMuCiAgaWYgKG4gPSByYW5nZXMubGVuZ3RoKSB7CiAgICByYW5nZXMuc29ydChyYW5nZUNvbXBhcmUpOwoKICAgIC8vIFRoZW4sIG1lcmdlIGFueSByYW5nZXMgdGhhdCBvdmVybGFwLgogICAgZm9yIChpID0gMSwgYSA9IHJhbmdlc1swXSwgbWVyZ2VkID0gW2FdOyBpIDwgbjsgKytpKSB7CiAgICAgIGIgPSByYW5nZXNbaV07CiAgICAgIGlmIChyYW5nZUNvbnRhaW5zKGEsIGJbMF0pIHx8IHJhbmdlQ29udGFpbnMoYSwgYlsxXSkpIHsKICAgICAgICBpZiAoYW5nbGUoYVswXSwgYlsxXSkgPiBhbmdsZShhWzBdLCBhWzFdKSkgYVsxXSA9IGJbMV07CiAgICAgICAgaWYgKGFuZ2xlKGJbMF0sIGFbMV0pID4gYW5nbGUoYVswXSwgYVsxXSkpIGFbMF0gPSBiWzBdOwogICAgICB9IGVsc2UgewogICAgICAgIG1lcmdlZC5wdXNoKGEgPSBiKTsKICAgICAgfQogICAgfQoKICAgIC8vIEZpbmFsbHksIGZpbmQgdGhlIGxhcmdlc3QgZ2FwIGJldHdlZW4gdGhlIG1lcmdlZCByYW5nZXMuCiAgICAvLyBUaGUgZmluYWwgYm91bmRpbmcgYm94IHdpbGwgYmUgdGhlIGludmVyc2Ugb2YgdGhpcyBnYXAuCiAgICBmb3IgKGRlbHRhTWF4ID0gLUluZmluaXR5LCBuID0gbWVyZ2VkLmxlbmd0aCAtIDEsIGkgPSAwLCBhID0gbWVyZ2VkW25dOyBpIDw9IG47IGEgPSBiLCArK2kpIHsKICAgICAgYiA9IG1lcmdlZFtpXTsKICAgICAgaWYgKChkZWx0YSA9IGFuZ2xlKGFbMV0sIGJbMF0pKSA+IGRlbHRhTWF4KSBkZWx0YU1heCA9IGRlbHRhLCBsYW1iZGEwJDEgPSBiWzBdLCBsYW1iZGExID0gYVsxXTsKICAgIH0KICB9CgogIHJhbmdlcyA9IHJhbmdlJDEgPSBudWxsOwoKICByZXR1cm4gbGFtYmRhMCQxID09PSBJbmZpbml0eSB8fCBwaGkwID09PSBJbmZpbml0eQogICAgICA/IFtbTmFOLCBOYU5dLCBbTmFOLCBOYU5dXQogICAgICA6IFtbbGFtYmRhMCQxLCBwaGkwXSwgW2xhbWJkYTEsIHBoaTFdXTsKfQoKdmFyIFcwOwp2YXIgVzE7CnZhciBYMDsKdmFyIFkwOwp2YXIgWjA7CnZhciBYMTsKdmFyIFkxOwp2YXIgWjE7CnZhciBYMjsKdmFyIFkyOwp2YXIgWjI7CnZhciBsYW1iZGEwMCQyOwp2YXIgcGhpMDAkMjsKdmFyIHgwOwp2YXIgeTA7CnZhciB6MDsgLy8gcHJldmlvdXMgcG9pbnQKCnZhciBjZW50cm9pZFN0cmVhbSA9IHsKICBzcGhlcmU6IG5vb3AkMiwKICBwb2ludDogY2VudHJvaWRQb2ludCwKICBsaW5lU3RhcnQ6IGNlbnRyb2lkTGluZVN0YXJ0LAogIGxpbmVFbmQ6IGNlbnRyb2lkTGluZUVuZCwKICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgY2VudHJvaWRTdHJlYW0ubGluZVN0YXJ0ID0gY2VudHJvaWRSaW5nU3RhcnQ7CiAgICBjZW50cm9pZFN0cmVhbS5saW5lRW5kID0gY2VudHJvaWRSaW5nRW5kOwogIH0sCiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICBjZW50cm9pZFN0cmVhbS5saW5lU3RhcnQgPSBjZW50cm9pZExpbmVTdGFydDsKICAgIGNlbnRyb2lkU3RyZWFtLmxpbmVFbmQgPSBjZW50cm9pZExpbmVFbmQ7CiAgfQp9OwoKLy8gQXJpdGhtZXRpYyBtZWFuIG9mIENhcnRlc2lhbiB2ZWN0b3JzLgpmdW5jdGlvbiBjZW50cm9pZFBvaW50KGxhbWJkYSwgcGhpKSB7CiAgbGFtYmRhICo9IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zOwogIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpOwogIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4oY29zUGhpICogY29zJDEobGFtYmRhKSwgY29zUGhpICogc2luJDEobGFtYmRhKSwgc2luJDEocGhpKSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4oeCwgeSwgeikgewogICsrVzA7CiAgWDAgKz0gKHggLSBYMCkgLyBXMDsKICBZMCArPSAoeSAtIFkwKSAvIFcwOwogIFowICs9ICh6IC0gWjApIC8gVzA7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkTGluZVN0YXJ0KCkgewogIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJvaWRMaW5lUG9pbnRGaXJzdDsKfQoKZnVuY3Rpb24gY2VudHJvaWRMaW5lUG9pbnRGaXJzdChsYW1iZGEsIHBoaSkgewogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICB2YXIgY29zUGhpID0gY29zJDEocGhpKTsKICB4MCA9IGNvc1BoaSAqIGNvcyQxKGxhbWJkYSk7CiAgeTAgPSBjb3NQaGkgKiBzaW4kMShsYW1iZGEpOwogIHowID0gc2luJDEocGhpKTsKICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkTGluZVBvaW50OwogIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4oeDAsIHkwLCB6MCk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkTGluZVBvaW50KGxhbWJkYSwgcGhpKSB7CiAgbGFtYmRhICo9IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zOwogIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpLAogICAgICB4ID0gY29zUGhpICogY29zJDEobGFtYmRhKSwKICAgICAgeSA9IGNvc1BoaSAqIHNpbiQxKGxhbWJkYSksCiAgICAgIHogPSBzaW4kMShwaGkpLAogICAgICB3ID0gYXRhbjIoc3FydCQxKCh3ID0geTAgKiB6IC0gejAgKiB5KSAqIHcgKyAodyA9IHowICogeCAtIHgwICogeikgKiB3ICsgKHcgPSB4MCAqIHkgLSB5MCAqIHgpICogdyksIHgwICogeCArIHkwICogeSArIHowICogeik7CiAgVzEgKz0gdzsKICBYMSArPSB3ICogKHgwICsgKHgwID0geCkpOwogIFkxICs9IHcgKiAoeTAgKyAoeTAgPSB5KSk7CiAgWjEgKz0gdyAqICh6MCArICh6MCA9IHopKTsKICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKHgwLCB5MCwgejApOwp9CgpmdW5jdGlvbiBjZW50cm9pZExpbmVFbmQoKSB7CiAgY2VudHJvaWRTdHJlYW0ucG9pbnQgPSBjZW50cm9pZFBvaW50Owp9CgovLyBTZWUgSi4gRS4gQnJvY2ssIFRoZSBJbmVydGlhIFRlbnNvciBmb3IgYSBTcGhlcmljYWwgVHJpYW5nbGUsCi8vIEouIEFwcGxpZWQgTWVjaGFuaWNzIDQyLCAyMzkgKDE5NzUpLgpmdW5jdGlvbiBjZW50cm9pZFJpbmdTdGFydCgpIHsKICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUmluZ1BvaW50Rmlyc3Q7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUmluZ0VuZCgpIHsKICBjZW50cm9pZFJpbmdQb2ludChsYW1iZGEwMCQyLCBwaGkwMCQyKTsKICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUG9pbnQ7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUmluZ1BvaW50Rmlyc3QobGFtYmRhLCBwaGkpIHsKICBsYW1iZGEwMCQyID0gbGFtYmRhLCBwaGkwMCQyID0gcGhpOwogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUmluZ1BvaW50OwogIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpOwogIHgwID0gY29zUGhpICogY29zJDEobGFtYmRhKTsKICB5MCA9IGNvc1BoaSAqIHNpbiQxKGxhbWJkYSk7CiAgejAgPSBzaW4kMShwaGkpOwogIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4oeDAsIHkwLCB6MCk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUmluZ1BvaW50KGxhbWJkYSwgcGhpKSB7CiAgbGFtYmRhICo9IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zOwogIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpLAogICAgICB4ID0gY29zUGhpICogY29zJDEobGFtYmRhKSwKICAgICAgeSA9IGNvc1BoaSAqIHNpbiQxKGxhbWJkYSksCiAgICAgIHogPSBzaW4kMShwaGkpLAogICAgICBjeCA9IHkwICogeiAtIHowICogeSwKICAgICAgY3kgPSB6MCAqIHggLSB4MCAqIHosCiAgICAgIGN6ID0geDAgKiB5IC0geTAgKiB4LAogICAgICBtID0gc3FydCQxKGN4ICogY3ggKyBjeSAqIGN5ICsgY3ogKiBjeiksCiAgICAgIHUgPSB4MCAqIHggKyB5MCAqIHkgKyB6MCAqIHosCiAgICAgIHYgPSBtICYmIC1hY29zKHUpIC8gbSwgLy8gYXJlYSB3ZWlnaHQKICAgICAgdyA9IGF0YW4yKG0sIHUpOyAvLyBsaW5lIHdlaWdodAogIFgyICs9IHYgKiBjeDsKICBZMiArPSB2ICogY3k7CiAgWjIgKz0gdiAqIGN6OwogIFcxICs9IHc7CiAgWDEgKz0gdyAqICh4MCArICh4MCA9IHgpKTsKICBZMSArPSB3ICogKHkwICsgKHkwID0geSkpOwogIFoxICs9IHcgKiAoejAgKyAoejAgPSB6KSk7CiAgY2VudHJvaWRQb2ludENhcnRlc2lhbih4MCwgeTAsIHowKTsKfQoKdmFyIGNlbnRyb2lkJDEgPSBmdW5jdGlvbihvYmplY3QpIHsKICBXMCA9IFcxID0KICBYMCA9IFkwID0gWjAgPQogIFgxID0gWTEgPSBaMSA9CiAgWDIgPSBZMiA9IFoyID0gMDsKICBnZW9TdHJlYW0ob2JqZWN0LCBjZW50cm9pZFN0cmVhbSk7CgogIHZhciB4ID0gWDIsCiAgICAgIHkgPSBZMiwKICAgICAgeiA9IFoyLAogICAgICBtID0geCAqIHggKyB5ICogeSArIHogKiB6OwoKICAvLyBJZiB0aGUgYXJlYS13ZWlnaHRlZCBjY2VudHJvaWQgaXMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbGVuZ3RoLXdlaWdodGVkIGNjZW50cm9pZC4KICBpZiAobSA8IGVwc2lsb24yJDIpIHsKICAgIHggPSBYMSwgeSA9IFkxLCB6ID0gWjE7CiAgICAvLyBJZiB0aGUgZmVhdHVyZSBoYXMgemVybyBsZW5ndGgsIGZhbGwgYmFjayB0byBhcml0aG1ldGljIG1lYW4gb2YgcG9pbnQgdmVjdG9ycy4KICAgIGlmIChXMSA8IGVwc2lsb24kNCkgeCA9IFgwLCB5ID0gWTAsIHogPSBaMDsKICAgIG0gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7CiAgICAvLyBJZiB0aGUgZmVhdHVyZSBzdGlsbCBoYXMgYW4gdW5kZWZpbmVkIGNjZW50cm9pZCwgdGhlbiByZXR1cm4uCiAgICBpZiAobSA8IGVwc2lsb24yJDIpIHJldHVybiBbTmFOLCBOYU5dOwogIH0KCiAgcmV0dXJuIFthdGFuMih5LCB4KSAqIGRlZ3JlZXMkMSwgYXNpbiQxKHogLyBzcXJ0JDEobSkpICogZGVncmVlcyQxXTsKfQoKdmFyIGNvbnN0YW50JDEzID0gZnVuY3Rpb24oeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCnZhciBjb21wb3NlID0gZnVuY3Rpb24oYSwgYikgewoKICBmdW5jdGlvbiBjb21wb3NlKHgsIHkpIHsKICAgIHJldHVybiB4ID0gYSh4LCB5KSwgYih4WzBdLCB4WzFdKTsKICB9CgogIGlmIChhLmludmVydCAmJiBiLmludmVydCkgY29tcG9zZS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICByZXR1cm4geCA9IGIuaW52ZXJ0KHgsIHkpLCB4ICYmIGEuaW52ZXJ0KHhbMF0sIHhbMV0pOwogIH07CgogIHJldHVybiBjb21wb3NlOwp9CgpmdW5jdGlvbiByb3RhdGlvbklkZW50aXR5KGxhbWJkYSwgcGhpKSB7CiAgcmV0dXJuIFtsYW1iZGEgPiBwaSQ0ID8gbGFtYmRhIC0gdGF1JDQgOiBsYW1iZGEgPCAtcGkkNCA/IGxhbWJkYSArIHRhdSQ0IDogbGFtYmRhLCBwaGldOwp9Cgpyb3RhdGlvbklkZW50aXR5LmludmVydCA9IHJvdGF0aW9uSWRlbnRpdHk7CgpmdW5jdGlvbiByb3RhdGVSYWRpYW5zKGRlbHRhTGFtYmRhLCBkZWx0YVBoaSwgZGVsdGFHYW1tYSkgewogIHJldHVybiAoZGVsdGFMYW1iZGEgJT0gdGF1JDQpID8gKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyBjb21wb3NlKHJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSwgcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSkpCiAgICA6IHJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSkKICAgIDogKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKQogICAgOiByb3RhdGlvbklkZW50aXR5KTsKfQoKZnVuY3Rpb24gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICByZXR1cm4gbGFtYmRhICs9IGRlbHRhTGFtYmRhLCBbbGFtYmRhID4gcGkkNCA/IGxhbWJkYSAtIHRhdSQ0IDogbGFtYmRhIDwgLXBpJDQgPyBsYW1iZGEgKyB0YXUkNCA6IGxhbWJkYSwgcGhpXTsKICB9Owp9CgpmdW5jdGlvbiByb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSkgewogIHZhciByb3RhdGlvbiA9IGZvcndhcmRSb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSk7CiAgcm90YXRpb24uaW52ZXJ0ID0gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKC1kZWx0YUxhbWJkYSk7CiAgcmV0dXJuIHJvdGF0aW9uOwp9CgpmdW5jdGlvbiByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKSB7CiAgdmFyIGNvc0RlbHRhUGhpID0gY29zJDEoZGVsdGFQaGkpLAogICAgICBzaW5EZWx0YVBoaSA9IHNpbiQxKGRlbHRhUGhpKSwKICAgICAgY29zRGVsdGFHYW1tYSA9IGNvcyQxKGRlbHRhR2FtbWEpLAogICAgICBzaW5EZWx0YUdhbW1hID0gc2luJDEoZGVsdGFHYW1tYSk7CgogIGZ1bmN0aW9uIHJvdGF0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICB2YXIgY29zUGhpID0gY29zJDEocGhpKSwKICAgICAgICB4ID0gY29zJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICB5ID0gc2luJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICB6ID0gc2luJDEocGhpKSwKICAgICAgICBrID0geiAqIGNvc0RlbHRhUGhpICsgeCAqIHNpbkRlbHRhUGhpOwogICAgcmV0dXJuIFsKICAgICAgYXRhbjIoeSAqIGNvc0RlbHRhR2FtbWEgLSBrICogc2luRGVsdGFHYW1tYSwgeCAqIGNvc0RlbHRhUGhpIC0geiAqIHNpbkRlbHRhUGhpKSwKICAgICAgYXNpbiQxKGsgKiBjb3NEZWx0YUdhbW1hICsgeSAqIHNpbkRlbHRhR2FtbWEpCiAgICBdOwogIH0KCiAgcm90YXRpb24uaW52ZXJ0ID0gZnVuY3Rpb24obGFtYmRhLCBwaGkpIHsKICAgIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpLAogICAgICAgIHggPSBjb3MkMShsYW1iZGEpICogY29zUGhpLAogICAgICAgIHkgPSBzaW4kMShsYW1iZGEpICogY29zUGhpLAogICAgICAgIHogPSBzaW4kMShwaGkpLAogICAgICAgIGsgPSB6ICogY29zRGVsdGFHYW1tYSAtIHkgKiBzaW5EZWx0YUdhbW1hOwogICAgcmV0dXJuIFsKICAgICAgYXRhbjIoeSAqIGNvc0RlbHRhR2FtbWEgKyB6ICogc2luRGVsdGFHYW1tYSwgeCAqIGNvc0RlbHRhUGhpICsgayAqIHNpbkRlbHRhUGhpKSwKICAgICAgYXNpbiQxKGsgKiBjb3NEZWx0YVBoaSAtIHggKiBzaW5EZWx0YVBoaSkKICAgIF07CiAgfTsKCiAgcmV0dXJuIHJvdGF0aW9uOwp9Cgp2YXIgcm90YXRpb24gPSBmdW5jdGlvbihyb3RhdGUpIHsKICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKHJvdGF0ZVswXSAqIHJhZGlhbnMsIHJvdGF0ZVsxXSAqIHJhZGlhbnMsIHJvdGF0ZS5sZW5ndGggPiAyID8gcm90YXRlWzJdICogcmFkaWFucyA6IDApOwoKICBmdW5jdGlvbiBmb3J3YXJkKGNvb3JkaW5hdGVzKSB7CiAgICBjb29yZGluYXRlcyA9IHJvdGF0ZShjb29yZGluYXRlc1swXSAqIHJhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogcmFkaWFucyk7CiAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZGVncmVlcyQxLCBjb29yZGluYXRlc1sxXSAqPSBkZWdyZWVzJDEsIGNvb3JkaW5hdGVzOwogIH0KCiAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgY29vcmRpbmF0ZXMgPSByb3RhdGUuaW52ZXJ0KGNvb3JkaW5hdGVzWzBdICogcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiByYWRpYW5zKTsKICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkZWdyZWVzJDEsIGNvb3JkaW5hdGVzWzFdICo9IGRlZ3JlZXMkMSwgY29vcmRpbmF0ZXM7CiAgfTsKCiAgcmV0dXJuIGZvcndhcmQ7Cn0KCi8vIEdlbmVyYXRlcyBhIGNpcmNsZSBjZW50ZXJlZCBhdCBbMMOCwrAsIDDDgsKwXSwgd2l0aCBhIGdpdmVuIHJhZGl1cyBhbmQgcHJlY2lzaW9uLgpmdW5jdGlvbiBjaXJjbGVTdHJlYW0oc3RyZWFtLCByYWRpdXMsIGRlbHRhLCBkaXJlY3Rpb24sIHQwLCB0MSkgewogIGlmICghZGVsdGEpIHJldHVybjsKICB2YXIgY29zUmFkaXVzID0gY29zJDEocmFkaXVzKSwKICAgICAgc2luUmFkaXVzID0gc2luJDEocmFkaXVzKSwKICAgICAgc3RlcCA9IGRpcmVjdGlvbiAqIGRlbHRhOwogIGlmICh0MCA9PSBudWxsKSB7CiAgICB0MCA9IHJhZGl1cyArIGRpcmVjdGlvbiAqIHRhdSQ0OwogICAgdDEgPSByYWRpdXMgLSBzdGVwIC8gMjsKICB9IGVsc2UgewogICAgdDAgPSBjaXJjbGVSYWRpdXMoY29zUmFkaXVzLCB0MCk7CiAgICB0MSA9IGNpcmNsZVJhZGl1cyhjb3NSYWRpdXMsIHQxKTsKICAgIGlmIChkaXJlY3Rpb24gPiAwID8gdDAgPCB0MSA6IHQwID4gdDEpIHQwICs9IGRpcmVjdGlvbiAqIHRhdSQ0OwogIH0KICBmb3IgKHZhciBwb2ludCwgdCA9IHQwOyBkaXJlY3Rpb24gPiAwID8gdCA+IHQxIDogdCA8IHQxOyB0IC09IHN0ZXApIHsKICAgIHBvaW50ID0gc3BoZXJpY2FsKFtjb3NSYWRpdXMsIC1zaW5SYWRpdXMgKiBjb3MkMSh0KSwgLXNpblJhZGl1cyAqIHNpbiQxKHQpXSk7CiAgICBzdHJlYW0ucG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKTsKICB9Cn0KCi8vIFJldHVybnMgdGhlIHNpZ25lZCBhbmdsZSBvZiBhIGNhcnRlc2lhbiBwb2ludCByZWxhdGl2ZSB0byBbY29zUmFkaXVzLCAwLCAwXS4KZnVuY3Rpb24gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgcG9pbnQpIHsKICBwb2ludCA9IGNhcnRlc2lhbihwb2ludCksIHBvaW50WzBdIC09IGNvc1JhZGl1czsKICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKHBvaW50KTsKICB2YXIgcmFkaXVzID0gYWNvcygtcG9pbnRbMV0pOwogIHJldHVybiAoKC1wb2ludFsyXSA8IDAgPyAtcmFkaXVzIDogcmFkaXVzKSArIHRhdSQ0IC0gZXBzaWxvbiQ0KSAlIHRhdSQ0Owp9Cgp2YXIgY2lyY2xlJDEgPSBmdW5jdGlvbigpIHsKICB2YXIgY2VudGVyID0gY29uc3RhbnQkMTMoWzAsIDBdKSwKICAgICAgcmFkaXVzID0gY29uc3RhbnQkMTMoOTApLAogICAgICBwcmVjaXNpb24gPSBjb25zdGFudCQxMyg2KSwKICAgICAgcmluZywKICAgICAgcm90YXRlLAogICAgICBzdHJlYW0gPSB7cG9pbnQ6IHBvaW50fTsKCiAgZnVuY3Rpb24gcG9pbnQoeCwgeSkgewogICAgcmluZy5wdXNoKHggPSByb3RhdGUoeCwgeSkpOwogICAgeFswXSAqPSBkZWdyZWVzJDEsIHhbMV0gKj0gZGVncmVlcyQxOwogIH0KCiAgZnVuY3Rpb24gY2lyY2xlKCkgewogICAgdmFyIGMgPSBjZW50ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICByID0gcmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zLAogICAgICAgIHAgPSBwcmVjaXNpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKSAqIHJhZGlhbnM7CiAgICByaW5nID0gW107CiAgICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKC1jWzBdICogcmFkaWFucywgLWNbMV0gKiByYWRpYW5zLCAwKS5pbnZlcnQ7CiAgICBjaXJjbGVTdHJlYW0oc3RyZWFtLCByLCBwLCAxKTsKICAgIGMgPSB7dHlwZTogIlBvbHlnb24iLCBjb29yZGluYXRlczogW3JpbmddfTsKICAgIHJpbmcgPSByb3RhdGUgPSBudWxsOwogICAgcmV0dXJuIGM7CiAgfQoKICBjaXJjbGUuY2VudGVyID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2VudGVyID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMTMoWytfWzBdLCArX1sxXV0pLCBjaXJjbGUpIDogY2VudGVyOwogIH07CgogIGNpcmNsZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQxMygrXyksIGNpcmNsZSkgOiByYWRpdXM7CiAgfTsKCiAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNpc2lvbiA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDEzKCtfKSwgY2lyY2xlKSA6IHByZWNpc2lvbjsKICB9OwoKICByZXR1cm4gY2lyY2xlOwp9Cgp2YXIgY2xpcEJ1ZmZlciA9IGZ1bmN0aW9uKCkgewogIHZhciBsaW5lcyA9IFtdLAogICAgICBsaW5lOwogIHJldHVybiB7CiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICBsaW5lLnB1c2goW3gsIHldKTsKICAgIH0sCiAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICBsaW5lcy5wdXNoKGxpbmUgPSBbXSk7CiAgICB9LAogICAgbGluZUVuZDogbm9vcCQyLAogICAgcmVqb2luOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIGxpbmVzLnB1c2gobGluZXMucG9wKCkuY29uY2F0KGxpbmVzLnNoaWZ0KCkpKTsKICAgIH0sCiAgICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmVzdWx0ID0gbGluZXM7CiAgICAgIGxpbmVzID0gW107CiAgICAgIGxpbmUgPSBudWxsOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH07Cn0KCnZhciBjbGlwTGluZSA9IGZ1bmN0aW9uKGEsIGIsIHgwLCB5MCwgeDEsIHkxKSB7CiAgdmFyIGF4ID0gYVswXSwKICAgICAgYXkgPSBhWzFdLAogICAgICBieCA9IGJbMF0sCiAgICAgIGJ5ID0gYlsxXSwKICAgICAgdDAgPSAwLAogICAgICB0MSA9IDEsCiAgICAgIGR4ID0gYnggLSBheCwKICAgICAgZHkgPSBieSAtIGF5LAogICAgICByOwoKICByID0geDAgLSBheDsKICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47CiAgciAvPSBkeDsKICBpZiAoZHggPCAwKSB7CiAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgfSBlbHNlIGlmIChkeCA+IDApIHsKICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgIGlmIChyID4gdDApIHQwID0gcjsKICB9CgogIHIgPSB4MSAtIGF4OwogIGlmICghZHggJiYgciA8IDApIHJldHVybjsKICByIC89IGR4OwogIGlmIChkeCA8IDApIHsKICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgIGlmIChyID4gdDApIHQwID0gcjsKICB9IGVsc2UgaWYgKGR4ID4gMCkgewogICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEgPSByOwogIH0KCiAgciA9IHkwIC0gYXk7CiAgaWYgKCFkeSAmJiByID4gMCkgcmV0dXJuOwogIHIgLz0gZHk7CiAgaWYgKGR5IDwgMCkgewogICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEgPSByOwogIH0gZWxzZSBpZiAoZHkgPiAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgfQoKICByID0geTEgLSBheTsKICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47CiAgciAvPSBkeTsKICBpZiAoZHkgPCAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgfSBlbHNlIGlmIChkeSA+IDApIHsKICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICB9CgogIGlmICh0MCA+IDApIGFbMF0gPSBheCArIHQwICogZHgsIGFbMV0gPSBheSArIHQwICogZHk7CiAgaWYgKHQxIDwgMSkgYlswXSA9IGF4ICsgdDEgKiBkeCwgYlsxXSA9IGF5ICsgdDEgKiBkeTsKICByZXR1cm4gdHJ1ZTsKfQoKdmFyIHBvaW50RXF1YWwgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGFicyhhWzBdIC0gYlswXSkgPCBlcHNpbG9uJDQgJiYgYWJzKGFbMV0gLSBiWzFdKSA8IGVwc2lsb24kNDsKfQoKZnVuY3Rpb24gSW50ZXJzZWN0aW9uKHBvaW50LCBwb2ludHMsIG90aGVyLCBlbnRyeSkgewogIHRoaXMueCA9IHBvaW50OwogIHRoaXMueiA9IHBvaW50czsKICB0aGlzLm8gPSBvdGhlcjsgLy8gYW5vdGhlciBpbnRlcnNlY3Rpb24KICB0aGlzLmUgPSBlbnRyeTsgLy8gaXMgYW4gZW50cnk/CiAgdGhpcy52ID0gZmFsc2U7IC8vIHZpc2l0ZWQKICB0aGlzLm4gPSB0aGlzLnAgPSBudWxsOyAvLyBuZXh0ICYgcHJldmlvdXMKfQoKLy8gQSBnZW5lcmFsaXplZCBwb2x5Z29uIGNsaXBwaW5nIGFsZ29yaXRobTogZ2l2ZW4gYSBwb2x5Z29uIHRoYXQgaGFzIGJlZW4gY3V0Ci8vIGludG8gaXRzIHZpc2libGUgbGluZSBzZWdtZW50cywgYW5kIHJlam9pbnMgdGhlIHNlZ21lbnRzIGJ5IGludGVycG9sYXRpbmcKLy8gYWxvbmcgdGhlIGNsaXAgZWRnZS4KdmFyIGNsaXBQb2x5Z29uID0gZnVuY3Rpb24oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc3RyZWFtKSB7CiAgdmFyIHN1YmplY3QgPSBbXSwKICAgICAgY2xpcCA9IFtdLAogICAgICBpLAogICAgICBuOwoKICBzZWdtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHNlZ21lbnQpIHsKICAgIGlmICgobiA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPD0gMCkgcmV0dXJuOwogICAgdmFyIG4sIHAwID0gc2VnbWVudFswXSwgcDEgPSBzZWdtZW50W25dLCB4OwoKICAgIC8vIElmIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHMgb2YgYSBzZWdtZW50IGFyZSBjb2luY2lkZW50LCB0aGVuIHRyZWF0IGFzIGEKICAgIC8vIGNsb3NlZCByaW5nLiBUT0RPIGlmIGFsbCByaW5ncyBhcmUgY2xvc2VkLCB0aGVuIHRoZSB3aW5kaW5nIG9yZGVyIG9mIHRoZQogICAgLy8gZXh0ZXJpb3IgcmluZyBzaG91bGQgYmUgY2hlY2tlZC4KICAgIGlmIChwb2ludEVxdWFsKHAwLCBwMSkpIHsKICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzdHJlYW0ucG9pbnQoKHAwID0gc2VnbWVudFtpXSlbMF0sIHAwWzFdKTsKICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN1YmplY3QucHVzaCh4ID0gbmV3IEludGVyc2VjdGlvbihwMCwgc2VnbWVudCwgbnVsbCwgdHJ1ZSkpOwogICAgY2xpcC5wdXNoKHgubyA9IG5ldyBJbnRlcnNlY3Rpb24ocDAsIG51bGwsIHgsIGZhbHNlKSk7CiAgICBzdWJqZWN0LnB1c2goeCA9IG5ldyBJbnRlcnNlY3Rpb24ocDEsIHNlZ21lbnQsIG51bGwsIGZhbHNlKSk7CiAgICBjbGlwLnB1c2goeC5vID0gbmV3IEludGVyc2VjdGlvbihwMSwgbnVsbCwgeCwgdHJ1ZSkpOwogIH0pOwoKICBpZiAoIXN1YmplY3QubGVuZ3RoKSByZXR1cm47CgogIGNsaXAuc29ydChjb21wYXJlSW50ZXJzZWN0aW9uKTsKICBsaW5rJDEoc3ViamVjdCk7CiAgbGluayQxKGNsaXApOwoKICBmb3IgKGkgPSAwLCBuID0gY2xpcC5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgIGNsaXBbaV0uZSA9IHN0YXJ0SW5zaWRlID0gIXN0YXJ0SW5zaWRlOwogIH0KCiAgdmFyIHN0YXJ0ID0gc3ViamVjdFswXSwKICAgICAgcG9pbnRzLAogICAgICBwb2ludDsKCiAgd2hpbGUgKDEpIHsKICAgIC8vIEZpbmQgZmlyc3QgdW52aXNpdGVkIGludGVyc2VjdGlvbi4KICAgIHZhciBjdXJyZW50ID0gc3RhcnQsCiAgICAgICAgaXNTdWJqZWN0ID0gdHJ1ZTsKICAgIHdoaWxlIChjdXJyZW50LnYpIGlmICgoY3VycmVudCA9IGN1cnJlbnQubikgPT09IHN0YXJ0KSByZXR1cm47CiAgICBwb2ludHMgPSBjdXJyZW50Lno7CiAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICBkbyB7CiAgICAgIGN1cnJlbnQudiA9IGN1cnJlbnQuby52ID0gdHJ1ZTsKICAgICAgaWYgKGN1cnJlbnQuZSkgewogICAgICAgIGlmIChpc1N1YmplY3QpIHsKICAgICAgICAgIGZvciAoaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoOyBpIDwgbjsgKytpKSBzdHJlYW0ucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnRlcnBvbGF0ZShjdXJyZW50LngsIGN1cnJlbnQubi54LCAxLCBzdHJlYW0pOwogICAgICAgIH0KICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpc1N1YmplY3QpIHsKICAgICAgICAgIHBvaW50cyA9IGN1cnJlbnQucC56OwogICAgICAgICAgZm9yIChpID0gcG9pbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSBzdHJlYW0ucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnRlcnBvbGF0ZShjdXJyZW50LngsIGN1cnJlbnQucC54LCAtMSwgc3RyZWFtKTsKICAgICAgICB9CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucDsKICAgICAgfQogICAgICBjdXJyZW50ID0gY3VycmVudC5vOwogICAgICBwb2ludHMgPSBjdXJyZW50Lno7CiAgICAgIGlzU3ViamVjdCA9ICFpc1N1YmplY3Q7CiAgICB9IHdoaWxlICghY3VycmVudC52KTsKICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgfQp9CgpmdW5jdGlvbiBsaW5rJDEoYXJyYXkpIHsKICBpZiAoIShuID0gYXJyYXkubGVuZ3RoKSkgcmV0dXJuOwogIHZhciBuLAogICAgICBpID0gMCwKICAgICAgYSA9IGFycmF5WzBdLAogICAgICBiOwogIHdoaWxlICgrK2kgPCBuKSB7CiAgICBhLm4gPSBiID0gYXJyYXlbaV07CiAgICBiLnAgPSBhOwogICAgYSA9IGI7CiAgfQogIGEubiA9IGIgPSBhcnJheVswXTsKICBiLnAgPSBhOwp9Cgp2YXIgY2xpcE1heCA9IDFlOTsKdmFyIGNsaXBNaW4gPSAtY2xpcE1heDsKCi8vIFRPRE8gVXNlIGQzLXBvbHlnb27DosKAwplzIHBvbHlnb25Db250YWlucyBoZXJlIGZvciB0aGUgcmluZyBjaGVjaz8KLy8gVE9ETyBFbGltaW5hdGUgZHVwbGljYXRlIGJ1ZmZlcmluZyBpbiBjbGlwQnVmZmVyIGFuZCBwb2x5Z29uLnB1c2g/CgpmdW5jdGlvbiBjbGlwRXh0ZW50KHgwLCB5MCwgeDEsIHkxKSB7CgogIGZ1bmN0aW9uIHZpc2libGUoeCwgeSkgewogICAgcmV0dXJuIHgwIDw9IHggJiYgeCA8PSB4MSAmJiB5MCA8PSB5ICYmIHkgPD0geTE7CiAgfQoKICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHsKICAgIHZhciBhID0gMCwgYTEgPSAwOwogICAgaWYgKGZyb20gPT0gbnVsbAogICAgICAgIHx8IChhID0gY29ybmVyKGZyb20sIGRpcmVjdGlvbikpICE9PSAoYTEgPSBjb3JuZXIodG8sIGRpcmVjdGlvbikpCiAgICAgICAgfHwgY29tcGFyZVBvaW50KGZyb20sIHRvKSA8IDAgXiBkaXJlY3Rpb24gPiAwKSB7CiAgICAgIGRvIHN0cmVhbS5wb2ludChhID09PSAwIHx8IGEgPT09IDMgPyB4MCA6IHgxLCBhID4gMSA/IHkxIDogeTApOwogICAgICB3aGlsZSAoKGEgPSAoYSArIGRpcmVjdGlvbiArIDQpICUgNCkgIT09IGExKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmVhbS5wb2ludCh0b1swXSwgdG9bMV0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29ybmVyKHAsIGRpcmVjdGlvbikgewogICAgcmV0dXJuIGFicyhwWzBdIC0geDApIDwgZXBzaWxvbiQ0ID8gZGlyZWN0aW9uID4gMCA/IDAgOiAzCiAgICAgICAgOiBhYnMocFswXSAtIHgxKSA8IGVwc2lsb24kNCA/IGRpcmVjdGlvbiA+IDAgPyAyIDogMQogICAgICAgIDogYWJzKHBbMV0gLSB5MCkgPCBlcHNpbG9uJDQgPyBkaXJlY3Rpb24gPiAwID8gMSA6IDAKICAgICAgICA6IGRpcmVjdGlvbiA+IDAgPyAzIDogMjsgLy8gYWJzKHBbMV0gLSB5MSkgPCBlcHNpbG9uCiAgfQoKICBmdW5jdGlvbiBjb21wYXJlSW50ZXJzZWN0aW9uKGEsIGIpIHsKICAgIHJldHVybiBjb21wYXJlUG9pbnQoYS54LCBiLngpOwogIH0KCiAgZnVuY3Rpb24gY29tcGFyZVBvaW50KGEsIGIpIHsKICAgIHZhciBjYSA9IGNvcm5lcihhLCAxKSwKICAgICAgICBjYiA9IGNvcm5lcihiLCAxKTsKICAgIHJldHVybiBjYSAhPT0gY2IgPyBjYSAtIGNiCiAgICAgICAgOiBjYSA9PT0gMCA/IGJbMV0gLSBhWzFdCiAgICAgICAgOiBjYSA9PT0gMSA/IGFbMF0gLSBiWzBdCiAgICAgICAgOiBjYSA9PT0gMiA/IGFbMV0gLSBiWzFdCiAgICAgICAgOiBiWzBdIC0gYVswXTsKICB9CgogIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHsKICAgIHZhciBhY3RpdmVTdHJlYW0gPSBzdHJlYW0sCiAgICAgICAgYnVmZmVyU3RyZWFtID0gY2xpcEJ1ZmZlcigpLAogICAgICAgIHNlZ21lbnRzLAogICAgICAgIHBvbHlnb24sCiAgICAgICAgcmluZywKICAgICAgICB4X18sIHlfXywgdl9fLCAvLyBmaXJzdCBwb2ludAogICAgICAgIHhfLCB5Xywgdl8sIC8vIHByZXZpb3VzIHBvaW50CiAgICAgICAgZmlyc3QsCiAgICAgICAgY2xlYW47CgogICAgdmFyIGNsaXBTdHJlYW0gPSB7CiAgICAgIHBvaW50OiBwb2ludCwKICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsCiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsCiAgICAgIHBvbHlnb25TdGFydDogcG9seWdvblN0YXJ0LAogICAgICBwb2x5Z29uRW5kOiBwb2x5Z29uRW5kCiAgICB9OwoKICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHsKICAgICAgaWYgKHZpc2libGUoeCwgeSkpIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2x5Z29uSW5zaWRlKCkgewogICAgICB2YXIgd2luZGluZyA9IDA7CgogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHBvbHlnb24ubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgZm9yICh2YXIgcmluZyA9IHBvbHlnb25baV0sIGogPSAxLCBtID0gcmluZy5sZW5ndGgsIHBvaW50ID0gcmluZ1swXSwgYTAsIGExLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICBhMCA9IGIwLCBhMSA9IGIxLCBwb2ludCA9IHJpbmdbal0sIGIwID0gcG9pbnRbMF0sIGIxID0gcG9pbnRbMV07CiAgICAgICAgICBpZiAoYTEgPD0geTEpIHsgaWYgKGIxID4geTEgJiYgKGIwIC0gYTApICogKHkxIC0gYTEpID4gKGIxIC0gYTEpICogKHgwIC0gYTApKSArK3dpbmRpbmc7IH0KICAgICAgICAgIGVsc2UgeyBpZiAoYjEgPD0geTEgJiYgKGIwIC0gYTApICogKHkxIC0gYTEpIDwgKGIxIC0gYTEpICogKHgwIC0gYTApKSAtLXdpbmRpbmc7IH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB3aW5kaW5nOwogICAgfQoKICAgIC8vIEJ1ZmZlciBnZW9tZXRyeSB3aXRoaW4gYSBwb2x5Z29uIGFuZCB0aGVuIGNsaXAgaXQgZW4gbWFzc2UuCiAgICBmdW5jdGlvbiBwb2x5Z29uU3RhcnQoKSB7CiAgICAgIGFjdGl2ZVN0cmVhbSA9IGJ1ZmZlclN0cmVhbSwgc2VnbWVudHMgPSBbXSwgcG9seWdvbiA9IFtdLCBjbGVhbiA9IHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gcG9seWdvbkVuZCgpIHsKICAgICAgdmFyIHN0YXJ0SW5zaWRlID0gcG9seWdvbkluc2lkZSgpLAogICAgICAgICAgY2xlYW5JbnNpZGUgPSBjbGVhbiAmJiBzdGFydEluc2lkZSwKICAgICAgICAgIHZpc2libGUgPSAoc2VnbWVudHMgPSBtZXJnZShzZWdtZW50cykpLmxlbmd0aDsKICAgICAgaWYgKGNsZWFuSW5zaWRlIHx8IHZpc2libGUpIHsKICAgICAgICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7CiAgICAgICAgaWYgKGNsZWFuSW5zaWRlKSB7CiAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzdHJlYW0pOwogICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2libGUpIHsKICAgICAgICAgIGNsaXBQb2x5Z29uKHNlZ21lbnRzLCBjb21wYXJlSW50ZXJzZWN0aW9uLCBzdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIHN0cmVhbSk7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICAgIH0KICAgICAgYWN0aXZlU3RyZWFtID0gc3RyZWFtLCBzZWdtZW50cyA9IHBvbHlnb24gPSByaW5nID0gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7CiAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7CiAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29uLnB1c2gocmluZyA9IFtdKTsKICAgICAgZmlyc3QgPSB0cnVlOwogICAgICB2XyA9IGZhbHNlOwogICAgICB4XyA9IHlfID0gTmFOOwogICAgfQoKICAgIC8vIFRPRE8gcmF0aGVyIHRoYW4gc3BlY2lhbC1jYXNlIHBvbHlnb25zLCBzaW1wbHkgaGFuZGxlIHRoZW0gc2VwYXJhdGVseS4KICAgIC8vIElkZWFsbHksIGNvaW5jaWRlbnQgaW50ZXJzZWN0aW9uIHBvaW50cyBzaG91bGQgYmUgaml0dGVyZWQgdG8gYXZvaWQKICAgIC8vIGNsaXBwaW5nIGlzc3Vlcy4KICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgIGlmIChzZWdtZW50cykgewogICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7CiAgICAgICAgaWYgKHZfXyAmJiB2XykgYnVmZmVyU3RyZWFtLnJlam9pbigpOwogICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyU3RyZWFtLnJlc3VsdCgpKTsKICAgICAgfQogICAgICBjbGlwU3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICAgIGlmICh2XykgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lUG9pbnQoeCwgeSkgewogICAgICB2YXIgdiA9IHZpc2libGUoeCwgeSk7CiAgICAgIGlmIChwb2x5Z29uKSByaW5nLnB1c2goW3gsIHldKTsKICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgeF9fID0geCwgeV9fID0geSwgdl9fID0gdjsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgIGlmICh2KSB7CiAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICh2ICYmIHZfKSBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgYSA9IFt4XyA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHhfKSksIHlfID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeV8pKV0sCiAgICAgICAgICAgICAgYiA9IFt4ID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeCkpLCB5ID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeSkpXTsKICAgICAgICAgIGlmIChjbGlwTGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkpIHsKICAgICAgICAgICAgaWYgKCF2XykgewogICAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoYVswXSwgYVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KGJbMF0sIGJbMV0pOwogICAgICAgICAgICBpZiAoIXYpIGFjdGl2ZVN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2UgaWYgKHYpIHsKICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7CiAgICB9CgogICAgcmV0dXJuIGNsaXBTdHJlYW07CiAgfTsKfQoKdmFyIGV4dGVudCQxID0gZnVuY3Rpb24oKSB7CiAgdmFyIHgwID0gMCwKICAgICAgeTAgPSAwLAogICAgICB4MSA9IDk2MCwKICAgICAgeTEgPSA1MDAsCiAgICAgIGNhY2hlLAogICAgICBjYWNoZVN0cmVhbSwKICAgICAgY2xpcDsKCiAgcmV0dXJuIGNsaXAgPSB7CiAgICBzdHJlYW06IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICByZXR1cm4gY2FjaGUgJiYgY2FjaGVTdHJlYW0gPT09IHN0cmVhbSA/IGNhY2hlIDogY2FjaGUgPSBjbGlwRXh0ZW50KHgwLCB5MCwgeDEsIHkxKShjYWNoZVN0cmVhbSA9IHN0cmVhbSk7CiAgICB9LAogICAgZXh0ZW50OiBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0sIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsLCBjbGlwKSA6IFtbeDAsIHkwXSwgW3gxLCB5MV1dOwogICAgfQogIH07Cn0KCnZhciBsZW5ndGhTdW0gPSBhZGRlcigpOwp2YXIgbGFtYmRhMCQyOwp2YXIgc2luUGhpMCQxOwp2YXIgY29zUGhpMCQxOwoKdmFyIGxlbmd0aFN0cmVhbSA9IHsKICBzcGhlcmU6IG5vb3AkMiwKICBwb2ludDogbm9vcCQyLAogIGxpbmVTdGFydDogbGVuZ3RoTGluZVN0YXJ0LAogIGxpbmVFbmQ6IG5vb3AkMiwKICBwb2x5Z29uU3RhcnQ6IG5vb3AkMiwKICBwb2x5Z29uRW5kOiBub29wJDIKfTsKCmZ1bmN0aW9uIGxlbmd0aExpbmVTdGFydCgpIHsKICBsZW5ndGhTdHJlYW0ucG9pbnQgPSBsZW5ndGhQb2ludEZpcnN0OwogIGxlbmd0aFN0cmVhbS5saW5lRW5kID0gbGVuZ3RoTGluZUVuZDsKfQoKZnVuY3Rpb24gbGVuZ3RoTGluZUVuZCgpIHsKICBsZW5ndGhTdHJlYW0ucG9pbnQgPSBsZW5ndGhTdHJlYW0ubGluZUVuZCA9IG5vb3AkMjsKfQoKZnVuY3Rpb24gbGVuZ3RoUG9pbnRGaXJzdChsYW1iZGEsIHBoaSkgewogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICBsYW1iZGEwJDIgPSBsYW1iZGEsIHNpblBoaTAkMSA9IHNpbiQxKHBoaSksIGNvc1BoaTAkMSA9IGNvcyQxKHBoaSk7CiAgbGVuZ3RoU3RyZWFtLnBvaW50ID0gbGVuZ3RoUG9pbnQ7Cn0KCmZ1bmN0aW9uIGxlbmd0aFBvaW50KGxhbWJkYSwgcGhpKSB7CiAgbGFtYmRhICo9IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zOwogIHZhciBzaW5QaGkgPSBzaW4kMShwaGkpLAogICAgICBjb3NQaGkgPSBjb3MkMShwaGkpLAogICAgICBkZWx0YSA9IGFicyhsYW1iZGEgLSBsYW1iZGEwJDIpLAogICAgICBjb3NEZWx0YSA9IGNvcyQxKGRlbHRhKSwKICAgICAgc2luRGVsdGEgPSBzaW4kMShkZWx0YSksCiAgICAgIHggPSBjb3NQaGkgKiBzaW5EZWx0YSwKICAgICAgeSA9IGNvc1BoaTAkMSAqIHNpblBoaSAtIHNpblBoaTAkMSAqIGNvc1BoaSAqIGNvc0RlbHRhLAogICAgICB6ID0gc2luUGhpMCQxICogc2luUGhpICsgY29zUGhpMCQxICogY29zUGhpICogY29zRGVsdGE7CiAgbGVuZ3RoU3VtLmFkZChhdGFuMihzcXJ0JDEoeCAqIHggKyB5ICogeSksIHopKTsKICBsYW1iZGEwJDIgPSBsYW1iZGEsIHNpblBoaTAkMSA9IHNpblBoaSwgY29zUGhpMCQxID0gY29zUGhpOwp9Cgp2YXIgbGVuZ3RoJDIgPSBmdW5jdGlvbihvYmplY3QpIHsKICBsZW5ndGhTdW0ucmVzZXQoKTsKICBnZW9TdHJlYW0ob2JqZWN0LCBsZW5ndGhTdHJlYW0pOwogIHJldHVybiArbGVuZ3RoU3VtOwp9Cgp2YXIgY29vcmRpbmF0ZXMgPSBbbnVsbCwgbnVsbF07CnZhciBvYmplY3QkMSA9IHt0eXBlOiAiTGluZVN0cmluZyIsIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc307Cgp2YXIgZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7CiAgY29vcmRpbmF0ZXNbMF0gPSBhOwogIGNvb3JkaW5hdGVzWzFdID0gYjsKICByZXR1cm4gbGVuZ3RoJDIob2JqZWN0JDEpOwp9CgpmdW5jdGlvbiBncmF0aWN1bGVYKHkwLCB5MSwgZHkpIHsKICB2YXIgeSA9IHJhbmdlKHkwLCB5MSAtIGVwc2lsb24kNCwgZHkpLmNvbmNhdCh5MSk7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHkubWFwKGZ1bmN0aW9uKHkpIHsgcmV0dXJuIFt4LCB5XTsgfSk7IH07Cn0KCmZ1bmN0aW9uIGdyYXRpY3VsZVkoeDAsIHgxLCBkeCkgewogIHZhciB4ID0gcmFuZ2UoeDAsIHgxIC0gZXBzaWxvbiQ0LCBkeCkuY29uY2F0KHgxKTsKICByZXR1cm4gZnVuY3Rpb24oeSkgeyByZXR1cm4geC5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4gW3gsIHldOyB9KTsgfTsKfQoKdmFyIGdyYXRpY3VsZSA9IGZ1bmN0aW9uKCkgewogIHZhciB4MSwgeDAsIFgxLCBYMCwKICAgICAgeTEsIHkwLCBZMSwgWTAsCiAgICAgIGR4ID0gMTAsIGR5ID0gZHgsIERYID0gOTAsIERZID0gMzYwLAogICAgICB4LCB5LCBYLCBZLAogICAgICBwcmVjaXNpb24gPSAyLjU7CgogIGZ1bmN0aW9uIGdyYXRpY3VsZSgpIHsKICAgIHJldHVybiB7dHlwZTogIk11bHRpTGluZVN0cmluZyIsIGNvb3JkaW5hdGVzOiBsaW5lcygpfTsKICB9CgogIGZ1bmN0aW9uIGxpbmVzKCkgewogICAgcmV0dXJuIHJhbmdlKGNlaWwoWDAgLyBEWCkgKiBEWCwgWDEsIERYKS5tYXAoWCkKICAgICAgICAuY29uY2F0KHJhbmdlKGNlaWwoWTAgLyBEWSkgKiBEWSwgWTEsIERZKS5tYXAoWSkpCiAgICAgICAgLmNvbmNhdChyYW5nZShjZWlsKHgwIC8gZHgpICogZHgsIHgxLCBkeCkuZmlsdGVyKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIGFicyh4ICUgRFgpID4gZXBzaWxvbiQ0OyB9KS5tYXAoeCkpCiAgICAgICAgLmNvbmNhdChyYW5nZShjZWlsKHkwIC8gZHkpICogZHksIHkxLCBkeSkuZmlsdGVyKGZ1bmN0aW9uKHkpIHsgcmV0dXJuIGFicyh5ICUgRFkpID4gZXBzaWxvbiQ0OyB9KS5tYXAoeSkpOwogIH0KCiAgZ3JhdGljdWxlLmxpbmVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gbGluZXMoKS5tYXAoZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsgcmV0dXJuIHt0eXBlOiAiTGluZVN0cmluZyIsIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc307IH0pOwogIH07CgogIGdyYXRpY3VsZS5vdXRsaW5lID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAiUG9seWdvbiIsCiAgICAgIGNvb3JkaW5hdGVzOiBbCiAgICAgICAgWChYMCkuY29uY2F0KAogICAgICAgIFkoWTEpLnNsaWNlKDEpLAogICAgICAgIFgoWDEpLnJldmVyc2UoKS5zbGljZSgxKSwKICAgICAgICBZKFkwKS5yZXZlcnNlKCkuc2xpY2UoMSkpCiAgICAgIF0KICAgIH07CiAgfTsKCiAgZ3JhdGljdWxlLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5leHRlbnRNaW5vcigpOwogICAgcmV0dXJuIGdyYXRpY3VsZS5leHRlbnRNYWpvcihfKS5leHRlbnRNaW5vcihfKTsKICB9OwoKICBncmF0aWN1bGUuZXh0ZW50TWFqb3IgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbW1gwLCBZMF0sIFtYMSwgWTFdXTsKICAgIFgwID0gK19bMF1bMF0sIFgxID0gK19bMV1bMF07CiAgICBZMCA9ICtfWzBdWzFdLCBZMSA9ICtfWzFdWzFdOwogICAgaWYgKFgwID4gWDEpIF8gPSBYMCwgWDAgPSBYMSwgWDEgPSBfOwogICAgaWYgKFkwID4gWTEpIF8gPSBZMCwgWTAgPSBZMSwgWTEgPSBfOwogICAgcmV0dXJuIGdyYXRpY3VsZS5wcmVjaXNpb24ocHJlY2lzaW9uKTsKICB9OwoKICBncmF0aWN1bGUuZXh0ZW50TWlub3IgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICAgIHgwID0gK19bMF1bMF0sIHgxID0gK19bMV1bMF07CiAgICB5MCA9ICtfWzBdWzFdLCB5MSA9ICtfWzFdWzFdOwogICAgaWYgKHgwID4geDEpIF8gPSB4MCwgeDAgPSB4MSwgeDEgPSBfOwogICAgaWYgKHkwID4geTEpIF8gPSB5MCwgeTAgPSB5MSwgeTEgPSBfOwogICAgcmV0dXJuIGdyYXRpY3VsZS5wcmVjaXNpb24ocHJlY2lzaW9uKTsKICB9OwoKICBncmF0aWN1bGUuc3RlcCA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5zdGVwTWlub3IoKTsKICAgIHJldHVybiBncmF0aWN1bGUuc3RlcE1ham9yKF8pLnN0ZXBNaW5vcihfKTsKICB9OwoKICBncmF0aWN1bGUuc3RlcE1ham9yID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW0RYLCBEWV07CiAgICBEWCA9ICtfWzBdLCBEWSA9ICtfWzFdOwogICAgcmV0dXJuIGdyYXRpY3VsZTsKICB9OwoKICBncmF0aWN1bGUuc3RlcE1pbm9yID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW2R4LCBkeV07CiAgICBkeCA9ICtfWzBdLCBkeSA9ICtfWzFdOwogICAgcmV0dXJuIGdyYXRpY3VsZTsKICB9OwoKICBncmF0aWN1bGUucHJlY2lzaW9uID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJlY2lzaW9uOwogICAgcHJlY2lzaW9uID0gK187CiAgICB4ID0gZ3JhdGljdWxlWCh5MCwgeTEsIDkwKTsKICAgIHkgPSBncmF0aWN1bGVZKHgwLCB4MSwgcHJlY2lzaW9uKTsKICAgIFggPSBncmF0aWN1bGVYKFkwLCBZMSwgOTApOwogICAgWSA9IGdyYXRpY3VsZVkoWDAsIFgxLCBwcmVjaXNpb24pOwogICAgcmV0dXJuIGdyYXRpY3VsZTsKICB9OwoKICByZXR1cm4gZ3JhdGljdWxlCiAgICAgIC5leHRlbnRNYWpvcihbWy0xODAsIC05MCArIGVwc2lsb24kNF0sIFsxODAsIDkwIC0gZXBzaWxvbiQ0XV0pCiAgICAgIC5leHRlbnRNaW5vcihbWy0xODAsIC04MCAtIGVwc2lsb24kNF0sIFsxODAsIDgwICsgZXBzaWxvbiQ0XV0pOwp9Cgp2YXIgaW50ZXJwb2xhdGUkMiA9IGZ1bmN0aW9uKGEsIGIpIHsKICB2YXIgeDAgPSBhWzBdICogcmFkaWFucywKICAgICAgeTAgPSBhWzFdICogcmFkaWFucywKICAgICAgeDEgPSBiWzBdICogcmFkaWFucywKICAgICAgeTEgPSBiWzFdICogcmFkaWFucywKICAgICAgY3kwID0gY29zJDEoeTApLAogICAgICBzeTAgPSBzaW4kMSh5MCksCiAgICAgIGN5MSA9IGNvcyQxKHkxKSwKICAgICAgc3kxID0gc2luJDEoeTEpLAogICAgICBreDAgPSBjeTAgKiBjb3MkMSh4MCksCiAgICAgIGt5MCA9IGN5MCAqIHNpbiQxKHgwKSwKICAgICAga3gxID0gY3kxICogY29zJDEoeDEpLAogICAgICBreTEgPSBjeTEgKiBzaW4kMSh4MSksCiAgICAgIGQgPSAyICogYXNpbiQxKHNxcnQkMShoYXZlcnNpbih5MSAtIHkwKSArIGN5MCAqIGN5MSAqIGhhdmVyc2luKHgxIC0geDApKSksCiAgICAgIGsgPSBzaW4kMShkKTsKCiAgdmFyIGludGVycG9sYXRlID0gZCA/IGZ1bmN0aW9uKHQpIHsKICAgIHZhciBCID0gc2luJDEodCAqPSBkKSAvIGssCiAgICAgICAgQSA9IHNpbiQxKGQgLSB0KSAvIGssCiAgICAgICAgeCA9IEEgKiBreDAgKyBCICoga3gxLAogICAgICAgIHkgPSBBICoga3kwICsgQiAqIGt5MSwKICAgICAgICB6ID0gQSAqIHN5MCArIEIgKiBzeTE7CiAgICByZXR1cm4gWwogICAgICBhdGFuMih5LCB4KSAqIGRlZ3JlZXMkMSwKICAgICAgYXRhbjIoeiwgc3FydCQxKHggKiB4ICsgeSAqIHkpKSAqIGRlZ3JlZXMkMQogICAgXTsKICB9IDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gW3gwICogZGVncmVlcyQxLCB5MCAqIGRlZ3JlZXMkMV07CiAgfTsKCiAgaW50ZXJwb2xhdGUuZGlzdGFuY2UgPSBkOwoKICByZXR1cm4gaW50ZXJwb2xhdGU7Cn0KCnZhciBpZGVudGl0eSQ3ID0gZnVuY3Rpb24oeCkgewogIHJldHVybiB4Owp9Cgp2YXIgYXJlYVN1bSQxID0gYWRkZXIoKTsKdmFyIGFyZWFSaW5nU3VtJDEgPSBhZGRlcigpOwp2YXIgeDAwOwp2YXIgeTAwOwp2YXIgeDAkMTsKdmFyIHkwJDE7Cgp2YXIgYXJlYVN0cmVhbSQxID0gewogIHBvaW50OiBub29wJDIsCiAgbGluZVN0YXJ0OiBub29wJDIsCiAgbGluZUVuZDogbm9vcCQyLAogIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICBhcmVhU3RyZWFtJDEubGluZVN0YXJ0ID0gYXJlYVJpbmdTdGFydCQxOwogICAgYXJlYVN0cmVhbSQxLmxpbmVFbmQgPSBhcmVhUmluZ0VuZCQxOwogIH0sCiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICBhcmVhU3RyZWFtJDEubGluZVN0YXJ0ID0gYXJlYVN0cmVhbSQxLmxpbmVFbmQgPSBhcmVhU3RyZWFtJDEucG9pbnQgPSBub29wJDI7CiAgICBhcmVhU3VtJDEuYWRkKGFicyhhcmVhUmluZ1N1bSQxKSk7CiAgICBhcmVhUmluZ1N1bSQxLnJlc2V0KCk7CiAgfSwKICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGFyZWEgPSBhcmVhU3VtJDEgLyAyOwogICAgYXJlYVN1bSQxLnJlc2V0KCk7CiAgICByZXR1cm4gYXJlYTsKICB9Cn07CgpmdW5jdGlvbiBhcmVhUmluZ1N0YXJ0JDEoKSB7CiAgYXJlYVN0cmVhbSQxLnBvaW50ID0gYXJlYVBvaW50Rmlyc3QkMTsKfQoKZnVuY3Rpb24gYXJlYVBvaW50Rmlyc3QkMSh4LCB5KSB7CiAgYXJlYVN0cmVhbSQxLnBvaW50ID0gYXJlYVBvaW50JDE7CiAgeDAwID0geDAkMSA9IHgsIHkwMCA9IHkwJDEgPSB5Owp9CgpmdW5jdGlvbiBhcmVhUG9pbnQkMSh4LCB5KSB7CiAgYXJlYVJpbmdTdW0kMS5hZGQoeTAkMSAqIHggLSB4MCQxICogeSk7CiAgeDAkMSA9IHgsIHkwJDEgPSB5Owp9CgpmdW5jdGlvbiBhcmVhUmluZ0VuZCQxKCkgewogIGFyZWFQb2ludCQxKHgwMCwgeTAwKTsKfQoKdmFyIHgwJDIgPSBJbmZpbml0eTsKdmFyIHkwJDIgPSB4MCQyOwp2YXIgeDEgPSAteDAkMjsKdmFyIHkxID0geDE7Cgp2YXIgYm91bmRzU3RyZWFtJDEgPSB7CiAgcG9pbnQ6IGJvdW5kc1BvaW50JDEsCiAgbGluZVN0YXJ0OiBub29wJDIsCiAgbGluZUVuZDogbm9vcCQyLAogIHBvbHlnb25TdGFydDogbm9vcCQyLAogIHBvbHlnb25FbmQ6IG5vb3AkMiwKICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGJvdW5kcyA9IFtbeDAkMiwgeTAkMl0sIFt4MSwgeTFdXTsKICAgIHgxID0geTEgPSAtKHkwJDIgPSB4MCQyID0gSW5maW5pdHkpOwogICAgcmV0dXJuIGJvdW5kczsKICB9Cn07CgpmdW5jdGlvbiBib3VuZHNQb2ludCQxKHgsIHkpIHsKICBpZiAoeCA8IHgwJDIpIHgwJDIgPSB4OwogIGlmICh4ID4geDEpIHgxID0geDsKICBpZiAoeSA8IHkwJDIpIHkwJDIgPSB5OwogIGlmICh5ID4geTEpIHkxID0geTsKfQoKLy8gVE9ETyBFbmZvcmNlIHBvc2l0aXZlIGFyZWEgZm9yIGV4dGVyaW9yLCBuZWdhdGl2ZSBhcmVhIGZvciBpbnRlcmlvcj8KCnZhciBYMCQxID0gMDsKdmFyIFkwJDEgPSAwOwp2YXIgWjAkMSA9IDA7CnZhciBYMSQxID0gMDsKdmFyIFkxJDEgPSAwOwp2YXIgWjEkMSA9IDA7CnZhciBYMiQxID0gMDsKdmFyIFkyJDEgPSAwOwp2YXIgWjIkMSA9IDA7CnZhciB4MDAkMTsKdmFyIHkwMCQxOwp2YXIgeDAkMzsKdmFyIHkwJDM7Cgp2YXIgY2VudHJvaWRTdHJlYW0kMSA9IHsKICBwb2ludDogY2VudHJvaWRQb2ludCQxLAogIGxpbmVTdGFydDogY2VudHJvaWRMaW5lU3RhcnQkMSwKICBsaW5lRW5kOiBjZW50cm9pZExpbmVFbmQkMSwKICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgY2VudHJvaWRTdHJlYW0kMS5saW5lU3RhcnQgPSBjZW50cm9pZFJpbmdTdGFydCQxOwogICAgY2VudHJvaWRTdHJlYW0kMS5saW5lRW5kID0gY2VudHJvaWRSaW5nRW5kJDE7CiAgfSwKICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50JDE7CiAgICBjZW50cm9pZFN0cmVhbSQxLmxpbmVTdGFydCA9IGNlbnRyb2lkTGluZVN0YXJ0JDE7CiAgICBjZW50cm9pZFN0cmVhbSQxLmxpbmVFbmQgPSBjZW50cm9pZExpbmVFbmQkMTsKICB9LAogIHJlc3VsdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgY2VudHJvaWQgPSBaMiQxID8gW1gyJDEgLyBaMiQxLCBZMiQxIC8gWjIkMV0KICAgICAgICA6IFoxJDEgPyBbWDEkMSAvIFoxJDEsIFkxJDEgLyBaMSQxXQogICAgICAgIDogWjAkMSA/IFtYMCQxIC8gWjAkMSwgWTAkMSAvIFowJDFdCiAgICAgICAgOiBbTmFOLCBOYU5dOwogICAgWDAkMSA9IFkwJDEgPSBaMCQxID0KICAgIFgxJDEgPSBZMSQxID0gWjEkMSA9CiAgICBYMiQxID0gWTIkMSA9IFoyJDEgPSAwOwogICAgcmV0dXJuIGNlbnRyb2lkOwogIH0KfTsKCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnQkMSh4LCB5KSB7CiAgWDAkMSArPSB4OwogIFkwJDEgKz0geTsKICArK1owJDE7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkTGluZVN0YXJ0JDEoKSB7CiAgY2VudHJvaWRTdHJlYW0kMS5wb2ludCA9IGNlbnRyb2lkUG9pbnRGaXJzdExpbmU7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRGaXJzdExpbmUoeCwgeSkgewogIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50TGluZTsKICBjZW50cm9pZFBvaW50JDEoeDAkMyA9IHgsIHkwJDMgPSB5KTsKfQoKZnVuY3Rpb24gY2VudHJvaWRQb2ludExpbmUoeCwgeSkgewogIHZhciBkeCA9IHggLSB4MCQzLCBkeSA9IHkgLSB5MCQzLCB6ID0gc3FydCQxKGR4ICogZHggKyBkeSAqIGR5KTsKICBYMSQxICs9IHogKiAoeDAkMyArIHgpIC8gMjsKICBZMSQxICs9IHogKiAoeTAkMyArIHkpIC8gMjsKICBaMSQxICs9IHo7CiAgY2VudHJvaWRQb2ludCQxKHgwJDMgPSB4LCB5MCQzID0geSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkTGluZUVuZCQxKCkgewogIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50JDE7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUmluZ1N0YXJ0JDEoKSB7CiAgY2VudHJvaWRTdHJlYW0kMS5wb2ludCA9IGNlbnRyb2lkUG9pbnRGaXJzdFJpbmc7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUmluZ0VuZCQxKCkgewogIGNlbnRyb2lkUG9pbnRSaW5nKHgwMCQxLCB5MDAkMSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRGaXJzdFJpbmcoeCwgeSkgewogIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50UmluZzsKICBjZW50cm9pZFBvaW50JDEoeDAwJDEgPSB4MCQzID0geCwgeTAwJDEgPSB5MCQzID0geSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRSaW5nKHgsIHkpIHsKICB2YXIgZHggPSB4IC0geDAkMywKICAgICAgZHkgPSB5IC0geTAkMywKICAgICAgeiA9IHNxcnQkMShkeCAqIGR4ICsgZHkgKiBkeSk7CgogIFgxJDEgKz0geiAqICh4MCQzICsgeCkgLyAyOwogIFkxJDEgKz0geiAqICh5MCQzICsgeSkgLyAyOwogIFoxJDEgKz0gejsKCiAgeiA9IHkwJDMgKiB4IC0geDAkMyAqIHk7CiAgWDIkMSArPSB6ICogKHgwJDMgKyB4KTsKICBZMiQxICs9IHogKiAoeTAkMyArIHkpOwogIFoyJDEgKz0geiAqIDM7CiAgY2VudHJvaWRQb2ludCQxKHgwJDMgPSB4LCB5MCQzID0geSk7Cn0KCmZ1bmN0aW9uIFBhdGhDb250ZXh0KGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKUGF0aENvbnRleHQucHJvdG90eXBlID0gewogIF9yYWRpdXM6IDQuNSwKICBwb2ludFJhZGl1czogZnVuY3Rpb24oXykgewogICAgcmV0dXJuIHRoaXMuX3JhZGl1cyA9IF8sIHRoaXM7CiAgfSwKICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwKICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fbGluZSA9PT0gMCkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX3BvaW50ID0gTmFOOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB7CiAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7CiAgICAgICAgdGhpcy5fcG9pbnQgPSAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMTogewogICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRlZmF1bHQ6IHsKICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4ICsgdGhpcy5fcmFkaXVzLCB5KTsKICAgICAgICB0aGlzLl9jb250ZXh0LmFyYyh4LCB5LCB0aGlzLl9yYWRpdXMsIDAsIHRhdSQ0KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCiAgcmVzdWx0OiBub29wJDIKfTsKCmZ1bmN0aW9uIFBhdGhTdHJpbmcoKSB7CiAgdGhpcy5fc3RyaW5nID0gW107Cn0KClBhdGhTdHJpbmcucHJvdG90eXBlID0gewogIF9jaXJjbGU6IGNpcmNsZSQyKDQuNSksCiAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiB0aGlzLl9jaXJjbGUgPSBjaXJjbGUkMihfKSwgdGhpczsKICB9LAogIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLl9saW5lID09PSAwKSB0aGlzLl9zdHJpbmcucHVzaCgiWiIpOwogICAgdGhpcy5fcG9pbnQgPSBOYU47CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICBjYXNlIDA6IHsKICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTSIsIHgsICIsIiwgeSk7CiAgICAgICAgdGhpcy5fcG9pbnQgPSAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMTogewogICAgICAgIHRoaXMuX3N0cmluZy5wdXNoKCJMIiwgeCwgIiwiLCB5KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWZhdWx0OiB7CiAgICAgICAgdGhpcy5fc3RyaW5nLnB1c2goIk0iLCB4LCAiLCIsIHksIHRoaXMuX2NpcmNsZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9LAogIHJlc3VsdDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fc3RyaW5nLmxlbmd0aCkgewogICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc3RyaW5nLmpvaW4oIiIpOwogICAgICB0aGlzLl9zdHJpbmcgPSBbXTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9Cn07CgpmdW5jdGlvbiBjaXJjbGUkMihyYWRpdXMpIHsKICByZXR1cm4gIm0wLCIgKyByYWRpdXMKICAgICAgKyAiYSIgKyByYWRpdXMgKyAiLCIgKyByYWRpdXMgKyAiIDAgMSwxIDAsIiArIC0yICogcmFkaXVzCiAgICAgICsgImEiICsgcmFkaXVzICsgIiwiICsgcmFkaXVzICsgIiAwIDEsMSAwLCIgKyAyICogcmFkaXVzCiAgICAgICsgInoiOwp9Cgp2YXIgaW5kZXgkMyA9IGZ1bmN0aW9uKCkgewogIHZhciBwb2ludFJhZGl1cyA9IDQuNSwKICAgICAgcHJvamVjdGlvbiwKICAgICAgcHJvamVjdGlvblN0cmVhbSwKICAgICAgY29udGV4dCwKICAgICAgY29udGV4dFN0cmVhbTsKCiAgZnVuY3Rpb24gcGF0aChvYmplY3QpIHsKICAgIGlmIChvYmplY3QpIHsKICAgICAgaWYgKHR5cGVvZiBwb2ludFJhZGl1cyA9PT0gImZ1bmN0aW9uIikgY29udGV4dFN0cmVhbS5wb2ludFJhZGl1cygrcG9pbnRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICAgIGdlb1N0cmVhbShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0oY29udGV4dFN0cmVhbSkpOwogICAgfQogICAgcmV0dXJuIGNvbnRleHRTdHJlYW0ucmVzdWx0KCk7CiAgfQoKICBwYXRoLmFyZWEgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgIGdlb1N0cmVhbShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0oYXJlYVN0cmVhbSQxKSk7CiAgICByZXR1cm4gYXJlYVN0cmVhbSQxLnJlc3VsdCgpOwogIH07CgogIHBhdGguYm91bmRzID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBnZW9TdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9uU3RyZWFtKGJvdW5kc1N0cmVhbSQxKSk7CiAgICByZXR1cm4gYm91bmRzU3RyZWFtJDEucmVzdWx0KCk7CiAgfTsKCiAgcGF0aC5jZW50cm9pZCA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShjZW50cm9pZFN0cmVhbSQxKSk7CiAgICByZXR1cm4gY2VudHJvaWRTdHJlYW0kMS5yZXN1bHQoKTsKICB9OwoKICBwYXRoLnByb2plY3Rpb24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcm9qZWN0aW9uU3RyZWFtID0gKHByb2plY3Rpb24gPSBfKSA9PSBudWxsID8gaWRlbnRpdHkkNyA6IF8uc3RyZWFtLCBwYXRoKSA6IHByb2plY3Rpb247CiAgfTsKCiAgcGF0aC5jb250ZXh0ID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY29udGV4dDsKICAgIGNvbnRleHRTdHJlYW0gPSAoY29udGV4dCA9IF8pID09IG51bGwgPyBuZXcgUGF0aFN0cmluZyA6IG5ldyBQYXRoQ29udGV4dChfKTsKICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgIT09ICJmdW5jdGlvbiIpIGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMocG9pbnRSYWRpdXMpOwogICAgcmV0dXJuIHBhdGg7CiAgfTsKCiAgcGF0aC5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBvaW50UmFkaXVzOwogICAgcG9pbnRSYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiAoY29udGV4dFN0cmVhbS5wb2ludFJhZGl1cygrXyksICtfKTsKICAgIHJldHVybiBwYXRoOwogIH07CgogIHJldHVybiBwYXRoLnByb2plY3Rpb24obnVsbCkuY29udGV4dChudWxsKTsKfQoKdmFyIHN1bSQyID0gYWRkZXIoKTsKCnZhciBwb2x5Z29uQ29udGFpbnMgPSBmdW5jdGlvbihwb2x5Z29uLCBwb2ludCkgewogIHZhciBsYW1iZGEgPSBwb2ludFswXSwKICAgICAgcGhpID0gcG9pbnRbMV0sCiAgICAgIG5vcm1hbCA9IFtzaW4kMShsYW1iZGEpLCAtY29zJDEobGFtYmRhKSwgMF0sCiAgICAgIGFuZ2xlID0gMCwKICAgICAgd2luZGluZyA9IDA7CgogIHN1bSQyLnJlc2V0KCk7CgogIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgIGlmICghKG0gPSAocmluZyA9IHBvbHlnb25baV0pLmxlbmd0aCkpIGNvbnRpbnVlOwogICAgdmFyIHJpbmcsCiAgICAgICAgbSwKICAgICAgICBwb2ludDAgPSByaW5nW20gLSAxXSwKICAgICAgICBsYW1iZGEwID0gcG9pbnQwWzBdLAogICAgICAgIHBoaTAgPSBwb2ludDBbMV0gLyAyICsgcXVhcnRlclBpLAogICAgICAgIHNpblBoaTAgPSBzaW4kMShwaGkwKSwKICAgICAgICBjb3NQaGkwID0gY29zJDEocGhpMCk7CgogICAgZm9yICh2YXIgaiA9IDA7IGogPCBtOyArK2osIGxhbWJkYTAgPSBsYW1iZGExLCBzaW5QaGkwID0gc2luUGhpMSwgY29zUGhpMCA9IGNvc1BoaTEsIHBvaW50MCA9IHBvaW50MSkgewogICAgICB2YXIgcG9pbnQxID0gcmluZ1tqXSwKICAgICAgICAgIGxhbWJkYTEgPSBwb2ludDFbMF0sCiAgICAgICAgICBwaGkxID0gcG9pbnQxWzFdIC8gMiArIHF1YXJ0ZXJQaSwKICAgICAgICAgIHNpblBoaTEgPSBzaW4kMShwaGkxKSwKICAgICAgICAgIGNvc1BoaTEgPSBjb3MkMShwaGkxKSwKICAgICAgICAgIGRlbHRhID0gbGFtYmRhMSAtIGxhbWJkYTAsCiAgICAgICAgICBzaWduJCQxID0gZGVsdGEgPj0gMCA/IDEgOiAtMSwKICAgICAgICAgIGFic0RlbHRhID0gc2lnbiQkMSAqIGRlbHRhLAogICAgICAgICAgYW50aW1lcmlkaWFuID0gYWJzRGVsdGEgPiBwaSQ0LAogICAgICAgICAgayA9IHNpblBoaTAgKiBzaW5QaGkxOwoKICAgICAgc3VtJDIuYWRkKGF0YW4yKGsgKiBzaWduJCQxICogc2luJDEoYWJzRGVsdGEpLCBjb3NQaGkwICogY29zUGhpMSArIGsgKiBjb3MkMShhYnNEZWx0YSkpKTsKICAgICAgYW5nbGUgKz0gYW50aW1lcmlkaWFuID8gZGVsdGEgKyBzaWduJCQxICogdGF1JDQgOiBkZWx0YTsKCiAgICAgIC8vIEFyZSB0aGUgbG9uZ2l0dWRlcyBlaXRoZXIgc2lkZSBvZiB0aGUgcG9pbnTDosKAwplzIG1lcmlkaWFuIChsYW1iZGEpLAogICAgICAvLyBhbmQgYXJlIHRoZSBsYXRpdHVkZXMgc21hbGxlciB0aGFuIHRoZSBwYXJhbGxlbCAocGhpKT8KICAgICAgaWYgKGFudGltZXJpZGlhbiBeIGxhbWJkYTAgPj0gbGFtYmRhIF4gbGFtYmRhMSA+PSBsYW1iZGEpIHsKICAgICAgICB2YXIgYXJjID0gY2FydGVzaWFuQ3Jvc3MoY2FydGVzaWFuKHBvaW50MCksIGNhcnRlc2lhbihwb2ludDEpKTsKICAgICAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGFyYyk7CiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGNhcnRlc2lhbkNyb3NzKG5vcm1hbCwgYXJjKTsKICAgICAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGludGVyc2VjdGlvbik7CiAgICAgICAgdmFyIHBoaUFyYyA9IChhbnRpbWVyaWRpYW4gXiBkZWx0YSA+PSAwID8gLTEgOiAxKSAqIGFzaW4kMShpbnRlcnNlY3Rpb25bMl0pOwogICAgICAgIGlmIChwaGkgPiBwaGlBcmMgfHwgcGhpID09PSBwaGlBcmMgJiYgKGFyY1swXSB8fCBhcmNbMV0pKSB7CiAgICAgICAgICB3aW5kaW5nICs9IGFudGltZXJpZGlhbiBeIGRlbHRhID49IDAgPyAxIDogLTE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyBGaXJzdCwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFNvdXRoIHBvbGUgaXMgaW5zaWRlIG9yIG91dHNpZGU6CiAgLy8KICAvLyBJdCBpcyBpbnNpZGUgaWY6CiAgLy8gKiB0aGUgcG9seWdvbiB3aW5kcyBhcm91bmQgaXQgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLgogIC8vICogdGhlIHBvbHlnb24gZG9lcyBub3QgKGN1bXVsYXRpdmVseSkgd2luZCBhcm91bmQgaXQsIGJ1dCBoYXMgYSBuZWdhdGl2ZQogIC8vICAgKGNvdW50ZXItY2xvY2t3aXNlKSBhcmVhLgogIC8vCiAgLy8gU2Vjb25kLCBjb3VudCB0aGUgKHNpZ25lZCkgbnVtYmVyIG9mIHRpbWVzIGEgc2VnbWVudCBjcm9zc2VzIGEgbGFtYmRhCiAgLy8gZnJvbSB0aGUgcG9pbnQgdG8gdGhlIFNvdXRoIHBvbGUuICBJZiBpdCBpcyB6ZXJvLCB0aGVuIHRoZSBwb2ludCBpcyB0aGUKICAvLyBzYW1lIHNpZGUgYXMgdGhlIFNvdXRoIHBvbGUuCgogIHJldHVybiAoYW5nbGUgPCAtZXBzaWxvbiQ0IHx8IGFuZ2xlIDwgZXBzaWxvbiQ0ICYmIHN1bSQyIDwgLWVwc2lsb24kNCkgXiAod2luZGluZyAmIDEpOwp9Cgp2YXIgY2xpcCA9IGZ1bmN0aW9uKHBvaW50VmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBzdGFydCkgewogIHJldHVybiBmdW5jdGlvbihyb3RhdGUsIHNpbmspIHsKICAgIHZhciBsaW5lID0gY2xpcExpbmUoc2luayksCiAgICAgICAgcm90YXRlZFN0YXJ0ID0gcm90YXRlLmludmVydChzdGFydFswXSwgc3RhcnRbMV0pLAogICAgICAgIHJpbmdCdWZmZXIgPSBjbGlwQnVmZmVyKCksCiAgICAgICAgcmluZ1NpbmsgPSBjbGlwTGluZShyaW5nQnVmZmVyKSwKICAgICAgICBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlLAogICAgICAgIHBvbHlnb24sCiAgICAgICAgc2VnbWVudHMsCiAgICAgICAgcmluZzsKCiAgICB2YXIgY2xpcCA9IHsKICAgICAgcG9pbnQ6IHBvaW50LAogICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCwKICAgICAgbGluZUVuZDogbGluZUVuZCwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnRSaW5nOwogICAgICAgIGNsaXAubGluZVN0YXJ0ID0gcmluZ1N0YXJ0OwogICAgICAgIGNsaXAubGluZUVuZCA9IHJpbmdFbmQ7CiAgICAgICAgc2VnbWVudHMgPSBbXTsKICAgICAgICBwb2x5Z29uID0gW107CiAgICAgIH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGNsaXAucG9pbnQgPSBwb2ludDsKICAgICAgICBjbGlwLmxpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgICBjbGlwLmxpbmVFbmQgPSBsaW5lRW5kOwogICAgICAgIHNlZ21lbnRzID0gbWVyZ2Uoc2VnbWVudHMpOwogICAgICAgIHZhciBzdGFydEluc2lkZSA9IHBvbHlnb25Db250YWlucyhwb2x5Z29uLCByb3RhdGVkU3RhcnQpOwogICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGgpIHsKICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgIGNsaXBQb2x5Z29uKHNlZ21lbnRzLCBjb21wYXJlSW50ZXJzZWN0aW9uLCBzdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIHNpbmspOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnRJbnNpZGUpIHsKICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7CiAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzaW5rKTsKICAgICAgICAgIHNpbmsubGluZUVuZCgpOwogICAgICAgIH0KICAgICAgICBpZiAocG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvbkVuZCgpLCBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlOwogICAgICAgIHNlZ21lbnRzID0gcG9seWdvbiA9IG51bGw7CiAgICAgIH0sCiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgc2luay5wb2x5Z29uU3RhcnQoKTsKICAgICAgICBzaW5rLmxpbmVTdGFydCgpOwogICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHNpbmspOwogICAgICAgIHNpbmsubGluZUVuZCgpOwogICAgICAgIHNpbmsucG9seWdvbkVuZCgpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHBvaW50KGxhbWJkYSwgcGhpKSB7CiAgICAgIHZhciBwb2ludCA9IHJvdGF0ZShsYW1iZGEsIHBoaSk7CiAgICAgIGlmIChwb2ludFZpc2libGUobGFtYmRhID0gcG9pbnRbMF0sIHBoaSA9IHBvaW50WzFdKSkgc2luay5wb2ludChsYW1iZGEsIHBoaSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9pbnRMaW5lKGxhbWJkYSwgcGhpKSB7CiAgICAgIHZhciBwb2ludCA9IHJvdGF0ZShsYW1iZGEsIHBoaSk7CiAgICAgIGxpbmUucG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7CiAgICAgIGNsaXAucG9pbnQgPSBwb2ludExpbmU7CiAgICAgIGxpbmUubGluZVN0YXJ0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgY2xpcC5wb2ludCA9IHBvaW50OwogICAgICBsaW5lLmxpbmVFbmQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2ludFJpbmcobGFtYmRhLCBwaGkpIHsKICAgICAgcmluZy5wdXNoKFtsYW1iZGEsIHBoaV0pOwogICAgICB2YXIgcG9pbnQgPSByb3RhdGUobGFtYmRhLCBwaGkpOwogICAgICByaW5nU2luay5wb2ludChwb2ludFswXSwgcG9pbnRbMV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHsKICAgICAgcmluZ1NpbmsubGluZVN0YXJ0KCk7CiAgICAgIHJpbmcgPSBbXTsKICAgIH0KCiAgICBmdW5jdGlvbiByaW5nRW5kKCkgewogICAgICBwb2ludFJpbmcocmluZ1swXVswXSwgcmluZ1swXVsxXSk7CiAgICAgIHJpbmdTaW5rLmxpbmVFbmQoKTsKCiAgICAgIHZhciBjbGVhbiA9IHJpbmdTaW5rLmNsZWFuKCksCiAgICAgICAgICByaW5nU2VnbWVudHMgPSByaW5nQnVmZmVyLnJlc3VsdCgpLAogICAgICAgICAgaSwgbiA9IHJpbmdTZWdtZW50cy5sZW5ndGgsIG0sCiAgICAgICAgICBzZWdtZW50LAogICAgICAgICAgcG9pbnQ7CgogICAgICByaW5nLnBvcCgpOwogICAgICBwb2x5Z29uLnB1c2gocmluZyk7CiAgICAgIHJpbmcgPSBudWxsOwoKICAgICAgaWYgKCFuKSByZXR1cm47CgogICAgICAvLyBObyBpbnRlcnNlY3Rpb25zLgogICAgICBpZiAoY2xlYW4gJiAxKSB7CiAgICAgICAgc2VnbWVudCA9IHJpbmdTZWdtZW50c1swXTsKICAgICAgICBpZiAoKG0gPSBzZWdtZW50Lmxlbmd0aCAtIDEpID4gMCkgewogICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgc2luay5saW5lU3RhcnQoKTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHNpbmsucG9pbnQoKHBvaW50ID0gc2VnbWVudFtpXSlbMF0sIHBvaW50WzFdKTsKICAgICAgICAgIHNpbmsubGluZUVuZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIFJlam9pbiBjb25uZWN0ZWQgc2VnbWVudHMuCiAgICAgIC8vIFRPRE8gcmV1c2UgcmluZ0J1ZmZlci5yZWpvaW4oKT8KICAgICAgaWYgKG4gPiAxICYmIGNsZWFuICYgMikgcmluZ1NlZ21lbnRzLnB1c2gocmluZ1NlZ21lbnRzLnBvcCgpLmNvbmNhdChyaW5nU2VnbWVudHMuc2hpZnQoKSkpOwoKICAgICAgc2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMuZmlsdGVyKHZhbGlkU2VnbWVudCkpOwogICAgfQoKICAgIHJldHVybiBjbGlwOwogIH07Cn0KCmZ1bmN0aW9uIHZhbGlkU2VnbWVudChzZWdtZW50KSB7CiAgcmV0dXJuIHNlZ21lbnQubGVuZ3RoID4gMTsKfQoKLy8gSW50ZXJzZWN0aW9ucyBhcmUgc29ydGVkIGFsb25nIHRoZSBjbGlwIGVkZ2UuIEZvciBib3RoIGFudGltZXJpZGlhbiBjdXR0aW5nCi8vIGFuZCBjaXJjbGUgY2xpcHBpbmcsIHRoZSBzYW1lIGNvbXBhcmlzb24gaXMgdXNlZC4KZnVuY3Rpb24gY29tcGFyZUludGVyc2VjdGlvbihhLCBiKSB7CiAgcmV0dXJuICgoYSA9IGEueClbMF0gPCAwID8gYVsxXSAtIGhhbGZQaSQzIC0gZXBzaWxvbiQ0IDogaGFsZlBpJDMgLSBhWzFdKQogICAgICAgLSAoKGIgPSBiLngpWzBdIDwgMCA/IGJbMV0gLSBoYWxmUGkkMyAtIGVwc2lsb24kNCA6IGhhbGZQaSQzIC0gYlsxXSk7Cn0KCnZhciBjbGlwQW50aW1lcmlkaWFuID0gY2xpcCgKICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sCiAgY2xpcEFudGltZXJpZGlhbkxpbmUsCiAgY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlLAogIFstcGkkNCwgLWhhbGZQaSQzXQopOwoKLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRzIGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlczogMCAtIHRoZXJlIHdlcmUKLy8gaW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMgZW1wdHk7IDEgLSBubyBpbnRlcnNlY3Rpb25zOyAyIC0gdGhlcmUgd2VyZQovLyBpbnRlcnNlY3Rpb25zLCBhbmQgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzIHNob3VsZCBiZSByZWpvaW5lZC4KZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkxpbmUoc3RyZWFtKSB7CiAgdmFyIGxhbWJkYTAgPSBOYU4sCiAgICAgIHBoaTAgPSBOYU4sCiAgICAgIHNpZ24wID0gTmFOLAogICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9ucwoKICByZXR1cm4gewogICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICBjbGVhbiA9IDE7CiAgICB9LAogICAgcG9pbnQ6IGZ1bmN0aW9uKGxhbWJkYTEsIHBoaTEpIHsKICAgICAgdmFyIHNpZ24xID0gbGFtYmRhMSA+IDAgPyBwaSQ0IDogLXBpJDQsCiAgICAgICAgICBkZWx0YSA9IGFicyhsYW1iZGExIC0gbGFtYmRhMCk7CiAgICAgIGlmIChhYnMoZGVsdGEgLSBwaSQ0KSA8IGVwc2lsb24kNCkgeyAvLyBsaW5lIGNyb3NzZXMgYSBwb2xlCiAgICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTAsIHBoaTAgPSAocGhpMCArIHBoaTEpIC8gMiA+IDAgPyBoYWxmUGkkMyA6IC1oYWxmUGkkMyk7CiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTsKICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjEsIHBoaTApOwogICAgICAgIHN0cmVhbS5wb2ludChsYW1iZGExLCBwaGkwKTsKICAgICAgICBjbGVhbiA9IDA7CiAgICAgIH0gZWxzZSBpZiAoc2lnbjAgIT09IHNpZ24xICYmIGRlbHRhID49IHBpJDQpIHsgLy8gbGluZSBjcm9zc2VzIGFudGltZXJpZGlhbgogICAgICAgIGlmIChhYnMobGFtYmRhMCAtIHNpZ24wKSA8IGVwc2lsb24kNCkgbGFtYmRhMCAtPSBzaWduMCAqIGVwc2lsb24kNDsgLy8gaGFuZGxlIGRlZ2VuZXJhY2llcwogICAgICAgIGlmIChhYnMobGFtYmRhMSAtIHNpZ24xKSA8IGVwc2lsb24kNCkgbGFtYmRhMSAtPSBzaWduMSAqIGVwc2lsb24kNDsKICAgICAgICBwaGkwID0gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdChsYW1iZGEwLCBwaGkwLCBsYW1iZGExLCBwaGkxKTsKICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjAsIHBoaTApOwogICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgIHN0cmVhbS5wb2ludChzaWduMSwgcGhpMCk7CiAgICAgICAgY2xlYW4gPSAwOwogICAgICB9CiAgICAgIHN0cmVhbS5wb2ludChsYW1iZGEwID0gbGFtYmRhMSwgcGhpMCA9IHBoaTEpOwogICAgICBzaWduMCA9IHNpZ24xOwogICAgfSwKICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICBsYW1iZGEwID0gcGhpMCA9IE5hTjsKICAgIH0sCiAgICBjbGVhbjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAyIC0gY2xlYW47IC8vIGlmIGludGVyc2VjdGlvbnMsIHJlam9pbiBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIGNsaXBBbnRpbWVyaWRpYW5JbnRlcnNlY3QobGFtYmRhMCwgcGhpMCwgbGFtYmRhMSwgcGhpMSkgewogIHZhciBjb3NQaGkwLAogICAgICBjb3NQaGkxLAogICAgICBzaW5MYW1iZGEwTGFtYmRhMSA9IHNpbiQxKGxhbWJkYTAgLSBsYW1iZGExKTsKICByZXR1cm4gYWJzKHNpbkxhbWJkYTBMYW1iZGExKSA+IGVwc2lsb24kNAogICAgICA/IGF0YW4oKHNpbiQxKHBoaTApICogKGNvc1BoaTEgPSBjb3MkMShwaGkxKSkgKiBzaW4kMShsYW1iZGExKQogICAgICAgICAgLSBzaW4kMShwaGkxKSAqIChjb3NQaGkwID0gY29zJDEocGhpMCkpICogc2luJDEobGFtYmRhMCkpCiAgICAgICAgICAvIChjb3NQaGkwICogY29zUGhpMSAqIHNpbkxhbWJkYTBMYW1iZGExKSkKICAgICAgOiAocGhpMCArIHBoaTEpIC8gMjsKfQoKZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0cmVhbSkgewogIHZhciBwaGk7CiAgaWYgKGZyb20gPT0gbnVsbCkgewogICAgcGhpID0gZGlyZWN0aW9uICogaGFsZlBpJDM7CiAgICBzdHJlYW0ucG9pbnQoLXBpJDQsIHBoaSk7CiAgICBzdHJlYW0ucG9pbnQoMCwgcGhpKTsKICAgIHN0cmVhbS5wb2ludChwaSQ0LCBwaGkpOwogICAgc3RyZWFtLnBvaW50KHBpJDQsIDApOwogICAgc3RyZWFtLnBvaW50KHBpJDQsIC1waGkpOwogICAgc3RyZWFtLnBvaW50KDAsIC1waGkpOwogICAgc3RyZWFtLnBvaW50KC1waSQ0LCAtcGhpKTsKICAgIHN0cmVhbS5wb2ludCgtcGkkNCwgMCk7CiAgICBzdHJlYW0ucG9pbnQoLXBpJDQsIHBoaSk7CiAgfSBlbHNlIGlmIChhYnMoZnJvbVswXSAtIHRvWzBdKSA+IGVwc2lsb24kNCkgewogICAgdmFyIGxhbWJkYSA9IGZyb21bMF0gPCB0b1swXSA/IHBpJDQgOiAtcGkkNDsKICAgIHBoaSA9IGRpcmVjdGlvbiAqIGxhbWJkYSAvIDI7CiAgICBzdHJlYW0ucG9pbnQoLWxhbWJkYSwgcGhpKTsKICAgIHN0cmVhbS5wb2ludCgwLCBwaGkpOwogICAgc3RyZWFtLnBvaW50KGxhbWJkYSwgcGhpKTsKICB9IGVsc2UgewogICAgc3RyZWFtLnBvaW50KHRvWzBdLCB0b1sxXSk7CiAgfQp9Cgp2YXIgY2xpcENpcmNsZSA9IGZ1bmN0aW9uKHJhZGl1cywgZGVsdGEpIHsKICB2YXIgY3IgPSBjb3MkMShyYWRpdXMpLAogICAgICBzbWFsbFJhZGl1cyA9IGNyID4gMCwKICAgICAgbm90SGVtaXNwaGVyZSA9IGFicyhjcikgPiBlcHNpbG9uJDQ7IC8vIFRPRE8gb3B0aW1pc2UgZm9yIHRoaXMgY29tbW9uIGNhc2UKCiAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7CiAgICBjaXJjbGVTdHJlYW0oc3RyZWFtLCByYWRpdXMsIGRlbHRhLCBkaXJlY3Rpb24sIGZyb20sIHRvKTsKICB9CgogIGZ1bmN0aW9uIHZpc2libGUobGFtYmRhLCBwaGkpIHsKICAgIHJldHVybiBjb3MkMShsYW1iZGEpICogY29zJDEocGhpKSA+IGNyOwogIH0KCiAgLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRzIGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlcyB1c2VkIGZvciBwb2x5Z29uCiAgLy8gY2xpcHBpbmc6IDAgLSB0aGVyZSB3ZXJlIGludGVyc2VjdGlvbnMgb3IgdGhlIGxpbmUgd2FzIGVtcHR5OyAxIC0gbm8KICAvLyBpbnRlcnNlY3Rpb25zIDIgLSB0aGVyZSB3ZXJlIGludGVyc2VjdGlvbnMsIGFuZCB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMKICAvLyBzaG91bGQgYmUgcmVqb2luZWQuCiAgZnVuY3Rpb24gY2xpcExpbmUoc3RyZWFtKSB7CiAgICB2YXIgcG9pbnQwLCAvLyBwcmV2aW91cyBwb2ludAogICAgICAgIGMwLCAvLyBjb2RlIGZvciBwcmV2aW91cyBwb2ludAogICAgICAgIHYwLCAvLyB2aXNpYmlsaXR5IG9mIHByZXZpb3VzIHBvaW50CiAgICAgICAgdjAwLCAvLyB2aXNpYmlsaXR5IG9mIGZpcnN0IHBvaW50CiAgICAgICAgY2xlYW47IC8vIG5vIGludGVyc2VjdGlvbnMKICAgIHJldHVybiB7CiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdjAwID0gdjAgPSBmYWxzZTsKICAgICAgICBjbGVhbiA9IDE7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbihsYW1iZGEsIHBoaSkgewogICAgICAgIHZhciBwb2ludDEgPSBbbGFtYmRhLCBwaGldLAogICAgICAgICAgICBwb2ludDIsCiAgICAgICAgICAgIHYgPSB2aXNpYmxlKGxhbWJkYSwgcGhpKSwKICAgICAgICAgICAgYyA9IHNtYWxsUmFkaXVzCiAgICAgICAgICAgICAgPyB2ID8gMCA6IGNvZGUobGFtYmRhLCBwaGkpCiAgICAgICAgICAgICAgOiB2ID8gY29kZShsYW1iZGEgKyAobGFtYmRhIDwgMCA/IHBpJDQgOiAtcGkkNCksIHBoaSkgOiAwOwogICAgICAgIGlmICghcG9pbnQwICYmICh2MDAgPSB2MCA9IHYpKSBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgLy8gSGFuZGxlIGRlZ2VuZXJhY2llcy4KICAgICAgICAvLyBUT0RPIGlnbm9yZSBpZiBub3QgY2xpcHBpbmcgcG9seWdvbnMuCiAgICAgICAgaWYgKHYgIT09IHYwKSB7CiAgICAgICAgICBwb2ludDIgPSBpbnRlcnNlY3QocG9pbnQwLCBwb2ludDEpOwogICAgICAgICAgaWYgKHBvaW50RXF1YWwocG9pbnQwLCBwb2ludDIpIHx8IHBvaW50RXF1YWwocG9pbnQxLCBwb2ludDIpKSB7CiAgICAgICAgICAgIHBvaW50MVswXSArPSBlcHNpbG9uJDQ7CiAgICAgICAgICAgIHBvaW50MVsxXSArPSBlcHNpbG9uJDQ7CiAgICAgICAgICAgIHYgPSB2aXNpYmxlKHBvaW50MVswXSwgcG9pbnQxWzFdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHYgIT09IHYwKSB7CiAgICAgICAgICBjbGVhbiA9IDA7CiAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAvLyBvdXRzaWRlIGdvaW5nIGluCiAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MSwgcG9pbnQwKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MlswXSwgcG9pbnQyWzFdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGluc2lkZSBnb2luZyBvdXQKICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MlswXSwgcG9pbnQyWzFdKTsKICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHBvaW50MCA9IHBvaW50MjsKICAgICAgICB9IGVsc2UgaWYgKG5vdEhlbWlzcGhlcmUgJiYgcG9pbnQwICYmIHNtYWxsUmFkaXVzIF4gdikgewogICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAvLyBJZiB0aGUgY29kZXMgZm9yIHR3byBwb2ludHMgYXJlIGRpZmZlcmVudCwgb3IgYXJlIGJvdGggemVybywKICAgICAgICAgIC8vIGFuZCB0aGVyZSB0aGlzIHNlZ21lbnQgaW50ZXJzZWN0cyB3aXRoIHRoZSBzbWFsbCBjaXJjbGUuCiAgICAgICAgICBpZiAoIShjICYgYzApICYmICh0ID0gaW50ZXJzZWN0KHBvaW50MSwgcG9pbnQwLCB0cnVlKSkpIHsKICAgICAgICAgICAgY2xlYW4gPSAwOwogICAgICAgICAgICBpZiAoc21hbGxSYWRpdXMpIHsKICAgICAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMF1bMF0sIHRbMF1bMV0pOwogICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTsKICAgICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTsKICAgICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFswXVswXSwgdFswXVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHYgJiYgKCFwb2ludDAgfHwgIXBvaW50RXF1YWwocG9pbnQwLCBwb2ludDEpKSkgewogICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MVswXSwgcG9pbnQxWzFdKTsKICAgICAgICB9CiAgICAgICAgcG9pbnQwID0gcG9pbnQxLCB2MCA9IHYsIGMwID0gYzsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHYwKSBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgIHBvaW50MCA9IG51bGw7CiAgICAgIH0sCiAgICAgIC8vIFJlam9pbiBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cyBpZiB0aGVyZSB3ZXJlIGludGVyc2VjdGlvbnMgYW5kIHRoZSBmaXJzdAogICAgICAvLyBhbmQgbGFzdCBwb2ludHMgd2VyZSB2aXNpYmxlLgogICAgICBjbGVhbjogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNsZWFuIHwgKCh2MDAgJiYgdjApIDw8IDEpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW50ZXJzZWN0cyB0aGUgZ3JlYXQgY2lyY2xlIGJldHdlZW4gYSBhbmQgYiB3aXRoIHRoZSBjbGlwIGNpcmNsZS4KICBmdW5jdGlvbiBpbnRlcnNlY3QoYSwgYiwgdHdvKSB7CiAgICB2YXIgcGEgPSBjYXJ0ZXNpYW4oYSksCiAgICAgICAgcGIgPSBjYXJ0ZXNpYW4oYik7CgogICAgLy8gV2UgaGF2ZSB0d28gcGxhbmVzLCBuMS5wID0gZDEgYW5kIG4yLnAgPSBkMi4KICAgIC8vIEZpbmQgaW50ZXJzZWN0aW9uIGxpbmUgcCh0KSA9IGMxIG4xICsgYzIgbjIgKyB0IChuMSDDosKowq8gbjIpLgogICAgdmFyIG4xID0gWzEsIDAsIDBdLCAvLyBub3JtYWwKICAgICAgICBuMiA9IGNhcnRlc2lhbkNyb3NzKHBhLCBwYiksCiAgICAgICAgbjJuMiA9IGNhcnRlc2lhbkRvdChuMiwgbjIpLAogICAgICAgIG4xbjIgPSBuMlswXSwgLy8gY2FydGVzaWFuRG90KG4xLCBuMiksCiAgICAgICAgZGV0ZXJtaW5hbnQgPSBuMm4yIC0gbjFuMiAqIG4xbjI7CgogICAgLy8gVHdvIHBvbGFyIHBvaW50cy4KICAgIGlmICghZGV0ZXJtaW5hbnQpIHJldHVybiAhdHdvICYmIGE7CgogICAgdmFyIGMxID0gIGNyICogbjJuMiAvIGRldGVybWluYW50LAogICAgICAgIGMyID0gLWNyICogbjFuMiAvIGRldGVybWluYW50LAogICAgICAgIG4xeG4yID0gY2FydGVzaWFuQ3Jvc3MobjEsIG4yKSwKICAgICAgICBBID0gY2FydGVzaWFuU2NhbGUobjEsIGMxKSwKICAgICAgICBCID0gY2FydGVzaWFuU2NhbGUobjIsIGMyKTsKICAgIGNhcnRlc2lhbkFkZEluUGxhY2UoQSwgQik7CgogICAgLy8gU29sdmUgfHAodCl8XjIgPSAxLgogICAgdmFyIHUgPSBuMXhuMiwKICAgICAgICB3ID0gY2FydGVzaWFuRG90KEEsIHUpLAogICAgICAgIHV1ID0gY2FydGVzaWFuRG90KHUsIHUpLAogICAgICAgIHQyID0gdyAqIHcgLSB1dSAqIChjYXJ0ZXNpYW5Eb3QoQSwgQSkgLSAxKTsKCiAgICBpZiAodDIgPCAwKSByZXR1cm47CgogICAgdmFyIHQgPSBzcXJ0JDEodDIpLAogICAgICAgIHEgPSBjYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgLSB0KSAvIHV1KTsKICAgIGNhcnRlc2lhbkFkZEluUGxhY2UocSwgQSk7CiAgICBxID0gc3BoZXJpY2FsKHEpOwoKICAgIGlmICghdHdvKSByZXR1cm4gcTsKCiAgICAvLyBUd28gaW50ZXJzZWN0aW9uIHBvaW50cy4KICAgIHZhciBsYW1iZGEwID0gYVswXSwKICAgICAgICBsYW1iZGExID0gYlswXSwKICAgICAgICBwaGkwID0gYVsxXSwKICAgICAgICBwaGkxID0gYlsxXSwKICAgICAgICB6OwoKICAgIGlmIChsYW1iZGExIDwgbGFtYmRhMCkgeiA9IGxhbWJkYTAsIGxhbWJkYTAgPSBsYW1iZGExLCBsYW1iZGExID0gejsKCiAgICB2YXIgZGVsdGEgPSBsYW1iZGExIC0gbGFtYmRhMCwKICAgICAgICBwb2xhciA9IGFicyhkZWx0YSAtIHBpJDQpIDwgZXBzaWxvbiQ0LAogICAgICAgIG1lcmlkaWFuID0gcG9sYXIgfHwgZGVsdGEgPCBlcHNpbG9uJDQ7CgogICAgaWYgKCFwb2xhciAmJiBwaGkxIDwgcGhpMCkgeiA9IHBoaTAsIHBoaTAgPSBwaGkxLCBwaGkxID0gejsKCiAgICAvLyBDaGVjayB0aGF0IHRoZSBmaXJzdCBwb2ludCBpcyBiZXR3ZWVuIGEgYW5kIGIuCiAgICBpZiAobWVyaWRpYW4KICAgICAgICA/IHBvbGFyCiAgICAgICAgICA/IHBoaTAgKyBwaGkxID4gMCBeIHFbMV0gPCAoYWJzKHFbMF0gLSBsYW1iZGEwKSA8IGVwc2lsb24kNCA/IHBoaTAgOiBwaGkxKQogICAgICAgICAgOiBwaGkwIDw9IHFbMV0gJiYgcVsxXSA8PSBwaGkxCiAgICAgICAgOiBkZWx0YSA+IHBpJDQgXiAobGFtYmRhMCA8PSBxWzBdICYmIHFbMF0gPD0gbGFtYmRhMSkpIHsKICAgICAgdmFyIHExID0gY2FydGVzaWFuU2NhbGUodSwgKC13ICsgdCkgLyB1dSk7CiAgICAgIGNhcnRlc2lhbkFkZEluUGxhY2UocTEsIEEpOwogICAgICByZXR1cm4gW3EsIHNwaGVyaWNhbChxMSldOwogICAgfQogIH0KCiAgLy8gR2VuZXJhdGVzIGEgNC1iaXQgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgYSBwb2ludCByZWxhdGl2ZSB0bwogIC8vIHRoZSBzbWFsbCBjaXJjbGUncyBib3VuZGluZyBib3guCiAgZnVuY3Rpb24gY29kZShsYW1iZGEsIHBoaSkgewogICAgdmFyIHIgPSBzbWFsbFJhZGl1cyA/IHJhZGl1cyA6IHBpJDQgLSByYWRpdXMsCiAgICAgICAgY29kZSA9IDA7CiAgICBpZiAobGFtYmRhIDwgLXIpIGNvZGUgfD0gMTsgLy8gbGVmdAogICAgZWxzZSBpZiAobGFtYmRhID4gcikgY29kZSB8PSAyOyAvLyByaWdodAogICAgaWYgKHBoaSA8IC1yKSBjb2RlIHw9IDQ7IC8vIGJlbG93CiAgICBlbHNlIGlmIChwaGkgPiByKSBjb2RlIHw9IDg7IC8vIGFib3ZlCiAgICByZXR1cm4gY29kZTsKICB9CgogIHJldHVybiBjbGlwKHZpc2libGUsIGNsaXBMaW5lLCBpbnRlcnBvbGF0ZSwgc21hbGxSYWRpdXMgPyBbMCwgLXJhZGl1c10gOiBbLXBpJDQsIHJhZGl1cyAtIHBpJDRdKTsKfQoKdmFyIHRyYW5zZm9ybSQxID0gZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgcmV0dXJuIHsKICAgIHN0cmVhbTogdHJhbnNmb3JtJDIocHJvdG90eXBlKQogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybSQyKHByb3RvdHlwZSkgewogIGZ1bmN0aW9uIFQoKSB7fQogIHZhciBwID0gVC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybSQxLnByb3RvdHlwZSk7CiAgZm9yICh2YXIgayBpbiBwcm90b3R5cGUpIHBba10gPSBwcm90b3R5cGVba107CiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkgewogICAgdmFyIHQgPSBuZXcgVDsKICAgIHQuc3RyZWFtID0gc3RyZWFtOwogICAgcmV0dXJuIHQ7CiAgfTsKfQoKZnVuY3Rpb24gVHJhbnNmb3JtJDEoKSB7fQoKVHJhbnNmb3JtJDEucHJvdG90eXBlID0gewogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuc3RyZWFtLnBvaW50KHgsIHkpOyB9LAogIHNwaGVyZTogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnNwaGVyZSgpOyB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLmxpbmVTdGFydCgpOyB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5saW5lRW5kKCk7IH0sCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCk7IH0sCiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnBvbHlnb25FbmQoKTsgfQp9OwoKZnVuY3Rpb24gZml0KHByb2plY3QsIGV4dGVudCwgb2JqZWN0KSB7CiAgdmFyIHcgPSBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0sCiAgICAgIGggPSBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0sCiAgICAgIGNsaXAgPSBwcm9qZWN0LmNsaXBFeHRlbnQgJiYgcHJvamVjdC5jbGlwRXh0ZW50KCk7CgogIHByb2plY3QKICAgICAgLnNjYWxlKDE1MCkKICAgICAgLnRyYW5zbGF0ZShbMCwgMF0pOwoKICBpZiAoY2xpcCAhPSBudWxsKSBwcm9qZWN0LmNsaXBFeHRlbnQobnVsbCk7CgogIGdlb1N0cmVhbShvYmplY3QsIHByb2plY3Quc3RyZWFtKGJvdW5kc1N0cmVhbSQxKSk7CgogIHZhciBiID0gYm91bmRzU3RyZWFtJDEucmVzdWx0KCksCiAgICAgIGsgPSBNYXRoLm1pbih3IC8gKGJbMV1bMF0gLSBiWzBdWzBdKSwgaCAvIChiWzFdWzFdIC0gYlswXVsxXSkpLAogICAgICB4ID0gK2V4dGVudFswXVswXSArICh3IC0gayAqIChiWzFdWzBdICsgYlswXVswXSkpIC8gMiwKICAgICAgeSA9ICtleHRlbnRbMF1bMV0gKyAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7CgogIGlmIChjbGlwICE9IG51bGwpIHByb2plY3QuY2xpcEV4dGVudChjbGlwKTsKCiAgcmV0dXJuIHByb2plY3QKICAgICAgLnNjYWxlKGsgKiAxNTApCiAgICAgIC50cmFuc2xhdGUoW3gsIHldKTsKfQoKZnVuY3Rpb24gZml0U2l6ZShwcm9qZWN0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHNpemUsIG9iamVjdCkgewogICAgcmV0dXJuIGZpdChwcm9qZWN0LCBbWzAsIDBdLCBzaXplXSwgb2JqZWN0KTsKICB9Owp9CgpmdW5jdGlvbiBmaXRFeHRlbnQocHJvamVjdCkgewogIHJldHVybiBmdW5jdGlvbihleHRlbnQsIG9iamVjdCkgewogICAgcmV0dXJuIGZpdChwcm9qZWN0LCBleHRlbnQsIG9iamVjdCk7CiAgfTsKfQoKdmFyIG1heERlcHRoID0gMTY7CnZhciBjb3NNaW5EaXN0YW5jZSA9IGNvcyQxKDMwICogcmFkaWFucyk7IC8vIGNvcyhtaW5pbXVtIGFuZ3VsYXIgZGlzdGFuY2UpCgp2YXIgcmVzYW1wbGUgPSBmdW5jdGlvbihwcm9qZWN0LCBkZWx0YTIpIHsKICByZXR1cm4gK2RlbHRhMiA/IHJlc2FtcGxlJDEocHJvamVjdCwgZGVsdGEyKSA6IHJlc2FtcGxlTm9uZShwcm9qZWN0KTsKfQoKZnVuY3Rpb24gcmVzYW1wbGVOb25lKHByb2plY3QpIHsKICByZXR1cm4gdHJhbnNmb3JtJDIoewogICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgeCA9IHByb2plY3QoeCwgeSk7CiAgICAgIHRoaXMuc3RyZWFtLnBvaW50KHhbMF0sIHhbMV0pOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiByZXNhbXBsZSQxKHByb2plY3QsIGRlbHRhMikgewoKICBmdW5jdGlvbiByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgxLCB5MSwgbGFtYmRhMSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSkgewogICAgdmFyIGR4ID0geDEgLSB4MCwKICAgICAgICBkeSA9IHkxIC0geTAsCiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgIGlmIChkMiA+IDQgKiBkZWx0YTIgJiYgZGVwdGgtLSkgewogICAgICB2YXIgYSA9IGEwICsgYTEsCiAgICAgICAgICBiID0gYjAgKyBiMSwKICAgICAgICAgIGMgPSBjMCArIGMxLAogICAgICAgICAgbSA9IHNxcnQkMShhICogYSArIGIgKiBiICsgYyAqIGMpLAogICAgICAgICAgcGhpMiA9IGFzaW4kMShjIC89IG0pLAogICAgICAgICAgbGFtYmRhMiA9IGFicyhhYnMoYykgLSAxKSA8IGVwc2lsb24kNCB8fCBhYnMobGFtYmRhMCAtIGxhbWJkYTEpIDwgZXBzaWxvbiQ0ID8gKGxhbWJkYTAgKyBsYW1iZGExKSAvIDIgOiBhdGFuMihiLCBhKSwKICAgICAgICAgIHAgPSBwcm9qZWN0KGxhbWJkYTIsIHBoaTIpLAogICAgICAgICAgeDIgPSBwWzBdLAogICAgICAgICAgeTIgPSBwWzFdLAogICAgICAgICAgZHgyID0geDIgLSB4MCwKICAgICAgICAgIGR5MiA9IHkyIC0geTAsCiAgICAgICAgICBkeiA9IGR5ICogZHgyIC0gZHggKiBkeTI7CiAgICAgIGlmIChkeiAqIGR6IC8gZDIgPiBkZWx0YTIgLy8gcGVycGVuZGljdWxhciBwcm9qZWN0ZWQgZGlzdGFuY2UKICAgICAgICAgIHx8IGFicygoZHggKiBkeDIgKyBkeSAqIGR5MikgLyBkMiAtIDAuNSkgPiAwLjMgLy8gbWlkcG9pbnQgY2xvc2UgdG8gYW4gZW5kCiAgICAgICAgICB8fCBhMCAqIGExICsgYjAgKiBiMSArIGMwICogYzEgPCBjb3NNaW5EaXN0YW5jZSkgeyAvLyBhbmd1bGFyIGRpc3RhbmNlCiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MiwgeTIsIGxhbWJkYTIsIGEgLz0gbSwgYiAvPSBtLCBjLCBkZXB0aCwgc3RyZWFtKTsKICAgICAgICBzdHJlYW0ucG9pbnQoeDIsIHkyKTsKICAgICAgICByZXNhbXBsZUxpbmVUbyh4MiwgeTIsIGxhbWJkYTIsIGEsIGIsIGMsIHgxLCB5MSwgbGFtYmRhMSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkgewogICAgdmFyIGxhbWJkYTAwLCB4MDAsIHkwMCwgYTAwLCBiMDAsIGMwMCwgLy8gZmlyc3QgcG9pbnQKICAgICAgICBsYW1iZGEwLCB4MCwgeTAsIGEwLCBiMCwgYzA7IC8vIHByZXZpb3VzIHBvaW50CgogICAgdmFyIHJlc2FtcGxlU3RyZWFtID0gewogICAgICBwb2ludDogcG9pbnQsCiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LAogICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgeyBzdHJlYW0ucG9seWdvblN0YXJ0KCk7IHJlc2FtcGxlU3RyZWFtLmxpbmVTdGFydCA9IHJpbmdTdGFydDsgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHN0cmVhbS5wb2x5Z29uRW5kKCk7IHJlc2FtcGxlU3RyZWFtLmxpbmVTdGFydCA9IGxpbmVTdGFydDsgfQogICAgfTsKCiAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICAgIHggPSBwcm9qZWN0KHgsIHkpOwogICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICB4MCA9IE5hTjsKICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7CiAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lUG9pbnQobGFtYmRhLCBwaGkpIHsKICAgICAgdmFyIGMgPSBjYXJ0ZXNpYW4oW2xhbWJkYSwgcGhpXSksIHAgPSBwcm9qZWN0KGxhbWJkYSwgcGhpKTsKICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MCA9IHBbMF0sIHkwID0gcFsxXSwgbGFtYmRhMCA9IGxhbWJkYSwgYTAgPSBjWzBdLCBiMCA9IGNbMV0sIGMwID0gY1syXSwgbWF4RGVwdGgsIHN0cmVhbSk7CiAgICAgIHN0cmVhbS5wb2ludCh4MCwgeTApOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkgewogICAgICBsaW5lU3RhcnQoKTsKICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSByaW5nUG9pbnQ7CiAgICAgIHJlc2FtcGxlU3RyZWFtLmxpbmVFbmQgPSByaW5nRW5kOwogICAgfQoKICAgIGZ1bmN0aW9uIHJpbmdQb2ludChsYW1iZGEsIHBoaSkgewogICAgICBsaW5lUG9pbnQobGFtYmRhMDAgPSBsYW1iZGEsIHBoaSksIHgwMCA9IHgwLCB5MDAgPSB5MCwgYTAwID0gYTAsIGIwMCA9IGIwLCBjMDAgPSBjMDsKICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7CiAgICB9CgogICAgZnVuY3Rpb24gcmluZ0VuZCgpIHsKICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MDAsIHkwMCwgbGFtYmRhMDAsIGEwMCwgYjAwLCBjMDAsIG1heERlcHRoLCBzdHJlYW0pOwogICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5kID0gbGluZUVuZDsKICAgICAgbGluZUVuZCgpOwogICAgfQoKICAgIHJldHVybiByZXNhbXBsZVN0cmVhbTsKICB9Owp9Cgp2YXIgdHJhbnNmb3JtUmFkaWFucyA9IHRyYW5zZm9ybSQyKHsKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgdGhpcy5zdHJlYW0ucG9pbnQoeCAqIHJhZGlhbnMsIHkgKiByYWRpYW5zKTsKICB9Cn0pOwoKZnVuY3Rpb24gcHJvamVjdGlvbihwcm9qZWN0KSB7CiAgcmV0dXJuIHByb2plY3Rpb25NdXRhdG9yKGZ1bmN0aW9uKCkgeyByZXR1cm4gcHJvamVjdDsgfSkoKTsKfQoKZnVuY3Rpb24gcHJvamVjdGlvbk11dGF0b3IocHJvamVjdEF0KSB7CiAgdmFyIHByb2plY3QsCiAgICAgIGsgPSAxNTAsIC8vIHNjYWxlCiAgICAgIHggPSA0ODAsIHkgPSAyNTAsIC8vIHRyYW5zbGF0ZQogICAgICBkeCwgZHksIGxhbWJkYSA9IDAsIHBoaSA9IDAsIC8vIGNlbnRlcgogICAgICBkZWx0YUxhbWJkYSA9IDAsIGRlbHRhUGhpID0gMCwgZGVsdGFHYW1tYSA9IDAsIHJvdGF0ZSwgcHJvamVjdFJvdGF0ZSwgLy8gcm90YXRlCiAgICAgIHRoZXRhID0gbnVsbCwgcHJlY2xpcCA9IGNsaXBBbnRpbWVyaWRpYW4sIC8vIGNsaXAgYW5nbGUKICAgICAgeDAgPSBudWxsLCB5MCwgeDEsIHkxLCBwb3N0Y2xpcCA9IGlkZW50aXR5JDcsIC8vIGNsaXAgZXh0ZW50CiAgICAgIGRlbHRhMiA9IDAuNSwgcHJvamVjdFJlc2FtcGxlID0gcmVzYW1wbGUocHJvamVjdFRyYW5zZm9ybSwgZGVsdGEyKSwgLy8gcHJlY2lzaW9uCiAgICAgIGNhY2hlLAogICAgICBjYWNoZVN0cmVhbTsKCiAgZnVuY3Rpb24gcHJvamVjdGlvbihwb2ludCkgewogICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlKHBvaW50WzBdICogcmFkaWFucywgcG9pbnRbMV0gKiByYWRpYW5zKTsKICAgIHJldHVybiBbcG9pbnRbMF0gKiBrICsgZHgsIGR5IC0gcG9pbnRbMV0gKiBrXTsKICB9CgogIGZ1bmN0aW9uIGludmVydChwb2ludCkgewogICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlLmludmVydCgocG9pbnRbMF0gLSBkeCkgLyBrLCAoZHkgLSBwb2ludFsxXSkgLyBrKTsKICAgIHJldHVybiBwb2ludCAmJiBbcG9pbnRbMF0gKiBkZWdyZWVzJDEsIHBvaW50WzFdICogZGVncmVlcyQxXTsKICB9CgogIGZ1bmN0aW9uIHByb2plY3RUcmFuc2Zvcm0oeCwgeSkgewogICAgcmV0dXJuIHggPSBwcm9qZWN0KHgsIHkpLCBbeFswXSAqIGsgKyBkeCwgZHkgLSB4WzFdICoga107CiAgfQoKICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNoZSA6IGNhY2hlID0gdHJhbnNmb3JtUmFkaWFucyhwcmVjbGlwKHJvdGF0ZSwgcHJvamVjdFJlc2FtcGxlKHBvc3RjbGlwKGNhY2hlU3RyZWFtID0gc3RyZWFtKSkpKTsKICB9OwoKICBwcm9qZWN0aW9uLmNsaXBBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNsaXAgPSArXyA/IGNsaXBDaXJjbGUodGhldGEgPSBfICogcmFkaWFucywgNiAqIHJhZGlhbnMpIDogKHRoZXRhID0gbnVsbCwgY2xpcEFudGltZXJpZGlhbiksIHJlc2V0KCkpIDogdGhldGEgKiBkZWdyZWVzJDE7CiAgfTsKCiAgcHJvamVjdGlvbi5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfID09IG51bGwgPyAoeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCBpZGVudGl0eSQ3KSA6IGNsaXBFeHRlbnQoeDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEgPSArX1sxXVsxXSksIHJlc2V0KCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICB9OwoKICBwcm9qZWN0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoayA9ICtfLCByZWNlbnRlcigpKSA6IGs7CiAgfTsKCiAgcHJvamVjdGlvbi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gK19bMF0sIHkgPSArX1sxXSwgcmVjZW50ZXIoKSkgOiBbeCwgeV07CiAgfTsKCiAgcHJvamVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsYW1iZGEgPSBfWzBdICUgMzYwICogcmFkaWFucywgcGhpID0gX1sxXSAlIDM2MCAqIHJhZGlhbnMsIHJlY2VudGVyKCkpIDogW2xhbWJkYSAqIGRlZ3JlZXMkMSwgcGhpICogZGVncmVlcyQxXTsKICB9OwoKICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlbHRhTGFtYmRhID0gX1swXSAlIDM2MCAqIHJhZGlhbnMsIGRlbHRhUGhpID0gX1sxXSAlIDM2MCAqIHJhZGlhbnMsIGRlbHRhR2FtbWEgPSBfLmxlbmd0aCA+IDIgPyBfWzJdICUgMzYwICogcmFkaWFucyA6IDAsIHJlY2VudGVyKCkpIDogW2RlbHRhTGFtYmRhICogZGVncmVlcyQxLCBkZWx0YVBoaSAqIGRlZ3JlZXMkMSwgZGVsdGFHYW1tYSAqIGRlZ3JlZXMkMV07CiAgfTsKCiAgcHJvamVjdGlvbi5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcm9qZWN0UmVzYW1wbGUgPSByZXNhbXBsZShwcm9qZWN0VHJhbnNmb3JtLCBkZWx0YTIgPSBfICogXyksIHJlc2V0KCkpIDogc3FydCQxKGRlbHRhMik7CiAgfTsKCiAgcHJvamVjdGlvbi5maXRFeHRlbnQgPSBmaXRFeHRlbnQocHJvamVjdGlvbik7CgogIHByb2plY3Rpb24uZml0U2l6ZSA9IGZpdFNpemUocHJvamVjdGlvbik7CgogIGZ1bmN0aW9uIHJlY2VudGVyKCkgewogICAgcHJvamVjdFJvdGF0ZSA9IGNvbXBvc2Uocm90YXRlID0gcm90YXRlUmFkaWFucyhkZWx0YUxhbWJkYSwgZGVsdGFQaGksIGRlbHRhR2FtbWEpLCBwcm9qZWN0KTsKICAgIHZhciBjZW50ZXIgPSBwcm9qZWN0KGxhbWJkYSwgcGhpKTsKICAgIGR4ID0geCAtIGNlbnRlclswXSAqIGs7CiAgICBkeSA9IHkgKyBjZW50ZXJbMV0gKiBrOwogICAgcmV0dXJuIHJlc2V0KCk7CiAgfQoKICBmdW5jdGlvbiByZXNldCgpIHsKICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsOwogICAgcmV0dXJuIHByb2plY3Rpb247CiAgfQoKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBwcm9qZWN0ID0gcHJvamVjdEF0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBwcm9qZWN0aW9uLmludmVydCA9IHByb2plY3QuaW52ZXJ0ICYmIGludmVydDsKICAgIHJldHVybiByZWNlbnRlcigpOwogIH07Cn0KCmZ1bmN0aW9uIGNvbmljUHJvamVjdGlvbihwcm9qZWN0QXQpIHsKICB2YXIgcGhpMCA9IDAsCiAgICAgIHBoaTEgPSBwaSQ0IC8gMywKICAgICAgbSA9IHByb2plY3Rpb25NdXRhdG9yKHByb2plY3RBdCksCiAgICAgIHAgPSBtKHBoaTAsIHBoaTEpOwoKICBwLnBhcmFsbGVscyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gbShwaGkwID0gX1swXSAqIHJhZGlhbnMsIHBoaTEgPSBfWzFdICogcmFkaWFucykgOiBbcGhpMCAqIGRlZ3JlZXMkMSwgcGhpMSAqIGRlZ3JlZXMkMV07CiAgfTsKCiAgcmV0dXJuIHA7Cn0KCmZ1bmN0aW9uIGNvbmljRXF1YWxBcmVhUmF3KHkwLCB5MSkgewogIHZhciBzeTAgPSBzaW4kMSh5MCksCiAgICAgIG4gPSAoc3kwICsgc2luJDEoeTEpKSAvIDIsCiAgICAgIGMgPSAxICsgc3kwICogKDIgKiBuIC0gc3kwKSwKICAgICAgcjAgPSBzcXJ0JDEoYykgLyBuOwoKICBmdW5jdGlvbiBwcm9qZWN0KHgsIHkpIHsKICAgIHZhciByID0gc3FydCQxKGMgLSAyICogbiAqIHNpbiQxKHkpKSAvIG47CiAgICByZXR1cm4gW3IgKiBzaW4kMSh4ICo9IG4pLCByMCAtIHIgKiBjb3MkMSh4KV07CiAgfQoKICBwcm9qZWN0LmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHZhciByMHkgPSByMCAtIHk7CiAgICByZXR1cm4gW2F0YW4yKHgsIHIweSkgLyBuLCBhc2luJDEoKGMgLSAoeCAqIHggKyByMHkgKiByMHkpICogbiAqIG4pIC8gKDIgKiBuKSldOwogIH07CgogIHJldHVybiBwcm9qZWN0Owp9Cgp2YXIgY29uaWNFcXVhbEFyZWEgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gY29uaWNQcm9qZWN0aW9uKGNvbmljRXF1YWxBcmVhUmF3KQogICAgICAuc2NhbGUoMTU1LjQyNCkKICAgICAgLmNlbnRlcihbMCwgMzMuNjQ0Ml0pOwp9Cgp2YXIgYWxiZXJzID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGNvbmljRXF1YWxBcmVhKCkKICAgICAgLnBhcmFsbGVscyhbMjkuNSwgNDUuNV0pCiAgICAgIC5zY2FsZSgxMDcwKQogICAgICAudHJhbnNsYXRlKFs0ODAsIDI1MF0pCiAgICAgIC5yb3RhdGUoWzk2LCAwXSkKICAgICAgLmNlbnRlcihbLTAuNiwgMzguN10pOwp9CgovLyBUaGUgcHJvamVjdGlvbnMgbXVzdCBoYXZlIG11dHVhbGx5IGV4Y2x1c2l2ZSBjbGlwIHJlZ2lvbnMgb24gdGhlIHNwaGVyZSwKLy8gYXMgdGhpcyB3aWxsIGF2b2lkIGVtaXR0aW5nIGludGVybGVhdmluZyBsaW5lcyBhbmQgcG9seWdvbnMuCmZ1bmN0aW9uIG11bHRpcGxleChzdHJlYW1zKSB7CiAgdmFyIG4gPSBzdHJlYW1zLmxlbmd0aDsKICByZXR1cm4gewogICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsgdmFyIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHN0cmVhbXNbaV0ucG9pbnQoeCwgeSk7IH0sCiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgeyB2YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5zcGhlcmUoKTsgfSwKICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLmxpbmVTdGFydCgpOyB9LAogICAgbGluZUVuZDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLmxpbmVFbmQoKTsgfSwKICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvbHlnb25TdGFydCgpOyB9LAogICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvbHlnb25FbmQoKTsgfQogIH07Cn0KCi8vIEEgY29tcG9zaXRlIHByb2plY3Rpb24gZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBjb25maWd1cmVkIGJ5IGRlZmF1bHQgZm9yCi8vIDk2MMODwpc1MDAuIFRoZSBwcm9qZWN0aW9uIGFsc28gd29ya3MgcXVpdGUgd2VsbCBhdCA5NjDDg8KXNjAwIGlmIHlvdSBjaGFuZ2UgdGhlCi8vIHNjYWxlIHRvIDEyODUgYW5kIGFkanVzdCB0aGUgdHJhbnNsYXRlIGFjY29yZGluZ2x5LiBUaGUgc2V0IG9mIHN0YW5kYXJkCi8vIHBhcmFsbGVscyBmb3IgZWFjaCByZWdpb24gY29tZXMgZnJvbSBVU0dTLCB3aGljaCBpcyBwdWJsaXNoZWQgaGVyZToKLy8gaHR0cDovL2Vnc2MudXNncy5nb3YvaXNiL3B1YnMvTWFwUHJvamVjdGlvbnMvcHJvamVjdGlvbnMuaHRtbCNhbGJlcnMKdmFyIGFsYmVyc1VzYSA9IGZ1bmN0aW9uKCkgewogIHZhciBjYWNoZSwKICAgICAgY2FjaGVTdHJlYW0sCiAgICAgIGxvd2VyNDggPSBhbGJlcnMoKSwgbG93ZXI0OFBvaW50LAogICAgICBhbGFza2EgPSBjb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU0LCAwXSkuY2VudGVyKFstMiwgNTguNV0pLnBhcmFsbGVscyhbNTUsIDY1XSksIGFsYXNrYVBvaW50LCAvLyBFUFNHOjMzMzgKICAgICAgaGF3YWlpID0gY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NywgMF0pLmNlbnRlcihbLTMsIDE5LjldKS5wYXJhbGxlbHMoWzgsIDE4XSksIGhhd2FpaVBvaW50LCAvLyBFU1JJOjEwMjAwNwogICAgICBwb2ludCwgcG9pbnRTdHJlYW0gPSB7cG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsgcG9pbnQgPSBbeCwgeV07IH19OwoKICBmdW5jdGlvbiBhbGJlcnNVc2EoY29vcmRpbmF0ZXMpIHsKICAgIHZhciB4ID0gY29vcmRpbmF0ZXNbMF0sIHkgPSBjb29yZGluYXRlc1sxXTsKICAgIHJldHVybiBwb2ludCA9IG51bGwsCiAgICAgICAgKGxvd2VyNDhQb2ludC5wb2ludCh4LCB5KSwgcG9pbnQpCiAgICAgICAgfHwgKGFsYXNrYVBvaW50LnBvaW50KHgsIHkpLCBwb2ludCkKICAgICAgICB8fCAoaGF3YWlpUG9pbnQucG9pbnQoeCwgeSksIHBvaW50KTsKICB9CgogIGFsYmVyc1VzYS5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgdmFyIGsgPSBsb3dlcjQ4LnNjYWxlKCksCiAgICAgICAgdCA9IGxvd2VyNDgudHJhbnNsYXRlKCksCiAgICAgICAgeCA9IChjb29yZGluYXRlc1swXSAtIHRbMF0pIC8gaywKICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdFsxXSkgLyBrOwogICAgcmV0dXJuICh5ID49IDAuMTIwICYmIHkgPCAwLjIzNCAmJiB4ID49IC0wLjQyNSAmJiB4IDwgLTAuMjE0ID8gYWxhc2thCiAgICAgICAgOiB5ID49IDAuMTY2ICYmIHkgPCAwLjIzNCAmJiB4ID49IC0wLjIxNCAmJiB4IDwgLTAuMTE1ID8gaGF3YWlpCiAgICAgICAgOiBsb3dlcjQ4KS5pbnZlcnQoY29vcmRpbmF0ZXMpOwogIH07CgogIGFsYmVyc1VzYS5zdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHsKICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IG11bHRpcGxleChbbG93ZXI0OC5zdHJlYW0oY2FjaGVTdHJlYW0gPSBzdHJlYW0pLCBhbGFza2Euc3RyZWFtKHN0cmVhbSksIGhhd2FpaS5zdHJlYW0oc3RyZWFtKV0pOwogIH07CgogIGFsYmVyc1VzYS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnByZWNpc2lvbigpOwogICAgbG93ZXI0OC5wcmVjaXNpb24oXyksIGFsYXNrYS5wcmVjaXNpb24oXyksIGhhd2FpaS5wcmVjaXNpb24oXyk7CiAgICByZXR1cm4gcmVzZXQoKTsKICB9OwoKICBhbGJlcnNVc2Euc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnNjYWxlKCk7CiAgICBsb3dlcjQ4LnNjYWxlKF8pLCBhbGFza2Euc2NhbGUoXyAqIDAuMzUpLCBoYXdhaWkuc2NhbGUoXyk7CiAgICByZXR1cm4gYWxiZXJzVXNhLnRyYW5zbGF0ZShsb3dlcjQ4LnRyYW5zbGF0ZSgpKTsKICB9OwoKICBhbGJlcnNVc2EudHJhbnNsYXRlID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC50cmFuc2xhdGUoKTsKICAgIHZhciBrID0gbG93ZXI0OC5zY2FsZSgpLCB4ID0gK19bMF0sIHkgPSArX1sxXTsKCiAgICBsb3dlcjQ4UG9pbnQgPSBsb3dlcjQ4CiAgICAgICAgLnRyYW5zbGF0ZShfKQogICAgICAgIC5jbGlwRXh0ZW50KFtbeCAtIDAuNDU1ICogaywgeSAtIDAuMjM4ICoga10sIFt4ICsgMC40NTUgKiBrLCB5ICsgMC4yMzggKiBrXV0pCiAgICAgICAgLnN0cmVhbShwb2ludFN0cmVhbSk7CgogICAgYWxhc2thUG9pbnQgPSBhbGFza2EKICAgICAgICAudHJhbnNsYXRlKFt4IC0gMC4zMDcgKiBrLCB5ICsgMC4yMDEgKiBrXSkKICAgICAgICAuY2xpcEV4dGVudChbW3ggLSAwLjQyNSAqIGsgKyBlcHNpbG9uJDQsIHkgKyAwLjEyMCAqIGsgKyBlcHNpbG9uJDRdLCBbeCAtIDAuMjE0ICogayAtIGVwc2lsb24kNCwgeSArIDAuMjM0ICogayAtIGVwc2lsb24kNF1dKQogICAgICAgIC5zdHJlYW0ocG9pbnRTdHJlYW0pOwoKICAgIGhhd2FpaVBvaW50ID0gaGF3YWlpCiAgICAgICAgLnRyYW5zbGF0ZShbeCAtIDAuMjA1ICogaywgeSArIDAuMjEyICoga10pCiAgICAgICAgLmNsaXBFeHRlbnQoW1t4IC0gMC4yMTQgKiBrICsgZXBzaWxvbiQ0LCB5ICsgMC4xNjYgKiBrICsgZXBzaWxvbiQ0XSwgW3ggLSAwLjExNSAqIGsgLSBlcHNpbG9uJDQsIHkgKyAwLjIzNCAqIGsgLSBlcHNpbG9uJDRdXSkKICAgICAgICAuc3RyZWFtKHBvaW50U3RyZWFtKTsKCiAgICByZXR1cm4gcmVzZXQoKTsKICB9OwoKICBhbGJlcnNVc2EuZml0RXh0ZW50ID0gZml0RXh0ZW50KGFsYmVyc1VzYSk7CgogIGFsYmVyc1VzYS5maXRTaXplID0gZml0U2l6ZShhbGJlcnNVc2EpOwoKICBmdW5jdGlvbiByZXNldCgpIHsKICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsOwogICAgcmV0dXJuIGFsYmVyc1VzYTsKICB9CgogIHJldHVybiBhbGJlcnNVc2Euc2NhbGUoMTA3MCk7Cn0KCmZ1bmN0aW9uIGF6aW11dGhhbFJhdyhzY2FsZSkgewogIHJldHVybiBmdW5jdGlvbih4LCB5KSB7CiAgICB2YXIgY3ggPSBjb3MkMSh4KSwKICAgICAgICBjeSA9IGNvcyQxKHkpLAogICAgICAgIGsgPSBzY2FsZShjeCAqIGN5KTsKICAgIHJldHVybiBbCiAgICAgIGsgKiBjeSAqIHNpbiQxKHgpLAogICAgICBrICogc2luJDEoeSkKICAgIF07CiAgfQp9CgpmdW5jdGlvbiBhemltdXRoYWxJbnZlcnQoYW5nbGUpIHsKICByZXR1cm4gZnVuY3Rpb24oeCwgeSkgewogICAgdmFyIHogPSBzcXJ0JDEoeCAqIHggKyB5ICogeSksCiAgICAgICAgYyA9IGFuZ2xlKHopLAogICAgICAgIHNjID0gc2luJDEoYyksCiAgICAgICAgY2MgPSBjb3MkMShjKTsKICAgIHJldHVybiBbCiAgICAgIGF0YW4yKHggKiBzYywgeiAqIGNjKSwKICAgICAgYXNpbiQxKHogJiYgeSAqIHNjIC8geikKICAgIF07CiAgfQp9Cgp2YXIgYXppbXV0aGFsRXF1YWxBcmVhUmF3ID0gYXppbXV0aGFsUmF3KGZ1bmN0aW9uKGN4Y3kpIHsKICByZXR1cm4gc3FydCQxKDIgLyAoMSArIGN4Y3kpKTsKfSk7CgphemltdXRoYWxFcXVhbEFyZWFSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGZ1bmN0aW9uKHopIHsKICByZXR1cm4gMiAqIGFzaW4kMSh6IC8gMik7Cn0pOwoKdmFyIGF6aW11dGhhbEVxdWFsQXJlYSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBwcm9qZWN0aW9uKGF6aW11dGhhbEVxdWFsQXJlYVJhdykKICAgICAgLnNjYWxlKDEyNC43NSkKICAgICAgLmNsaXBBbmdsZSgxODAgLSAxZS0zKTsKfQoKdmFyIGF6aW11dGhhbEVxdWlkaXN0YW50UmF3ID0gYXppbXV0aGFsUmF3KGZ1bmN0aW9uKGMpIHsKICByZXR1cm4gKGMgPSBhY29zKGMpKSAmJiBjIC8gc2luJDEoYyk7Cn0pOwoKYXppbXV0aGFsRXF1aWRpc3RhbnRSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGZ1bmN0aW9uKHopIHsKICByZXR1cm4gejsKfSk7Cgp2YXIgYXppbXV0aGFsRXF1aWRpc3RhbnQgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gcHJvamVjdGlvbihhemltdXRoYWxFcXVpZGlzdGFudFJhdykKICAgICAgLnNjYWxlKDc5LjQxODgpCiAgICAgIC5jbGlwQW5nbGUoMTgwIC0gMWUtMyk7Cn0KCmZ1bmN0aW9uIG1lcmNhdG9yUmF3KGxhbWJkYSwgcGhpKSB7CiAgcmV0dXJuIFtsYW1iZGEsIGxvZyQxKHRhbigoaGFsZlBpJDMgKyBwaGkpIC8gMikpXTsKfQoKbWVyY2F0b3JSYXcuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogIHJldHVybiBbeCwgMiAqIGF0YW4oZXhwKHkpKSAtIGhhbGZQaSQzXTsKfTsKCnZhciBtZXJjYXRvciA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBtZXJjYXRvclByb2plY3Rpb24obWVyY2F0b3JSYXcpCiAgICAgIC5zY2FsZSg5NjEgLyB0YXUkNCk7Cn0KCmZ1bmN0aW9uIG1lcmNhdG9yUHJvamVjdGlvbihwcm9qZWN0KSB7CiAgdmFyIG0gPSBwcm9qZWN0aW9uKHByb2plY3QpLAogICAgICBzY2FsZSA9IG0uc2NhbGUsCiAgICAgIHRyYW5zbGF0ZSA9IG0udHJhbnNsYXRlLAogICAgICBjbGlwRXh0ZW50ID0gbS5jbGlwRXh0ZW50LAogICAgICBjbGlwQXV0bzsKCiAgbS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlKF8pLCBjbGlwQXV0byAmJiBtLmNsaXBFeHRlbnQobnVsbCksIG0pIDogc2NhbGUoKTsKICB9OwoKICBtLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0ZShfKSwgY2xpcEF1dG8gJiYgbS5jbGlwRXh0ZW50KG51bGwpLCBtKSA6IHRyYW5zbGF0ZSgpOwogIH07CgogIG0uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNsaXBBdXRvID8gbnVsbCA6IGNsaXBFeHRlbnQoKTsKICAgIGlmIChjbGlwQXV0byA9IF8gPT0gbnVsbCkgewogICAgICB2YXIgayA9IHBpJDQgKiBzY2FsZSgpLAogICAgICAgICAgdCA9IHRyYW5zbGF0ZSgpOwogICAgICBfID0gW1t0WzBdIC0gaywgdFsxXSAtIGtdLCBbdFswXSArIGssIHRbMV0gKyBrXV07CiAgICB9CiAgICBjbGlwRXh0ZW50KF8pOwogICAgcmV0dXJuIG07CiAgfTsKCiAgcmV0dXJuIG0uY2xpcEV4dGVudChudWxsKTsKfQoKZnVuY3Rpb24gdGFueSh5KSB7CiAgcmV0dXJuIHRhbigoaGFsZlBpJDMgKyB5KSAvIDIpOwp9CgpmdW5jdGlvbiBjb25pY0NvbmZvcm1hbFJhdyh5MCwgeTEpIHsKICB2YXIgY3kwID0gY29zJDEoeTApLAogICAgICBuID0geTAgPT09IHkxID8gc2luJDEoeTApIDogbG9nJDEoY3kwIC8gY29zJDEoeTEpKSAvIGxvZyQxKHRhbnkoeTEpIC8gdGFueSh5MCkpLAogICAgICBmID0gY3kwICogcG93JDEodGFueSh5MCksIG4pIC8gbjsKCiAgaWYgKCFuKSByZXR1cm4gbWVyY2F0b3JSYXc7CgogIGZ1bmN0aW9uIHByb2plY3QoeCwgeSkgewogICAgaWYgKGYgPiAwKSB7IGlmICh5IDwgLWhhbGZQaSQzICsgZXBzaWxvbiQ0KSB5ID0gLWhhbGZQaSQzICsgZXBzaWxvbiQ0OyB9CiAgICBlbHNlIHsgaWYgKHkgPiBoYWxmUGkkMyAtIGVwc2lsb24kNCkgeSA9IGhhbGZQaSQzIC0gZXBzaWxvbiQ0OyB9CiAgICB2YXIgciA9IGYgLyBwb3ckMSh0YW55KHkpLCBuKTsKICAgIHJldHVybiBbciAqIHNpbiQxKG4gKiB4KSwgZiAtIHIgKiBjb3MkMShuICogeCldOwogIH0KCiAgcHJvamVjdC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICB2YXIgZnkgPSBmIC0geSwgciA9IHNpZ24kMShuKSAqIHNxcnQkMSh4ICogeCArIGZ5ICogZnkpOwogICAgcmV0dXJuIFthdGFuMih4LCBmeSkgLyBuLCAyICogYXRhbihwb3ckMShmIC8gciwgMSAvIG4pKSAtIGhhbGZQaSQzXTsKICB9OwoKICByZXR1cm4gcHJvamVjdDsKfQoKdmFyIGNvbmljQ29uZm9ybWFsID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGNvbmljUHJvamVjdGlvbihjb25pY0NvbmZvcm1hbFJhdykKICAgICAgLnNjYWxlKDEwOS41KQogICAgICAucGFyYWxsZWxzKFszMCwgMzBdKTsKfQoKZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyUmF3KGxhbWJkYSwgcGhpKSB7CiAgcmV0dXJuIFtsYW1iZGEsIHBoaV07Cn0KCmVxdWlyZWN0YW5ndWxhclJhdy5pbnZlcnQgPSBlcXVpcmVjdGFuZ3VsYXJSYXc7Cgp2YXIgZXF1aXJlY3Rhbmd1bGFyID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHByb2plY3Rpb24oZXF1aXJlY3Rhbmd1bGFyUmF3KQogICAgICAuc2NhbGUoMTUyLjYzKTsKfQoKZnVuY3Rpb24gY29uaWNFcXVpZGlzdGFudFJhdyh5MCwgeTEpIHsKICB2YXIgY3kwID0gY29zJDEoeTApLAogICAgICBuID0geTAgPT09IHkxID8gc2luJDEoeTApIDogKGN5MCAtIGNvcyQxKHkxKSkgLyAoeTEgLSB5MCksCiAgICAgIGcgPSBjeTAgLyBuICsgeTA7CgogIGlmIChhYnMobikgPCBlcHNpbG9uJDQpIHJldHVybiBlcXVpcmVjdGFuZ3VsYXJSYXc7CgogIGZ1bmN0aW9uIHByb2plY3QoeCwgeSkgewogICAgdmFyIGd5ID0gZyAtIHksIG54ID0gbiAqIHg7CiAgICByZXR1cm4gW2d5ICogc2luJDEobngpLCBnIC0gZ3kgKiBjb3MkMShueCldOwogIH0KCiAgcHJvamVjdC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICB2YXIgZ3kgPSBnIC0geTsKICAgIHJldHVybiBbYXRhbjIoeCwgZ3kpIC8gbiwgZyAtIHNpZ24kMShuKSAqIHNxcnQkMSh4ICogeCArIGd5ICogZ3kpXTsKICB9OwoKICByZXR1cm4gcHJvamVjdDsKfQoKdmFyIGNvbmljRXF1aWRpc3RhbnQgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gY29uaWNQcm9qZWN0aW9uKGNvbmljRXF1aWRpc3RhbnRSYXcpCiAgICAgIC5zY2FsZSgxMzEuMTU0KQogICAgICAuY2VudGVyKFswLCAxMy45Mzg5XSk7Cn0KCmZ1bmN0aW9uIGdub21vbmljUmF3KHgsIHkpIHsKICB2YXIgY3kgPSBjb3MkMSh5KSwgayA9IGNvcyQxKHgpICogY3k7CiAgcmV0dXJuIFtjeSAqIHNpbiQxKHgpIC8gaywgc2luJDEoeSkgLyBrXTsKfQoKZ25vbW9uaWNSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGF0YW4pOwoKdmFyIGdub21vbmljID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHByb2plY3Rpb24oZ25vbW9uaWNSYXcpCiAgICAgIC5zY2FsZSgxNDQuMDQ5KQogICAgICAuY2xpcEFuZ2xlKDYwKTsKfQoKZnVuY3Rpb24gb3J0aG9ncmFwaGljUmF3KHgsIHkpIHsKICByZXR1cm4gW2NvcyQxKHkpICogc2luJDEoeCksIHNpbiQxKHkpXTsKfQoKb3J0aG9ncmFwaGljUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChhc2luJDEpOwoKdmFyIG9ydGhvZ3JhcGhpYyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBwcm9qZWN0aW9uKG9ydGhvZ3JhcGhpY1JhdykKICAgICAgLnNjYWxlKDI0OS41KQogICAgICAuY2xpcEFuZ2xlKDkwICsgZXBzaWxvbiQ0KTsKfQoKZnVuY3Rpb24gc3RlcmVvZ3JhcGhpY1Jhdyh4LCB5KSB7CiAgdmFyIGN5ID0gY29zJDEoeSksIGsgPSAxICsgY29zJDEoeCkgKiBjeTsKICByZXR1cm4gW2N5ICogc2luJDEoeCkgLyBrLCBzaW4kMSh5KSAvIGtdOwp9CgpzdGVyZW9ncmFwaGljUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7CiAgcmV0dXJuIDIgKiBhdGFuKHopOwp9KTsKCnZhciBzdGVyZW9ncmFwaGljID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHByb2plY3Rpb24oc3RlcmVvZ3JhcGhpY1JhdykKICAgICAgLnNjYWxlKDI1MCkKICAgICAgLmNsaXBBbmdsZSgxNDIpOwp9CgpmdW5jdGlvbiB0cmFuc3ZlcnNlTWVyY2F0b3JSYXcobGFtYmRhLCBwaGkpIHsKICByZXR1cm4gW2xvZyQxKHRhbigoaGFsZlBpJDMgKyBwaGkpIC8gMikpLCAtbGFtYmRhXTsKfQoKdHJhbnN2ZXJzZU1lcmNhdG9yUmF3LmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICByZXR1cm4gWy15LCAyICogYXRhbihleHAoeCkpIC0gaGFsZlBpJDNdOwp9OwoKdmFyIHRyYW5zdmVyc2VNZXJjYXRvciA9IGZ1bmN0aW9uKCkgewogIHZhciBtID0gbWVyY2F0b3JQcm9qZWN0aW9uKHRyYW5zdmVyc2VNZXJjYXRvclJhdyksCiAgICAgIGNlbnRlciA9IG0uY2VudGVyLAogICAgICByb3RhdGUgPSBtLnJvdGF0ZTsKCiAgbS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGNlbnRlcihbLV9bMV0sIF9bMF1dKSA6IChfID0gY2VudGVyKCksIFtfWzFdLCAtX1swXV0pOwogIH07CgogIG0ucm90YXRlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByb3RhdGUoW19bMF0sIF9bMV0sIF8ubGVuZ3RoID4gMiA/IF9bMl0gKyA5MCA6IDkwXSkgOiAoXyA9IHJvdGF0ZSgpLCBbX1swXSwgX1sxXSwgX1syXSAtIDkwXSk7CiAgfTsKCiAgcmV0dXJuIHJvdGF0ZShbMCwgMCwgOTBdKQogICAgICAuc2NhbGUoMTU5LjE1NSk7Cn0KCmV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb247CmV4cG9ydHMuYmlzZWN0ID0gYmlzZWN0UmlnaHQ7CmV4cG9ydHMuYmlzZWN0UmlnaHQgPSBiaXNlY3RSaWdodDsKZXhwb3J0cy5iaXNlY3RMZWZ0ID0gYmlzZWN0TGVmdDsKZXhwb3J0cy5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7CmV4cG9ydHMuYmlzZWN0b3IgPSBiaXNlY3RvcjsKZXhwb3J0cy5kZXNjZW5kaW5nID0gZGVzY2VuZGluZzsKZXhwb3J0cy5kZXZpYXRpb24gPSBkZXZpYXRpb247CmV4cG9ydHMuZXh0ZW50ID0gZXh0ZW50OwpleHBvcnRzLmhpc3RvZ3JhbSA9IGhpc3RvZ3JhbTsKZXhwb3J0cy50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzID0gZnJlZWRtYW5EaWFjb25pczsKZXhwb3J0cy50aHJlc2hvbGRTY290dCA9IHNjb3R0OwpleHBvcnRzLnRocmVzaG9sZFN0dXJnZXMgPSBzdHVyZ2VzOwpleHBvcnRzLm1heCA9IG1heDsKZXhwb3J0cy5tZWFuID0gbWVhbjsKZXhwb3J0cy5tZWRpYW4gPSBtZWRpYW47CmV4cG9ydHMubWVyZ2UgPSBtZXJnZTsKZXhwb3J0cy5taW4gPSBtaW47CmV4cG9ydHMucGFpcnMgPSBwYWlyczsKZXhwb3J0cy5wZXJtdXRlID0gcGVybXV0ZTsKZXhwb3J0cy5xdWFudGlsZSA9IHRocmVzaG9sZDsKZXhwb3J0cy5yYW5nZSA9IHJhbmdlOwpleHBvcnRzLnNjYW4gPSBzY2FuOwpleHBvcnRzLnNodWZmbGUgPSBzaHVmZmxlOwpleHBvcnRzLnN1bSA9IHN1bTsKZXhwb3J0cy50aWNrcyA9IHRpY2tzOwpleHBvcnRzLnRpY2tTdGVwID0gdGlja1N0ZXA7CmV4cG9ydHMudHJhbnNwb3NlID0gdHJhbnNwb3NlOwpleHBvcnRzLnZhcmlhbmNlID0gdmFyaWFuY2U7CmV4cG9ydHMuemlwID0gemlwOwpleHBvcnRzLmVudHJpZXMgPSBlbnRyaWVzOwpleHBvcnRzLmtleXMgPSBrZXlzOwpleHBvcnRzLnZhbHVlcyA9IHZhbHVlczsKZXhwb3J0cy5tYXAgPSBtYXAkMTsKZXhwb3J0cy5zZXQgPSBzZXQ7CmV4cG9ydHMubmVzdCA9IG5lc3Q7CmV4cG9ydHMucmFuZG9tVW5pZm9ybSA9IHVuaWZvcm07CmV4cG9ydHMucmFuZG9tTm9ybWFsID0gbm9ybWFsOwpleHBvcnRzLnJhbmRvbUxvZ05vcm1hbCA9IGxvZ05vcm1hbDsKZXhwb3J0cy5yYW5kb21CYXRlcyA9IGJhdGVzOwpleHBvcnRzLnJhbmRvbUlyd2luSGFsbCA9IGlyd2luSGFsbDsKZXhwb3J0cy5yYW5kb21FeHBvbmVudGlhbCA9IGV4cG9uZW50aWFsOwpleHBvcnRzLmVhc2VMaW5lYXIgPSBsaW5lYXI7CmV4cG9ydHMuZWFzZVF1YWQgPSBxdWFkSW5PdXQ7CmV4cG9ydHMuZWFzZVF1YWRJbiA9IHF1YWRJbjsKZXhwb3J0cy5lYXNlUXVhZE91dCA9IHF1YWRPdXQ7CmV4cG9ydHMuZWFzZVF1YWRJbk91dCA9IHF1YWRJbk91dDsKZXhwb3J0cy5lYXNlQ3ViaWMgPSBjdWJpY0luT3V0OwpleHBvcnRzLmVhc2VDdWJpY0luID0gY3ViaWNJbjsKZXhwb3J0cy5lYXNlQ3ViaWNPdXQgPSBjdWJpY091dDsKZXhwb3J0cy5lYXNlQ3ViaWNJbk91dCA9IGN1YmljSW5PdXQ7CmV4cG9ydHMuZWFzZVBvbHkgPSBwb2x5SW5PdXQ7CmV4cG9ydHMuZWFzZVBvbHlJbiA9IHBvbHlJbjsKZXhwb3J0cy5lYXNlUG9seU91dCA9IHBvbHlPdXQ7CmV4cG9ydHMuZWFzZVBvbHlJbk91dCA9IHBvbHlJbk91dDsKZXhwb3J0cy5lYXNlU2luID0gc2luSW5PdXQ7CmV4cG9ydHMuZWFzZVNpbkluID0gc2luSW47CmV4cG9ydHMuZWFzZVNpbk91dCA9IHNpbk91dDsKZXhwb3J0cy5lYXNlU2luSW5PdXQgPSBzaW5Jbk91dDsKZXhwb3J0cy5lYXNlRXhwID0gZXhwSW5PdXQ7CmV4cG9ydHMuZWFzZUV4cEluID0gZXhwSW47CmV4cG9ydHMuZWFzZUV4cE91dCA9IGV4cE91dDsKZXhwb3J0cy5lYXNlRXhwSW5PdXQgPSBleHBJbk91dDsKZXhwb3J0cy5lYXNlQ2lyY2xlID0gY2lyY2xlSW5PdXQ7CmV4cG9ydHMuZWFzZUNpcmNsZUluID0gY2lyY2xlSW47CmV4cG9ydHMuZWFzZUNpcmNsZU91dCA9IGNpcmNsZU91dDsKZXhwb3J0cy5lYXNlQ2lyY2xlSW5PdXQgPSBjaXJjbGVJbk91dDsKZXhwb3J0cy5lYXNlQm91bmNlID0gYm91bmNlT3V0OwpleHBvcnRzLmVhc2VCb3VuY2VJbiA9IGJvdW5jZUluOwpleHBvcnRzLmVhc2VCb3VuY2VPdXQgPSBib3VuY2VPdXQ7CmV4cG9ydHMuZWFzZUJvdW5jZUluT3V0ID0gYm91bmNlSW5PdXQ7CmV4cG9ydHMuZWFzZUJhY2sgPSBiYWNrSW5PdXQ7CmV4cG9ydHMuZWFzZUJhY2tJbiA9IGJhY2tJbjsKZXhwb3J0cy5lYXNlQmFja091dCA9IGJhY2tPdXQ7CmV4cG9ydHMuZWFzZUJhY2tJbk91dCA9IGJhY2tJbk91dDsKZXhwb3J0cy5lYXNlRWxhc3RpYyA9IGVsYXN0aWNPdXQ7CmV4cG9ydHMuZWFzZUVsYXN0aWNJbiA9IGVsYXN0aWNJbjsKZXhwb3J0cy5lYXNlRWxhc3RpY091dCA9IGVsYXN0aWNPdXQ7CmV4cG9ydHMuZWFzZUVsYXN0aWNJbk91dCA9IGVsYXN0aWNJbk91dDsKZXhwb3J0cy5wb2x5Z29uQXJlYSA9IGFyZWE7CmV4cG9ydHMucG9seWdvbkNlbnRyb2lkID0gY2VudHJvaWQ7CmV4cG9ydHMucG9seWdvbkh1bGwgPSBodWxsOwpleHBvcnRzLnBvbHlnb25Db250YWlucyA9IGNvbnRhaW5zOwpleHBvcnRzLnBvbHlnb25MZW5ndGggPSBsZW5ndGgkMTsKZXhwb3J0cy5wYXRoID0gcGF0aDsKZXhwb3J0cy5xdWFkdHJlZSA9IHF1YWR0cmVlOwpleHBvcnRzLnF1ZXVlID0gcXVldWU7CmV4cG9ydHMuYXJjID0gYXJjOwpleHBvcnRzLmFyZWEgPSBhcmVhJDE7CmV4cG9ydHMubGluZSA9IGxpbmU7CmV4cG9ydHMucGllID0gcGllOwpleHBvcnRzLnJhZGlhbEFyZWEgPSByYWRpYWxBcmVhOwpleHBvcnRzLnJhZGlhbExpbmUgPSByYWRpYWxMaW5lJDE7CmV4cG9ydHMuc3ltYm9sID0gc3ltYm9sOwpleHBvcnRzLnN5bWJvbHMgPSBzeW1ib2xzOwpleHBvcnRzLnN5bWJvbENpcmNsZSA9IGNpcmNsZTsKZXhwb3J0cy5zeW1ib2xDcm9zcyA9IGNyb3NzJDE7CmV4cG9ydHMuc3ltYm9sRGlhbW9uZCA9IGRpYW1vbmQ7CmV4cG9ydHMuc3ltYm9sU3F1YXJlID0gc3F1YXJlOwpleHBvcnRzLnN5bWJvbFN0YXIgPSBzdGFyOwpleHBvcnRzLnN5bWJvbFRyaWFuZ2xlID0gdHJpYW5nbGU7CmV4cG9ydHMuc3ltYm9sV3llID0gd3llOwpleHBvcnRzLmN1cnZlQmFzaXNDbG9zZWQgPSBiYXNpc0Nsb3NlZDsKZXhwb3J0cy5jdXJ2ZUJhc2lzT3BlbiA9IGJhc2lzT3BlbjsKZXhwb3J0cy5jdXJ2ZUJhc2lzID0gYmFzaXM7CmV4cG9ydHMuY3VydmVCdW5kbGUgPSBidW5kbGU7CmV4cG9ydHMuY3VydmVDYXJkaW5hbENsb3NlZCA9IGNhcmRpbmFsQ2xvc2VkOwpleHBvcnRzLmN1cnZlQ2FyZGluYWxPcGVuID0gY2FyZGluYWxPcGVuOwpleHBvcnRzLmN1cnZlQ2FyZGluYWwgPSBjYXJkaW5hbDsKZXhwb3J0cy5jdXJ2ZUNhdG11bGxSb21DbG9zZWQgPSBjYXRtdWxsUm9tQ2xvc2VkOwpleHBvcnRzLmN1cnZlQ2F0bXVsbFJvbU9wZW4gPSBjYXRtdWxsUm9tT3BlbjsKZXhwb3J0cy5jdXJ2ZUNhdG11bGxSb20gPSBjYXRtdWxsUm9tOwpleHBvcnRzLmN1cnZlTGluZWFyQ2xvc2VkID0gbGluZWFyQ2xvc2VkOwpleHBvcnRzLmN1cnZlTGluZWFyID0gY3VydmVMaW5lYXI7CmV4cG9ydHMuY3VydmVNb25vdG9uZVggPSBtb25vdG9uZVg7CmV4cG9ydHMuY3VydmVNb25vdG9uZVkgPSBtb25vdG9uZVk7CmV4cG9ydHMuY3VydmVOYXR1cmFsID0gbmF0dXJhbDsKZXhwb3J0cy5jdXJ2ZVN0ZXAgPSBzdGVwOwpleHBvcnRzLmN1cnZlU3RlcEFmdGVyID0gc3RlcEFmdGVyOwpleHBvcnRzLmN1cnZlU3RlcEJlZm9yZSA9IHN0ZXBCZWZvcmU7CmV4cG9ydHMuc3RhY2sgPSBzdGFjazsKZXhwb3J0cy5zdGFja09mZnNldEV4cGFuZCA9IGV4cGFuZDsKZXhwb3J0cy5zdGFja09mZnNldE5vbmUgPSBub25lOwpleHBvcnRzLnN0YWNrT2Zmc2V0U2lsaG91ZXR0ZSA9IHNpbGhvdWV0dGU7CmV4cG9ydHMuc3RhY2tPZmZzZXRXaWdnbGUgPSB3aWdnbGU7CmV4cG9ydHMuc3RhY2tPcmRlckFzY2VuZGluZyA9IGFzY2VuZGluZyQxOwpleHBvcnRzLnN0YWNrT3JkZXJEZXNjZW5kaW5nID0gZGVzY2VuZGluZyQyOwpleHBvcnRzLnN0YWNrT3JkZXJJbnNpZGVPdXQgPSBpbnNpZGVPdXQ7CmV4cG9ydHMuc3RhY2tPcmRlck5vbmUgPSBub25lJDE7CmV4cG9ydHMuc3RhY2tPcmRlclJldmVyc2UgPSByZXZlcnNlOwpleHBvcnRzLmNvbG9yID0gY29sb3I7CmV4cG9ydHMucmdiID0gcmdiOwpleHBvcnRzLmhzbCA9IGhzbDsKZXhwb3J0cy5sYWIgPSBsYWI7CmV4cG9ydHMuaGNsID0gaGNsOwpleHBvcnRzLmN1YmVoZWxpeCA9IGN1YmVoZWxpeDsKZXhwb3J0cy5pbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlOwpleHBvcnRzLmludGVycG9sYXRlQXJyYXkgPSBhcnJheSQxOwpleHBvcnRzLmludGVycG9sYXRlRGF0ZSA9IGRhdGU7CmV4cG9ydHMuaW50ZXJwb2xhdGVOdW1iZXIgPSBpbnRlcnBvbGF0ZU51bWJlcjsKZXhwb3J0cy5pbnRlcnBvbGF0ZU9iamVjdCA9IG9iamVjdDsKZXhwb3J0cy5pbnRlcnBvbGF0ZVJvdW5kID0gaW50ZXJwb2xhdGVSb3VuZDsKZXhwb3J0cy5pbnRlcnBvbGF0ZVN0cmluZyA9IGludGVycG9sYXRlU3RyaW5nOwpleHBvcnRzLmludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M7CmV4cG9ydHMuaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZzsKZXhwb3J0cy5pbnRlcnBvbGF0ZVpvb20gPSBpbnRlcnBvbGF0ZVpvb207CmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2IgPSBpbnRlcnBvbGF0ZVJnYjsKZXhwb3J0cy5pbnRlcnBvbGF0ZVJnYkJhc2lzID0gcmdiQmFzaXM7CmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZCA9IHJnYkJhc2lzQ2xvc2VkOwpleHBvcnRzLmludGVycG9sYXRlSHNsID0gaHNsJDI7CmV4cG9ydHMuaW50ZXJwb2xhdGVIc2xMb25nID0gaHNsTG9uZzsKZXhwb3J0cy5pbnRlcnBvbGF0ZUxhYiA9IGxhYiQxOwpleHBvcnRzLmludGVycG9sYXRlSGNsID0gaGNsJDI7CmV4cG9ydHMuaW50ZXJwb2xhdGVIY2xMb25nID0gaGNsTG9uZzsKZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeCA9IGN1YmVoZWxpeCQyOwpleHBvcnRzLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyA9IGN1YmVoZWxpeExvbmc7CmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpcyA9IGJhc2lzJDI7CmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZCA9IGJhc2lzQ2xvc2VkJDE7CmV4cG9ydHMucXVhbnRpemUgPSBxdWFudGl6ZTsKZXhwb3J0cy5kaXNwYXRjaCA9IGRpc3BhdGNoOwpleHBvcnRzLmRzdkZvcm1hdCA9IGRzdjsKZXhwb3J0cy5jc3ZQYXJzZSA9IGNzdlBhcnNlOwpleHBvcnRzLmNzdlBhcnNlUm93cyA9IGNzdlBhcnNlUm93czsKZXhwb3J0cy5jc3ZGb3JtYXQgPSBjc3ZGb3JtYXQ7CmV4cG9ydHMuY3N2Rm9ybWF0Um93cyA9IGNzdkZvcm1hdFJvd3M7CmV4cG9ydHMudHN2UGFyc2UgPSB0c3ZQYXJzZTsKZXhwb3J0cy50c3ZQYXJzZVJvd3MgPSB0c3ZQYXJzZVJvd3M7CmV4cG9ydHMudHN2Rm9ybWF0ID0gdHN2Rm9ybWF0OwpleHBvcnRzLnRzdkZvcm1hdFJvd3MgPSB0c3ZGb3JtYXRSb3dzOwpleHBvcnRzLnJlcXVlc3QgPSByZXF1ZXN0OwpleHBvcnRzLmh0bWwgPSBodG1sOwpleHBvcnRzLmpzb24gPSBqc29uOwpleHBvcnRzLnRleHQgPSB0ZXh0OwpleHBvcnRzLnhtbCA9IHhtbDsKZXhwb3J0cy5jc3YgPSBjc3YkMTsKZXhwb3J0cy50c3YgPSB0c3YkMTsKZXhwb3J0cy5ub3cgPSBub3c7CmV4cG9ydHMudGltZXIgPSB0aW1lcjsKZXhwb3J0cy50aW1lckZsdXNoID0gdGltZXJGbHVzaDsKZXhwb3J0cy50aW1lb3V0ID0gdGltZW91dCQxOwpleHBvcnRzLmludGVydmFsID0gaW50ZXJ2YWwkMTsKZXhwb3J0cy50aW1lSW50ZXJ2YWwgPSBuZXdJbnRlcnZhbDsKZXhwb3J0cy50aW1lTWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsKZXhwb3J0cy50aW1lTWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzOwpleHBvcnRzLnRpbWVTZWNvbmQgPSBzZWNvbmQ7CmV4cG9ydHMudGltZVNlY29uZHMgPSBzZWNvbmRzOwpleHBvcnRzLnRpbWVNaW51dGUgPSBtaW51dGU7CmV4cG9ydHMudGltZU1pbnV0ZXMgPSBtaW51dGVzOwpleHBvcnRzLnRpbWVIb3VyID0gaG91cjsKZXhwb3J0cy50aW1lSG91cnMgPSBob3VyczsKZXhwb3J0cy50aW1lRGF5ID0gZGF5OwpleHBvcnRzLnRpbWVEYXlzID0gZGF5czsKZXhwb3J0cy50aW1lV2VlayA9IHN1bmRheTsKZXhwb3J0cy50aW1lV2Vla3MgPSBzdW5kYXlzOwpleHBvcnRzLnRpbWVTdW5kYXkgPSBzdW5kYXk7CmV4cG9ydHMudGltZVN1bmRheXMgPSBzdW5kYXlzOwpleHBvcnRzLnRpbWVNb25kYXkgPSBtb25kYXk7CmV4cG9ydHMudGltZU1vbmRheXMgPSBtb25kYXlzOwpleHBvcnRzLnRpbWVUdWVzZGF5ID0gdHVlc2RheTsKZXhwb3J0cy50aW1lVHVlc2RheXMgPSB0dWVzZGF5czsKZXhwb3J0cy50aW1lV2VkbmVzZGF5ID0gd2VkbmVzZGF5OwpleHBvcnRzLnRpbWVXZWRuZXNkYXlzID0gd2VkbmVzZGF5czsKZXhwb3J0cy50aW1lVGh1cnNkYXkgPSB0aHVyc2RheTsKZXhwb3J0cy50aW1lVGh1cnNkYXlzID0gdGh1cnNkYXlzOwpleHBvcnRzLnRpbWVGcmlkYXkgPSBmcmlkYXk7CmV4cG9ydHMudGltZUZyaWRheXMgPSBmcmlkYXlzOwpleHBvcnRzLnRpbWVTYXR1cmRheSA9IHNhdHVyZGF5OwpleHBvcnRzLnRpbWVTYXR1cmRheXMgPSBzYXR1cmRheXM7CmV4cG9ydHMudGltZU1vbnRoID0gbW9udGg7CmV4cG9ydHMudGltZU1vbnRocyA9IG1vbnRoczsKZXhwb3J0cy50aW1lWWVhciA9IHllYXI7CmV4cG9ydHMudGltZVllYXJzID0geWVhcnM7CmV4cG9ydHMudXRjTWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsKZXhwb3J0cy51dGNNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7CmV4cG9ydHMudXRjU2Vjb25kID0gc2Vjb25kOwpleHBvcnRzLnV0Y1NlY29uZHMgPSBzZWNvbmRzOwpleHBvcnRzLnV0Y01pbnV0ZSA9IHV0Y01pbnV0ZTsKZXhwb3J0cy51dGNNaW51dGVzID0gdXRjTWludXRlczsKZXhwb3J0cy51dGNIb3VyID0gdXRjSG91cjsKZXhwb3J0cy51dGNIb3VycyA9IHV0Y0hvdXJzOwpleHBvcnRzLnV0Y0RheSA9IHV0Y0RheTsKZXhwb3J0cy51dGNEYXlzID0gdXRjRGF5czsKZXhwb3J0cy51dGNXZWVrID0gdXRjU3VuZGF5OwpleHBvcnRzLnV0Y1dlZWtzID0gdXRjU3VuZGF5czsKZXhwb3J0cy51dGNTdW5kYXkgPSB1dGNTdW5kYXk7CmV4cG9ydHMudXRjU3VuZGF5cyA9IHV0Y1N1bmRheXM7CmV4cG9ydHMudXRjTW9uZGF5ID0gdXRjTW9uZGF5OwpleHBvcnRzLnV0Y01vbmRheXMgPSB1dGNNb25kYXlzOwpleHBvcnRzLnV0Y1R1ZXNkYXkgPSB1dGNUdWVzZGF5OwpleHBvcnRzLnV0Y1R1ZXNkYXlzID0gdXRjVHVlc2RheXM7CmV4cG9ydHMudXRjV2VkbmVzZGF5ID0gdXRjV2VkbmVzZGF5OwpleHBvcnRzLnV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXlzOwpleHBvcnRzLnV0Y1RodXJzZGF5ID0gdXRjVGh1cnNkYXk7CmV4cG9ydHMudXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXlzOwpleHBvcnRzLnV0Y0ZyaWRheSA9IHV0Y0ZyaWRheTsKZXhwb3J0cy51dGNGcmlkYXlzID0gdXRjRnJpZGF5czsKZXhwb3J0cy51dGNTYXR1cmRheSA9IHV0Y1NhdHVyZGF5OwpleHBvcnRzLnV0Y1NhdHVyZGF5cyA9IHV0Y1NhdHVyZGF5czsKZXhwb3J0cy51dGNNb250aCA9IHV0Y01vbnRoOwpleHBvcnRzLnV0Y01vbnRocyA9IHV0Y01vbnRoczsKZXhwb3J0cy51dGNZZWFyID0gdXRjWWVhcjsKZXhwb3J0cy51dGNZZWFycyA9IHV0Y1llYXJzOwpleHBvcnRzLmZvcm1hdExvY2FsZSA9IGZvcm1hdExvY2FsZTsKZXhwb3J0cy5mb3JtYXREZWZhdWx0TG9jYWxlID0gZGVmYXVsdExvY2FsZTsKZXhwb3J0cy5mb3JtYXRTcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXI7CmV4cG9ydHMucHJlY2lzaW9uRml4ZWQgPSBwcmVjaXNpb25GaXhlZDsKZXhwb3J0cy5wcmVjaXNpb25QcmVmaXggPSBwcmVjaXNpb25QcmVmaXg7CmV4cG9ydHMucHJlY2lzaW9uUm91bmQgPSBwcmVjaXNpb25Sb3VuZDsKZXhwb3J0cy5pc29Gb3JtYXQgPSBmb3JtYXRJc287CmV4cG9ydHMuaXNvUGFyc2UgPSBwYXJzZUlzbzsKZXhwb3J0cy50aW1lRm9ybWF0TG9jYWxlID0gZm9ybWF0TG9jYWxlJDE7CmV4cG9ydHMudGltZUZvcm1hdERlZmF1bHRMb2NhbGUgPSBkZWZhdWx0TG9jYWxlJDE7CmV4cG9ydHMuc2NhbGVCYW5kID0gYmFuZDsKZXhwb3J0cy5zY2FsZVBvaW50ID0gcG9pbnQkNDsKZXhwb3J0cy5zY2FsZUlkZW50aXR5ID0gaWRlbnRpdHkkNDsKZXhwb3J0cy5zY2FsZUxpbmVhciA9IGxpbmVhciQyOwpleHBvcnRzLnNjYWxlTG9nID0gbG9nOwpleHBvcnRzLnNjYWxlT3JkaW5hbCA9IG9yZGluYWw7CmV4cG9ydHMuc2NhbGVJbXBsaWNpdCA9IGltcGxpY2l0OwpleHBvcnRzLnNjYWxlUG93ID0gcG93OwpleHBvcnRzLnNjYWxlU3FydCA9IHNxcnQ7CmV4cG9ydHMuc2NhbGVRdWFudGlsZSA9IHF1YW50aWxlJCQxOwpleHBvcnRzLnNjYWxlUXVhbnRpemUgPSBxdWFudGl6ZSQxOwpleHBvcnRzLnNjYWxlVGhyZXNob2xkID0gdGhyZXNob2xkJDE7CmV4cG9ydHMuc2NhbGVUaW1lID0gdGltZTsKZXhwb3J0cy5zY2FsZVV0YyA9IHV0Y1RpbWU7CmV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkxMCA9IGNhdGVnb3J5MTA7CmV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkyMGIgPSBjYXRlZ29yeTIwYjsKZXhwb3J0cy5zY2hlbWVDYXRlZ29yeTIwYyA9IGNhdGVnb3J5MjBjOwpleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjAgPSBjYXRlZ29yeTIwOwpleHBvcnRzLnNjYWxlU2VxdWVudGlhbCA9IHNlcXVlbnRpYWw7CmV4cG9ydHMuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0ID0gY3ViZWhlbGl4JDM7CmV4cG9ydHMuaW50ZXJwb2xhdGVSYWluYm93ID0gcmFpbmJvdyQxOwpleHBvcnRzLmludGVycG9sYXRlV2FybSA9IHdhcm07CmV4cG9ydHMuaW50ZXJwb2xhdGVDb29sID0gY29vbDsKZXhwb3J0cy5pbnRlcnBvbGF0ZVZpcmlkaXMgPSB2aXJpZGlzOwpleHBvcnRzLmludGVycG9sYXRlTWFnbWEgPSBtYWdtYTsKZXhwb3J0cy5pbnRlcnBvbGF0ZUluZmVybm8gPSBpbmZlcm5vOwpleHBvcnRzLmludGVycG9sYXRlUGxhc21hID0gcGxhc21hOwpleHBvcnRzLmNyZWF0b3IgPSBjcmVhdG9yOwpleHBvcnRzLmN1c3RvbUV2ZW50ID0gY3VzdG9tRXZlbnQ7CmV4cG9ydHMubG9jYWwgPSBsb2NhbDsKZXhwb3J0cy5tYXRjaGVyID0gbWF0Y2hlciQxOwpleHBvcnRzLm1vdXNlID0gbW91c2U7CmV4cG9ydHMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwpleHBvcnRzLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOwpleHBvcnRzLnNlbGVjdCA9IHNlbGVjdDsKZXhwb3J0cy5zZWxlY3RBbGwgPSBzZWxlY3RBbGw7CmV4cG9ydHMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwpleHBvcnRzLnNlbGVjdG9yID0gc2VsZWN0b3I7CmV4cG9ydHMuc2VsZWN0b3JBbGwgPSBzZWxlY3RvckFsbDsKZXhwb3J0cy50b3VjaCA9IHRvdWNoOwpleHBvcnRzLnRvdWNoZXMgPSB0b3VjaGVzOwpleHBvcnRzLndpbmRvdyA9IHdpbmRvdzsKZXhwb3J0cy5hY3RpdmUgPSBhY3RpdmU7CmV4cG9ydHMuaW50ZXJydXB0ID0gaW50ZXJydXB0OwpleHBvcnRzLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOwpleHBvcnRzLmF4aXNUb3AgPSBheGlzVG9wOwpleHBvcnRzLmF4aXNSaWdodCA9IGF4aXNSaWdodDsKZXhwb3J0cy5heGlzQm90dG9tID0gYXhpc0JvdHRvbTsKZXhwb3J0cy5heGlzTGVmdCA9IGF4aXNMZWZ0OwpleHBvcnRzLmNsdXN0ZXIgPSBjbHVzdGVyOwpleHBvcnRzLmhpZXJhcmNoeSA9IGhpZXJhcmNoeTsKZXhwb3J0cy5wYWNrID0gaW5kZXg7CmV4cG9ydHMucGFja1NpYmxpbmdzID0gc2libGluZ3M7CmV4cG9ydHMucGFja0VuY2xvc2UgPSBlbmNsb3NlOwpleHBvcnRzLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjsKZXhwb3J0cy5zdHJhdGlmeSA9IHN0cmF0aWZ5OwpleHBvcnRzLnRyZWUgPSB0cmVlOwpleHBvcnRzLnRyZWVtYXAgPSBpbmRleCQxOwpleHBvcnRzLnRyZWVtYXBCaW5hcnkgPSBiaW5hcnk7CmV4cG9ydHMudHJlZW1hcERpY2UgPSB0cmVlbWFwRGljZTsKZXhwb3J0cy50cmVlbWFwU2xpY2UgPSB0cmVlbWFwU2xpY2U7CmV4cG9ydHMudHJlZW1hcFNsaWNlRGljZSA9IHNsaWNlRGljZTsKZXhwb3J0cy50cmVlbWFwU3F1YXJpZnkgPSBzcXVhcmlmeTsKZXhwb3J0cy50cmVlbWFwUmVzcXVhcmlmeSA9IHJlc3F1YXJpZnk7CmV4cG9ydHMuZm9yY2VDZW50ZXIgPSBjZW50ZXIkMTsKZXhwb3J0cy5mb3JjZUNvbGxpZGUgPSBjb2xsaWRlOwpleHBvcnRzLmZvcmNlTGluayA9IGxpbms7CmV4cG9ydHMuZm9yY2VNYW55Qm9keSA9IG1hbnlCb2R5OwpleHBvcnRzLmZvcmNlU2ltdWxhdGlvbiA9IHNpbXVsYXRpb247CmV4cG9ydHMuZm9yY2VYID0geCQzOwpleHBvcnRzLmZvcmNlWSA9IHkkMzsKZXhwb3J0cy5kcmFnID0gZHJhZzsKZXhwb3J0cy5kcmFnRGlzYWJsZSA9IGRyYWdEaXNhYmxlOwpleHBvcnRzLmRyYWdFbmFibGUgPSB5ZXNkcmFnOwpleHBvcnRzLnZvcm9ub2kgPSB2b3Jvbm9pOwpleHBvcnRzLnpvb20gPSB6b29tOwpleHBvcnRzLnpvb21JZGVudGl0eSA9IGlkZW50aXR5JDY7CmV4cG9ydHMuem9vbVRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKZXhwb3J0cy5icnVzaCA9IGJydXNoOwpleHBvcnRzLmJydXNoWCA9IGJydXNoWDsKZXhwb3J0cy5icnVzaFkgPSBicnVzaFk7CmV4cG9ydHMuYnJ1c2hTZWxlY3Rpb24gPSBicnVzaFNlbGVjdGlvbjsKZXhwb3J0cy5jaG9yZCA9IGNob3JkOwpleHBvcnRzLnJpYmJvbiA9IHJpYmJvbjsKZXhwb3J0cy5nZW9BbGJlcnMgPSBhbGJlcnM7CmV4cG9ydHMuZ2VvQWxiZXJzVXNhID0gYWxiZXJzVXNhOwpleHBvcnRzLmdlb0FyZWEgPSBhcmVhJDI7CmV4cG9ydHMuZ2VvQXppbXV0aGFsRXF1YWxBcmVhID0gYXppbXV0aGFsRXF1YWxBcmVhOwpleHBvcnRzLmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdyA9IGF6aW11dGhhbEVxdWFsQXJlYVJhdzsKZXhwb3J0cy5nZW9BemltdXRoYWxFcXVpZGlzdGFudCA9IGF6aW11dGhhbEVxdWlkaXN0YW50OwpleHBvcnRzLmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3ID0gYXppbXV0aGFsRXF1aWRpc3RhbnRSYXc7CmV4cG9ydHMuZ2VvQm91bmRzID0gYm91bmRzOwpleHBvcnRzLmdlb0NlbnRyb2lkID0gY2VudHJvaWQkMTsKZXhwb3J0cy5nZW9DaXJjbGUgPSBjaXJjbGUkMTsKZXhwb3J0cy5nZW9DbGlwRXh0ZW50ID0gZXh0ZW50JDE7CmV4cG9ydHMuZ2VvQ29uaWNDb25mb3JtYWwgPSBjb25pY0NvbmZvcm1hbDsKZXhwb3J0cy5nZW9Db25pY0NvbmZvcm1hbFJhdyA9IGNvbmljQ29uZm9ybWFsUmF3OwpleHBvcnRzLmdlb0NvbmljRXF1YWxBcmVhID0gY29uaWNFcXVhbEFyZWE7CmV4cG9ydHMuZ2VvQ29uaWNFcXVhbEFyZWFSYXcgPSBjb25pY0VxdWFsQXJlYVJhdzsKZXhwb3J0cy5nZW9Db25pY0VxdWlkaXN0YW50ID0gY29uaWNFcXVpZGlzdGFudDsKZXhwb3J0cy5nZW9Db25pY0VxdWlkaXN0YW50UmF3ID0gY29uaWNFcXVpZGlzdGFudFJhdzsKZXhwb3J0cy5nZW9EaXN0YW5jZSA9IGRpc3RhbmNlOwpleHBvcnRzLmdlb0VxdWlyZWN0YW5ndWxhciA9IGVxdWlyZWN0YW5ndWxhcjsKZXhwb3J0cy5nZW9FcXVpcmVjdGFuZ3VsYXJSYXcgPSBlcXVpcmVjdGFuZ3VsYXJSYXc7CmV4cG9ydHMuZ2VvR25vbW9uaWMgPSBnbm9tb25pYzsKZXhwb3J0cy5nZW9Hbm9tb25pY1JhdyA9IGdub21vbmljUmF3OwpleHBvcnRzLmdlb0dyYXRpY3VsZSA9IGdyYXRpY3VsZTsKZXhwb3J0cy5nZW9JbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlJDI7CmV4cG9ydHMuZ2VvTGVuZ3RoID0gbGVuZ3RoJDI7CmV4cG9ydHMuZ2VvTWVyY2F0b3IgPSBtZXJjYXRvcjsKZXhwb3J0cy5nZW9NZXJjYXRvclJhdyA9IG1lcmNhdG9yUmF3OwpleHBvcnRzLmdlb09ydGhvZ3JhcGhpYyA9IG9ydGhvZ3JhcGhpYzsKZXhwb3J0cy5nZW9PcnRob2dyYXBoaWNSYXcgPSBvcnRob2dyYXBoaWNSYXc7CmV4cG9ydHMuZ2VvUGF0aCA9IGluZGV4JDM7CmV4cG9ydHMuZ2VvUHJvamVjdGlvbiA9IHByb2plY3Rpb247CmV4cG9ydHMuZ2VvUHJvamVjdGlvbk11dGF0b3IgPSBwcm9qZWN0aW9uTXV0YXRvcjsKZXhwb3J0cy5nZW9Sb3RhdGlvbiA9IHJvdGF0aW9uOwpleHBvcnRzLmdlb1N0ZXJlb2dyYXBoaWMgPSBzdGVyZW9ncmFwaGljOwpleHBvcnRzLmdlb1N0ZXJlb2dyYXBoaWNSYXcgPSBzdGVyZW9ncmFwaGljUmF3OwpleHBvcnRzLmdlb1N0cmVhbSA9IGdlb1N0cmVhbTsKZXhwb3J0cy5nZW9UcmFuc2Zvcm0gPSB0cmFuc2Zvcm0kMTsKZXhwb3J0cy5nZW9UcmFuc3ZlcnNlTWVyY2F0b3IgPSB0cmFuc3ZlcnNlTWVyY2F0b3I7CmV4cG9ydHMuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3ID0gdHJhbnN2ZXJzZU1lcmNhdG9yUmF3OwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKCn0pKSk7Cg=="></script>
<script>
function create_force_directed_graph(configuracoes){
var width = $(configuracoes['selector']).width()
var height = $(configuracoes['selector']).height()
var escalaNodes = d3.scaleSqrt()
.domain([
d3.min(configuracoes['nodes'], function(d){return parseFloat(d.size);}),
d3.max(configuracoes['nodes'], function(d){return parseFloat(d.size);}),
])
.range([5,20])
var escalaLinks = d3.scaleSqrt()
.domain([
d3.min(configuracoes['links'], function(d){return parseFloat(d.value);}),
d3.max(configuracoes['links'], function(d){return parseFloat(d.value);}),
])
.range([0.5,5])
$(configuracoes['selector']).empty()
var svg = d3.select(configuracoes['selector'])
.append("svg")
.style('cursor', 'move')
.attr("width", width)
.attr("height", height)
.call(d3.zoom().on("zoom", function () {
//svg.attr("transform", "translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")")
svg.attr("transform", d3.event.transform);
}))
.append("g");
svg.append("svg:defs").selectAll("marker")
.data(["end"]) // Different link/path types can be defined here
.enter().append("svg:marker") // This section adds in the arrows
.attr("id", String)
.attr("viewBox", "0 -5 10 10")
.attr("refX", 15)
.attr("refY", -1.5)
.attr("markerWidth", 6)
.attr("markerHeight", 6)
.attr("orient", "auto")
.append("svg:path")
.attr("d", "M0,-5L10,0L0,5");
/*
texto = '';
//texto += '<defs>';
texto += ' <marker id="arrow" markerWidth="10" markerHeight="10" refX="0" refY="3" orient="auto" markerUnits="strokeWidth">';
texto += ' <path d="M0,0 L0,6 L9,3 z" fill="#f00" />';
texto += ' </marker>';
//texto += '</defs>';
texto = '';
texto += '<marker xmlns="http://www.w3.org/2000/svg" id="triangle" viewBox="0 0 10 10" refX="0" refY="5" markerUnits="strokeWidth" markerWidth="4" markerHeight="3" orient="auto">';
texto += ' <path d="M 0 0 L 10 5 L 0 10 z"/>';
texto += '</marker>';
$('svg').prepend(texto);
*/
//var color = d3.scaleOrdinal(d3.schemeCategory20);
var color = d3.scaleOrdinal([
"#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5",
"#3182bd", "#6baed6", "#9ecae1", "#c6dbef", "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", "#31a354", "#74c476", "#a1d99b", "#c7e9c0", "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", "#636363", "#969696", "#bdbdbd", "#d9d9d9",
//"#393b79", "#5254a3", "#6b6ecf", "#9c9ede", "#637939", "#8ca252", "#b5cf6b", "#cedb9c", "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", "#843c39", "#ad494a", "#d6616b", "#e7969c", "#7b4173", "#a55194", "#ce6dbd", "#de9ed6",
]);
var simulation = d3.forceSimulation()
.force("link", d3.forceLink()
.id(function(d) { return d.id; })
.distance(100)
//.strength(1)
)
.force("charge",
d3.forceManyBody()
.strength(-100)
)
.force("center", d3.forceCenter(width / 2, height / 2));
var link = svg.append("svg:g")
.attr("class", "links")
.selectAll("path")
.data(configuracoes['links'])
.enter().append("svg:path")
//.attr("class", "testelinha")
.attr("marker-end", "url(#end)")
.attr("stroke-width", function(d) { return 0.1;escalaLinks(parseFloat(d.value)); });
var node = svg.append('g')
.attr("class", "nodes")
.selectAll("g")
.data(configuracoes['nodes'])
.enter()
.append("g")
.style('cursor', 'pointer')
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
node.append("circle")
.attr("r", function(d) { return escalaNodes(parseFloat(d.size)); })
.attr("fill", function(d) { return color(d.group); })
.on('click', configuracoes['onclickcallback'])
node.append("text")
.attr("dx", function(d) { return escalaNodes(parseFloat(d.size)) + 5; })
.attr("dy", ".35em")
.on('click', configuracoes['onclickcallback'])
.text(function(d) { return d.id });
/*
var node = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(configuracoes['nodes'])
.enter().append("circle")
.attr("r", 10)
.attr("fill", function(d) { return color(d.group); })
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
*/
node.append("title")
.text(function(d) { return d.id; });
simulation
.nodes(configuracoes['nodes'])
.on("tick", function(){
/*
link
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
*/
link.attr("d", function(d) {
var dx = d.target.x - d.source.x,
dy = d.target.y - d.source.y,
dr = Math.sqrt(dx * dx + dy * dy);
return "M" +
d.source.x + "," +
d.source.y + "A" +
dr + "," + dr + " 0 0,1 " +
d.target.x + "," +
d.target.y;
});
/*
node
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
*/
node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
});
simulation.force("link")
.links(configuracoes['links']);
// svg.call(zoom);
//
// function zoomed() {
// svg.attr("transform", d3.event.transform);
// }
function ticked() {
link
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
}
function dragstarted(d) {
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(d) {
d.fx = d3.event.x;
d.fy = d3.event.y;
}
function dragended(d) {
if (!d3.event.active) simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}
}
</script>
<script type="text/javascript">
//globais
var tabela_contagem_palavras;
var tabela_tweets;
var verificar_coleta = true;
var data = {"nodes": [{"id": "22088678000100", "group": "1", "size": "3"}, {"id": "ADELMO CARNEIRO LEAO", "group": "1", "size": "3"}, {"id": "4930606000187", "group": "1", "size": "3"}, {"id": "JOSE SILVA SOARES", "group": "1", "size": "3"}, {"id": "21032511000165", "group": "1", "size": "3"}, {"id": "AELTON JOSE DE FREITAS", "group": "1", "size": "3"}], "links": [{"source": "22088678000100", "target": "ADELMO CARNEIRO LEAO", "value": "9500.0"}, {"source": "ADELMO CARNEIRO LEAO", "target": "4930606000187", "value": "261.39"}, {"source": "ADELMO CARNEIRO LEAO", "target": "22088678000100", "value": "400.0"}, {"source": "4930606000187", "target": "JOSE SILVA SOARES", "value": "10000.0"}, {"source": "JOSE SILVA SOARES", "target": "21032511000165", "value": "180.01"}, {"source": "21032511000165", "target": "AELTON JOSE DE FREITAS", "value": "6322.33"}, {"source": "AELTON JOSE DE FREITAS", "target": "21032511000165", "value": "2978.09"}, {"source": "AELTON JOSE DE FREITAS", "target": "22088678000100", "value": "1000.0"}]}
$(document).ready(function(){
//altura da div do grafo
windowHeight = parseFloat($(window).height());
windowWidth = parseFloat($(window).width());
var alturaGrafo = ( windowHeight - 70 ) * 0.95;
$('#div_graph').height(alturaGrafo);
var configuracoes = {
'selector': '#div_graph',
'nodes': data['nodes'],
'links': data['links'],
'onclickcallback': function(obj){
tabela_tweets
.search( obj.id )
.draw();
rolagem_foco("id_panel_tweets");
},
}
create_force_directed_graph(configuracoes);
});
</script>