@magic-xpa/utils 4.1000.0 → 4.1100.0-dev000.0

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.
Files changed (81) hide show
  1. package/README.md +6 -6
  2. package/{esm2020 → esm2022}/index.mjs +27 -27
  3. package/{esm2020 → esm2022}/magic-xpa-utils.mjs +1 -1
  4. package/esm2022/src/Base64.mjs +164 -0
  5. package/{esm2020 → esm2022}/src/ChoiceUtils.mjs +78 -78
  6. package/esm2022/src/Constants.mjs +74 -0
  7. package/{esm2020 → esm2022}/src/DateTimeUtils.mjs +53 -53
  8. package/esm2022/src/DateUtil.mjs +58 -0
  9. package/esm2022/src/InternalInterface.mjs +341 -0
  10. package/{esm2020 → esm2022}/src/JSON_Utils.mjs +6 -6
  11. package/esm2022/src/Logger.mjs +216 -0
  12. package/{esm2020 → esm2022}/src/MagicConstants.mjs +11 -11
  13. package/{esm2020 → esm2022}/src/Misc.mjs +97 -97
  14. package/esm2022/src/MsgInterface.mjs +192 -0
  15. package/esm2022/src/PICInterface.mjs +60 -0
  16. package/esm2022/src/PlatformUtils.mjs +11 -0
  17. package/esm2022/src/Queue.mjs +28 -0
  18. package/esm2022/src/Randomizer.mjs +34 -0
  19. package/esm2022/src/RequestInfo.mjs +28 -0
  20. package/esm2022/src/Rtf.mjs +614 -0
  21. package/{esm2020 → esm2022}/src/StorageAttribute.mjs +83 -83
  22. package/esm2022/src/StrUtil.mjs +453 -0
  23. package/esm2022/src/SyncExecutionHelper.mjs +21 -0
  24. package/esm2022/src/UtilDateJpn.mjs +232 -0
  25. package/esm2022/src/UtilImeJpn.mjs +13 -0
  26. package/esm2022/src/UtilStrByteMode.mjs +300 -0
  27. package/esm2022/src/XMLConstants.mjs +169 -0
  28. package/esm2022/src/Xml/XmlParser.mjs +247 -0
  29. package/{esm2020 → esm2022}/src/enums.mjs +1762 -1762
  30. package/{fesm2015 → fesm2022}/magic-xpa-utils.mjs +5285 -5289
  31. package/fesm2022/magic-xpa-utils.mjs.map +1 -0
  32. package/index.d.ts +26 -26
  33. package/package.json +7 -13
  34. package/src/Base64.d.ts +17 -17
  35. package/src/ChoiceUtils.d.ts +5 -5
  36. package/src/Constants.d.ts +71 -71
  37. package/src/DateTimeUtils.d.ts +5 -5
  38. package/src/DateUtil.d.ts +6 -6
  39. package/src/InternalInterface.d.ts +337 -337
  40. package/src/JSON_Utils.d.ts +3 -3
  41. package/src/Logger.d.ts +49 -49
  42. package/src/MagicConstants.d.ts +9 -9
  43. package/src/Misc.d.ts +13 -13
  44. package/src/MsgInterface.d.ts +175 -175
  45. package/src/PICInterface.d.ts +50 -50
  46. package/src/PlatformUtils.d.ts +5 -5
  47. package/src/Queue.d.ts +9 -9
  48. package/src/Randomizer.d.ts +14 -14
  49. package/src/RequestInfo.d.ts +15 -14
  50. package/src/Rtf.d.ts +152 -152
  51. package/src/StorageAttribute.d.ts +14 -14
  52. package/src/StrUtil.d.ts +45 -45
  53. package/src/SyncExecutionHelper.d.ts +7 -7
  54. package/src/UtilDateJpn.d.ts +19 -19
  55. package/src/UtilImeJpn.d.ts +9 -9
  56. package/src/UtilStrByteMode.d.ts +27 -27
  57. package/src/XMLConstants.d.ts +167 -167
  58. package/src/Xml/XmlParser.d.ts +34 -34
  59. package/src/enums.d.ts +1564 -1564
  60. package/esm2020/src/Base64.mjs +0 -164
  61. package/esm2020/src/Constants.mjs +0 -74
  62. package/esm2020/src/DateUtil.mjs +0 -58
  63. package/esm2020/src/InternalInterface.mjs +0 -341
  64. package/esm2020/src/Logger.mjs +0 -216
  65. package/esm2020/src/MsgInterface.mjs +0 -192
  66. package/esm2020/src/PICInterface.mjs +0 -60
  67. package/esm2020/src/PlatformUtils.mjs +0 -11
  68. package/esm2020/src/Queue.mjs +0 -28
  69. package/esm2020/src/Randomizer.mjs +0 -34
  70. package/esm2020/src/RequestInfo.mjs +0 -26
  71. package/esm2020/src/Rtf.mjs +0 -616
  72. package/esm2020/src/StrUtil.mjs +0 -453
  73. package/esm2020/src/SyncExecutionHelper.mjs +0 -23
  74. package/esm2020/src/UtilDateJpn.mjs +0 -234
  75. package/esm2020/src/UtilImeJpn.mjs +0 -13
  76. package/esm2020/src/UtilStrByteMode.mjs +0 -300
  77. package/esm2020/src/XMLConstants.mjs +0 -169
  78. package/esm2020/src/Xml/XmlParser.mjs +0 -247
  79. package/fesm2015/magic-xpa-utils.mjs.map +0 -1
  80. package/fesm2020/magic-xpa-utils.mjs +0 -5328
  81. package/fesm2020/magic-xpa-utils.mjs.map +0 -1
@@ -0,0 +1,247 @@
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=