tedious 16.2.0 → 16.3.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.
- package/lib/all-headers.js +1 -2
- package/lib/all-headers.js.map +1 -0
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +9 -31
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js.map +1 -0
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +9 -24
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js.map +1 -0
- package/lib/always-encrypted/cek-entry.js +8 -12
- package/lib/always-encrypted/cek-entry.js.map +1 -0
- package/lib/always-encrypted/get-parameter-encryption-metadata.js +2 -24
- package/lib/always-encrypted/get-parameter-encryption-metadata.js.map +1 -0
- package/lib/always-encrypted/key-crypto.js +5 -30
- package/lib/always-encrypted/key-crypto.js.map +1 -0
- package/lib/always-encrypted/keystore-provider-azure-key-vault.js +11 -72
- package/lib/always-encrypted/keystore-provider-azure-key-vault.js.map +1 -0
- package/lib/always-encrypted/symmetric-key-cache.js +2 -13
- package/lib/always-encrypted/symmetric-key-cache.js.map +1 -0
- package/lib/always-encrypted/symmetric-key.js +3 -8
- package/lib/always-encrypted/symmetric-key.js.map +1 -0
- package/lib/always-encrypted/types.js +19 -27
- package/lib/always-encrypted/types.js.map +1 -0
- package/lib/always-encrypted/utils.js +2 -6
- package/lib/always-encrypted/utils.js.map +1 -0
- package/lib/bulk-load-payload.js +7 -15
- package/lib/bulk-load-payload.js.map +1 -0
- package/lib/bulk-load.js +58 -131
- package/lib/bulk-load.js.map +1 -0
- package/lib/collation.js +7 -15
- package/lib/collation.js.map +1 -0
- package/lib/connection.js +290 -531
- package/lib/connection.js.map +1 -0
- package/lib/connector.js +6 -37
- package/lib/connector.js.map +1 -0
- package/lib/data-type.js +2 -43
- package/lib/data-type.js.map +1 -0
- package/lib/data-types/bigint.js +1 -15
- package/lib/data-types/bigint.js.map +1 -0
- package/lib/data-types/binary.js +1 -12
- package/lib/data-types/binary.js.map +1 -0
- package/lib/data-types/bit.js +1 -11
- package/lib/data-types/bit.js.map +1 -0
- package/lib/data-types/bitn.js +1 -7
- package/lib/data-types/bitn.js.map +1 -0
- package/lib/data-types/char.js +1 -20
- package/lib/data-types/char.js.map +1 -0
- package/lib/data-types/date.js +1 -15
- package/lib/data-types/date.js.map +1 -0
- package/lib/data-types/datetime.js +3 -20
- package/lib/data-types/datetime.js.map +1 -0
- package/lib/data-types/datetime2.js +1 -26
- package/lib/data-types/datetime2.js.map +1 -0
- package/lib/data-types/datetimen.js +1 -7
- package/lib/data-types/datetimen.js.map +1 -0
- package/lib/data-types/datetimeoffset.js +1 -23
- package/lib/data-types/datetimeoffset.js.map +1 -0
- package/lib/data-types/decimal.js +1 -18
- package/lib/data-types/decimal.js.map +1 -0
- package/lib/data-types/decimaln.js +1 -7
- package/lib/data-types/decimaln.js.map +1 -0
- package/lib/data-types/float.js +1 -13
- package/lib/data-types/float.js.map +1 -0
- package/lib/data-types/floatn.js +1 -7
- package/lib/data-types/floatn.js.map +1 -0
- package/lib/data-types/image.js +1 -10
- package/lib/data-types/image.js.map +1 -0
- package/lib/data-types/int.js +1 -14
- package/lib/data-types/int.js.map +1 -0
- package/lib/data-types/intn.js +1 -7
- package/lib/data-types/intn.js.map +1 -0
- package/lib/data-types/money.js +1 -12
- package/lib/data-types/money.js.map +1 -0
- package/lib/data-types/moneyn.js +1 -7
- package/lib/data-types/moneyn.js.map +1 -0
- package/lib/data-types/nchar.js +1 -14
- package/lib/data-types/nchar.js.map +1 -0
- package/lib/data-types/ntext.js +1 -10
- package/lib/data-types/ntext.js.map +1 -0
- package/lib/data-types/null.js +1 -7
- package/lib/data-types/null.js.map +1 -0
- package/lib/data-types/numeric.js +1 -18
- package/lib/data-types/numeric.js.map +1 -0
- package/lib/data-types/numericn.js +1 -7
- package/lib/data-types/numericn.js.map +1 -0
- package/lib/data-types/nvarchar.js +1 -22
- package/lib/data-types/nvarchar.js.map +1 -0
- package/lib/data-types/real.js +1 -13
- package/lib/data-types/real.js.map +1 -0
- package/lib/data-types/smalldatetime.js +1 -14
- package/lib/data-types/smalldatetime.js.map +1 -0
- package/lib/data-types/smallint.js +1 -14
- package/lib/data-types/smallint.js.map +1 -0
- package/lib/data-types/smallmoney.js +1 -13
- package/lib/data-types/smallmoney.js.map +1 -0
- package/lib/data-types/sql-variant.js +1 -6
- package/lib/data-types/sql-variant.js.map +1 -0
- package/lib/data-types/text.js +1 -18
- package/lib/data-types/text.js.map +1 -0
- package/lib/data-types/time.js +1 -22
- package/lib/data-types/time.js.map +1 -0
- package/lib/data-types/tinyint.js +1 -14
- package/lib/data-types/tinyint.js.map +1 -0
- package/lib/data-types/tvp.js +11 -27
- package/lib/data-types/tvp.js.map +1 -0
- package/lib/data-types/udt.js +1 -7
- package/lib/data-types/udt.js.map +1 -0
- package/lib/data-types/uniqueidentifier.js +1 -11
- package/lib/data-types/uniqueidentifier.js.map +1 -0
- package/lib/data-types/varbinary.js +1 -22
- package/lib/data-types/varbinary.js.map +1 -0
- package/lib/data-types/varchar.js +1 -23
- package/lib/data-types/varchar.js.map +1 -0
- package/lib/data-types/xml.js +1 -7
- package/lib/data-types/xml.js.map +1 -0
- package/lib/debug.js +4 -16
- package/lib/debug.js.map +1 -0
- package/lib/errors/abort-error.js +2 -5
- package/lib/errors/abort-error.js.map +1 -0
- package/lib/errors/timeout-error.js +2 -5
- package/lib/errors/timeout-error.js.map +1 -0
- package/lib/errors.js +10 -16
- package/lib/errors.js.map +1 -0
- package/lib/guid-parser.js +1 -7
- package/lib/guid-parser.js.map +1 -0
- package/lib/incoming-message-stream.js +9 -29
- package/lib/incoming-message-stream.js.map +1 -0
- package/lib/instance-lookup.js +3 -34
- package/lib/instance-lookup.js.map +1 -0
- package/lib/library.js +1 -1
- package/lib/library.js.map +1 -0
- package/lib/login7-payload.js +99 -100
- package/lib/login7-payload.js.map +1 -0
- package/lib/message-io.js +17 -45
- package/lib/message-io.js.map +1 -0
- package/lib/message.js +4 -8
- package/lib/message.js.map +1 -0
- package/lib/metadata-parser.js +1 -22
- package/lib/metadata-parser.js.map +1 -0
- package/lib/ntlm-payload.js +2 -22
- package/lib/ntlm-payload.js.map +1 -0
- package/lib/ntlm.js +1 -4
- package/lib/ntlm.js.map +1 -0
- package/lib/outgoing-message-stream.js +12 -21
- package/lib/outgoing-message-stream.js.map +1 -0
- package/lib/packet.js +2 -47
- package/lib/packet.js.map +1 -0
- package/lib/prelogin-payload.js +11 -54
- package/lib/prelogin-payload.js.map +1 -0
- package/lib/request.js +88 -66
- package/lib/request.js.map +1 -0
- package/lib/rpcrequest-payload.js +8 -35
- package/lib/rpcrequest-payload.js.map +1 -0
- package/lib/sender.js +1 -24
- package/lib/sender.js.map +1 -0
- package/lib/special-stored-procedure.js +1 -1
- package/lib/special-stored-procedure.js.map +1 -0
- package/lib/sqlbatch-payload.js +5 -18
- package/lib/sqlbatch-payload.js.map +1 -0
- package/lib/tds-versions.js +3 -3
- package/lib/tds-versions.js.map +1 -0
- package/lib/tedious.js +1 -12
- package/lib/tedious.js.map +1 -0
- package/lib/token/colmetadata-token-parser.js +1 -17
- package/lib/token/colmetadata-token-parser.js.map +1 -0
- package/lib/token/done-token-parser.js +2 -8
- package/lib/token/done-token-parser.js.map +1 -0
- package/lib/token/env-change-token-parser.js +7 -28
- package/lib/token/env-change-token-parser.js.map +1 -0
- package/lib/token/feature-ext-ack-parser.js +1 -10
- package/lib/token/feature-ext-ack-parser.js.map +1 -0
- package/lib/token/fedauth-info-parser.js +2 -10
- package/lib/token/fedauth-info-parser.js.map +1 -0
- package/lib/token/handler.js +39 -149
- package/lib/token/handler.js.map +1 -0
- package/lib/token/infoerror-token-parser.js +1 -5
- package/lib/token/infoerror-token-parser.js.map +1 -0
- package/lib/token/loginack-token-parser.js +1 -6
- package/lib/token/loginack-token-parser.js.map +1 -0
- package/lib/token/nbcrow-token-parser.js +2 -15
- package/lib/token/nbcrow-token-parser.js.map +1 -0
- package/lib/token/order-token-parser.js +2 -7
- package/lib/token/order-token-parser.js.map +1 -0
- package/lib/token/returnstatus-token-parser.js +2 -4
- package/lib/token/returnstatus-token-parser.js.map +1 -0
- package/lib/token/returnvalue-token-parser.js +4 -9
- package/lib/token/returnvalue-token-parser.js.map +1 -0
- package/lib/token/row-token-parser.js +2 -11
- package/lib/token/row-token-parser.js.map +1 -0
- package/lib/token/sspi-token-parser.js +1 -5
- package/lib/token/sspi-token-parser.js.map +1 -0
- package/lib/token/stream-parser.js +24 -86
- package/lib/token/stream-parser.js.map +1 -0
- package/lib/token/token-stream-parser.js +4 -13
- package/lib/token/token-stream-parser.js.map +1 -0
- package/lib/token/token.js +88 -168
- package/lib/token/token.js.map +1 -0
- package/lib/tracking-buffer/writable-tracking-buffer.js +20 -60
- package/lib/tracking-buffer/writable-tracking-buffer.js.map +1 -0
- package/lib/transaction.js +9 -33
- package/lib/transaction.js.map +1 -0
- package/lib/transient-error-lookup.js +1 -4
- package/lib/transient-error-lookup.js.map +1 -0
- package/lib/utils/with-timeout.js +1 -9
- package/lib/utils/with-timeout.js.map +1 -0
- package/lib/value-parser.js +1 -143
- package/lib/value-parser.js.map +1 -0
- package/package.json +27 -71
package/lib/token/handler.js
CHANGED
|
@@ -4,286 +4,222 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.UnexpectedTokenError = exports.TokenHandler = exports.RequestTokenHandler = exports.Login7TokenHandler = exports.InitialSqlTokenHandler = exports.AttentionTokenHandler = void 0;
|
|
7
|
-
|
|
8
7
|
var _request = _interopRequireDefault(require("../request"));
|
|
9
|
-
|
|
10
8
|
var _errors = require("../errors");
|
|
11
|
-
|
|
12
9
|
var _esAggregateError = _interopRequireDefault(require("es-aggregate-error"));
|
|
13
|
-
|
|
14
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
11
|
class UnexpectedTokenError extends Error {
|
|
17
12
|
constructor(handler, token) {
|
|
18
13
|
super('Unexpected token `' + token.name + '` in `' + handler.constructor.name + '`');
|
|
19
14
|
}
|
|
20
|
-
|
|
21
15
|
}
|
|
22
|
-
|
|
23
16
|
exports.UnexpectedTokenError = UnexpectedTokenError;
|
|
24
|
-
|
|
25
17
|
class TokenHandler {
|
|
26
18
|
onInfoMessage(token) {
|
|
27
19
|
throw new UnexpectedTokenError(this, token);
|
|
28
20
|
}
|
|
29
|
-
|
|
30
21
|
onErrorMessage(token) {
|
|
31
22
|
throw new UnexpectedTokenError(this, token);
|
|
32
23
|
}
|
|
33
|
-
|
|
34
24
|
onSSPI(token) {
|
|
35
25
|
throw new UnexpectedTokenError(this, token);
|
|
36
26
|
}
|
|
37
|
-
|
|
38
27
|
onDatabaseChange(token) {
|
|
39
28
|
throw new UnexpectedTokenError(this, token);
|
|
40
29
|
}
|
|
41
|
-
|
|
42
30
|
onLanguageChange(token) {
|
|
43
31
|
throw new UnexpectedTokenError(this, token);
|
|
44
32
|
}
|
|
45
|
-
|
|
46
33
|
onCharsetChange(token) {
|
|
47
34
|
throw new UnexpectedTokenError(this, token);
|
|
48
35
|
}
|
|
49
|
-
|
|
50
36
|
onSqlCollationChange(token) {
|
|
51
37
|
throw new UnexpectedTokenError(this, token);
|
|
52
38
|
}
|
|
53
|
-
|
|
54
39
|
onRoutingChange(token) {
|
|
55
40
|
throw new UnexpectedTokenError(this, token);
|
|
56
41
|
}
|
|
57
|
-
|
|
58
42
|
onPacketSizeChange(token) {
|
|
59
43
|
throw new UnexpectedTokenError(this, token);
|
|
60
44
|
}
|
|
61
|
-
|
|
62
45
|
onResetConnection(token) {
|
|
63
46
|
throw new UnexpectedTokenError(this, token);
|
|
64
47
|
}
|
|
65
|
-
|
|
66
48
|
onBeginTransaction(token) {
|
|
67
49
|
throw new UnexpectedTokenError(this, token);
|
|
68
50
|
}
|
|
69
|
-
|
|
70
51
|
onCommitTransaction(token) {
|
|
71
52
|
throw new UnexpectedTokenError(this, token);
|
|
72
53
|
}
|
|
73
|
-
|
|
74
54
|
onRollbackTransaction(token) {
|
|
75
55
|
throw new UnexpectedTokenError(this, token);
|
|
76
56
|
}
|
|
77
|
-
|
|
78
57
|
onFedAuthInfo(token) {
|
|
79
58
|
throw new UnexpectedTokenError(this, token);
|
|
80
59
|
}
|
|
81
|
-
|
|
82
60
|
onFeatureExtAck(token) {
|
|
83
61
|
throw new UnexpectedTokenError(this, token);
|
|
84
62
|
}
|
|
85
|
-
|
|
86
63
|
onLoginAck(token) {
|
|
87
64
|
throw new UnexpectedTokenError(this, token);
|
|
88
65
|
}
|
|
89
|
-
|
|
90
66
|
onColMetadata(token) {
|
|
91
67
|
throw new UnexpectedTokenError(this, token);
|
|
92
68
|
}
|
|
93
|
-
|
|
94
69
|
onOrder(token) {
|
|
95
70
|
throw new UnexpectedTokenError(this, token);
|
|
96
71
|
}
|
|
97
|
-
|
|
98
72
|
onRow(token) {
|
|
99
73
|
throw new UnexpectedTokenError(this, token);
|
|
100
74
|
}
|
|
101
|
-
|
|
102
75
|
onReturnStatus(token) {
|
|
103
76
|
throw new UnexpectedTokenError(this, token);
|
|
104
77
|
}
|
|
105
|
-
|
|
106
78
|
onReturnValue(token) {
|
|
107
79
|
throw new UnexpectedTokenError(this, token);
|
|
108
80
|
}
|
|
109
|
-
|
|
110
81
|
onDoneProc(token) {
|
|
111
82
|
throw new UnexpectedTokenError(this, token);
|
|
112
83
|
}
|
|
113
|
-
|
|
114
84
|
onDoneInProc(token) {
|
|
115
85
|
throw new UnexpectedTokenError(this, token);
|
|
116
86
|
}
|
|
117
|
-
|
|
118
87
|
onDone(token) {
|
|
119
88
|
throw new UnexpectedTokenError(this, token);
|
|
120
89
|
}
|
|
121
|
-
|
|
122
90
|
onDatabaseMirroringPartner(token) {
|
|
123
91
|
throw new UnexpectedTokenError(this, token);
|
|
124
92
|
}
|
|
125
|
-
|
|
126
93
|
}
|
|
94
|
+
|
|
127
95
|
/**
|
|
128
96
|
* A handler for tokens received in the response message to the initial SQL Batch request
|
|
129
97
|
* that sets up different connection settings.
|
|
130
98
|
*/
|
|
131
|
-
|
|
132
|
-
|
|
133
99
|
exports.TokenHandler = TokenHandler;
|
|
134
|
-
|
|
135
100
|
class InitialSqlTokenHandler extends TokenHandler {
|
|
101
|
+
connection;
|
|
136
102
|
constructor(connection) {
|
|
137
103
|
super();
|
|
138
|
-
this.connection = void 0;
|
|
139
104
|
this.connection = connection;
|
|
140
105
|
}
|
|
141
|
-
|
|
142
106
|
onInfoMessage(token) {
|
|
143
107
|
this.connection.emit('infoMessage', token);
|
|
144
108
|
}
|
|
145
|
-
|
|
146
109
|
onErrorMessage(token) {
|
|
147
110
|
this.connection.emit('errorMessage', token);
|
|
148
111
|
}
|
|
149
|
-
|
|
150
112
|
onDatabaseChange(token) {
|
|
151
113
|
this.connection.emit('databaseChange', token.newValue);
|
|
152
114
|
}
|
|
153
|
-
|
|
154
115
|
onLanguageChange(token) {
|
|
155
116
|
this.connection.emit('languageChange', token.newValue);
|
|
156
117
|
}
|
|
157
|
-
|
|
158
118
|
onCharsetChange(token) {
|
|
159
119
|
this.connection.emit('charsetChange', token.newValue);
|
|
160
120
|
}
|
|
161
|
-
|
|
162
121
|
onSqlCollationChange(token) {
|
|
163
122
|
this.connection.databaseCollation = token.newValue;
|
|
164
123
|
}
|
|
165
|
-
|
|
166
124
|
onPacketSizeChange(token) {
|
|
167
125
|
this.connection.messageIo.packetSize(token.newValue);
|
|
168
126
|
}
|
|
169
|
-
|
|
170
127
|
onBeginTransaction(token) {
|
|
171
128
|
this.connection.transactionDescriptors.push(token.newValue);
|
|
172
129
|
this.connection.inTransaction = true;
|
|
173
130
|
}
|
|
174
|
-
|
|
175
131
|
onCommitTransaction(token) {
|
|
176
132
|
this.connection.transactionDescriptors.length = 1;
|
|
177
133
|
this.connection.inTransaction = false;
|
|
178
134
|
}
|
|
179
|
-
|
|
180
135
|
onRollbackTransaction(token) {
|
|
181
|
-
this.connection.transactionDescriptors.length = 1;
|
|
182
|
-
|
|
136
|
+
this.connection.transactionDescriptors.length = 1;
|
|
137
|
+
// An outermost transaction was rolled back. Reset the transaction counter
|
|
183
138
|
this.connection.inTransaction = false;
|
|
184
139
|
this.connection.emit('rollbackTransaction');
|
|
185
140
|
}
|
|
186
|
-
|
|
187
141
|
onColMetadata(token) {
|
|
188
142
|
this.connection.emit('error', new Error("Received 'columnMetadata' when no sqlRequest is in progress"));
|
|
189
143
|
this.connection.close();
|
|
190
144
|
}
|
|
191
|
-
|
|
192
145
|
onOrder(token) {
|
|
193
146
|
this.connection.emit('error', new Error("Received 'order' when no sqlRequest is in progress"));
|
|
194
147
|
this.connection.close();
|
|
195
148
|
}
|
|
196
|
-
|
|
197
149
|
onRow(token) {
|
|
198
150
|
this.connection.emit('error', new Error("Received 'row' when no sqlRequest is in progress"));
|
|
199
151
|
this.connection.close();
|
|
200
152
|
}
|
|
201
|
-
|
|
202
|
-
|
|
153
|
+
onReturnStatus(token) {
|
|
154
|
+
// Do nothing
|
|
203
155
|
}
|
|
204
|
-
|
|
205
|
-
|
|
156
|
+
onReturnValue(token) {
|
|
157
|
+
// Do nothing
|
|
206
158
|
}
|
|
207
|
-
|
|
208
|
-
|
|
159
|
+
onDoneProc(token) {
|
|
160
|
+
// Do nothing
|
|
209
161
|
}
|
|
210
|
-
|
|
211
|
-
|
|
162
|
+
onDoneInProc(token) {
|
|
163
|
+
// Do nothing
|
|
212
164
|
}
|
|
213
|
-
|
|
214
|
-
|
|
165
|
+
onDone(token) {
|
|
166
|
+
// Do nothing
|
|
215
167
|
}
|
|
216
|
-
|
|
217
168
|
onResetConnection(token) {
|
|
218
169
|
this.connection.emit('resetConnection');
|
|
219
170
|
}
|
|
220
|
-
|
|
221
171
|
}
|
|
172
|
+
|
|
222
173
|
/**
|
|
223
174
|
* A handler for tokens received in the response message to a Login7 message.
|
|
224
175
|
*/
|
|
225
|
-
|
|
226
|
-
|
|
227
176
|
exports.InitialSqlTokenHandler = InitialSqlTokenHandler;
|
|
228
|
-
|
|
229
177
|
class Login7TokenHandler extends TokenHandler {
|
|
178
|
+
connection;
|
|
179
|
+
fedAuthInfoToken;
|
|
180
|
+
routingData;
|
|
181
|
+
loginAckReceived = false;
|
|
230
182
|
constructor(connection) {
|
|
231
183
|
super();
|
|
232
|
-
this.connection = void 0;
|
|
233
|
-
this.fedAuthInfoToken = void 0;
|
|
234
|
-
this.routingData = void 0;
|
|
235
|
-
this.loginAckReceived = false;
|
|
236
184
|
this.connection = connection;
|
|
237
185
|
}
|
|
238
|
-
|
|
239
186
|
onInfoMessage(token) {
|
|
240
187
|
this.connection.emit('infoMessage', token);
|
|
241
188
|
}
|
|
242
|
-
|
|
243
189
|
onErrorMessage(token) {
|
|
244
190
|
this.connection.emit('errorMessage', token);
|
|
245
191
|
const error = new _errors.ConnectionError(token.message, 'ELOGIN');
|
|
246
192
|
const isLoginErrorTransient = this.connection.transientErrorLookup.isTransientError(token.number);
|
|
247
|
-
|
|
248
193
|
if (isLoginErrorTransient && this.connection.curTransientRetryCount !== this.connection.config.options.maxRetriesOnTransientErrors) {
|
|
249
194
|
error.isTransient = true;
|
|
250
195
|
}
|
|
251
|
-
|
|
252
196
|
this.connection.loginError = error;
|
|
253
197
|
}
|
|
254
|
-
|
|
255
198
|
onSSPI(token) {
|
|
256
199
|
if (token.ntlmpacket) {
|
|
257
200
|
this.connection.ntlmpacket = token.ntlmpacket;
|
|
258
201
|
this.connection.ntlmpacketBuffer = token.ntlmpacketBuffer;
|
|
259
202
|
}
|
|
260
203
|
}
|
|
261
|
-
|
|
262
204
|
onDatabaseChange(token) {
|
|
263
205
|
this.connection.emit('databaseChange', token.newValue);
|
|
264
206
|
}
|
|
265
|
-
|
|
266
207
|
onLanguageChange(token) {
|
|
267
208
|
this.connection.emit('languageChange', token.newValue);
|
|
268
209
|
}
|
|
269
|
-
|
|
270
210
|
onCharsetChange(token) {
|
|
271
211
|
this.connection.emit('charsetChange', token.newValue);
|
|
272
212
|
}
|
|
273
|
-
|
|
274
213
|
onSqlCollationChange(token) {
|
|
275
214
|
this.connection.databaseCollation = token.newValue;
|
|
276
215
|
}
|
|
277
|
-
|
|
278
216
|
onFedAuthInfo(token) {
|
|
279
217
|
this.fedAuthInfoToken = token;
|
|
280
218
|
}
|
|
281
|
-
|
|
282
219
|
onFeatureExtAck(token) {
|
|
283
220
|
const {
|
|
284
221
|
authentication
|
|
285
222
|
} = this.connection.config;
|
|
286
|
-
|
|
287
223
|
if (authentication.type === 'azure-active-directory-password' || authentication.type === 'azure-active-directory-access-token' || authentication.type === 'azure-active-directory-msi-vm' || authentication.type === 'azure-active-directory-msi-app-service' || authentication.type === 'azure-active-directory-service-principal-secret' || authentication.type === 'azure-active-directory-default') {
|
|
288
224
|
if (token.fedAuth === undefined) {
|
|
289
225
|
this.connection.loginError = new _errors.ConnectionError('Did not receive Active Directory authentication acknowledgement');
|
|
@@ -296,25 +232,22 @@ class Login7TokenHandler extends TokenHandler {
|
|
|
296
232
|
this.connection.loginError = new _errors.ConnectionError('Did not request Active Directory authentication, but received the acknowledgment');
|
|
297
233
|
}
|
|
298
234
|
}
|
|
299
|
-
|
|
300
235
|
onLoginAck(token) {
|
|
301
236
|
if (!token.tdsVersion) {
|
|
302
237
|
// unsupported TDS version
|
|
303
238
|
this.connection.loginError = new _errors.ConnectionError('Server responded with unknown TDS version.', 'ETDS');
|
|
304
239
|
return;
|
|
305
240
|
}
|
|
306
|
-
|
|
307
241
|
if (!token.interface) {
|
|
308
242
|
// unsupported interface
|
|
309
243
|
this.connection.loginError = new _errors.ConnectionError('Server responded with unsupported interface.', 'EINTERFACENOTSUPP');
|
|
310
244
|
return;
|
|
311
|
-
}
|
|
312
|
-
|
|
245
|
+
}
|
|
313
246
|
|
|
247
|
+
// use negotiated version
|
|
314
248
|
this.connection.config.options.tdsVersion = token.tdsVersion;
|
|
315
249
|
this.loginAckReceived = true;
|
|
316
250
|
}
|
|
317
|
-
|
|
318
251
|
onRoutingChange(token) {
|
|
319
252
|
// Removes instance name attached to the redirect url. E.g., redirect.db.net\instance1 --> redirect.db.net
|
|
320
253
|
const [server] = token.newValue.server.split('\\');
|
|
@@ -323,47 +256,40 @@ class Login7TokenHandler extends TokenHandler {
|
|
|
323
256
|
port: token.newValue.port
|
|
324
257
|
};
|
|
325
258
|
}
|
|
326
|
-
|
|
327
|
-
|
|
259
|
+
onDoneInProc(token) {
|
|
260
|
+
// Do nothing
|
|
328
261
|
}
|
|
329
|
-
|
|
330
|
-
|
|
262
|
+
onDone(token) {
|
|
263
|
+
// Do nothing
|
|
331
264
|
}
|
|
332
|
-
|
|
333
265
|
onPacketSizeChange(token) {
|
|
334
266
|
this.connection.messageIo.packetSize(token.newValue);
|
|
335
267
|
}
|
|
336
|
-
|
|
337
|
-
|
|
268
|
+
onDatabaseMirroringPartner(token) {
|
|
269
|
+
// Do nothing
|
|
338
270
|
}
|
|
339
|
-
|
|
340
271
|
}
|
|
272
|
+
|
|
341
273
|
/**
|
|
342
274
|
* A handler for tokens received in the response message to a RPC Request,
|
|
343
275
|
* a SQL Batch Request, a Bulk Load BCP Request or a Transaction Manager Request.
|
|
344
276
|
*/
|
|
345
|
-
|
|
346
|
-
|
|
347
277
|
exports.Login7TokenHandler = Login7TokenHandler;
|
|
348
|
-
|
|
349
278
|
class RequestTokenHandler extends TokenHandler {
|
|
279
|
+
connection;
|
|
280
|
+
request;
|
|
281
|
+
errors;
|
|
350
282
|
constructor(connection, request) {
|
|
351
283
|
super();
|
|
352
|
-
this.connection = void 0;
|
|
353
|
-
this.request = void 0;
|
|
354
|
-
this.errors = void 0;
|
|
355
284
|
this.connection = connection;
|
|
356
285
|
this.request = request;
|
|
357
286
|
this.errors = [];
|
|
358
287
|
}
|
|
359
|
-
|
|
360
288
|
onInfoMessage(token) {
|
|
361
289
|
this.connection.emit('infoMessage', token);
|
|
362
290
|
}
|
|
363
|
-
|
|
364
291
|
onErrorMessage(token) {
|
|
365
292
|
this.connection.emit('errorMessage', token);
|
|
366
|
-
|
|
367
293
|
if (!this.request.canceled) {
|
|
368
294
|
const error = new _errors.RequestError(token.message, 'EREQUEST');
|
|
369
295
|
error.number = token.number;
|
|
@@ -374,192 +300,156 @@ class RequestTokenHandler extends TokenHandler {
|
|
|
374
300
|
error.lineNumber = token.lineNumber;
|
|
375
301
|
this.errors.push(error);
|
|
376
302
|
this.request.error = error;
|
|
377
|
-
|
|
378
303
|
if (this.request instanceof _request.default && this.errors.length > 1) {
|
|
379
304
|
this.request.error = new _esAggregateError.default(this.errors);
|
|
380
305
|
}
|
|
381
306
|
}
|
|
382
307
|
}
|
|
383
|
-
|
|
384
308
|
onDatabaseChange(token) {
|
|
385
309
|
this.connection.emit('databaseChange', token.newValue);
|
|
386
310
|
}
|
|
387
|
-
|
|
388
311
|
onLanguageChange(token) {
|
|
389
312
|
this.connection.emit('languageChange', token.newValue);
|
|
390
313
|
}
|
|
391
|
-
|
|
392
314
|
onCharsetChange(token) {
|
|
393
315
|
this.connection.emit('charsetChange', token.newValue);
|
|
394
316
|
}
|
|
395
|
-
|
|
396
317
|
onSqlCollationChange(token) {
|
|
397
318
|
this.connection.databaseCollation = token.newValue;
|
|
398
319
|
}
|
|
399
|
-
|
|
400
320
|
onPacketSizeChange(token) {
|
|
401
321
|
this.connection.messageIo.packetSize(token.newValue);
|
|
402
322
|
}
|
|
403
|
-
|
|
404
323
|
onBeginTransaction(token) {
|
|
405
324
|
this.connection.transactionDescriptors.push(token.newValue);
|
|
406
325
|
this.connection.inTransaction = true;
|
|
407
326
|
}
|
|
408
|
-
|
|
409
327
|
onCommitTransaction(token) {
|
|
410
328
|
this.connection.transactionDescriptors.length = 1;
|
|
411
329
|
this.connection.inTransaction = false;
|
|
412
330
|
}
|
|
413
|
-
|
|
414
331
|
onRollbackTransaction(token) {
|
|
415
|
-
this.connection.transactionDescriptors.length = 1;
|
|
416
|
-
|
|
332
|
+
this.connection.transactionDescriptors.length = 1;
|
|
333
|
+
// An outermost transaction was rolled back. Reset the transaction counter
|
|
417
334
|
this.connection.inTransaction = false;
|
|
418
335
|
this.connection.emit('rollbackTransaction');
|
|
419
336
|
}
|
|
420
|
-
|
|
421
337
|
onColMetadata(token) {
|
|
422
338
|
if (!this.request.canceled) {
|
|
423
339
|
if (this.connection.config.options.useColumnNames) {
|
|
424
340
|
const columns = Object.create(null);
|
|
425
|
-
|
|
426
341
|
for (let j = 0, len = token.columns.length; j < len; j++) {
|
|
427
342
|
const col = token.columns[j];
|
|
428
|
-
|
|
429
343
|
if (columns[col.colName] == null) {
|
|
430
344
|
columns[col.colName] = col;
|
|
431
345
|
}
|
|
432
346
|
}
|
|
433
|
-
|
|
434
347
|
this.request.emit('columnMetadata', columns);
|
|
435
348
|
} else {
|
|
436
349
|
this.request.emit('columnMetadata', token.columns);
|
|
437
350
|
}
|
|
438
351
|
}
|
|
439
352
|
}
|
|
440
|
-
|
|
441
353
|
onOrder(token) {
|
|
442
354
|
if (!this.request.canceled) {
|
|
443
355
|
this.request.emit('order', token.orderColumns);
|
|
444
356
|
}
|
|
445
357
|
}
|
|
446
|
-
|
|
447
358
|
onRow(token) {
|
|
448
359
|
if (!this.request.canceled) {
|
|
449
360
|
if (this.connection.config.options.rowCollectionOnRequestCompletion) {
|
|
450
361
|
this.request.rows.push(token.columns);
|
|
451
362
|
}
|
|
452
|
-
|
|
453
363
|
if (this.connection.config.options.rowCollectionOnDone) {
|
|
454
364
|
this.request.rst.push(token.columns);
|
|
455
365
|
}
|
|
456
|
-
|
|
457
366
|
this.request.emit('row', token.columns);
|
|
458
367
|
}
|
|
459
368
|
}
|
|
460
|
-
|
|
461
369
|
onReturnStatus(token) {
|
|
462
370
|
if (!this.request.canceled) {
|
|
463
371
|
// Keep value for passing in 'doneProc' event.
|
|
464
372
|
this.connection.procReturnStatusValue = token.value;
|
|
465
373
|
}
|
|
466
374
|
}
|
|
467
|
-
|
|
468
375
|
onReturnValue(token) {
|
|
469
376
|
if (!this.request.canceled) {
|
|
470
377
|
this.request.emit('returnValue', token.paramName, token.value, token.metadata);
|
|
471
378
|
}
|
|
472
379
|
}
|
|
473
|
-
|
|
474
380
|
onDoneProc(token) {
|
|
475
381
|
if (!this.request.canceled) {
|
|
476
382
|
if (token.sqlError && !this.request.error) {
|
|
477
383
|
// check if the DONE_ERROR flags was set, but an ERROR token was not sent.
|
|
478
384
|
this.request.error = new _errors.RequestError('An unknown error has occurred.', 'UNKNOWN');
|
|
479
385
|
}
|
|
480
|
-
|
|
481
386
|
this.request.emit('doneProc', token.rowCount, token.more, this.connection.procReturnStatusValue, this.request.rst);
|
|
482
387
|
this.connection.procReturnStatusValue = undefined;
|
|
483
|
-
|
|
484
388
|
if (token.rowCount !== undefined) {
|
|
485
389
|
this.request.rowCount += token.rowCount;
|
|
486
390
|
}
|
|
487
|
-
|
|
488
391
|
if (this.connection.config.options.rowCollectionOnDone) {
|
|
489
392
|
this.request.rst = [];
|
|
490
393
|
}
|
|
491
394
|
}
|
|
492
395
|
}
|
|
493
|
-
|
|
494
396
|
onDoneInProc(token) {
|
|
495
397
|
if (!this.request.canceled) {
|
|
496
398
|
this.request.emit('doneInProc', token.rowCount, token.more, this.request.rst);
|
|
497
|
-
|
|
498
399
|
if (token.rowCount !== undefined) {
|
|
499
400
|
this.request.rowCount += token.rowCount;
|
|
500
401
|
}
|
|
501
|
-
|
|
502
402
|
if (this.connection.config.options.rowCollectionOnDone) {
|
|
503
403
|
this.request.rst = [];
|
|
504
404
|
}
|
|
505
405
|
}
|
|
506
406
|
}
|
|
507
|
-
|
|
508
407
|
onDone(token) {
|
|
509
408
|
if (!this.request.canceled) {
|
|
510
409
|
if (token.sqlError && !this.request.error) {
|
|
511
410
|
// check if the DONE_ERROR flags was set, but an ERROR token was not sent.
|
|
512
411
|
this.request.error = new _errors.RequestError('An unknown error has occurred.', 'UNKNOWN');
|
|
513
412
|
}
|
|
514
|
-
|
|
515
413
|
this.request.emit('done', token.rowCount, token.more, this.request.rst);
|
|
516
|
-
|
|
517
414
|
if (token.rowCount !== undefined) {
|
|
518
415
|
this.request.rowCount += token.rowCount;
|
|
519
416
|
}
|
|
520
|
-
|
|
521
417
|
if (this.connection.config.options.rowCollectionOnDone) {
|
|
522
418
|
this.request.rst = [];
|
|
523
419
|
}
|
|
524
420
|
}
|
|
525
421
|
}
|
|
526
|
-
|
|
527
422
|
onResetConnection(token) {
|
|
528
423
|
this.connection.emit('resetConnection');
|
|
529
424
|
}
|
|
530
|
-
|
|
531
425
|
}
|
|
426
|
+
|
|
532
427
|
/**
|
|
533
428
|
* A handler for the attention acknowledgement message.
|
|
534
429
|
*
|
|
535
430
|
* This message only contains a `DONE` token that acknowledges
|
|
536
431
|
* that the attention message was received by the server.
|
|
537
432
|
*/
|
|
538
|
-
|
|
539
|
-
|
|
540
433
|
exports.RequestTokenHandler = RequestTokenHandler;
|
|
541
|
-
|
|
542
434
|
class AttentionTokenHandler extends TokenHandler {
|
|
435
|
+
connection;
|
|
436
|
+
request;
|
|
437
|
+
|
|
543
438
|
/**
|
|
544
439
|
* Returns whether an attention acknowledgement was received.
|
|
545
440
|
*/
|
|
441
|
+
attentionReceived;
|
|
546
442
|
constructor(connection, request) {
|
|
547
443
|
super();
|
|
548
|
-
this.connection = void 0;
|
|
549
|
-
this.request = void 0;
|
|
550
|
-
this.attentionReceived = void 0;
|
|
551
444
|
this.connection = connection;
|
|
552
445
|
this.request = request;
|
|
553
446
|
this.attentionReceived = false;
|
|
554
447
|
}
|
|
555
|
-
|
|
556
448
|
onDone(token) {
|
|
557
449
|
if (token.attention) {
|
|
558
450
|
this.attentionReceived = true;
|
|
559
451
|
}
|
|
560
452
|
}
|
|
561
|
-
|
|
562
453
|
}
|
|
563
|
-
|
|
564
454
|
exports.AttentionTokenHandler = AttentionTokenHandler;
|
|
565
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVbmV4cGVjdGVkVG9rZW5FcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJoYW5kbGVyIiwidG9rZW4iLCJuYW1lIiwiVG9rZW5IYW5kbGVyIiwib25JbmZvTWVzc2FnZSIsIm9uRXJyb3JNZXNzYWdlIiwib25TU1BJIiwib25EYXRhYmFzZUNoYW5nZSIsIm9uTGFuZ3VhZ2VDaGFuZ2UiLCJvbkNoYXJzZXRDaGFuZ2UiLCJvblNxbENvbGxhdGlvbkNoYW5nZSIsIm9uUm91dGluZ0NoYW5nZSIsIm9uUGFja2V0U2l6ZUNoYW5nZSIsIm9uUmVzZXRDb25uZWN0aW9uIiwib25CZWdpblRyYW5zYWN0aW9uIiwib25Db21taXRUcmFuc2FjdGlvbiIsIm9uUm9sbGJhY2tUcmFuc2FjdGlvbiIsIm9uRmVkQXV0aEluZm8iLCJvbkZlYXR1cmVFeHRBY2siLCJvbkxvZ2luQWNrIiwib25Db2xNZXRhZGF0YSIsIm9uT3JkZXIiLCJvblJvdyIsIm9uUmV0dXJuU3RhdHVzIiwib25SZXR1cm5WYWx1ZSIsIm9uRG9uZVByb2MiLCJvbkRvbmVJblByb2MiLCJvbkRvbmUiLCJvbkRhdGFiYXNlTWlycm9yaW5nUGFydG5lciIsIkluaXRpYWxTcWxUb2tlbkhhbmRsZXIiLCJjb25uZWN0aW9uIiwiZW1pdCIsIm5ld1ZhbHVlIiwiZGF0YWJhc2VDb2xsYXRpb24iLCJtZXNzYWdlSW8iLCJwYWNrZXRTaXplIiwidHJhbnNhY3Rpb25EZXNjcmlwdG9ycyIsInB1c2giLCJpblRyYW5zYWN0aW9uIiwibGVuZ3RoIiwiY2xvc2UiLCJMb2dpbjdUb2tlbkhhbmRsZXIiLCJmZWRBdXRoSW5mb1Rva2VuIiwicm91dGluZ0RhdGEiLCJsb2dpbkFja1JlY2VpdmVkIiwiZXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJtZXNzYWdlIiwiaXNMb2dpbkVycm9yVHJhbnNpZW50IiwidHJhbnNpZW50RXJyb3JMb29rdXAiLCJpc1RyYW5zaWVudEVycm9yIiwibnVtYmVyIiwiY3VyVHJhbnNpZW50UmV0cnlDb3VudCIsImNvbmZpZyIsIm9wdGlvbnMiLCJtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMiLCJpc1RyYW5zaWVudCIsImxvZ2luRXJyb3IiLCJudGxtcGFja2V0IiwibnRsbXBhY2tldEJ1ZmZlciIsImF1dGhlbnRpY2F0aW9uIiwidHlwZSIsImZlZEF1dGgiLCJ1bmRlZmluZWQiLCJ1dGY4U3VwcG9ydCIsInRkc1ZlcnNpb24iLCJpbnRlcmZhY2UiLCJzZXJ2ZXIiLCJzcGxpdCIsInBvcnQiLCJSZXF1ZXN0VG9rZW5IYW5kbGVyIiwicmVxdWVzdCIsImVycm9ycyIsImNhbmNlbGVkIiwiUmVxdWVzdEVycm9yIiwic3RhdGUiLCJjbGFzcyIsInNlcnZlck5hbWUiLCJwcm9jTmFtZSIsImxpbmVOdW1iZXIiLCJSZXF1ZXN0IiwiQWdncmVnYXRlRXJyb3IiLCJ1c2VDb2x1bW5OYW1lcyIsImNvbHVtbnMiLCJPYmplY3QiLCJjcmVhdGUiLCJqIiwibGVuIiwiY29sIiwiY29sTmFtZSIsIm9yZGVyQ29sdW1ucyIsInJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uIiwicm93cyIsInJvd0NvbGxlY3Rpb25PbkRvbmUiLCJyc3QiLCJwcm9jUmV0dXJuU3RhdHVzVmFsdWUiLCJ2YWx1ZSIsInBhcmFtTmFtZSIsIm1ldGFkYXRhIiwic3FsRXJyb3IiLCJyb3dDb3VudCIsIm1vcmUiLCJBdHRlbnRpb25Ub2tlbkhhbmRsZXIiLCJhdHRlbnRpb25SZWNlaXZlZCIsImF0dGVudGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb25uZWN0aW9uIGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgeyBDb25uZWN0aW9uRXJyb3IsIFJlcXVlc3RFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YSB9IGZyb20gJy4vY29sbWV0YWRhdGEtdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7XG4gIEJlZ2luVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgQ2hhcnNldEVudkNoYW5nZVRva2VuLFxuICBDb2xsYXRpb25DaGFuZ2VUb2tlbixcbiAgQ29sTWV0YWRhdGFUb2tlbixcbiAgQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbixcbiAgRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4sXG4gIERvbmVJblByb2NUb2tlbixcbiAgRG9uZVByb2NUb2tlbixcbiAgRG9uZVRva2VuLFxuICBFcnJvck1lc3NhZ2VUb2tlbixcbiAgRmVhdHVyZUV4dEFja1Rva2VuLFxuICBGZWRBdXRoSW5mb1Rva2VuLFxuICBJbmZvTWVzc2FnZVRva2VuLFxuICBMYW5ndWFnZUVudkNoYW5nZVRva2VuLFxuICBMb2dpbkFja1Rva2VuLFxuICBOQkNSb3dUb2tlbixcbiAgT3JkZXJUb2tlbixcbiAgUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuLFxuICBSZXNldENvbm5lY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgUmV0dXJuU3RhdHVzVG9rZW4sXG4gIFJldHVyblZhbHVlVG9rZW4sXG4gIFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgUm91dGluZ0VudkNoYW5nZVRva2VuLFxuICBSb3dUb2tlbixcbiAgU1NQSVRva2VuLFxuICBUb2tlblxufSBmcm9tICcuL3Rva2VuJztcbmltcG9ydCBCdWxrTG9hZCBmcm9tICcuLi9idWxrLWxvYWQnO1xuXG5pbXBvcnQgQWdncmVnYXRlRXJyb3IgZnJvbSAnZXMtYWdncmVnYXRlLWVycm9yJztcblxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihoYW5kbGVyOiBUb2tlbkhhbmRsZXIsIHRva2VuOiBUb2tlbikge1xuICAgIHN1cGVyKCdVbmV4cGVjdGVkIHRva2VuIGAnICsgdG9rZW4ubmFtZSArICdgIGluIGAnICsgaGFuZGxlci5jb25zdHJ1Y3Rvci5uYW1lICsgJ2AnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVG9rZW5IYW5kbGVyIHtcbiAgb25JbmZvTWVzc2FnZSh0b2tlbjogSW5mb01lc3NhZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkVycm9yTWVzc2FnZSh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25TU1BJKHRva2VuOiBTU1BJVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25EYXRhYmFzZUNoYW5nZSh0b2tlbjogRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKHRva2VuOiBMYW5ndWFnZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uQ2hhcnNldENoYW5nZSh0b2tlbjogQ2hhcnNldEVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uU3FsQ29sbGF0aW9uQ2hhbmdlKHRva2VuOiBDb2xsYXRpb25DaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJvdXRpbmdDaGFuZ2UodG9rZW46IFJvdXRpbmdFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblBhY2tldFNpemVDaGFuZ2UodG9rZW46IFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJlc2V0Q29ubmVjdGlvbih0b2tlbjogUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25CZWdpblRyYW5zYWN0aW9uKHRva2VuOiBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Db21taXRUcmFuc2FjdGlvbih0b2tlbjogQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJvbGxiYWNrVHJhbnNhY3Rpb24odG9rZW46IFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkZlZEF1dGhJbmZvKHRva2VuOiBGZWRBdXRoSW5mb1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRmVhdHVyZUV4dEFjayh0b2tlbjogRmVhdHVyZUV4dEFja1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uTG9naW5BY2sodG9rZW46IExvZ2luQWNrVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Db2xNZXRhZGF0YSh0b2tlbjogQ29sTWV0YWRhdGFUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbk9yZGVyKHRva2VuOiBPcmRlclRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUm93KHRva2VuOiBSb3dUb2tlbiB8IE5CQ1Jvd1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUmV0dXJuU3RhdHVzKHRva2VuOiBSZXR1cm5TdGF0dXNUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJldHVyblZhbHVlKHRva2VuOiBSZXR1cm5WYWx1ZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRG9uZVByb2ModG9rZW46IERvbmVQcm9jVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Eb25lSW5Qcm9jKHRva2VuOiBEb25lSW5Qcm9jVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25EYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXIodG9rZW46IERhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgdG9rZW5zIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIHRvIHRoZSBpbml0aWFsIFNRTCBCYXRjaCByZXF1ZXN0XG4gKiB0aGF0IHNldHMgdXAgZGlmZmVyZW50IGNvbm5lY3Rpb24gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbml0aWFsU3FsVG9rZW5IYW5kbGVyIGV4dGVuZHMgVG9rZW5IYW5kbGVyIHtcbiAgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDb25uZWN0aW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gIH1cblxuICBvbkluZm9NZXNzYWdlKHRva2VuOiBJbmZvTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2luZm9NZXNzYWdlJywgdG9rZW4pO1xuICB9XG5cbiAgb25FcnJvck1lc3NhZ2UodG9rZW46IEVycm9yTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yTWVzc2FnZScsIHRva2VuKTtcbiAgfVxuXG4gIG9uRGF0YWJhc2VDaGFuZ2UodG9rZW46IERhdGFiYXNlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZGF0YWJhc2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKHRva2VuOiBMYW5ndWFnZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2xhbmd1YWdlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25DaGFyc2V0Q2hhbmdlKHRva2VuOiBDaGFyc2V0RW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnY2hhcnNldENoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uU3FsQ29sbGF0aW9uQ2hhbmdlKHRva2VuOiBDb2xsYXRpb25DaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5kYXRhYmFzZUNvbGxhdGlvbiA9IHRva2VuLm5ld1ZhbHVlO1xuICB9XG5cbiAgb25QYWNrZXRTaXplQ2hhbmdlKHRva2VuOiBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24ubWVzc2FnZUlvLnBhY2tldFNpemUodG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25CZWdpblRyYW5zYWN0aW9uKHRva2VuOiBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5wdXNoKHRva2VuLm5ld1ZhbHVlKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IHRydWU7XG4gIH1cblxuICBvbkNvbW1pdFRyYW5zYWN0aW9uKHRva2VuOiBDb21taXRUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID0gMTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICB9XG5cbiAgb25Sb2xsYmFja1RyYW5zYWN0aW9uKHRva2VuOiBSb2xsYmFja1RyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGggPSAxO1xuICAgIC8vIEFuIG91dGVybW9zdCB0cmFuc2FjdGlvbiB3YXMgcm9sbGVkIGJhY2suIFJlc2V0IHRoZSB0cmFuc2FjdGlvbiBjb3VudGVyXG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgncm9sbGJhY2tUcmFuc2FjdGlvbicpO1xuICB9XG5cbiAgb25Db2xNZXRhZGF0YSh0b2tlbjogQ29sTWV0YWRhdGFUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIlJlY2VpdmVkICdjb2x1bW5NZXRhZGF0YScgd2hlbiBubyBzcWxSZXF1ZXN0IGlzIGluIHByb2dyZXNzXCIpKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgfVxuXG4gIG9uT3JkZXIodG9rZW46IE9yZGVyVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXCJSZWNlaXZlZCAnb3JkZXInIHdoZW4gbm8gc3FsUmVxdWVzdCBpcyBpbiBwcm9ncmVzc1wiKSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cblxuICBvblJvdyh0b2tlbjogUm93VG9rZW4gfCBOQkNSb3dUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIlJlY2VpdmVkICdyb3cnIHdoZW4gbm8gc3FsUmVxdWVzdCBpcyBpbiBwcm9ncmVzc1wiKSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cblxuICBvblJldHVyblN0YXR1cyh0b2tlbjogUmV0dXJuU3RhdHVzVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvblJldHVyblZhbHVlKHRva2VuOiBSZXR1cm5WYWx1ZVRva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25Eb25lUHJvYyh0b2tlbjogRG9uZVByb2NUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uRG9uZUluUHJvYyh0b2tlbjogRG9uZUluUHJvY1Rva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvblJlc2V0Q29ubmVjdGlvbih0b2tlbjogUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgncmVzZXRDb25uZWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIHRva2VucyByZWNlaXZlZCBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSB0byBhIExvZ2luNyBtZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTG9naW43VG9rZW5IYW5kbGVyIGV4dGVuZHMgVG9rZW5IYW5kbGVyIHtcbiAgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcblxuICBmZWRBdXRoSW5mb1Rva2VuOiBGZWRBdXRoSW5mb1Rva2VuIHwgdW5kZWZpbmVkO1xuICByb3V0aW5nRGF0YTogeyBzZXJ2ZXI6IHN0cmluZywgcG9ydDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cbiAgbG9naW5BY2tSZWNlaXZlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgfVxuXG4gIG9uSW5mb01lc3NhZ2UodG9rZW46IEluZm9NZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnaW5mb01lc3NhZ2UnLCB0b2tlbik7XG4gIH1cblxuICBvbkVycm9yTWVzc2FnZSh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3JNZXNzYWdlJywgdG9rZW4pO1xuXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKHRva2VuLm1lc3NhZ2UsICdFTE9HSU4nKTtcblxuICAgIGNvbnN0IGlzTG9naW5FcnJvclRyYW5zaWVudCA9IHRoaXMuY29ubmVjdGlvbi50cmFuc2llbnRFcnJvckxvb2t1cC5pc1RyYW5zaWVudEVycm9yKHRva2VuLm51bWJlcik7XG4gICAgaWYgKGlzTG9naW5FcnJvclRyYW5zaWVudCAmJiB0aGlzLmNvbm5lY3Rpb24uY3VyVHJhbnNpZW50UmV0cnlDb3VudCAhPT0gdGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycykge1xuICAgICAgZXJyb3IuaXNUcmFuc2llbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbi5sb2dpbkVycm9yID0gZXJyb3I7XG4gIH1cblxuICBvblNTUEkodG9rZW46IFNTUElUb2tlbikge1xuICAgIGlmICh0b2tlbi5udGxtcGFja2V0KSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24ubnRsbXBhY2tldCA9IHRva2VuLm50bG1wYWNrZXQ7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24ubnRsbXBhY2tldEJ1ZmZlciA9IHRva2VuLm50bG1wYWNrZXRCdWZmZXI7XG4gICAgfVxuICB9XG5cbiAgb25EYXRhYmFzZUNoYW5nZSh0b2tlbjogRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdkYXRhYmFzZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uTGFuZ3VhZ2VDaGFuZ2UodG9rZW46IExhbmd1YWdlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnbGFuZ3VhZ2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkNoYXJzZXRDaGFuZ2UodG9rZW46IENoYXJzZXRFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdjaGFyc2V0Q2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25TcWxDb2xsYXRpb25DaGFuZ2UodG9rZW46IENvbGxhdGlvbkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmRhdGFiYXNlQ29sbGF0aW9uID0gdG9rZW4ubmV3VmFsdWU7XG4gIH1cblxuICBvbkZlZEF1dGhJbmZvKHRva2VuOiBGZWRBdXRoSW5mb1Rva2VuKSB7XG4gICAgdGhpcy5mZWRBdXRoSW5mb1Rva2VuID0gdG9rZW47XG4gIH1cblxuICBvbkZlYXR1cmVFeHRBY2sodG9rZW46IEZlYXR1cmVFeHRBY2tUb2tlbikge1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRpb24gfSA9IHRoaXMuY29ubmVjdGlvbi5jb25maWc7XG5cbiAgICBpZiAoYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCcpIHtcbiAgICAgIGlmICh0b2tlbi5mZWRBdXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdEaWQgbm90IHJlY2VpdmUgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiBhY2tub3dsZWRnZW1lbnQnKTtcbiAgICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKGBBY3RpdmUgRGlyZWN0b3J5IGF1dGhlbnRpY2F0aW9uIGFja25vd2xlZGdtZW50IGZvciAke2F1dGhlbnRpY2F0aW9uLnR5cGV9IGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBpbmNsdWRlcyBleHRyYSBkYXRhYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbi5mZWRBdXRoID09PSB1bmRlZmluZWQgJiYgdG9rZW4udXRmOFN1cHBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdSZWNlaXZlZCBhY2tub3dsZWRnZW1lbnQgZm9yIHVua25vd24gZmVhdHVyZScpO1xuICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aCkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdEaWQgbm90IHJlcXVlc3QgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiwgYnV0IHJlY2VpdmVkIHRoZSBhY2tub3dsZWRnbWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIG9uTG9naW5BY2sodG9rZW46IExvZ2luQWNrVG9rZW4pIHtcbiAgICBpZiAoIXRva2VuLnRkc1ZlcnNpb24pIHtcbiAgICAgIC8vIHVuc3VwcG9ydGVkIFREUyB2ZXJzaW9uXG4gICAgICB0aGlzLmNvbm5lY3Rpb24ubG9naW5FcnJvciA9IG5ldyBDb25uZWN0aW9uRXJyb3IoJ1NlcnZlciByZXNwb25kZWQgd2l0aCB1bmtub3duIFREUyB2ZXJzaW9uLicsICdFVERTJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlbi5pbnRlcmZhY2UpIHtcbiAgICAgIC8vIHVuc3VwcG9ydGVkIGludGVyZmFjZVxuICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggdW5zdXBwb3J0ZWQgaW50ZXJmYWNlLicsICdFSU5URVJGQUNFTk9UU1VQUCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVzZSBuZWdvdGlhdGVkIHZlcnNpb25cbiAgICB0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA9IHRva2VuLnRkc1ZlcnNpb247XG5cbiAgICB0aGlzLmxvZ2luQWNrUmVjZWl2ZWQgPSB0cnVlO1xuICB9XG5cbiAgb25Sb3V0aW5nQ2hhbmdlKHRva2VuOiBSb3V0aW5nRW52Q2hhbmdlVG9rZW4pIHtcbiAgICAvLyBSZW1vdmVzIGluc3RhbmNlIG5hbWUgYXR0YWNoZWQgdG8gdGhlIHJlZGlyZWN0IHVybC4gRS5nLiwgcmVkaXJlY3QuZGIubmV0XFxpbnN0YW5jZTEgLS0+IHJlZGlyZWN0LmRiLm5ldFxuICAgIGNvbnN0IFsgc2VydmVyIF0gPSB0b2tlbi5uZXdWYWx1ZS5zZXJ2ZXIuc3BsaXQoJ1xcXFwnKTtcblxuICAgIHRoaXMucm91dGluZ0RhdGEgPSB7XG4gICAgICBzZXJ2ZXIsIHBvcnQ6IHRva2VuLm5ld1ZhbHVlLnBvcnRcbiAgICB9O1xuICB9XG5cbiAgb25Eb25lSW5Qcm9jKHRva2VuOiBEb25lSW5Qcm9jVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvbkRvbmUodG9rZW46IERvbmVUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uUGFja2V0U2l6ZUNoYW5nZSh0b2tlbjogUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLm1lc3NhZ2VJby5wYWNrZXRTaXplKHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyKHRva2VuOiBEYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXJFbnZDaGFuZ2VUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgdG9rZW5zIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIHRvIGEgUlBDIFJlcXVlc3QsXG4gKiBhIFNRTCBCYXRjaCBSZXF1ZXN0LCBhIEJ1bGsgTG9hZCBCQ1AgUmVxdWVzdCBvciBhIFRyYW5zYWN0aW9uIE1hbmFnZXIgUmVxdWVzdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVlc3RUb2tlbkhhbmRsZXIgZXh0ZW5kcyBUb2tlbkhhbmRsZXIge1xuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uO1xuICByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG4gIGVycm9yczogUmVxdWVzdEVycm9yW107XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgcmVxdWVzdDogUmVxdWVzdCB8IEJ1bGtMb2FkKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICB9XG5cbiAgb25JbmZvTWVzc2FnZSh0b2tlbjogSW5mb01lc3NhZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdpbmZvTWVzc2FnZScsIHRva2VuKTtcbiAgfVxuXG4gIG9uRXJyb3JNZXNzYWdlKHRva2VuOiBFcnJvck1lc3NhZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvck1lc3NhZ2UnLCB0b2tlbik7XG5cbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKHRva2VuLm1lc3NhZ2UsICdFUkVRVUVTVCcpO1xuXG4gICAgICBlcnJvci5udW1iZXIgPSB0b2tlbi5udW1iZXI7XG4gICAgICBlcnJvci5zdGF0ZSA9IHRva2VuLnN0YXRlO1xuICAgICAgZXJyb3IuY2xhc3MgPSB0b2tlbi5jbGFzcztcbiAgICAgIGVycm9yLnNlcnZlck5hbWUgPSB0b2tlbi5zZXJ2ZXJOYW1lO1xuICAgICAgZXJyb3IucHJvY05hbWUgPSB0b2tlbi5wcm9jTmFtZTtcbiAgICAgIGVycm9yLmxpbmVOdW1iZXIgPSB0b2tlbi5saW5lTnVtYmVyO1xuICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgICB0aGlzLnJlcXVlc3QuZXJyb3IgPSBlcnJvcjtcbiAgICAgIGlmICh0aGlzLnJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVycm9yID0gbmV3IEFnZ3JlZ2F0ZUVycm9yKHRoaXMuZXJyb3JzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRhdGFiYXNlQ2hhbmdlKHRva2VuOiBEYXRhYmFzZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2RhdGFiYXNlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25MYW5ndWFnZUNoYW5nZSh0b2tlbjogTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdsYW5ndWFnZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQ2hhcnNldENoYW5nZSh0b2tlbjogQ2hhcnNldEVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2NoYXJzZXRDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvblNxbENvbGxhdGlvbkNoYW5nZSh0b2tlbjogQ29sbGF0aW9uQ2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZGF0YWJhc2VDb2xsYXRpb24gPSB0b2tlbi5uZXdWYWx1ZTtcbiAgfVxuXG4gIG9uUGFja2V0U2l6ZUNoYW5nZSh0b2tlbjogUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLm1lc3NhZ2VJby5wYWNrZXRTaXplKHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQmVnaW5UcmFuc2FjdGlvbih0b2tlbjogQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMucHVzaCh0b2tlbi5uZXdWYWx1ZSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSB0cnVlO1xuICB9XG5cbiAgb25Db21taXRUcmFuc2FjdGlvbih0b2tlbjogQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCA9IDE7XG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgfVxuXG4gIG9uUm9sbGJhY2tUcmFuc2FjdGlvbih0b2tlbjogUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID0gMTtcbiAgICAvLyBBbiBvdXRlcm1vc3QgdHJhbnNhY3Rpb24gd2FzIHJvbGxlZCBiYWNrLiBSZXNldCB0aGUgdHJhbnNhY3Rpb24gY291bnRlclxuICAgIHRoaXMuY29ubmVjdGlvbi5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3JvbGxiYWNrVHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIG9uQ29sTWV0YWRhdGEodG9rZW46IENvbE1ldGFkYXRhVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcykge1xuICAgICAgICBjb25zdCBjb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IENvbHVtbk1ldGFkYXRhIH0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW4gPSB0b2tlbi5jb2x1bW5zLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgY29uc3QgY29sID0gdG9rZW4uY29sdW1uc1tqXTtcbiAgICAgICAgICBpZiAoY29sdW1uc1tjb2wuY29sTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgY29sdW1uc1tjb2wuY29sTmFtZV0gPSBjb2w7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2NvbHVtbk1ldGFkYXRhJywgY29sdW1ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnY29sdW1uTWV0YWRhdGEnLCB0b2tlbi5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbk9yZGVyKHRva2VuOiBPcmRlclRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdvcmRlcicsIHRva2VuLm9yZGVyQ29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgb25Sb3codG9rZW46IFJvd1Rva2VuIHwgTkJDUm93VG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbikge1xuICAgICAgICB0aGlzLnJlcXVlc3Qucm93cyEucHVzaCh0b2tlbi5jb2x1bW5zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yc3QhLnB1c2godG9rZW4uY29sdW1ucyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdyb3cnLCB0b2tlbi5jb2x1bW5zKTtcbiAgICB9XG4gIH1cblxuICBvblJldHVyblN0YXR1cyh0b2tlbjogUmV0dXJuU3RhdHVzVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgLy8gS2VlcCB2YWx1ZSBmb3IgcGFzc2luZyBpbiAnZG9uZVByb2MnIGV2ZW50LlxuICAgICAgdGhpcy5jb25uZWN0aW9uLnByb2NSZXR1cm5TdGF0dXNWYWx1ZSA9IHRva2VuLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG9uUmV0dXJuVmFsdWUodG9rZW46IFJldHVyblZhbHVlVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ3JldHVyblZhbHVlJywgdG9rZW4ucGFyYW1OYW1lLCB0b2tlbi52YWx1ZSwgdG9rZW4ubWV0YWRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG9uRG9uZVByb2ModG9rZW46IERvbmVQcm9jVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgaWYgKHRva2VuLnNxbEVycm9yICYmICF0aGlzLnJlcXVlc3QuZXJyb3IpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIERPTkVfRVJST1IgZmxhZ3Mgd2FzIHNldCwgYnV0IGFuIEVSUk9SIHRva2VuIHdhcyBub3Qgc2VudC5cbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcignQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJyZWQuJywgJ1VOS05PV04nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2RvbmVQcm9jJywgdG9rZW4ucm93Q291bnQsIHRva2VuLm1vcmUsIHRoaXMuY29ubmVjdGlvbi5wcm9jUmV0dXJuU3RhdHVzVmFsdWUsIHRoaXMucmVxdWVzdC5yc3QpO1xuXG4gICAgICB0aGlzLmNvbm5lY3Rpb24ucHJvY1JldHVyblN0YXR1c1ZhbHVlID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodG9rZW4ucm93Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcXVlc3Qucm93Q291bnQhICs9IHRva2VuLnJvd0NvdW50O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJzdCA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRG9uZUluUHJvYyh0b2tlbjogRG9uZUluUHJvY1Rva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdkb25lSW5Qcm9jJywgdG9rZW4ucm93Q291bnQsIHRva2VuLm1vcmUsIHRoaXMucmVxdWVzdC5yc3QpO1xuXG4gICAgICBpZiAodG9rZW4ucm93Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcXVlc3Qucm93Q291bnQhICs9IHRva2VuLnJvd0NvdW50O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJzdCA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIGlmICh0b2tlbi5zcWxFcnJvciAmJiAhdGhpcy5yZXF1ZXN0LmVycm9yKSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBET05FX0VSUk9SIGZsYWdzIHdhcyBzZXQsIGJ1dCBhbiBFUlJPUiB0b2tlbiB3YXMgbm90IHNlbnQuXG4gICAgICAgIHRoaXMucmVxdWVzdC5lcnJvciA9IG5ldyBSZXF1ZXN0RXJyb3IoJ0FuIHVua25vd24gZXJyb3IgaGFzIG9jY3VycmVkLicsICdVTktOT1dOJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdkb25lJywgdG9rZW4ucm93Q291bnQsIHRva2VuLm1vcmUsIHRoaXMucmVxdWVzdC5yc3QpO1xuXG4gICAgICBpZiAodG9rZW4ucm93Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcXVlc3Qucm93Q291bnQhICs9IHRva2VuLnJvd0NvdW50O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJzdCA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUmVzZXRDb25uZWN0aW9uKHRva2VuOiBSZXNldENvbm5lY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdyZXNldENvbm5lY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgdGhlIGF0dGVudGlvbiBhY2tub3dsZWRnZW1lbnQgbWVzc2FnZS5cbiAqXG4gKiBUaGlzIG1lc3NhZ2Ugb25seSBjb250YWlucyBhIGBET05FYCB0b2tlbiB0aGF0IGFja25vd2xlZGdlc1xuICogdGhhdCB0aGUgYXR0ZW50aW9uIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdHRlbnRpb25Ub2tlbkhhbmRsZXIgZXh0ZW5kcyBUb2tlbkhhbmRsZXIge1xuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uO1xuICByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBhbiBhdHRlbnRpb24gYWNrbm93bGVkZ2VtZW50IHdhcyByZWNlaXZlZC5cbiAgICovXG4gIGF0dGVudGlvblJlY2VpdmVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHJlcXVlc3Q6IFJlcXVlc3QgfCBCdWxrTG9hZCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG5cbiAgICB0aGlzLmF0dGVudGlvblJlY2VpdmVkID0gZmFsc2U7XG4gIH1cblxuICBvbkRvbmUodG9rZW46IERvbmVUb2tlbikge1xuICAgIGlmICh0b2tlbi5hdHRlbnRpb24pIHtcbiAgICAgIHRoaXMuYXR0ZW50aW9uUmVjZWl2ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7O0FBaUNBOzs7O0FBRU8sTUFBTUEsb0JBQU4sU0FBbUNDLEtBQW5DLENBQXlDO0VBQzlDQyxXQUFXLENBQUNDLE9BQUQsRUFBd0JDLEtBQXhCLEVBQXNDO0lBQy9DLE1BQU0sdUJBQXVCQSxLQUFLLENBQUNDLElBQTdCLEdBQW9DLFFBQXBDLEdBQStDRixPQUFPLENBQUNELFdBQVIsQ0FBb0JHLElBQW5FLEdBQTBFLEdBQWhGO0VBQ0Q7O0FBSDZDOzs7O0FBTXpDLE1BQU1DLFlBQU4sQ0FBbUI7RUFDeEJDLGFBQWEsQ0FBQ0gsS0FBRCxFQUEwQjtJQUNyQyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURJLGNBQWMsQ0FBQ0osS0FBRCxFQUEyQjtJQUN2QyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURLLE1BQU0sQ0FBQ0wsS0FBRCxFQUFtQjtJQUN2QixNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURNLGdCQUFnQixDQUFDTixLQUFELEVBQWdDO0lBQzlDLE1BQU0sSUFBSUosb0JBQUosQ0FBeUIsSUFBekIsRUFBK0JJLEtBQS9CLENBQU47RUFDRDs7RUFFRE8s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
|
|
455
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVxdWVzdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2Vycm9ycyIsIl9lc0FnZ3JlZ2F0ZUVycm9yIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJVbmV4cGVjdGVkVG9rZW5FcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJoYW5kbGVyIiwidG9rZW4iLCJuYW1lIiwiZXhwb3J0cyIsIlRva2VuSGFuZGxlciIsIm9uSW5mb01lc3NhZ2UiLCJvbkVycm9yTWVzc2FnZSIsIm9uU1NQSSIsIm9uRGF0YWJhc2VDaGFuZ2UiLCJvbkxhbmd1YWdlQ2hhbmdlIiwib25DaGFyc2V0Q2hhbmdlIiwib25TcWxDb2xsYXRpb25DaGFuZ2UiLCJvblJvdXRpbmdDaGFuZ2UiLCJvblBhY2tldFNpemVDaGFuZ2UiLCJvblJlc2V0Q29ubmVjdGlvbiIsIm9uQmVnaW5UcmFuc2FjdGlvbiIsIm9uQ29tbWl0VHJhbnNhY3Rpb24iLCJvblJvbGxiYWNrVHJhbnNhY3Rpb24iLCJvbkZlZEF1dGhJbmZvIiwib25GZWF0dXJlRXh0QWNrIiwib25Mb2dpbkFjayIsIm9uQ29sTWV0YWRhdGEiLCJvbk9yZGVyIiwib25Sb3ciLCJvblJldHVyblN0YXR1cyIsIm9uUmV0dXJuVmFsdWUiLCJvbkRvbmVQcm9jIiwib25Eb25lSW5Qcm9jIiwib25Eb25lIiwib25EYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXIiLCJJbml0aWFsU3FsVG9rZW5IYW5kbGVyIiwiY29ubmVjdGlvbiIsImVtaXQiLCJuZXdWYWx1ZSIsImRhdGFiYXNlQ29sbGF0aW9uIiwibWVzc2FnZUlvIiwicGFja2V0U2l6ZSIsInRyYW5zYWN0aW9uRGVzY3JpcHRvcnMiLCJwdXNoIiwiaW5UcmFuc2FjdGlvbiIsImxlbmd0aCIsImNsb3NlIiwiTG9naW43VG9rZW5IYW5kbGVyIiwiZmVkQXV0aEluZm9Ub2tlbiIsInJvdXRpbmdEYXRhIiwibG9naW5BY2tSZWNlaXZlZCIsImVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwibWVzc2FnZSIsImlzTG9naW5FcnJvclRyYW5zaWVudCIsInRyYW5zaWVudEVycm9yTG9va3VwIiwiaXNUcmFuc2llbnRFcnJvciIsIm51bWJlciIsImN1clRyYW5zaWVudFJldHJ5Q291bnQiLCJjb25maWciLCJvcHRpb25zIiwibWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzIiwiaXNUcmFuc2llbnQiLCJsb2dpbkVycm9yIiwibnRsbXBhY2tldCIsIm50bG1wYWNrZXRCdWZmZXIiLCJhdXRoZW50aWNhdGlvbiIsInR5cGUiLCJmZWRBdXRoIiwidW5kZWZpbmVkIiwidXRmOFN1cHBvcnQiLCJ0ZHNWZXJzaW9uIiwiaW50ZXJmYWNlIiwic2VydmVyIiwic3BsaXQiLCJwb3J0IiwiUmVxdWVzdFRva2VuSGFuZGxlciIsInJlcXVlc3QiLCJlcnJvcnMiLCJjYW5jZWxlZCIsIlJlcXVlc3RFcnJvciIsInN0YXRlIiwiY2xhc3MiLCJzZXJ2ZXJOYW1lIiwicHJvY05hbWUiLCJsaW5lTnVtYmVyIiwiUmVxdWVzdCIsIkFnZ3JlZ2F0ZUVycm9yIiwidXNlQ29sdW1uTmFtZXMiLCJjb2x1bW5zIiwiT2JqZWN0IiwiY3JlYXRlIiwiaiIsImxlbiIsImNvbCIsImNvbE5hbWUiLCJvcmRlckNvbHVtbnMiLCJyb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiIsInJvd3MiLCJyb3dDb2xsZWN0aW9uT25Eb25lIiwicnN0IiwicHJvY1JldHVyblN0YXR1c1ZhbHVlIiwidmFsdWUiLCJwYXJhbU5hbWUiLCJtZXRhZGF0YSIsInNxbEVycm9yIiwicm93Q291bnQiLCJtb3JlIiwiQXR0ZW50aW9uVG9rZW5IYW5kbGVyIiwiYXR0ZW50aW9uUmVjZWl2ZWQiLCJhdHRlbnRpb24iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vaGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29ubmVjdGlvbiBmcm9tICcuLi9jb25uZWN0aW9uJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkVycm9yLCBSZXF1ZXN0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGEgfSBmcm9tICcuL2NvbG1ldGFkYXRhLXRva2VuLXBhcnNlcic7XG5pbXBvcnQge1xuICBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIENoYXJzZXRFbnZDaGFuZ2VUb2tlbixcbiAgQ29sbGF0aW9uQ2hhbmdlVG9rZW4sXG4gIENvbE1ldGFkYXRhVG9rZW4sXG4gIENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIERhdGFiYXNlRW52Q2hhbmdlVG9rZW4sXG4gIERhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuLFxuICBEb25lSW5Qcm9jVG9rZW4sXG4gIERvbmVQcm9jVG9rZW4sXG4gIERvbmVUb2tlbixcbiAgRXJyb3JNZXNzYWdlVG9rZW4sXG4gIEZlYXR1cmVFeHRBY2tUb2tlbixcbiAgRmVkQXV0aEluZm9Ub2tlbixcbiAgSW5mb01lc3NhZ2VUb2tlbixcbiAgTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbixcbiAgTG9naW5BY2tUb2tlbixcbiAgTkJDUm93VG9rZW4sXG4gIE9yZGVyVG9rZW4sXG4gIFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbixcbiAgUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIFJldHVyblN0YXR1c1Rva2VuLFxuICBSZXR1cm5WYWx1ZVRva2VuLFxuICBSb2xsYmFja1RyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIFJvdXRpbmdFbnZDaGFuZ2VUb2tlbixcbiAgUm93VG9rZW4sXG4gIFNTUElUb2tlbixcbiAgVG9rZW5cbn0gZnJvbSAnLi90b2tlbic7XG5pbXBvcnQgQnVsa0xvYWQgZnJvbSAnLi4vYnVsay1sb2FkJztcblxuaW1wb3J0IEFnZ3JlZ2F0ZUVycm9yIGZyb20gJ2VzLWFnZ3JlZ2F0ZS1lcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBVbmV4cGVjdGVkVG9rZW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoaGFuZGxlcjogVG9rZW5IYW5kbGVyLCB0b2tlbjogVG9rZW4pIHtcbiAgICBzdXBlcignVW5leHBlY3RlZCB0b2tlbiBgJyArIHRva2VuLm5hbWUgKyAnYCBpbiBgJyArIGhhbmRsZXIuY29uc3RydWN0b3IubmFtZSArICdgJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRva2VuSGFuZGxlciB7XG4gIG9uSW5mb01lc3NhZ2UodG9rZW46IEluZm9NZXNzYWdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25FcnJvck1lc3NhZ2UodG9rZW46IEVycm9yTWVzc2FnZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uU1NQSSh0b2tlbjogU1NQSVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRGF0YWJhc2VDaGFuZ2UodG9rZW46IERhdGFiYXNlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25MYW5ndWFnZUNoYW5nZSh0b2tlbjogTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkNoYXJzZXRDaGFuZ2UodG9rZW46IENoYXJzZXRFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblNxbENvbGxhdGlvbkNoYW5nZSh0b2tlbjogQ29sbGF0aW9uQ2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Sb3V0aW5nQ2hhbmdlKHRva2VuOiBSb3V0aW5nRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25QYWNrZXRTaXplQ2hhbmdlKHRva2VuOiBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25SZXNldENvbm5lY3Rpb24odG9rZW46IFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uQmVnaW5UcmFuc2FjdGlvbih0b2tlbjogQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uQ29tbWl0VHJhbnNhY3Rpb24odG9rZW46IENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Sb2xsYmFja1RyYW5zYWN0aW9uKHRva2VuOiBSb2xsYmFja1RyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25GZWRBdXRoSW5mbyh0b2tlbjogRmVkQXV0aEluZm9Ub2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkZlYXR1cmVFeHRBY2sodG9rZW46IEZlYXR1cmVFeHRBY2tUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkxvZ2luQWNrKHRva2VuOiBMb2dpbkFja1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uQ29sTWV0YWRhdGEodG9rZW46IENvbE1ldGFkYXRhVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25PcmRlcih0b2tlbjogT3JkZXJUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJvdyh0b2tlbjogUm93VG9rZW4gfCBOQkNSb3dUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJldHVyblN0YXR1cyh0b2tlbjogUmV0dXJuU3RhdHVzVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25SZXR1cm5WYWx1ZSh0b2tlbjogUmV0dXJuVmFsdWVUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkRvbmVQcm9jKHRva2VuOiBEb25lUHJvY1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRG9uZUluUHJvYyh0b2tlbjogRG9uZUluUHJvY1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyKHRva2VuOiBEYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXJFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIHRva2VucyByZWNlaXZlZCBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSB0byB0aGUgaW5pdGlhbCBTUUwgQmF0Y2ggcmVxdWVzdFxuICogdGhhdCBzZXRzIHVwIGRpZmZlcmVudCBjb25uZWN0aW9uIHNldHRpbmdzLlxuICovXG5leHBvcnQgY2xhc3MgSW5pdGlhbFNxbFRva2VuSGFuZGxlciBleHRlbmRzIFRva2VuSGFuZGxlciB7XG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICB9XG5cbiAgb25JbmZvTWVzc2FnZSh0b2tlbjogSW5mb01lc3NhZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdpbmZvTWVzc2FnZScsIHRva2VuKTtcbiAgfVxuXG4gIG9uRXJyb3JNZXNzYWdlKHRva2VuOiBFcnJvck1lc3NhZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvck1lc3NhZ2UnLCB0b2tlbik7XG4gIH1cblxuICBvbkRhdGFiYXNlQ2hhbmdlKHRva2VuOiBEYXRhYmFzZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2RhdGFiYXNlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25MYW5ndWFnZUNoYW5nZSh0b2tlbjogTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdsYW5ndWFnZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQ2hhcnNldENoYW5nZSh0b2tlbjogQ2hhcnNldEVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2NoYXJzZXRDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvblNxbENvbGxhdGlvbkNoYW5nZSh0b2tlbjogQ29sbGF0aW9uQ2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZGF0YWJhc2VDb2xsYXRpb24gPSB0b2tlbi5uZXdWYWx1ZTtcbiAgfVxuXG4gIG9uUGFja2V0U2l6ZUNoYW5nZSh0b2tlbjogUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLm1lc3NhZ2VJby5wYWNrZXRTaXplKHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQmVnaW5UcmFuc2FjdGlvbih0b2tlbjogQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMucHVzaCh0b2tlbi5uZXdWYWx1ZSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSB0cnVlO1xuICB9XG5cbiAgb25Db21taXRUcmFuc2FjdGlvbih0b2tlbjogQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCA9IDE7XG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgfVxuXG4gIG9uUm9sbGJhY2tUcmFuc2FjdGlvbih0b2tlbjogUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID0gMTtcbiAgICAvLyBBbiBvdXRlcm1vc3QgdHJhbnNhY3Rpb24gd2FzIHJvbGxlZCBiYWNrLiBSZXNldCB0aGUgdHJhbnNhY3Rpb24gY291bnRlclxuICAgIHRoaXMuY29ubmVjdGlvbi5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3JvbGxiYWNrVHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIG9uQ29sTWV0YWRhdGEodG9rZW46IENvbE1ldGFkYXRhVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXCJSZWNlaXZlZCAnY29sdW1uTWV0YWRhdGEnIHdoZW4gbm8gc3FsUmVxdWVzdCBpcyBpbiBwcm9ncmVzc1wiKSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cblxuICBvbk9yZGVyKHRva2VuOiBPcmRlclRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKFwiUmVjZWl2ZWQgJ29yZGVyJyB3aGVuIG5vIHNxbFJlcXVlc3QgaXMgaW4gcHJvZ3Jlc3NcIikpO1xuICAgIHRoaXMuY29ubmVjdGlvbi5jbG9zZSgpO1xuICB9XG5cbiAgb25Sb3codG9rZW46IFJvd1Rva2VuIHwgTkJDUm93VG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXCJSZWNlaXZlZCAncm93JyB3aGVuIG5vIHNxbFJlcXVlc3QgaXMgaW4gcHJvZ3Jlc3NcIikpO1xuICAgIHRoaXMuY29ubmVjdGlvbi5jbG9zZSgpO1xuICB9XG5cbiAgb25SZXR1cm5TdGF0dXModG9rZW46IFJldHVyblN0YXR1c1Rva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25SZXR1cm5WYWx1ZSh0b2tlbjogUmV0dXJuVmFsdWVUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uRG9uZVByb2ModG9rZW46IERvbmVQcm9jVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvbkRvbmVJblByb2ModG9rZW46IERvbmVJblByb2NUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25SZXNldENvbm5lY3Rpb24odG9rZW46IFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3Jlc2V0Q29ubmVjdGlvbicpO1xuICB9XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciB0b2tlbnMgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UgdG8gYSBMb2dpbjcgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2luN1Rva2VuSGFuZGxlciBleHRlbmRzIFRva2VuSGFuZGxlciB7XG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb247XG5cbiAgZmVkQXV0aEluZm9Ub2tlbjogRmVkQXV0aEluZm9Ub2tlbiB8IHVuZGVmaW5lZDtcbiAgcm91dGluZ0RhdGE6IHsgc2VydmVyOiBzdHJpbmcsIHBvcnQ6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuXG4gIGxvZ2luQWNrUmVjZWl2ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDb25uZWN0aW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gIH1cblxuICBvbkluZm9NZXNzYWdlKHRva2VuOiBJbmZvTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2luZm9NZXNzYWdlJywgdG9rZW4pO1xuICB9XG5cbiAgb25FcnJvck1lc3NhZ2UodG9rZW46IEVycm9yTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yTWVzc2FnZScsIHRva2VuKTtcblxuICAgIGNvbnN0IGVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcih0b2tlbi5tZXNzYWdlLCAnRUxPR0lOJyk7XG5cbiAgICBjb25zdCBpc0xvZ2luRXJyb3JUcmFuc2llbnQgPSB0aGlzLmNvbm5lY3Rpb24udHJhbnNpZW50RXJyb3JMb29rdXAuaXNUcmFuc2llbnRFcnJvcih0b2tlbi5udW1iZXIpO1xuICAgIGlmIChpc0xvZ2luRXJyb3JUcmFuc2llbnQgJiYgdGhpcy5jb25uZWN0aW9uLmN1clRyYW5zaWVudFJldHJ5Q291bnQgIT09IHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMpIHtcbiAgICAgIGVycm9yLmlzVHJhbnNpZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24ubG9naW5FcnJvciA9IGVycm9yO1xuICB9XG5cbiAgb25TU1BJKHRva2VuOiBTU1BJVG9rZW4pIHtcbiAgICBpZiAodG9rZW4ubnRsbXBhY2tldCkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uLm50bG1wYWNrZXQgPSB0b2tlbi5udGxtcGFja2V0O1xuICAgICAgdGhpcy5jb25uZWN0aW9uLm50bG1wYWNrZXRCdWZmZXIgPSB0b2tlbi5udGxtcGFja2V0QnVmZmVyO1xuICAgIH1cbiAgfVxuXG4gIG9uRGF0YWJhc2VDaGFuZ2UodG9rZW46IERhdGFiYXNlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZGF0YWJhc2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKHRva2VuOiBMYW5ndWFnZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2xhbmd1YWdlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25DaGFyc2V0Q2hhbmdlKHRva2VuOiBDaGFyc2V0RW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnY2hhcnNldENoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uU3FsQ29sbGF0aW9uQ2hhbmdlKHRva2VuOiBDb2xsYXRpb25DaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5kYXRhYmFzZUNvbGxhdGlvbiA9IHRva2VuLm5ld1ZhbHVlO1xuICB9XG5cbiAgb25GZWRBdXRoSW5mbyh0b2tlbjogRmVkQXV0aEluZm9Ub2tlbikge1xuICAgIHRoaXMuZmVkQXV0aEluZm9Ub2tlbiA9IHRva2VuO1xuICB9XG5cbiAgb25GZWF0dXJlRXh0QWNrKHRva2VuOiBGZWF0dXJlRXh0QWNrVG9rZW4pIHtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0aW9uIH0gPSB0aGlzLmNvbm5lY3Rpb24uY29uZmlnO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnKSB7XG4gICAgICBpZiAodG9rZW4uZmVkQXV0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcignRGlkIG5vdCByZWNlaXZlIEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24gYWNrbm93bGVkZ2VtZW50Jyk7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuLmZlZEF1dGgubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcihgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiBhY2tub3dsZWRnbWVudCBmb3IgJHthdXRoZW50aWNhdGlvbi50eXBlfSBhdXRoZW50aWNhdGlvbiBtZXRob2QgaW5jbHVkZXMgZXh0cmEgZGF0YWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aCA9PT0gdW5kZWZpbmVkICYmIHRva2VuLnV0ZjhTdXBwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcignUmVjZWl2ZWQgYWNrbm93bGVkZ2VtZW50IGZvciB1bmtub3duIGZlYXR1cmUnKTtcbiAgICB9IGVsc2UgaWYgKHRva2VuLmZlZEF1dGgpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcignRGlkIG5vdCByZXF1ZXN0IEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24sIGJ1dCByZWNlaXZlZCB0aGUgYWNrbm93bGVkZ21lbnQnKTtcbiAgICB9XG4gIH1cblxuICBvbkxvZ2luQWNrKHRva2VuOiBMb2dpbkFja1Rva2VuKSB7XG4gICAgaWYgKCF0b2tlbi50ZHNWZXJzaW9uKSB7XG4gICAgICAvLyB1bnN1cHBvcnRlZCBURFMgdmVyc2lvblxuICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggdW5rbm93biBURFMgdmVyc2lvbi4nLCAnRVREUycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdG9rZW4uaW50ZXJmYWNlKSB7XG4gICAgICAvLyB1bnN1cHBvcnRlZCBpbnRlcmZhY2VcbiAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dpbkVycm9yID0gbmV3IENvbm5lY3Rpb25FcnJvcignU2VydmVyIHJlc3BvbmRlZCB3aXRoIHVuc3VwcG9ydGVkIGludGVyZmFjZS4nLCAnRUlOVEVSRkFDRU5PVFNVUFAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB1c2UgbmVnb3RpYXRlZCB2ZXJzaW9uXG4gICAgdGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPSB0b2tlbi50ZHNWZXJzaW9uO1xuXG4gICAgdGhpcy5sb2dpbkFja1JlY2VpdmVkID0gdHJ1ZTtcbiAgfVxuXG4gIG9uUm91dGluZ0NoYW5nZSh0b2tlbjogUm91dGluZ0VudkNoYW5nZVRva2VuKSB7XG4gICAgLy8gUmVtb3ZlcyBpbnN0YW5jZSBuYW1lIGF0dGFjaGVkIHRvIHRoZSByZWRpcmVjdCB1cmwuIEUuZy4sIHJlZGlyZWN0LmRiLm5ldFxcaW5zdGFuY2UxIC0tPiByZWRpcmVjdC5kYi5uZXRcbiAgICBjb25zdCBbIHNlcnZlciBdID0gdG9rZW4ubmV3VmFsdWUuc2VydmVyLnNwbGl0KCdcXFxcJyk7XG5cbiAgICB0aGlzLnJvdXRpbmdEYXRhID0ge1xuICAgICAgc2VydmVyLCBwb3J0OiB0b2tlbi5uZXdWYWx1ZS5wb3J0XG4gICAgfTtcbiAgfVxuXG4gIG9uRG9uZUluUHJvYyh0b2tlbjogRG9uZUluUHJvY1Rva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvblBhY2tldFNpemVDaGFuZ2UodG9rZW46IFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5tZXNzYWdlSW8ucGFja2V0U2l6ZSh0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkRhdGFiYXNlTWlycm9yaW5nUGFydG5lcih0b2tlbjogRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIHRva2VucyByZWNlaXZlZCBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSB0byBhIFJQQyBSZXF1ZXN0LFxuICogYSBTUUwgQmF0Y2ggUmVxdWVzdCwgYSBCdWxrIExvYWQgQkNQIFJlcXVlc3Qgb3IgYSBUcmFuc2FjdGlvbiBNYW5hZ2VyIFJlcXVlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0VG9rZW5IYW5kbGVyIGV4dGVuZHMgVG9rZW5IYW5kbGVyIHtcbiAgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcbiAgcmVxdWVzdDogUmVxdWVzdCB8IEJ1bGtMb2FkO1xuICBlcnJvcnM6IFJlcXVlc3RFcnJvcltdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHJlcXVlc3Q6IFJlcXVlc3QgfCBCdWxrTG9hZCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgfVxuXG4gIG9uSW5mb01lc3NhZ2UodG9rZW46IEluZm9NZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnaW5mb01lc3NhZ2UnLCB0b2tlbik7XG4gIH1cblxuICBvbkVycm9yTWVzc2FnZSh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3JNZXNzYWdlJywgdG9rZW4pO1xuXG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJlcXVlc3RFcnJvcih0b2tlbi5tZXNzYWdlLCAnRVJFUVVFU1QnKTtcblxuICAgICAgZXJyb3IubnVtYmVyID0gdG9rZW4ubnVtYmVyO1xuICAgICAgZXJyb3Iuc3RhdGUgPSB0b2tlbi5zdGF0ZTtcbiAgICAgIGVycm9yLmNsYXNzID0gdG9rZW4uY2xhc3M7XG4gICAgICBlcnJvci5zZXJ2ZXJOYW1lID0gdG9rZW4uc2VydmVyTmFtZTtcbiAgICAgIGVycm9yLnByb2NOYW1lID0gdG9rZW4ucHJvY05hbWU7XG4gICAgICBlcnJvci5saW5lTnVtYmVyID0gdG9rZW4ubGluZU51bWJlcjtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgdGhpcy5yZXF1ZXN0LmVycm9yID0gZXJyb3I7XG4gICAgICBpZiAodGhpcy5yZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCAmJiB0aGlzLmVycm9ycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5lcnJvciA9IG5ldyBBZ2dyZWdhdGVFcnJvcih0aGlzLmVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25EYXRhYmFzZUNoYW5nZSh0b2tlbjogRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdkYXRhYmFzZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uTGFuZ3VhZ2VDaGFuZ2UodG9rZW46IExhbmd1YWdlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnbGFuZ3VhZ2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkNoYXJzZXRDaGFuZ2UodG9rZW46IENoYXJzZXRFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdjaGFyc2V0Q2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25TcWxDb2xsYXRpb25DaGFuZ2UodG9rZW46IENvbGxhdGlvbkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmRhdGFiYXNlQ29sbGF0aW9uID0gdG9rZW4ubmV3VmFsdWU7XG4gIH1cblxuICBvblBhY2tldFNpemVDaGFuZ2UodG9rZW46IFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5tZXNzYWdlSW8ucGFja2V0U2l6ZSh0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkJlZ2luVHJhbnNhY3Rpb24odG9rZW46IEJlZ2luVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLnB1c2godG9rZW4ubmV3VmFsdWUpO1xuICAgIHRoaXMuY29ubmVjdGlvbi5pblRyYW5zYWN0aW9uID0gdHJ1ZTtcbiAgfVxuXG4gIG9uQ29tbWl0VHJhbnNhY3Rpb24odG9rZW46IENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGggPSAxO1xuICAgIHRoaXMuY29ubmVjdGlvbi5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gIH1cblxuICBvblJvbGxiYWNrVHJhbnNhY3Rpb24odG9rZW46IFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCA9IDE7XG4gICAgLy8gQW4gb3V0ZXJtb3N0IHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjay4gUmVzZXQgdGhlIHRyYW5zYWN0aW9uIGNvdW50ZXJcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdyb2xsYmFja1RyYW5zYWN0aW9uJyk7XG4gIH1cblxuICBvbkNvbE1ldGFkYXRhKHRva2VuOiBDb2xNZXRhZGF0YVRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uczogeyBba2V5OiBzdHJpbmddOiBDb2x1bW5NZXRhZGF0YSB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuID0gdG9rZW4uY29sdW1ucy5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGNvbnN0IGNvbCA9IHRva2VuLmNvbHVtbnNbal07XG4gICAgICAgICAgaWYgKGNvbHVtbnNbY29sLmNvbE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbHVtbnNbY29sLmNvbE5hbWVdID0gY29sO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdjb2x1bW5NZXRhZGF0YScsIGNvbHVtbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2NvbHVtbk1ldGFkYXRhJywgdG9rZW4uY29sdW1ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25PcmRlcih0b2tlbjogT3JkZXJUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnb3JkZXInLCB0b2tlbi5vcmRlckNvbHVtbnMpO1xuICAgIH1cbiAgfVxuXG4gIG9uUm93KHRva2VuOiBSb3dUb2tlbiB8IE5CQ1Jvd1Rva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24pIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJvd3MhLnB1c2godG9rZW4uY29sdW1ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QucnN0IS5wdXNoKHRva2VuLmNvbHVtbnMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlcXVlc3QuZW1pdCgncm93JywgdG9rZW4uY29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgb25SZXR1cm5TdGF0dXModG9rZW46IFJldHVyblN0YXR1c1Rva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIC8vIEtlZXAgdmFsdWUgZm9yIHBhc3NpbmcgaW4gJ2RvbmVQcm9jJyBldmVudC5cbiAgICAgIHRoaXMuY29ubmVjdGlvbi5wcm9jUmV0dXJuU3RhdHVzVmFsdWUgPSB0b2tlbi52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBvblJldHVyblZhbHVlKHRva2VuOiBSZXR1cm5WYWx1ZVRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdyZXR1cm5WYWx1ZScsIHRva2VuLnBhcmFtTmFtZSwgdG9rZW4udmFsdWUsIHRva2VuLm1ldGFkYXRhKTtcbiAgICB9XG4gIH1cblxuICBvbkRvbmVQcm9jKHRva2VuOiBEb25lUHJvY1Rva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIGlmICh0b2tlbi5zcWxFcnJvciAmJiAhdGhpcy5yZXF1ZXN0LmVycm9yKSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBET05FX0VSUk9SIGZsYWdzIHdhcyBzZXQsIGJ1dCBhbiBFUlJPUiB0b2tlbiB3YXMgbm90IHNlbnQuXG4gICAgICAgIHRoaXMucmVxdWVzdC5lcnJvciA9IG5ldyBSZXF1ZXN0RXJyb3IoJ0FuIHVua25vd24gZXJyb3IgaGFzIG9jY3VycmVkLicsICdVTktOT1dOJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdkb25lUHJvYycsIHRva2VuLnJvd0NvdW50LCB0b2tlbi5tb3JlLCB0aGlzLmNvbm5lY3Rpb24ucHJvY1JldHVyblN0YXR1c1ZhbHVlLCB0aGlzLnJlcXVlc3QucnN0KTtcblxuICAgICAgdGhpcy5jb25uZWN0aW9uLnByb2NSZXR1cm5TdGF0dXNWYWx1ZSA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHRva2VuLnJvd0NvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJvd0NvdW50ISArPSB0b2tlbi5yb3dDb3VudDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yc3QgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRvbmVJblByb2ModG9rZW46IERvbmVJblByb2NUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnZG9uZUluUHJvYycsIHRva2VuLnJvd0NvdW50LCB0b2tlbi5tb3JlLCB0aGlzLnJlcXVlc3QucnN0KTtcblxuICAgICAgaWYgKHRva2VuLnJvd0NvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJvd0NvdW50ISArPSB0b2tlbi5yb3dDb3VudDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yc3QgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRvbmUodG9rZW46IERvbmVUb2tlbikge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICBpZiAodG9rZW4uc3FsRXJyb3IgJiYgIXRoaXMucmVxdWVzdC5lcnJvcikge1xuICAgICAgICAvLyBjaGVjayBpZiB0aGUgRE9ORV9FUlJPUiBmbGFncyB3YXMgc2V0LCBidXQgYW4gRVJST1IgdG9rZW4gd2FzIG5vdCBzZW50LlxuICAgICAgICB0aGlzLnJlcXVlc3QuZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKCdBbiB1bmtub3duIGVycm9yIGhhcyBvY2N1cnJlZC4nLCAnVU5LTk9XTicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnZG9uZScsIHRva2VuLnJvd0NvdW50LCB0b2tlbi5tb3JlLCB0aGlzLnJlcXVlc3QucnN0KTtcblxuICAgICAgaWYgKHRva2VuLnJvd0NvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJvd0NvdW50ISArPSB0b2tlbi5yb3dDb3VudDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yc3QgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblJlc2V0Q29ubmVjdGlvbih0b2tlbjogUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgncmVzZXRDb25uZWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIHRoZSBhdHRlbnRpb24gYWNrbm93bGVkZ2VtZW50IG1lc3NhZ2UuXG4gKlxuICogVGhpcyBtZXNzYWdlIG9ubHkgY29udGFpbnMgYSBgRE9ORWAgdG9rZW4gdGhhdCBhY2tub3dsZWRnZXNcbiAqIHRoYXQgdGhlIGF0dGVudGlvbiBtZXNzYWdlIHdhcyByZWNlaXZlZCBieSB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgQXR0ZW50aW9uVG9rZW5IYW5kbGVyIGV4dGVuZHMgVG9rZW5IYW5kbGVyIHtcbiAgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcbiAgcmVxdWVzdDogUmVxdWVzdCB8IEJ1bGtMb2FkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgYW4gYXR0ZW50aW9uIGFja25vd2xlZGdlbWVudCB3YXMgcmVjZWl2ZWQuXG4gICAqL1xuICBhdHRlbnRpb25SZWNlaXZlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDb25uZWN0aW9uLCByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuXG4gICAgdGhpcy5hdHRlbnRpb25SZWNlaXZlZCA9IGZhbHNlO1xuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICBpZiAodG9rZW4uYXR0ZW50aW9uKSB7XG4gICAgICB0aGlzLmF0dGVudGlvblJlY2VpdmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsUUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBaUNBLElBQUFFLGlCQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFBZ0QsU0FBQUQsdUJBQUFJLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxLQUFBRSxPQUFBLEVBQUFGLEdBQUE7QUFFekMsTUFBTUcsb0JBQW9CLFNBQVNDLEtBQUssQ0FBQztFQUM5Q0MsV0FBV0EsQ0FBQ0MsT0FBcUIsRUFBRUMsS0FBWSxFQUFFO0lBQy9DLEtBQUssQ0FBQyxvQkFBb0IsR0FBR0EsS0FBSyxDQUFDQyxJQUFJLEdBQUcsUUFBUSxHQUFHRixPQUFPLENBQUNELFdBQVcsQ0FBQ0csSUFBSSxHQUFHLEdBQUcsQ0FBQztFQUN0RjtBQUNGO0FBQUNDLE9BQUEsQ0FBQU4sb0JBQUEsR0FBQUEsb0JBQUE7QUFFTSxNQUFNTyxZQUFZLENBQUM7RUFDeEJDLGFBQWFBLENBQUNKLEtBQXVCLEVBQUU7SUFD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
|