@magic-xpa/utils 4.1200.0-dev4120.21 → 4.1200.0-dev4120.212

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,247 +0,0 @@
1
- import { NString, List, ApplicationException, StringBuilder, NChar, NNumber } from "@magic-xpa/mscorelib";
2
- import { XMLConstants } from "../XMLConstants";
3
- export class XmlParser {
4
- static endOfNameChar = [' ', '>'];
5
- _currIndex = 0;
6
- _xmLdata = "";
7
- _history = new List();
8
- constructor(data = NString.Empty) {
9
- this.setXMLdata(data);
10
- this.setCurrIndex(0);
11
- }
12
- static getTokens(str, delimiter, isMagicXML = true) {
13
- let tokensVec = new List();
14
- let token = null;
15
- if (isMagicXML) {
16
- str = str.trim();
17
- }
18
- let strTok = str.split(delimiter.charAt(0));
19
- for (let i = 0; i < strTok.length; i = i + 1) {
20
- if (isMagicXML && i === strTok.length - 1 && strTok.length % 2 === 1) {
21
- break;
22
- }
23
- token = strTok[i];
24
- if (isMagicXML) {
25
- if (i % 2 === 0) {
26
- token = token.trim();
27
- if (token.endsWith("=")) {
28
- token = token.substr(0, token.length - 1);
29
- }
30
- }
31
- else if (token === "")
32
- token = " ";
33
- }
34
- if (token === null)
35
- throw new ApplicationException("in ClientManager.Instance.XMLParser.getTokens() null token value");
36
- tokensVec.push(token);
37
- }
38
- return tokensVec;
39
- }
40
- static unescape(str) {
41
- let unescapedString = new StringBuilder(str.length);
42
- for (let i = 0; i < str.length; i++) {
43
- if (str[i] !== '\\') {
44
- unescapedString.Append(str[i]);
45
- continue;
46
- }
47
- switch (str[++i]) {
48
- case 'q':
49
- unescapedString.Append('\"');
50
- break;
51
- case 'o':
52
- unescapedString.Append('\'');
53
- break;
54
- case 'l':
55
- unescapedString.Append('<');
56
- break;
57
- case 'g':
58
- unescapedString.Append('>');
59
- break;
60
- case 'e':
61
- unescapedString.Append('=');
62
- break;
63
- case 'r':
64
- unescapedString.Append('\r');
65
- break;
66
- case 'n':
67
- unescapedString.Append('\n');
68
- break;
69
- default:
70
- unescapedString.Append(str[i]);
71
- break;
72
- }
73
- }
74
- return (unescapedString.ToString());
75
- }
76
- static escape(str) {
77
- let escapedString = new StringBuilder(str.length * 2);
78
- for (let i = 0; i < str.length; i++) {
79
- switch (str[i]) {
80
- case '\\':
81
- escapedString.Append("\\\\");
82
- break;
83
- case '"':
84
- escapedString.Append("\\q");
85
- break;
86
- case '\'':
87
- escapedString.Append("\\o");
88
- break;
89
- case '<':
90
- escapedString.Append("\\l");
91
- break;
92
- case '>':
93
- escapedString.Append("\\g");
94
- break;
95
- case '=':
96
- escapedString.Append("\\e");
97
- break;
98
- case '\r':
99
- escapedString.Append("\r");
100
- break;
101
- case '\n':
102
- escapedString.Append("\n");
103
- break;
104
- default:
105
- escapedString.Append(str[i]);
106
- break;
107
- }
108
- }
109
- return (escapedString.ToString());
110
- }
111
- static escapeUrl(str) {
112
- return NString.Replace(str, "&", "&amp;");
113
- }
114
- getNextTag() {
115
- if (this._xmLdata.length - this._currIndex <= 1) {
116
- return null;
117
- }
118
- for (let tmpIndx = this._currIndex + 1; tmpIndx < this._xmLdata.length; tmpIndx++) {
119
- let tmpChar = this._xmLdata[tmpIndx];
120
- if (NChar.IsLetter(tmpChar) || tmpChar === '/') {
121
- let endOfTag = NString.IndexOfAny(this._xmLdata, XmlParser.endOfNameChar, tmpIndx, this._xmLdata.length - tmpIndx);
122
- if (endOfTag === -1)
123
- return null;
124
- else
125
- return this._xmLdata.substr(tmpIndx, endOfTag - tmpIndx);
126
- }
127
- }
128
- return null;
129
- }
130
- getXMLsubstring(endContext) {
131
- return this._xmLdata.substr(this._currIndex, endContext - this._currIndex);
132
- }
133
- GetCurrentElementValue() {
134
- this.setCurrIndex2EndOfTag();
135
- let endContext = this.getXMLdata().indexOf(XMLConstants.TAG_OPEN, this.getCurrIndex());
136
- let value = this.getXMLsubstring(endContext);
137
- this.setCurrIndex2EndOfTag();
138
- return value;
139
- }
140
- setCurrIndex2EndOfTag() {
141
- this._currIndex = this._xmLdata.indexOf(XMLConstants.TAG_CLOSE, this._currIndex) + 1;
142
- }
143
- static getInt(valueStr) {
144
- return NNumber.Parse(valueStr.trim());
145
- }
146
- static getBoolean(valueStr) {
147
- return valueStr[0] === '1';
148
- }
149
- getCurrIndex() {
150
- return this._currIndex;
151
- }
152
- getXMLdata() {
153
- return this._xmLdata;
154
- }
155
- add2CurrIndex(add) {
156
- this._currIndex = this._currIndex + add;
157
- }
158
- setCurrIndex(index) {
159
- this._currIndex = index;
160
- }
161
- setXMLdata(data) {
162
- if (data !== null)
163
- this._xmLdata = data.trim();
164
- else {
165
- this._xmLdata = null;
166
- this.setCurrIndex(0);
167
- }
168
- }
169
- PrepareFormReadString(newXmlString) {
170
- this.setXMLdata(newXmlString);
171
- this.setCurrIndex(0);
172
- }
173
- push() {
174
- this._history.push(this._currIndex);
175
- this._history.push(this._xmLdata);
176
- }
177
- pop() {
178
- let count = this._history.length;
179
- this._xmLdata = this._history.get_Item(count - 1);
180
- this._currIndex = this._history.get_Item(count - 2);
181
- this._history.SetSize(count - 2);
182
- }
183
- loadTableCacheData(data) {
184
- this.setXMLdata(data);
185
- this.setCurrIndex(0);
186
- }
187
- ReadToEndOfCurrentElement() {
188
- let currentTag = this.getNextTag();
189
- let currentTagIndex = this._xmLdata.indexOf(XMLConstants.TAG_OPEN + currentTag, this.getCurrIndex());
190
- let nextOpenTagIndex = this._xmLdata.indexOf(XMLConstants.TAG_OPEN, currentTagIndex + 1);
191
- if (nextOpenTagIndex === -1)
192
- nextOpenTagIndex = this._xmLdata.length;
193
- let elementEndIndex = NString.IndexOf(this._xmLdata, XMLConstants.TAG_TERM, this.getCurrIndex(), nextOpenTagIndex - this.getCurrIndex());
194
- if (elementEndIndex === -1)
195
- elementEndIndex = this._xmLdata.indexOf("/" + currentTag, this.getCurrIndex()) + currentTag.length + XMLConstants.TAG_TERM.length;
196
- else
197
- elementEndIndex = elementEndIndex + XMLConstants.TAG_TERM.length;
198
- let elementBlock = this.getXMLsubstring(elementEndIndex);
199
- this.setCurrIndex(elementEndIndex);
200
- return elementBlock;
201
- }
202
- ReadContentOfCurrentElement() {
203
- let currentTag = this.getNextTag();
204
- let elementEndIndex = this._xmLdata.indexOf("</" + currentTag + ">", this.getCurrIndex());
205
- if (elementEndIndex === -1)
206
- return NString.Empty;
207
- this.setCurrIndex2EndOfTag();
208
- let elementBlock = this.getXMLsubstring(elementEndIndex);
209
- this.setCurrIndex(elementEndIndex);
210
- this.setCurrIndex2EndOfTag();
211
- return elementBlock;
212
- }
213
- toString(headCharCount, tailCharCount) {
214
- if (arguments.length === 0) {
215
- return this.ToString_0();
216
- }
217
- return this.ToString_1(headCharCount, tailCharCount);
218
- }
219
- ToString_0() {
220
- return this.toString(20, 50);
221
- }
222
- ToString_1(headCharCount, tailCharCount) {
223
- let markerPosition = Math.min(this._currIndex, this._xmLdata.length);
224
- let segmentStartIndex = Math.max(0, markerPosition - headCharCount);
225
- let segmentEndIndex = Math.min(this._xmLdata.length, markerPosition + tailCharCount);
226
- let headLength = markerPosition - segmentStartIndex;
227
- let tailLength = segmentEndIndex - markerPosition;
228
- let segment = new StringBuilder();
229
- if (segmentStartIndex > 0)
230
- segment.Append("...");
231
- if (headLength > 0)
232
- segment.Append(this._xmLdata, segmentStartIndex, headLength);
233
- segment.Append("|-{").Append(this._currIndex).Append("}-|");
234
- if (tailLength > 0)
235
- segment.Append(this._xmLdata, this._currIndex, tailLength);
236
- if (segmentEndIndex < this._xmLdata.length)
237
- segment.Append("...");
238
- return segment.ToString();
239
- }
240
- SkipXMLElement() {
241
- let endContext = this.getXMLdata().indexOf(XMLConstants.TAG_TERM, this.getCurrIndex());
242
- if (endContext !== -1 && endContext < this.getXMLdata().length) {
243
- this.setCurrIndex2EndOfTag();
244
- }
245
- }
246
- }
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWG1sUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdXRpbHMvc3JjL1htbC9YbWxQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHN0MsTUFBTSxPQUFPLFNBQVM7SUFDWixNQUFNLENBQUMsYUFBYSxHQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRTVDLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFDdkIsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUN0QixRQUFRLEdBQTBCLElBQUksSUFBSSxFQUFFLENBQUM7SUFNckQsWUFBWSxPQUFlLE9BQU8sQ0FBQyxLQUFLO1FBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBT0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFXLEVBQUUsU0FBaUIsRUFBRSxhQUFzQixJQUFJO1FBQ3pFLElBQUksU0FBUyxHQUFpQixJQUFJLElBQUksRUFBVSxDQUFDO1FBQ2pELElBQUksS0FBSyxHQUFXLElBQUksQ0FBQztRQUV6QixJQUFJLFVBQVUsRUFBRTtZQUNkLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbEI7UUFFRCxJQUFJLE1BQU0sR0FBYSxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFD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TSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFL0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1RCxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTdELElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUN4QyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQzlELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TlN0cmluZywgTGlzdCwgQXBwbGljYXRpb25FeGNlcHRpb24sIFN0cmluZ0J1aWxkZXIsIE5DaGFyLCBOTnVtYmVyfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtYTUxDb25zdGFudHN9IGZyb20gXCIuLi9YTUxDb25zdGFudHNcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT4gYSBoZWxwZXIgY2xhc3MgZm9yIHRoZSBwYXJzaW5nIG9mIHRoZSBYTUw8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBYbWxQYXJzZXIge1xyXG4gIHByaXZhdGUgc3RhdGljIGVuZE9mTmFtZUNoYXI6IHN0cmluZ1tdID0gWycgJywgJz4nXTtcclxuXHJcbiAgcHJpdmF0ZSBfY3VyckluZGV4OiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX3htTGRhdGE6IHN0cmluZyA9IFwiXCI7XHJcbiAgcHJpdmF0ZSBfaGlzdG9yeTogTGlzdDxudW1iZXIgfCBzdHJpbmc+ID0gbmV3IExpc3QoKTsgLy8gSW4gb3JkZXIgdG8gYWxsb3cgcmVjdXJzaXZlIHBhcnNpbmcgd2Ugc2F2ZSBwcmV2IGRhdGFcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0YVwiPjwvcGFyYW0+XHJcbiAgY29uc3RydWN0b3IoZGF0YTogc3RyaW5nID0gTlN0cmluZy5FbXB0eSkge1xyXG4gICAgdGhpcy5zZXRYTUxkYXRhKGRhdGEpO1xyXG4gICAgdGhpcy5zZXRDdXJySW5kZXgoMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHBhcnNlIGEgc3RyaW5nIGFjY29yZGluZyB0byBhIHNldCBvZiBkZWxpbWl0ZXJzIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBpbiBhIHZlY3Rvcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj50aGUgU3RyaW5nIHdoaWNoIG5lZWQgYmUgcGFydGVkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1pdGVyXCI+dGhlIGRlbGltaXRlciB3aGljaCBwYXJ0IGRpZmZlcmVudCBwYXJ0cyBvZiBzdHIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc01hZ2ljWE1MXCI+aXMgbmVlZGVkIHRva2VuaXplciB3b3JraW5nIG9uIE1hZ2ljIFhNTCwgc28gdGhlIFwiPVwiIHNpZ24gd2lsbCBiZSBkZWxpdGVkIGluIHRoZSBlbmQgb2YgZXZlcnkgZmlyc3QgdG9rZW4gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRtcFZlY3RvciBkeW5hbWljYWxseSBhcnJheSwgd2hpY2ggY29uc2lzdCB0b2tlbnMgaW4gZXZlcnkgZWxlbWVudCwgZXZlcnkgdG9rZW4gaXMgU3RyaW5nIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0VG9rZW5zKHN0cjogc3RyaW5nLCBkZWxpbWl0ZXI6IHN0cmluZywgaXNNYWdpY1hNTDogYm9vbGVhbiA9IHRydWUpOiBMaXN0PHN0cmluZz4ge1xyXG4gICAgbGV0IHRva2Vuc1ZlYzogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IHRva2VuOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChpc01hZ2ljWE1MKSB7XHJcbiAgICAgIHN0ciA9IHN0ci50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHN0clRvazogc3RyaW5nW10gPSBzdHIuc3BsaXQoZGVsaW1pdGVyLmNoYXJBdCgwKSk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN0clRvay5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAvLyBTcGxpdCBpbiBDIyBjcmVhdGVzIGEgbGFzdCBlbXB0eSBzdHJpbmcgdG9rZW4gaWYgdGhlIHNvdXJjZSBzdHJpbmcgZW5kcyB3aXRoXHJcbiAgICAgIC8vIHRoZSBkZWxpbWl0ZXIgb3IgaWYgdGhlIHN0cmluZyBpcyBlbXB0eSAoYXMgb3Bwb3NlZCB0byBKYXZhIHRoYXQgd2lsbCBpZ25vcmUgaXQpXHJcbiAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGJyZWFrIHRoaXMgbG9vcCBpZiBzdWNoIGNhc2Ugb2NjdXJzLlxyXG4gICAgICBpZiAoaXNNYWdpY1hNTCAmJiBpID09PSBzdHJUb2subGVuZ3RoIC0gMSAmJiBzdHJUb2subGVuZ3RoICUgMiA9PT0gMSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0b2tlbiA9IHN0clRva1tpXTtcclxuICAgICAgaWYgKGlzTWFnaWNYTUwpIHtcclxuICAgICAgICAvLyB0aGUgMXN0IHRva2VuIGluIHRoZSBwYWlyIGNvbWVzIHdpdGggXCI9XCIsIHJlbW92ZSBpdC5cclxuICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcclxuICAgICAgICAgIHRva2VuID0gdG9rZW4udHJpbSgpO1xyXG4gICAgICAgICAgaWYgKHRva2VuLmVuZHNXaXRoKFwiPVwiKSkge1xyXG4gICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cigwLCB0b2tlbi5sZW5ndGggLSAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gMm5kIHRva2VuIGluIHRoZSBwYWlyIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcsIGluIHRoYXQgY2FzZSBzZXQgaXQgdG8gXCIgXCIuXHJcbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09IFwiXCIpXHJcbiAgICAgICAgICB0b2tlbiA9IFwiIFwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodG9rZW4gPT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5YTUxQYXJzZXIuZ2V0VG9rZW5zKCkgbnVsbCB0b2tlbiB2YWx1ZVwiKTtcclxuXHJcbiAgICAgIHRva2Vuc1ZlYy5wdXNoKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdG9rZW5zVmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnVuc2NhcGUgZnJvbTpcclxuICAvLy8ge1wiJmFtcDtcIixcXFxcLCBcXHEsIFxcbywgXFxsLCBcXGcsIFxcZSwgXFxcXHIsIFxcXFxufSwgdG86XHJcbiAgLy8vIHtcIiZcIiwgICAgIFxcLCAgXCIsICAnLCAgPCwgID4sICA9LCAgXFxyLCAgXFxufVxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPlN0cmluZyB0byBiZSBjb252ZXJ0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz51bmVzY2FwZWQgc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBzdGF0aWMgdW5lc2NhcGUoc3RyOiBzdHJpbmcpOiBzdHJpbmdcclxuICB7XHJcbiAgICBsZXQgdW5lc2NhcGVkU3RyaW5nOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoc3RyW2ldICE9PSAnXFxcXCcpIHtcclxuICAgICAgICB1bmVzY2FwZWRTdHJpbmcuQXBwZW5kKHN0cltpXSk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN3aXRjaCAoc3RyWysraV0pIHtcclxuICAgICAgICBjYXNlICdxJzpcclxuICAgICAgICAgIHVuZXNjYXBlZFN0cmluZy5BcHBlbmQoJ1xcXCInKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ28nOlxyXG4gICAgICAgICAgdW5lc2NhcGVkU3RyaW5nLkFwcGVuZCgnXFwnJyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsJzpcclxuICAgICAgICAgIHVuZXNjYXBlZFN0cmluZy5BcHBlbmQoJzwnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2cnOlxyXG4gICAgICAgICAgdW5lc2NhcGVkU3RyaW5nLkFwcGVuZCgnPicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZSc6XHJcbiAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcuQXBwZW5kKCc9Jyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdyJzpcclxuICAgICAgICAgIHVuZXNjYXBlZFN0cmluZy5BcHBlbmQoJ1xccicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbic6XHJcbiAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcuQXBwZW5kKCdcXG4nKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcuQXBwZW5kKHN0cltpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICh1bmVzY2FwZWRTdHJpbmcuVG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+ZXNjYXBlIGZyb206XHJcbiAgLy8vIHtcXCwgIFwiLCAgJywgIDwsICAgPiwgID0sICBcXHIsICBcXG59LCB0bzpcclxuICAvLy8ge1xcXFwsIFxccSwgXFwwLCBcXGwsICBcXGcsIFxcZSwgXFxcXHIsIFxcXFxufVxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPlN0cmluZyB0byBiZSBjb252ZXJ0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5lc2NhcGVkIHN0cmluZzwvcmV0dXJucz5cclxuICBwdWJsaWMgc3RhdGljIGVzY2FwZShzdHI6IHN0cmluZyk6IHN0cmluZ1xyXG4gIHtcclxuICAgIGxldCBlc2NhcGVkU3RyaW5nOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCAqIDIpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgc3dpdGNoIChzdHJbaV0pIHtcclxuICAgICAgICBjYXNlICdcXFxcJzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXFxcXFxcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdcIic6XHJcbiAgICAgICAgICBlc2NhcGVkU3RyaW5nLkFwcGVuZChcIlxcXFxxXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnXFwnJzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXG9cIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICc8JzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXGxcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICc+JzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXGdcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICc9JzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXGVcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdcXHInOlxyXG4gICAgICAgICAgZXNjYXBlZFN0cmluZy5BcHBlbmQoXCJcXHJcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdcXG4nOlxyXG4gICAgICAgICAgZXNjYXBlZFN0cmluZy5BcHBlbmQoXCJcXG5cIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgZXNjYXBlZFN0cmluZy5BcHBlbmQoc3RyW2ldKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChlc2NhcGVkU3RyaW5nLlRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBoZXJlIHdlIG9ubHkgbmVlZCB0byB0YWtlIGNhcmUgb2YgXCImXCIgc28gdGhhdCBTYXggcGFyc2VyIHdpbGwgYmUgYWJsZSB0byBoYW5kbGUgdXJsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGVzY2FwZVVybChzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5SZXBsYWNlKHN0ciwgXCImXCIsIFwiJmFtcDtcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Z2V0IG5leHQgdGFnIG5hbWUgZnJvbSBjdXJyZW50IGluZGV4IGluIFhNTCBzdHJpbmc8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXh0IHRhZyBuYW1lIDwvcmV0dXJucz5cclxuICBnZXROZXh0VGFnKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5feG1MZGF0YS5sZW5ndGggLSB0aGlzLl9jdXJySW5kZXggPD0gMSkge1xyXG4gICAgICByZXR1cm4gbnVsbDsgIC8vIGVuZCBvZiBYTUwgc3RyaW5nXHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgdG1wSW5keDogbnVtYmVyID0gdGhpcy5fY3VyckluZGV4ICsgMTsgdG1wSW5keCA8IHRoaXMuX3htTGRhdGEubGVuZ3RoOyB0bXBJbmR4KyspIHtcclxuICAgICAgbGV0IHRtcENoYXI6IHN0cmluZyA9IHRoaXMuX3htTGRhdGFbdG1wSW5keF07XHJcblxyXG4gICAgICAvLyBhIGxldHRlciBzdGFydHMgYW4gZWxlbWVudCBhbmQgZW5kcyB3aXRoIFwiIFwiLiBcIi9cIiBzdGFydHMgYW4gZWxlbWVudCBjbG9zaW5nIGFuZCBlbmRzIHdpdGggJz4nLlxyXG4gICAgICBpZiAoTkNoYXIuSXNMZXR0ZXIodG1wQ2hhcikgfHwgdG1wQ2hhciA9PT0gJy8nKSB7XHJcbiAgICAgICAgbGV0IGVuZE9mVGFnOiBudW1iZXIgPSBOU3RyaW5nLkluZGV4T2ZBbnkodGhpcy5feG1MZGF0YSwgWG1sUGFyc2VyLmVuZE9mTmFtZUNoYXIsIHRtcEluZHgsIHRoaXMuX3htTGRhdGEubGVuZ3RoIC0gdG1wSW5keCk7XHJcblxyXG4gICAgICAgIGlmIChlbmRPZlRhZyA9PT0gLTEpXHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5feG1MZGF0YS5zdWJzdHIodG1wSW5keCwgZW5kT2ZUYWcgLSB0bXBJbmR4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlN1YnN0cmluZyBvZiBYTUxzdHJpbmc8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdWJzdHJpbmcgb2YgWE1MIHN0cmluZyAtZnJvbSBjdXJySW5kZXggdG8gZW5kQ29udGV4dCA8L3JldHVybnM+XHJcbiAgZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5feG1MZGF0YS5zdWJzdHIodGhpcy5fY3VyckluZGV4LCBlbmRDb250ZXh0IC0gdGhpcy5fY3VyckluZGV4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgY3VycmVudCBlbGVtZW50IHZhbHVlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gZWxlbWVudCdzIHZhbHVlIDwvcmV0dXJucz5cclxuICBHZXRDdXJyZW50RWxlbWVudFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICB0aGlzLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHRoaXMuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19PUEVOLCB0aGlzLmdldEN1cnJJbmRleCgpKTtcclxuICAgIC8vIHJlYWQgdmFsdWUgb2YgeG1sIGVsZW1lbnRcclxuICAgIGxldCB2YWx1ZTogc3RyaW5nID0gdGhpcy5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICB0aGlzLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNldCBjdXJyZW50IGluZGV4IChvbiBwYXJzaW5nIHRpbWUpIHRvIHRoZSBlbmQgb2YgY3VycmVudCB0YWc8L3N1bW1hcnk+XHJcbiAgc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VyckluZGV4ID0gdGhpcy5feG1MZGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHRoaXMuX2N1cnJJbmRleCkgKyAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBpbnQgZnJvbSBzdHJpbmcgYXQgcGFyc2luZyB0aW1lPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBnZXRJbnQodmFsdWVTdHI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTk51bWJlci5QYXJzZSh2YWx1ZVN0ci50cmltKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBib29sZWFuIGZyb20gc3RyaW5nIGF0IHBhcnNpbmcgdGltZTwvc3VtbWFyeT5cclxuICBzdGF0aWMgZ2V0Qm9vbGVhbih2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdmFsdWVTdHJbMF0gPT09ICcxJztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQvc2V0IGZ1bmN0aW9ucyA0IFhNTHN0cmluZyAmIGN1cnJJbmRleCwgZm9yIHBhcnNlcjwvc3VtbWFyeT5cclxuICBnZXRDdXJySW5kZXgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJySW5kZXg7XHJcbiAgfVxyXG5cclxuICBnZXRYTUxkYXRhKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5feG1MZGF0YTtcclxuICB9XHJcblxyXG4gIGFkZDJDdXJySW5kZXgoYWRkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJJbmRleCA9IHRoaXMuX2N1cnJJbmRleCArIGFkZDtcclxuICB9XHJcblxyXG4gIHNldEN1cnJJbmRleChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJySW5kZXggPSBpbmRleDtcclxuICB9XHJcblxyXG4gIHNldFhNTGRhdGEoZGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZGF0YSAhPT0gbnVsbClcclxuICAgICAgdGhpcy5feG1MZGF0YSA9IGRhdGEudHJpbSgpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3htTGRhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLnNldEN1cnJJbmRleCgwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcHJlcGFyZSB0aGUgcGFyc2VyIHRvIHJlYWQgZnJvbSB0aGUgbmV3WG1sU3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdYbWxTdHJpbmdcIj48L3BhcmFtPlxyXG4gIFByZXBhcmVGb3JtUmVhZFN0cmluZyhuZXdYbWxTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRYTUxkYXRhKG5ld1htbFN0cmluZyk7XHJcbiAgICB0aGlzLnNldEN1cnJJbmRleCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcHVzaCB0aGUgY3VycmVudCBwYXJzaW5nIGluZm9ybWF0aW9uIGludG8gdGhlIGhpc3Rvcnkgc3RhY2s8L3N1bW1hcnk+XHJcbiAgcHVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hpc3RvcnkucHVzaCh0aGlzLl9jdXJySW5kZXgpO1xyXG4gICAgdGhpcy5faGlzdG9yeS5wdXNoKHRoaXMuX3htTGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXN0b3JlIHRoZSBwcmV2aW91cyBwYXJzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGhpc3Rvcnkgc3RhY2s8L3N1bW1hcnk+XHJcbiAgcG9wKCk6IHZvaWQge1xyXG4gICAgbGV0IGNvdW50OiBudW1iZXIgPSB0aGlzLl9oaXN0b3J5Lmxlbmd0aDtcclxuXHJcbiAgICB0aGlzLl94bUxkYXRhID0gPHN0cmluZz50aGlzLl9oaXN0b3J5LmdldF9JdGVtKGNvdW50IC0gMSk7XHJcbiAgICB0aGlzLl9jdXJySW5kZXggPSA8bnVtYmVyPnRoaXMuX2hpc3RvcnkuZ2V0X0l0ZW0oY291bnQgLSAyKTtcclxuXHJcbiAgICB0aGlzLl9oaXN0b3J5LlNldFNpemUoY291bnQgLSAyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXRzIGEgdGFibGUgY2FjaGUgeG1sIGFuZCBzZXQgdGhlIHhtbHBhcnNlciBkYXRhIGFuZCBpbmRleCBhY2NvcmRpbmdseTwvc3VtbWFyeT5cclxuICBsb2FkVGFibGVDYWNoZURhdGEoZGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFhNTGRhdGEoZGF0YSk7XHJcbiAgICB0aGlzLnNldEN1cnJJbmRleCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVhZHMgdGhlIFhNTCBmcm9tIHRoZSBlbGVtZW50IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIHVudGlsIHRoZSBlbmQgb2ZcclxuICAvLy8gdGhlIGVsZW1lbnQsIHJldHVybmluZyB0aGUgY29udGVudHMgYXMgYSBzdHJpbmcuIFRoaXMgYWxsb3dzIGRlZmVycmluZyB0aGVcclxuICAvLy8gcHJvY2Vzc2luZyBvZiBhbiBlbGVtZW50IHVudGlsIHRoZSB0aW1lIGlzIHJpZ2h0IHRvIGRvIHNvLjxici8+XHJcbiAgLy8vIFRoZSByZXR1cm5lZCBzdHJpbmcgY29udGFpbnMgdGhlIGVsZW1lbnQgdGFnIGl0c2VsZi4gRm9yIGV4YW1wbGU6PGJyLz5cclxuICAvLy8gLSBBc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgJ2VsZW1lbnQxJywgd2l0aCAyICdpbm5lckVsZW1lbnQnIGVsZW1lbnRzLCB0aGVcclxuICAvLy8gcmVzdWx0aW5nIHN0cmluZyB3aWxsIGxvb2sgbGlrZSB0aGlzOjxici8+XHJcbiAgLy8vIDxlbGVtZW50MT5cclxuICAvLy8gICA8aW5uZXJlbGVtZW50Lz5cclxuICAvLy8gICA8aW5uZXJlbGVtZW50Lz5cclxuICAvLy8gPC9lbGVtZW50MT5cclxuICAvLy9cclxuICAvLy8gVGhpcyBtYWtlcyB0aGUgcmVzdWx0IHZhbGlkIGZvciBwcm9jZXNzaW5nIGJ5IHRoaXMgWE1MIHBhcnNlci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpOiBzdHJpbmcge1xyXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IHRhZyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIF9jdXJySW5kZXguXHJcbiAgICBsZXQgY3VycmVudFRhZzogc3RyaW5nID0gdGhpcy5nZXROZXh0VGFnKCk7XHJcbiAgICBsZXQgY3VycmVudFRhZ0luZGV4OiBudW1iZXIgPSB0aGlzLl94bUxkYXRhLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19PUEVOICsgY3VycmVudFRhZywgdGhpcy5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSBlbGVtZW50J3MgYmxvY2sgaW4gdGhlIFhNTC5cclxuICAgIC8vIGZpbmQgbmV4dCBvcGVuIHRhZ1xyXG4gICAgbGV0IG5leHRPcGVuVGFnSW5kZXg6IG51bWJlciA9IHRoaXMuX3htTGRhdGEuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX09QRU4sIGN1cnJlbnRUYWdJbmRleCArIDEpO1xyXG4gICAgaWYgKG5leHRPcGVuVGFnSW5kZXggPT09IC0xKVxyXG4gICAgICBuZXh0T3BlblRhZ0luZGV4ID0gdGhpcy5feG1MZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgLy8gZmluZCBhIGNsb3NlIHRhZyBCRUZPUkUgdGhlIG5leHQgb3BlbiB0YWdcclxuICAgIGxldCBlbGVtZW50RW5kSW5kZXg6IG51bWJlciA9IE5TdHJpbmcuSW5kZXhPZih0aGlzLl94bUxkYXRhLCBYTUxDb25zdGFudHMuVEFHX1RFUk0sIHRoaXMuZ2V0Q3VyckluZGV4KCksIG5leHRPcGVuVGFnSW5kZXggLSB0aGlzLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbGVtZW50RW5kSW5kZXggPT09IC0xKVxyXG4gICAgLy8gY2xvc2UgdGFnIHdhcyBub3QgZm91bmQgaW4gcmFuZ2UgLSB3ZSBoYXZlIGlubmVyIGVsZW1lbnRzLCBsb29rIGZvciB0aGUgZnVsbCBjbG9zZSB0YWdcclxuICAgICAgZWxlbWVudEVuZEluZGV4ID0gdGhpcy5feG1MZGF0YS5pbmRleE9mKFwiL1wiICsgY3VycmVudFRhZywgdGhpcy5nZXRDdXJySW5kZXgoKSkgKyBjdXJyZW50VGFnLmxlbmd0aCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGg7XHJcbiAgICBlbHNlXHJcbiAgICAgIGVsZW1lbnRFbmRJbmRleCA9IGVsZW1lbnRFbmRJbmRleCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGg7XHJcblxyXG4gICAgLy8gQ29weSB0aGUgZWxlbWVudCBkYXRhIHNvIGl0IGNhbiBiZSByZXR1cm5lZC5cclxuICAgIGxldCBlbGVtZW50QmxvY2s6IHN0cmluZyA9IHRoaXMuZ2V0WE1Mc3Vic3RyaW5nKGVsZW1lbnRFbmRJbmRleCk7XHJcblxyXG4gICAgLy8gTW92ZSB0aGUgcGFyc2VyIHRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQgYmxvY2suXHJcbiAgICB0aGlzLnNldEN1cnJJbmRleChlbGVtZW50RW5kSW5kZXgpO1xyXG5cclxuICAgIHJldHVybiBlbGVtZW50QmxvY2s7XHJcbiAgfVxyXG5cclxuICBSZWFkQ29udGVudE9mQ3VycmVudEVsZW1lbnQoKTogc3RyaW5nIHtcclxuICAgIC8vIEdldCB0aGUgY3VycmVudCB0YWcgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBfY3VyckluZGV4LlxyXG4gICAgbGV0IGN1cnJlbnRUYWc6IHN0cmluZyA9IHRoaXMuZ2V0TmV4dFRhZygpO1xyXG5cclxuICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgZWxlbWVudCdzIGJsb2NrIGluIHRoZSBYTUwuXHJcbiAgICBsZXQgZWxlbWVudEVuZEluZGV4OiBudW1iZXIgPSB0aGlzLl94bUxkYXRhLmluZGV4T2YoXCI8L1wiICsgY3VycmVudFRhZyArIFwiPlwiLCB0aGlzLmdldEN1cnJJbmRleCgpKTtcclxuXHJcbiAgICBpZiAoZWxlbWVudEVuZEluZGV4ID09PSAtMSlcclxuICAgICAgLy8gQ2FuJ3QgZmluZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgLSBlaXRoZXIgWE1MIGlzIGZhdWx0eSBvciB0aGUgZWxlbWVudCBpcyBlbXB0eS5cclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcblxyXG4gICAgLy8gTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBvcGVuaW5nIHRhZ1xyXG4gICAgdGhpcy5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuXHJcbiAgICAvLyBDb3B5IHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50IChmcm9tIHRoZSBlbmQgb2YgdGhlIG9wZW5pbmcgdGFnIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsb3NpbmcgdGFnKS5cclxuICAgIGxldCBlbGVtZW50QmxvY2s6IHN0cmluZyA9IHRoaXMuZ2V0WE1Mc3Vic3RyaW5nKGVsZW1lbnRFbmRJbmRleCk7XHJcblxyXG4gICAgLy8gTW92ZSB0aGUgcGFyc2VyIHRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQgYmxvY2suXHJcbiAgICB0aGlzLnNldEN1cnJJbmRleChlbGVtZW50RW5kSW5kZXgpO1xyXG4gICAgdGhpcy5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuXHJcbiAgICByZXR1cm4gZWxlbWVudEJsb2NrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCB2aXN1YWxpemVzIHRoZSBYTUwgcGFyc2VyIHN0YXRlIChlLmcuIGZvciBkZWJ1ZyB3YXRjaCBsaXN0Lik8YnIvPlxyXG4gIC8vLyBUaGUgbWV0aG9kIHdpbGwgc2hvdyB0aGUgWE1MIGRhdGEsIHRyaW1taW5nIGl0IHRvIDIwIGNoYXJhY3RlcnMgYmVmb3JlIHRoZVxyXG4gIC8vLyBjdXJyZW50IHBvc2l0aW9uIChfY3VyckluZGV4KSBhbmQgdXAgdG8gNTAgY2hhcmFjdGVycyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbi5cclxuICAvLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gaXRzZWxmIHdpbGwgYmUgbWFya2VkIHdpdGggYSBtYXJrZXIgdGhhdCBsb29rcyBsaWtlOlxyXG4gIC8vLyB8LXtjdXJyZW50IGluZGV4fS18IDxici8+XHJcbiAgLy8vIFRoZSBtYXJrZXIgd2lsbCBiZSBwbGFjZWQgaW1tZWRpYXRlbHkgYmVmb3JlIF94bWxEYXRhW19jdXJySW5kZXhdLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaGVhZENoYXJDb3VudFwiPk51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNob3cgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1hcmtlci48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhaWxDaGFyQ291bnRcIj5OdW1iZXIgb2YgY2hhcmFjdGVycyB0byBzaG93IGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1hcmtlci48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xyXG4gIHRvU3RyaW5nKGhlYWRDaGFyQ291bnQ6IG51bWJlciwgdGFpbENoYXJDb3VudDogbnVtYmVyKTogc3RyaW5nO1xyXG4gIHRvU3RyaW5nKGhlYWRDaGFyQ291bnQ/OiBudW1iZXIsIHRhaWxDaGFyQ291bnQ/OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuVG9TdHJpbmdfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuVG9TdHJpbmdfMShoZWFkQ2hhckNvdW50LCB0YWlsQ2hhckNvdW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2VuZXJhdGVzIGEgc3RyaW5nIHRoYXQgdmlzdWFsaXplcyB0aGUgWE1MIHBhcnNlciBzdGF0ZSAoZS5nLiBmb3IgZGVidWcgd2F0Y2ggbGlzdC4pPGJyLz5cclxuICAvLy8gVGhlIG1ldGhvZCB3aWxsIHNob3cgdGhlIFhNTCBkYXRhLCB0cmltbWluZyBpdCB0byAyMCBjaGFyYWN0ZXJzIGJlZm9yZSB0aGVcclxuICAvLy8gY3VycmVudCBwb3NpdGlvbiAoX2N1cnJJbmRleCkgYW5kIHVwIHRvIDUwIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgLy8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIGl0c2VsZiB3aWxsIGJlIG1hcmtlZCB3aXRoIGEgbWFya2VyIHRoYXQgbG9va3MgbGlrZTpcclxuICAvLy8gfC17Y3VycmVudCBpbmRleH0tfCA8YnIvPlxyXG4gIC8vLyBUaGUgbWFya2VyIHdpbGwgYmUgcGxhY2VkIGltbWVkaWF0ZWx5IGJlZm9yZSBfeG1sRGF0YVtfY3VyckluZGV4XS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBUb1N0cmluZ18wKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygyMCwgNTApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCB2aXN1YWxpemVzIHRoZSBYTUwgcGFyc2VyIHN0YXRlIChlLmcuIGZvciBkZWJ1ZyB3YXRjaCBsaXN0Lik8YnIvPlxyXG4gIC8vLyBUaGUgbWV0aG9kIHdpbGwgc2hvdyB0aGUgWE1MIGRhdGEsIHRyaW1taW5nIGl0IHRvIGhlYWRDaGFyQ291bnQgY2hhcmFjdGVycyBiZWZvcmUgdGhlXHJcbiAgLy8vIGN1cnJlbnQgcG9zaXRpb24gKF9jdXJySW5kZXgpIGFuZCB1cCB0byB0YWlsQ2hhckNvdW50IGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgLy8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIGl0c2VsZiB3aWxsIGJlIG1hcmtlZCB3aXRoIGEgbWFya2VyIHRoYXQgbG9va3MgbGlrZTpcclxuICAvLy8gfC17Y3VycmVudCBpbmRleH0tfCA8YnIvPlxyXG4gIC8vLyBUaGUgbWFya2VyIHdpbGwgYmUgcGxhY2VkIGltbWVkaWF0ZWx5IGJlZm9yZSBfeG1sRGF0YVtfY3VyckluZGV4XS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhlYWRDaGFyQ291bnRcIj5OdW1iZXIgb2YgY2hhcmFjdGVycyB0byBzaG93IGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiBtYXJrZXIuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YWlsQ2hhckNvdW50XCI+TnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2hvdyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbiBtYXJrZXIuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgVG9TdHJpbmdfMShoZWFkQ2hhckNvdW50OiBudW1iZXIsIHRhaWxDaGFyQ291bnQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFya2VyUG9zaXRpb246IG51bWJlciA9IE1hdGgubWluKHRoaXMuX2N1cnJJbmRleCwgdGhpcy5feG1MZGF0YS5sZW5ndGgpO1xyXG4gICAgbGV0IHNlZ21lbnRTdGFydEluZGV4OiBudW1iZXIgPSBNYXRoLm1heCgwLCBtYXJrZXJQb3NpdGlvbiAtIGhlYWRDaGFyQ291bnQpO1xyXG4gICAgbGV0IHNlZ21lbnRFbmRJbmRleDogbnVtYmVyID0gTWF0aC5taW4odGhpcy5feG1MZGF0YS5sZW5ndGgsIG1hcmtlclBvc2l0aW9uICsgdGFpbENoYXJDb3VudCk7XHJcblxyXG4gICAgbGV0IGhlYWRMZW5ndGg6IG51bWJlciA9IG1hcmtlclBvc2l0aW9uIC0gc2VnbWVudFN0YXJ0SW5kZXg7XHJcbiAgICBsZXQgdGFpbExlbmd0aDogbnVtYmVyID0gc2VnbWVudEVuZEluZGV4IC0gbWFya2VyUG9zaXRpb247XHJcblxyXG4gICAgbGV0IHNlZ21lbnQ6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgaWYgKHNlZ21lbnRTdGFydEluZGV4ID4gMClcclxuICAgICAgc2VnbWVudC5BcHBlbmQoXCIuLi5cIik7XHJcblxyXG4gICAgaWYgKGhlYWRMZW5ndGggPiAwKVxyXG4gICAgICBzZWdtZW50LkFwcGVuZCh0aGlzLl94bUxkYXRhLCBzZWdtZW50U3RhcnRJbmRleCwgaGVhZExlbmd0aCk7XHJcblxyXG4gICAgc2VnbWVudC5BcHBlbmQoXCJ8LXtcIikuQXBwZW5kKHRoaXMuX2N1cnJJbmRleCkuQXBwZW5kKFwifS18XCIpO1xyXG5cclxuICAgIGlmICh0YWlsTGVuZ3RoID4gMClcclxuICAgICAgc2VnbWVudC5BcHBlbmQodGhpcy5feG1MZGF0YSwgdGhpcy5fY3VyckluZGV4LCB0YWlsTGVuZ3RoKTtcclxuXHJcbiAgICBpZiAoc2VnbWVudEVuZEluZGV4IDwgdGhpcy5feG1MZGF0YS5sZW5ndGgpXHJcbiAgICAgIHNlZ21lbnQuQXBwZW5kKFwiLi4uXCIpO1xyXG5cclxuICAgIHJldHVybiBzZWdtZW50LlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBTa2lwWE1MRWxlbWVudCgpOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSB0aGlzLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfVEVSTSwgdGhpcy5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHRoaXMuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=