@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,216 +0,0 @@
1
- import { Logger_LogLevels, Logger_MessageDirection } from "./enums";
2
- import { DateTime, Debug, Exception, NString, StringBuilder, Thread, isNullOrUndefined } from "@magic-xpa/mscorelib";
3
- import { OSEnvironment } from "./PlatformUtils";
4
- import { DateTimeUtils } from "./DateTimeUtils";
5
- import { XMLConstants } from "./XMLConstants";
6
- import { RequestInfo } from "./RequestInfo";
7
- import { StrUtil } from "./StrUtil";
8
- export var LogType;
9
- (function (LogType) {
10
- LogType[LogType["info"] = 1] = "info";
11
- LogType[LogType["warning"] = 2] = "warning";
12
- LogType[LogType["error"] = 3] = "error";
13
- })(LogType || (LogType = {}));
14
- export class Logger {
15
- static instance = null;
16
- LogLevel = 0;
17
- ShouldBeep = false;
18
- static set Instance(value) {
19
- Logger.instance = value;
20
- }
21
- static get Instance() {
22
- if (Logger.instance === null) {
23
- Logger.instance = new Logger();
24
- }
25
- return Logger.instance;
26
- }
27
- Initialize(logLevel, shouldBeep) {
28
- try {
29
- this.LogLevel = logLevel;
30
- this.ShouldBeep = shouldBeep;
31
- }
32
- catch (e) {
33
- this.WriteDevToLog("ClientManager.init(): " + e.Message);
34
- }
35
- }
36
- ShouldLog(logLevel) {
37
- if (arguments.length === 1)
38
- return this.ShouldLog_0(logLevel);
39
- else
40
- return this.ShouldLog_1();
41
- }
42
- ShouldLog_0(logLevel) {
43
- return this.LogLevel === logLevel;
44
- }
45
- ShouldLog_1() {
46
- return this.LogLevel > Logger_LogLevels.None;
47
- }
48
- ShouldLogServerRelatedMessages() {
49
- return (this.ShouldLogExtendedServerRelatedMessages() || Logger.Instance.ShouldLog(Logger_LogLevels.Server)) && this.LogLevel !== Logger_LogLevels.Basic;
50
- }
51
- ShouldLogExtendedServerRelatedMessages() {
52
- return (Logger.Instance.ShouldLog(Logger_LogLevels.ServerMessages) || Logger.Instance.ShouldLog(Logger_LogLevels.Support) || Logger.Instance.ShouldLog(Logger_LogLevels.Development)) && this.LogLevel !== Logger_LogLevels.Basic;
53
- }
54
- WriteToLog(msg, openIfNecessary, logType = LogType.info) {
55
- if (this.LogLevel > Logger_LogLevels.None || openIfNecessary) {
56
- msg = NString.Format("{0} {1}", (this.LogLevel === Logger_LogLevels.Basic) ? new Date().toISOString() : DateTimeUtils.ToString(DateTime.Now, XMLConstants.ERROR_LOG_TIME_FORMAT, this), msg);
57
- switch (logType) {
58
- case LogType.error:
59
- console.error(msg);
60
- break;
61
- case LogType.warning:
62
- console.warn(msg);
63
- break;
64
- default:
65
- console.log(msg);
66
- }
67
- }
68
- }
69
- WriteServerToLog(msg) {
70
- if (this.ShouldLogServerRelatedMessages()) {
71
- this.WriteToLog(NString.Format("Server, Thread={0}: ", Thread.CurrentThread.ManagedThreadId) + msg, false, LogType.info);
72
- }
73
- }
74
- WriteServerMessagesToLog(msg) {
75
- if (this.ShouldLogExtendedServerRelatedMessages()) {
76
- this.WriteToLog("Server#: " + msg, false, LogType.info);
77
- }
78
- }
79
- WriteSupportToLog(msg, skipLine) {
80
- if (this.LogLevel >= Logger_LogLevels.Support && this.LogLevel !== Logger_LogLevels.Basic) {
81
- if (skipLine) {
82
- this.WriteToLog("SUPPORT: " + msg, false, LogType.info);
83
- }
84
- else {
85
- this.WriteToLog("SUPPORT: " + msg + OSEnvironment.EolSeq + "-----------------------------------------------------------------------------------------------------------", false, LogType.info);
86
- }
87
- }
88
- }
89
- WriteGuiToLog(msg) {
90
- if (this.LogLevel >= Logger_LogLevels.Gui && this.LogLevel !== Logger_LogLevels.Basic) {
91
- this.WriteToLog(msg, false, LogType.info);
92
- }
93
- }
94
- WriteDevToLog(msg) {
95
- if (this.LogLevel >= Logger_LogLevels.Development && this.LogLevel !== Logger_LogLevels.Basic) {
96
- this.WriteToLog("DEV: " + msg, false, LogType.info);
97
- }
98
- }
99
- WriteBasicToLog(messageDirection, contextID, sessionCounter, clientID, serverID, responseTime, statusCode, httpHeaders, contentLength) {
100
- if (this.LogLevel === Logger_LogLevels.Basic) {
101
- let text = httpHeaders;
102
- text = text.trim();
103
- text = NString.Replace(text, "\r\n", "|");
104
- let arg_E4_0 = "RIA,{0}_{1},{2},{3},{4},{5},-,{6},{7},{8},{9},{10},{11}";
105
- let expr_3E = new Array(12);
106
- expr_3E[1] = Thread.CurrentThread.ManagedThreadId;
107
- expr_3E[2] = new Date().toISOString();
108
- expr_3E[3] = ((messageDirection === Logger_MessageDirection.MessageLeaving) ? "MSGL" : "MSGE");
109
- expr_3E[4] = contextID;
110
- expr_3E[5] = sessionCounter;
111
- expr_3E[6] = clientID;
112
- expr_3E[7] = serverID;
113
- expr_3E[8] = ((responseTime !== 0) ? responseTime.toString() : "-");
114
- let arg_D3_1 = 9;
115
- let arg_D3_2;
116
- arg_D3_2 = statusCode;
117
- expr_3E[arg_D3_1] = arg_D3_2;
118
- expr_3E[10] = text;
119
- expr_3E[11] = contentLength;
120
- let value = NString.Format(arg_E4_0, expr_3E);
121
- console.log(value);
122
- }
123
- }
124
- WriteRequestInfoToLog(requestInfo, extraMessageStr) {
125
- if (this.LogLevel === Logger_LogLevels.RequestInfo) {
126
- console.log(extraMessageStr, RequestInfo.clone(requestInfo));
127
- }
128
- }
129
- WriteBasicErrorToLog() {
130
- Debug.Assert(this.LogLevel === Logger_LogLevels.Basic);
131
- }
132
- WriteErrorToLog(msg) {
133
- this.WriteToLog("MagicWeb [ERROR]: " + StrUtil.getConsoleErorString(msg), true, LogType.error);
134
- }
135
- WriteExceptionToLog(msgOrEx, msg) {
136
- if (msgOrEx instanceof Error) {
137
- this.WriteExceptionToLog_2(msgOrEx, msg);
138
- return;
139
- }
140
- if (arguments.length === 1 && (msgOrEx !== null || msgOrEx instanceof Exception)) {
141
- this.WriteExceptionToLog_1(msgOrEx);
142
- return;
143
- }
144
- this.WriteExceptionToLog_3(msgOrEx, msg);
145
- }
146
- WriteExceptionToLogWithMsg(msg) {
147
- this.WriteToLog("MagicWeb [ERROR]: " + StrUtil.getConsoleErorString(msg), true, LogType.error);
148
- }
149
- WriteExceptionToLog_1(ex) {
150
- this.WriteExceptionToLogWithMsg(NString.Format("{0} : {1}{2}{3}{4}", [
151
- ex.GetType(), OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
152
- ]));
153
- }
154
- WriteExceptionToLog_2(ex, message) {
155
- if (isNullOrUndefined(message))
156
- this.WriteExceptionToLogWithMsg(NString.Format("{0}{1}{2}", [ex.stack, OSEnvironment.EolSeq, ex.message]));
157
- else
158
- this.WriteExceptionToLogWithMsg(NString.Format("{0}{1}{2}{4}{5}", [message, OSEnvironment.EolSeq, ex.stack, OSEnvironment.EolSeq, ex.message]));
159
- }
160
- WriteExceptionToLog_3(ex, msg) {
161
- this.WriteExceptionToLogWithMsg(NString.Format("{0}, {1} : {2}{3}{4}{5}", [
162
- ex.GetType(), msg, OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
163
- ]));
164
- }
165
- WriteWarningToLog(msgOrEx, msg) {
166
- if (arguments.length === 1 && msgOrEx !== null) {
167
- if (msgOrEx instanceof Exception)
168
- this.WriteWarningToLog_1(msgOrEx);
169
- else if (msgOrEx instanceof Error)
170
- this.WriteWarningToLog_2(msgOrEx);
171
- }
172
- else
173
- this.WriteWarningToLog_3(msgOrEx, msg);
174
- }
175
- WriteWarningToLogWithMsg(msg) {
176
- if (this.LogLevel !== Logger_LogLevels.Basic) {
177
- this.WriteToLog("MagicWeb [WARNING]: " + msg, true, LogType.warning);
178
- }
179
- }
180
- WriteWarningToLog_1(ex) {
181
- this.WriteWarningToLogWithMsg(ex.GetType() + " : " + OSEnvironment.EolSeq + ex.StackTrace + OSEnvironment.EolSeq + ex.Message);
182
- }
183
- WriteWarningToLog_2(ex) {
184
- this.WriteWarningToLogWithMsg(NString.Format("{0}{1}{2}", [
185
- ex.stack, OSEnvironment.EolSeq, ex.message
186
- ]));
187
- }
188
- WriteWarningToLog_3(ex, msg) {
189
- this.WriteWarningToLogWithMsg(NString.Format("{0}, {1} : {2}{3}{4}{5}", [
190
- ex.GetType(), msg, OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
191
- ]));
192
- }
193
- WriteStackTrace(stackTrace, framesToPrint, traceTitle) {
194
- if (traceTitle === null) {
195
- traceTitle = "Stack trace:";
196
- }
197
- let stringBuilder = new StringBuilder(traceTitle + OSEnvironment.EolSeq);
198
- let frames = stackTrace.GetFrames();
199
- let array = frames;
200
- for (let i = 0; i < array.length; i = i + 1) {
201
- let stackFrame = array[i];
202
- framesToPrint = framesToPrint - 1;
203
- stringBuilder.Append(stackFrame.toString());
204
- if (framesToPrint === 0) {
205
- stringBuilder.Append("\t... more stack frames ...\n");
206
- break;
207
- }
208
- }
209
- this.WriteToLog(stringBuilder.ToString(), true);
210
- }
211
- Flush() {
212
- }
213
- constructor() {
214
- }
215
- }
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdXRpbHMvc3JjL0xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDbEUsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDL0gsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBR2xDLE1BQU0sQ0FBTixJQUFZLE9BSVg7QUFKRCxXQUFZLE9BQU87SUFDakIscUNBQVEsQ0FBQTtJQUNSLDJDQUFPLENBQUE7SUFDUCx1Q0FBSyxDQUFBO0FBQ1AsQ0FBQyxFQUpXLE9BQU8sS0FBUCxPQUFPLFFBSWxCO0FBT0QsTUFBTSxPQUFPLE1BQU07SUFDakIsTUFBTSxDQUFDLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDL0IsUUFBUSxHQUFxQixDQUFDLENBQUM7SUFLL0IsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUU1QixNQUFNLEtBQUssUUFBUSxDQUFDLEtBQWE7UUFDL0IsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU0sS0FBSyxRQUFRO1FBQ2pCLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDNUIsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFPRCxVQUFVLENBQUMsUUFBMEIsRUFBRSxVQUFtQjtRQUN4RCxJQUFJO1lBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7U0FZOUI7UUFDRCxPQUFPLENBQUMsRUFBRTtZQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzFEO0lBQ0gsQ0FBQztJQVFELFNBQVMsQ0FBQyxRQUEyQjtRQUNuQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7O1lBRWxDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTyxXQUFXLENBQUMsUUFBMEI7UUFDNUMsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRU8sV0FBVztRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQy9DLENBQUM7SUFFRCw4QkFBOEI7UUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7SUFDM0osQ0FBQztJQUVELHNDQUFzQztRQUNwQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLEtBQUssQ0FBQztJQUNwTyxDQUFDO0lBTUQsVUFBVSxDQUFDLEdBQVcsRUFBRSxlQUF3QixFQUFFLFVBQW1CLE9BQU8sQ0FBQyxJQUFJO1FBRS9FLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFO1lBQzVELEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEVBQ2pLLEdBQUcsQ0FBQyxDQUFDO1lBRTFCLFFBQVEsT0FBTyxFQUFFO2dCQUNmLEtBQUssT0FBTyxDQUFDLEtBQUs7b0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLE1BQU07Z0JBQ1IsS0FBSyxPQUFPLENBQUMsT0FBTztvQkFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEIsTUFBTTtnQkFDUjtvQkFDRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3BCO1NBQ0Y7SUFDSCxDQUFDO0lBTUQsZ0JBQWdCLENBQUMsR0FBVztRQUMxQixJQUFJLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFIO0lBQ0gsQ0FBQztJQU1ELHdCQUF3QixDQUFDLEdBQVc7UUFDbEMsSUFBSSxJQUFJLENBQUMsc0NBQXNDLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6RDtJQUNILENBQUM7SUFJRCxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsUUFBaUI7UUFFOUMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUN6RixJQUFJLFFBQVEsRUFBRTtnQkFDWixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN6RDtpQkFDSTtnQkFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyw2R0FBNkcsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hNO1NBQ0Y7SUFDSCxDQUFDO0lBTUQsYUFBYSxDQUFDLEdBQVc7UUFFdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUNyRixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNDO0lBQ0gsQ0FBQztJQU1ELGFBQWEsQ0FBQyxHQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDN0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBU0QsZUFBZSxDQUFDLGdCQUF5QyxFQUFFLFNBQWlCLEVBQUUsY0FBc0IsRUFBRSxRQUFnQixFQUFFLFFBQWdCLEVBQUUsWUFBb0IsRUFBRSxVQUFrQixFQUFFLFdBQW1CLEVBQUUsYUFBcUI7UUFDNU4sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUM1QyxJQUFJLElBQUksR0FBVyxXQUFXLENBQUM7WUFDL0IsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksUUFBUSxHQUFXLHlEQUF5RCxDQUFDO1lBQ2pGLElBQUksT0FBTyxHQUFVLElBQUksS0FBSyxDQUFNLEVBQUUsQ0FBQyxDQUFDO1lBSXhDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQztZQUNsRCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixLQUFLLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9GLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDdkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUM1QixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDdEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEUsSUFBSSxRQUFRLEdBQVcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksUUFBYSxDQUFDO1lBQ2xCLFFBQVEsR0FBRyxVQUFVLENBQUM7WUFDdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUM3QixPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUM7WUFDNUIsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFNRCxxQkFBcUIsQ0FBQyxXQUF3QixFQUFFLGVBQXVCO1FBQ3JFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7WUFJbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQVVELG9CQUFvQjtRQUNsQixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFPekQsQ0FBQztJQU1ELGVBQWUsQ0FBQyxHQUFXO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQVNELG1CQUFtQixDQUFDLE9BQVksRUFBRSxHQUFZO1FBQzVDLElBQUksT0FBTyxZQUFZLEtBQUssRUFBRTtZQUM1QixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLE9BQU87U0FDUjtRQUNELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sWUFBWSxTQUFTLENBQUMsRUFBRTtZQUNoRixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsMEJBQTBCLENBQUMsR0FBVztRQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxFQUFhO1FBQ3pDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFO1lBQ25FLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTztTQUNwRixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxFQUFTLEVBQUUsT0FBZTtRQUN0RCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztZQUM1QixJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFM0csSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwSixDQUFDO0lBRU8scUJBQXFCLENBQUMsRUFBYSxFQUFFLEdBQVc7UUFDdEQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMseUJBQXlCLEVBQUU7WUFDeEUsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTztTQUN6RixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFPRCxpQkFBaUIsQ0FBQyxPQUFZLEVBQUUsR0FBWTtRQUMxQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDOUMsSUFBSSxPQUFPLFlBQVksU0FBUztnQkFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUMvQixJQUFJLE9BQU8sWUFBWSxLQUFLO2dCQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDckM7O1lBRUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsd0JBQXdCLENBQUMsR0FBVztRQUVsQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1lBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEU7SUFDSCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsRUFBYTtRQUN2QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakksQ0FBQztJQUVPLG1CQUFtQixDQUFDLEVBQVM7UUFDbkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3hELEVBQUUsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTztTQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxFQUFhLEVBQUUsR0FBVztRQUNwRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRTtZQUN0RSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPO1NBQ3pGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUFzQixFQUFFLGFBQXFCLEVBQUUsVUFBa0I7UUFFL0UsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLFVBQVUsR0FBRyxjQUFjLENBQUM7U0FDN0I7UUFDRCxJQUFJLGFBQWEsR0FBa0IsSUFBSSxhQUFhLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RixJQUFJLE1BQU0sR0FBbUIsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BELElBQUksS0FBSyxHQUFtQixNQUFNLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkQsSUFBSSxVQUFVLEdBQWlCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxhQUFhLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztZQUVsQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRTVDLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRTtnQkFDdkIsYUFBYSxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNO2FBQ1A7U0FDRjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFLRCxLQUFLO0lBRUwsQ0FBQztJQUVEO0lBQ0EsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TG9nZ2VyX0xvZ0xldmVscywgTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb259IGZyb20gXCIuL2VudW1zXCI7XHJcbmltcG9ydCB7RGF0ZVRpbWUsIERlYnVnLCBFeGNlcHRpb24sIE5TdHJpbmcsIFN0YWNrVHJhY2UsIFN0cmluZ0J1aWxkZXIsIFRocmVhZCwgaXNOdWxsT3JVbmRlZmluZWR9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge09TRW52aXJvbm1lbnR9IGZyb20gXCIuL1BsYXRmb3JtVXRpbHNcIjtcclxuaW1wb3J0IHtEYXRlVGltZVV0aWxzfSBmcm9tIFwiLi9EYXRlVGltZVV0aWxzXCI7XHJcbmltcG9ydCB7WE1MQ29uc3RhbnRzfSBmcm9tIFwiLi9YTUxDb25zdGFudHNcIjtcclxuaW1wb3J0ICogYXMgSlNTdGFja1RyYWNlIGZyb20gJ3N0YWNrdHJhY2UtanMnO1xyXG5pbXBvcnQge1JlcXVlc3RJbmZvfSBmcm9tIFwiLi9SZXF1ZXN0SW5mb1wiO1xyXG5pbXBvcnQge1N0clV0aWx9IGZyb20gXCIuL1N0clV0aWxcIjtcclxuaW1wb3J0IEpTU3RhY2tGcmFtZSA9IEpTU3RhY2tUcmFjZS5TdGFja0ZyYW1lO1xyXG5cclxuZXhwb3J0IGVudW0gTG9nVHlwZSB7XHJcbiAgaW5mbyA9IDEsXHJcbiAgd2FybmluZyxcclxuICBlcnJvclxyXG59XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gTG9nZ2VyIGNsYXNzIHdpbGwgdGFrZSBjYXJlIG9mIGNsaWVudCBzaWRlIGxvZ2dpbmcgLiBJdCB3aWxsIGNoZWNrIGZvciB2YXJpb3VzIGxvZyBsZXZlbHMgYW5kIGFjY29yZGluZ2x5IHdpbGwgd3JpdGUgbWVzc2FnZXMgaW4gbG9nIGZpbGUuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XHJcbiAgc3RhdGljIGluc3RhbmNlOiBMb2dnZXIgPSBudWxsO1xyXG4gIExvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzID0gMDsgLy8gSW50ZXJuYWxMb2dMZXZlbFxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdoaWxlIHdyaXRpbmcgdGhlIGVycm9yIG1lc3NhZ2VzIGluIHRoZSBmaWxlIHBsYXkgdGhlIGJlZXAuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTaG91bGRCZWVwOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHN0YXRpYyBzZXQgSW5zdGFuY2UodmFsdWU6IExvZ2dlcikge1xyXG4gICAgTG9nZ2VyLmluc3RhbmNlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IExvZ2dlciB7XHJcbiAgICBpZiAoTG9nZ2VyLmluc3RhbmNlID09PSBudWxsKSB7XHJcbiAgICAgIExvZ2dlci5pbnN0YW5jZSA9IG5ldyBMb2dnZXIoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBMb2dnZXIuaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbml0aWFsaXplIGxvZ2dlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibG9nTGV2ZWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImludGVybmFsTG9nU3luY1wiPjwvcGFyYW0+XHJcbiAgSW5pdGlhbGl6ZShsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscywgc2hvdWxkQmVlcDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gbGV0IGxvZ1N5bmM6IExvZ1N5bmNNb2RlICA9IExvZ1N5bmNNb2RlLlNlc3Npb247XHJcbiAgICAgIHRoaXMuTG9nTGV2ZWwgPSBsb2dMZXZlbDtcclxuICAgICAgdGhpcy5TaG91bGRCZWVwID0gc2hvdWxkQmVlcDtcclxuXHJcbiAgICAgIC8vIFRPRE86IGltcGxlbWVudFxyXG4vLyAgIFN0cmluZyBzdHJMb2dTeW5jID0gaW50ZXJuYWxMb2dTeW5jO1xyXG4vLyAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RyTG9nU3luYykpXHJcbi8vIHtcclxuLy8gICBpZiAoc3RyTG9nU3luYy5TdGFydHNXaXRoKFwiTVwiLCBTdHJpbmdDb21wYXJpc29uLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZSkpXHJcbi8vICAgbG9nU3luYyA9IExvZ1N5bmNNb2RlLk1lc3NhZ2U7XHJcbi8vICAgZWxzZSBpZiAoc3RyTG9nU3luYy5TdGFydHNXaXRoKFwiRlwiLCBTdHJpbmdDb21wYXJpc29uLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZSkpXHJcbi8vICAgbG9nU3luYyA9IExvZ1N5bmNNb2RlLkZsdXNoO1xyXG4vLyB9XHJcbi8vXHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICB0aGlzLldyaXRlRGV2VG9Mb2coXCJDbGllbnRNYW5hZ2VyLmluaXQoKTogXCIgKyBlLk1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsb2dMZXZlbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuXHJcbiAgU2hvdWxkTG9nKGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzKTogYm9vbGVhbjtcclxuICBTaG91bGRMb2coKTogYm9vbGVhbjtcclxuICBTaG91bGRMb2cobG9nTGV2ZWw/OiBMb2dnZXJfTG9nTGV2ZWxzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgcmV0dXJuIHRoaXMuU2hvdWxkTG9nXzAobG9nTGV2ZWwpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5TaG91bGRMb2dfMSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTaG91bGRMb2dfMChsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuTG9nTGV2ZWwgPT09IGxvZ0xldmVsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTaG91bGRMb2dfMSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkxvZ0xldmVsID4gTG9nZ2VyX0xvZ0xldmVscy5Ob25lO1xyXG4gIH1cclxuXHJcbiAgU2hvdWxkTG9nU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLlNob3VsZExvZ0V4dGVuZGVkU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCkgfHwgTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlcikpICYmIHRoaXMuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWM7XHJcbiAgfVxyXG5cclxuICBTaG91bGRMb2dFeHRlbmRlZFNlcnZlclJlbGF0ZWRNZXNzYWdlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlck1lc3NhZ2VzKSB8fCBMb2dnZXIuSW5zdGFuY2UuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuU3VwcG9ydCkgfHwgTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSkgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVuSWZOZWNlc3NhcnlcIj5vcGVuIHRoZSBsb2cgZmlsZSBpZiBub3Qgb3BlbmVkIHlldDwvcGFyYW0+XHJcblxyXG4gIFdyaXRlVG9Mb2cobXNnOiBzdHJpbmcsIG9wZW5JZk5lY2Vzc2FyeTogYm9vbGVhbiwgbG9nVHlwZTogTG9nVHlwZSA9IExvZ1R5cGUuaW5mbyk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID4gTG9nZ2VyX0xvZ0xldmVscy5Ob25lIHx8IG9wZW5JZk5lY2Vzc2FyeSkge1xyXG4gICAgICBtc2cgPSBOU3RyaW5nLkZvcm1hdChcInswfSB7MX1cIiwgKHRoaXMuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpID8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpIDogRGF0ZVRpbWVVdGlscy5Ub1N0cmluZyhEYXRlVGltZS5Ob3csIFhNTENvbnN0YW50cy5FUlJPUl9MT0dfVElNRV9GT1JNQVQsIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpO1xyXG5cclxuICAgICAgc3dpdGNoIChsb2dUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBMb2dUeXBlLmVycm9yOlxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMb2dUeXBlLndhcm5pbmc6XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHdyaXRlIGEgc2VydmVyIGFjY2VzcyB0byB0aGUgbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZVNlcnZlclRvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TaG91bGRMb2dTZXJ2ZXJSZWxhdGVkTWVzc2FnZXMoKSkge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJTZXJ2ZXIsIFRocmVhZD17MH06IFwiLCBUaHJlYWQuQ3VycmVudFRocmVhZC5NYW5hZ2VkVGhyZWFkSWQpICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd3JpdGUgYSBzZXJ2ZXIgYWNjZXNzIHRvIHRoZSBsb2csIGluY2x1ZGluZyB0aGUgY29udGVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TaG91bGRMb2dFeHRlbmRlZFNlcnZlclJlbGF0ZWRNZXNzYWdlcygpKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVUb0xvZyhcIlNlcnZlciM6IFwiICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZSBhIFFDIG1lc3NhZ2UgdG8gdGhlIGxvZzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZVN1cHBvcnRUb0xvZyhtc2c6IHN0cmluZywgc2tpcExpbmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA+PSBMb2dnZXJfTG9nTGV2ZWxzLlN1cHBvcnQgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICBpZiAoc2tpcExpbmUpIHtcclxuICAgICAgICB0aGlzLldyaXRlVG9Mb2coXCJTVVBQT1JUOiBcIiArIG1zZywgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5Xcml0ZVRvTG9nKFwiU1VQUE9SVDogXCIgKyBtc2cgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIiwgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd3JpdGUgYSBwZXJmb3JtYW5jZSBtZXNzYWdlIHRvIHRoZSBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlR3VpVG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA+PSBMb2dnZXJfTG9nTGV2ZWxzLkd1aSAmJiB0aGlzLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVUb0xvZyhtc2csIGZhbHNlLCBMb2dUeXBlLmluZm8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB3cml0ZSBhIGRldmVsb3BlciBtZXNzYWdlIHRvIHRoZSBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlRGV2VG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID49IExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2coXCJERVY6IFwiICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGVzIGEgYmFzaWMgbGV2ZWwgZW50cnkgdG8gbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZXNzYWdlRGlyZWN0aW9uXCI+bWVzc2FnZSBkaXJlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbW9kdWxlIChSSUEgY2xpZW50KS4gQ2FuIGJlIGVpdGhlciBNZXNzYWdlRW50ZXJpbmcgb3IgTWVzc2FnZUxlYXZpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0YXR1c0NvZGVcIj5IVFRQIHN0YXR1cyBjb2RlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50TGVuZ3RoXCI+bGVuZ3RoIG9mIHRoZSBodHRwIG1lc3NhZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImh0dHBIZWFkZXJzXCI+SFRUUCBoZWFkZXJzPC9wYXJhbT5cclxuICBXcml0ZUJhc2ljVG9Mb2cobWVzc2FnZURpcmVjdGlvbjogTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb24sIGNvbnRleHRJRDogc3RyaW5nLCBzZXNzaW9uQ291bnRlcjogbnVtYmVyLCBjbGllbnRJRDogc3RyaW5nLCBzZXJ2ZXJJRDogc3RyaW5nLCByZXNwb25zZVRpbWU6IG51bWJlciwgc3RhdHVzQ29kZTogc3RyaW5nLCBodHRwSGVhZGVyczogc3RyaW5nLCBjb250ZW50TGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID09PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBodHRwSGVhZGVycztcclxuICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xyXG4gICAgICB0ZXh0ID0gTlN0cmluZy5SZXBsYWNlKHRleHQsIFwiXFxyXFxuXCIsIFwifFwiKTtcclxuICAgICAgbGV0IGFyZ19FNF8wOiBzdHJpbmcgPSBcIlJJQSx7MH1fezF9LHsyfSx7M30sezR9LHs1fSwtLHs2fSx7N30sezh9LHs5fSx7MTB9LHsxMX1cIjtcclxuICAgICAgbGV0IGV4cHJfM0U6IGFueVtdID0gbmV3IEFycmF5PGFueT4oMTIpO1xyXG5cclxuICAgICAgLy8gVE9ETyA6IG5lZWQgdG8gY2hlY2sgSG93IHRvIGhhbmRsZSBQcm9jZXNzIGNsYXNzLlxyXG4gICAgICAvLyBleHByXzNFWzBdID0gUHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpLklkO1xyXG4gICAgICBleHByXzNFWzFdID0gVGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkO1xyXG4gICAgICBleHByXzNFWzJdID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xyXG4gICAgICBleHByXzNFWzNdID0gKChtZXNzYWdlRGlyZWN0aW9uID09PSBMb2dnZXJfTWVzc2FnZURpcmVjdGlvbi5NZXNzYWdlTGVhdmluZykgPyBcIk1TR0xcIiA6IFwiTVNHRVwiKTtcclxuICAgICAgZXhwcl8zRVs0XSA9IGNvbnRleHRJRDtcclxuICAgICAgZXhwcl8zRVs1XSA9IHNlc3Npb25Db3VudGVyO1xyXG4gICAgICBleHByXzNFWzZdID0gY2xpZW50SUQ7XHJcbiAgICAgIGV4cHJfM0VbN10gPSBzZXJ2ZXJJRDtcclxuICAgICAgZXhwcl8zRVs4XSA9ICgocmVzcG9uc2VUaW1lICE9PSAwKSA/IHJlc3BvbnNlVGltZS50b1N0cmluZygpIDogXCItXCIpO1xyXG4gICAgICBsZXQgYXJnX0QzXzE6IG51bWJlciA9IDk7XHJcbiAgICAgIGxldCBhcmdfRDNfMjogYW55O1xyXG4gICAgICBhcmdfRDNfMiA9IHN0YXR1c0NvZGU7XHJcbiAgICAgIGV4cHJfM0VbYXJnX0QzXzFdID0gYXJnX0QzXzI7XHJcbiAgICAgIGV4cHJfM0VbMTBdID0gdGV4dDtcclxuICAgICAgZXhwcl8zRVsxMV0gPSBjb250ZW50TGVuZ3RoO1xyXG4gICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRm9ybWF0KGFyZ19FNF8wLCBleHByXzNFKTtcclxuICAgICAgY29uc29sZS5sb2codmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZXMgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsaWVudFNlc3Npb25cIj5UaGUgY2xpZW50U2Vzc2lvbiBvYmplY3QgdG8gYmUgbG9nZ2VkPC9wYXJhbT5cclxuICBXcml0ZVJlcXVlc3RJbmZvVG9Mb2cocmVxdWVzdEluZm86IFJlcXVlc3RJbmZvLCBleHRyYU1lc3NhZ2VTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuUmVxdWVzdEluZm8pIHtcclxuXHJcbiAgICAgIC8vIENocm9tZSBkZWJ1Z2dlciBhdXRvbWF0aWNhbGx5IHJlY29tcHV0ZXMgbG9nZ2VkIG9iamVjdHMuXHJcbiAgICAgIC8vIEhlbmNlLCBjbG9uZSB0aGUgcmVxdWVzdEluZm8gb2JqZWN0IHRvIHByaW50IHRoZSBkZXRhaWxzIGF0IHRoZSB0aW1lIG9mIGxvZ2dpbmdcclxuICAgICAgY29uc29sZS5sb2coZXh0cmFNZXNzYWdlU3RyLCBSZXF1ZXN0SW5mby5jbG9uZShyZXF1ZXN0SW5mbykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZXMgYSByZXF1ZXN0IGV4Y2VwdGlvbiBiYXNpYyBsZXZlbCBlbnRyeSB0byBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2Vzc2lvbkNvdW50ZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsaWVudElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXJ2ZXJJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhcIj50aGUgbG9nZ2VkIGV4Y2VwdGlvbjwvcGFyYW0+XHJcbiAgV3JpdGVCYXNpY0Vycm9yVG9Mb2coKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5Mb2dMZXZlbCA9PT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYyk7XHJcblxyXG4gICAgLy8gVE9ETyA6IE5lZWQgdG8gY2hlY2sgaG93IHRvIGhhbmRsZSBQcm9jZXNzXHJcbiAgICAvLyBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRm9ybWF0KFwiUklBLHswfV97MX0sezJ9LHszfSx7NH0sezV9LC0sezZ9LHs3fSwtLC0sLSx7OH0gezl9XCIsIFtcclxuICAgIC8vIFByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKS5JZCwgVGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkLCBEYXRlVGltZS5VdGNOb3cuVG9TdHJpbmcoXCJ5eXl5LU1NLWRkVEhIOm1tOnNzLmZmZmZmZmZaXCIpLCBcIlJFU1wiLCBjb250ZXh0SUQsIHNlc3Npb25Db3VudGVyLCBjbGllbnRJRCwgc2VydmVySUQsIGV4LkdldFR5cGUoKSwgZXguTWVzc2FnZVxyXG4gICAgLy8gXSk7XHJcbiAgICAvLyBOQ29uc29sZS5Xcml0ZUxpbmUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZSBhbiBlcnJvciB0byB0aGUgbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZUVycm9yVG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVUb0xvZyhcIk1hZ2ljV2ViIFtFUlJPUl06IFwiICsgU3RyVXRpbC5nZXRDb25zb2xlRXJvclN0cmluZyhtc2cpLCB0cnVlLCBMb2dUeXBlLmVycm9yKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGUgYW4gaW50ZXJuYWwgZXJyb3IgdG8gdGhlIGxvZy4gQWxzbyBwcmludHMgc3RhY2sgdHJhY2UgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVFeGNlcHRpb25Ub0xvZyhleDogRXhjZXB0aW9uKTogdm9pZDtcclxuICBXcml0ZUV4Y2VwdGlvblRvTG9nKGV4OiBFcnJvcik6IHZvaWQ7XHJcbiAgV3JpdGVFeGNlcHRpb25Ub0xvZyhleDogRXhjZXB0aW9uLCBtc2c6IHN0cmluZyk6IHZvaWQ7XHJcbiAgV3JpdGVFeGNlcHRpb25Ub0xvZyhtc2dPckV4OiBhbnksIG1zZz86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKG1zZ09yRXggaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMihtc2dPckV4LCBtc2cpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAobXNnT3JFeCAhPT0gbnVsbCB8fCBtc2dPckV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSkge1xyXG4gICAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMShtc2dPckV4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ18zKG1zZ09yRXgsIG1zZyk7XHJcbiAgfVxyXG5cclxuICBXcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZVRvTG9nKFwiTWFnaWNXZWIgW0VSUk9SXTogXCIgKyBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKG1zZyksIHRydWUsIExvZ1R5cGUuZXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBXcml0ZUV4Y2VwdGlvblRvTG9nXzEoZXg6IEV4Y2VwdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfXsyfXszfXs0fVwiLCBbXHJcbiAgICAgIGV4LkdldFR5cGUoKSwgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4LlN0YWNrVHJhY2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5NZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMihleDogRXJyb3IsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKG1lc3NhZ2UpKVxyXG4gICAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9ezF9ezJ9XCIsIFtleC5zdGFjaywgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4Lm1lc3NhZ2VdKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH17MX17Mn17NH17NX1cIiwgW21lc3NhZ2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5zdGFjaywgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4Lm1lc3NhZ2VdKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMyhleDogRXhjZXB0aW9uLCBtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSwgezF9IDogezJ9ezN9ezR9ezV9XCIsIFtcclxuICAgICAgZXguR2V0VHlwZSgpLCBtc2csIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5TdGFja1RyYWNlLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguTWVzc2FnZVxyXG4gICAgXSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB3cml0ZSBhIHdhcm5pbmcgdG8gdGhlIGxvZzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZVdhcm5pbmdUb0xvZyhleDogRXhjZXB0aW9uKTogdm9pZDtcclxuICBXcml0ZVdhcm5pbmdUb0xvZyhleDogRXhjZXB0aW9uLCBtc2c6IHN0cmluZyk6IHZvaWQ7XHJcbiAgV3JpdGVXYXJuaW5nVG9Mb2coZXg6IEVycm9yKTogdm9pZDtcclxuICBXcml0ZVdhcm5pbmdUb0xvZyhtc2dPckV4OiBhbnksIG1zZz86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgbXNnT3JFeCAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAobXNnT3JFeCBpbnN0YW5jZW9mIEV4Y2VwdGlvbilcclxuICAgICAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nXzEobXNnT3JFeCk7XHJcbiAgICAgIGVsc2UgaWYgKG1zZ09yRXggaW5zdGFuY2VvZiBFcnJvcilcclxuICAgICAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nXzIobXNnT3JFeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dfMyhtc2dPckV4LCBtc2cpO1xyXG4gIH1cclxuXHJcbiAgV3JpdGVXYXJuaW5nVG9Mb2dXaXRoTXNnKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgdGhpcy5Xcml0ZVRvTG9nKFwiTWFnaWNXZWIgW1dBUk5JTkddOiBcIiArIG1zZywgdHJ1ZSwgTG9nVHlwZS53YXJuaW5nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgV3JpdGVXYXJuaW5nVG9Mb2dfMShleDogRXhjZXB0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nV2l0aE1zZyhleC5HZXRUeXBlKCkgKyBcIiA6IFwiICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBleC5TdGFja1RyYWNlICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBleC5NZXNzYWdlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgV3JpdGVXYXJuaW5nVG9Mb2dfMihleDogRXJyb3IpOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9ezF9ezJ9XCIsIFtcclxuICAgICAgZXguc3RhY2ssIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5tZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlV2FybmluZ1RvTG9nXzMoZXg6IEV4Y2VwdGlvbiwgbXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9LCB7MX0gOiB7Mn17M317NH17NX1cIiwgW1xyXG4gICAgICBleC5HZXRUeXBlKCksIG1zZywgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4LlN0YWNrVHJhY2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5NZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICBXcml0ZVN0YWNrVHJhY2Uoc3RhY2tUcmFjZTogU3RhY2tUcmFjZSwgZnJhbWVzVG9QcmludDogbnVtYmVyLCB0cmFjZVRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodHJhY2VUaXRsZSA9PT0gbnVsbCkge1xyXG4gICAgICB0cmFjZVRpdGxlID0gXCJTdGFjayB0cmFjZTpcIjtcclxuICAgIH1cclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodHJhY2VUaXRsZSArIE9TRW52aXJvbm1lbnQuRW9sU2VxKTtcclxuICAgIGxldCBmcmFtZXM6IEpTU3RhY2tGcmFtZVtdID0gc3RhY2tUcmFjZS5HZXRGcmFtZXMoKTtcclxuICAgIGxldCBhcnJheTogSlNTdGFja0ZyYW1lW10gPSBmcmFtZXM7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IHN0YWNrRnJhbWU6IEpTU3RhY2tGcmFtZSA9IGFycmF5W2ldO1xyXG4gICAgICBmcmFtZXNUb1ByaW50ID0gZnJhbWVzVG9QcmludCAtIDE7XHJcblxyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChzdGFja0ZyYW1lLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgaWYgKGZyYW1lc1RvUHJpbnQgPT09IDApIHtcclxuICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChcIlxcdC4uLiBtb3JlIHN0YWNrIGZyYW1lcyAuLi5cXG5cIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuV3JpdGVUb0xvZyhzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCksIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGbHVzaCB0aGUgbG9nIHdyaXRlci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEZsdXNoKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,12 +0,0 @@
1
- export var MagicProperties;
2
- (function (MagicProperties) {
3
- MagicProperties["LineDivider"] = "line_divider";
4
- MagicProperties["ImageFile"] = "image_file";
5
- MagicProperties["Wallpaper"] = "wallpaper";
6
- })(MagicProperties || (MagicProperties = {}));
7
- export var BindingLevel;
8
- (function (BindingLevel) {
9
- BindingLevel[BindingLevel["Control"] = 1] = "Control";
10
- BindingLevel[BindingLevel["Character"] = 2] = "Character";
11
- })(BindingLevel || (BindingLevel = {}));
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFnaWNDb25zdGFudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91dGlscy9zcmMvTWFnaWNDb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN6QiwrQ0FBNEIsQ0FBQTtJQUM1QiwyQ0FBd0IsQ0FBQTtJQUN4QiwwQ0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSlcsZUFBZSxLQUFmLGVBQWUsUUFJMUI7QUFFRCxNQUFNLENBQU4sSUFBWSxZQUlYO0FBSkQsV0FBWSxZQUFZO0lBRXRCLHFEQUFXLENBQUE7SUFDWCx5REFBUyxDQUFBO0FBQ1gsQ0FBQyxFQUpXLFlBQVksS0FBWixZQUFZLFFBSXZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gTWFnaWNQcm9wZXJ0aWVzIHtcclxuICBMaW5lRGl2aWRlciA9IFwibGluZV9kaXZpZGVyXCIsXHJcbiAgSW1hZ2VGaWxlID0gXCJpbWFnZV9maWxlXCIsXHJcbiAgV2FsbHBhcGVyID0gXCJ3YWxscGFwZXJcIixcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQmluZGluZ0xldmVsXHJcbntcclxuICBDb250cm9sID0gMSxcclxuICBDaGFyYWN0ZXJcclxufVxyXG4iXX0=
@@ -1,98 +0,0 @@
1
- import { StringBuilder, NString, NNumber, DateTime, RefParam } from "@magic-xpa/mscorelib";
2
- export class Misc {
3
- static WriteStackTrace(throwable) {
4
- console.log(throwable.Message);
5
- console.log(throwable.StackTrace);
6
- }
7
- static ToSByteArray(byteArray) {
8
- let sbyteArray = null;
9
- if (byteArray !== null) {
10
- sbyteArray = new Int8Array(byteArray.length);
11
- for (let i = 0; i < byteArray.length; i = i + 1) {
12
- sbyteArray[i] = byteArray[i];
13
- }
14
- }
15
- return sbyteArray;
16
- }
17
- static ToByteArray(sbyteArray) {
18
- let byteArray = null;
19
- if (sbyteArray !== null) {
20
- byteArray = new Uint8Array(sbyteArray.length);
21
- for (let i = 0; i < sbyteArray.length; i = i + 1) {
22
- byteArray[i] = sbyteArray[i];
23
- }
24
- }
25
- return byteArray;
26
- }
27
- static CompareByteArray(source, destination, numberOfBytes) {
28
- if (source.length >= numberOfBytes && destination.length >= numberOfBytes) {
29
- for (let len = 0; len < numberOfBytes; len++) {
30
- if (source[len] !== destination[len])
31
- return false;
32
- }
33
- }
34
- else
35
- return false;
36
- return true;
37
- }
38
- static URShift(number, bits) {
39
- let result;
40
- if (number >= 0) {
41
- result = number >> bits;
42
- }
43
- else {
44
- result = (number >> bits) + (2 << ~bits);
45
- }
46
- return result;
47
- }
48
- static getSystemMilliseconds() {
49
- return Math.floor((DateTime.Now.Ticks - 621355968000000000) / 10000);
50
- }
51
- static CompareIntArrays(arrayOne, arrayTwo) {
52
- let areEqual = false;
53
- if (arrayOne === arrayTwo) {
54
- areEqual = true;
55
- }
56
- else {
57
- if (arrayOne !== null && arrayTwo !== null) {
58
- if (arrayOne.length === arrayTwo.length) {
59
- for (let i = 0; i < arrayOne.length; i = i + 1) {
60
- if (arrayOne[i] !== arrayTwo[i]) {
61
- break;
62
- }
63
- areEqual = true;
64
- }
65
- }
66
- }
67
- }
68
- return areEqual;
69
- }
70
- static GetCommaSeperatedString(intArray) {
71
- let temp = new StringBuilder();
72
- for (let val = 0; val < intArray.length; val = val + 1) {
73
- let value = intArray[val];
74
- if (temp.Length > 0) {
75
- temp.Append(",");
76
- }
77
- temp.Append(value);
78
- }
79
- return temp.ToString();
80
- }
81
- static GetIntArray(commaSeparatedValue) {
82
- let intArray = new Array(0);
83
- if (!NString.IsNullOrEmpty(commaSeparatedValue)) {
84
- let vals = commaSeparatedValue.split(',');
85
- intArray = new Array(vals.length);
86
- let outInt = new RefParam(0);
87
- for (let iCtr = 0; iCtr < vals.length; iCtr = iCtr + 1) {
88
- NNumber.TryParse(vals[iCtr], outInt);
89
- intArray[iCtr] = outInt.value;
90
- }
91
- }
92
- return intArray;
93
- }
94
- static IsWebUrl(fileName) {
95
- return fileName.toLowerCase().startsWith("http");
96
- }
97
- }
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlzYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3V0aWxzL3NyYy9NaXNjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE9BQU8sRUFDTSxhQUFhLEVBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQ2hCLFFBQVEsRUFBRSxRQUFRLEVBQ25CLE1BQU0sc0JBQXNCLENBQUM7QUFPOUIsTUFBTSxPQUFPLElBQUk7SUFPZixNQUFNLENBQUMsZUFBZSxDQUFDLFNBQW9CO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFPRCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXFCO1FBQ3ZDLElBQUksVUFBVSxHQUFjLElBQUksQ0FBQztRQUNqQyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFDdEIsVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdkQsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFXLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QztTQUNGO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQU9ELE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBcUI7UUFDdEMsSUFBSSxTQUFTLEdBQWUsSUFBSSxDQUFDO1FBQ2pDLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtZQUN2QixTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxF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QyxXQUFXLENBQUMsbUJBQTJCO1FBQzVDLElBQUksUUFBUSxHQUFhLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTlDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDL0MsSUFBSSxJQUFJLEdBQWEsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFMUMsSUFBSSxNQUFNLEdBQXFCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUM5RCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDL0I7U0FDRjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQzlCLE9BQU8sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbiBvcmRlciB0byBjb252ZXJ0IHNvbWUgZnVuY3Rpb25hbGl0eSB0byBWaXN1YWwgQyMsIHRoZSBKYXZhIExhbmd1YWdlIENvbnZlcnNpb24gQXNzaXN0YW50XHJcbi8vIGNyZWF0ZXMgXCJzdXBwb3J0IGNsYXNzZXNcIiB0aGF0IGR1cGxpY2F0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb25hbGl0eS5cclxuLy9cclxuLy8gU3VwcG9ydCBjbGFzc2VzIHJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgb3JpZ2luYWwgY29kZSwgYnV0IGluIHNvbWUgY2FzZXMgdGhleSBhcmVcclxuLy8gc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJhbGx5LiBBbHRob3VnaCBldmVyeSBlZmZvcnQgaXMgbWFkZSB0byBwcmVzZXJ2ZSB0aGVcclxuLy8gb3JpZ2luYWwgYXJjaGl0ZWN0dXJlIG9mIHRoZSBhcHBsaWNhdGlvbiBpbiB0aGUgY29udmVydGVkIHByb2plY3QsIHRoZSB1c2VyIHNob3VsZCBiZSBhd2FyZSB0aGF0XHJcbi8vIHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhlc2Ugc3VwcG9ydCBjbGFzc2VzIGlzIHRvIHJlcGxpY2F0ZSBmdW5jdGlvbmFsaXR5LCBhbmQgdGhhdCBhdCB0aW1lc1xyXG4vLyB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSByZXN1bHRpbmcgc29sdXRpb24gbWF5IGRpZmZlciBzb21ld2hhdC5cclxuXHJcblxyXG5pbXBvcnQge1xyXG4gIEV4Y2VwdGlvbiwgU3RyaW5nQnVpbGRlcixcclxuICBOU3RyaW5nLCBOTnVtYmVyLFxyXG4gIERhdGVUaW1lLCBSZWZQYXJhbVxyXG59IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5cclxuXHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBDb250YWlucyBjb252ZXJzaW9uIHN1cHBvcnQgZWxlbWVudHMgc3VjaCBhcyBjbGFzc2VzLCBpbnRlcmZhY2VzIGFuZCBzdGF0aWMgbWV0aG9kcy5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIE1pc2Mge1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdyaXRlcyB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHRvIHRoZSByZWNlaXZlZCBzdHJlYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRocm93YWJsZVwiPkV4Y2VwdGlvbiB0byBvYnRhaW4gaW5mb3JtYXRpb24gZnJvbTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyZWFtXCI+T3V0cHV0IHNyZWFtIHVzZWQgdG8gd3JpdGUgdG88L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZVN0YWNrVHJhY2UodGhyb3dhYmxlOiBFeGNlcHRpb24pOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKHRocm93YWJsZS5NZXNzYWdlKTtcclxuICAgIGNvbnNvbGUubG9nKHRocm93YWJsZS5TdGFja1RyYWNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVjZWl2ZXMgYSBieXRlIGFycmF5IGFuZCByZXR1cm5zIGl0IHRyYW5zZm9ybWVkIGluIGFuIGJ5dGUgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJ5dGVBcnJheVwiPkJ5dGUgYXJyYXkgdG8gcHJvY2VzczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSB0cmFuc2Zvcm1lZCBhcnJheTwvcmV0dXJucz5cclxuICBzdGF0aWMgVG9TQnl0ZUFycmF5KGJ5dGVBcnJheTogVWludDhBcnJheSk6IEludDhBcnJheSB7XHJcbiAgICBsZXQgc2J5dGVBcnJheTogSW50OEFycmF5ID0gbnVsbDtcclxuICAgIGlmIChieXRlQXJyYXkgIT09IG51bGwpIHtcclxuICAgICAgc2J5dGVBcnJheSA9IG5ldyBJbnQ4QXJyYXkoYnl0ZUFycmF5Lmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBieXRlQXJyYXkubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBzYnl0ZUFycmF5W2ldID0gPG51bWJlcj5ieXRlQXJyYXlbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzYnl0ZUFycmF5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZWNlaXZlcyBzYnl0ZSBhcnJheSBhbmQgcmV0dXJucyBpdCB0cmFuc2Zvcm1lZCBpbiBhIGJ5dGUgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNieXRlQXJyYXlcIj5zYnl0ZSBhcnJheSB0byBwcm9jZXNzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+VGhlIHRyYW5zZm9ybWVkIGFycmF5PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBUb0J5dGVBcnJheShzYnl0ZUFycmF5OiBJbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcclxuICAgIGxldCBieXRlQXJyYXk6IFVpbnQ4QXJyYXkgPSBudWxsO1xyXG4gICAgaWYgKHNieXRlQXJyYXkgIT09IG51bGwpIHtcclxuICAgICAgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc2J5dGVBcnJheS5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc2J5dGVBcnJheS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGJ5dGVBcnJheVtpXSA9IDxudW1iZXI+c2J5dGVBcnJheVtpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ5dGVBcnJheTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ29tcGFyZXMgbnVtYmVyIG9mIGJ5dGVzIGluIHR3byBieXRlIGFycmF5czwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzb3VyY2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlc3RpbmF0aW9uXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJudW1iZXJPZkJ5dGVzXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlbiB0cnVlIGlmIGVxdWFsPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBDb21wYXJlQnl0ZUFycmF5KHNvdXJjZTogVWludDhBcnJheSwgZGVzdGluYXRpb246IFVpbnQ4QXJyYXksIG51bWJlck9mQnl0ZXM6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPj0gbnVtYmVyT2ZCeXRlcyAmJiBkZXN0aW5hdGlvbi5sZW5ndGggPj0gbnVtYmVyT2ZCeXRlcykge1xyXG4gICAgICBmb3IgKGxldCBsZW46IG51bWJlciA9IDA7IGxlbiA8IG51bWJlck9mQnl0ZXM7IGxlbisrKSB7XHJcbiAgICAgICAgaWYgKHNvdXJjZVtsZW5dICE9PSBkZXN0aW5hdGlvbltsZW5dKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUGVyZm9ybXMgYW4gdW5zaWduZWQgYml0d2lzZSByaWdodCBzaGlmdCB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJudW1iZXJcIj5OdW1iZXIgdG8gb3BlcmF0ZSBvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYml0c1wiPkFtbW91bnQgb2YgYml0cyB0byBzaGlmdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSByZXN1bHRpbmcgbnVtYmVyIGZyb20gdGhlIHNoaWZ0IG9wZXJhdGlvbjwvcmV0dXJucz5cclxuICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGNhbGxpbmcgVVJTaGlmdChudW1iZXIsIGJpdHMpLCB3ZSBjYW4gdXNlKCh1aW50KW51bWJlcikgPj4gYml0cy5cclxuICBzdGF0aWMgVVJTaGlmdChudW1iZXI6IG51bWJlciwgYml0czogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlcjtcclxuICAgIGlmIChudW1iZXIgPj0gMCkge1xyXG4gICAgICByZXN1bHQgPSBudW1iZXIgPj4gYml0cztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSAobnVtYmVyID4+IGJpdHMpICsgKDIgPDwgfmJpdHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHN5c3RlbSdzIHRpbWUgaW4gbWlsbGlzZWNvbmRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTogbnVtYmVyIHtcclxuICAgIC8vIFRPRE8gLSBjaGVjayBpZiB3ZSBuZWVkIHRoaXMgYWRqdXN0bWVudFxyXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKERhdGVUaW1lLk5vdy5UaWNrcyAtIDYyMTM1NTk2ODAwMDAwMDAwMCkgLyAxMDAwMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENvbXBhcmVzIDIgaW50IGFycmF5c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYXJyYXlPbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFycmF5VHdvXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZiBhcnJheXMgYXJlIGVxdWFsIGVsc2UgZmFsc2U8L3JldHVybnM+XHJcbiAgc3RhdGljIENvbXBhcmVJbnRBcnJheXMoYXJyYXlPbmU6IG51bWJlcltdLCBhcnJheVR3bzogbnVtYmVyW10pOiBib29sZWFuIHtcclxuICAgIGxldCBhcmVFcXVhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKGFycmF5T25lID09PSBhcnJheVR3bykge1xyXG4gICAgICBhcmVFcXVhbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGFycmF5T25lICE9PSBudWxsICYmIGFycmF5VHdvICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKGFycmF5T25lLmxlbmd0aCA9PT0gYXJyYXlUd28ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXlPbmUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgICAgaWYgKGFycmF5T25lW2ldICE9PSBhcnJheVR3b1tpXSkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFyZUVxdWFsID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcmVFcXVhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgY29tbWEgc2VwYXJhdGVkIHN0cmluZyBmb3IgdGhlIHZhbHVlcyBwYXNzZWQgaW4gaW50IGFycmF5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVzXCI+SW50ZWdlciBhcnJheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmNvbW1hIHNlcGFyYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIEdldENvbW1hU2VwZXJhdGVkU3RyaW5nKGludEFycmF5OiBudW1iZXJbXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGVtcDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBmb3IgKGxldCB2YWw6IG51bWJlciA9IDA7IHZhbCA8IGludEFycmF5Lmxlbmd0aDsgdmFsID0gdmFsICsgMSkge1xyXG4gICAgICBsZXQgdmFsdWU6IG51bWJlciA9IGludEFycmF5W3ZhbF07XHJcbiAgICAgIGlmICh0ZW1wLkxlbmd0aCA+IDApIHtcclxuICAgICAgICB0ZW1wLkFwcGVuZChcIixcIik7XHJcbiAgICAgIH1cclxuICAgICAgdGVtcC5BcHBlbmQodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXAuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyBpbnQgYXJyYXkgb3V0IG9mIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+Y29tbWEgc2VwYXJhdGVkIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPkludGVnZXIgYXJyYXk8L3JldHVybnM+XHJcbiAgc3RhdGljIEdldEludEFycmF5KGNvbW1hU2VwYXJhdGVkVmFsdWU6IHN0cmluZyk6IG51bWJlcltdIHtcclxuICAgIGxldCBpbnRBcnJheTogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigwKTtcclxuXHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShjb21tYVNlcGFyYXRlZFZhbHVlKSkge1xyXG4gICAgICBsZXQgdmFsczogc3RyaW5nW10gPSBjb21tYVNlcGFyYXRlZFZhbHVlLnNwbGl0KCcsJyk7XHJcbiAgICAgIGludEFycmF5ID0gbmV3IEFycmF5PG51bWJlcj4odmFscy5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IG91dEludDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbSgwKTtcclxuICAgICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IHZhbHMubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgICBOTnVtYmVyLlRyeVBhcnNlKHZhbHNbaUN0cl0sIG91dEludCk7XHJcbiAgICAgICAgaW50QXJyYXlbaUN0cl0gPSBvdXRJbnQudmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW50QXJyYXk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgSXNXZWJVcmwoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcImh0dHBcIik7XHJcbiAgfVxyXG59XHJcbiJdfQ==