-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrsa.js
135 lines (127 loc) · 143 KB
/
rsa.js
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
(function(Scratch) {
'use strict';
// Load the JSEncrypt library from a CDN
const script = document.createElement('script');
script.src = 'data:text/plain;base64,LyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUganNlbmNyeXB0Lm1pbi5qcy5MSUNFTlNFLnR4dCAqLw0KIWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuSlNFbmNyeXB0PWUoKTp0LkpTRW5jcnlwdD1lKCl9KHdpbmRvdywoKCk9PigoKT0+e3ZhciB0PXsxNTU6dD0+e3ZhciBlLGkscj10LmV4cG9ydHM9e307ZnVuY3Rpb24gbigpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHMoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIG8odCl7aWYoZT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigoZT09PW58fCFlKSYmc2V0VGltZW91dClyZXR1cm4gZT1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIGUodCwwKX1jYXRjaChpKXt0cnl7cmV0dXJuIGUuY2FsbChudWxsLHQsMCl9Y2F0Y2goaSl7cmV0dXJuIGUuY2FsbCh0aGlzLHQsMCl9fX0hZnVuY3Rpb24oKXt0cnl7ZT0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om59Y2F0Y2godCl7ZT1ufXRyeXtpPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OnN9Y2F0Y2godCl7aT1zfX0oKTt2YXIgaCxhPVtdLHU9ITEsYz0tMTtmdW5jdGlvbiBmKCl7dSYmaCYmKHU9ITEsaC5sZW5ndGg/YT1oLmNvbmNhdChhKTpjPS0xLGEubGVuZ3RoJiZsKCkpfWZ1bmN0aW9uIGwoKXtpZighdSl7dmFyIHQ9byhmKTt1PSEwO2Zvcih2YXIgZT1hLmxlbmd0aDtlOyl7Zm9yKGg9YSxhPVtdOysrYzxlOyloJiZoW2NdLnJ1bigpO2M9LTEsZT1hLmxlbmd0aH1oPW51bGwsdT0hMSxmdW5jdGlvbih0KXtpZihpPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKGk9PT1zfHwhaSkmJmNsZWFyVGltZW91dClyZXR1cm4gaT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtyZXR1cm4gaSh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIGkuY2FsbChudWxsLHQpfWNhdGNoKGUpe3JldHVybiBpLmNhbGwodGhpcyx0KX19fSh0KX19ZnVuY3Rpb24gcCh0LGUpe3RoaXMuZnVuPXQsdGhpcy5hcnJheT1lfWZ1bmN0aW9uIGcoKXt9ci5uZXh0VGljaz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyllW2ktMV09YXJndW1lbnRzW2ldO2EucHVzaChuZXcgcCh0LGUpKSwxIT09YS5sZW5ndGh8fHV8fG8obCl9LHAucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9LHIudGl0bGU9ImJyb3dzZXIiLHIuYnJvd3Nlcj0hMCxyLmVudj17fSxyLmFyZ3Y9W10sci52ZXJzaW9uPSIiLHIudmVyc2lvbnM9e30sci5vbj1nLHIuYWRkTGlzdGVuZXI9ZyxyLm9uY2U9ZyxyLm9mZj1nLHIucmVtb3ZlTGlzdGVuZXI9ZyxyLnJlbW92ZUFsbExpc3RlbmVycz1nLHIuZW1pdD1nLHIucHJlcGVuZExpc3RlbmVyPWcsci5wcmVwZW5kT25jZUxpc3RlbmVyPWcsci5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuW119LHIuYmluZGluZz1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LHIuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxyLmNoZGlyPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHIudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19fSxlPXt9O2Z1bmN0aW9uIGkocil7dmFyIG49ZVtyXTtpZih2b2lkIDAhPT1uKXJldHVybiBuLmV4cG9ydHM7dmFyIHM9ZVtyXT17ZXhwb3J0czp7fX07cmV0dXJuIHRbcl0ocyxzLmV4cG9ydHMsaSkscy5leHBvcnRzfWkuZD0odCxlKT0+e2Zvcih2YXIgciBpbiBlKWkubyhlLHIpJiYhaS5vKHQscikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIse2VudW1lcmFibGU6ITAsZ2V0OmVbcl19KX0saS5vPSh0LGUpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKTt2YXIgcj17fTtyZXR1cm4oKCk9PnsidXNlIHN0cmljdCI7aS5kKHIse2RlZmF1bHQ6KCk9PmN0fSk7dmFyIHQ9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdC5jaGFyQXQoZSl9ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0JmV9ZnVuY3Rpb24gcyh0LGUpe3JldHVybiB0fGV9ZnVuY3Rpb24gbyh0LGUpe3JldHVybiB0XmV9ZnVuY3Rpb24gaCh0LGUpe3JldHVybiB0Jn5lfWZ1bmN0aW9uIGEodCl7aWYoMD09dClyZXR1cm4tMTt2YXIgZT0wO3JldHVybiAwPT0oNjU1MzUmdCkmJih0Pj49MTYsZSs9MTYpLDA9PSgyNTUmdCkmJih0Pj49OCxlKz04KSwwPT0oMTUmdCkmJih0Pj49NCxlKz00KSwwPT0oMyZ0KSYmKHQ+Pj0yLGUrPTIpLDA9PSgxJnQpJiYrK2UsZX1mdW5jdGlvbiB1KHQpe2Zvcih2YXIgZT0wOzAhPXQ7KXQmPXQtMSwrK2U7cmV0dXJuIGV9dmFyIGMsZj0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsbD0iPSI7ZnVuY3Rpb24gcCh0KXt2YXIgZSxpLHI9IiI7Zm9yKGU9MDtlKzM8PXQubGVuZ3RoO2UrPTMpaT1wYXJzZUludCh0LnN1YnN0cmluZyhlLGUrMyksMTYpLHIrPWYuY2hhckF0KGk+PjYpK2YuY2hhckF0KDYzJmkpO2ZvcihlKzE9PXQubGVuZ3RoPyhpPXBhcnNlSW50KHQuc3Vic3RyaW5nKGUsZSsxKSwxNikscis9Zi5jaGFyQXQoaTw8MikpOmUrMj09dC5sZW5ndGgmJihpPXBhcnNlSW50KHQuc3Vic3RyaW5nKGUsZSsyKSwxNikscis9Zi5jaGFyQXQoaT4+MikrZi5jaGFyQXQoKDMmaSk8PDQpKTsoMyZyLmxlbmd0aCk+MDspcis9bDtyZXR1cm4gcn1mdW5jdGlvbiBnKHQpe3ZhciBpLHI9IiIsbj0wLHM9MDtmb3IoaT0wO2k8dC5sZW5ndGgmJnQuY2hhckF0KGkpIT1sOysraSl7dmFyIG89Zi5pbmRleE9mKHQuY2hhckF0KGkpKTtvPDB8fCgwPT1uPyhyKz1lKG8+PjIpLHM9MyZvLG49MSk6MT09bj8ocis9ZShzPDwyfG8+PjQpLHM9MTUmbyxuPTIpOjI9PW4/KHIrPWUocykscis9ZShvPj4yKSxzPTMmbyxuPTMpOihyKz1lKHM8PDJ8bz4+NCkscis9ZSgxNSZvKSxuPTApKX1yZXR1cm4gMT09biYmKHIrPWUoczw8MikpLHJ9dmFyIGQsdj17ZGVjb2RlOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHZvaWQgMD09PWQpe3ZhciBpPSI9IFxmXG5cclx0IFx1MjAyOFx1MjAyOSI7Zm9yKGQ9T2JqZWN0LmNyZWF0ZShudWxsKSxlPTA7ZTw2NDsrK2UpZFsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIuY2hhckF0KGUpXT1lO2ZvcihkWyItIl09NjIsZC5fPTYzLGU9MDtlPGkubGVuZ3RoOysrZSlkW2kuY2hhckF0KGUpXT0tMX12YXIgcj1bXSxuPTAscz0wO2ZvcihlPTA7ZTx0Lmxlbmd0aDsrK2Upe3ZhciBvPXQuY2hhckF0KGUpO2lmKCI9Ij09bylicmVhaztpZigtMSE9KG89ZFtvXSkpe2lmKHZvaWQgMD09PW8pdGhyb3cgbmV3IEVycm9yKCJJbGxlZ2FsIGNoYXJhY3RlciBhdCBvZmZzZXQgIitlKTtufD1vLCsrcz49ND8ocltyLmxlbmd0aF09bj4+MTYscltyLmxlbmd0aF09bj4+OCYyNTUscltyLmxlbmd0aF09MjU1Jm4sbj0wLHM9MCk6bjw8PTZ9fXN3aXRjaChzKXtjYXNlIDE6dGhyb3cgbmV3IEVycm9yKCJCYXNlNjQgZW5jb2RpbmcgaW5jb21wbGV0ZTogYXQgbGVhc3QgMiBiaXRzIG1pc3NpbmciKTtjYXNlIDI6cltyLmxlbmd0aF09bj4+MTA7YnJlYWs7Y2FzZSAzOnJbci5sZW5ndGhdPW4+PjE2LHJbci5sZW5ndGhdPW4+PjgmMjU1fXJldHVybiByfSxyZTovLS0tLS1CRUdJTiBbXi1dKy0tLS0tKFtBLVphLXowLTkrXC89XHNdKyktLS0tLUVORCBbXi1dKy0tLS0tfGJlZ2luLWJhc2U2NFteXG5dK1xuKFtBLVphLXowLTkrXC89XHNdKyk9PT09Lyx1bmFybW9yOmZ1bmN0aW9uKHQpe3ZhciBlPXYucmUuZXhlYyh0KTtpZihlKWlmKGVbMV0pdD1lWzFdO2Vsc2V7aWYoIWVbMl0pdGhyb3cgbmV3IEVycm9yKCJSZWdFeHAgb3V0IG9mIHN5bmMiKTt0PWVbMl19cmV0dXJuIHYuZGVjb2RlKHQpfX0sbT0xZTEzLHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuYnVmPVsrdHx8MF19cmV0dXJuIHQucHJvdG90eXBlLm11bEFkZD1mdW5jdGlvbih0LGUpe3ZhciBpLHIsbj10aGlzLmJ1ZixzPW4ubGVuZ3RoO2ZvcihpPTA7aTxzOysraSkocj1uW2ldKnQrZSk8bT9lPTA6ci09KGU9MHxyL20pKm0sbltpXT1yO2U+MCYmKG5baV09ZSl9LHQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXt2YXIgZSxpLHI9dGhpcy5idWYsbj1yLmxlbmd0aDtmb3IoZT0wO2U8bjsrK2UpKGk9cltlXS10KTwwPyhpKz1tLHQ9MSk6dD0wLHJbZV09aTtmb3IoOzA9PT1yW3IubGVuZ3RoLTFdOylyLnBvcCgpfSx0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0KXtpZigxMCE9KHR8fDEwKSl0aHJvdyBuZXcgRXJyb3IoIm9ubHkgYmFzZSAxMCBpcyBzdXBwb3J0ZWQiKTtmb3IodmFyIGU9dGhpcy5idWYsaT1lW2UubGVuZ3RoLTFdLnRvU3RyaW5nKCkscj1lLmxlbmd0aC0yO3I+PTA7LS1yKWkrPShtK2Vbcl0pLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO3JldHVybiBpfSx0LnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmLGU9MCxpPXQubGVuZ3RoLTE7aT49MDstLWkpZT1lKm0rdFtpXTtyZXR1cm4gZX0sdC5wcm90b3R5cGUuc2ltcGxpZnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1ZjtyZXR1cm4gMT09dC5sZW5ndGg/dFswXTp0aGlzfSx0fSgpLGI9IuKApiIsVD0vXihcZFxkKSgwWzEtOV18MVswLTJdKSgwWzEtOV18WzEyXVxkfDNbMDFdKShbMDFdXGR8MlswLTNdKSg/OihbMC01XVxkKSg/OihbMC01XVxkKSg/OlsuLF0oXGR7MSwzfSkpPyk/KT8oWnxbLStdKD86WzBdXGR8MVswLTJdKShbMC01XVxkKT8pPyQvLFM9L14oXGRcZFxkXGQpKDBbMS05XXwxWzAtMl0pKDBbMS05XXxbMTJdXGR8M1swMV0pKFswMV1cZHwyWzAtM10pKD86KFswLTVdXGQpKD86KFswLTVdXGQpKD86Wy4sXShcZHsxLDN9KSk/KT8pPyhafFstK10oPzpbMF1cZHwxWzAtMl0pKFswLTVdXGQpPyk/JC87ZnVuY3Rpb24gRSh0LGUpe3JldHVybiB0Lmxlbmd0aD5lJiYodD10LnN1YnN0cmluZygwLGUpK2IpLHR9dmFyIHcsRD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpKXt0aGlzLmhleERpZ2l0cz0iMDEyMzQ1Njc4OUFCQ0RFRiIsZSBpbnN0YW5jZW9mIHQ/KHRoaXMuZW5jPWUuZW5jLHRoaXMucG9zPWUucG9zKToodGhpcy5lbmM9ZSx0aGlzLnBvcz1pKX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQmJih0PXRoaXMucG9zKyspLHQ+PXRoaXMuZW5jLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlJlcXVlc3RpbmcgYnl0ZSBvZmZzZXQgIi5jb25jYXQodCwiIG9uIGEgc3RyZWFtIG9mIGxlbmd0aCAiKS5jb25jYXQodGhpcy5lbmMubGVuZ3RoKSk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0aGlzLmVuYz90aGlzLmVuYy5jaGFyQ29kZUF0KHQpOnRoaXMuZW5jW3RdfSx0LnByb3RvdHlwZS5oZXhCeXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhleERpZ2l0cy5jaGFyQXQodD4+NCYxNSkrdGhpcy5oZXhEaWdpdHMuY2hhckF0KDE1JnQpfSx0LnByb3RvdHlwZS5oZXhEdW1wPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHI9IiIsbj10O248ZTsrK24paWYocis9dGhpcy5oZXhCeXRlKHRoaXMuZ2V0KG4pKSwhMCE9PWkpc3dpdGNoKDE1Jm4pe2Nhc2UgNzpyKz0iICAiO2JyZWFrO2Nhc2UgMTU6cis9IlxuIjticmVhaztkZWZhdWx0OnIrPSIgIn1yZXR1cm4gcn0sdC5wcm90b3R5cGUuaXNBU0NJST1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10O2k8ZTsrK2kpe3ZhciByPXRoaXMuZ2V0KGkpO2lmKHI8MzJ8fHI+MTc2KXJldHVybiExfXJldHVybiEwfSx0LnByb3RvdHlwZS5wYXJzZVN0cmluZ0lTTz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0iIixyPXQ7cjxlOysrcilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuZ2V0KHIpKTtyZXR1cm4gaX0sdC5wcm90b3R5cGUucGFyc2VTdHJpbmdVVEY9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9IiIscj10O3I8ZTspe3ZhciBuPXRoaXMuZ2V0KHIrKyk7aSs9bjwxMjg/U3RyaW5nLmZyb21DaGFyQ29kZShuKTpuPjE5MSYmbjwyMjQ/U3RyaW5nLmZyb21DaGFyQ29kZSgoMzEmbik8PDZ8NjMmdGhpcy5nZXQocisrKSk6U3RyaW5nLmZyb21DaGFyQ29kZSgoMTUmbik8PDEyfCg2MyZ0aGlzLmdldChyKyspKTw8Nnw2MyZ0aGlzLmdldChyKyspKX1yZXR1cm4gaX0sdC5wcm90b3R5cGUucGFyc2VTdHJpbmdCTVA9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkscixuPSIiLHM9dDtzPGU7KWk9dGhpcy5nZXQocysrKSxyPXRoaXMuZ2V0KHMrKyksbis9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw4fHIpO3JldHVybiBufSx0LnByb3RvdHlwZS5wYXJzZVRpbWU9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMucGFyc2VTdHJpbmdJU08odCxlKSxuPShpP1Q6UykuZXhlYyhyKTtyZXR1cm4gbj8oaSYmKG5bMV09K25bMV0sblsxXSs9K25bMV08NzA/MmUzOjE5MDApLHI9blsxXSsiLSIrblsyXSsiLSIrblszXSsiICIrbls0XSxuWzVdJiYocis9IjoiK25bNV0sbls2XSYmKHIrPSI6IituWzZdLG5bN10mJihyKz0iLiIrbls3XSkpKSxuWzhdJiYocis9IiBVVEMiLCJaIiE9bls4XSYmKHIrPW5bOF0sbls5XSYmKHIrPSI6IituWzldKSkpLHIpOiJVbnJlY29nbml6ZWQgdGltZTogIityfSx0LnByb3RvdHlwZS5wYXJzZUludGVnZXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkscj10aGlzLmdldCh0KSxuPXI+MTI3LHM9bj8yNTU6MCxvPSIiO3I9PXMmJisrdDxlOylyPXRoaXMuZ2V0KHQpO2lmKDA9PShpPWUtdCkpcmV0dXJuIG4/LTE6MDtpZihpPjQpe2ZvcihvPXIsaTw8PTM7MD09KDEyOCYoK29ecykpOylvPStvPDwxLC0taTtvPSIoIitpKyIgYml0KVxuIn1uJiYoci09MjU2KTtmb3IodmFyIGg9bmV3IHkociksYT10KzE7YTxlOysrYSloLm11bEFkZCgyNTYsdGhpcy5nZXQoYSkpO3JldHVybiBvK2gudG9TdHJpbmcoKX0sdC5wcm90b3R5cGUucGFyc2VCaXRTdHJpbmc9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgcj10aGlzLmdldCh0KSxuPSIoIisoKGUtdC0xPDwzKS1yKSsiIGJpdClcbiIscz0iIixvPXQrMTtvPGU7KytvKXtmb3IodmFyIGg9dGhpcy5nZXQobyksYT1vPT1lLTE/cjowLHU9Nzt1Pj1hOy0tdSlzKz1oPj51JjE/IjEiOiIwIjtpZihzLmxlbmd0aD5pKXJldHVybiBuK0UocyxpKX1yZXR1cm4gbitzfSx0LnByb3RvdHlwZS5wYXJzZU9jdGV0U3RyaW5nPWZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLmlzQVNDSUkodCxlKSlyZXR1cm4gRSh0aGlzLnBhcnNlU3RyaW5nSVNPKHQsZSksaSk7dmFyIHI9ZS10LG49IigiK3IrIiBieXRlKVxuIjtyPihpLz0yKSYmKGU9dCtpKTtmb3IodmFyIHM9dDtzPGU7KytzKW4rPXRoaXMuaGV4Qnl0ZSh0aGlzLmdldChzKSk7cmV0dXJuIHI+aSYmKG4rPWIpLG59LHQucHJvdG90eXBlLnBhcnNlT0lEPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHI9IiIsbj1uZXcgeSxzPTAsbz10O288ZTsrK28pe3ZhciBoPXRoaXMuZ2V0KG8pO2lmKG4ubXVsQWRkKDEyOCwxMjcmaCkscys9NywhKDEyOCZoKSl7aWYoIiI9PT1yKWlmKChuPW4uc2ltcGxpZnkoKSlpbnN0YW5jZW9mIHkpbi5zdWIoODApLHI9IjIuIituLnRvU3RyaW5nKCk7ZWxzZXt2YXIgYT1uPDgwP248NDA/MDoxOjI7cj1hKyIuIisobi00MCphKX1lbHNlIHIrPSIuIituLnRvU3RyaW5nKCk7aWYoci5sZW5ndGg+aSlyZXR1cm4gRShyLGkpO249bmV3IHkscz0wfX1yZXR1cm4gcz4wJiYocis9Ii5pbmNvbXBsZXRlIikscn0sdH0oKSx4PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsaSxyLG4pe2lmKCEociBpbnN0YW5jZW9mIFIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCB0YWcgdmFsdWUuIik7dGhpcy5zdHJlYW09dCx0aGlzLmhlYWRlcj1lLHRoaXMubGVuZ3RoPWksdGhpcy50YWc9cix0aGlzLnN1Yj1ufXJldHVybiB0LnByb3RvdHlwZS50eXBlTmFtZT1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLnRhZy50YWdDbGFzcyl7Y2FzZSAwOnN3aXRjaCh0aGlzLnRhZy50YWdOdW1iZXIpe2Nhc2UgMDpyZXR1cm4iRU9DIjtjYXNlIDE6cmV0dXJuIkJPT0xFQU4iO2Nhc2UgMjpyZXR1cm4iSU5URUdFUiI7Y2FzZSAzOnJldHVybiJCSVRfU1RSSU5HIjtjYXNlIDQ6cmV0dXJuIk9DVEVUX1NUUklORyI7Y2FzZSA1OnJldHVybiJOVUxMIjtjYXNlIDY6cmV0dXJuIk9CSkVDVF9JREVOVElGSUVSIjtjYXNlIDc6cmV0dXJuIk9iamVjdERlc2NyaXB0b3IiO2Nhc2UgODpyZXR1cm4iRVhURVJOQUwiO2Nhc2UgOTpyZXR1cm4iUkVBTCI7Y2FzZSAxMDpyZXR1cm4iRU5VTUVSQVRFRCI7Y2FzZSAxMTpyZXR1cm4iRU1CRURERURfUERWIjtjYXNlIDEyOnJldHVybiJVVEY4U3RyaW5nIjtjYXNlIDE2OnJldHVybiJTRVFVRU5DRSI7Y2FzZSAxNzpyZXR1cm4iU0VUIjtjYXNlIDE4OnJldHVybiJOdW1lcmljU3RyaW5nIjtjYXNlIDE5OnJldHVybiJQcmludGFibGVTdHJpbmciO2Nhc2UgMjA6cmV0dXJuIlRlbGV0ZXhTdHJpbmciO2Nhc2UgMjE6cmV0dXJuIlZpZGVvdGV4U3RyaW5nIjtjYXNlIDIyOnJldHVybiJJQTVTdHJpbmciO2Nhc2UgMjM6cmV0dXJuIlVUQ1RpbWUiO2Nhc2UgMjQ6cmV0dXJuIkdlbmVyYWxpemVkVGltZSI7Y2FzZSAyNTpyZXR1cm4iR3JhcGhpY1N0cmluZyI7Y2FzZSAyNjpyZXR1cm4iVmlzaWJsZVN0cmluZyI7Y2FzZSAyNzpyZXR1cm4iR2VuZXJhbFN0cmluZyI7Y2FzZSAyODpyZXR1cm4iVW5pdmVyc2FsU3RyaW5nIjtjYXNlIDMwOnJldHVybiJCTVBTdHJpbmcifXJldHVybiJVbml2ZXJzYWxfIit0aGlzLnRhZy50YWdOdW1iZXIudG9TdHJpbmcoKTtjYXNlIDE6cmV0dXJuIkFwcGxpY2F0aW9uXyIrdGhpcy50YWcudGFnTnVtYmVyLnRvU3RyaW5nKCk7Y2FzZSAyOnJldHVybiJbIit0aGlzLnRhZy50YWdOdW1iZXIudG9TdHJpbmcoKSsiXSI7Y2FzZSAzOnJldHVybiJQcml2YXRlXyIrdGhpcy50YWcudGFnTnVtYmVyLnRvU3RyaW5nKCl9fSx0LnByb3RvdHlwZS5jb250ZW50PWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXRoaXMudGFnKXJldHVybiBudWxsO3ZvaWQgMD09PXQmJih0PTEvMCk7dmFyIGU9dGhpcy5wb3NDb250ZW50KCksaT1NYXRoLmFicyh0aGlzLmxlbmd0aCk7aWYoIXRoaXMudGFnLmlzVW5pdmVyc2FsKCkpcmV0dXJuIG51bGwhPT10aGlzLnN1Yj8iKCIrdGhpcy5zdWIubGVuZ3RoKyIgZWxlbSkiOnRoaXMuc3RyZWFtLnBhcnNlT2N0ZXRTdHJpbmcoZSxlK2ksdCk7c3dpdGNoKHRoaXMudGFnLnRhZ051bWJlcil7Y2FzZSAxOnJldHVybiAwPT09dGhpcy5zdHJlYW0uZ2V0KGUpPyJmYWxzZSI6InRydWUiO2Nhc2UgMjpyZXR1cm4gdGhpcy5zdHJlYW0ucGFyc2VJbnRlZ2VyKGUsZStpKTtjYXNlIDM6cmV0dXJuIHRoaXMuc3ViPyIoIit0aGlzLnN1Yi5sZW5ndGgrIiBlbGVtKSI6dGhpcy5zdHJlYW0ucGFyc2VCaXRTdHJpbmcoZSxlK2ksdCk7Y2FzZSA0OnJldHVybiB0aGlzLnN1Yj8iKCIrdGhpcy5zdWIubGVuZ3RoKyIgZWxlbSkiOnRoaXMuc3RyZWFtLnBhcnNlT2N0ZXRTdHJpbmcoZSxlK2ksdCk7Y2FzZSA2OnJldHVybiB0aGlzLnN0cmVhbS5wYXJzZU9JRChlLGUraSx0KTtjYXNlIDE2OmNhc2UgMTc6cmV0dXJuIG51bGwhPT10aGlzLnN1Yj8iKCIrdGhpcy5zdWIubGVuZ3RoKyIgZWxlbSkiOiIobm8gZWxlbSkiO2Nhc2UgMTI6cmV0dXJuIEUodGhpcy5zdHJlYW0ucGFyc2VTdHJpbmdVVEYoZSxlK2kpLHQpO2Nhc2UgMTg6Y2FzZSAxOTpjYXNlIDIwOmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDI2OnJldHVybiBFKHRoaXMuc3RyZWFtLnBhcnNlU3RyaW5nSVNPKGUsZStpKSx0KTtjYXNlIDMwOnJldHVybiBFKHRoaXMuc3RyZWFtLnBhcnNlU3RyaW5nQk1QKGUsZStpKSx0KTtjYXNlIDIzOmNhc2UgMjQ6cmV0dXJuIHRoaXMuc3RyZWFtLnBhcnNlVGltZShlLGUraSwyMz09dGhpcy50YWcudGFnTnVtYmVyKX1yZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlTmFtZSgpKyJAIit0aGlzLnN0cmVhbS5wb3MrIltoZWFkZXI6Iit0aGlzLmhlYWRlcisiLGxlbmd0aDoiK3RoaXMubGVuZ3RoKyIsc3ViOiIrKG51bGw9PT10aGlzLnN1Yj8ibnVsbCI6dGhpcy5zdWIubGVuZ3RoKSsiXSJ9LHQucHJvdG90eXBlLnRvUHJldHR5U3RyaW5nPWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PSIiKTt2YXIgZT10K3RoaXMudHlwZU5hbWUoKSsiIEAiK3RoaXMuc3RyZWFtLnBvcztpZih0aGlzLmxlbmd0aD49MCYmKGUrPSIrIiksZSs9dGhpcy5sZW5ndGgsdGhpcy50YWcudGFnQ29uc3RydWN0ZWQ/ZSs9IiAoY29uc3RydWN0ZWQpIjohdGhpcy50YWcuaXNVbml2ZXJzYWwoKXx8MyE9dGhpcy50YWcudGFnTnVtYmVyJiY0IT10aGlzLnRhZy50YWdOdW1iZXJ8fG51bGw9PT10aGlzLnN1Ynx8KGUrPSIgKGVuY2Fwc3VsYXRlcykiKSxlKz0iXG4iLG51bGwhPT10aGlzLnN1Yil7dCs9IiAgIjtmb3IodmFyIGk9MCxyPXRoaXMuc3ViLmxlbmd0aDtpPHI7KytpKWUrPXRoaXMuc3ViW2ldLnRvUHJldHR5U3RyaW5nKHQpfXJldHVybiBlfSx0LnByb3RvdHlwZS5wb3NTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmVhbS5wb3N9LHQucHJvdG90eXBlLnBvc0NvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJlYW0ucG9zK3RoaXMuaGVhZGVyfSx0LnByb3RvdHlwZS5wb3NFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJlYW0ucG9zK3RoaXMuaGVhZGVyK01hdGguYWJzKHRoaXMubGVuZ3RoKX0sdC5wcm90b3R5cGUudG9IZXhTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJlYW0uaGV4RHVtcCh0aGlzLnBvc1N0YXJ0KCksdGhpcy5wb3NFbmQoKSwhMCl9LHQuZGVjb2RlTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0KCksaT0xMjcmZTtpZihpPT1lKXJldHVybiBpO2lmKGk+Nil0aHJvdyBuZXcgRXJyb3IoIkxlbmd0aCBvdmVyIDQ4IGJpdHMgbm90IHN1cHBvcnRlZCBhdCBwb3NpdGlvbiAiKyh0LnBvcy0xKSk7aWYoMD09PWkpcmV0dXJuIG51bGw7ZT0wO2Zvcih2YXIgcj0wO3I8aTsrK3IpZT0yNTYqZSt0LmdldCgpO3JldHVybiBlfSx0LnByb3RvdHlwZS5nZXRIZXhTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMudG9IZXhTdHJpbmcoKSxlPTIqdGhpcy5oZWFkZXIsaT0yKnRoaXMubGVuZ3RoO3JldHVybiB0LnN1YnN0cihlLGkpfSx0LmRlY29kZT1mdW5jdGlvbihlKXt2YXIgaTtpPWUgaW5zdGFuY2VvZiBEP2U6bmV3IEQoZSwwKTt2YXIgcj1uZXcgRChpKSxuPW5ldyBSKGkpLHM9dC5kZWNvZGVMZW5ndGgoaSksbz1pLnBvcyxoPW8tci5wb3MsYT1udWxsLHU9ZnVuY3Rpb24oKXt2YXIgZT1bXTtpZihudWxsIT09cyl7Zm9yKHZhciByPW8rcztpLnBvczxyOyllW2UubGVuZ3RoXT10LmRlY29kZShpKTtpZihpLnBvcyE9cil0aHJvdyBuZXcgRXJyb3IoIkNvbnRlbnQgc2l6ZSBpcyBub3QgY29ycmVjdCBmb3IgY29udGFpbmVyIHN0YXJ0aW5nIGF0IG9mZnNldCAiK28pfWVsc2UgdHJ5e2Zvcig7Oyl7dmFyIG49dC5kZWNvZGUoaSk7aWYobi50YWcuaXNFT0MoKSlicmVhaztlW2UubGVuZ3RoXT1ufXM9by1pLnBvc31jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoIkV4Y2VwdGlvbiB3aGlsZSBkZWNvZGluZyB1bmRlZmluZWQgbGVuZ3RoIGNvbnRlbnQ6ICIrdCl9cmV0dXJuIGV9O2lmKG4udGFnQ29uc3RydWN0ZWQpYT11KCk7ZWxzZSBpZihuLmlzVW5pdmVyc2FsKCkmJigzPT1uLnRhZ051bWJlcnx8ND09bi50YWdOdW1iZXIpKXRyeXtpZigzPT1uLnRhZ051bWJlciYmMCE9aS5nZXQoKSl0aHJvdyBuZXcgRXJyb3IoIkJJVCBTVFJJTkdzIHdpdGggdW51c2VkIGJpdHMgY2Fubm90IGVuY2Fwc3VsYXRlLiIpO2E9dSgpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7KytjKWlmKGFbY10udGFnLmlzRU9DKCkpdGhyb3cgbmV3IEVycm9yKCJFT0MgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGFjdHVhbCBjb250ZW50LiIpfWNhdGNoKHQpe2E9bnVsbH1pZihudWxsPT09YSl7aWYobnVsbD09PXMpdGhyb3cgbmV3IEVycm9yKCJXZSBjYW4ndCBza2lwIG92ZXIgYW4gaW52YWxpZCB0YWcgd2l0aCB1bmRlZmluZWQgbGVuZ3RoIGF0IG9mZnNldCAiK28pO2kucG9zPW8rTWF0aC5hYnMocyl9cmV0dXJuIG5ldyB0KHIsaCxzLG4sYSl9LHR9KCksUj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU9dC5nZXQoKTtpZih0aGlzLnRhZ0NsYXNzPWU+PjYsdGhpcy50YWdDb25zdHJ1Y3RlZD0wIT0oMzImZSksdGhpcy50YWdOdW1iZXI9MzEmZSwzMT09dGhpcy50YWdOdW1iZXIpe3ZhciBpPW5ldyB5O2Rve2U9dC5nZXQoKSxpLm11bEFkZCgxMjgsMTI3JmUpfXdoaWxlKDEyOCZlKTt0aGlzLnRhZ051bWJlcj1pLnNpbXBsaWZ5KCl9fXJldHVybiB0LnByb3RvdHlwZS5pc1VuaXZlcnNhbD1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy50YWdDbGFzc30sdC5wcm90b3R5cGUuaXNFT0M9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMudGFnQ2xhc3MmJjA9PT10aGlzLnRhZ051bWJlcn0sdH0oKSxCPVsyLDMsNSw3LDExLDEzLDE3LDE5LDIzLDI5LDMxLDM3LDQxLDQzLDQ3LDUzLDU5LDYxLDY3LDcxLDczLDc5LDgzLDg5LDk3LDEwMSwxMDMsMTA3LDEwOSwxMTMsMTI3LDEzMSwxMzcsMTM5LDE0OSwxNTEsMTU3LDE2MywxNjcsMTczLDE3OSwxODEsMTkxLDE5MywxOTcsMTk5LDIxMSwyMjMsMjI3LDIyOSwyMzMsMjM5LDI0MSwyNTEsMjU3LDI2MywyNjksMjcxLDI3NywyODEsMjgzLDI5MywzMDcsMzExLDMxMywzMTcsMzMxLDMzNywzNDcsMzQ5LDM1MywzNTksMzY3LDM3MywzNzksMzgzLDM4OSwzOTcsNDAxLDQwOSw0MTksNDIxLDQzMSw0MzMsNDM5LDQ0Myw0NDksNDU3LDQ2MSw0NjMsNDY3LDQ3OSw0ODcsNDkxLDQ5OSw1MDMsNTA5LDUyMSw1MjMsNTQxLDU0Nyw1NTcsNTYzLDU2OSw1NzEsNTc3LDU4Nyw1OTMsNTk5LDYwMSw2MDcsNjEzLDYxNyw2MTksNjMxLDY0MSw2NDMsNjQ3LDY1Myw2NTksNjYxLDY3Myw2NzcsNjgzLDY5MSw3MDEsNzA5LDcxOSw3MjcsNzMzLDczOSw3NDMsNzUxLDc1Nyw3NjEsNzY5LDc3Myw3ODcsNzk3LDgwOSw4MTEsODIxLDgyMyw4MjcsODI5LDgzOSw4NTMsODU3LDg1OSw4NjMsODc3LDg4MSw4ODMsODg3LDkwNyw5MTEsOTE5LDkyOSw5MzcsOTQxLDk0Nyw5NTMsOTY3LDk3MSw5NzcsOTgzLDk5MSw5OTddLE89KDE8PDI2KS9CW0IubGVuZ3RoLTFdLEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxpKXtudWxsIT10JiYoIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuZnJvbU51bWJlcih0LGUsaSk6bnVsbD09ZSYmInN0cmluZyIhPXR5cGVvZiB0P3RoaXMuZnJvbVN0cmluZyh0LDI1Nik6dGhpcy5mcm9tU3RyaW5nKHQsZSkpfXJldHVybiB0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0KXtpZih0aGlzLnM8MClyZXR1cm4iLSIrdGhpcy5uZWdhdGUoKS50b1N0cmluZyh0KTt2YXIgaTtpZigxNj09dClpPTQ7ZWxzZSBpZig4PT10KWk9MztlbHNlIGlmKDI9PXQpaT0xO2Vsc2UgaWYoMzI9PXQpaT01O2Vsc2V7aWYoNCE9dClyZXR1cm4gdGhpcy50b1JhZGl4KHQpO2k9Mn12YXIgcixuPSgxPDxpKS0xLHM9ITEsbz0iIixoPXRoaXMudCxhPXRoaXMuREItaCp0aGlzLkRCJWk7aWYoaC0tID4wKWZvcihhPHRoaXMuREImJihyPXRoaXNbaF0+PmEpPjAmJihzPSEwLG89ZShyKSk7aD49MDspYTxpPyhyPSh0aGlzW2hdJigxPDxhKS0xKTw8aS1hLHJ8PXRoaXNbLS1oXT4+KGErPXRoaXMuREItaSkpOihyPXRoaXNbaF0+PihhLT1pKSZuLGE8PTAmJihhKz10aGlzLkRCLC0taCkpLHI+MCYmKHM9ITApLHMmJihvKz1lKHIpKTtyZXR1cm4gcz9vOiIwIn0sdC5wcm90b3R5cGUubmVnYXRlPWZ1bmN0aW9uKCl7dmFyIGU9TSgpO3JldHVybiB0LlpFUk8uc3ViVG8odGhpcyxlKSxlfSx0LnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zPDA/dGhpcy5uZWdhdGUoKTp0aGlzfSx0LnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLXQucztpZigwIT1lKXJldHVybiBlO3ZhciBpPXRoaXMudDtpZigwIT0oZT1pLXQudCkpcmV0dXJuIHRoaXMuczwwPy1lOmU7Zm9yKDstLWk+PTA7KWlmKDAhPShlPXRoaXNbaV0tdFtpXSkpcmV0dXJuIGU7cmV0dXJuIDB9LHQucHJvdG90eXBlLmJpdExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnQ8PTA/MDp0aGlzLkRCKih0aGlzLnQtMSkrSyh0aGlzW3RoaXMudC0xXV50aGlzLnMmdGhpcy5ETSl9LHQucHJvdG90eXBlLm1vZD1mdW5jdGlvbihlKXt2YXIgaT1NKCk7cmV0dXJuIHRoaXMuYWJzKCkuZGl2UmVtVG8oZSxudWxsLGkpLHRoaXMuczwwJiZpLmNvbXBhcmVUbyh0LlpFUk8pPjAmJmUuc3ViVG8oaSxpKSxpfSx0LnByb3RvdHlwZS5tb2RQb3dJbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaTtyZXR1cm4gaT10PDI1Nnx8ZS5pc0V2ZW4oKT9uZXcgSShlKTpuZXcgTihlKSx0aGlzLmV4cCh0LGkpfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PU0oKTtyZXR1cm4gdGhpcy5jb3B5VG8odCksdH0sdC5wcm90b3R5cGUuaW50VmFsdWU9ZnVuY3Rpb24oKXtpZih0aGlzLnM8MCl7aWYoMT09dGhpcy50KXJldHVybiB0aGlzWzBdLXRoaXMuRFY7aWYoMD09dGhpcy50KXJldHVybi0xfWVsc2V7aWYoMT09dGhpcy50KXJldHVybiB0aGlzWzBdO2lmKDA9PXRoaXMudClyZXR1cm4gMH1yZXR1cm4odGhpc1sxXSYoMTw8MzItdGhpcy5EQiktMSk8PHRoaXMuREJ8dGhpc1swXX0sdC5wcm90b3R5cGUuYnl0ZVZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PXRoaXMudD90aGlzLnM6dGhpc1swXTw8MjQ+PjI0fSx0LnByb3RvdHlwZS5zaG9ydFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PXRoaXMudD90aGlzLnM6dGhpc1swXTw8MTY+PjE2fSx0LnByb3RvdHlwZS5zaWdudW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zPDA/LTE6dGhpcy50PD0wfHwxPT10aGlzLnQmJnRoaXNbMF08PTA/MDoxfSx0LnByb3RvdHlwZS50b0J5dGVBcnJheT1mdW5jdGlvbigpe3ZhciB0PXRoaXMudCxlPVtdO2VbMF09dGhpcy5zO3ZhciBpLHI9dGhpcy5EQi10KnRoaXMuREIlOCxuPTA7aWYodC0tID4wKWZvcihyPHRoaXMuREImJihpPXRoaXNbdF0+PnIpIT0odGhpcy5zJnRoaXMuRE0pPj5yJiYoZVtuKytdPWl8dGhpcy5zPDx0aGlzLkRCLXIpO3Q+PTA7KXI8OD8oaT0odGhpc1t0XSYoMTw8ciktMSk8PDgtcixpfD10aGlzWy0tdF0+PihyKz10aGlzLkRCLTgpKTooaT10aGlzW3RdPj4oci09OCkmMjU1LHI8PTAmJihyKz10aGlzLkRCLC0tdCkpLDAhPSgxMjgmaSkmJihpfD0tMjU2KSwwPT1uJiYoMTI4JnRoaXMucykhPSgxMjgmaSkmJisrbiwobj4wfHxpIT10aGlzLnMpJiYoZVtuKytdPWkpO3JldHVybiBlfSx0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXRoaXMuY29tcGFyZVRvKHQpfSx0LnByb3RvdHlwZS5taW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcGFyZVRvKHQpPDA/dGhpczp0fSx0LnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcGFyZVRvKHQpPjA/dGhpczp0fSx0LnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7dmFyIGU9TSgpO3JldHVybiB0aGlzLmJpdHdpc2VUbyh0LG4sZSksZX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24odCl7dmFyIGU9TSgpO3JldHVybiB0aGlzLmJpdHdpc2VUbyh0LHMsZSksZX0sdC5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3ZhciBlPU0oKTtyZXR1cm4gdGhpcy5iaXR3aXNlVG8odCxvLGUpLGV9LHQucHJvdG90eXBlLmFuZE5vdD1mdW5jdGlvbih0KXt2YXIgZT1NKCk7cmV0dXJuIHRoaXMuYml0d2lzZVRvKHQsaCxlKSxlfSx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9TSgpLGU9MDtlPHRoaXMudDsrK2UpdFtlXT10aGlzLkRNJn50aGlzW2VdO3JldHVybiB0LnQ9dGhpcy50LHQucz1+dGhpcy5zLHR9LHQucHJvdG90eXBlLnNoaWZ0TGVmdD1mdW5jdGlvbih0KXt2YXIgZT1NKCk7cmV0dXJuIHQ8MD90aGlzLnJTaGlmdFRvKC10LGUpOnRoaXMubFNoaWZ0VG8odCxlKSxlfSx0LnByb3RvdHlwZS5zaGlmdFJpZ2h0PWZ1bmN0aW9uKHQpe3ZhciBlPU0oKTtyZXR1cm4gdDwwP3RoaXMubFNoaWZ0VG8oLXQsZSk6dGhpcy5yU2hpZnRUbyh0LGUpLGV9LHQucHJvdG90eXBlLmdldExvd2VzdFNldEJpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy50OysrdClpZigwIT10aGlzW3RdKXJldHVybiB0KnRoaXMuREIrYSh0aGlzW3RdKTtyZXR1cm4gdGhpcy5zPDA/dGhpcy50KnRoaXMuREI6LTF9LHQucHJvdG90eXBlLmJpdENvdW50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLnMmdGhpcy5ETSxpPTA7aTx0aGlzLnQ7KytpKXQrPXUodGhpc1tpXV5lKTtyZXR1cm4gdH0sdC5wcm90b3R5cGUudGVzdEJpdD1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLmZsb29yKHQvdGhpcy5EQik7cmV0dXJuIGU+PXRoaXMudD8wIT10aGlzLnM6MCE9KHRoaXNbZV0mMTw8dCV0aGlzLkRCKX0sdC5wcm90b3R5cGUuc2V0Qml0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNoYW5nZUJpdCh0LHMpfSx0LnByb3RvdHlwZS5jbGVhckJpdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQodCxoKX0sdC5wcm90b3R5cGUuZmxpcEJpdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQodCxvKX0sdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3ZhciBlPU0oKTtyZXR1cm4gdGhpcy5hZGRUbyh0LGUpLGV9LHQucHJvdG90eXBlLnN1YnRyYWN0PWZ1bmN0aW9uKHQpe3ZhciBlPU0oKTtyZXR1cm4gdGhpcy5zdWJUbyh0LGUpLGV9LHQucHJvdG90eXBlLm11bHRpcGx5PWZ1bmN0aW9uKHQpe3ZhciBlPU0oKTtyZXR1cm4gdGhpcy5tdWx0aXBseVRvKHQsZSksZX0sdC5wcm90b3R5cGUuZGl2aWRlPWZ1bmN0aW9uKHQpe3ZhciBlPU0oKTtyZXR1cm4gdGhpcy5kaXZSZW1Ubyh0LGUsbnVsbCksZX0sdC5wcm90b3R5cGUucmVtYWluZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPU0oKTtyZXR1cm4gdGhpcy5kaXZSZW1Ubyh0LG51bGwsZSksZX0sdC5wcm90b3R5cGUuZGl2aWRlQW5kUmVtYWluZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPU0oKSxpPU0oKTtyZXR1cm4gdGhpcy5kaXZSZW1Ubyh0LGUsaSksW2UsaV19LHQucHJvdG90eXBlLm1vZFBvdz1mdW5jdGlvbih0LGUpe3ZhciBpLHIsbj10LmJpdExlbmd0aCgpLHM9VSgxKTtpZihuPD0wKXJldHVybiBzO2k9bjwxOD8xOm48NDg/MzpuPDE0ND80Om48NzY4PzU6NixyPW48OD9uZXcgSShlKTplLmlzRXZlbigpP25ldyBQKGUpOm5ldyBOKGUpO3ZhciBvPVtdLGg9MyxhPWktMSx1PSgxPDxpKS0xO2lmKG9bMV09ci5jb252ZXJ0KHRoaXMpLGk+MSl7dmFyIGM9TSgpO2ZvcihyLnNxclRvKG9bMV0sYyk7aDw9dTspb1toXT1NKCksci5tdWxUbyhjLG9baC0yXSxvW2hdKSxoKz0yfXZhciBmLGwscD10LnQtMSxnPSEwLGQ9TSgpO2ZvcihuPUsodFtwXSktMTtwPj0wOyl7Zm9yKG4+PWE/Zj10W3BdPj5uLWEmdTooZj0odFtwXSYoMTw8bisxKS0xKTw8YS1uLHA+MCYmKGZ8PXRbcC0xXT4+dGhpcy5EQituLWEpKSxoPWk7MD09KDEmZik7KWY+Pj0xLC0taDtpZigobi09aCk8MCYmKG4rPXRoaXMuREIsLS1wKSxnKW9bZl0uY29weVRvKHMpLGc9ITE7ZWxzZXtmb3IoO2g+MTspci5zcXJUbyhzLGQpLHIuc3FyVG8oZCxzKSxoLT0yO2g+MD9yLnNxclRvKHMsZCk6KGw9cyxzPWQsZD1sKSxyLm11bFRvKGQsb1tmXSxzKX1mb3IoO3A+PTAmJjA9PSh0W3BdJjE8PG4pOylyLnNxclRvKHMsZCksbD1zLHM9ZCxkPWwsLS1uPDAmJihuPXRoaXMuREItMSwtLXApfXJldHVybiByLnJldmVydChzKX0sdC5wcm90b3R5cGUubW9kSW52ZXJzZT1mdW5jdGlvbihlKXt2YXIgaT1lLmlzRXZlbigpO2lmKHRoaXMuaXNFdmVuKCkmJml8fDA9PWUuc2lnbnVtKCkpcmV0dXJuIHQuWkVSTztmb3IodmFyIHI9ZS5jbG9uZSgpLG49dGhpcy5jbG9uZSgpLHM9VSgxKSxvPVUoMCksaD1VKDApLGE9VSgxKTswIT1yLnNpZ251bSgpOyl7Zm9yKDtyLmlzRXZlbigpOylyLnJTaGlmdFRvKDEsciksaT8ocy5pc0V2ZW4oKSYmby5pc0V2ZW4oKXx8KHMuYWRkVG8odGhpcyxzKSxvLnN1YlRvKGUsbykpLHMuclNoaWZ0VG8oMSxzKSk6by5pc0V2ZW4oKXx8by5zdWJUbyhlLG8pLG8uclNoaWZ0VG8oMSxvKTtmb3IoO24uaXNFdmVuKCk7KW4uclNoaWZ0VG8oMSxuKSxpPyhoLmlzRXZlbigpJiZhLmlzRXZlbigpfHwoaC5hZGRUbyh0aGlzLGgpLGEuc3ViVG8oZSxhKSksaC5yU2hpZnRUbygxLGgpKTphLmlzRXZlbigpfHxhLnN1YlRvKGUsYSksYS5yU2hpZnRUbygxLGEpO3IuY29tcGFyZVRvKG4pPj0wPyhyLnN1YlRvKG4sciksaSYmcy5zdWJUbyhoLHMpLG8uc3ViVG8oYSxvKSk6KG4uc3ViVG8ocixuKSxpJiZoLnN1YlRvKHMsaCksYS5zdWJUbyhvLGEpKX1yZXR1cm4gMCE9bi5jb21wYXJlVG8odC5PTkUpP3QuWkVSTzphLmNvbXBhcmVUbyhlKT49MD9hLnN1YnRyYWN0KGUpOmEuc2lnbnVtKCk8MD8oYS5hZGRUbyhlLGEpLGEuc2lnbnVtKCk8MD9hLmFkZChlKTphKTphfSx0LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZXhwKHQsbmV3IFYpfSx0LnByb3RvdHlwZS5nY2Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zPDA/dGhpcy5uZWdhdGUoKTp0aGlzLmNsb25lKCksaT10LnM8MD90Lm5lZ2F0ZSgpOnQuY2xvbmUoKTtpZihlLmNvbXBhcmVUbyhpKTwwKXt2YXIgcj1lO2U9aSxpPXJ9dmFyIG49ZS5nZXRMb3dlc3RTZXRCaXQoKSxzPWkuZ2V0TG93ZXN0U2V0Qml0KCk7aWYoczwwKXJldHVybiBlO2ZvcihuPHMmJihzPW4pLHM+MCYmKGUuclNoaWZ0VG8ocyxlKSxpLnJTaGlmdFRvKHMsaSkpO2Uuc2lnbnVtKCk+MDspKG49ZS5nZXRMb3dlc3RTZXRCaXQoKSk+MCYmZS5yU2hpZnRUbyhuLGUpLChuPWkuZ2V0TG93ZXN0U2V0Qml0KCkpPjAmJmkuclNoaWZ0VG8obixpKSxlLmNvbXBhcmVUbyhpKT49MD8oZS5zdWJUbyhpLGUpLGUuclNoaWZ0VG8oMSxlKSk6KGkuc3ViVG8oZSxpKSxpLnJTaGlmdFRvKDEsaSkpO3JldHVybiBzPjAmJmkubFNoaWZ0VG8ocyxpKSxpfSx0LnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWU9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLmFicygpO2lmKDE9PWkudCYmaVswXTw9QltCLmxlbmd0aC0xXSl7Zm9yKGU9MDtlPEIubGVuZ3RoOysrZSlpZihpWzBdPT1CW2VdKXJldHVybiEwO3JldHVybiExfWlmKGkuaXNFdmVuKCkpcmV0dXJuITE7Zm9yKGU9MTtlPEIubGVuZ3RoOyl7Zm9yKHZhciByPUJbZV0sbj1lKzE7bjxCLmxlbmd0aCYmcjxPOylyKj1CW24rK107Zm9yKHI9aS5tb2RJbnQocik7ZTxuOylpZihyJUJbZSsrXT09MClyZXR1cm4hMX1yZXR1cm4gaS5taWxsZXJSYWJpbih0KX0sdC5wcm90b3R5cGUuY29weVRvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnQtMTtlPj0wOy0tZSl0W2VdPXRoaXNbZV07dC50PXRoaXMudCx0LnM9dGhpcy5zfSx0LnByb3RvdHlwZS5mcm9tSW50PWZ1bmN0aW9uKHQpe3RoaXMudD0xLHRoaXMucz10PDA/LTE6MCx0PjA/dGhpc1swXT10OnQ8LTE/dGhpc1swXT10K3RoaXMuRFY6dGhpcy50PTB9LHQucHJvdG90eXBlLmZyb21TdHJpbmc9ZnVuY3Rpb24oZSxpKXt2YXIgcjtpZigxNj09aSlyPTQ7ZWxzZSBpZig4PT1pKXI9MztlbHNlIGlmKDI1Nj09aSlyPTg7ZWxzZSBpZigyPT1pKXI9MTtlbHNlIGlmKDMyPT1pKXI9NTtlbHNle2lmKDQhPWkpcmV0dXJuIHZvaWQgdGhpcy5mcm9tUmFkaXgoZSxpKTtyPTJ9dGhpcy50PTAsdGhpcy5zPTA7Zm9yKHZhciBuPWUubGVuZ3RoLHM9ITEsbz0wOy0tbj49MDspe3ZhciBoPTg9PXI/MjU1JitlW25dOkYoZSxuKTtoPDA/Ii0iPT1lLmNoYXJBdChuKSYmKHM9ITApOihzPSExLDA9PW8/dGhpc1t0aGlzLnQrK109aDpvK3I+dGhpcy5EQj8odGhpc1t0aGlzLnQtMV18PShoJigxPDx0aGlzLkRCLW8pLTEpPDxvLHRoaXNbdGhpcy50KytdPWg+PnRoaXMuREItbyk6dGhpc1t0aGlzLnQtMV18PWg8PG8sKG8rPXIpPj10aGlzLkRCJiYoby09dGhpcy5EQikpfTg9PXImJjAhPSgxMjgmK2VbMF0pJiYodGhpcy5zPS0xLG8+MCYmKHRoaXNbdGhpcy50LTFdfD0oMTw8dGhpcy5EQi1vKS0xPDxvKSksdGhpcy5jbGFtcCgpLHMmJnQuWkVSTy5zdWJUbyh0aGlzLHRoaXMpfSx0LnByb3RvdHlwZS5jbGFtcD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnMmdGhpcy5ETTt0aGlzLnQ+MCYmdGhpc1t0aGlzLnQtMV09PXQ7KS0tdGhpcy50fSx0LnByb3RvdHlwZS5kbFNoaWZ0VG89ZnVuY3Rpb24odCxlKXt2YXIgaTtmb3IoaT10aGlzLnQtMTtpPj0wOy0taSllW2krdF09dGhpc1tpXTtmb3IoaT10LTE7aT49MDstLWkpZVtpXT0wO2UudD10aGlzLnQrdCxlLnM9dGhpcy5zfSx0LnByb3RvdHlwZS5kclNoaWZ0VG89ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dDtpPHRoaXMudDsrK2kpZVtpLXRdPXRoaXNbaV07ZS50PU1hdGgubWF4KHRoaXMudC10LDApLGUucz10aGlzLnN9LHQucHJvdG90eXBlLmxTaGlmdFRvPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQldGhpcy5EQixyPXRoaXMuREItaSxuPSgxPDxyKS0xLHM9TWF0aC5mbG9vcih0L3RoaXMuREIpLG89dGhpcy5zPDxpJnRoaXMuRE0saD10aGlzLnQtMTtoPj0wOy0taCllW2grcysxXT10aGlzW2hdPj5yfG8sbz0odGhpc1toXSZuKTw8aTtmb3IoaD1zLTE7aD49MDstLWgpZVtoXT0wO2Vbc109byxlLnQ9dGhpcy50K3MrMSxlLnM9dGhpcy5zLGUuY2xhbXAoKX0sdC5wcm90b3R5cGUuclNoaWZ0VG89ZnVuY3Rpb24odCxlKXtlLnM9dGhpcy5zO3ZhciBpPU1hdGguZmxvb3IodC90aGlzLkRCKTtpZihpPj10aGlzLnQpZS50PTA7ZWxzZXt2YXIgcj10JXRoaXMuREIsbj10aGlzLkRCLXIscz0oMTw8ciktMTtlWzBdPXRoaXNbaV0+PnI7Zm9yKHZhciBvPWkrMTtvPHRoaXMudDsrK28pZVtvLWktMV18PSh0aGlzW29dJnMpPDxuLGVbby1pXT10aGlzW29dPj5yO3I+MCYmKGVbdGhpcy50LWktMV18PSh0aGlzLnMmcyk8PG4pLGUudD10aGlzLnQtaSxlLmNsYW1wKCl9fSx0LnByb3RvdHlwZS5zdWJUbz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wLHI9MCxuPU1hdGgubWluKHQudCx0aGlzLnQpO2k8bjspcis9dGhpc1tpXS10W2ldLGVbaSsrXT1yJnRoaXMuRE0scj4+PXRoaXMuREI7aWYodC50PHRoaXMudCl7Zm9yKHItPXQucztpPHRoaXMudDspcis9dGhpc1tpXSxlW2krK109ciZ0aGlzLkRNLHI+Pj10aGlzLkRCO3IrPXRoaXMuc31lbHNle2ZvcihyKz10aGlzLnM7aTx0LnQ7KXItPXRbaV0sZVtpKytdPXImdGhpcy5ETSxyPj49dGhpcy5EQjtyLT10LnN9ZS5zPXI8MD8tMTowLHI8LTE/ZVtpKytdPXRoaXMuRFYrcjpyPjAmJihlW2krK109ciksZS50PWksZS5jbGFtcCgpfSx0LnByb3RvdHlwZS5tdWx0aXBseVRvPWZ1bmN0aW9uKGUsaSl7dmFyIHI9dGhpcy5hYnMoKSxuPWUuYWJzKCkscz1yLnQ7Zm9yKGkudD1zK24udDstLXM+PTA7KWlbc109MDtmb3Iocz0wO3M8bi50OysrcylpW3Mrci50XT1yLmFtKDAsbltzXSxpLHMsMCxyLnQpO2kucz0wLGkuY2xhbXAoKSx0aGlzLnMhPWUucyYmdC5aRVJPLnN1YlRvKGksaSl9LHQucHJvdG90eXBlLnNxdWFyZVRvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmFicygpLGk9dC50PTIqZS50Oy0taT49MDspdFtpXT0wO2ZvcihpPTA7aTxlLnQtMTsrK2kpe3ZhciByPWUuYW0oaSxlW2ldLHQsMippLDAsMSk7KHRbaStlLnRdKz1lLmFtKGkrMSwyKmVbaV0sdCwyKmkrMSxyLGUudC1pLTEpKT49ZS5EViYmKHRbaStlLnRdLT1lLkRWLHRbaStlLnQrMV09MSl9dC50PjAmJih0W3QudC0xXSs9ZS5hbShpLGVbaV0sdCwyKmksMCwxKSksdC5zPTAsdC5jbGFtcCgpfSx0LnByb3RvdHlwZS5kaXZSZW1Ubz1mdW5jdGlvbihlLGkscil7dmFyIG49ZS5hYnMoKTtpZighKG4udDw9MCkpe3ZhciBzPXRoaXMuYWJzKCk7aWYocy50PG4udClyZXR1cm4gbnVsbCE9aSYmaS5mcm9tSW50KDApLHZvaWQobnVsbCE9ciYmdGhpcy5jb3B5VG8ocikpO251bGw9PXImJihyPU0oKSk7dmFyIG89TSgpLGg9dGhpcy5zLGE9ZS5zLHU9dGhpcy5EQi1LKG5bbi50LTFdKTt1PjA/KG4ubFNoaWZ0VG8odSxvKSxzLmxTaGlmdFRvKHUscikpOihuLmNvcHlUbyhvKSxzLmNvcHlUbyhyKSk7dmFyIGM9by50LGY9b1tjLTFdO2lmKDAhPWYpe3ZhciBsPWYqKDE8PHRoaXMuRjEpKyhjPjE/b1tjLTJdPj50aGlzLkYyOjApLHA9dGhpcy5GVi9sLGc9KDE8PHRoaXMuRjEpL2wsZD0xPDx0aGlzLkYyLHY9ci50LG09di1jLHk9bnVsbD09aT9NKCk6aTtmb3Ioby5kbFNoaWZ0VG8obSx5KSxyLmNvbXBhcmVUbyh5KT49MCYmKHJbci50KytdPTEsci5zdWJUbyh5LHIpKSx0Lk9ORS5kbFNoaWZ0VG8oYyx5KSx5LnN1YlRvKG8sbyk7by50PGM7KW9bby50KytdPTA7Zm9yKDstLW0+PTA7KXt2YXIgYj1yWy0tdl09PWY/dGhpcy5ETTpNYXRoLmZsb29yKHJbdl0qcCsoclt2LTFdK2QpKmcpO2lmKChyW3ZdKz1vLmFtKDAsYixyLG0sMCxjKSk8Yilmb3Ioby5kbFNoaWZ0VG8obSx5KSxyLnN1YlRvKHkscik7clt2XTwtLWI7KXIuc3ViVG8oeSxyKX1udWxsIT1pJiYoci5kclNoaWZ0VG8oYyxpKSxoIT1hJiZ0LlpFUk8uc3ViVG8oaSxpKSksci50PWMsci5jbGFtcCgpLHU+MCYmci5yU2hpZnRUbyh1LHIpLGg8MCYmdC5aRVJPLnN1YlRvKHIscil9fX0sdC5wcm90b3R5cGUuaW52RGlnaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLnQ8MSlyZXR1cm4gMDt2YXIgdD10aGlzWzBdO2lmKDA9PSgxJnQpKXJldHVybiAwO3ZhciBlPTMmdDtyZXR1cm4oZT0oZT0oZT0oZT1lKigyLSgxNSZ0KSplKSYxNSkqKDItKDI1NSZ0KSplKSYyNTUpKigyLSgoNjU1MzUmdCkqZSY2NTUzNSkpJjY1NTM1KSooMi10KmUldGhpcy5EVikldGhpcy5EVik+MD90aGlzLkRWLWU6LWV9LHQucHJvdG90eXBlLmlzRXZlbj1mdW5jdGlvbigpe3JldHVybiAwPT0odGhpcy50PjA/MSZ0aGlzWzBdOnRoaXMucyl9LHQucHJvdG90eXBlLmV4cD1mdW5jdGlvbihlLGkpe2lmKGU+NDI5NDk2NzI5NXx8ZTwxKXJldHVybiB0Lk9ORTt2YXIgcj1NKCksbj1NKCkscz1pLmNvbnZlcnQodGhpcyksbz1LKGUpLTE7Zm9yKHMuY29weVRvKHIpOy0tbz49MDspaWYoaS5zcXJUbyhyLG4pLChlJjE8PG8pPjApaS5tdWxUbyhuLHMscik7ZWxzZXt2YXIgaD1yO3I9bixuPWh9cmV0dXJuIGkucmV2ZXJ0KHIpfSx0LnByb3RvdHlwZS5jaHVua1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5MTjIqdGhpcy5EQi9NYXRoLmxvZyh0KSl9LHQucHJvdG90eXBlLnRvUmFkaXg9ZnVuY3Rpb24odCl7aWYobnVsbD09dCYmKHQ9MTApLDA9PXRoaXMuc2lnbnVtKCl8fHQ8Mnx8dD4zNilyZXR1cm4iMCI7dmFyIGU9dGhpcy5jaHVua1NpemUodCksaT1NYXRoLnBvdyh0LGUpLHI9VShpKSxuPU0oKSxzPU0oKSxvPSIiO2Zvcih0aGlzLmRpdlJlbVRvKHIsbixzKTtuLnNpZ251bSgpPjA7KW89KGkrcy5pbnRWYWx1ZSgpKS50b1N0cmluZyh0KS5zdWJzdHIoMSkrbyxuLmRpdlJlbVRvKHIsbixzKTtyZXR1cm4gcy5pbnRWYWx1ZSgpLnRvU3RyaW5nKHQpK299LHQucHJvdG90eXBlLmZyb21SYWRpeD1mdW5jdGlvbihlLGkpe3RoaXMuZnJvbUludCgwKSxudWxsPT1pJiYoaT0xMCk7Zm9yKHZhciByPXRoaXMuY2h1bmtTaXplKGkpLG49TWF0aC5wb3coaSxyKSxzPSExLG89MCxoPTAsYT0wO2E8ZS5sZW5ndGg7KythKXt2YXIgdT1GKGUsYSk7dTwwPyItIj09ZS5jaGFyQXQoYSkmJjA9PXRoaXMuc2lnbnVtKCkmJihzPSEwKTooaD1pKmgrdSwrK28+PXImJih0aGlzLmRNdWx0aXBseShuKSx0aGlzLmRBZGRPZmZzZXQoaCwwKSxvPTAsaD0wKSl9bz4wJiYodGhpcy5kTXVsdGlwbHkoTWF0aC5wb3coaSxvKSksdGhpcy5kQWRkT2Zmc2V0KGgsMCkpLHMmJnQuWkVSTy5zdWJUbyh0aGlzLHRoaXMpfSx0LnByb3RvdHlwZS5mcm9tTnVtYmVyPWZ1bmN0aW9uKGUsaSxyKXtpZigibnVtYmVyIj09dHlwZW9mIGkpaWYoZTwyKXRoaXMuZnJvbUludCgxKTtlbHNlIGZvcih0aGlzLmZyb21OdW1iZXIoZSxyKSx0aGlzLnRlc3RCaXQoZS0xKXx8dGhpcy5iaXR3aXNlVG8odC5PTkUuc2hpZnRMZWZ0KGUtMSkscyx0aGlzKSx0aGlzLmlzRXZlbigpJiZ0aGlzLmRBZGRPZmZzZXQoMSwwKTshdGhpcy5pc1Byb2JhYmxlUHJpbWUoaSk7KXRoaXMuZEFkZE9mZnNldCgyLDApLHRoaXMuYml0TGVuZ3RoKCk+ZSYmdGhpcy5zdWJUbyh0Lk9ORS5zaGlmdExlZnQoZS0xKSx0aGlzKTtlbHNle3ZhciBuPVtdLG89NyZlO24ubGVuZ3RoPTErKGU+PjMpLGkubmV4dEJ5dGVzKG4pLG8+MD9uWzBdJj0oMTw8byktMTpuWzBdPTAsdGhpcy5mcm9tU3RyaW5nKG4sMjU2KX19LHQucHJvdG90eXBlLmJpdHdpc2VUbz1mdW5jdGlvbih0LGUsaSl7dmFyIHIsbixzPU1hdGgubWluKHQudCx0aGlzLnQpO2ZvcihyPTA7cjxzOysrcilpW3JdPWUodGhpc1tyXSx0W3JdKTtpZih0LnQ8dGhpcy50KXtmb3Iobj10LnMmdGhpcy5ETSxyPXM7cjx0aGlzLnQ7KytyKWlbcl09ZSh0aGlzW3JdLG4pO2kudD10aGlzLnR9ZWxzZXtmb3Iobj10aGlzLnMmdGhpcy5ETSxyPXM7cjx0LnQ7KytyKWlbcl09ZShuLHRbcl0pO2kudD10LnR9aS5zPWUodGhpcy5zLHQucyksaS5jbGFtcCgpfSx0LnByb3RvdHlwZS5jaGFuZ2VCaXQ9ZnVuY3Rpb24oZSxpKXt2YXIgcj10Lk9ORS5zaGlmdExlZnQoZSk7cmV0dXJuIHRoaXMuYml0d2lzZVRvKHIsaSxyKSxyfSx0LnByb3RvdHlwZS5hZGRUbz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wLHI9MCxuPU1hdGgubWluKHQudCx0aGlzLnQpO2k8bjspcis9dGhpc1tpXSt0W2ldLGVbaSsrXT1yJnRoaXMuRE0scj4+PXRoaXMuREI7aWYodC50PHRoaXMudCl7Zm9yKHIrPXQucztpPHRoaXMudDspcis9dGhpc1tpXSxlW2krK109ciZ0aGlzLkRNLHI+Pj10aGlzLkRCO3IrPXRoaXMuc31lbHNle2ZvcihyKz10aGlzLnM7aTx0LnQ7KXIrPXRbaV0sZVtpKytdPXImdGhpcy5ETSxyPj49dGhpcy5EQjtyKz10LnN9ZS5zPXI8MD8tMTowLHI+MD9lW2krK109cjpyPC0xJiYoZVtpKytdPXRoaXMuRFYrciksZS50PWksZS5jbGFtcCgpfSx0LnByb3RvdHlwZS5kTXVsdGlwbHk9ZnVuY3Rpb24odCl7dGhpc1t0aGlzLnRdPXRoaXMuYW0oMCx0LTEsdGhpcywwLDAsdGhpcy50KSwrK3RoaXMudCx0aGlzLmNsYW1wKCl9LHQucHJvdG90eXBlLmRBZGRPZmZzZXQ9ZnVuY3Rpb24odCxlKXtpZigwIT10KXtmb3IoO3RoaXMudDw9ZTspdGhpc1t0aGlzLnQrK109MDtmb3IodGhpc1tlXSs9dDt0aGlzW2VdPj10aGlzLkRWOyl0aGlzW2VdLT10aGlzLkRWLCsrZT49dGhpcy50JiYodGhpc1t0aGlzLnQrK109MCksKyt0aGlzW2VdfX0sdC5wcm90b3R5cGUubXVsdGlwbHlMb3dlclRvPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1NYXRoLm1pbih0aGlzLnQrdC50LGUpO2ZvcihpLnM9MCxpLnQ9cjtyPjA7KWlbLS1yXT0wO2Zvcih2YXIgbj1pLnQtdGhpcy50O3I8bjsrK3IpaVtyK3RoaXMudF09dGhpcy5hbSgwLHRbcl0saSxyLDAsdGhpcy50KTtmb3Iobj1NYXRoLm1pbih0LnQsZSk7cjxuOysrcil0aGlzLmFtKDAsdFtyXSxpLHIsMCxlLXIpO2kuY2xhbXAoKX0sdC5wcm90b3R5cGUubXVsdGlwbHlVcHBlclRvPWZ1bmN0aW9uKHQsZSxpKXstLWU7dmFyIHI9aS50PXRoaXMudCt0LnQtZTtmb3IoaS5zPTA7LS1yPj0wOylpW3JdPTA7Zm9yKHI9TWF0aC5tYXgoZS10aGlzLnQsMCk7cjx0LnQ7KytyKWlbdGhpcy50K3ItZV09dGhpcy5hbShlLXIsdFtyXSxpLDAsMCx0aGlzLnQrci1lKTtpLmNsYW1wKCksaS5kclNoaWZ0VG8oMSxpKX0sdC5wcm90b3R5cGUubW9kSW50PWZ1bmN0aW9uKHQpe2lmKHQ8PTApcmV0dXJuIDA7dmFyIGU9dGhpcy5EViV0LGk9dGhpcy5zPDA/dC0xOjA7aWYodGhpcy50PjApaWYoMD09ZSlpPXRoaXNbMF0ldDtlbHNlIGZvcih2YXIgcj10aGlzLnQtMTtyPj0wOy0tcilpPShlKmkrdGhpc1tyXSkldDtyZXR1cm4gaX0sdC5wcm90b3R5cGUubWlsbGVyUmFiaW49ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5zdWJ0cmFjdCh0Lk9ORSkscj1pLmdldExvd2VzdFNldEJpdCgpO2lmKHI8PTApcmV0dXJuITE7dmFyIG49aS5zaGlmdFJpZ2h0KHIpOyhlPWUrMT4+MSk+Qi5sZW5ndGgmJihlPUIubGVuZ3RoKTtmb3IodmFyIHM9TSgpLG89MDtvPGU7KytvKXtzLmZyb21JbnQoQltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqQi5sZW5ndGgpXSk7dmFyIGg9cy5tb2RQb3cobix0aGlzKTtpZigwIT1oLmNvbXBhcmVUbyh0Lk9ORSkmJjAhPWguY29tcGFyZVRvKGkpKXtmb3IodmFyIGE9MTthKys8ciYmMCE9aC5jb21wYXJlVG8oaSk7KWlmKDA9PShoPWgubW9kUG93SW50KDIsdGhpcykpLmNvbXBhcmVUbyh0Lk9ORSkpcmV0dXJuITE7aWYoMCE9aC5jb21wYXJlVG8oaSkpcmV0dXJuITF9fXJldHVybiEwfSx0LnByb3RvdHlwZS5zcXVhcmU9ZnVuY3Rpb24oKXt2YXIgdD1NKCk7cmV0dXJuIHRoaXMuc3F1YXJlVG8odCksdH0sdC5wcm90b3R5cGUuZ2NkYT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuczwwP3RoaXMubmVnYXRlKCk6dGhpcy5jbG9uZSgpLHI9dC5zPDA/dC5uZWdhdGUoKTp0LmNsb25lKCk7aWYoaS5jb21wYXJlVG8ocik8MCl7dmFyIG49aTtpPXIscj1ufXZhciBzPWkuZ2V0TG93ZXN0U2V0Qml0KCksbz1yLmdldExvd2VzdFNldEJpdCgpO2lmKG88MCllKGkpO2Vsc2V7czxvJiYobz1zKSxvPjAmJihpLnJTaGlmdFRvKG8saSksci5yU2hpZnRUbyhvLHIpKTt2YXIgaD1mdW5jdGlvbigpeyhzPWkuZ2V0TG93ZXN0U2V0Qml0KCkpPjAmJmkuclNoaWZ0VG8ocyxpKSwocz1yLmdldExvd2VzdFNldEJpdCgpKT4wJiZyLnJTaGlmdFRvKHMsciksaS5jb21wYXJlVG8ocik+PTA/KGkuc3ViVG8ocixpKSxpLnJTaGlmdFRvKDEsaSkpOihyLnN1YlRvKGksciksci5yU2hpZnRUbygxLHIpKSxpLnNpZ251bSgpPjA/c2V0VGltZW91dChoLDApOihvPjAmJnIubFNoaWZ0VG8obyxyKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uocil9KSwwKSl9O3NldFRpbWVvdXQoaCwxMCl9fSx0LnByb3RvdHlwZS5mcm9tTnVtYmVyQXN5bmM9ZnVuY3Rpb24oZSxpLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBpKWlmKGU8Mil0aGlzLmZyb21JbnQoMSk7ZWxzZXt0aGlzLmZyb21OdW1iZXIoZSxyKSx0aGlzLnRlc3RCaXQoZS0xKXx8dGhpcy5iaXR3aXNlVG8odC5PTkUuc2hpZnRMZWZ0KGUtMSkscyx0aGlzKSx0aGlzLmlzRXZlbigpJiZ0aGlzLmRBZGRPZmZzZXQoMSwwKTt2YXIgbz10aGlzLGg9ZnVuY3Rpb24oKXtvLmRBZGRPZmZzZXQoMiwwKSxvLmJpdExlbmd0aCgpPmUmJm8uc3ViVG8odC5PTkUuc2hpZnRMZWZ0KGUtMSksbyksby5pc1Byb2JhYmxlUHJpbWUoaSk/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtuKCl9KSwwKTpzZXRUaW1lb3V0KGgsMCl9O3NldFRpbWVvdXQoaCwwKX1lbHNle3ZhciBhPVtdLHU9NyZlO2EubGVuZ3RoPTErKGU+PjMpLGkubmV4dEJ5dGVzKGEpLHU+MD9hWzBdJj0oMTw8dSktMTphWzBdPTAsdGhpcy5mcm9tU3RyaW5nKGEsMjU2KX19LHR9KCksVj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHQucHJvdG90eXBlLnJldmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5wcm90b3R5cGUubXVsVG89ZnVuY3Rpb24odCxlLGkpe3QubXVsdGlwbHlUbyhlLGkpfSx0LnByb3RvdHlwZS5zcXJUbz1mdW5jdGlvbih0LGUpe3Quc3F1YXJlVG8oZSl9LHR9KCksST1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5tPXR9cmV0dXJuIHQucHJvdG90eXBlLmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuczwwfHx0LmNvbXBhcmVUbyh0aGlzLm0pPj0wP3QubW9kKHRoaXMubSk6dH0sdC5wcm90b3R5cGUucmV2ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0fSx0LnByb3RvdHlwZS5yZWR1Y2U9ZnVuY3Rpb24odCl7dC5kaXZSZW1Ubyh0aGlzLm0sbnVsbCx0KX0sdC5wcm90b3R5cGUubXVsVG89ZnVuY3Rpb24odCxlLGkpe3QubXVsdGlwbHlUbyhlLGkpLHRoaXMucmVkdWNlKGkpfSx0LnByb3RvdHlwZS5zcXJUbz1mdW5jdGlvbih0LGUpe3Quc3F1YXJlVG8oZSksdGhpcy5yZWR1Y2UoZSl9LHR9KCksTj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5tPXQsdGhpcy5tcD10LmludkRpZ2l0KCksdGhpcy5tcGw9MzI3NjcmdGhpcy5tcCx0aGlzLm1waD10aGlzLm1wPj4xNSx0aGlzLnVtPSgxPDx0LkRCLTE1KS0xLHRoaXMubXQyPTIqdC50fXJldHVybiB0LnByb3RvdHlwZS5jb252ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlPU0oKTtyZXR1cm4gdC5hYnMoKS5kbFNoaWZ0VG8odGhpcy5tLnQsZSksZS5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxlKSx0LnM8MCYmZS5jb21wYXJlVG8oQS5aRVJPKT4wJiZ0aGlzLm0uc3ViVG8oZSxlKSxlfSx0LnByb3RvdHlwZS5yZXZlcnQ9ZnVuY3Rpb24odCl7dmFyIGU9TSgpO3JldHVybiB0LmNvcHlUbyhlKSx0aGlzLnJlZHVjZShlKSxlfSx0LnByb3RvdHlwZS5yZWR1Y2U9ZnVuY3Rpb24odCl7Zm9yKDt0LnQ8PXRoaXMubXQyOyl0W3QudCsrXT0wO2Zvcih2YXIgZT0wO2U8dGhpcy5tLnQ7KytlKXt2YXIgaT0zMjc2NyZ0W2VdLHI9aSp0aGlzLm1wbCsoKGkqdGhpcy5tcGgrKHRbZV0+PjE1KSp0aGlzLm1wbCZ0aGlzLnVtKTw8MTUpJnQuRE07Zm9yKHRbaT1lK3RoaXMubS50XSs9dGhpcy5tLmFtKDAscix0LGUsMCx0aGlzLm0udCk7dFtpXT49dC5EVjspdFtpXS09dC5EVix0WysraV0rK310LmNsYW1wKCksdC5kclNoaWZ0VG8odGhpcy5tLnQsdCksdC5jb21wYXJlVG8odGhpcy5tKT49MCYmdC5zdWJUbyh0aGlzLm0sdCl9LHQucHJvdG90eXBlLm11bFRvPWZ1bmN0aW9uKHQsZSxpKXt0Lm11bHRpcGx5VG8oZSxpKSx0aGlzLnJlZHVjZShpKX0sdC5wcm90b3R5cGUuc3FyVG89ZnVuY3Rpb24odCxlKXt0LnNxdWFyZVRvKGUpLHRoaXMucmVkdWNlKGUpfSx0fSgpLFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMubT10LHRoaXMucjI9TSgpLHRoaXMucTM9TSgpLEEuT05FLmRsU2hpZnRUbygyKnQudCx0aGlzLnIyKSx0aGlzLm11PXRoaXMucjIuZGl2aWRlKHQpfXJldHVybiB0LnByb3RvdHlwZS5jb252ZXJ0PWZ1bmN0aW9uKHQpe2lmKHQuczwwfHx0LnQ+Mip0aGlzLm0udClyZXR1cm4gdC5tb2QodGhpcy5tKTtpZih0LmNvbXBhcmVUbyh0aGlzLm0pPDApcmV0dXJuIHQ7dmFyIGU9TSgpO3JldHVybiB0LmNvcHlUbyhlKSx0aGlzLnJlZHVjZShlKSxlfSx0LnByb3RvdHlwZS5yZXZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHQucHJvdG90eXBlLnJlZHVjZT1mdW5jdGlvbih0KXtmb3IodC5kclNoaWZ0VG8odGhpcy5tLnQtMSx0aGlzLnIyKSx0LnQ+dGhpcy5tLnQrMSYmKHQudD10aGlzLm0udCsxLHQuY2xhbXAoKSksdGhpcy5tdS5tdWx0aXBseVVwcGVyVG8odGhpcy5yMix0aGlzLm0udCsxLHRoaXMucTMpLHRoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO3QuY29tcGFyZVRvKHRoaXMucjIpPDA7KXQuZEFkZE9mZnNldCgxLHRoaXMubS50KzEpO2Zvcih0LnN1YlRvKHRoaXMucjIsdCk7dC5jb21wYXJlVG8odGhpcy5tKT49MDspdC5zdWJUbyh0aGlzLm0sdCl9LHQucHJvdG90eXBlLm11bFRvPWZ1bmN0aW9uKHQsZSxpKXt0Lm11bHRpcGx5VG8oZSxpKSx0aGlzLnJlZHVjZShpKX0sdC5wcm90b3R5cGUuc3FyVG89ZnVuY3Rpb24odCxlKXt0LnNxdWFyZVRvKGUpLHRoaXMucmVkdWNlKGUpfSx0fSgpO2Z1bmN0aW9uIE0oKXtyZXR1cm4gbmV3IEEobnVsbCl9ZnVuY3Rpb24gTCh0LGUpe3JldHVybiBuZXcgQSh0LGUpfXZhciBqPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yO2omJiJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiPT1uYXZpZ2F0b3IuYXBwTmFtZT8oQS5wcm90b3R5cGUuYW09ZnVuY3Rpb24odCxlLGkscixuLHMpe2Zvcih2YXIgbz0zMjc2NyZlLGg9ZT4+MTU7LS1zPj0wOyl7dmFyIGE9MzI3NjcmdGhpc1t0XSx1PXRoaXNbdCsrXT4+MTUsYz1oKmErdSpvO249KChhPW8qYSsoKDMyNzY3JmMpPDwxNSkraVtyXSsoMTA3Mzc0MTgyMyZuKSk+Pj4zMCkrKGM+Pj4xNSkraCp1KyhuPj4+MzApLGlbcisrXT0xMDczNzQxODIzJmF9cmV0dXJuIG59LHc9MzApOmomJiJOZXRzY2FwZSIhPW5hdmlnYXRvci5hcHBOYW1lPyhBLnByb3RvdHlwZS5hbT1mdW5jdGlvbih0LGUsaSxyLG4scyl7Zm9yKDstLXM+PTA7KXt2YXIgbz1lKnRoaXNbdCsrXStpW3JdK247bj1NYXRoLmZsb29yKG8vNjcxMDg4NjQpLGlbcisrXT02NzEwODg2MyZvfXJldHVybiBufSx3PTI2KTooQS5wcm90b3R5cGUuYW09ZnVuY3Rpb24odCxlLGkscixuLHMpe2Zvcih2YXIgbz0xNjM4MyZlLGg9ZT4+MTQ7LS1zPj0wOyl7dmFyIGE9MTYzODMmdGhpc1t0XSx1PXRoaXNbdCsrXT4+MTQsYz1oKmErdSpvO249KChhPW8qYSsoKDE2MzgzJmMpPDwxNCkraVtyXStuKT4+MjgpKyhjPj4xNCkraCp1LGlbcisrXT0yNjg0MzU0NTUmYX1yZXR1cm4gbn0sdz0yOCksQS5wcm90b3R5cGUuREI9dyxBLnByb3RvdHlwZS5ETT0oMTw8dyktMSxBLnByb3RvdHlwZS5EVj0xPDx3LEEucHJvdG90eXBlLkZWPU1hdGgucG93KDIsNTIpLEEucHJvdG90eXBlLkYxPTUyLXcsQS5wcm90b3R5cGUuRjI9Mip3LTUyO3ZhciBxLEgsQz1bXTtmb3IocT0iMCIuY2hhckNvZGVBdCgwKSxIPTA7SDw9OTsrK0gpQ1txKytdPUg7Zm9yKHE9ImEiLmNoYXJDb2RlQXQoMCksSD0xMDtIPDM2OysrSClDW3ErK109SDtmb3IocT0iQSIuY2hhckNvZGVBdCgwKSxIPTEwO0g8MzY7KytIKUNbcSsrXT1IO2Z1bmN0aW9uIEYodCxlKXt2YXIgaT1DW3QuY2hhckNvZGVBdChlKV07cmV0dXJuIG51bGw9PWk/LTE6aX1mdW5jdGlvbiBVKHQpe3ZhciBlPU0oKTtyZXR1cm4gZS5mcm9tSW50KHQpLGV9ZnVuY3Rpb24gSyh0KXt2YXIgZSxpPTE7cmV0dXJuIDAhPShlPXQ+Pj4xNikmJih0PWUsaSs9MTYpLDAhPShlPXQ+PjgpJiYodD1lLGkrPTgpLDAhPShlPXQ+PjQpJiYodD1lLGkrPTQpLDAhPShlPXQ+PjIpJiYodD1lLGkrPTIpLDAhPShlPXQ+PjEpJiYodD1lLGkrPTEpLGl9QS5aRVJPPVUoMCksQS5PTkU9VSgxKTt2YXIgayxfLHo9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5pPTAsdGhpcy5qPTAsdGhpcy5TPVtdfXJldHVybiB0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe3ZhciBlLGkscjtmb3IoZT0wO2U8MjU2OysrZSl0aGlzLlNbZV09ZTtmb3IoaT0wLGU9MDtlPDI1NjsrK2UpaT1pK3RoaXMuU1tlXSt0W2UldC5sZW5ndGhdJjI1NSxyPXRoaXMuU1tlXSx0aGlzLlNbZV09dGhpcy5TW2ldLHRoaXMuU1tpXT1yO3RoaXMuaT0wLHRoaXMuaj0wfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMuaT10aGlzLmkrMSYyNTUsdGhpcy5qPXRoaXMuait0aGlzLlNbdGhpcy5pXSYyNTUsdD10aGlzLlNbdGhpcy5pXSx0aGlzLlNbdGhpcy5pXT10aGlzLlNbdGhpcy5qXSx0aGlzLlNbdGhpcy5qXT10LHRoaXMuU1t0K3RoaXMuU1t0aGlzLmldJjI1NV19LHR9KCksWj0yNTYsRz1udWxsO2lmKG51bGw9PUcpe0c9W10sXz0wO3ZhciAkPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmNyeXB0byYmd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciBZPW5ldyBVaW50MzJBcnJheSgyNTYpO2Zvcih3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhZKSwkPTA7JDxZLmxlbmd0aDsrKyQpR1tfKytdPTI1NSZZWyRdfXZhciBKPTAsWD1mdW5jdGlvbih0KXtpZigoSj1KfHwwKT49MjU2fHxfPj1aKXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyP3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLFgsITEpOndpbmRvdy5kZXRhY2hFdmVudCYmd2luZG93LmRldGFjaEV2ZW50KCJvbm1vdXNlbW92ZSIsWCk7ZWxzZSB0cnl7dmFyIGU9dC54K3QueTtHW18rK109MjU1JmUsSis9MX1jYXRjaCh0KXt9fTsidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLFgsITEpOndpbmRvdy5hdHRhY2hFdmVudCYmd2luZG93LmF0dGFjaEV2ZW50KCJvbm1vdXNlbW92ZSIsWCkpfWZ1bmN0aW9uIFEoKXtpZihudWxsPT1rKXtmb3Ioaz1uZXcgejtfPFo7KXt2YXIgdD1NYXRoLmZsb29yKDY1NTM2Kk1hdGgucmFuZG9tKCkpO0dbXysrXT0yNTUmdH1mb3Ioay5pbml0KEcpLF89MDtfPEcubGVuZ3RoOysrXylHW19dPTA7Xz0wfXJldHVybiBrLm5leHQoKX12YXIgVz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLm5leHRCeXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoOysrZSl0W2VdPVEoKX0sdH0oKSx0dD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLm49bnVsbCx0aGlzLmU9MCx0aGlzLmQ9bnVsbCx0aGlzLnA9bnVsbCx0aGlzLnE9bnVsbCx0aGlzLmRtcDE9bnVsbCx0aGlzLmRtcTE9bnVsbCx0aGlzLmNvZWZmPW51bGx9cmV0dXJuIHQucHJvdG90eXBlLmRvUHVibGljPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1vZFBvd0ludCh0aGlzLmUsdGhpcy5uKX0sdC5wcm90b3R5cGUuZG9Qcml2YXRlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXRoaXMucHx8bnVsbD09dGhpcy5xKXJldHVybiB0Lm1vZFBvdyh0aGlzLmQsdGhpcy5uKTtmb3IodmFyIGU9dC5tb2QodGhpcy5wKS5tb2RQb3codGhpcy5kbXAxLHRoaXMucCksaT10Lm1vZCh0aGlzLnEpLm1vZFBvdyh0aGlzLmRtcTEsdGhpcy5xKTtlLmNvbXBhcmVUbyhpKTwwOyllPWUuYWRkKHRoaXMucCk7cmV0dXJuIGUuc3VidHJhY3QoaSkubXVsdGlwbHkodGhpcy5jb2VmZikubW9kKHRoaXMucCkubXVsdGlwbHkodGhpcy5xKS5hZGQoaSl9LHQucHJvdG90eXBlLnNldFB1YmxpYz1mdW5jdGlvbih0LGUpe251bGwhPXQmJm51bGwhPWUmJnQubGVuZ3RoPjAmJmUubGVuZ3RoPjA/KHRoaXMubj1MKHQsMTYpLHRoaXMuZT1wYXJzZUludChlLDE2KSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCBSU0EgcHVibGljIGtleSIpfSx0LnByb3RvdHlwZS5lbmNyeXB0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubi5iaXRMZW5ndGgoKSs3Pj4zLGk9ZnVuY3Rpb24odCxlKXtpZihlPHQubGVuZ3RoKzExKXJldHVybiBjb25zb2xlLmVycm9yKCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0EiKSxudWxsO2Zvcih2YXIgaT1bXSxyPXQubGVuZ3RoLTE7cj49MCYmZT4wOyl7dmFyIG49dC5jaGFyQ29kZUF0KHItLSk7bjwxMjg/aVstLWVdPW46bj4xMjcmJm48MjA0OD8oaVstLWVdPTYzJm58MTI4LGlbLS1lXT1uPj42fDE5Mik6KGlbLS1lXT02MyZufDEyOCxpWy0tZV09bj4+NiY2M3wxMjgsaVstLWVdPW4+PjEyfDIyNCl9aVstLWVdPTA7Zm9yKHZhciBzPW5ldyBXLG89W107ZT4yOyl7Zm9yKG9bMF09MDswPT1vWzBdOylzLm5leHRCeXRlcyhvKTtpWy0tZV09b1swXX1yZXR1cm4gaVstLWVdPTIsaVstLWVdPTAsbmV3IEEoaSl9KHQsZSk7aWYobnVsbD09aSlyZXR1cm4gbnVsbDt2YXIgcj10aGlzLmRvUHVibGljKGkpO2lmKG51bGw9PXIpcmV0dXJuIG51bGw7Zm9yKHZhciBuPXIudG9TdHJpbmcoMTYpLHM9bi5sZW5ndGgsbz0wO288MiplLXM7bysrKW49IjAiK247cmV0dXJuIG59LHQucHJvdG90eXBlLnNldFByaXZhdGU9ZnVuY3Rpb24odCxlLGkpe251bGwhPXQmJm51bGwhPWUmJnQubGVuZ3RoPjAmJmUubGVuZ3RoPjA/KHRoaXMubj1MKHQsMTYpLHRoaXMuZT1wYXJzZUludChlLDE2KSx0aGlzLmQ9TChpLDE2KSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCBSU0EgcHJpdmF0ZSBrZXkiKX0sdC5wcm90b3R5cGUuc2V0UHJpdmF0ZUV4PWZ1bmN0aW9uKHQsZSxpLHIsbixzLG8saCl7bnVsbCE9dCYmbnVsbCE9ZSYmdC5sZW5ndGg+MCYmZS5sZW5ndGg+MD8odGhpcy5uPUwodCwxNiksdGhpcy5lPXBhcnNlSW50KGUsMTYpLHRoaXMuZD1MKGksMTYpLHRoaXMucD1MKHIsMTYpLHRoaXMucT1MKG4sMTYpLHRoaXMuZG1wMT1MKHMsMTYpLHRoaXMuZG1xMT1MKG8sMTYpLHRoaXMuY29lZmY9TChoLDE2KSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCBSU0EgcHJpdmF0ZSBrZXkiKX0sdC5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgVyxyPXQ+PjE7dGhpcy5lPXBhcnNlSW50KGUsMTYpO2Zvcih2YXIgbj1uZXcgQShlLDE2KTs7KXtmb3IoO3RoaXMucD1uZXcgQSh0LXIsMSxpKSwwIT10aGlzLnAuc3VidHJhY3QoQS5PTkUpLmdjZChuKS5jb21wYXJlVG8oQS5PTkUpfHwhdGhpcy5wLmlzUHJvYmFibGVQcmltZSgxMCk7KTtmb3IoO3RoaXMucT1uZXcgQShyLDEsaSksMCE9dGhpcy5xLnN1YnRyYWN0KEEuT05FKS5nY2QobikuY29tcGFyZVRvKEEuT05FKXx8IXRoaXMucS5pc1Byb2JhYmxlUHJpbWUoMTApOyk7aWYodGhpcy5wLmNvbXBhcmVUbyh0aGlzLnEpPD0wKXt2YXIgcz10aGlzLnA7dGhpcy5wPXRoaXMucSx0aGlzLnE9c312YXIgbz10aGlzLnAuc3VidHJhY3QoQS5PTkUpLGg9dGhpcy5xLnN1YnRyYWN0KEEuT05FKSxhPW8ubXVsdGlwbHkoaCk7aWYoMD09YS5nY2QobikuY29tcGFyZVRvKEEuT05FKSl7dGhpcy5uPXRoaXMucC5tdWx0aXBseSh0aGlzLnEpLHRoaXMuZD1uLm1vZEludmVyc2UoYSksdGhpcy5kbXAxPXRoaXMuZC5tb2QobyksdGhpcy5kbXExPXRoaXMuZC5tb2QoaCksdGhpcy5jb2VmZj10aGlzLnEubW9kSW52ZXJzZSh0aGlzLnApO2JyZWFrfX19LHQucHJvdG90eXBlLmRlY3J5cHQ9ZnVuY3Rpb24odCl7dmFyIGU9TCh0LDE2KSxpPXRoaXMuZG9Qcml2YXRlKGUpO3JldHVybiBudWxsPT1pP251bGw6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC50b0J5dGVBcnJheSgpLHI9MDtyPGkubGVuZ3RoJiYwPT1pW3JdOykrK3I7aWYoaS5sZW5ndGgtciE9ZS0xfHwyIT1pW3JdKXJldHVybiBudWxsO2ZvcigrK3I7MCE9aVtyXTspaWYoKytyPj1pLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IodmFyIG49IiI7KytyPGkubGVuZ3RoOyl7dmFyIHM9MjU1Jmlbcl07czwxMjg/bis9U3RyaW5nLmZyb21DaGFyQ29kZShzKTpzPjE5MSYmczwyMjQ/KG4rPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJnMpPDw2fDYzJmlbcisxXSksKytyKToobis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMTUmcyk8PDEyfCg2MyZpW3IrMV0pPDw2fDYzJmlbcisyXSkscis9Mil9cmV0dXJuIG59KGksdGhpcy5uLmJpdExlbmd0aCgpKzc+PjMpfSx0LnByb3RvdHlwZS5nZW5lcmF0ZUFzeW5jPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1uZXcgVyxuPXQ+PjE7dGhpcy5lPXBhcnNlSW50KGUsMTYpO3ZhciBzPW5ldyBBKGUsMTYpLG89dGhpcyxoPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihvLnAuY29tcGFyZVRvKG8ucSk8PTApe3ZhciB0PW8ucDtvLnA9by5xLG8ucT10fXZhciBlPW8ucC5zdWJ0cmFjdChBLk9ORSkscj1vLnEuc3VidHJhY3QoQS5PTkUpLG49ZS5tdWx0aXBseShyKTswPT1uLmdjZChzKS5jb21wYXJlVG8oQS5PTkUpPyhvLm49by5wLm11bHRpcGx5KG8ucSksby5kPXMubW9kSW52ZXJzZShuKSxvLmRtcDE9by5kLm1vZChlKSxvLmRtcTE9by5kLm1vZChyKSxvLmNvZWZmPW8ucS5tb2RJbnZlcnNlKG8ucCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpKCl9KSwwKSk6c2V0VGltZW91dChoLDApfSxhPWZ1bmN0aW9uKCl7by5xPU0oKSxvLnEuZnJvbU51bWJlckFzeW5jKG4sMSxyLChmdW5jdGlvbigpe28ucS5zdWJ0cmFjdChBLk9ORSkuZ2NkYShzLChmdW5jdGlvbih0KXswPT10LmNvbXBhcmVUbyhBLk9ORSkmJm8ucS5pc1Byb2JhYmxlUHJpbWUoMTApP3NldFRpbWVvdXQoZSwwKTpzZXRUaW1lb3V0KGEsMCl9KSl9KSl9LHU9ZnVuY3Rpb24oKXtvLnA9TSgpLG8ucC5mcm9tTnVtYmVyQXN5bmModC1uLDEsciwoZnVuY3Rpb24oKXtvLnAuc3VidHJhY3QoQS5PTkUpLmdjZGEocywoZnVuY3Rpb24odCl7MD09dC5jb21wYXJlVG8oQS5PTkUpJiZvLnAuaXNQcm9iYWJsZVByaW1lKDEwKT9zZXRUaW1lb3V0KGEsMCk6c2V0VGltZW91dCh1LDApfSkpfSkpfTtzZXRUaW1lb3V0KHUsMCl9O3NldFRpbWVvdXQoaCwwKX0sdC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0LGUsaSl7dmFyIHI9ZnVuY3Rpb24odCxlKXtpZihlPHQubGVuZ3RoKzIyKXJldHVybiBjb25zb2xlLmVycm9yKCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0EiKSxudWxsO2Zvcih2YXIgaT1lLXQubGVuZ3RoLTYscj0iIixuPTA7bjxpO24rPTIpcis9ImZmIjtyZXR1cm4gTCgiMDAwMSIrcisiMDAiK3QsMTYpfSgoZXRbaV18fCIiKStlKHQpLnRvU3RyaW5nKCksdGhpcy5uLmJpdExlbmd0aCgpLzQpO2lmKG51bGw9PXIpcmV0dXJuIG51bGw7dmFyIG49dGhpcy5kb1ByaXZhdGUocik7aWYobnVsbD09bilyZXR1cm4gbnVsbDt2YXIgcz1uLnRvU3RyaW5nKDE2KTtyZXR1cm4gMD09KDEmcy5sZW5ndGgpP3M6IjAiK3N9LHQucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9TChlLDE2KSxuPXRoaXMuZG9QdWJsaWMocik7cmV0dXJuIG51bGw9PW4/bnVsbDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gZXQpaWYoZXQuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBpPWV0W2VdLHI9aS5sZW5ndGg7aWYodC5zdWJzdHIoMCxyKT09aSlyZXR1cm4gdC5zdWJzdHIocil9cmV0dXJuIHR9KG4udG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sIiIpKT09aSh0KS50b1N0cmluZygpfSx0fSgpLGV0PXttZDI6IjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDIwNTAwMDQxMCIsbWQ1OiIzMDIwMzAwYzA2MDgyYTg2NDg4NmY3MGQwMjA1MDUwMDA0MTAiLHNoYTE6IjMwMjEzMDA5MDYwNTJiMGUwMzAyMWEwNTAwMDQxNCIsc2hhMjI0OiIzMDJkMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDQwNTAwMDQxYyIsc2hhMjU2OiIzMDMxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDEwNTAwMDQyMCIsc2hhMzg0OiIzMDQxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDIwNTAwMDQzMCIsc2hhNTEyOiIzMDUxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDMwNTAwMDQ0MCIscmlwZW1kMTYwOiIzMDIxMzAwOTA2MDUyYjI0MDMwMjAxMDUwMDA0MTQifSxpdD17fTtpdC5sYW5nPXtleHRlbmQ6ZnVuY3Rpb24odCxlLGkpe2lmKCFlfHwhdCl0aHJvdyBuZXcgRXJyb3IoIllBSE9PLmxhbmcuZXh0ZW5kIGZhaWxlZCwgcGxlYXNlIGNoZWNrIHRoYXQgYWxsIGRlcGVuZGVuY2llcyBhcmUgaW5jbHVkZWQuIik7dmFyIHI9ZnVuY3Rpb24oKXt9O2lmKHIucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5zdXBlcmNsYXNzPWUucHJvdG90eXBlLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPT1PYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yJiYoZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSksaSl7dmFyIG47Zm9yKG4gaW4gaSl0LnByb3RvdHlwZVtuXT1pW25dO3ZhciBzPWZ1bmN0aW9uKCl7fSxvPVsidG9TdHJpbmciLCJ2YWx1ZU9mIl07dHJ5ey9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYocz1mdW5jdGlvbih0LGUpe2ZvcihuPTA7bjxvLmxlbmd0aDtuKz0xKXt2YXIgaT1vW25dLHI9ZVtpXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmciE9T2JqZWN0LnByb3RvdHlwZVtpXSYmKHRbaV09cil9fSl9Y2F0Y2godCl7fXModC5wcm90b3R5cGUsaSl9fX07dmFyIHJ0PXt9O3ZvaWQgMCE9PXJ0LmFzbjEmJnJ0LmFzbjF8fChydC5hc24xPXt9KSxydC5hc24xLkFTTjFVdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuaW50ZWdlclRvQnl0ZUhleD1mdW5jdGlvbih0KXt2YXIgZT10LnRvU3RyaW5nKDE2KTtyZXR1cm4gZS5sZW5ndGglMj09MSYmKGU9IjAiK2UpLGV9LHRoaXMuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXg9ZnVuY3Rpb24odCl7dmFyIGU9dC50b1N0cmluZygxNik7aWYoIi0iIT1lLnN1YnN0cigwLDEpKWUubGVuZ3RoJTI9PTE/ZT0iMCIrZTplLm1hdGNoKC9eWzAtN10vKXx8KGU9IjAwIitlKTtlbHNle3ZhciBpPWUuc3Vic3RyKDEpLmxlbmd0aDtpJTI9PTE/aSs9MTplLm1hdGNoKC9eWzAtN10vKXx8KGkrPTIpO2Zvcih2YXIgcj0iIixuPTA7bjxpO24rKylyKz0iZiI7ZT1uZXcgQShyLDE2KS54b3IodCkuYWRkKEEuT05FKS50b1N0cmluZygxNikucmVwbGFjZSgvXi0vLCIiKX1yZXR1cm4gZX0sdGhpcy5nZXRQRU1TdHJpbmdGcm9tSGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhleHRvcGVtKHQsZSl9LHRoaXMubmV3T2JqZWN0PWZ1bmN0aW9uKHQpe3ZhciBlPXJ0LmFzbjEsaT1lLkRFUkJvb2xlYW4scj1lLkRFUkludGVnZXIsbj1lLkRFUkJpdFN0cmluZyxzPWUuREVST2N0ZXRTdHJpbmcsbz1lLkRFUk51bGwsaD1lLkRFUk9iamVjdElkZW50aWZpZXIsYT1lLkRFUkVudW1lcmF0ZWQsdT1lLkRFUlVURjhTdHJpbmcsYz1lLkRFUk51bWVyaWNTdHJpbmcsZj1lLkRFUlByaW50YWJsZVN0cmluZyxsPWUuREVSVGVsZXRleFN0cmluZyxwPWUuREVSSUE1U3RyaW5nLGc9ZS5ERVJVVENUaW1lLGQ9ZS5ERVJHZW5lcmFsaXplZFRpbWUsdj1lLkRFUlNlcXVlbmNlLG09ZS5ERVJTZXQseT1lLkRFUlRhZ2dlZE9iamVjdCxiPWUuQVNOMVV0aWwubmV3T2JqZWN0LFQ9T2JqZWN0LmtleXModCk7aWYoMSE9VC5sZW5ndGgpdGhyb3cia2V5IG9mIHBhcmFtIHNoYWxsIGJlIG9ubHkgb25lLiI7dmFyIFM9VFswXTtpZigtMT09Ijpib29sOmludDpiaXRzdHI6b2N0c3RyOm51bGw6b2lkOmVudW06dXRmOHN0cjpudW1zdHI6cHJuc3RyOnRlbHN0cjppYTVzdHI6dXRjdGltZTpnZW50aW1lOnNlcTpzZXQ6dGFnOiIuaW5kZXhPZigiOiIrUysiOiIpKXRocm93InVuZGVmaW5lZCBrZXk6ICIrUztpZigiYm9vbCI9PVMpcmV0dXJuIG5ldyBpKHRbU10pO2lmKCJpbnQiPT1TKXJldHVybiBuZXcgcih0W1NdKTtpZigiYml0c3RyIj09UylyZXR1cm4gbmV3IG4odFtTXSk7aWYoIm9jdHN0ciI9PVMpcmV0dXJuIG5ldyBzKHRbU10pO2lmKCJudWxsIj09UylyZXR1cm4gbmV3IG8odFtTXSk7aWYoIm9pZCI9PVMpcmV0dXJuIG5ldyBoKHRbU10pO2lmKCJlbnVtIj09UylyZXR1cm4gbmV3IGEodFtTXSk7aWYoInV0ZjhzdHIiPT1TKXJldHVybiBuZXcgdSh0W1NdKTtpZigibnVtc3RyIj09UylyZXR1cm4gbmV3IGModFtTXSk7aWYoInBybnN0ciI9PVMpcmV0dXJuIG5ldyBmKHRbU10pO2lmKCJ0ZWxzdHIiPT1TKXJldHVybiBuZXcgbCh0W1NdKTtpZigiaWE1c3RyIj09UylyZXR1cm4gbmV3IHAodFtTXSk7aWYoInV0Y3RpbWUiPT1TKXJldHVybiBuZXcgZyh0W1NdKTtpZigiZ2VudGltZSI9PVMpcmV0dXJuIG5ldyBkKHRbU10pO2lmKCJzZXEiPT1TKXtmb3IodmFyIEU9dFtTXSx3PVtdLEQ9MDtEPEUubGVuZ3RoO0QrKyl7dmFyIHg9YihFW0RdKTt3LnB1c2goeCl9cmV0dXJuIG5ldyB2KHthcnJheTp3fSl9aWYoInNldCI9PVMpe2ZvcihFPXRbU10sdz1bXSxEPTA7RDxFLmxlbmd0aDtEKyspeD1iKEVbRF0pLHcucHVzaCh4KTtyZXR1cm4gbmV3IG0oe2FycmF5Ond9KX1pZigidGFnIj09Uyl7dmFyIFI9dFtTXTtpZigiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFIpJiYzPT1SLmxlbmd0aCl7dmFyIEI9YihSWzJdKTtyZXR1cm4gbmV3IHkoe3RhZzpSWzBdLGV4cGxpY2l0OlJbMV0sb2JqOkJ9KX12YXIgTz17fTtpZih2b2lkIDAhPT1SLmV4cGxpY2l0JiYoTy5leHBsaWNpdD1SLmV4cGxpY2l0KSx2b2lkIDAhPT1SLnRhZyYmKE8udGFnPVIudGFnKSx2b2lkIDA9PT1SLm9iail0aHJvdyJvYmogc2hhbGwgYmUgc3BlY2lmaWVkIGZvciAndGFnJy4iO3JldHVybiBPLm9iaj1iKFIub2JqKSxuZXcgeShPKX19LHRoaXMuanNvblRvQVNOMUhFWD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5uZXdPYmplY3QodCkuZ2V0RW5jb2RlZEhleCgpfX0scnQuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludD1mdW5jdGlvbih0KXtmb3IodmFyIGU9IiIsaT1wYXJzZUludCh0LnN1YnN0cigwLDIpLDE2KSxyPShlPU1hdGguZmxvb3IoaS80MCkrIi4iK2klNDAsIiIpLG49MjtuPHQubGVuZ3RoO24rPTIpe3ZhciBzPSgiMDAwMDAwMDAiK3BhcnNlSW50KHQuc3Vic3RyKG4sMiksMTYpLnRvU3RyaW5nKDIpKS5zbGljZSgtOCk7cis9cy5zdWJzdHIoMSw3KSwiMCI9PXMuc3Vic3RyKDAsMSkmJihlPWUrIi4iK25ldyBBKHIsMikudG9TdHJpbmcoMTApLHI9IiIpfXJldHVybiBlfSxydC5hc24xLkFTTjFVdGlsLm9pZEludFRvSGV4PWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9TdHJpbmcoMTYpO3JldHVybiAxPT1lLmxlbmd0aCYmKGU9IjAiK2UpLGV9LGk9ZnVuY3Rpb24odCl7dmFyIGk9IiIscj1uZXcgQSh0LDEwKS50b1N0cmluZygyKSxuPTctci5sZW5ndGglNzs3PT1uJiYobj0wKTtmb3IodmFyIHM9IiIsbz0wO288bjtvKyspcys9IjAiO2ZvcihyPXMrcixvPTA7bzxyLmxlbmd0aC0xO28rPTcpe3ZhciBoPXIuc3Vic3RyKG8sNyk7byE9ci5sZW5ndGgtNyYmKGg9IjEiK2gpLGkrPWUocGFyc2VJbnQoaCwyKSl9cmV0dXJuIGl9O2lmKCF0Lm1hdGNoKC9eWzAtOS5dKyQvKSl0aHJvdyJtYWxmb3JtZWQgb2lkIHN0cmluZzogIit0O3ZhciByPSIiLG49dC5zcGxpdCgiLiIpLHM9NDAqcGFyc2VJbnQoblswXSkrcGFyc2VJbnQoblsxXSk7cis9ZShzKSxuLnNwbGljZSgwLDIpO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXIrPWkobltvXSk7cmV0dXJuIHJ9LHJ0LmFzbjEuQVNOMU9iamVjdD1mdW5jdGlvbigpe3RoaXMuZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlPWZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy5oVnx8bnVsbD09dGhpcy5oVil0aHJvdyJ0aGlzLmhWIGlzIG51bGwgb3IgdW5kZWZpbmVkLiI7aWYodGhpcy5oVi5sZW5ndGglMj09MSl0aHJvdyJ2YWx1ZSBoZXggbXVzdCBiZSBldmVuIGxlbmd0aDogbj0iKyIiLmxlbmd0aCsiLHY9Iit0aGlzLmhWO3ZhciB0PXRoaXMuaFYubGVuZ3RoLzIsZT10LnRvU3RyaW5nKDE2KTtpZihlLmxlbmd0aCUyPT0xJiYoZT0iMCIrZSksdDwxMjgpcmV0dXJuIGU7dmFyIGk9ZS5sZW5ndGgvMjtpZihpPjE1KXRocm93IkFTTi4xIGxlbmd0aCB0b28gbG9uZyB0byByZXByZXNlbnQgYnkgOHg6IG4gPSAiK3QudG9TdHJpbmcoMTYpO3JldHVybigxMjgraSkudG9TdHJpbmcoMTYpK2V9LHRoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3JldHVybihudWxsPT10aGlzLmhUTFZ8fHRoaXMuaXNNb2RpZmllZCkmJih0aGlzLmhWPXRoaXMuZ2V0RnJlc2hWYWx1ZUhleCgpLHRoaXMuaEw9dGhpcy5nZXRMZW5ndGhIZXhGcm9tVmFsdWUoKSx0aGlzLmhUTFY9dGhpcy5oVCt0aGlzLmhMK3RoaXMuaFYsdGhpcy5pc01vZGlmaWVkPSExKSx0aGlzLmhUTFZ9LHRoaXMuZ2V0VmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFbmNvZGVkSGV4KCksdGhpcy5oVn0sdGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIiJ9fSxydC5hc24xLkRFUkFic3RyYWN0U3RyaW5nPWZ1bmN0aW9uKHQpe3J0LmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpLHRoaXMuZ2V0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc30sdGhpcy5zZXRTdHJpbmc9ZnVuY3Rpb24odCl7dGhpcy5oVExWPW51bGwsdGhpcy5pc01vZGlmaWVkPSEwLHRoaXMucz10LHRoaXMuaFY9c3RvaGV4KHRoaXMucyl9LHRoaXMuc2V0U3RyaW5nSGV4PWZ1bmN0aW9uKHQpe3RoaXMuaFRMVj1udWxsLHRoaXMuaXNNb2RpZmllZD0hMCx0aGlzLnM9bnVsbCx0aGlzLmhWPXR9LHRoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfSx2b2lkIDAhPT10JiYoInN0cmluZyI9PXR5cGVvZiB0P3RoaXMuc2V0U3RyaW5nKHQpOnZvaWQgMCE9PXQuc3RyP3RoaXMuc2V0U3RyaW5nKHQuc3RyKTp2b2lkIDAhPT10LmhleCYmdGhpcy5zZXRTdHJpbmdIZXgodC5oZXgpKX0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyxydC5hc24xLkFTTjFPYmplY3QpLHJ0LmFzbjEuREVSQWJzdHJhY3RUaW1lPWZ1bmN0aW9uKHQpe3J0LmFzbjEuREVSQWJzdHJhY3RUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKSx0aGlzLmxvY2FsRGF0ZVRvVVRDPWZ1bmN0aW9uKHQpe3JldHVybiB1dGM9dC5nZXRUaW1lKCkrNmU0KnQuZ2V0VGltZXpvbmVPZmZzZXQoKSxuZXcgRGF0ZSh1dGMpfSx0aGlzLmZvcm1hdERhdGU9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuemVyb1BhZGRpbmcsbj10aGlzLmxvY2FsRGF0ZVRvVVRDKHQpLHM9U3RyaW5nKG4uZ2V0RnVsbFllYXIoKSk7InV0YyI9PWUmJihzPXMuc3Vic3RyKDIsMikpO3ZhciBvPXMrcihTdHJpbmcobi5nZXRNb250aCgpKzEpLDIpK3IoU3RyaW5nKG4uZ2V0RGF0ZSgpKSwyKStyKFN0cmluZyhuLmdldEhvdXJzKCkpLDIpK3IoU3RyaW5nKG4uZ2V0TWludXRlcygpKSwyKStyKFN0cmluZyhuLmdldFNlY29uZHMoKSksMik7aWYoITA9PT1pKXt2YXIgaD1uLmdldE1pbGxpc2Vjb25kcygpO2lmKDAhPWgpe3ZhciBhPXIoU3RyaW5nKGgpLDMpO289bysiLiIrKGE9YS5yZXBsYWNlKC9bMF0rJC8sIiIpKX19cmV0dXJuIG8rIloifSx0aGlzLnplcm9QYWRkaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGVuZ3RoPj1lP3Q6bmV3IEFycmF5KGUtdC5sZW5ndGgrMSkuam9pbigiMCIpK3R9LHRoaXMuZ2V0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc30sdGhpcy5zZXRTdHJpbmc9ZnVuY3Rpb24odCl7dGhpcy5oVExWPW51bGwsdGhpcy5pc01vZGlmaWVkPSEwLHRoaXMucz10LHRoaXMuaFY9c3RvaGV4KHQpfSx0aGlzLnNldEJ5RGF0ZVZhbHVlPWZ1bmN0aW9uKHQsZSxpLHIsbixzKXt2YXIgbz1uZXcgRGF0ZShEYXRlLlVUQyh0LGUtMSxpLHIsbixzLDApKTt0aGlzLnNldEJ5RGF0ZShvKX0sdGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9fSxpdC5sYW5nLmV4dGVuZChydC5hc24xLkRFUkFic3RyYWN0VGltZSxydC5hc24xLkFTTjFPYmplY3QpLHJ0LmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkPWZ1bmN0aW9uKHQpe3J0LmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpLHRoaXMuc2V0QnlBU04xT2JqZWN0QXJyYXk9ZnVuY3Rpb24odCl7dGhpcy5oVExWPW51bGwsdGhpcy5pc01vZGlmaWVkPSEwLHRoaXMuYXNuMUFycmF5PXR9LHRoaXMuYXBwZW5kQVNOMU9iamVjdD1mdW5jdGlvbih0KXt0aGlzLmhUTFY9bnVsbCx0aGlzLmlzTW9kaWZpZWQ9ITAsdGhpcy5hc24xQXJyYXkucHVzaCh0KX0sdGhpcy5hc24xQXJyYXk9bmV3IEFycmF5LHZvaWQgMCE9PXQmJnZvaWQgMCE9PXQuYXJyYXkmJih0aGlzLmFzbjFBcnJheT10LmFycmF5KX0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQscnQuYXNuMS5BU04xT2JqZWN0KSxydC5hc24xLkRFUkJvb2xlYW49ZnVuY3Rpb24oKXtydC5hc24xLkRFUkJvb2xlYW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpLHRoaXMuaFQ9IjAxIix0aGlzLmhUTFY9IjAxMDFmZiJ9LGl0LmxhbmcuZXh0ZW5kKHJ0LmFzbjEuREVSQm9vbGVhbixydC5hc24xLkFTTjFPYmplY3QpLHJ0LmFzbjEuREVSSW50ZWdlcj1mdW5jdGlvbih0KXtydC5hc24xLkRFUkludGVnZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpLHRoaXMuaFQ9IjAyIix0aGlzLnNldEJ5QmlnSW50ZWdlcj1mdW5jdGlvbih0KXt0aGlzLmhUTFY9bnVsbCx0aGlzLmlzTW9kaWZpZWQ9ITAsdGhpcy5oVj1ydC5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KHQpfSx0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQShTdHJpbmcodCksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGUpfSx0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKHQpe3RoaXMuaFY9dH0sdGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9LHZvaWQgMCE9PXQmJih2b2lkIDAhPT10LmJpZ2ludD90aGlzLnNldEJ5QmlnSW50ZWdlcih0LmJpZ2ludCk6dm9pZCAwIT09dC5pbnQ/dGhpcy5zZXRCeUludGVnZXIodC5pbnQpOiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNldEJ5SW50ZWdlcih0KTp2b2lkIDAhPT10LmhleCYmdGhpcy5zZXRWYWx1ZUhleCh0LmhleCkpfSxpdC5sYW5nLmV4dGVuZChydC5hc24xLkRFUkludGVnZXIscnQuYXNuMS5BU04xT2JqZWN0KSxydC5hc24xLkRFUkJpdFN0cmluZz1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10JiZ2b2lkIDAhPT10Lm9iail7dmFyIGU9cnQuYXNuMS5BU04xVXRpbC5uZXdPYmplY3QodC5vYmopO3QuaGV4PSIwMCIrZS5nZXRFbmNvZGVkSGV4KCl9cnQuYXNuMS5ERVJCaXRTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpLHRoaXMuaFQ9IjAzIix0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cz1mdW5jdGlvbih0KXt0aGlzLmhUTFY9bnVsbCx0aGlzLmlzTW9kaWZpZWQ9ITAsdGhpcy5oVj10fSx0aGlzLnNldFVudXNlZEJpdHNBbmRIZXhWYWx1ZT1mdW5jdGlvbih0LGUpe2lmKHQ8MHx8Nzx0KXRocm93InVudXNlZCBiaXRzIHNoYWxsIGJlIGZyb20gMCB0byA3OiB1ID0gIit0O3ZhciBpPSIwIit0O3RoaXMuaFRMVj1udWxsLHRoaXMuaXNNb2RpZmllZD0hMCx0aGlzLmhWPWkrZX0sdGhpcy5zZXRCeUJpbmFyeVN0cmluZz1mdW5jdGlvbih0KXt2YXIgZT04LSh0PXQucmVwbGFjZSgvMCskLywiIikpLmxlbmd0aCU4Ozg9PWUmJihlPTApO2Zvcih2YXIgaT0wO2k8PWU7aSsrKXQrPSIwIjt2YXIgcj0iIjtmb3IoaT0wO2k8dC5sZW5ndGgtMTtpKz04KXt2YXIgbj10LnN1YnN0cihpLDgpLHM9cGFyc2VJbnQobiwyKS50b1N0cmluZygxNik7MT09cy5sZW5ndGgmJihzPSIwIitzKSxyKz1zfXRoaXMuaFRMVj1udWxsLHRoaXMuaXNNb2RpZmllZD0hMCx0aGlzLmhWPSIwIitlK3J9LHRoaXMuc2V0QnlCb29sZWFuQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiLGk9MDtpPHQubGVuZ3RoO2krKykxPT10W2ldP2UrPSIxIjplKz0iMCI7dGhpcy5zZXRCeUJpbmFyeVN0cmluZyhlKX0sdGhpcy5uZXdGYWxzZUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCksaT0wO2k8dDtpKyspZVtpXT0hMTtyZXR1cm4gZX0sdGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9LHZvaWQgMCE9PXQmJigic3RyaW5nIj09dHlwZW9mIHQmJnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvXlswLTlhLWZdKyQvKT90aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyh0KTp2b2lkIDAhPT10LmhleD90aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyh0LmhleCk6dm9pZCAwIT09dC5iaW4/dGhpcy5zZXRCeUJpbmFyeVN0cmluZyh0LmJpbik6dm9pZCAwIT09dC5hcnJheSYmdGhpcy5zZXRCeUJvb2xlYW5BcnJheSh0LmFycmF5KSl9LGl0LmxhbmcuZXh0ZW5kKHJ0LmFzbjEuREVSQml0U3RyaW5nLHJ0LmFzbjEuQVNOMU9iamVjdCkscnQuYXNuMS5ERVJPY3RldFN0cmluZz1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10JiZ2b2lkIDAhPT10Lm9iail7dmFyIGU9cnQuYXNuMS5BU04xVXRpbC5uZXdPYmplY3QodC5vYmopO3QuaGV4PWUuZ2V0RW5jb2RlZEhleCgpfXJ0LmFzbjEuREVST2N0ZXRTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsdCksdGhpcy5oVD0iMDQifSxpdC5sYW5nLmV4dGVuZChydC5hc24xLkRFUk9jdGV0U3RyaW5nLHJ0LmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpLHJ0LmFzbjEuREVSTnVsbD1mdW5jdGlvbigpe3J0LmFzbjEuREVSTnVsbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyksdGhpcy5oVD0iMDUiLHRoaXMuaFRMVj0iMDUwMCJ9LGl0LmxhbmcuZXh0ZW5kKHJ0LmFzbjEuREVSTnVsbCxydC5hc24xLkFTTjFPYmplY3QpLHJ0LmFzbjEuREVST2JqZWN0SWRlbnRpZmllcj1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10LnRvU3RyaW5nKDE2KTtyZXR1cm4gMT09ZS5sZW5ndGgmJihlPSIwIitlKSxlfSxpPWZ1bmN0aW9uKHQpe3ZhciBpPSIiLHI9bmV3IEEodCwxMCkudG9TdHJpbmcoMiksbj03LXIubGVuZ3RoJTc7Nz09biYmKG49MCk7Zm9yKHZhciBzPSIiLG89MDtvPG47bysrKXMrPSIwIjtmb3Iocj1zK3Isbz0wO288ci5sZW5ndGgtMTtvKz03KXt2YXIgaD1yLnN1YnN0cihvLDcpO28hPXIubGVuZ3RoLTcmJihoPSIxIitoKSxpKz1lKHBhcnNlSW50KGgsMikpfXJldHVybiBpfTtydC5hc24xLkRFUk9iamVjdElkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpLHRoaXMuaFQ9IjA2Iix0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKHQpe3RoaXMuaFRMVj1udWxsLHRoaXMuaXNNb2RpZmllZD0hMCx0aGlzLnM9bnVsbCx0aGlzLmhWPXR9LHRoaXMuc2V0VmFsdWVPaWRTdHJpbmc9ZnVuY3Rpb24odCl7aWYoIXQubWF0Y2goL15bMC05Ll0rJC8pKXRocm93Im1hbGZvcm1lZCBvaWQgc3RyaW5nOiAiK3Q7dmFyIHI9IiIsbj10LnNwbGl0KCIuIikscz00MCpwYXJzZUludChuWzBdKStwYXJzZUludChuWzFdKTtyKz1lKHMpLG4uc3BsaWNlKDAsMik7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspcis9aShuW29dKTt0aGlzLmhUTFY9bnVsbCx0aGlzLmlzTW9kaWZpZWQ9ITAsdGhpcy5zPW51bGwsdGhpcy5oVj1yfSx0aGlzLnNldFZhbHVlTmFtZT1mdW5jdGlvbih0KXt2YXIgZT1ydC5hc24xLng1MDkuT0lELm5hbWUyb2lkKHQpO2lmKCIiPT09ZSl0aHJvdyJERVJPYmplY3RJZGVudGlmaWVyIG9pZE5hbWUgdW5kZWZpbmVkOiAiK3Q7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhlKX0sdGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9LHZvaWQgMCE9PXQmJigic3RyaW5nIj09dHlwZW9mIHQ/dC5tYXRjaCgvXlswLTJdLlswLTkuXSskLyk/dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyh0KTp0aGlzLnNldFZhbHVlTmFtZSh0KTp2b2lkIDAhPT10Lm9pZD90aGlzLnNldFZhbHVlT2lkU3RyaW5nKHQub2lkKTp2b2lkIDAhPT10LmhleD90aGlzLnNldFZhbHVlSGV4KHQuaGV4KTp2b2lkIDAhPT10Lm5hbWUmJnRoaXMuc2V0VmFsdWVOYW1lKHQubmFtZSkpfSxpdC5sYW5nLmV4dGVuZChydC5hc24xLkRFUk9iamVjdElkZW50aWZpZXIscnQuYXNuMS5BU04xT2JqZWN0KSxydC5hc24xLkRFUkVudW1lcmF0ZWQ9ZnVuY3Rpb24odCl7cnQuYXNuMS5ERVJFbnVtZXJhdGVkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKSx0aGlzLmhUPSIwYSIsdGhpcy5zZXRCeUJpZ0ludGVnZXI9ZnVuY3Rpb24odCl7dGhpcy5oVExWPW51bGwsdGhpcy5pc01vZGlmaWVkPSEwLHRoaXMuaFY9cnQuYXNuMS5BU04xVXRpbC5iaWdJbnRUb01pblR3b3NDb21wbGVtZW50c0hleCh0KX0sdGhpcy5zZXRCeUludGVnZXI9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEEoU3RyaW5nKHQpLDEwKTt0aGlzLnNldEJ5QmlnSW50ZWdlcihlKX0sdGhpcy5zZXRWYWx1ZUhleD1mdW5jdGlvbih0KXt0aGlzLmhWPXR9LHRoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfSx2b2lkIDAhPT10JiYodm9pZCAwIT09dC5pbnQ/dGhpcy5zZXRCeUludGVnZXIodC5pbnQpOiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNldEJ5SW50ZWdlcih0KTp2b2lkIDAhPT10LmhleCYmdGhpcy5zZXRWYWx1ZUhleCh0LmhleCkpfSxpdC5sYW5nLmV4dGVuZChydC5hc24xLkRFUkVudW1lcmF0ZWQscnQuYXNuMS5BU04xT2JqZWN0KSxydC5hc24xLkRFUlVURjhTdHJpbmc9ZnVuY3Rpb24odCl7cnQuYXNuMS5ERVJVVEY4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLHQpLHRoaXMuaFQ9IjBjIn0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJVVEY4U3RyaW5nLHJ0LmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpLHJ0LmFzbjEuREVSTnVtZXJpY1N0cmluZz1mdW5jdGlvbih0KXtydC5hc24xLkRFUk51bWVyaWNTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsdCksdGhpcy5oVD0iMTIifSxpdC5sYW5nLmV4dGVuZChydC5hc24xLkRFUk51bWVyaWNTdHJpbmcscnQuYXNuMS5ERVJBYnN0cmFjdFN0cmluZykscnQuYXNuMS5ERVJQcmludGFibGVTdHJpbmc9ZnVuY3Rpb24odCl7cnQuYXNuMS5ERVJQcmludGFibGVTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsdCksdGhpcy5oVD0iMTMifSxpdC5sYW5nLmV4dGVuZChydC5hc24xLkRFUlByaW50YWJsZVN0cmluZyxydC5hc24xLkRFUkFic3RyYWN0U3RyaW5nKSxydC5hc24xLkRFUlRlbGV0ZXhTdHJpbmc9ZnVuY3Rpb24odCl7cnQuYXNuMS5ERVJUZWxldGV4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLHQpLHRoaXMuaFQ9IjE0In0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJUZWxldGV4U3RyaW5nLHJ0LmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpLHJ0LmFzbjEuREVSSUE1U3RyaW5nPWZ1bmN0aW9uKHQpe3J0LmFzbjEuREVSSUE1U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLHQpLHRoaXMuaFQ9IjE2In0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJJQTVTdHJpbmcscnQuYXNuMS5ERVJBYnN0cmFjdFN0cmluZykscnQuYXNuMS5ERVJVVENUaW1lPWZ1bmN0aW9uKHQpe3J0LmFzbjEuREVSVVRDVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0KSx0aGlzLmhUPSIxNyIsdGhpcy5zZXRCeURhdGU9ZnVuY3Rpb24odCl7dGhpcy5oVExWPW51bGwsdGhpcy5pc01vZGlmaWVkPSEwLHRoaXMuZGF0ZT10LHRoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLCJ1dGMiKSx0aGlzLmhWPXN0b2hleCh0aGlzLnMpfSx0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5kYXRlJiZ2b2lkIDA9PT10aGlzLnMmJih0aGlzLmRhdGU9bmV3IERhdGUsdGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsInV0YyIpLHRoaXMuaFY9c3RvaGV4KHRoaXMucykpLHRoaXMuaFZ9LHZvaWQgMCE9PXQmJih2b2lkIDAhPT10LnN0cj90aGlzLnNldFN0cmluZyh0LnN0cik6InN0cmluZyI9PXR5cGVvZiB0JiZ0Lm1hdGNoKC9eWzAtOV17MTJ9WiQvKT90aGlzLnNldFN0cmluZyh0KTp2b2lkIDAhPT10LmhleD90aGlzLnNldFN0cmluZ0hleCh0LmhleCk6dm9pZCAwIT09dC5kYXRlJiZ0aGlzLnNldEJ5RGF0ZSh0LmRhdGUpKX0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJVVENUaW1lLHJ0LmFzbjEuREVSQWJzdHJhY3RUaW1lKSxydC5hc24xLkRFUkdlbmVyYWxpemVkVGltZT1mdW5jdGlvbih0KXtydC5hc24xLkRFUkdlbmVyYWxpemVkVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0KSx0aGlzLmhUPSIxOCIsdGhpcy53aXRoTWlsbGlzPSExLHRoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKHQpe3RoaXMuaFRMVj1udWxsLHRoaXMuaXNNb2RpZmllZD0hMCx0aGlzLmRhdGU9dCx0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSwiZ2VuIix0aGlzLndpdGhNaWxsaXMpLHRoaXMuaFY9c3RvaGV4KHRoaXMucyl9LHRoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLmRhdGUmJnZvaWQgMD09PXRoaXMucyYmKHRoaXMuZGF0ZT1uZXcgRGF0ZSx0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSwiZ2VuIix0aGlzLndpdGhNaWxsaXMpLHRoaXMuaFY9c3RvaGV4KHRoaXMucykpLHRoaXMuaFZ9LHZvaWQgMCE9PXQmJih2b2lkIDAhPT10LnN0cj90aGlzLnNldFN0cmluZyh0LnN0cik6InN0cmluZyI9PXR5cGVvZiB0JiZ0Lm1hdGNoKC9eWzAtOV17MTR9WiQvKT90aGlzLnNldFN0cmluZyh0KTp2b2lkIDAhPT10LmhleD90aGlzLnNldFN0cmluZ0hleCh0LmhleCk6dm9pZCAwIT09dC5kYXRlJiZ0aGlzLnNldEJ5RGF0ZSh0LmRhdGUpLCEwPT09dC5taWxsaXMmJih0aGlzLndpdGhNaWxsaXM9ITApKX0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUscnQuYXNuMS5ERVJBYnN0cmFjdFRpbWUpLHJ0LmFzbjEuREVSU2VxdWVuY2U9ZnVuY3Rpb24odCl7cnQuYXNuMS5ERVJTZXF1ZW5jZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0KSx0aGlzLmhUPSIzMCIsdGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PSIiLGU9MDtlPHRoaXMuYXNuMUFycmF5Lmxlbmd0aDtlKyspdCs9dGhpcy5hc24xQXJyYXlbZV0uZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhWPXQsdGhpcy5oVn19LGl0LmxhbmcuZXh0ZW5kKHJ0LmFzbjEuREVSU2VxdWVuY2UscnQuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpLHJ0LmFzbjEuREVSU2V0PWZ1bmN0aW9uKHQpe3J0LmFzbjEuREVSU2V0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLHQpLHRoaXMuaFQ9IjMxIix0aGlzLnNvcnRGbGFnPSEwLHRoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXksZT0wO2U8dGhpcy5hc24xQXJyYXkubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5hc24xQXJyYXlbZV07dC5wdXNoKGkuZ2V0RW5jb2RlZEhleCgpKX1yZXR1cm4gMT09dGhpcy5zb3J0RmxhZyYmdC5zb3J0KCksdGhpcy5oVj10LmpvaW4oIiIpLHRoaXMuaFZ9LHZvaWQgMCE9PXQmJnZvaWQgMCE9PXQuc29ydGZsYWcmJjA9PXQuc29ydGZsYWcmJih0aGlzLnNvcnRGbGFnPSExKX0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJTZXQscnQuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpLHJ0LmFzbjEuREVSVGFnZ2VkT2JqZWN0PWZ1bmN0aW9uKHQpe3J0LmFzbjEuREVSVGFnZ2VkT2JqZWN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKSx0aGlzLmhUPSJhMCIsdGhpcy5oVj0iIix0aGlzLmlzRXhwbGljaXQ9ITAsdGhpcy5hc24xT2JqZWN0PW51bGwsdGhpcy5zZXRBU04xT2JqZWN0PWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmhUPWUsdGhpcy5pc0V4cGxpY2l0PXQsdGhpcy5hc24xT2JqZWN0PWksdGhpcy5pc0V4cGxpY2l0Pyh0aGlzLmhWPXRoaXMuYXNuMU9iamVjdC5nZXRFbmNvZGVkSGV4KCksdGhpcy5oVExWPW51bGwsdGhpcy5pc01vZGlmaWVkPSEwKToodGhpcy5oVj1udWxsLHRoaXMuaFRMVj1pLmdldEVuY29kZWRIZXgoKSx0aGlzLmhUTFY9dGhpcy5oVExWLnJlcGxhY2UoL14uLi8sZSksdGhpcy5pc01vZGlmaWVkPSExKX0sdGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9LHZvaWQgMCE9PXQmJih2b2lkIDAhPT10LnRhZyYmKHRoaXMuaFQ9dC50YWcpLHZvaWQgMCE9PXQuZXhwbGljaXQmJih0aGlzLmlzRXhwbGljaXQ9dC5leHBsaWNpdCksdm9pZCAwIT09dC5vYmomJih0aGlzLmFzbjFPYmplY3Q9dC5vYmosdGhpcy5zZXRBU04xT2JqZWN0KHRoaXMuaXNFeHBsaWNpdCx0aGlzLmhULHRoaXMuYXNuMU9iamVjdCkpKX0saXQubGFuZy5leHRlbmQocnQuYXNuMS5ERVJUYWdnZWRPYmplY3QscnQuYXNuMS5BU04xT2JqZWN0KTt2YXIgbnQsc3Qsb3Q9KG50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG50PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiYodFtpXT1lW2ldKX0sbnQodCxlKX0sZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiK1N0cmluZyhlKSsiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fW50KHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKTooaS5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IGkpfSksaHQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShpKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkmJigic3RyaW5nIj09dHlwZW9mIGk/ci5wYXJzZUtleShpKTooZS5oYXNQcml2YXRlS2V5UHJvcGVydHkoaSl8fGUuaGFzUHVibGljS2V5UHJvcGVydHkoaSkpJiZyLnBhcnNlUHJvcGVydGllc0Zyb20oaSkpLHJ9cmV0dXJuIG90KGUsdCksZS5wcm90b3R5cGUucGFyc2VLZXk9ZnVuY3Rpb24odCl7dHJ5e3ZhciBlPTAsaT0wLHI9L15ccyooPzpbMC05QS1GYS1mXVswLTlBLUZhLWZdXHMqKSskLy50ZXN0KHQpP2Z1bmN0aW9uKHQpe3ZhciBlO2lmKHZvaWQgMD09PWMpe3ZhciBpPSIwMTIzNDU2Nzg5QUJDREVGIixyPSIgXGZcblxyXHQgXHUyMDI4XHUyMDI5Ijtmb3IoYz17fSxlPTA7ZTwxNjsrK2UpY1tpLmNoYXJBdChlKV09ZTtmb3IoaT1pLnRvTG93ZXJDYXNlKCksZT0xMDtlPDE2OysrZSljW2kuY2hhckF0KGUpXT1lO2ZvcihlPTA7ZTxyLmxlbmd0aDsrK2UpY1tyLmNoYXJBdChlKV09LTF9dmFyIG49W10scz0wLG89MDtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKXt2YXIgaD10LmNoYXJBdChlKTtpZigiPSI9PWgpYnJlYWs7aWYoLTEhPShoPWNbaF0pKXtpZih2b2lkIDA9PT1oKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBjaGFyYWN0ZXIgYXQgb2Zmc2V0ICIrZSk7c3w9aCwrK28+PTI/KG5bbi5sZW5ndGhdPXMscz0wLG89MCk6czw8PTR9fWlmKG8pdGhyb3cgbmV3IEVycm9yKCJIZXggZW5jb2RpbmcgaW5jb21wbGV0ZTogNCBiaXRzIG1pc3NpbmciKTtyZXR1cm4gbn0odCk6di51bmFybW9yKHQpLG49eC5kZWNvZGUocik7aWYoMz09PW4uc3ViLmxlbmd0aCYmKG49bi5zdWJbMl0uc3ViWzBdKSw5PT09bi5zdWIubGVuZ3RoKXtlPW4uc3ViWzFdLmdldEhleFN0cmluZ1ZhbHVlKCksdGhpcy5uPUwoZSwxNiksaT1uLnN1YlsyXS5nZXRIZXhTdHJpbmdWYWx1ZSgpLHRoaXMuZT1wYXJzZUludChpLDE2KTt2YXIgcz1uLnN1YlszXS5nZXRIZXhTdHJpbmdWYWx1ZSgpO3RoaXMuZD1MKHMsMTYpO3ZhciBvPW4uc3ViWzRdLmdldEhleFN0cmluZ1ZhbHVlKCk7dGhpcy5wPUwobywxNik7dmFyIGg9bi5zdWJbNV0uZ2V0SGV4U3RyaW5nVmFsdWUoKTt0aGlzLnE9TChoLDE2KTt2YXIgYT1uLnN1Yls2XS5nZXRIZXhTdHJpbmdWYWx1ZSgpO3RoaXMuZG1wMT1MKGEsMTYpO3ZhciB1PW4uc3ViWzddLmdldEhleFN0cmluZ1ZhbHVlKCk7dGhpcy5kbXExPUwodSwxNik7dmFyIGY9bi5zdWJbOF0uZ2V0SGV4U3RyaW5nVmFsdWUoKTt0aGlzLmNvZWZmPUwoZiwxNil9ZWxzZXtpZigyIT09bi5zdWIubGVuZ3RoKXJldHVybiExO2lmKG4uc3ViWzBdLnN1Yil7dmFyIGw9bi5zdWJbMV0uc3ViWzBdO2U9bC5zdWJbMF0uZ2V0SGV4U3RyaW5nVmFsdWUoKSx0aGlzLm49TChlLDE2KSxpPWwuc3ViWzFdLmdldEhleFN0cmluZ1ZhbHVlKCksdGhpcy5lPXBhcnNlSW50KGksMTYpfWVsc2UgZT1uLnN1YlswXS5nZXRIZXhTdHJpbmdWYWx1ZSgpLHRoaXMubj1MKGUsMTYpLGk9bi5zdWJbMV0uZ2V0SGV4U3RyaW5nVmFsdWUoKSx0aGlzLmU9cGFyc2VJbnQoaSwxNil9cmV0dXJuITB9Y2F0Y2godCl7cmV0dXJuITF9fSxlLnByb3RvdHlwZS5nZXRQcml2YXRlQmFzZUtleT1mdW5jdGlvbigpe3ZhciB0PXthcnJheTpbbmV3IHJ0LmFzbjEuREVSSW50ZWdlcih7aW50OjB9KSxuZXcgcnQuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6dGhpcy5ufSksbmV3IHJ0LmFzbjEuREVSSW50ZWdlcih7aW50OnRoaXMuZX0pLG5ldyBydC5hc24xLkRFUkludGVnZXIoe2JpZ2ludDp0aGlzLmR9KSxuZXcgcnQuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6dGhpcy5wfSksbmV3IHJ0LmFzbjEuREVSSW50ZWdlcih7YmlnaW50OnRoaXMucX0pLG5ldyBydC5hc24xLkRFUkludGVnZXIoe2JpZ2ludDp0aGlzLmRtcDF9KSxuZXcgcnQuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6dGhpcy5kbXExfSksbmV3IHJ0LmFzbjEuREVSSW50ZWdlcih7YmlnaW50OnRoaXMuY29lZmZ9KV19O3JldHVybiBuZXcgcnQuYXNuMS5ERVJTZXF1ZW5jZSh0KS5nZXRFbmNvZGVkSGV4KCl9LGUucHJvdG90eXBlLmdldFByaXZhdGVCYXNlS2V5QjY0PWZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpcy5nZXRQcml2YXRlQmFzZUtleSgpKX0sZS5wcm90b3R5cGUuZ2V0UHVibGljQmFzZUtleT1mdW5jdGlvbigpe3ZhciB0PW5ldyBydC5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbbmV3IHJ0LmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOiIxLjIuODQwLjExMzU0OS4xLjEuMSJ9KSxuZXcgcnQuYXNuMS5ERVJOdWxsXX0pLGU9bmV3IHJ0LmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltuZXcgcnQuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6dGhpcy5ufSksbmV3IHJ0LmFzbjEuREVSSW50ZWdlcih7aW50OnRoaXMuZX0pXX0pLGk9bmV3IHJ0LmFzbjEuREVSQml0U3RyaW5nKHtoZXg6IjAwIitlLmdldEVuY29kZWRIZXgoKX0pO3JldHVybiBuZXcgcnQuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3QsaV19KS5nZXRFbmNvZGVkSGV4KCl9LGUucHJvdG90eXBlLmdldFB1YmxpY0Jhc2VLZXlCNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gcCh0aGlzLmdldFB1YmxpY0Jhc2VLZXkoKSl9LGUud29yZHdyYXA9ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdDt2YXIgaT0iKC57MSwiKyhlPWV8fDY0KSsifSkoICt8JFxuPyl8KC57MSwiK2UrIn0pIjtyZXR1cm4gdC5tYXRjaChSZWdFeHAoaSwiZyIpKS5qb2luKCJcbiIpfSxlLnByb3RvdHlwZS5nZXRQcml2YXRlS2V5PWZ1bmN0aW9uKCl7dmFyIHQ9Ii0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cbiI7cmV0dXJuKHQrPWUud29yZHdyYXAodGhpcy5nZXRQcml2YXRlQmFzZUtleUI2NCgpKSsiXG4iKSsiLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0ifSxlLnByb3RvdHlwZS5nZXRQdWJsaWNLZXk9ZnVuY3Rpb24oKXt2YXIgdD0iLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbiI7cmV0dXJuKHQrPWUud29yZHdyYXAodGhpcy5nZXRQdWJsaWNCYXNlS2V5QjY0KCkpKyJcbiIpKyItLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0ifSxlLmhhc1B1YmxpY0tleVByb3BlcnR5PWZ1bmN0aW9uKHQpe3JldHVybih0PXR8fHt9KS5oYXNPd25Qcm9wZXJ0eSgibiIpJiZ0Lmhhc093blByb3BlcnR5KCJlIil9LGUuaGFzUHJpdmF0ZUtleVByb3BlcnR5PWZ1bmN0aW9uKHQpe3JldHVybih0PXR8fHt9KS5oYXNPd25Qcm9wZXJ0eSgibiIpJiZ0Lmhhc093blByb3BlcnR5KCJlIikmJnQuaGFzT3duUHJvcGVydHkoImQiKSYmdC5oYXNPd25Qcm9wZXJ0eSgicCIpJiZ0Lmhhc093blByb3BlcnR5KCJxIikmJnQuaGFzT3duUHJvcGVydHkoImRtcDEiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiZG1xMSIpJiZ0Lmhhc093blByb3BlcnR5KCJjb2VmZiIpfSxlLnByb3RvdHlwZS5wYXJzZVByb3BlcnRpZXNGcm9tPWZ1bmN0aW9uKHQpe3RoaXMubj10Lm4sdGhpcy5lPXQuZSx0Lmhhc093blByb3BlcnR5KCJkIikmJih0aGlzLmQ9dC5kLHRoaXMucD10LnAsdGhpcy5xPXQucSx0aGlzLmRtcDE9dC5kbXAxLHRoaXMuZG1xMT10LmRtcTEsdGhpcy5jb2VmZj10LmNvZWZmKX0sZX0odHQpLGF0PWkoMTU1KSx1dD12b2lkIDAhPT1hdD9udWxsPT09KHN0PWF0LmVudil8fHZvaWQgMD09PXN0P3ZvaWQgMDoiMy4zLjIiOnZvaWQgMDtjb25zdCBjdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHQ9dHx8e30sdGhpcy5kZWZhdWx0X2tleV9zaXplPXQuZGVmYXVsdF9rZXlfc2l6ZT9wYXJzZUludCh0LmRlZmF1bHRfa2V5X3NpemUsMTApOjEwMjQsdGhpcy5kZWZhdWx0X3B1YmxpY19leHBvbmVudD10LmRlZmF1bHRfcHVibGljX2V4cG9uZW50fHwiMDEwMDAxIix0aGlzLmxvZz10LmxvZ3x8ITEsdGhpcy5rZXk9bnVsbH1yZXR1cm4gdC5wcm90b3R5cGUuc2V0S2V5PWZ1bmN0aW9uKHQpe3RoaXMubG9nJiZ0aGlzLmtleSYmY29uc29sZS53YXJuKCJBIGtleSB3YXMgYWxyZWFkeSBzZXQsIG92ZXJyaWRpbmcgZXhpc3RpbmcuIiksdGhpcy5rZXk9bmV3IGh0KHQpfSx0LnByb3RvdHlwZS5zZXRQcml2YXRlS2V5PWZ1bmN0aW9uKHQpe3RoaXMuc2V0S2V5KHQpfSx0LnByb3RvdHlwZS5zZXRQdWJsaWNLZXk9ZnVuY3Rpb24odCl7dGhpcy5zZXRLZXkodCl9LHQucHJvdG90eXBlLmRlY3J5cHQ9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0aGlzLmdldEtleSgpLmRlY3J5cHQoZyh0KSl9Y2F0Y2godCl7cmV0dXJuITF9fSx0LnByb3RvdHlwZS5lbmNyeXB0PWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gcCh0aGlzLmdldEtleSgpLmVuY3J5cHQodCkpfWNhdGNoKHQpe3JldHVybiExfX0sdC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0LGUsaSl7dHJ5e3JldHVybiBwKHRoaXMuZ2V0S2V5KCkuc2lnbih0LGUsaSkpfWNhdGNoKHQpe3JldHVybiExfX0sdC5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uKHQsZSxpKXt0cnl7cmV0dXJuIHRoaXMuZ2V0S2V5KCkudmVyaWZ5KHQsZyhlKSxpKX1jYXRjaCh0KXtyZXR1cm4hMX19LHQucHJvdG90eXBlLmdldEtleT1mdW5jdGlvbih0KXtpZighdGhpcy5rZXkpe2lmKHRoaXMua2V5PW5ldyBodCx0JiYiW29iamVjdCBGdW5jdGlvbl0iPT09e30udG9TdHJpbmcuY2FsbCh0KSlyZXR1cm4gdm9pZCB0aGlzLmtleS5nZW5lcmF0ZUFzeW5jKHRoaXMuZGVmYXVsdF9rZXlfc2l6ZSx0aGlzLmRlZmF1bHRfcHVibGljX2V4cG9uZW50LHQpO3RoaXMua2V5LmdlbmVyYXRlKHRoaXMuZGVmYXVsdF9rZXlfc2l6ZSx0aGlzLmRlZmF1bHRfcHVibGljX2V4cG9uZW50KX1yZXR1cm4gdGhpcy5rZXl9LHQucHJvdG90eXBlLmdldFByaXZhdGVLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRLZXkoKS5nZXRQcml2YXRlS2V5KCl9LHQucHJvdG90eXBlLmdldFByaXZhdGVLZXlCNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRLZXkoKS5nZXRQcml2YXRlQmFzZUtleUI2NCgpfSx0LnByb3RvdHlwZS5nZXRQdWJsaWNLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRLZXkoKS5nZXRQdWJsaWNLZXkoKX0sdC5wcm90b3R5cGUuZ2V0UHVibGljS2V5QjY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0S2V5KCkuZ2V0UHVibGljQmFzZUtleUI2NCgpfSx0LnZlcnNpb249dXQsdH0oKX0pKCksci5kZWZhdWx0fSkoKSkpOw==';
document.head.appendChild(script);
// https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js
const script2 = document.createElement('script');
script2.src = 'data:text/plain;base64,IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWV4cG9ydHM9ZSgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGUpOnQuQ3J5cHRvSlM9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7dmFyIG4sbyxzLGEsaCx0LGUsbCxyLGksYyxmLGQsdSxwLFMseCxiLEEsSCx6LF8sdixnLHksQix3LGssbSxDLEQsRSxSLE0sRixQLFcsTyxJLFU9VXx8ZnVuY3Rpb24oaCl7dmFyIGk7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jcnlwdG8mJihpPXdpbmRvdy5jcnlwdG8pLCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5jcnlwdG8mJihpPXNlbGYuY3J5cHRvKSwhKGk9IShpPSEoaT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMuY3J5cHRvP2dsb2JhbFRoaXMuY3J5cHRvOmkpJiYidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm1zQ3J5cHRvP3dpbmRvdy5tc0NyeXB0bzppKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJmdsb2JhbC5jcnlwdG8/Z2xvYmFsLmNyeXB0bzppKSYmImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUpdHJ5e2k9cmVxdWlyZSgiY3J5cHRvIil9Y2F0Y2godCl7fXZhciByPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQpe3JldHVybiBlLnByb3RvdHlwZT10LHQ9bmV3IGUsZS5wcm90b3R5cGU9bnVsbCx0fTtmdW5jdGlvbiBlKCl7fXZhciB0PXt9LG49dC5saWI9e30sbz1uLkJhc2U9e2V4dGVuZDpmdW5jdGlvbih0KXt2YXIgZT1yKHRoaXMpO3JldHVybiB0JiZlLm1peEluKHQpLGUuaGFzT3duUHJvcGVydHkoImluaXQiKSYmdGhpcy5pbml0IT09ZS5pbml0fHwoZS5pbml0PWZ1bmN0aW9uKCl7ZS4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSwoZS5pbml0LnByb3RvdHlwZT1lKS4kc3VwZXI9dGhpcyxlfSxjcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmV4dGVuZCgpO3JldHVybiB0LmluaXQuYXBwbHkodCxhcmd1bWVudHMpLHR9LGluaXQ6ZnVuY3Rpb24oKXt9LG1peEluOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KXQuaGFzT3duUHJvcGVydHkoZSkmJih0aGlzW2VdPXRbZV0pO3QuaGFzT3duUHJvcGVydHkoInRvU3RyaW5nIikmJih0aGlzLnRvU3RyaW5nPXQudG9TdHJpbmcpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKX19LGw9bi5Xb3JkQXJyYXk9by5leHRlbmQoe2luaXQ6ZnVuY3Rpb24odCxlKXt0PXRoaXMud29yZHM9dHx8W10sdGhpcy5zaWdCeXRlcz1udWxsIT1lP2U6NCp0Lmxlbmd0aH0sdG9TdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuKHR8fGMpLnN0cmluZ2lmeSh0aGlzKX0sY29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMud29yZHMscj10LndvcmRzLGk9dGhpcy5zaWdCeXRlcyxuPXQuc2lnQnl0ZXM7aWYodGhpcy5jbGFtcCgpLGklNClmb3IodmFyIG89MDtvPG47bysrKXt2YXIgcz1yW28+Pj4yXT4+PjI0LW8lNCo4JjI1NTtlW2krbz4+PjJdfD1zPDwyNC0oaStvKSU0Kjh9ZWxzZSBmb3IodmFyIGM9MDtjPG47Yys9NCllW2krYz4+PjJdPXJbYz4+PjJdO3JldHVybiB0aGlzLnNpZ0J5dGVzKz1uLHRoaXN9LGNsYW1wOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53b3JkcyxlPXRoaXMuc2lnQnl0ZXM7dFtlPj4+Ml0mPTQyOTQ5NjcyOTU8PDMyLWUlNCo4LHQubGVuZ3RoPWguY2VpbChlLzQpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciB0PW8uY2xvbmUuY2FsbCh0aGlzKTtyZXR1cm4gdC53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApLHR9LHJhbmRvbTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dDtyKz00KWUucHVzaChmdW5jdGlvbigpe2lmKGkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpLmdldFJhbmRvbVZhbHVlcyl0cnl7cmV0dXJuIGkuZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF19Y2F0Y2godCl7fWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBpLnJhbmRvbUJ5dGVzKXRyeXtyZXR1cm4gaS5yYW5kb21CeXRlcyg0KS5yZWFkSW50MzJMRSgpfWNhdGNoKHQpe319dGhyb3cgbmV3IEVycm9yKCJOYXRpdmUgY3J5cHRvIG1vZHVsZSBjb3VsZCBub3QgYmUgdXNlZCB0byBnZXQgc2VjdXJlIHJhbmRvbSBudW1iZXIuIil9KCkpO3JldHVybiBuZXcgbC5pbml0KGUsdCl9fSkscz10LmVuYz17fSxjPXMuSGV4PXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQud29yZHMscj10LnNpZ0J5dGVzLGk9W10sbj0wO248cjtuKyspe3ZhciBvPWVbbj4+PjJdPj4+MjQtbiU0KjgmMjU1O2kucHVzaCgobz4+PjQpLnRvU3RyaW5nKDE2KSksaS5wdXNoKCgxNSZvKS50b1N0cmluZygxNikpfXJldHVybiBpLmpvaW4oIiIpfSxwYXJzZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1bXSxpPTA7aTxlO2krPTIpcltpPj4+M118PXBhcnNlSW50KHQuc3Vic3RyKGksMiksMTYpPDwyNC1pJTgqNDtyZXR1cm4gbmV3IGwuaW5pdChyLGUvMil9fSxhPXMuTGF0aW4xPXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQud29yZHMscj10LnNpZ0J5dGVzLGk9W10sbj0wO248cjtuKyspe3ZhciBvPWVbbj4+PjJdPj4+MjQtbiU0KjgmMjU1O2kucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKG8pKX1yZXR1cm4gaS5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9W10saT0wO2k8ZTtpKyspcltpPj4+Ml18PSgyNTUmdC5jaGFyQ29kZUF0KGkpKTw8MjQtaSU0Kjg7cmV0dXJuIG5ldyBsLmluaXQocixlKX19LGY9cy5VdGY4PXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGEuc3RyaW5naWZ5KHQpKSl9Y2F0Y2godCl7dGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgVVRGLTggZGF0YSIpfX0scGFyc2U6ZnVuY3Rpb24odCl7cmV0dXJuIGEucGFyc2UodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQpKSl9fSxkPW4uQnVmZmVyZWRCbG9ja0FsZ29yaXRobT1vLmV4dGVuZCh7cmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhPW5ldyBsLmluaXQsdGhpcy5fbkRhdGFCeXRlcz0wfSxfYXBwZW5kOmZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9Zi5wYXJzZSh0KSksdGhpcy5fZGF0YS5jb25jYXQodCksdGhpcy5fbkRhdGFCeXRlcys9dC5zaWdCeXRlc30sX3Byb2Nlc3M6ZnVuY3Rpb24odCl7dmFyIGUscj10aGlzLl9kYXRhLGk9ci53b3JkcyxuPXIuc2lnQnl0ZXMsbz10aGlzLmJsb2NrU2l6ZSxzPW4vKDQqbyksYz0ocz10P2guY2VpbChzKTpoLm1heCgoMHxzKS10aGlzLl9taW5CdWZmZXJTaXplLDApKSpvLG49aC5taW4oNCpjLG4pO2lmKGMpe2Zvcih2YXIgYT0wO2E8YzthKz1vKXRoaXMuX2RvUHJvY2Vzc0Jsb2NrKGksYSk7ZT1pLnNwbGljZSgwLGMpLHIuc2lnQnl0ZXMtPW59cmV0dXJuIG5ldyBsLmluaXQoZSxuKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgdD1vLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIHQuX2RhdGE9dGhpcy5fZGF0YS5jbG9uZSgpLHR9LF9taW5CdWZmZXJTaXplOjB9KSx1PShuLkhhc2hlcj1kLmV4dGVuZCh7Y2ZnOm8uZXh0ZW5kKCksaW5pdDpmdW5jdGlvbih0KXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQodCksdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe2QucmVzZXQuY2FsbCh0aGlzKSx0aGlzLl9kb1Jlc2V0KCl9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXBwZW5kKHQpLHRoaXMuX3Byb2Nlc3MoKSx0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5fYXBwZW5kKHQpLHRoaXMuX2RvRmluYWxpemUoKX0sYmxvY2tTaXplOjE2LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyByLmluaXQoZSkuZmluYWxpemUodCl9fSxfY3JlYXRlSG1hY0hlbHBlcjpmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHUuSE1BQy5pbml0KHIsZSkuZmluYWxpemUodCl9fX0pLHQuYWxnbz17fSk7cmV0dXJuIHR9KE1hdGgpO2Z1bmN0aW9uIEsodCxlLHIpe3JldHVybiB0JmV8fnQmcn1mdW5jdGlvbiBYKHQsZSxyKXtyZXR1cm4gdCZyfGUmfnJ9ZnVuY3Rpb24gTCh0LGUpe3JldHVybiB0PDxlfHQ+Pj4zMi1lfWZ1bmN0aW9uIGoodCxlLHIsaSl7dmFyIG4sbz10aGlzLl9pdjtvPyhuPW8uc2xpY2UoMCksdGhpcy5faXY9dm9pZCAwKTpuPXRoaXMuX3ByZXZCbG9jayxpLmVuY3J5cHRCbG9jayhuLDApO2Zvcih2YXIgcz0wO3M8cjtzKyspdFtlK3NdXj1uW3NdfWZ1bmN0aW9uIFQodCl7dmFyIGUscixpO3JldHVybiAyNTU9PSh0Pj4yNCYyNTUpPyhyPXQ+PjgmMjU1LGk9MjU1JnQsMjU1PT09KGU9dD4+MTYmMjU1KT8oZT0wLDI1NT09PXI/KHI9MCwyNTU9PT1pP2k9MDorK2kpOisrcik6KytlLHQ9MCx0Kz1lPDwxNix0Kz1yPDw4LHQrPWkpOnQrPTE8PDI0LHR9ZnVuY3Rpb24gTigpe2Zvcih2YXIgdD10aGlzLl9YLGU9dGhpcy5fQyxyPTA7cjw4O3IrKylFW3JdPWVbcl07ZVswXT1lWzBdKzEyOTUzMDc1OTcrdGhpcy5fYnwwLGVbMV09ZVsxXSszNTQ1MDUyMzcxKyhlWzBdPj4+MDxFWzBdPj4+MD8xOjApfDAsZVsyXT1lWzJdKzg4NjI2MzA5MisoZVsxXT4+PjA8RVsxXT4+PjA/MTowKXwwLGVbM109ZVszXSsxMjk1MzA3NTk3KyhlWzJdPj4+MDxFWzJdPj4+MD8xOjApfDAsZVs0XT1lWzRdKzM1NDUwNTIzNzErKGVbM10+Pj4wPEVbM10+Pj4wPzE6MCl8MCxlWzVdPWVbNV0rODg2MjYzMDkyKyhlWzRdPj4+MDxFWzRdPj4+MD8xOjApfDAsZVs2XT1lWzZdKzEyOTUzMDc1OTcrKGVbNV0+Pj4wPEVbNV0+Pj4wPzE6MCl8MCxlWzddPWVbN10rMzU0NTA1MjM3MSsoZVs2XT4+PjA8RVs2XT4+PjA/MTowKXwwLHRoaXMuX2I9ZVs3XT4+PjA8RVs3XT4+PjA/MTowO2ZvcihyPTA7cjw4O3IrKyl7dmFyIGk9dFtyXStlW3JdLG49NjU1MzUmaSxvPWk+Pj4xNjtSW3JdPSgobipuPj4+MTcpK24qbz4+PjE1KStvKm9eKCg0Mjk0OTAxNzYwJmkpKml8MCkrKCg2NTUzNSZpKSppfDApfXRbMF09UlswXSsoUls3XTw8MTZ8Uls3XT4+PjE2KSsoUls2XTw8MTZ8Uls2XT4+PjE2KXwwLHRbMV09UlsxXSsoUlswXTw8OHxSWzBdPj4+MjQpK1JbN118MCx0WzJdPVJbMl0rKFJbMV08PDE2fFJbMV0+Pj4xNikrKFJbMF08PDE2fFJbMF0+Pj4xNil8MCx0WzNdPVJbM10rKFJbMl08PDh8UlsyXT4+PjI0KStSWzFdfDAsdFs0XT1SWzRdKyhSWzNdPDwxNnxSWzNdPj4+MTYpKyhSWzJdPDwxNnxSWzJdPj4+MTYpfDAsdFs1XT1SWzVdKyhSWzRdPDw4fFJbNF0+Pj4yNCkrUlszXXwwLHRbNl09Uls2XSsoUls1XTw8MTZ8Uls1XT4+PjE2KSsoUls0XTw8MTZ8Uls0XT4+PjE2KXwwLHRbN109Uls3XSsoUls2XTw8OHxSWzZdPj4+MjQpK1JbNV18MH1mdW5jdGlvbiBxKCl7Zm9yKHZhciB0PXRoaXMuX1gsZT10aGlzLl9DLHI9MDtyPDg7cisrKU9bcl09ZVtyXTtlWzBdPWVbMF0rMTI5NTMwNzU5Nyt0aGlzLl9ifDAsZVsxXT1lWzFdKzM1NDUwNTIzNzErKGVbMF0+Pj4wPE9bMF0+Pj4wPzE6MCl8MCxlWzJdPWVbMl0rODg2MjYzMDkyKyhlWzFdPj4+MDxPWzFdPj4+MD8xOjApfDAsZVszXT1lWzNdKzEyOTUzMDc1OTcrKGVbMl0+Pj4wPE9bMl0+Pj4wPzE6MCl8MCxlWzRdPWVbNF0rMzU0NTA1MjM3MSsoZVszXT4+PjA8T1szXT4+PjA/MTowKXwwLGVbNV09ZVs1XSs4ODYyNjMwOTIrKGVbNF0+Pj4wPE9bNF0+Pj4wPzE6MCl8MCxlWzZdPWVbNl0rMTI5NTMwNzU5NysoZVs1XT4+PjA8T1s1XT4+PjA/MTowKXwwLGVbN109ZVs3XSszNTQ1MDUyMzcxKyhlWzZdPj4+MDxPWzZdPj4+MD8xOjApfDAsdGhpcy5fYj1lWzddPj4+MDxPWzddPj4+MD8xOjA7Zm9yKHI9MDtyPDg7cisrKXt2YXIgaT10W3JdK2Vbcl0sbj02NTUzNSZpLG89aT4+PjE2O0lbcl09KChuKm4+Pj4xNykrbipvPj4+MTUpK28qb14oKDQyOTQ5MDE3NjAmaSkqaXwwKSsoKDY1NTM1JmkpKml8MCl9dFswXT1JWzBdKyhJWzddPDwxNnxJWzddPj4+MTYpKyhJWzZdPDwxNnxJWzZdPj4+MTYpfDAsdFsxXT1JWzFdKyhJWzBdPDw4fElbMF0+Pj4yNCkrSVs3XXwwLHRbMl09SVsyXSsoSVsxXTw8MTZ8SVsxXT4+PjE2KSsoSVswXTw8MTZ8SVswXT4+PjE2KXwwLHRbM109SVszXSsoSVsyXTw8OHxJWzJdPj4+MjQpK0lbMV18MCx0WzRdPUlbNF0rKElbM108PDE2fElbM10+Pj4xNikrKElbMl08PDE2fElbMl0+Pj4xNil8MCx0WzVdPUlbNV0rKElbNF08PDh8SVs0XT4+PjI0KStJWzNdfDAsdFs2XT1JWzZdKyhJWzVdPDwxNnxJWzVdPj4+MTYpKyhJWzRdPDwxNnxJWzRdPj4+MTYpfDAsdFs3XT1JWzddKyhJWzZdPDw4fElbNl0+Pj4yNCkrSVs1XXwwfXJldHVybiBGPShNPVUpLmxpYixuPUYuQmFzZSxvPUYuV29yZEFycmF5LChNPU0ueDY0PXt9KS5Xb3JkPW4uZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKHQsZSl7dGhpcy5oaWdoPXQsdGhpcy5sb3c9ZX19KSxNLldvcmRBcnJheT1uLmV4dGVuZCh7aW5pdDpmdW5jdGlvbih0LGUpe3Q9dGhpcy53b3Jkcz10fHxbXSx0aGlzLnNpZ0J5dGVzPW51bGwhPWU/ZTo4KnQubGVuZ3RofSx0b1gzMjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLndvcmRzLGU9dC5sZW5ndGgscj1bXSxpPTA7aTxlO2krKyl7dmFyIG49dFtpXTtyLnB1c2gobi5oaWdoKSxyLnB1c2gobi5sb3cpfXJldHVybiBvLmNyZWF0ZShyLHRoaXMuc2lnQnl0ZXMpfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1uLmNsb25lLmNhbGwodGhpcyksZT10LndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCkscj1lLmxlbmd0aCxpPTA7aTxyO2krKyllW2ldPWVbaV0uY2xvbmUoKTtyZXR1cm4gdH19KSwiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXImJihQPVUubGliLldvcmRBcnJheSxzPVAuaW5pdCwoUC5pbml0PWZ1bmN0aW9uKHQpe2lmKCh0PSh0PXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9uZXcgVWludDhBcnJheSh0KTp0KWluc3RhbmNlb2YgSW50OEFycmF5fHwidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiZ0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXl8fHQgaW5zdGFuY2VvZiBJbnQxNkFycmF5fHx0IGluc3RhbmNlb2YgVWludDE2QXJyYXl8fHQgaW5zdGFuY2VvZiBJbnQzMkFycmF5fHx0IGluc3RhbmNlb2YgVWludDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXk/bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCk6dClpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2Zvcih2YXIgZT10LmJ5dGVMZW5ndGgscj1bXSxpPTA7aTxlO2krKylyW2k+Pj4yXXw9dFtpXTw8MjQtaSU0Kjg7cy5jYWxsKHRoaXMscixlKX1lbHNlIHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkucHJvdG90eXBlPVApLGZ1bmN0aW9uKCl7dmFyIHQ9VSxuPXQubGliLldvcmRBcnJheSx0PXQuZW5jO3QuVXRmMTY9dC5VdGYxNkJFPXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQud29yZHMscj10LnNpZ0J5dGVzLGk9W10sbj0wO248cjtuKz0yKXt2YXIgbz1lW24+Pj4yXT4+PjE2LW4lNCo4JjY1NTM1O2kucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKG8pKX1yZXR1cm4gaS5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9W10saT0wO2k8ZTtpKyspcltpPj4+MV18PXQuY2hhckNvZGVBdChpKTw8MTYtaSUyKjE2O3JldHVybiBuLmNyZWF0ZShyLDIqZSl9fTtmdW5jdGlvbiBzKHQpe3JldHVybiB0PDw4JjQyNzgyNTUzNjB8dD4+PjgmMTY3MTE5MzV9dC5VdGYxNkxFPXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQud29yZHMscj10LnNpZ0J5dGVzLGk9W10sbj0wO248cjtuKz0yKXt2YXIgbz1zKGVbbj4+PjJdPj4+MTYtbiU0KjgmNjU1MzUpO2kucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKG8pKX1yZXR1cm4gaS5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9W10saT0wO2k8ZTtpKyspcltpPj4+MV18PXModC5jaGFyQ29kZUF0KGkpPDwxNi1pJTIqMTYpO3JldHVybiBuLmNyZWF0ZShyLDIqZSl9fX0oKSxhPSh3PVUpLmxpYi5Xb3JkQXJyYXksdy5lbmMuQmFzZTY0PXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7dmFyIGU9dC53b3JkcyxyPXQuc2lnQnl0ZXMsaT10aGlzLl9tYXA7dC5jbGFtcCgpO2Zvcih2YXIgbj1bXSxvPTA7bzxyO28rPTMpZm9yKHZhciBzPShlW28+Pj4yXT4+PjI0LW8lNCo4JjI1NSk8PDE2fChlW28rMT4+PjJdPj4+MjQtKG8rMSklNCo4JjI1NSk8PDh8ZVtvKzI+Pj4yXT4+PjI0LShvKzIpJTQqOCYyNTUsYz0wO2M8NCYmbysuNzUqYzxyO2MrKyluLnB1c2goaS5jaGFyQXQocz4+PjYqKDMtYykmNjMpKTt2YXIgYT1pLmNoYXJBdCg2NCk7aWYoYSlmb3IoO24ubGVuZ3RoJTQ7KW4ucHVzaChhKTtyZXR1cm4gbi5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj10aGlzLl9tYXA7aWYoIShpPXRoaXMuX3JldmVyc2VNYXApKWZvcih2YXIgaT10aGlzLl9yZXZlcnNlTWFwPVtdLG49MDtuPHIubGVuZ3RoO24rKylpW3IuY2hhckNvZGVBdChuKV09bjt2YXIgbz1yLmNoYXJBdCg2NCk7cmV0dXJuIW98fC0xIT09KG89dC5pbmRleE9mKG8pKSYmKGU9byksZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgaT1bXSxuPTAsbz0wO288ZTtvKyspe3ZhciBzLGM7byU0JiYocz1yW3QuY2hhckNvZGVBdChvLTEpXTw8byU0KjIsYz1yW3QuY2hhckNvZGVBdChvKV0+Pj42LW8lNCoyLGM9c3xjLGlbbj4+PjJdfD1jPDwyNC1uJTQqOCxuKyspfXJldHVybiBhLmNyZWF0ZShpLG4pfSh0LGUsaSl9LF9tYXA6IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89In0saD0oRj1VKS5saWIuV29yZEFycmF5LEYuZW5jLkJhc2U2NHVybD17c3RyaW5naWZ5OmZ1bmN0aW9uKHQsZT0hMCl7dmFyIHI9dC53b3JkcyxpPXQuc2lnQnl0ZXMsbj1lP3RoaXMuX3NhZmVfbWFwOnRoaXMuX21hcDt0LmNsYW1wKCk7Zm9yKHZhciBvPVtdLHM9MDtzPGk7cys9Mylmb3IodmFyIGM9KHJbcz4+PjJdPj4+MjQtcyU0KjgmMjU1KTw8MTZ8KHJbcysxPj4+Ml0+Pj4yNC0ocysxKSU0KjgmMjU1KTw8OHxyW3MrMj4+PjJdPj4+MjQtKHMrMiklNCo4JjI1NSxhPTA7YTw0JiZzKy43NSphPGk7YSsrKW8ucHVzaChuLmNoYXJBdChjPj4+NiooMy1hKSY2MykpO3ZhciBoPW4uY2hhckF0KDY0KTtpZihoKWZvcig7by5sZW5ndGglNDspby5wdXNoKGgpO3JldHVybiBvLmpvaW4oIiIpfSxwYXJzZTpmdW5jdGlvbih0LGU9ITApe3ZhciByPXQubGVuZ3RoLGk9ZT90aGlzLl9zYWZlX21hcDp0aGlzLl9tYXA7aWYoIShuPXRoaXMuX3JldmVyc2VNYXApKWZvcih2YXIgbj10aGlzLl9yZXZlcnNlTWFwPVtdLG89MDtvPGkubGVuZ3RoO28rKyluW2kuY2hhckNvZGVBdChvKV09bztlPWkuY2hhckF0KDY0KTtyZXR1cm4hZXx8LTEhPT0oZT10LmluZGV4T2YoZSkpJiYocj1lKSxmdW5jdGlvbih0LGUscil7Zm9yKHZhciBpPVtdLG49MCxvPTA7bzxlO28rKyl7dmFyIHMsYztvJTQmJihzPXJbdC5jaGFyQ29kZUF0KG8tMSldPDxvJTQqMixjPXJbdC5jaGFyQ29kZUF0KG8pXT4+PjYtbyU0KjIsYz1zfGMsaVtuPj4+Ml18PWM8PDI0LW4lNCo4LG4rKyl9cmV0dXJuIGguY3JlYXRlKGksbil9KHQscixuKX0sX21hcDoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLF9zYWZlX21hcDoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXyJ9LGZ1bmN0aW9uKGEpe3ZhciB0PVUsZT10LmxpYixyPWUuV29yZEFycmF5LGk9ZS5IYXNoZXIsZT10LmFsZ28sQT1bXTshZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PDY0O3QrKylBW3RdPTQyOTQ5NjcyOTYqYS5hYnMoYS5zaW4odCsxKSl8MH0oKTtlPWUuTUQ1PWkuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IHIuaW5pdChbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4XSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wO3I8MTY7cisrKXt2YXIgaT1lK3Isbj10W2ldO3RbaV09MTY3MTE5MzUmKG48PDh8bj4+PjI0KXw0Mjc4MjU1MzYwJihuPDwyNHxuPj4+OCl9dmFyIG89dGhpcy5faGFzaC53b3JkcyxzPXRbZSswXSxjPXRbZSsxXSxhPXRbZSsyXSxoPXRbZSszXSxsPXRbZSs0XSxmPXRbZSs1XSxkPXRbZSs2XSx1PXRbZSs3XSxwPXRbZSs4XSxfPXRbZSs5XSx5PXRbZSsxMF0sdj10W2UrMTFdLGc9dFtlKzEyXSxCPXRbZSsxM10sdz10W2UrMTRdLGs9dFtlKzE1XSxtPUgobT1vWzBdLGI9b1sxXSx4PW9bMl0sUz1vWzNdLHMsNyxBWzBdKSxTPUgoUyxtLGIseCxjLDEyLEFbMV0pLHg9SCh4LFMsbSxiLGEsMTcsQVsyXSksYj1IKGIseCxTLG0saCwyMixBWzNdKTttPUgobSxiLHgsUyxsLDcsQVs0XSksUz1IKFMsbSxiLHgsZiwxMixBWzVdKSx4PUgoeCxTLG0sYixkLDE3LEFbNl0pLGI9SChiLHgsUyxtLHUsMjIsQVs3XSksbT1IKG0sYix4LFMscCw3LEFbOF0pLFM9SChTLG0sYix4LF8sMTIsQVs5XSkseD1IKHgsUyxtLGIseSwxNyxBWzEwXSksYj1IKGIseCxTLG0sdiwyMixBWzExXSksbT1IKG0sYix4LFMsZyw3LEFbMTJdKSxTPUgoUyxtLGIseCxCLDEyLEFbMTNdKSx4PUgoeCxTLG0sYix3LDE3LEFbMTRdKSxtPXoobSxiPUgoYix4LFMsbSxrLDIyLEFbMTVdKSx4LFMsYyw1LEFbMTZdKSxTPXooUyxtLGIseCxkLDksQVsxN10pLHg9eih4LFMsbSxiLHYsMTQsQVsxOF0pLGI9eihiLHgsUyxtLHMsMjAsQVsxOV0pLG09eihtLGIseCxTLGYsNSxBWzIwXSksUz16KFMsbSxiLHgseSw5LEFbMjFdKSx4PXooeCxTLG0sYixrLDE0LEFbMjJdKSxiPXooYix4LFMsbSxsLDIwLEFbMjNdKSxtPXoobSxiLHgsUyxfLDUsQVsyNF0pLFM9eihTLG0sYix4LHcsOSxBWzI1XSkseD16KHgsUyxtLGIsaCwxNCxBWzI2XSksYj16KGIseCxTLG0scCwyMCxBWzI3XSksbT16KG0sYix4LFMsQiw1LEFbMjhdKSxTPXooUyxtLGIseCxhLDksQVsyOV0pLHg9eih4LFMsbSxiLHUsMTQsQVszMF0pLG09QyhtLGI9eihiLHgsUyxtLGcsMjAsQVszMV0pLHgsUyxmLDQsQVszMl0pLFM9QyhTLG0sYix4LHAsMTEsQVszM10pLHg9Qyh4LFMsbSxiLHYsMTYsQVszNF0pLGI9QyhiLHgsUyxtLHcsMjMsQVszNV0pLG09QyhtLGIseCxTLGMsNCxBWzM2XSksUz1DKFMsbSxiLHgsbCwxMSxBWzM3XSkseD1DKHgsUyxtLGIsdSwxNixBWzM4XSksYj1DKGIseCxTLG0seSwyMyxBWzM5XSksbT1DKG0sYix4LFMsQiw0LEFbNDBdKSxTPUMoUyxtLGIseCxzLDExLEFbNDFdKSx4PUMoeCxTLG0sYixoLDE2LEFbNDJdKSxiPUMoYix4LFMsbSxkLDIzLEFbNDNdKSxtPUMobSxiLHgsUyxfLDQsQVs0NF0pLFM9QyhTLG0sYix4LGcsMTEsQVs0NV0pLHg9Qyh4LFMsbSxiLGssMTYsQVs0Nl0pLG09RChtLGI9QyhiLHgsUyxtLGEsMjMsQVs0N10pLHgsUyxzLDYsQVs0OF0pLFM9RChTLG0sYix4LHUsMTAsQVs0OV0pLHg9RCh4LFMsbSxiLHcsMTUsQVs1MF0pLGI9RChiLHgsUyxtLGYsMjEsQVs1MV0pLG09RChtLGIseCxTLGcsNixBWzUyXSksUz1EKFMsbSxiLHgsaCwxMCxBWzUzXSkseD1EKHgsUyxtLGIseSwxNSxBWzU0XSksYj1EKGIseCxTLG0sYywyMSxBWzU1XSksbT1EKG0sYix4LFMscCw2LEFbNTZdKSxTPUQoUyxtLGIseCxrLDEwLEFbNTddKSx4PUQoeCxTLG0sYixkLDE1LEFbNThdKSxiPUQoYix4LFMsbSxCLDIxLEFbNTldKSxtPUQobSxiLHgsUyxsLDYsQVs2MF0pLFM9RChTLG0sYix4LHYsMTAsQVs2MV0pLHg9RCh4LFMsbSxiLGEsMTUsQVs2Ml0pLGI9RChiLHgsUyxtLF8sMjEsQVs2M10pLG9bMF09b1swXSttfDAsb1sxXT1vWzFdK2J8MCxvWzJdPW9bMl0reHwwLG9bM109b1szXStTfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZGF0YSxlPXQud29yZHMscj04KnRoaXMuX25EYXRhQnl0ZXMsaT04KnQuc2lnQnl0ZXM7ZVtpPj4+NV18PTEyODw8MjQtaSUzMjt2YXIgbj1hLmZsb29yKHIvNDI5NDk2NzI5Nikscj1yO2VbMTUrKDY0K2k+Pj45PDw0KV09MTY3MTE5MzUmKG48PDh8bj4+PjI0KXw0Mjc4MjU1MzYwJihuPDwyNHxuPj4+OCksZVsxNCsoNjQraT4+Pjk8PDQpXT0xNjcxMTkzNSYocjw8OHxyPj4+MjQpfDQyNzgyNTUzNjAmKHI8PDI0fHI+Pj44KSx0LnNpZ0J5dGVzPTQqKGUubGVuZ3RoKzEpLHRoaXMuX3Byb2Nlc3MoKTtmb3IodmFyIGU9dGhpcy5faGFzaCxvPWUud29yZHMscz0wO3M8NDtzKyspe3ZhciBjPW9bc107b1tzXT0xNjcxMTkzNSYoYzw8OHxjPj4+MjQpfDQyNzgyNTUzNjAmKGM8PDI0fGM+Pj44KX1yZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgdD1pLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIHQuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpLHR9fSk7ZnVuY3Rpb24gSCh0LGUscixpLG4sbyxzKXtzPXQrKGUmcnx+ZSZpKStuK3M7cmV0dXJuKHM8PG98cz4+PjMyLW8pK2V9ZnVuY3Rpb24geih0LGUscixpLG4sbyxzKXtzPXQrKGUmaXxyJn5pKStuK3M7cmV0dXJuKHM8PG98cz4+PjMyLW8pK2V9ZnVuY3Rpb24gQyh0LGUscixpLG4sbyxzKXtzPXQrKGVecl5pKStuK3M7cmV0dXJuKHM8PG98cz4+PjMyLW8pK2V9ZnVuY3Rpb24gRCh0LGUscixpLG4sbyxzKXtzPXQrKHJeKGV8fmkpKStuK3M7cmV0dXJuKHM8PG98cz4+PjMyLW8pK2V9dC5NRDU9aS5fY3JlYXRlSGVscGVyKGUpLHQuSG1hY01ENT1pLl9jcmVhdGVIbWFjSGVscGVyKGUpfShNYXRoKSxQPShNPVUpLmxpYix0PVAuV29yZEFycmF5LGU9UC5IYXNoZXIsUD1NLmFsZ28sbD1bXSxQPVAuU0hBMT1lLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyB0LmluaXQoWzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OCwzMjg1Mzc3NTIwXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLl9oYXNoLndvcmRzLGk9clswXSxuPXJbMV0sbz1yWzJdLHM9clszXSxjPXJbNF0sYT0wO2E8ODA7YSsrKXthPDE2P2xbYV09MHx0W2UrYV06KGg9bFthLTNdXmxbYS04XV5sW2EtMTRdXmxbYS0xNl0sbFthXT1oPDwxfGg+Pj4zMSk7dmFyIGg9KGk8PDV8aT4+PjI3KStjK2xbYV07aCs9YTwyMD8xNTE4NTAwMjQ5KyhuJm98fm4mcyk6YTw0MD8xODU5Nzc1MzkzKyhuXm9ecyk6YTw2MD8obiZvfG4mc3xvJnMpLTE4OTQwMDc1ODg6KG5eb15zKS04OTk0OTc1MTQsYz1zLHM9byxvPW48PDMwfG4+Pj4yLG49aSxpPWh9clswXT1yWzBdK2l8MCxyWzFdPXJbMV0rbnwwLHJbMl09clsyXStvfDAsclszXT1yWzNdK3N8MCxyWzRdPXJbNF0rY3wwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEsZT10LndvcmRzLHI9OCp0aGlzLl9uRGF0YUJ5dGVzLGk9OCp0LnNpZ0J5dGVzO3JldHVybiBlW2k+Pj41XXw9MTI4PDwyNC1pJTMyLGVbMTQrKDY0K2k+Pj45PDw0KV09TWF0aC5mbG9vcihyLzQyOTQ5NjcyOTYpLGVbMTUrKDY0K2k+Pj45PDw0KV09cix0LnNpZ0J5dGVzPTQqZS5sZW5ndGgsdGhpcy5fcHJvY2VzcygpLHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSx0fX0pLE0uU0hBMT1lLl9jcmVhdGVIZWxwZXIoUCksTS5IbWFjU0hBMT1lLl9jcmVhdGVIbWFjSGVscGVyKFApLGZ1bmN0aW9uKG4pe3ZhciB0PVUsZT10LmxpYixyPWUuV29yZEFycmF5LGk9ZS5IYXNoZXIsZT10LmFsZ28sbz1bXSxwPVtdOyFmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIDQyOTQ5NjcyOTYqKHQtKDB8dCkpfDB9Zm9yKHZhciBlPTIscj0wO3I8NjQ7KSFmdW5jdGlvbih0KXtmb3IodmFyIGU9bi5zcXJ0KHQpLHI9MjtyPD1lO3IrKylpZighKHQlcikpcmV0dXJuO3JldHVybiAxfShlKXx8KHI8OCYmKG9bcl09dChuLnBvdyhlLC41KSkpLHBbcl09dChuLnBvdyhlLDEvMykpLHIrKyksZSsrfSgpO3ZhciBfPVtdLGU9ZS5TSEEyNTY9aS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgci5pbml0KG8uc2xpY2UoMCkpfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5faGFzaC53b3JkcyxpPXJbMF0sbj1yWzFdLG89clsyXSxzPXJbM10sYz1yWzRdLGE9cls1XSxoPXJbNl0sbD1yWzddLGY9MDtmPDY0O2YrKyl7ZjwxNj9fW2ZdPTB8dFtlK2ZdOihkPV9bZi0xNV0sdT1fW2YtMl0sX1tmXT0oKGQ8PDI1fGQ+Pj43KV4oZDw8MTR8ZD4+PjE4KV5kPj4+MykrX1tmLTddKygodTw8MTV8dT4+PjE3KV4odTw8MTN8dT4+PjE5KV51Pj4+MTApK19bZi0xNl0pO3ZhciBkPWkmbl5pJm9ebiZvLHU9bCsoKGM8PDI2fGM+Pj42KV4oYzw8MjF8Yz4+PjExKV4oYzw8N3xjPj4+MjUpKSsoYyZhXn5jJmgpK3BbZl0rX1tmXSxsPWgsaD1hLGE9YyxjPXMrdXwwLHM9byxvPW4sbj1pLGk9dSsoKChpPDwzMHxpPj4+MileKGk8PDE5fGk+Pj4xMyleKGk8PDEwfGk+Pj4yMikpK2QpfDB9clswXT1yWzBdK2l8MCxyWzFdPXJbMV0rbnwwLHJbMl09clsyXStvfDAsclszXT1yWzNdK3N8MCxyWzRdPXJbNF0rY3wwLHJbNV09cls1XSthfDAscls2XT1yWzZdK2h8MCxyWzddPXJbN10rbHwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEsZT10LndvcmRzLHI9OCp0aGlzLl9uRGF0YUJ5dGVzLGk9OCp0LnNpZ0J5dGVzO3JldHVybiBlW2k+Pj41XXw9MTI4PDwyNC1pJTMyLGVbMTQrKDY0K2k+Pj45PDw0KV09bi5mbG9vcihyLzQyOTQ5NjcyOTYpLGVbMTUrKDY0K2k+Pj45PDw0KV09cix0LnNpZ0J5dGVzPTQqZS5sZW5ndGgsdGhpcy5fcHJvY2VzcygpLHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9aS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSx0fX0pO3QuU0hBMjU2PWkuX2NyZWF0ZUhlbHBlcihlKSx0LkhtYWNTSEEyNTY9aS5fY3JlYXRlSG1hY0hlbHBlcihlKX0oTWF0aCkscj0odz1VKS5saWIuV29yZEFycmF5LEY9dy5hbGdvLGk9Ri5TSEEyNTYsRj1GLlNIQTIyND1pLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyByLmluaXQoWzMyMzgzNzEwMzIsOTE0MTUwNjYzLDgxMjcwMjk5OSw0MTQ0OTEyNjk3LDQyOTA3NzU4NTcsMTc1MDYwMzAyNSwxNjk0MDc2ODM5LDMyMDQwNzU0MjhdKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgdD1pLl9kb0ZpbmFsaXplLmNhbGwodGhpcyk7cmV0dXJuIHQuc2lnQnl0ZXMtPTQsdH19KSx3LlNIQTIyND1pLl9jcmVhdGVIZWxwZXIoRiksdy5IbWFjU0hBMjI0PWkuX2NyZWF0ZUhtYWNIZWxwZXIoRiksZnVuY3Rpb24oKXt2YXIgdD1VLGU9dC5saWIuSGFzaGVyLHI9dC54NjQsaT1yLldvcmQsbj1yLldvcmRBcnJheSxyPXQuYWxnbztmdW5jdGlvbiBvKCl7cmV0dXJuIGkuY3JlYXRlLmFwcGx5KGksYXJndW1lbnRzKX12YXIgdDE9W28oMTExNjM1MjQwOCwzNjA5NzY3NDU4KSxvKDE4OTk0NDc0NDEsNjAyODkxNzI1KSxvKDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSksbygzOTIxMDA5NTczLDIxNzMyOTU1NDgpLG8oOTYxOTg3MTYzLDQwODE2Mjg0NzIpLG8oMTUwODk3MDk5MywzMDUzODM0MjY1KSxvKDI0NTM2MzU3NDgsMjkzNzY3MTU3OSksbygyODcwNzYzMjIxLDM2NjQ2MDk1NjApLG8oMzYyNDM4MTA4MCwyNzM0ODgzMzk0KSxvKDMxMDU5ODQwMSwxMTY0OTk2NTQyKSxvKDYwNzIyNTI3OCwxMzIzNjEwNzY0KSxvKDE0MjY4ODE5ODcsMzU5MDMwNDk5NCksbygxOTI1MDc4Mzg4LDQwNjgxODIzODMpLG8oMjE2MjA3ODIwNiw5OTEzMzYxMTMpLG8oMjYxNDg4ODEwMyw2MzM4MDMzMTcpLG8oMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSxvKDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCksbyg0MDIyMjI0Nzc0LDk0NDcxMTEzOSksbygyNjQzNDcwNzgsMjM0MTI2Mjc3Myksbyg2MDQ4MDc2MjgsMjAwNzgwMDkzMyksbyg3NzAyNTU5ODMsMTQ5NTk5MDkwMSksbygxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLG8oMTU1NTA4MTY5MiwzMTc1MjE4MTMyKSxvKDE5OTYwNjQ5ODYsMjE5ODk1MDgzNyksbygyNTU0MjIwODgyLDM5OTk3MTkzMzkpLG8oMjgyMTgzNDM0OSw3NjY3ODQwMTYpLG8oMjk1Mjk5NjgwOCwyNTY2NTk0ODc5KSxvKDMyMTAzMTM2NzEsMzIwMzMzNzk1NiksbygzMzM2NTcxODkxLDEwMzQ0NTcwMjYpLG8oMzU4NDUyODcxMSwyNDY2OTQ4OTAxKSxvKDExMzkyNjk5MywzNzU4MzI2MzgzKSxvKDMzODI0MTg5NSwxNjg3MTc5MzYpLG8oNjY2MzA3MjA1LDExODgxNzk5NjQpLG8oNzczNTI5OTEyLDE1NDYwNDU3MzQpLG8oMTI5NDc1NzM3MiwxNTIyODA1NDg1KSxvKDEzOTYxODIyOTEsMjY0MzgzMzgyMyksbygxNjk1MTgzNzAwLDIzNDM1MjczOTApLG8oMTk4NjY2MTA1MSwxMDE0NDc3NDgwKSxvKDIxNzcwMjYzNTAsMTIwNjc1OTE0MiksbygyNDU2OTU2MDM3LDM0NDA3NzYyNyksbygyNzMwNDg1OTIxLDEyOTA4NjM0NjApLG8oMjgyMDMwMjQxMSwzMTU4NDU0MjczKSxvKDMyNTk3MzA4MDAsMzUwNTk1MjY1NyksbygzMzQ1NzY0NzcxLDEwNjIxNzAwOCksbygzNTE2MDY1ODE3LDM2MDYwMDgzNDQpLG8oMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSxvKDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCksbygyNzU0MjMzNDQsODUxMTY5NzIwKSxvKDQzMDIyNzczNCwzMTAwODIzNzUyKSxvKDUwNjk0ODYxNiwxMzYzMjU4MTk1KSxvKDY1OTA2MDU1NiwzNzUwNjg1NTkzKSxvKDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSxvKDk1ODEzOTU3MSwzMzE4MzA3NDI3KSxvKDEzMjI4MjIyMTgsMzgxMjcyMzQwMyksbygxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLG8oMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5KSxvKDE5NTU1NjIyMjIsMTU3NTk5MDAxMiksbygyMDI0MTA0ODE1LDExMjU1OTI5MjgpLG8oMjIyNzczMDQ1MiwyNzE2OTA0MzA2KSxvKDIzNjE4NTI0MjQsNDQyNzc2MDQ0KSxvKDI0Mjg0MzY0NzQsNTkzNjk4MzQ0KSxvKDI3NTY3MzQxODcsMzczMzExMDI0OSksbygzMjA0MDMxNDc5LDI5OTkzNTE1NzMpLG8oMzMyOTMyNTI5OCwzODE1OTIwNDI3KSxvKDMzOTE1Njk2MTQsMzkyODM4MzkwMCksbygzNTE1MjY3MjcxLDU2NjI4MDcxMSksbygzOTQwMTg3NjA2LDM0NTQwNjk1MzQpLG8oNDExODYzMDI3MSw0MDAwMjM5OTkyKSxvKDExNjQxODQ3NCwxOTE0MTM4NTU0KSxvKDE3NDI5MjQyMSwyNzMxMDU1MjcwKSxvKDI4OTM4MDM1NiwzMjAzOTkzMDA2KSxvKDQ2MDM5MzI2OSwzMjA2MjAzMTUpLG8oNjg1NDcxNzMzLDU4NzQ5NjgzNiksbyg4NTIxNDI5NzEsMTA4Njc5Mjg1MSksbygxMDE3MDM2Mjk4LDM2NTU0MzEwMCksbygxMTI2MDAwNTgwLDI2MTgyOTc2NzYpLG8oMTI4ODAzMzQ3MCwzNDA5ODU1MTU4KSxvKDE1MDE1MDU5NDgsNDIzNDUwOTg2NiksbygxNjA3MTY3OTE1LDk4NzE2NzQ2OCksbygxODE2NDAyMzE2LDEyNDYxODk1OTEpXSxlMT1bXTshZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PDgwO3QrKyllMVt0XT1vKCl9KCk7cj1yLlNIQTUxMj1lLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyBuLmluaXQoW25ldyBpLmluaXQoMTc3OTAzMzcwMyw0MDg5MjM1NzIwKSxuZXcgaS5pbml0KDMxNDQxMzQyNzcsMjIyNzg3MzU5NSksbmV3IGkuaW5pdCgxMDEzOTA0MjQyLDQyNzExNzU3MjMpLG5ldyBpLmluaXQoMjc3MzQ4MDc2MiwxNTk1NzUwMTI5KSxuZXcgaS5pbml0KDEzNTk4OTMxMTksMjkxNzU2NTEzNyksbmV3IGkuaW5pdCgyNjAwODIyOTI0LDcyNTUxMTE5OSksbmV3IGkuaW5pdCg1Mjg3MzQ2MzUsNDIxNTM4OTU0NyksbmV3IGkuaW5pdCgxNTQxNDU5MjI1LDMyNzAzMzIwOSldKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuX2hhc2gud29yZHMsaT1yWzBdLG49clsxXSxvPXJbMl0scz1yWzNdLGM9cls0XSxhPXJbNV0saD1yWzZdLGw9cls3XSxmPWkuaGlnaCxkPWkubG93LHU9bi5oaWdoLHA9bi5sb3csXz1vLmhpZ2gseT1vLmxvdyx2PXMuaGlnaCxnPXMubG93LEI9Yy5oaWdoLHc9Yy5sb3csaz1hLmhpZ2gsbT1hLmxvdyxTPWguaGlnaCx4PWgubG93LGI9bC5oaWdoLHI9bC5sb3csQT1mLEg9ZCx6PXUsQz1wLEQ9XyxFPXksUj12LE09ZyxGPUIsUD13LFc9ayxPPW0sST1TLFU9eCxLPWIsWD1yLEw9MDtMPDgwO0wrKyl7dmFyIGosVCxOPWUxW0xdO0w8MTY/KFQ9Ti5oaWdoPTB8dFtlKzIqTF0saj1OLmxvdz0wfHRbZSsyKkwrMV0pOigkPShxPWUxW0wtMTVdKS5oaWdoLEo9cS5sb3csRz0oUT1lMVtMLTJdKS5oaWdoLFY9US5sb3csWj0oWT1lMVtMLTddKS5oaWdoLHE9WS5sb3csWT0oUT1lMVtMLTE2XSkuaGlnaCxUPShUPSgoJD4+PjF8Sjw8MzEpXigkPj4+OHxKPDwyNCleJD4+PjcpK1orKChqPShaPShKPj4+MXwkPDwzMSleKEo+Pj44fCQ8PDI0KV4oSj4+Pjd8JDw8MjUpKStxKT4+PjA8Wj4+PjA/MTowKSkrKChHPj4+MTl8Vjw8MTMpXihHPDwzfFY+Pj4yOSleRz4+PjYpKygoais9Sj0oVj4+PjE5fEc8PDEzKV4oVjw8M3xHPj4+MjkpXihWPj4+NnxHPDwyNikpPj4+MDxKPj4+MD8xOjApLGorPSQ9US5sb3csTi5oaWdoPVQ9VCtZKyhqPj4+MDwkPj4+MD8xOjApLE4ubG93PWopO3ZhciBxPUYmV15+RiZJLFo9UCZPXn5QJlUsVj1BJnpeQSZEXnomRCxHPShIPj4+Mjh8QTw8NCleKEg8PDMwfEE+Pj4yKV4oSDw8MjV8QT4+PjcpLEo9dDFbTF0sUT1KLmhpZ2gsWT1KLmxvdywkPVgrKChQPj4+MTR8Rjw8MTgpXihQPj4+MTh8Rjw8MTQpXihQPDwyM3xGPj4+OSkpLE49SysoKEY+Pj4xNHxQPDwxOCleKEY+Pj4xOHxQPDwxNCleKEY8PDIzfFA+Pj45KSkrKCQ+Pj4wPFg+Pj4wPzE6MCksSj1HKyhIJkNeSCZFXkMmRSksSz1JLFg9VSxJPVcsVT1PLFc9RixPPVAsRj1SKyhOPShOPShOPU4rcSsoKCQ9JCtaKT4+PjA8Wj4+PjA/MTowKSkrUSsoKCQ9JCtZKT4+PjA8WT4+PjA/MTowKSkrVCsoKCQ9JCtqKT4+PjA8aj4+PjA/MTowKSkrKChQPU0rJHwwKT4+PjA8TT4+PjA/MTowKXwwLFI9RCxNPUUsRD16LEU9Qyx6PUEsQz1ILEE9TisoKChBPj4+Mjh8SDw8NCleKEE8PDMwfEg+Pj4yKV4oQTw8MjV8SD4+PjcpKStWKyhKPj4+MDxHPj4+MD8xOjApKSsoKEg9JCtKfDApPj4+MDwkPj4+MD8xOjApfDB9ZD1pLmxvdz1kK0gsaS5oaWdoPWYrQSsoZD4+PjA8SD4+PjA/MTowKSxwPW4ubG93PXArQyxuLmhpZ2g9dSt6KyhwPj4+MDxDPj4+MD8xOjApLHk9by5sb3c9eStFLG8uaGlnaD1fK0QrKHk+Pj4wPEU+Pj4wPzE6MCksZz1zLmxvdz1nK00scy5oaWdoPXYrUisoZz4+PjA8TT4+PjA/MTowKSx3PWMubG93PXcrUCxjLmhpZ2g9QitGKyh3Pj4+MDxQPj4+MD8xOjApLG09YS5sb3c9bStPLGEuaGlnaD1rK1crKG0+Pj4wPE8+Pj4wPzE6MCkseD1oLmxvdz14K1UsaC5oaWdoPVMrSSsoeD4+PjA8VT4+PjA/MTowKSxyPWwubG93PXIrWCxsLmhpZ2g9YitLKyhyPj4+MDxYPj4+MD8xOjApfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEsZT10LndvcmRzLHI9OCp0aGlzLl9uRGF0YUJ5dGVzLGk9OCp0LnNpZ0J5dGVzO3JldHVybiBlW2k+Pj41XXw9MTI4PDwyNC1pJTMyLGVbMzArKDEyOCtpPj4+MTA8PDUpXT1NYXRoLmZsb29yKHIvNDI5NDk2NzI5NiksZVszMSsoMTI4K2k+Pj4xMDw8NSldPXIsdC5zaWdCeXRlcz00KmUubGVuZ3RoLHRoaXMuX3Byb2Nlc3MoKSx0aGlzLl9oYXNoLnRvWDMyKCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSx0fSxibG9ja1NpemU6MzJ9KTt0LlNIQTUxMj1lLl9jcmVhdGVIZWxwZXIociksdC5IbWFjU0hBNTEyPWUuX2NyZWF0ZUhtYWNIZWxwZXIocil9KCksUD0oTT1VKS54NjQsYz1QLldvcmQsZj1QLldvcmRBcnJheSxQPU0uYWxnbyxkPVAuU0hBNTEyLFA9UC5TSEEzODQ9ZC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgZi5pbml0KFtuZXcgYy5pbml0KDM0MTgwNzAzNjUsMzIzODM3MTAzMiksbmV3IGMuaW5pdCgxNjU0MjcwMjUwLDkxNDE1MDY2MyksbmV3IGMuaW5pdCgyNDM4NTI5MzcwLDgxMjcwMjk5OSksbmV3IGMuaW5pdCgzNTU0NjIzNjAsNDE0NDkxMjY5NyksbmV3IGMuaW5pdCgxNzMxNDA1NDE1LDQyOTA3NzU4NTcpLG5ldyBjLmluaXQoMjM5NDE4MDIzMSwxNzUwNjAzMDI1KSxuZXcgYy5pbml0KDM2NzUwMDg1MjUsMTY5NDA3NjgzOSksbmV3IGMuaW5pdCgxMjAzMDYyODEzLDMyMDQwNzU0MjgpXSl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIHQ9ZC5fZG9GaW5hbGl6ZS5jYWxsKHRoaXMpO3JldHVybiB0LnNpZ0J5dGVzLT0xNix0fX0pLE0uU0hBMzg0PWQuX2NyZWF0ZUhlbHBlcihQKSxNLkhtYWNTSEEzODQ9ZC5fY3JlYXRlSG1hY0hlbHBlcihQKSxmdW5jdGlvbihsKXt2YXIgdD1VLGU9dC5saWIsZj1lLldvcmRBcnJheSxpPWUuSGFzaGVyLGQ9dC54NjQuV29yZCxlPXQuYWxnbyxBPVtdLEg9W10sej1bXTshZnVuY3Rpb24oKXtmb3IodmFyIHQ9MSxlPTAscj0wO3I8MjQ7cisrKXtBW3QrNSplXT0ocisxKSoocisyKS8yJTY0O3ZhciBpPSgyKnQrMyplKSU1O3Q9ZSU1LGU9aX1mb3IodD0wO3Q8NTt0KyspZm9yKGU9MDtlPDU7ZSsrKUhbdCs1KmVdPWUrKDIqdCszKmUpJTUqNTtmb3IodmFyIG49MSxvPTA7bzwyNDtvKyspe2Zvcih2YXIgcyxjPTAsYT0wLGg9MDtoPDc7aCsrKTEmbiYmKChzPSgxPDxoKS0xKTwzMj9hXj0xPDxzOmNePTE8PHMtMzIpLDEyOCZuP249bjw8MV4xMTM6bjw8PTE7eltvXT1kLmNyZWF0ZShjLGEpfX0oKTt2YXIgQz1bXTshZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PDI1O3QrKylDW3RdPWQuY3JlYXRlKCl9KCk7ZT1lLlNIQTM9aS5leHRlbmQoe2NmZzppLmNmZy5leHRlbmQoe291dHB1dExlbmd0aDo1MTJ9KSxfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9zdGF0ZT1bXSxlPTA7ZTwyNTtlKyspdFtlXT1uZXcgZC5pbml0O3RoaXMuYmxvY2tTaXplPSgxNjAwLTIqdGhpcy5jZmcub3V0cHV0TGVuZ3RoKS8zMn0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuX3N0YXRlLGk9dGhpcy5ibG9ja1NpemUvMixuPTA7bjxpO24rKyl7dmFyIG89dFtlKzIqbl0scz10W2UrMipuKzFdLG89MTY3MTE5MzUmKG88PDh8bz4+PjI0KXw0Mjc4MjU1MzYwJihvPDwyNHxvPj4+OCk7KG09cltuXSkuaGlnaF49cz0xNjcxMTkzNSYoczw8OHxzPj4+MjQpfDQyNzgyNTUzNjAmKHM8PDI0fHM+Pj44KSxtLmxvd149b31mb3IodmFyIGM9MDtjPDI0O2MrKyl7Zm9yKHZhciBhPTA7YTw1O2ErKyl7Zm9yKHZhciBoPTAsbD0wLGY9MDtmPDU7ZisrKWhePShtPXJbYSs1KmZdKS5oaWdoLGxePW0ubG93O3ZhciBkPUNbYV07ZC5oaWdoPWgsZC5sb3c9bH1mb3IoYT0wO2E8NTthKyspZm9yKHZhciB1PUNbKGErNCklNV0scD1DWyhhKzEpJTVdLF89cC5oaWdoLHA9cC5sb3csaD11LmhpZ2heKF88PDF8cD4+PjMxKSxsPXUubG93XihwPDwxfF8+Pj4zMSksZj0wO2Y8NTtmKyspKG09clthKzUqZl0pLmhpZ2hePWgsbS5sb3dePWw7Zm9yKHZhciB5PTE7eTwyNTt5Kyspe3ZhciB2PShtPXJbeV0pLmhpZ2gsZz1tLmxvdyxCPUFbeV07bD1CPDMyPyhoPXY8PEJ8Zz4+PjMyLUIsZzw8Qnx2Pj4+MzItQik6KGg9Zzw8Qi0zMnx2Pj4+NjQtQix2PDxCLTMyfGc+Pj42NC1CKTtCPUNbSFt5XV07Qi5oaWdoPWgsQi5sb3c9bH12YXIgdz1DWzBdLGs9clswXTt3LmhpZ2g9ay5oaWdoLHcubG93PWsubG93O2ZvcihhPTA7YTw1O2ErKylmb3IoZj0wO2Y8NTtmKyspe3ZhciBtPXJbeT1hKzUqZl0sUz1DW3ldLHg9Q1soYSsxKSU1KzUqZl0sYj1DWyhhKzIpJTUrNSpmXTttLmhpZ2g9Uy5oaWdoXn54LmhpZ2gmYi5oaWdoLG0ubG93PVMubG93Xn54LmxvdyZiLmxvd31tPXJbMF0saz16W2NdO20uaGlnaF49ay5oaWdoLG0ubG93Xj1rLmxvd319LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZGF0YSxlPXQud29yZHMscj0odGhpcy5fbkRhdGFCeXRlcyw4KnQuc2lnQnl0ZXMpLGk9MzIqdGhpcy5ibG9ja1NpemU7ZVtyPj4+NV18PTE8PDI0LXIlMzIsZVsobC5jZWlsKCgxK3IpL2kpKmk+Pj41KS0xXXw9MTI4LHQuc2lnQnl0ZXM9NCplLmxlbmd0aCx0aGlzLl9wcm9jZXNzKCk7Zm9yKHZhciBuPXRoaXMuX3N0YXRlLGU9dGhpcy5jZmcub3V0cHV0TGVuZ3RoLzgsbz1lLzgscz1bXSxjPTA7YzxvO2MrKyl7dmFyIGE9bltjXSxoPWEuaGlnaCxhPWEubG93LGg9MTY3MTE5MzUmKGg8PDh8aD4+PjI0KXw0Mjc4MjU1MzYwJihoPDwyNHxoPj4+OCk7cy5wdXNoKGE9MTY3MTE5MzUmKGE8PDh8YT4+PjI0KXw0Mjc4MjU1MzYwJihhPDwyNHxhPj4+OCkpLHMucHVzaChoKX1yZXR1cm4gbmV3IGYuaW5pdChzLGUpfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1pLmNsb25lLmNhbGwodGhpcyksZT10Ll9zdGF0ZT10aGlzLl9zdGF0ZS5zbGljZSgwKSxyPTA7cjwyNTtyKyspZVtyXT1lW3JdLmNsb25lKCk7cmV0dXJuIHR9fSk7dC5TSEEzPWkuX2NyZWF0ZUhlbHBlcihlKSx0LkhtYWNTSEEzPWkuX2NyZWF0ZUhtYWNIZWxwZXIoZSl9KE1hdGgpLE1hdGgsRj0odz1VKS5saWIsdT1GLldvcmRBcnJheSxwPUYuSGFzaGVyLEY9dy5hbGdvLFM9dS5jcmVhdGUoWzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10pLHg9dS5jcmVhdGUoWzUsMTQsNywwLDksMiwxMSw0LDEzLDYsMTUsOCwxLDEwLDMsMTIsNiwxMSwzLDcsMCwxMyw1LDEwLDE0LDE1LDgsMTIsNCw5LDEsMiwxNSw1LDEsMyw3LDE0LDYsOSwxMSw4LDEyLDIsMTAsMCw0LDEzLDgsNiw0LDEsMywxMSwxNSwwLDUsMTIsMiwxMyw5LDcsMTAsMTQsMTIsMTUsMTAsNCwxLDUsOCw3LDYsMiwxMywxNCwwLDMsOSwxMV0pLGI9dS5jcmVhdGUoWzExLDE0LDE1LDEyLDUsOCw3LDksMTEsMTMsMTQsMTUsNiw3LDksOCw3LDYsOCwxMywxMSw5LDcsMTUsNywxMiwxNSw5LDExLDcsMTMsMTIsMTEsMTMsNiw3LDE0LDksMTMsMTUsMTQsOCwxMyw2LDUsMTIsNyw1LDExLDEyLDE0LDE1LDE0LDE1LDksOCw5LDE0LDUsNiw4LDYsNSwxMiw5LDE1LDUsMTEsNiw4LDEzLDEyLDUsMTIsMTMsMTQsMTEsOCw1LDZdKSxBPXUuY3JlYXRlKFs4LDksOSwxMSwxMywxNSwxNSw1LDcsNyw4LDExLDE0LDE0LDEyLDYsOSwxMywxNSw3LDEyLDgsOSwxMSw3LDcsMTIsNyw2LDE1LDEzLDExLDksNywxNSwxMSw4LDYsNiwxNCwxMiwxMyw1LDE0LDEzLDEzLDcsNSwxNSw1LDgsMTEsMTQsMTQsNiwxNCw2LDksMTIsOSwxMiw1LDE1LDgsOCw1LDEyLDksMTIsNSwxNCw2LDgsMTMsNiw1LDE1LDEzLDExLDExXSksSD11LmNyZWF0ZShbMCwxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsMjQwMDk1OTcwOCwyODQwODUzODM4XSksej11LmNyZWF0ZShbMTM1MjgyOTkyNiwxNTQ4NjAzNjg0LDE4MzYwNzI2OTEsMjA1Mzk5NDIxNywwXSksRj1GLlJJUEVNRDE2MD1wLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPXUuY3JlYXRlKFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MDtyPDE2O3IrKyl7dmFyIGk9ZStyLG49dFtpXTt0W2ldPTE2NzExOTM1JihuPDw4fG4+Pj4yNCl8NDI3ODI1NTM2MCYobjw8MjR8bj4+PjgpfWZvcih2YXIgbyxzLGMsYSxoLGwsZj10aGlzLl9oYXNoLndvcmRzLGQ9SC53b3Jkcyx1PXoud29yZHMscD1TLndvcmRzLF89eC53b3Jkcyx5PWIud29yZHMsdj1BLndvcmRzLGc9bz1mWzBdLEI9cz1mWzFdLHc9Yz1mWzJdLGs9YT1mWzNdLG09aD1mWzRdLHI9MDtyPDgwO3IrPTEpbD1vK3RbZStwW3JdXXwwLGwrPXI8MTY/KHNeY15hKStkWzBdOnI8MzI/SyhzLGMsYSkrZFsxXTpyPDQ4Pygoc3x+YyleYSkrZFsyXTpyPDY0P1gocyxjLGEpK2RbM106KHNeKGN8fmEpKStkWzRdLGw9KGw9TChsfD0wLHlbcl0pKStofDAsbz1oLGg9YSxhPUwoYywxMCksYz1zLHM9bCxsPWcrdFtlK19bcl1dfDAsbCs9cjwxNj8oQl4od3x+aykpK3VbMF06cjwzMj9YKEIsdyxrKSt1WzFdOnI8NDg/KChCfH53KV5rKSt1WzJdOnI8NjQ/SyhCLHcsaykrdVszXTooQl53XmspK3VbNF0sbD0obD1MKGx8PTAsdltyXSkpK218MCxnPW0sbT1rLGs9TCh3LDEwKSx3PUIsQj1sO2w9ZlsxXStjK2t8MCxmWzFdPWZbMl0rYSttfDAsZlsyXT1mWzNdK2grZ3wwLGZbM109Zls0XStvK0J8MCxmWzRdPWZbMF0rcyt3fDAsZlswXT1sfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEsZT10LndvcmRzLHI9OCp0aGlzLl9uRGF0YUJ5dGVzLGk9OCp0LnNpZ0J5dGVzO2VbaT4+PjVdfD0xMjg8PDI0LWklMzIsZVsxNCsoNjQraT4+Pjk8PDQpXT0xNjcxMTkzNSYocjw8OHxyPj4+MjQpfDQyNzgyNTUzNjAmKHI8PDI0fHI+Pj44KSx0LnNpZ0J5dGVzPTQqKGUubGVuZ3RoKzEpLHRoaXMuX3Byb2Nlc3MoKTtmb3IodmFyIGU9dGhpcy5faGFzaCxuPWUud29yZHMsbz0wO288NTtvKyspe3ZhciBzPW5bb107bltvXT0xNjcxMTkzNSYoczw8OHxzPj4+MjQpfDQyNzgyNTUzNjAmKHM8PDI0fHM+Pj44KX1yZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgdD1wLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIHQuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpLHR9fSksdy5SSVBFTUQxNjA9cC5fY3JlYXRlSGVscGVyKEYpLHcuSG1hY1JJUEVNRDE2MD1wLl9jcmVhdGVIbWFjSGVscGVyKEYpLFA9KE09VSkubGliLkJhc2UsXz1NLmVuYy5VdGY4LE0uYWxnby5ITUFDPVAuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKHQsZSl7dD10aGlzLl9oYXNoZXI9bmV3IHQuaW5pdCwic3RyaW5nIj09dHlwZW9mIGUmJihlPV8ucGFyc2UoZSkpO3ZhciByPXQuYmxvY2tTaXplLGk9NCpyOyhlPWUuc2lnQnl0ZXM+aT90LmZpbmFsaXplKGUpOmUpLmNsYW1wKCk7Zm9yKHZhciB0PXRoaXMuX29LZXk9ZS5jbG9uZSgpLGU9dGhpcy5faUtleT1lLmNsb25lKCksbj10LndvcmRzLG89ZS53b3JkcyxzPTA7czxyO3MrKyluW3NdXj0xNTQ5NTU2ODI4LG9bc11ePTkwOTUyMjQ4Njt0LnNpZ0J5dGVzPWUuc2lnQnl0ZXM9aSx0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faGFzaGVyO3QucmVzZXQoKSx0LnVwZGF0ZSh0aGlzLl9pS2V5KX0sdXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9oYXNoZXIudXBkYXRlKHQpLHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2hhc2hlcix0PWUuZmluYWxpemUodCk7cmV0dXJuIGUucmVzZXQoKSxlLmZpbmFsaXplKHRoaXMuX29LZXkuY2xvbmUoKS5jb25jYXQodCkpfX0pLEY9KHc9VSkubGliLE09Ri5CYXNlLHY9Ri5Xb3JkQXJyYXksUD13LmFsZ28sRj1QLlNIQTEsZz1QLkhNQUMseT1QLlBCS0RGMj1NLmV4dGVuZCh7Y2ZnOk0uZXh0ZW5kKHtrZXlTaXplOjQsaGFzaGVyOkYsaXRlcmF0aW9uczoxfSksaW5pdDpmdW5jdGlvbih0KXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQodCl9LGNvbXB1dGU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5jZmcsaT1nLmNyZWF0ZShyLmhhc2hlcix0KSxuPXYuY3JlYXRlKCksbz12LmNyZWF0ZShbMV0pLHM9bi53b3JkcyxjPW8ud29yZHMsYT1yLmtleVNpemUsaD1yLml0ZXJhdGlvbnM7cy5sZW5ndGg8YTspe3ZhciBsPWkudXBkYXRlKGUpLmZpbmFsaXplKG8pO2kucmVzZXQoKTtmb3IodmFyIGY9bC53b3JkcyxkPWYubGVuZ3RoLHU9bCxwPTE7cDxoO3ArKyl7dT1pLmZpbmFsaXplKHUpLGkucmVzZXQoKTtmb3IodmFyIF89dS53b3Jkcyx5PTA7eTxkO3krKylmW3ldXj1fW3ldfW4uY29uY2F0KGwpLGNbMF0rK31yZXR1cm4gbi5zaWdCeXRlcz00KmEsbn19KSx3LlBCS0RGMj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHkuY3JlYXRlKHIpLmNvbXB1dGUodCxlKX0sTT0oUD1VKS5saWIsRj1NLkJhc2UsQj1NLldvcmRBcnJheSx3PVAuYWxnbyxNPXcuTUQ1LGs9dy5FdnBLREY9Ri5leHRlbmQoe2NmZzpGLmV4dGVuZCh7a2V5U2l6ZTo0LGhhc2hlcjpNLGl0ZXJhdGlvbnM6MX0pLGluaXQ6ZnVuY3Rpb24odCl7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKHQpfSxjb21wdXRlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLGk9dGhpcy5jZmcsbj1pLmhhc2hlci5jcmVhdGUoKSxvPUIuY3JlYXRlKCkscz1vLndvcmRzLGM9aS5rZXlTaXplLGE9aS5pdGVyYXRpb25zO3MubGVuZ3RoPGM7KXtyJiZuLnVwZGF0ZShyKSxyPW4udXBkYXRlKHQpLmZpbmFsaXplKGUpLG4ucmVzZXQoKTtmb3IodmFyIGg9MTtoPGE7aCsrKXI9bi5maW5hbGl6ZShyKSxuLnJlc2V0KCk7by5jb25jYXQocil9cmV0dXJuIG8uc2lnQnl0ZXM9NCpjLG99fSksUC5FdnBLREY9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBrLmNyZWF0ZShyKS5jb21wdXRlKHQsZSl9LFUubGliLkNpcGhlcnx8ZnVuY3Rpb24oKXt2YXIgdD1VLGU9dC5saWIscj1lLkJhc2Uscz1lLldvcmRBcnJheSxpPWUuQnVmZmVyZWRCbG9ja0FsZ29yaXRobSxuPXQuZW5jLG89KG4uVXRmOCxuLkJhc2U2NCksYz10LmFsZ28uRXZwS0RGLGE9ZS5DaXBoZXI9aS5leHRlbmQoe2NmZzpyLmV4dGVuZCgpLGNyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSx0LGUpfSxjcmVhdGVEZWNyeXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fREVDX1hGT1JNX01PREUsdCxlKX0saW5pdDpmdW5jdGlvbih0LGUscil7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKHIpLHRoaXMuX3hmb3JtTW9kZT10LHRoaXMuX2tleT1lLHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtpLnJlc2V0LmNhbGwodGhpcyksdGhpcy5fZG9SZXNldCgpfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hcHBlbmQodCksdGhpcy5fcHJvY2VzcygpfSxmaW5hbGl6ZTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5fYXBwZW5kKHQpLHRoaXMuX2RvRmluYWxpemUoKX0sa2V5U2l6ZTo0LGl2U2l6ZTo0LF9FTkNfWEZPUk1fTU9ERToxLF9ERUNfWEZPUk1fTU9ERToyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oaSl7cmV0dXJue2VuY3J5cHQ6ZnVuY3Rpb24odCxlLHIpe3JldHVybiBoKGUpLmVuY3J5cHQoaSx0LGUscil9LGRlY3J5cHQ6ZnVuY3Rpb24odCxlLHIpe3JldHVybiBoKGUpLmRlY3J5cHQoaSx0LGUscil9fX19KTtmdW5jdGlvbiBoKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9wOnV9ZS5TdHJlYW1DaXBoZXI9YS5leHRlbmQoe19kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2Nlc3MoITApfSxibG9ja1NpemU6MX0pO3ZhciBsPXQubW9kZT17fSxuPWUuQmxvY2tDaXBoZXJNb2RlPXIuZXh0ZW5kKHtjcmVhdGVFbmNyeXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5FbmNyeXB0b3IuY3JlYXRlKHQsZSl9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLkRlY3J5cHRvci5jcmVhdGUodCxlKX0saW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuX2NpcGhlcj10LHRoaXMuX2l2PWV9fSksbj1sLkNCQz0oKGw9bi5leHRlbmQoKSkuRW5jcnlwdG9yPWwuZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9jaXBoZXIsaT1yLmJsb2NrU2l6ZTtmLmNhbGwodGhpcyx0LGUsaSksci5lbmNyeXB0QmxvY2sodCxlKSx0aGlzLl9wcmV2QmxvY2s9dC5zbGljZShlLGUraSl9fSksbC5EZWNyeXB0b3I9bC5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX2NpcGhlcixpPXIuYmxvY2tTaXplLG49dC5zbGljZShlLGUraSk7ci5kZWNyeXB0QmxvY2sodCxlKSxmLmNhbGwodGhpcyx0LGUsaSksdGhpcy5fcHJldkJsb2NrPW59fSksbCk7ZnVuY3Rpb24gZih0LGUscil7dmFyIGksbj10aGlzLl9pdjtuPyhpPW4sdGhpcy5faXY9dm9pZCAwKTppPXRoaXMuX3ByZXZCbG9jaztmb3IodmFyIG89MDtvPHI7bysrKXRbZStvXV49aVtvXX12YXIgbD0odC5wYWQ9e30pLlBrY3M3PXtwYWQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGU9NCplLHI9ZS10LnNpZ0J5dGVzJWUsaT1yPDwyNHxyPDwxNnxyPDw4fHIsbj1bXSxvPTA7bzxyO28rPTQpbi5wdXNoKGkpO2U9cy5jcmVhdGUobixyKTt0LmNvbmNhdChlKX0sdW5wYWQ6ZnVuY3Rpb24odCl7dmFyIGU9MjU1JnQud29yZHNbdC5zaWdCeXRlcy0xPj4+Ml07dC5zaWdCeXRlcy09ZX19LGQ9KGUuQmxvY2tDaXBoZXI9YS5leHRlbmQoe2NmZzphLmNmZy5leHRlbmQoe21vZGU6bixwYWRkaW5nOmx9KSxyZXNldDpmdW5jdGlvbigpe3ZhciB0O2EucmVzZXQuY2FsbCh0aGlzKTt2YXIgZT10aGlzLmNmZyxyPWUuaXYsZT1lLm1vZGU7dGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERT90PWUuY3JlYXRlRW5jcnlwdG9yOih0PWUuY3JlYXRlRGVjcnlwdG9yLHRoaXMuX21pbkJ1ZmZlclNpemU9MSksdGhpcy5fbW9kZSYmdGhpcy5fbW9kZS5fX2NyZWF0b3I9PXQ/dGhpcy5fbW9kZS5pbml0KHRoaXMsciYmci53b3Jkcyk6KHRoaXMuX21vZGU9dC5jYWxsKGUsdGhpcyxyJiZyLndvcmRzKSx0aGlzLl9tb2RlLl9fY3JlYXRvcj10KX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7dGhpcy5fbW9kZS5wcm9jZXNzQmxvY2sodCxlKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuY2ZnLnBhZGRpbmc7cmV0dXJuIHRoaXMuX3hmb3JtTW9kZT09dGhpcy5fRU5DX1hGT1JNX01PREU/KGUucGFkKHRoaXMuX2RhdGEsdGhpcy5ibG9ja1NpemUpLHQ9dGhpcy5fcHJvY2VzcyghMCkpOih0PXRoaXMuX3Byb2Nlc3MoITApLGUudW5wYWQodCkpLHR9LGJsb2NrU2l6ZTo0fSksZS5DaXBoZXJQYXJhbXM9ci5leHRlbmQoe2luaXQ6ZnVuY3Rpb24odCl7dGhpcy5taXhJbih0KX0sdG9TdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuKHR8fHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyl9fSkpLGw9KHQuZm9ybWF0PXt9KS5PcGVuU1NMPXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7dmFyIGU9dC5jaXBoZXJ0ZXh0LHQ9dC5zYWx0LGU9dD9zLmNyZWF0ZShbMTM5ODg5MzY4NCwxNzAxMDc2ODMxXSkuY29uY2F0KHQpLmNvbmNhdChlKTplO3JldHVybiBlLnRvU3RyaW5nKG8pfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgZSxyPW8ucGFyc2UodCksdD1yLndvcmRzO3JldHVybiAxMzk4ODkzNjg0PT10WzBdJiYxNzAxMDc2ODMxPT10WzFdJiYoZT1zLmNyZWF0ZSh0LnNsaWNlKDIsNCkpLHQuc3BsaWNlKDAsNCksci5zaWdCeXRlcy09MTYpLGQuY3JlYXRlKHtjaXBoZXJ0ZXh0OnIsc2FsdDplfSl9fSx1PWUuU2VyaWFsaXphYmxlQ2lwaGVyPXIuZXh0ZW5kKHtjZmc6ci5leHRlbmQoe2Zvcm1hdDpsfSksZW5jcnlwdDpmdW5jdGlvbih0LGUscixpKXtpPXRoaXMuY2ZnLmV4dGVuZChpKTt2YXIgbj10LmNyZWF0ZUVuY3J5cHRvcihyLGkpLGU9bi5maW5hbGl6ZShlKSxuPW4uY2ZnO3JldHVybiBkLmNyZWF0ZSh7Y2lwaGVydGV4dDplLGtleTpyLGl2Om4uaXYsYWxnb3JpdGhtOnQsbW9kZTpuLm1vZGUscGFkZGluZzpuLnBhZGRpbmcsYmxvY2tTaXplOnQuYmxvY2tTaXplLGZvcm1hdHRlcjppLmZvcm1hdH0pfSxkZWNyeXB0OmZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBpPXRoaXMuY2ZnLmV4dGVuZChpKSxlPXRoaXMuX3BhcnNlKGUsaS5mb3JtYXQpLHQuY3JlYXRlRGVjcnlwdG9yKHIsaSkuZmluYWxpemUoZS5jaXBoZXJ0ZXh0KX0sX3BhcnNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2UucGFyc2UodCx0aGlzKTp0fX0pLHQ9KHQua2RmPXt9KS5PcGVuU1NMPXtleGVjdXRlOmZ1bmN0aW9uKHQsZSxyLGkpe2k9aXx8cy5yYW5kb20oOCk7dD1jLmNyZWF0ZSh7a2V5U2l6ZTplK3J9KS5jb21wdXRlKHQsaSkscj1zLmNyZWF0ZSh0LndvcmRzLnNsaWNlKGUpLDQqcik7cmV0dXJuIHQuc2lnQnl0ZXM9NCplLGQuY3JlYXRlKHtrZXk6dCxpdjpyLHNhbHQ6aX0pfX0scD1lLlBhc3N3b3JkQmFzZWRDaXBoZXI9dS5leHRlbmQoe2NmZzp1LmNmZy5leHRlbmQoe2tkZjp0fSksZW5jcnlwdDpmdW5jdGlvbih0LGUscixpKXtyPShpPXRoaXMuY2ZnLmV4dGVuZChpKSkua2RmLmV4ZWN1dGUocix0LmtleVNpemUsdC5pdlNpemUpO2kuaXY9ci5pdjtpPXUuZW5jcnlwdC5jYWxsKHRoaXMsdCxlLHIua2V5LGkpO3JldHVybiBpLm1peEluKHIpLGl9LGRlY3J5cHQ6ZnVuY3Rpb24odCxlLHIsaSl7aT10aGlzLmNmZy5leHRlbmQoaSksZT10aGlzLl9wYXJzZShlLGkuZm9ybWF0KTtyPWkua2RmLmV4ZWN1dGUocix0LmtleVNpemUsdC5pdlNpemUsZS5zYWx0KTtyZXR1cm4gaS5pdj1yLml2LHUuZGVjcnlwdC5jYWxsKHRoaXMsdCxlLHIua2V5LGkpfX0pfSgpLFUubW9kZS5DRkI9KChGPVUubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKSkuRW5jcnlwdG9yPUYuZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9jaXBoZXIsaT1yLmJsb2NrU2l6ZTtqLmNhbGwodGhpcyx0LGUsaSxyKSx0aGlzLl9wcmV2QmxvY2s9dC5zbGljZShlLGUraSl9fSksRi5EZWNyeXB0b3I9Ri5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX2NpcGhlcixpPXIuYmxvY2tTaXplLG49dC5zbGljZShlLGUraSk7ai5jYWxsKHRoaXMsdCxlLGksciksdGhpcy5fcHJldkJsb2NrPW59fSksRiksVS5tb2RlLkNUUj0oTT1VLmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCksUD1NLkVuY3J5cHRvcj1NLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fY2lwaGVyLGk9ci5ibG9ja1NpemUsbj10aGlzLl9pdixvPXRoaXMuX2NvdW50ZXI7biYmKG89dGhpcy5fY291bnRlcj1uLnNsaWNlKDApLHRoaXMuX2l2PXZvaWQgMCk7dmFyIHM9by5zbGljZSgwKTtyLmVuY3J5cHRCbG9jayhzLDApLG9baS0xXT1vW2ktMV0rMXwwO2Zvcih2YXIgYz0wO2M8aTtjKyspdFtlK2NdXj1zW2NdfX0pLE0uRGVjcnlwdG9yPVAsTSksVS5tb2RlLkNUUkdsYWRtYW49KEY9VS5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpLFA9Ri5FbmNyeXB0b3I9Ri5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX2NpcGhlcixpPXIuYmxvY2tTaXplLG49dGhpcy5faXYsbz10aGlzLl9jb3VudGVyO24mJihvPXRoaXMuX2NvdW50ZXI9bi5zbGljZSgwKSx0aGlzLl9pdj12b2lkIDApLDA9PT0oKG49bylbMF09VChuWzBdKSkmJihuWzFdPVQoblsxXSkpO3ZhciBzPW8uc2xpY2UoMCk7ci5lbmNyeXB0QmxvY2socywwKTtmb3IodmFyIGM9MDtjPGk7YysrKXRbZStjXV49c1tjXX19KSxGLkRlY3J5cHRvcj1QLEYpLFUubW9kZS5PRkI9KE09VS5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpLFA9TS5FbmNyeXB0b3I9TS5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX2NpcGhlcixpPXIuYmxvY2tTaXplLG49dGhpcy5faXYsbz10aGlzLl9rZXlzdHJlYW07biYmKG89dGhpcy5fa2V5c3RyZWFtPW4uc2xpY2UoMCksdGhpcy5faXY9dm9pZCAwKSxyLmVuY3J5cHRCbG9jayhvLDApO2Zvcih2YXIgcz0wO3M8aTtzKyspdFtlK3NdXj1vW3NdfX0pLE0uRGVjcnlwdG9yPVAsTSksVS5tb2RlLkVDQj0oKEY9VS5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpKS5FbmNyeXB0b3I9Ri5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe3RoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2sodCxlKX19KSxGLkRlY3J5cHRvcj1GLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY2lwaGVyLmRlY3J5cHRCbG9jayh0LGUpfX0pLEYpLFUucGFkLkFuc2lYOTIzPXtwYWQ6ZnVuY3Rpb24odCxlKXt2YXIgcj10LnNpZ0J5dGVzLGU9NCplLGU9ZS1yJWUscj1yK2UtMTt0LmNsYW1wKCksdC53b3Jkc1tyPj4+Ml18PWU8PDI0LXIlNCo4LHQuc2lnQnl0ZXMrPWV9LHVucGFkOmZ1bmN0aW9uKHQpe3ZhciBlPTI1NSZ0LndvcmRzW3Quc2lnQnl0ZXMtMT4+PjJdO3Quc2lnQnl0ZXMtPWV9fSxVLnBhZC5Jc28xMDEyNj17cGFkOmZ1bmN0aW9uKHQsZSl7ZSo9NCxlLT10LnNpZ0J5dGVzJWU7dC5jb25jYXQoVS5saWIuV29yZEFycmF5LnJhbmRvbShlLTEpKS5jb25jYXQoVS5saWIuV29yZEFycmF5LmNyZWF0ZShbZTw8MjRdLDEpKX0sdW5wYWQ6ZnVuY3Rpb24odCl7dmFyIGU9MjU1JnQud29yZHNbdC5zaWdCeXRlcy0xPj4+Ml07dC5zaWdCeXRlcy09ZX19LFUucGFkLklzbzk3OTcxPXtwYWQ6ZnVuY3Rpb24odCxlKXt0LmNvbmNhdChVLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsyMTQ3NDgzNjQ4XSwxKSksVS5wYWQuWmVyb1BhZGRpbmcucGFkKHQsZSl9LHVucGFkOmZ1bmN0aW9uKHQpe1UucGFkLlplcm9QYWRkaW5nLnVucGFkKHQpLHQuc2lnQnl0ZXMtLX19LFUucGFkLlplcm9QYWRkaW5nPXtwYWQ6ZnVuY3Rpb24odCxlKXtlKj00O3QuY2xhbXAoKSx0LnNpZ0J5dGVzKz1lLSh0LnNpZ0J5dGVzJWV8fGUpfSx1bnBhZDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC53b3JkcyxyPXQuc2lnQnl0ZXMtMSxyPXQuc2lnQnl0ZXMtMTswPD1yO3ItLSlpZihlW3I+Pj4yXT4+PjI0LXIlNCo4JjI1NSl7dC5zaWdCeXRlcz1yKzE7YnJlYWt9fX0sVS5wYWQuTm9QYWRkaW5nPXtwYWQ6ZnVuY3Rpb24oKXt9LHVucGFkOmZ1bmN0aW9uKCl7fX0sbT0oUD1VKS5saWIuQ2lwaGVyUGFyYW1zLEM9UC5lbmMuSGV4LFAuZm9ybWF0LkhleD17c3RyaW5naWZ5OmZ1bmN0aW9uKHQpe3JldHVybiB0LmNpcGhlcnRleHQudG9TdHJpbmcoQyl9LHBhcnNlOmZ1bmN0aW9uKHQpe3Q9Qy5wYXJzZSh0KTtyZXR1cm4gbS5jcmVhdGUoe2NpcGhlcnRleHQ6dH0pfX0sZnVuY3Rpb24oKXt2YXIgdD1VLGU9dC5saWIuQmxvY2tDaXBoZXIscj10LmFsZ28saD1bXSxsPVtdLGY9W10sZD1bXSx1PVtdLHA9W10sXz1bXSx5PVtdLHY9W10sZz1bXTshZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8MjU2O2UrKyl0W2VdPWU8MTI4P2U8PDE6ZTw8MV4yODM7Zm9yKHZhciByPTAsaT0wLGU9MDtlPDI1NjtlKyspe3ZhciBuPWleaTw8MV5pPDwyXmk8PDNeaTw8NDtoW3JdPW49bj4+PjheMjU1Jm5eOTk7dmFyIG89dFtsW25dPXJdLHM9dFtvXSxjPXRbc10sYT0yNTcqdFtuXV4xNjg0MzAwOCpuO2Zbcl09YTw8MjR8YT4+PjgsZFtyXT1hPDwxNnxhPj4+MTYsdVtyXT1hPDw4fGE+Pj4yNCxwW3JdPWEsX1tuXT0oYT0xNjg0MzAwOSpjXjY1NTM3KnNeMjU3Km9eMTY4NDMwMDgqcik8PDI0fGE+Pj44LHlbbl09YTw8MTZ8YT4+PjE2LHZbbl09YTw8OHxhPj4+MjQsZ1tuXT1hLHI/KHI9b150W3RbdFtjXm9dXV0saV49dFt0W2ldXSk6cj1pPTF9fSgpO3ZhciBCPVswLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0XSxyPXIuQUVTPWUuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2lmKCF0aGlzLl9uUm91bmRzfHx0aGlzLl9rZXlQcmlvclJlc2V0IT09dGhpcy5fa2V5KXtmb3IodmFyIHQ9dGhpcy5fa2V5UHJpb3JSZXNldD10aGlzLl9rZXksZT10LndvcmRzLHI9dC5zaWdCeXRlcy80LGk9NCooMSsodGhpcy5fblJvdW5kcz02K3IpKSxuPXRoaXMuX2tleVNjaGVkdWxlPVtdLG89MDtvPGk7bysrKW88cj9uW29dPWVbb106KGE9bltvLTFdLG8lcj82PHImJm8lcj09NCYmKGE9aFthPj4+MjRdPDwyNHxoW2E+Pj4xNiYyNTVdPDwxNnxoW2E+Pj44JjI1NV08PDh8aFsyNTUmYV0pOihhPWhbKGE9YTw8OHxhPj4+MjQpPj4+MjRdPDwyNHxoW2E+Pj4xNiYyNTVdPDwxNnxoW2E+Pj44JjI1NV08PDh8aFsyNTUmYV0sYV49QltvL3J8MF08PDI0KSxuW29dPW5bby1yXV5hKTtmb3IodmFyIHM9dGhpcy5faW52S2V5U2NoZWR1bGU9W10sYz0wO2M8aTtjKyspe3ZhciBhLG89aS1jO2E9YyU0P25bb106bltvLTRdLHNbY109Yzw0fHxvPD00P2E6X1toW2E+Pj4yNF1dXnlbaFthPj4+MTYmMjU1XV1edltoW2E+Pj44JjI1NV1dXmdbaFsyNTUmYV1dfX19LGVuY3J5cHRCbG9jazpmdW5jdGlvbih0LGUpe3RoaXMuX2RvQ3J5cHRCbG9jayh0LGUsdGhpcy5fa2V5U2NoZWR1bGUsZixkLHUscCxoKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dFtlKzFdO3RbZSsxXT10W2UrM10sdFtlKzNdPXIsdGhpcy5fZG9DcnlwdEJsb2NrKHQsZSx0aGlzLl9pbnZLZXlTY2hlZHVsZSxfLHksdixnLGwpO3I9dFtlKzFdO3RbZSsxXT10W2UrM10sdFtlKzNdPXJ9LF9kb0NyeXB0QmxvY2s6ZnVuY3Rpb24odCxlLHIsaSxuLG8scyxjKXtmb3IodmFyIGE9dGhpcy5fblJvdW5kcyxoPXRbZV1eclswXSxsPXRbZSsxXV5yWzFdLGY9dFtlKzJdXnJbMl0sZD10W2UrM11eclszXSx1PTQscD0xO3A8YTtwKyspdmFyIF89aVtoPj4+MjRdXm5bbD4+PjE2JjI1NV1eb1tmPj4+OCYyNTVdXnNbMjU1JmRdXnJbdSsrXSx5PWlbbD4+PjI0XV5uW2Y+Pj4xNiYyNTVdXm9bZD4+PjgmMjU1XV5zWzI1NSZoXV5yW3UrK10sdj1pW2Y+Pj4yNF1ebltkPj4+MTYmMjU1XV5vW2g+Pj44JjI1NV1ec1syNTUmbF1eclt1KytdLGc9aVtkPj4+MjRdXm5baD4+PjE2JjI1NV1eb1tsPj4+OCYyNTVdXnNbMjU1JmZdXnJbdSsrXSxoPV8sbD15LGY9dixkPWc7Xz0oY1toPj4+MjRdPDwyNHxjW2w+Pj4xNiYyNTVdPDwxNnxjW2Y+Pj44JjI1NV08PDh8Y1syNTUmZF0pXnJbdSsrXSx5PShjW2w+Pj4yNF08PDI0fGNbZj4+PjE2JjI1NV08PDE2fGNbZD4+PjgmMjU1XTw8OHxjWzI1NSZoXSleclt1KytdLHY9KGNbZj4+PjI0XTw8MjR8Y1tkPj4+MTYmMjU1XTw8MTZ8Y1toPj4+OCYyNTVdPDw4fGNbMjU1JmxdKV5yW3UrK10sZz0oY1tkPj4+MjRdPDwyNHxjW2g+Pj4xNiYyNTVdPDwxNnxjW2w+Pj44JjI1NV08PDh8Y1syNTUmZl0pXnJbdSsrXTt0W2VdPV8sdFtlKzFdPXksdFtlKzJdPXYsdFtlKzNdPWd9LGtleVNpemU6OH0pO3QuQUVTPWUuX2NyZWF0ZUhlbHBlcihyKX0oKSxmdW5jdGlvbigpe3ZhciB0PVUsZT10LmxpYixpPWUuV29yZEFycmF5LHI9ZS5CbG9ja0NpcGhlcixlPXQuYWxnbyxoPVs1Nyw0OSw0MSwzMywyNSwxNyw5LDEsNTgsNTAsNDIsMzQsMjYsMTgsMTAsMiw1OSw1MSw0MywzNSwyNywxOSwxMSwzLDYwLDUyLDQ0LDM2LDYzLDU1LDQ3LDM5LDMxLDIzLDE1LDcsNjIsNTQsNDYsMzgsMzAsMjIsMTQsNiw2MSw1Myw0NSwzNywyOSwyMSwxMyw1LDI4LDIwLDEyLDRdLGw9WzE0LDE3LDExLDI0LDEsNSwzLDI4LDE1LDYsMjEsMTAsMjMsMTksMTIsNCwyNiw4LDE2LDcsMjcsMjAsMTMsMiw0MSw1MiwzMSwzNyw0Nyw1NSwzMCw0MCw1MSw0NSwzMyw0OCw0NCw0OSwzOSw1NiwzNCw1Myw0Niw0Miw1MCwzNiwyOSwzMl0sZj1bMSwyLDQsNiw4LDEwLDEyLDE0LDE1LDE3LDE5LDIxLDIzLDI1LDI3LDI4XSxkPVt7MDo4NDIxODg4LDI2ODQzNTQ1NjozMjc2OCw1MzY4NzA5MTI6ODQyMTM3OCw4MDUzMDYzNjg6MiwxMDczNzQxODI0OjUxMiwxMzQyMTc3MjgwOjg0MjE4OTAsMTYxMDYxMjczNjo4Mzg5MTIyLDE4NzkwNDgxOTI6ODM4ODYwOCwyMTQ3NDgzNjQ4OjUxNCwyNDE1OTE5MTA0OjgzODkxMjAsMjY4NDM1NDU2MDozMzI4MCwyOTUyNzkwMDE2Ojg0MjEzNzYsMzIyMTIyNTQ3MjozMjc3MCwzNDg5NjYwOTI4OjgzODg2MTAsMzc1ODA5NjM4NDowLDQwMjY1MzE4NDA6MzMyODIsMTM0MjE3NzI4OjAsNDAyNjUzMTg0Ojg0MjE4OTAsNjcxMDg4NjQwOjMzMjgyLDkzOTUyNDA5NjozMjc2OCwxMjA3OTU5NTUyOjg0MjE4ODgsMTQ3NjM5NTAwODo1MTIsMTc0NDgzMDQ2NDo4NDIxMzc4LDIwMTMyNjU5MjA6MiwyMjgxNzAxMzc2OjgzODkxMjAsMjU1MDEzNjgzMjozMzI4MCwyODE4NTcyMjg4Ojg0MjEzNzYsMzA4NzAwNzc0NDo4Mzg5MTIyLDMzNTU0NDMyMDA6ODM4ODYxMCwzNjIzODc4NjU2OjMyNzcwLDM4OTIzMTQxMTI6NTE0LDQxNjA3NDk1Njg6ODM4ODYwOCwxOjMyNzY4LDI2ODQzNTQ1NzoyLDUzNjg3MDkxMzo4NDIxODg4LDgwNTMwNjM2OTo4Mzg4NjA4LDEwNzM3NDE4MjU6ODQyMTM3OCwxMzQyMTc3MjgxOjMzMjgwLDE2MTA2MTI3Mzc6NTEyLDE4NzkwNDgxOTM6ODM4OTEyMiwyMTQ3NDgzNjQ5Ojg0MjE4OTAsMjQxNTkxOTEwNTo4NDIxMzc2LDI2ODQzNTQ1NjE6ODM4ODYxMCwyOTUyNzkwMDE3OjMzMjgyLDMyMjEyMjU0NzM6NTE0LDM0ODk2NjA5Mjk6ODM4OTEyMCwzNzU4MDk2Mzg1OjMyNzcwLDQwMjY1MzE4NDE6MCwxMzQyMTc3Mjk6ODQyMTg5MCw0MDI2NTMxODU6ODQyMTM3Niw2NzEwODg2NDE6ODM4ODYwOCw5Mzk1MjQwOTc6NTEyLDEyMDc5NTk1NTM6MzI3NjgsMTQ3NjM5NTAwOTo4Mzg4NjEwLDE3NDQ4MzA0NjU6MiwyMDEzMjY1OTIxOjMzMjgyLDIyODE3MDEzNzc6MzI3NzAsMjU1MDEzNjgzMzo4Mzg5MTIyLDI4MTg1NzIyODk6NTE0LDMwODcwMDc3NDU6ODQyMTg4OCwzMzU1NDQzMjAxOjgzODkxMjAsMzYyMzg3ODY1NzowLDM4OTIzMTQxMTM6MzMyODAsNDE2MDc0OTU2OTo4NDIxMzc4fSx7MDoxMDc0MjgyNTEyLDE2Nzc3MjE2OjE2Mzg0LDMzNTU0NDMyOjUyNDI4OCw1MDMzMTY0ODoxMDc0MjY2MTI4LDY3MTA4ODY0OjEwNzM3NDE4NDAsODM4ODYwODA6MTA3NDI4MjQ5NiwxMDA2NjMyOTY6MTA3Mzc1ODIwOCwxMTc0NDA1MTI6MTYsMTM0MjE3NzI4OjU0MDY3MiwxNTA5OTQ5NDQ6MTA3Mzc1ODIyNCwxNjc3NzIxNjA6MTA3Mzc0MTgyNCwxODQ1NDkzNzY6NTQwNjg4LDIwMTMyNjU5Mjo1MjQzMDQsMjE4MTAzODA4OjAsMjM0ODgxMDI0OjE2NDAwLDI1MTY1ODI0MDoxMDc0MjY2MTEyLDgzODg2MDg6MTA3Mzc1ODIwOCwyNTE2NTgyNDo1NDA2ODgsNDE5NDMwNDA6MTYsNTg3MjAyNTY6MTA3Mzc1ODIyNCw3NTQ5NzQ3MjoxMDc0MjgyNTEyLDkyMjc0Njg4OjEwNzM3NDE4MjQsMTA5MDUxOTA0OjUyNDI4OCwxMjU4MjkxMjA6MTA3NDI2NjEyOCwxNDI2MDYzMzY6NTI0MzA0LDE1OTM4MzU1MjowLDE3NjE2MDc2ODoxNjM4NCwxOTI5Mzc5ODQ6MTA3NDI2NjExMiwyMDk3MTUyMDA6MTA3Mzc0MTg0MCwyMjY0OTI0MTY6NTQwNjcyLDI0MzI2OTYzMjoxMDc0MjgyNDk2LDI2MDA0Njg0ODoxNjQwMCwyNjg0MzU0NTY6MCwyODUyMTI2NzI6MTA3NDI2NjEyOCwzMDE5ODk4ODg6MTA3Mzc1ODIyNCwzMTg3NjcxMDQ6MTA3NDI4MjQ5NiwzMzU1NDQzMjA6MTA3NDI2NjExMiwzNTIzMjE1MzY6MTYsMzY5MDk4NzUyOjU0MDY4OCwzODU4NzU5Njg6MTYzODQsNDAyNjUzMTg0OjE2NDAwLDQxOTQzMDQwMDo1MjQyODgsNDM2MjA3NjE2OjUyNDMwNCw0NTI5ODQ4MzI6MTA3Mzc0MTg0MCw0Njk3NjIwNDg6NTQwNjcyLDQ4NjUzOTI2NDoxMDczNzU4MjA4LDUwMzMxNjQ4MDoxMDczNzQxODI0LDUyMDA5MzY5NjoxMDc0MjgyNTEyLDI3NjgyNDA2NDo1NDA2ODgsMjkzNjAxMjgwOjUyNDI4OCwzMTAzNzg0OTY6MTA3NDI2NjExMiwzMjcxNTU3MTI6MTYzODQsMzQzOTMyOTI4OjEwNzM3NTgyMDgsMzYwNzEwMTQ0OjEwNzQyODI1MTIsMzc3NDg3MzYwOjE2LDM5NDI2NDU3NjoxMDczNzQxODI0LDQxMTA0MTc5MjoxMDc0MjgyNDk2LDQyNzgxOTAwODoxMDczNzQxODQwLDQ0NDU5NjIyNDoxMDczNzU4MjI0LDQ2MTM3MzQ0MDo1MjQzMDQsNDc4MTUwNjU2OjAsNDk0OTI3ODcyOjE2NDAwLDUxMTcwNTA4ODoxMDc0MjY2MTI4LDUyODQ4MjMwNDo1NDA2NzJ9LHswOjI2MCwxMDQ4NTc2OjAsMjA5NzE1Mjo2NzEwOTEyMCwzMTQ1NzI4OjY1Nzk2LDQxOTQzMDQ6NjU1NDAsNTI0Mjg4MDo2NzEwODg2OCw2MjkxNDU2OjY3MTc0NjYwLDczNDAwMzI6NjcxNzQ0MDAsODM4ODYwODo2NzEwODg2NCw5NDM3MTg0OjY3MTc0NjU2LDEwNDg1NzYwOjY1NzkyLDExNTM0MzM2OjY3MTc0NDA0LDEyNTgyOTEyOjY3MTA5MTI0LDEzNjMxNDg4OjY1NTM2LDE0NjgwMDY0OjQsMTU3Mjg2NDA6MjU2LDUyNDI4ODo2NzE3NDY1NiwxNTcyODY0OjY3MTc0NDA0LDI2MjE0NDA6MCwzNjcwMDE2OjY3MTA5MTIwLDQ3MTg1OTI6NjcxMDg4NjgsNTc2NzE2ODo2NTUzNiw2ODE1NzQ0OjY1NTQwLDc4NjQzMjA6MjYwLDg5MTI4OTY6NCw5OTYxNDcyOjI1NiwxMTAxMDA0ODo2NzE3NDQwMCwxMjA1ODYyNDo2NTc5NiwxMzEwNzIwMDo2NTc5MiwxNDE1NTc3Njo2NzEwOTEyNCwxNTIwNDM1Mjo2NzE3NDY2MCwxNjI1MjkyODo2NzEwODg2NCwxNjc3NzIxNjo2NzE3NDY1NiwxNzgyNTc5Mjo2NTU0MCwxODg3NDM2ODo2NTUzNiwxOTkyMjk0NDo2NzEwOTEyMCwyMDk3MTUyMDoyNTYsMjIwMjAwOTY6NjcxNzQ2NjAsMjMwNjg2NzI6NjcxMDg4NjgsMjQxMTcyNDg6MCwyNTE2NTgyNDo2NzEwOTEyNCwyNjIxNDQwMDo2NzEwODg2NCwyNzI2Mjk3Njo0LDI4MzExNTUyOjY1NzkyLDI5MzYwMTI4OjY3MTc0NDAwLDMwNDA4NzA0OjI2MCwzMTQ1NzI4MDo2NTc5NiwzMjUwNTg1Njo2NzE3NDQwNCwxNzMwMTUwNDo2NzEwODg2NCwxODM1MDA4MDoyNjAsMTkzOTg2NTY6NjcxNzQ2NTYsMjA0NDcyMzI6MCwyMTQ5NTgwODo2NTU0MCwyMjU0NDM4NDo2NzEwOTEyMCwyMzU5Mjk2MDoyNTYsMjQ2NDE1MzY6NjcxNzQ0MDQsMjU2OTAxMTI6NjU1MzYsMjY3Mzg2ODg6NjcxNzQ2NjAsMjc3ODcyNjQ6NjU3OTYsMjg4MzU4NDA6NjcxMDg4NjgsMjk4ODQ0MTY6NjcxMDkxMjQsMzA5MzI5OTI6NjcxNzQ0MDAsMzE5ODE1Njg6NCwzMzAzMDE0NDo2NTc5Mn0sezA6MjE1MTY4MjA0OCw2NTUzNjoyMTQ3NDg3ODA4LDEzMTA3Mjo0MTk4NDY0LDE5NjYwODoyMTUxNjc3OTUyLDI2MjE0NDowLDMyNzY4MDo0MTk4NDAwLDM5MzIxNjoyMTQ3NDgzNzEyLDQ1ODc1Mjo0MTk0MzY4LDUyNDI4ODoyMTQ3NDgzNjQ4LDU4OTgyNDo0MTk0MzA0LDY1NTM2MDo2NCw3MjA4OTY6MjE0NzQ4Nzc0NCw3ODY0MzI6MjE1MTY3ODAxNiw4NTE5Njg6NDE2MCw5MTc1MDQ6NDA5Niw5ODMwNDA6MjE1MTY4MjExMiwzMjc2ODoyMTQ3NDg3ODA4LDk4MzA0OjY0LDE2Mzg0MDoyMTUxNjc4MDE2LDIyOTM3NjoyMTQ3NDg3NzQ0LDI5NDkxMjo0MTk4NDAwLDM2MDQ0ODoyMTUxNjgyMTEyLDQyNTk4NDowLDQ5MTUyMDoyMTUxNjc3OTUyLDU1NzA1Njo0MDk2LDYyMjU5MjoyMTUxNjgyMDQ4LDY4ODEyODo0MTk0MzA0LDc1MzY2NDo0MTYwLDgxOTIwMDoyMTQ3NDgzNjQ4LDg4NDczNjo0MTk0MzY4LDk1MDI3Mjo0MTk4NDY0LDEwMTU4MDg6MjE0NzQ4MzcxMiwxMDQ4NTc2OjQxOTQzNjgsMTExNDExMjo0MTk4NDAwLDExNzk2NDg6MjE0NzQ4MzcxMiwxMjQ1MTg0OjAsMTMxMDcyMDo0MTYwLDEzNzYyNTY6MjE1MTY3ODAxNiwxNDQxNzkyOjIxNTE2ODIwNDgsMTUwNzMyODoyMTQ3NDg3ODA4LDE1NzI4NjQ6MjE1MTY4MjExMiwxNjM4NDAwOjIxNDc0ODM2NDgsMTcwMzkzNjoyMTUxNjc3OTUyLDE3Njk0NzI6NDE5ODQ2NCwxODM1MDA4OjIxNDc0ODc3NDQsMTkwMDU0NDo0MTk0MzA0LDE5NjYwODA6NjQsMjAzMTYxNjo0MDk2LDEwODEzNDQ6MjE1MTY3Nzk1MiwxMTQ2ODgwOjIxNTE2ODIxMTIsMTIxMjQxNjowLDEyNzc5NTI6NDE5ODQwMCwxMzQzNDg4OjQxOTQzNjgsMTQwOTAyNDoyMTQ3NDgzNjQ4LDE0NzQ1NjA6MjE0NzQ4NzgwOCwxNTQwMDk2OjY0LDE2MDU2MzI6MjE0NzQ4MzcxMiwxNjcxMTY4OjQwOTYsMTczNjcwNDoyMTQ3NDg3NzQ0LDE4MDIyNDA6MjE1MTY3ODAxNiwxODY3Nzc2OjQxNjAsMTkzMzMxMjoyMTUxNjgyMDQ4LDE5OTg4NDg6NDE5NDMwNCwyMDY0Mzg0OjQxOTg0NjR9LHswOjEyOCw0MDk2OjE3MDM5MzYwLDgxOTI6MjYyMTQ0LDEyMjg4OjUzNjg3MDkxMiwxNjM4NDo1MzcxMzMxODQsMjA0ODA6MTY3NzczNDQsMjQ1NzY6NTUzNjQ4MjU2LDI4NjcyOjI2MjI3MiwzMjc2ODoxNjc3NzIxNiwzNjg2NDo1MzcxMzMwNTYsNDA5NjA6NTM2ODcxMDQwLDQ1MDU2OjU1MzkxMDQwMCw0OTE1Mjo1NTM5MTAyNzIsNTMyNDg6MCw1NzM0NDoxNzAzOTQ4OCw2MTQ0MDo1NTM2NDgxMjgsMjA0ODoxNzAzOTQ4OCw2MTQ0OjU1MzY0ODI1NiwxMDI0MDoxMjgsMTQzMzY6MTcwMzkzNjAsMTg0MzI6MjYyMTQ0LDIyNTI4OjUzNzEzMzE4NCwyNjYyNDo1NTM5MTAyNzIsMzA3MjA6NTM2ODcwOTEyLDM0ODE2OjUzNzEzMzA1NiwzODkxMjowLDQzMDA4OjU1MzkxMDQwMCw0NzEwNDoxNjc3NzM0NCw1MTIwMDo1MzY4NzEwNDAsNTUyOTY6NTUzNjQ4MTI4LDU5MzkyOjE2Nzc3MjE2LDYzNDg4OjI2MjI3Miw2NTUzNjoyNjIxNDQsNjk2MzI6MTI4LDczNzI4OjUzNjg3MDkxMiw3NzgyNDo1NTM2NDgyNTYsODE5MjA6MTY3NzczNDQsODYwMTY6NTUzOTEwMjcyLDkwMTEyOjUzNzEzMzE4NCw5NDIwODoxNjc3NzIxNiw5ODMwNDo1NTM5MTA0MDAsMTAyNDAwOjU1MzY0ODEyOCwxMDY0OTY6MTcwMzkzNjAsMTEwNTkyOjUzNzEzMzA1NiwxMTQ2ODg6MjYyMjcyLDExODc4NDo1MzY4NzEwNDAsMTIyODgwOjAsMTI2OTc2OjE3MDM5NDg4LDY3NTg0OjU1MzY0ODI1Niw3MTY4MDoxNjc3NzIxNiw3NTc3NjoxNzAzOTM2MCw3OTg3Mjo1MzcxMzMxODQsODM5Njg6NTM2ODcwOTEyLDg4MDY0OjE3MDM5NDg4LDkyMTYwOjEyOCw5NjI1Njo1NTM5MTAyNzIsMTAwMzUyOjI2MjI3MiwxMDQ0NDg6NTUzOTEwNDAwLDEwODU0NDowLDExMjY0MDo1NTM2NDgxMjgsMTE2NzM2OjE2Nzc3MzQ0LDEyMDgzMjoyNjIxNDQsMTI0OTI4OjUzNzEzMzA1NiwxMjkwMjQ6NTM2ODcxMDQwfSx7MDoyNjg0MzU0NjQsMjU2OjgxOTIsNTEyOjI3MDUzMjYwOCw3Njg6MjcwNTQwODA4LDEwMjQ6MjY4NDQzNjQ4LDEyODA6MjA5NzE1MiwxNTM2OjIwOTcxNjAsMTc5MjoyNjg0MzU0NTYsMjA0ODowLDIzMDQ6MjY4NDQzNjU2LDI1NjA6MjEwNTM0NCwyODE2OjgsMzA3MjoyNzA1MzI2MTYsMzMyODoyMTA1MzUyLDM1ODQ6ODIwMCwzODQwOjI3MDU0MDgwMCwxMjg6MjcwNTMyNjA4LDM4NDoyNzA1NDA4MDgsNjQwOjgsODk2OjIwOTcxNTIsMTE1MjoyMTA1MzUyLDE0MDg6MjY4NDM1NDY0LDE2NjQ6MjY4NDQzNjQ4LDE5MjA6ODIwMCwyMTc2OjIwOTcxNjAsMjQzMjo4MTkyLDI2ODg6MjY4NDQzNjU2LDI5NDQ6MjcwNTMyNjE2LDMyMDA6MCwzNDU2OjI3MDU0MDgwMCwzNzEyOjIxMDUzNDQsMzk2ODoyNjg0MzU0NTYsNDA5NjoyNjg0NDM2NDgsNDM1MjoyNzA1MzI2MTYsNDYwODoyNzA1NDA4MDgsNDg2NDo4MjAwLDUxMjA6MjA5NzE1Miw1Mzc2OjI2ODQzNTQ1Niw1NjMyOjI2ODQzNTQ2NCw1ODg4OjIxMDUzNDQsNjE0NDoyMTA1MzUyLDY0MDA6MCw2NjU2OjgsNjkxMjoyNzA1MzI2MDgsNzE2ODo4MTkyLDc0MjQ6MjY4NDQzNjU2LDc2ODA6MjcwNTQwODAwLDc5MzY6MjA5NzE2MCw0MjI0OjgsNDQ4MDoyMTA1MzQ0LDQ3MzY6MjA5NzE1Miw0OTkyOjI2ODQzNTQ2NCw1MjQ4OjI2ODQ0MzY0OCw1NTA0OjgyMDAsNTc2MDoyNzA1NDA4MDgsNjAxNjoyNzA1MzI2MDgsNjI3MjoyNzA1NDA4MDAsNjUyODoyNzA1MzI2MTYsNjc4NDo4MTkyLDcwNDA6MjEwNTM1Miw3Mjk2OjIwOTcxNjAsNzU1MjowLDc4MDg6MjY4NDM1NDU2LDgwNjQ6MjY4NDQzNjU2fSx7MDoxMDQ4NTc2LDE2OjMzNTU1NDU3LDMyOjEwMjQsNDg6MTA0OTYwMSw2NDozNDYwNDAzMyw4MDowLDk2OjEsMTEyOjM0NjAzMDA5LDEyODozMzU1NTQ1NiwxNDQ6MTA0ODU3NywxNjA6MzM1NTQ0MzMsMTc2OjM0NjA0MDMyLDE5MjozNDYwMzAwOCwyMDg6MTAyNSwyMjQ6MTA0OTYwMCwyNDA6MzM1NTQ0MzIsODozNDYwMzAwOSwyNDowLDQwOjMzNTU1NDU3LDU2OjM0NjA0MDMyLDcyOjEwNDg1NzYsODg6MzM1NTQ0MzMsMTA0OjMzNTU0NDMyLDEyMDoxMDI1LDEzNjoxMDQ5NjAxLDE1MjozMzU1NTQ1NiwxNjg6MzQ2MDMwMDgsMTg0OjEwNDg1NzcsMjAwOjEwMjQsMjE2OjM0NjA0MDMzLDIzMjoxLDI0ODoxMDQ5NjAwLDI1NjozMzU1NDQzMiwyNzI6MTA0ODU3NiwyODg6MzM1NTU0NTcsMzA0OjM0NjAzMDA5LDMyMDoxMDQ4NTc3LDMzNjozMzU1NTQ1NiwzNTI6MzQ2MDQwMzIsMzY4OjEwNDk2MDEsMzg0OjEwMjUsNDAwOjM0NjA0MDMzLDQxNjoxMDQ5NjAwLDQzMjoxLDQ0ODowLDQ2NDozNDYwMzAwOCw0ODA6MzM1NTQ0MzMsNDk2OjEwMjQsMjY0OjEwNDk2MDAsMjgwOjMzNTU1NDU3LDI5NjozNDYwMzAwOSwzMTI6MSwzMjg6MzM1NTQ0MzIsMzQ0OjEwNDg1NzYsMzYwOjEwMjUsMzc2OjM0NjA0MDMyLDM5MjozMzU1NDQzMyw0MDg6MzQ2MDMwMDgsNDI0OjAsNDQwOjM0NjA0MDMzLDQ1NjoxMDQ5NjAxLDQ3MjoxMDI0LDQ4ODozMzU1NTQ1Niw1MDQ6MTA0ODU3N30sezA6MTM0MjE5ODA4LDE6MTMxMDcyLDI6MTM0MjE3NzI4LDM6MzIsNDoxMzExMDQsNToxMzQzNTA4ODAsNjoxMzQzNTA4NDgsNzoyMDQ4LDg6MTM0MzQ4ODAwLDk6MTM0MjE5Nzc2LDEwOjEzMzEyMCwxMToxMzQzNDg4MzIsMTI6MjA4MCwxMzowLDE0OjEzNDIxNzc2MCwxNToxMzMxNTIsMjE0NzQ4MzY0ODoyMDQ4LDIxNDc0ODM2NDk6MTM0MzUwODgwLDIxNDc0ODM2NTA6MTM0MjE5ODA4LDIxNDc0ODM2NTE6MTM0MjE3NzI4LDIxNDc0ODM2NTI6MTM0MzQ4ODAwLDIxNDc0ODM2NTM6MTMzMTIwLDIxNDc0ODM2NTQ6MTMzMTUyLDIxNDc0ODM2NTU6MzIsMjE0NzQ4MzY1NjoxMzQyMTc3NjAsMjE0NzQ4MzY1NzoyMDgwLDIxNDc0ODM2NTg6MTMxMTA0LDIxNDc0ODM2NTk6MTM0MzUwODQ4LDIxNDc0ODM2NjA6MCwyMTQ3NDgzNjYxOjEzNDM0ODgzMiwyMTQ3NDgzNjYyOjEzNDIxOTc3NiwyMTQ3NDgzNjYzOjEzMTA3MiwxNjoxMzMxNTIsMTc6MTM0MzUwODQ4LDE4OjMyLDE5OjIwNDgsMjA6MTM0MjE5Nzc2LDIxOjEzNDIxNzc2MCwyMjoxMzQzNDg4MzIsMjM6MTMxMDcyLDI0OjAsMjU6MTMxMTA0LDI2OjEzNDM0ODgwMCwyNzoxMzQyMTk4MDgsMjg6MTM0MzUwODgwLDI5OjEzMzEyMCwzMDoyMDgwLDMxOjEzNDIxNzcyOCwyMTQ3NDgzNjY0OjEzMTA3MiwyMTQ3NDgzNjY1OjIwNDgsMjE0NzQ4MzY2NjoxMzQzNDg4MzIsMjE0NzQ4MzY2NzoxMzMxNTIsMjE0NzQ4MzY2ODozMiwyMTQ3NDgzNjY5OjEzNDM0ODgwMCwyMTQ3NDgzNjcwOjEzNDIxNzcyOCwyMTQ3NDgzNjcxOjEzNDIxOTgwOCwyMTQ3NDgzNjcyOjEzNDM1MDg4MCwyMTQ3NDgzNjczOjEzNDIxNzc2MCwyMTQ3NDgzNjc0OjEzNDIxOTc3NiwyMTQ3NDgzNjc1OjAsMjE0NzQ4MzY3NjoxMzMxMjAsMjE0NzQ4MzY3NzoyMDgwLDIxNDc0ODM2Nzg6MTMxMTA0LDIxNDc0ODM2Nzk6MTM0MzUwODQ4fV0sdT1bNDE2MDc0OTU2OSw1Mjg0ODIzMDQsMzMwMzAxNDQsMjA2NDM4NCwxMjkwMjQsODA2NCw1MDQsMjE0NzQ4MzY3OV0sbj1lLkRFUz1yLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fa2V5LndvcmRzLGU9W10scj0wO3I8NTY7cisrKXt2YXIgaT1oW3JdLTE7ZVtyXT10W2k+Pj41XT4+PjMxLWklMzImMX1mb3IodmFyIG49dGhpcy5fc3ViS2V5cz1bXSxvPTA7bzwxNjtvKyspe2Zvcih2YXIgcz1uW29dPVtdLGM9ZltvXSxyPTA7cjwyNDtyKyspc1tyLzZ8MF18PWVbKGxbcl0tMStjKSUyOF08PDMxLXIlNixzWzQrKHIvNnwwKV18PWVbMjgrKGxbcisyNF0tMStjKSUyOF08PDMxLXIlNjtzWzBdPXNbMF08PDF8c1swXT4+PjMxO2ZvcihyPTE7cjw3O3IrKylzW3JdPXNbcl0+Pj40KihyLTEpKzM7c1s3XT1zWzddPDw1fHNbN10+Pj4yN31mb3IodmFyIGE9dGhpcy5faW52U3ViS2V5cz1bXSxyPTA7cjwxNjtyKyspYVtyXT1uWzE1LXJdfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24odCxlKXt0aGlzLl9kb0NyeXB0QmxvY2sodCxlLHRoaXMuX3N1YktleXMpfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24odCxlKXt0aGlzLl9kb0NyeXB0QmxvY2sodCxlLHRoaXMuX2ludlN1YktleXMpfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKHQsZSxyKXt0aGlzLl9sQmxvY2s9dFtlXSx0aGlzLl9yQmxvY2s9dFtlKzFdLHAuY2FsbCh0aGlzLDQsMjUyNjQ1MTM1KSxwLmNhbGwodGhpcywxNiw2NTUzNSksXy5jYWxsKHRoaXMsMiw4NTg5OTM0NTkpLF8uY2FsbCh0aGlzLDgsMTY3MTE5MzUpLHAuY2FsbCh0aGlzLDEsMTQzMTY1NTc2NSk7Zm9yKHZhciBpPTA7aTwxNjtpKyspe2Zvcih2YXIgbj1yW2ldLG89dGhpcy5fbEJsb2NrLHM9dGhpcy5fckJsb2NrLGM9MCxhPTA7YTw4O2ErKyljfD1kW2FdWygoc15uW2FdKSZ1W2FdKT4+PjBdO3RoaXMuX2xCbG9jaz1zLHRoaXMuX3JCbG9jaz1vXmN9dmFyIGg9dGhpcy5fbEJsb2NrO3RoaXMuX2xCbG9jaz10aGlzLl9yQmxvY2ssdGhpcy5fckJsb2NrPWgscC5jYWxsKHRoaXMsMSwxNDMxNjU1NzY1KSxfLmNhbGwodGhpcyw4LDE2NzExOTM1KSxfLmNhbGwodGhpcywyLDg1ODk5MzQ1OSkscC5jYWxsKHRoaXMsMTYsNjU1MzUpLHAuY2FsbCh0aGlzLDQsMjUyNjQ1MTM1KSx0W2VdPXRoaXMuX2xCbG9jayx0W2UrMV09dGhpcy5fckJsb2NrfSxrZXlTaXplOjIsaXZTaXplOjIsYmxvY2tTaXplOjJ9KTtmdW5jdGlvbiBwKHQsZSl7ZT0odGhpcy5fbEJsb2NrPj4+dF50aGlzLl9yQmxvY2spJmU7dGhpcy5fckJsb2NrXj1lLHRoaXMuX2xCbG9ja149ZTw8dH1mdW5jdGlvbiBfKHQsZSl7ZT0odGhpcy5fckJsb2NrPj4+dF50aGlzLl9sQmxvY2spJmU7dGhpcy5fbEJsb2NrXj1lLHRoaXMuX3JCbG9ja149ZTw8dH10LkRFUz1yLl9jcmVhdGVIZWxwZXIobik7ZT1lLlRyaXBsZURFUz1yLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9rZXkud29yZHM7aWYoMiE9PXQubGVuZ3RoJiY0IT09dC5sZW5ndGgmJnQubGVuZ3RoPDYpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGtleSBsZW5ndGggLSAzREVTIHJlcXVpcmVzIHRoZSBrZXkgbGVuZ3RoIHRvIGJlIDY0LCAxMjgsIDE5MiBvciA+MTkyLiIpO3ZhciBlPXQuc2xpY2UoMCwyKSxyPXQubGVuZ3RoPDQ/dC5zbGljZSgwLDIpOnQuc2xpY2UoMiw0KSx0PXQubGVuZ3RoPDY/dC5zbGljZSgwLDIpOnQuc2xpY2UoNCw2KTt0aGlzLl9kZXMxPW4uY3JlYXRlRW5jcnlwdG9yKGkuY3JlYXRlKGUpKSx0aGlzLl9kZXMyPW4uY3JlYXRlRW5jcnlwdG9yKGkuY3JlYXRlKHIpKSx0aGlzLl9kZXMzPW4uY3JlYXRlRW5jcnlwdG9yKGkuY3JlYXRlKHQpKX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKHQsZSl7dGhpcy5fZGVzMS5lbmNyeXB0QmxvY2sodCxlKSx0aGlzLl9kZXMyLmRlY3J5cHRCbG9jayh0LGUpLHRoaXMuX2RlczMuZW5jcnlwdEJsb2NrKHQsZSl9LGRlY3J5cHRCbG9jazpmdW5jdGlvbih0LGUpe3RoaXMuX2RlczMuZGVjcnlwdEJsb2NrKHQsZSksdGhpcy5fZGVzMi5lbmNyeXB0QmxvY2sodCxlKSx0aGlzLl9kZXMxLmRlY3J5cHRCbG9jayh0LGUpfSxrZXlTaXplOjYsaXZTaXplOjIsYmxvY2tTaXplOjJ9KTt0LlRyaXBsZURFUz1yLl9jcmVhdGVIZWxwZXIoZSl9KCksZnVuY3Rpb24oKXt2YXIgdD1VLGU9dC5saWIuU3RyZWFtQ2lwaGVyLHI9dC5hbGdvLGk9ci5SQzQ9ZS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2tleSxlPXQud29yZHMscj10LnNpZ0J5dGVzLGk9dGhpcy5fUz1bXSxuPTA7bjwyNTY7bisrKWlbbl09bjtmb3IodmFyIG49MCxvPTA7bjwyNTY7bisrKXt2YXIgcz1uJXIscz1lW3M+Pj4yXT4+PjI0LXMlNCo4JjI1NSxvPShvK2lbbl0rcyklMjU2LHM9aVtuXTtpW25dPWlbb10saVtvXT1zfXRoaXMuX2k9dGhpcy5faj0wfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24odCxlKXt0W2VdXj1uLmNhbGwodGhpcyl9LGtleVNpemU6OCxpdlNpemU6MH0pO2Z1bmN0aW9uIG4oKXtmb3IodmFyIHQ9dGhpcy5fUyxlPXRoaXMuX2kscj10aGlzLl9qLGk9MCxuPTA7bjw0O24rKyl7dmFyIHI9KHIrdFtlPShlKzEpJTI1Nl0pJTI1NixvPXRbZV07dFtlXT10W3JdLHRbcl09byxpfD10Wyh0W2VdK3Rbcl0pJTI1Nl08PDI0LTgqbn1yZXR1cm4gdGhpcy5faT1lLHRoaXMuX2o9cixpfXQuUkM0PWUuX2NyZWF0ZUhlbHBlcihpKTtyPXIuUkM0RHJvcD1pLmV4dGVuZCh7Y2ZnOmkuY2ZnLmV4dGVuZCh7ZHJvcDoxOTJ9KSxfZG9SZXNldDpmdW5jdGlvbigpe2kuX2RvUmVzZXQuY2FsbCh0aGlzKTtmb3IodmFyIHQ9dGhpcy5jZmcuZHJvcDswPHQ7dC0tKW4uY2FsbCh0aGlzKX19KTt0LlJDNERyb3A9ZS5fY3JlYXRlSGVscGVyKHIpfSgpLEY9KE09VSkubGliLlN0cmVhbUNpcGhlcixQPU0uYWxnbyxEPVtdLEU9W10sUj1bXSxQPVAuUmFiYml0PUYuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9rZXkud29yZHMsZT10aGlzLmNmZy5pdixyPTA7cjw0O3IrKyl0W3JdPTE2NzExOTM1Jih0W3JdPDw4fHRbcl0+Pj4yNCl8NDI3ODI1NTM2MCYodFtyXTw8MjR8dFtyXT4+PjgpO2Zvcih2YXIgaT10aGlzLl9YPVt0WzBdLHRbM108PDE2fHRbMl0+Pj4xNix0WzFdLHRbMF08PDE2fHRbM10+Pj4xNix0WzJdLHRbMV08PDE2fHRbMF0+Pj4xNix0WzNdLHRbMl08PDE2fHRbMV0+Pj4xNl0sbj10aGlzLl9DPVt0WzJdPDwxNnx0WzJdPj4+MTYsNDI5NDkwMTc2MCZ0WzBdfDY1NTM1JnRbMV0sdFszXTw8MTZ8dFszXT4+PjE2LDQyOTQ5MDE3NjAmdFsxXXw2NTUzNSZ0WzJdLHRbMF08PDE2fHRbMF0+Pj4xNiw0Mjk0OTAxNzYwJnRbMl18NjU1MzUmdFszXSx0WzFdPDwxNnx0WzFdPj4+MTYsNDI5NDkwMTc2MCZ0WzNdfDY1NTM1JnRbMF1dLHI9dGhpcy5fYj0wO3I8NDtyKyspTi5jYWxsKHRoaXMpO2ZvcihyPTA7cjw4O3IrKyluW3JdXj1pW3IrNCY3XTtpZihlKXt2YXIgbz1lLndvcmRzLHM9b1swXSxjPW9bMV0sZT0xNjcxMTkzNSYoczw8OHxzPj4+MjQpfDQyNzgyNTUzNjAmKHM8PDI0fHM+Pj44KSxvPTE2NzExOTM1JihjPDw4fGM+Pj4yNCl8NDI3ODI1NTM2MCYoYzw8MjR8Yz4+PjgpLHM9ZT4+PjE2fDQyOTQ5MDE3NjAmbyxjPW88PDE2fDY1NTM1JmU7blswXV49ZSxuWzFdXj1zLG5bMl1ePW8sblszXV49YyxuWzRdXj1lLG5bNV1ePXMsbls2XV49byxuWzddXj1jO2ZvcihyPTA7cjw0O3IrKylOLmNhbGwodGhpcyl9fSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9YO04uY2FsbCh0aGlzKSxEWzBdPXJbMF1ecls1XT4+PjE2XnJbM108PDE2LERbMV09clsyXV5yWzddPj4+MTZecls1XTw8MTYsRFsyXT1yWzRdXnJbMV0+Pj4xNl5yWzddPDwxNixEWzNdPXJbNl1eclszXT4+PjE2XnJbMV08PDE2O2Zvcih2YXIgaT0wO2k8NDtpKyspRFtpXT0xNjcxMTkzNSYoRFtpXTw8OHxEW2ldPj4+MjQpfDQyNzgyNTUzNjAmKERbaV08PDI0fERbaV0+Pj44KSx0W2UraV1ePURbaV19LGJsb2NrU2l6ZTo0LGl2U2l6ZToyfSksTS5SYWJiaXQ9Ri5fY3JlYXRlSGVscGVyKFApLEY9KE09VSkubGliLlN0cmVhbUNpcGhlcixQPU0uYWxnbyxXPVtdLE89W10sST1bXSxQPVAuUmFiYml0TGVnYWN5PUYuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9rZXkud29yZHMsZT10aGlzLmNmZy5pdixyPXRoaXMuX1g9W3RbMF0sdFszXTw8MTZ8dFsyXT4+PjE2LHRbMV0sdFswXTw8MTZ8dFszXT4+PjE2LHRbMl0sdFsxXTw8MTZ8dFswXT4+PjE2LHRbM10sdFsyXTw8MTZ8dFsxXT4+PjE2XSxpPXRoaXMuX0M9W3RbMl08PDE2fHRbMl0+Pj4xNiw0Mjk0OTAxNzYwJnRbMF18NjU1MzUmdFsxXSx0WzNdPDwxNnx0WzNdPj4+MTYsNDI5NDkwMTc2MCZ0WzFdfDY1NTM1JnRbMl0sdFswXTw8MTZ8dFswXT4+PjE2LDQyOTQ5MDE3NjAmdFsyXXw2NTUzNSZ0WzNdLHRbMV08PDE2fHRbMV0+Pj4xNiw0Mjk0OTAxNzYwJnRbM118NjU1MzUmdFswXV0sbj10aGlzLl9iPTA7bjw0O24rKylxLmNhbGwodGhpcyk7Zm9yKG49MDtuPDg7bisrKWlbbl1ePXJbbis0JjddO2lmKGUpe3ZhciBvPWUud29yZHMscz1vWzBdLHQ9b1sxXSxlPTE2NzExOTM1JihzPDw4fHM+Pj4yNCl8NDI3ODI1NTM2MCYoczw8MjR8cz4+PjgpLG89MTY3MTE5MzUmKHQ8PDh8dD4+PjI0KXw0Mjc4MjU1MzYwJih0PDwyNHx0Pj4+OCkscz1lPj4+MTZ8NDI5NDkwMTc2MCZvLHQ9bzw8MTZ8NjU1MzUmZTtpWzBdXj1lLGlbMV1ePXMsaVsyXV49byxpWzNdXj10LGlbNF1ePWUsaVs1XV49cyxpWzZdXj1vLGlbN11ePXQ7Zm9yKG49MDtuPDQ7bisrKXEuY2FsbCh0aGlzKX19LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX1g7cS5jYWxsKHRoaXMpLFdbMF09clswXV5yWzVdPj4+MTZeclszXTw8MTYsV1sxXT1yWzJdXnJbN10+Pj4xNl5yWzVdPDwxNixXWzJdPXJbNF1eclsxXT4+PjE2XnJbN108PDE2LFdbM109cls2XV5yWzNdPj4+MTZeclsxXTw8MTY7Zm9yKHZhciBpPTA7aTw0O2krKylXW2ldPTE2NzExOTM1JihXW2ldPDw4fFdbaV0+Pj4yNCl8NDI3ODI1NTM2MCYoV1tpXTw8MjR8V1tpXT4+PjgpLHRbZStpXV49V1tpXX0sYmxvY2tTaXplOjQsaXZTaXplOjJ9KSxNLlJhYmJpdExlZ2FjeT1GLl9jcmVhdGVIZWxwZXIoUCksVX0pOw==';
document.head.appendChild(script2);
class RSAExtension {
getInfo() {
return {
id: 'rsa',
name: 'RSA',
color1: '#FF0000', // Primary color (red)
color2: '#CC0000', // Secondary color (darker red)
blocks: [
{
opcode: 'generateKeys',
blockType: Scratch.BlockType.REPORTER,
text: 'Generate RSA Keys',
arguments: {}
},
{
opcode: 'encrypt',
blockType: Scratch.BlockType.REPORTER,
text: 'Encrypt [TEXT] with public key [KEY]',
arguments: {
TEXT: {
type: Scratch.ArgumentType.STRING,
defaultValue: 'Hello, world!'
},
KEY: {
type: Scratch.ArgumentType.STRING,
defaultValue: ''
}
}
},
{
opcode: 'decrypt',
blockType: Scratch.BlockType.REPORTER,
text: 'Decrypt [TEXT] with private key [KEY]',
arguments: {
TEXT: {
type: Scratch.ArgumentType.STRING,
defaultValue: ''
},
KEY: {
type: Scratch.ArgumentType.STRING,
defaultValue: ''
}
}
},
{
opcode: 'sign',
blockType: Scratch.BlockType.REPORTER,
text: 'Sign [TEXT] with private key [KEY]',
arguments: {
TEXT: {
type: Scratch.ArgumentType.STRING,
defaultValue: ''
},
KEY: {
type: Scratch.ArgumentType.STRING,
defaultValue: ''
}
}
},
{
opcode: 'verify',
blockType: Scratch.BlockType.BOOLEAN,
text: 'Verify [SIGNATURE] with [TEXT] and public key [KEY]',
arguments: {
TEXT: {
type: Scratch.ArgumentType.STRING,
defaultValue: ''
},
SIGNATURE: {
type: Scratch.ArgumentType.STRING,
defaultValue: ''
},
KEY: {
type: Scratch.ArgumentType.STRING,
defaultValue: ''
}
}
}
]
};
}
generateKeys() {
const crypt = new JSEncrypt({ default_key_size: 1024 });
const publicKey = crypt.getPublicKeyB64();
const privateKey = crypt.getPrivateKeyB64();
return JSON.stringify({ publicKey, privateKey });
}
encrypt(args) {
const crypt = new JSEncrypt();
crypt.setPublicKey(args.KEY);
const encrypted = crypt.encrypt(args.TEXT);
return encrypted ? btoa(encrypted) : 'Encryption failed';
}
decrypt(args) {
const crypt = new JSEncrypt();
crypt.setPrivateKey(args.KEY);
const decrypted = crypt.decrypt(atob(args.TEXT));
return decrypted ? decrypted : 'Decryption failed';
}
sign(args) {
var sign = new JSEncrypt();
sign.setPrivateKey(args.KEY);
var signature = sign.sign(args.TEXT, CryptoJS.SHA256, "SHA256");
return signature ? signature : "Signing failed";
}
verify(args) {
var verify = new JSEncrypt();
verify.setPublicKey(args.KEY);
var verified = verify.verify(args.TEXT, args.SIGNATURE, CryptoJS.SHA256);
return verified ? verified : false;
}
}
// Wait for the script to load before registering the extension
script.onload = () => {
Scratch.extensions.register(new RSAExtension());
};
})(Scratch);