@sumit_yewale/angular 1.1.18 → 1.1.21-fix.1
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/README.md +41 -0
- package/bundles/sumit_yewale-angular.umd.js +623 -73
- package/bundles/sumit_yewale-angular.umd.js.map +1 -1
- package/bundles/sumit_yewale-angular.umd.min.js +1 -1
- package/bundles/sumit_yewale-angular.umd.min.js.map +1 -1
- package/esm2015/lib/csvbox-button.component.js +558 -76
- package/esm2015/public-api.js +1 -2
- package/esm5/lib/csvbox-button.component.js +626 -76
- package/esm5/public-api.js +1 -2
- package/fesm2015/sumit_yewale-angular.js +557 -75
- package/fesm2015/sumit_yewale-angular.js.map +1 -1
- package/fesm5/sumit_yewale-angular.js +625 -75
- package/fesm5/sumit_yewale-angular.js.map +1 -1
- package/lib/csvbox-button.component.d.ts +36 -4
- package/package.json +2 -8
- package/sumit_yewale-angular.metadata.json +1 -1
|
@@ -3,15 +3,133 @@
|
|
|
3
3
|
* Generated from: lib/csvbox-button.component.ts
|
|
4
4
|
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
5
|
*/
|
|
6
|
-
import { Component,
|
|
6
|
+
import { Component, Input, SecurityContext, ChangeDetectorRef, NgZone } from '@angular/core';
|
|
7
7
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
8
8
|
import { insertCSS } from '../utlis/insertCSS';
|
|
9
|
-
import { buildImportUrl, generateUuid, buildInitPayload, classifyStructuredMessage } from '@sumit_yewale/adapter-core';
|
|
9
|
+
import { buildImportUrl, generateUuid, buildInitPayload, createMessageGate, createImportTracker, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';
|
|
10
|
+
// How long we wait for the importer to confirm a file it was sent before giving up on it.
|
|
10
11
|
/** @type {?} */
|
|
11
|
-
var
|
|
12
|
+
var FILE_ACK_TIMEOUT_MS = 8000;
|
|
13
|
+
/**
|
|
14
|
+
* @record
|
|
15
|
+
*/
|
|
16
|
+
function OpenImporterEntry() { }
|
|
17
|
+
if (false) {
|
|
18
|
+
/** @type {?} */
|
|
19
|
+
OpenImporterEntry.prototype.getHolder;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @record
|
|
23
|
+
*/
|
|
24
|
+
function OpenImporters() { }
|
|
25
|
+
if (false) {
|
|
26
|
+
/** @type {?} */
|
|
27
|
+
OpenImporters.prototype.open;
|
|
28
|
+
/** @type {?} */
|
|
29
|
+
OpenImporters.prototype.listeners;
|
|
30
|
+
}
|
|
31
|
+
/** @type {?} */
|
|
32
|
+
var OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';
|
|
33
|
+
/** @type {?} */
|
|
34
|
+
var TOP_Z_INDEX = 2147483647;
|
|
35
|
+
/**
|
|
36
|
+
* @return {?}
|
|
37
|
+
*/
|
|
38
|
+
function openImporters() {
|
|
39
|
+
/** @type {?} */
|
|
40
|
+
var w = (/** @type {?} */ (window));
|
|
41
|
+
if (!w[OPEN_IMPORTERS_KEY])
|
|
42
|
+
w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };
|
|
43
|
+
return w[OPEN_IMPORTERS_KEY];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @param {?} reg
|
|
47
|
+
* @return {?}
|
|
48
|
+
*/
|
|
49
|
+
function restackOpenImporters(reg) {
|
|
50
|
+
reg.open.forEach((/**
|
|
51
|
+
* @param {?} entry
|
|
52
|
+
* @param {?} i
|
|
53
|
+
* @return {?}
|
|
54
|
+
*/
|
|
55
|
+
function (entry, i) {
|
|
56
|
+
/** @type {?} */
|
|
57
|
+
var holder = entry.getHolder();
|
|
58
|
+
if (holder)
|
|
59
|
+
holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @param {?} entry
|
|
64
|
+
* @return {?}
|
|
65
|
+
*/
|
|
66
|
+
function registerOpenImporter(entry) {
|
|
67
|
+
/** @type {?} */
|
|
68
|
+
var reg = openImporters();
|
|
69
|
+
if (reg.open.indexOf(entry) >= 0)
|
|
70
|
+
return;
|
|
71
|
+
reg.open.push(entry);
|
|
72
|
+
restackOpenImporters(reg);
|
|
73
|
+
reg.listeners.slice().forEach((/**
|
|
74
|
+
* @param {?} fn
|
|
75
|
+
* @return {?}
|
|
76
|
+
*/
|
|
77
|
+
function (fn) { return fn(); }));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* @param {?} entry
|
|
81
|
+
* @return {?}
|
|
82
|
+
*/
|
|
83
|
+
function unregisterOpenImporter(entry) {
|
|
84
|
+
/** @type {?} */
|
|
85
|
+
var reg = openImporters();
|
|
86
|
+
/** @type {?} */
|
|
87
|
+
var i = reg.open.indexOf(entry);
|
|
88
|
+
if (i < 0)
|
|
89
|
+
return;
|
|
90
|
+
reg.open.splice(i, 1);
|
|
91
|
+
restackOpenImporters(reg);
|
|
92
|
+
reg.listeners.slice().forEach((/**
|
|
93
|
+
* @param {?} fn
|
|
94
|
+
* @return {?}
|
|
95
|
+
*/
|
|
96
|
+
function (fn) { return fn(); }));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @param {?} entry
|
|
100
|
+
* @return {?}
|
|
101
|
+
*/
|
|
102
|
+
function isBlockedByOpenImporter(entry) {
|
|
103
|
+
/** @type {?} */
|
|
104
|
+
var reg = openImporters();
|
|
105
|
+
return reg.open.length > 0 && reg.open.indexOf(entry) < 0;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* @param {?} fn
|
|
109
|
+
* @return {?}
|
|
110
|
+
*/
|
|
111
|
+
function subscribeOpenImporters(fn) {
|
|
112
|
+
/** @type {?} */
|
|
113
|
+
var reg = openImporters();
|
|
114
|
+
reg.listeners.push(fn);
|
|
115
|
+
return (/**
|
|
116
|
+
* @return {?}
|
|
117
|
+
*/
|
|
118
|
+
function () {
|
|
119
|
+
/** @type {?} */
|
|
120
|
+
var i = reg.listeners.indexOf(fn);
|
|
121
|
+
if (i >= 0)
|
|
122
|
+
reg.listeners.splice(i, 1);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/** @type {?} */
|
|
126
|
+
var appVersion = '1.1.20';
|
|
12
127
|
var CSVBoxButtonComponent = /** @class */ (function () {
|
|
13
|
-
function CSVBoxButtonComponent(sanitizer) {
|
|
128
|
+
function CSVBoxButtonComponent(sanitizer, cdr, zone) {
|
|
129
|
+
var _this = this;
|
|
14
130
|
this.sanitizer = sanitizer;
|
|
131
|
+
this.cdr = cdr;
|
|
132
|
+
this.zone = zone;
|
|
15
133
|
this.isModalShown = false;
|
|
16
134
|
this.licenseKey = null;
|
|
17
135
|
this.uuid = null;
|
|
@@ -24,6 +142,175 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
24
142
|
this.lazy = false;
|
|
25
143
|
this.iframe = null;
|
|
26
144
|
this.disabled = true;
|
|
145
|
+
// True while a different importer on the page is open: the button stays disabled.
|
|
146
|
+
this.blockedByOther = false;
|
|
147
|
+
this.messageGate = createMessageGate();
|
|
148
|
+
this.importTracker = createImportTracker();
|
|
149
|
+
this.registryEntry = { getHolder: (/**
|
|
150
|
+
* @return {?}
|
|
151
|
+
*/
|
|
152
|
+
function () { return _this.holder; }) };
|
|
153
|
+
this.fileSender = createFileSender({
|
|
154
|
+
getIframe: (/**
|
|
155
|
+
* @return {?}
|
|
156
|
+
*/
|
|
157
|
+
function () { return _this.iframe; }),
|
|
158
|
+
getToken: (/**
|
|
159
|
+
* @return {?}
|
|
160
|
+
*/
|
|
161
|
+
function () { return (/** @type {?} */ (_this.uuid)); }),
|
|
162
|
+
getTargetOrigin: (/**
|
|
163
|
+
* @return {?}
|
|
164
|
+
*/
|
|
165
|
+
function () { return (/** @type {?} */ (_this.targetOrigin)); }),
|
|
166
|
+
getBaseDomain: (/**
|
|
167
|
+
* @return {?}
|
|
168
|
+
*/
|
|
169
|
+
function () { return _this.baseDomain; }),
|
|
170
|
+
takeFile: (/**
|
|
171
|
+
* @return {?}
|
|
172
|
+
*/
|
|
173
|
+
function () {
|
|
174
|
+
/** @type {?} */
|
|
175
|
+
var file = _this.pendingFile;
|
|
176
|
+
_this.pendingFile = null;
|
|
177
|
+
return file;
|
|
178
|
+
}),
|
|
179
|
+
onSent: (/**
|
|
180
|
+
* @return {?}
|
|
181
|
+
*/
|
|
182
|
+
function () { return _this.startFileAckTimer(); })
|
|
183
|
+
});
|
|
184
|
+
this.unsubscribeOpenImporters = null;
|
|
185
|
+
this.pendingFile = null;
|
|
186
|
+
// Data-location sheets redirect to another host, so the iframe origin can differ from
|
|
187
|
+
// targetOrigin. baseDomain is used to check the real origin before trusting it.
|
|
188
|
+
this.baseDomain = "app.csvbox.io";
|
|
189
|
+
this.fileAckTimer = null;
|
|
190
|
+
this.messageListener = (/**
|
|
191
|
+
* @param {?} event
|
|
192
|
+
* @return {?}
|
|
193
|
+
*/
|
|
194
|
+
function (event) {
|
|
195
|
+
// Older importers send these as bare strings, without a token.
|
|
196
|
+
/** @type {?} */
|
|
197
|
+
var legacy = classifyLegacyMessage(event.data);
|
|
198
|
+
if (legacy) {
|
|
199
|
+
// Legacy messages carry no token, so the only way to tell which importer sent one is its
|
|
200
|
+
// window. Ignore those that came from another instance's iframe (or anywhere else).
|
|
201
|
+
if (!_this.iframe || event.source !== _this.iframe.contentWindow) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// A newer importer sends the typed message as well; act on that one only.
|
|
205
|
+
if (!_this.messageGate.allowLegacy()) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
/** @type {?} */
|
|
209
|
+
var ended_1 = _this.importTracker.observe(legacy);
|
|
210
|
+
if (legacy.type === "mainModalHidden") {
|
|
211
|
+
_this.handleModalClosed();
|
|
212
|
+
}
|
|
213
|
+
else if (legacy.type === "uploadSuccessful") {
|
|
214
|
+
if (_this.onImport)
|
|
215
|
+
_this.onImport(true);
|
|
216
|
+
if (_this.isImported)
|
|
217
|
+
_this.isImported(true);
|
|
218
|
+
if (_this.imported)
|
|
219
|
+
_this.imported(true);
|
|
220
|
+
}
|
|
221
|
+
else if (legacy.type === "uploadFailed") {
|
|
222
|
+
if (_this.onImport)
|
|
223
|
+
_this.onImport(false);
|
|
224
|
+
if (_this.isImported)
|
|
225
|
+
_this.isImported(false);
|
|
226
|
+
if (_this.imported)
|
|
227
|
+
_this.imported(false);
|
|
228
|
+
}
|
|
229
|
+
_this.finishImport(ended_1);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
// Set-file handshake messages. The shared core does not classify these, so they are
|
|
233
|
+
// read here, behind the same unique_token check the core applies.
|
|
234
|
+
/** @type {?} */
|
|
235
|
+
var raw = event.data;
|
|
236
|
+
if (raw && typeof raw === "object" && raw.data && raw.data.unique_token == _this.uuid) {
|
|
237
|
+
_this.fileSender.learnOrigin(event);
|
|
238
|
+
if (raw.type === "csvbox-set-file-rejected" && raw.data.reason === "not-a-file") {
|
|
239
|
+
// Reply to our probe (it has no file). It only tells us the origin, so do nothing.
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (raw.type === "csvbox-modal-shown") {
|
|
243
|
+
_this.clearFileAckTimer();
|
|
244
|
+
registerOpenImporter(_this.registryEntry);
|
|
245
|
+
// What the file path in openModal() is waiting for. display as well as
|
|
246
|
+
// pointer-events: a second file declined while the first was still opening the
|
|
247
|
+
// modal has put the holder away in the meantime.
|
|
248
|
+
_this.isModalShown = true;
|
|
249
|
+
if (_this.holder) {
|
|
250
|
+
_this.holder.style.display = 'block';
|
|
251
|
+
_this.holder.style.pointerEvents = 'auto';
|
|
252
|
+
}
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (raw.type === "csvbox-set-file-rejected") {
|
|
256
|
+
_this.clearFileAckTimer();
|
|
257
|
+
// The importer has the file and will not take it. Put the holder away only if the
|
|
258
|
+
// modal was never confirmed up: a file declined while it is open leaves that modal
|
|
259
|
+
// where it is, and its own 'csvbox-modal-hidden' will put the holder away.
|
|
260
|
+
if (!_this.isModalShown && _this.holder) {
|
|
261
|
+
_this.holder.style.display = 'none';
|
|
262
|
+
_this.holder.style.pointerEvents = 'auto';
|
|
263
|
+
unregisterOpenImporter(_this.registryEntry);
|
|
264
|
+
}
|
|
265
|
+
console.warn("[csvbox] importer declined the supplied file: " + raw.data.reason);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** @type {?} */
|
|
270
|
+
var message = classifyStructuredMessage(event.data, (/** @type {?} */ (_this.uuid)));
|
|
271
|
+
if (!message) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
_this.messageGate.markTyped();
|
|
275
|
+
/** @type {?} */
|
|
276
|
+
var ended = _this.importTracker.observe(message);
|
|
277
|
+
if (message.type === "data-on-submit") {
|
|
278
|
+
if (_this.onSubmit)
|
|
279
|
+
_this.onSubmit(message.metadata);
|
|
280
|
+
if (_this.isSubmitted)
|
|
281
|
+
_this.isSubmitted(message.metadata);
|
|
282
|
+
if (_this.submitted)
|
|
283
|
+
_this.submitted(message.metadata);
|
|
284
|
+
}
|
|
285
|
+
else if (message.type === "data-push-status") {
|
|
286
|
+
if (_this.onImport)
|
|
287
|
+
_this.onImport(message.success, message.metadata);
|
|
288
|
+
if (_this.isImported)
|
|
289
|
+
_this.isImported(message.success, message.metadata);
|
|
290
|
+
if (_this.imported)
|
|
291
|
+
_this.imported(message.success, message.metadata);
|
|
292
|
+
}
|
|
293
|
+
else if (message.type === "csvbox-modal-hidden") {
|
|
294
|
+
_this.handleModalClosed();
|
|
295
|
+
}
|
|
296
|
+
else if (message.type === "csvbox-upload-successful") {
|
|
297
|
+
if (_this.onImport)
|
|
298
|
+
_this.onImport(true);
|
|
299
|
+
if (_this.isImported)
|
|
300
|
+
_this.isImported(true);
|
|
301
|
+
if (_this.imported)
|
|
302
|
+
_this.imported(true);
|
|
303
|
+
}
|
|
304
|
+
else if (message.type === "csvbox-upload-failed") {
|
|
305
|
+
if (_this.onImport)
|
|
306
|
+
_this.onImport(false);
|
|
307
|
+
if (_this.isImported)
|
|
308
|
+
_this.isImported(false);
|
|
309
|
+
if (_this.imported)
|
|
310
|
+
_this.imported(false);
|
|
311
|
+
}
|
|
312
|
+
_this.finishImport(ended);
|
|
313
|
+
});
|
|
27
314
|
}
|
|
28
315
|
/**
|
|
29
316
|
* @return {?}
|
|
@@ -42,6 +329,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
42
329
|
theme: this.theme,
|
|
43
330
|
environment: this.environment
|
|
44
331
|
}, "angular", appVersion);
|
|
332
|
+
// Default place to send the file. A file is only ever sent to a named origin, never "*".
|
|
333
|
+
this.targetOrigin = new URL(iframeUrl).origin;
|
|
334
|
+
this.baseDomain = this.customDomain || "app.csvbox.io";
|
|
45
335
|
this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
|
|
46
336
|
};
|
|
47
337
|
/**
|
|
@@ -81,55 +371,12 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
81
371
|
*/
|
|
82
372
|
function () {
|
|
83
373
|
var _this = this;
|
|
84
|
-
window.addEventListener("message",
|
|
85
|
-
|
|
374
|
+
window.addEventListener("message", this.messageListener, false);
|
|
375
|
+
this.syncBlocked();
|
|
376
|
+
this.unsubscribeOpenImporters = subscribeOpenImporters((/**
|
|
86
377
|
* @return {?}
|
|
87
378
|
*/
|
|
88
|
-
function (
|
|
89
|
-
/** @type {?} */
|
|
90
|
-
var message = classifyStructuredMessage(event.data, (/** @type {?} */ (_this.uuid)));
|
|
91
|
-
if (!message) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
if (message.type === "data-on-submit") {
|
|
95
|
-
if (_this.onSubmit)
|
|
96
|
-
_this.onSubmit(message.metadata);
|
|
97
|
-
if (_this.isSubmitted)
|
|
98
|
-
_this.isSubmitted(message.metadata);
|
|
99
|
-
if (_this.submitted)
|
|
100
|
-
_this.submitted(message.metadata);
|
|
101
|
-
}
|
|
102
|
-
else if (message.type === "data-push-status") {
|
|
103
|
-
if (!message.success) {
|
|
104
|
-
delete message.metadata["unique_token"];
|
|
105
|
-
}
|
|
106
|
-
if (_this.onImport)
|
|
107
|
-
_this.onImport(message.success, message.metadata);
|
|
108
|
-
if (_this.isImported)
|
|
109
|
-
_this.isImported(message.success, message.metadata);
|
|
110
|
-
if (_this.imported)
|
|
111
|
-
_this.imported(message.success, message.metadata);
|
|
112
|
-
}
|
|
113
|
-
else if (message.type === "csvbox-modal-hidden") {
|
|
114
|
-
_this.handleModalClosed();
|
|
115
|
-
}
|
|
116
|
-
else if (message.type === "csvbox-upload-successful") {
|
|
117
|
-
if (_this.onImport)
|
|
118
|
-
_this.onImport(true);
|
|
119
|
-
if (_this.isImported)
|
|
120
|
-
_this.isImported(true);
|
|
121
|
-
if (_this.imported)
|
|
122
|
-
_this.imported(true);
|
|
123
|
-
}
|
|
124
|
-
else if (message.type === "csvbox-upload-failed") {
|
|
125
|
-
if (_this.onImport)
|
|
126
|
-
_this.onImport(false);
|
|
127
|
-
if (_this.isImported)
|
|
128
|
-
_this.isImported(false);
|
|
129
|
-
if (_this.imported)
|
|
130
|
-
_this.imported(false);
|
|
131
|
-
}
|
|
132
|
-
}), false);
|
|
379
|
+
function () { return _this.syncBlocked(); }));
|
|
133
380
|
if (this.lazy) {
|
|
134
381
|
this.disabled = false;
|
|
135
382
|
}
|
|
@@ -145,15 +392,22 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
145
392
|
* @return {?}
|
|
146
393
|
*/
|
|
147
394
|
function () {
|
|
148
|
-
if (this.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
395
|
+
if (this.importTracker.isInFlight()) {
|
|
396
|
+
// Closed after submitting and before the result arrived: keep the iframe and its listener
|
|
397
|
+
// so the late result still reaches onImport. It is removed once that result has been
|
|
398
|
+
// delivered (see finishImport), so the next open is a fresh load.
|
|
399
|
+
if (this.holder) {
|
|
400
|
+
this.holder.style.display = 'none';
|
|
401
|
+
this.holder.style.pointerEvents = 'auto';
|
|
402
|
+
}
|
|
403
|
+
this.isModalShown = false;
|
|
404
|
+
this.openModalOnIframeLoad = false;
|
|
405
|
+
this.clearFileAckTimer();
|
|
406
|
+
unregisterOpenImporter(this.registryEntry);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
this.destroyImporter();
|
|
410
|
+
}
|
|
157
411
|
if (this.onClose)
|
|
158
412
|
this.onClose();
|
|
159
413
|
if (this.isClosed)
|
|
@@ -161,6 +415,57 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
161
415
|
if (this.closed)
|
|
162
416
|
this.closed();
|
|
163
417
|
};
|
|
418
|
+
// Called after the result of an import has been delivered. If the modal was closed in the
|
|
419
|
+
// meantime the iframe was only hidden, so remove it now.
|
|
420
|
+
// Called after the result of an import has been delivered. If the modal was closed in the
|
|
421
|
+
// meantime the iframe was only hidden, so remove it now.
|
|
422
|
+
/**
|
|
423
|
+
* @private
|
|
424
|
+
* @param {?} ended
|
|
425
|
+
* @return {?}
|
|
426
|
+
*/
|
|
427
|
+
CSVBoxButtonComponent.prototype.finishImport =
|
|
428
|
+
// Called after the result of an import has been delivered. If the modal was closed in the
|
|
429
|
+
// meantime the iframe was only hidden, so remove it now.
|
|
430
|
+
/**
|
|
431
|
+
* @private
|
|
432
|
+
* @param {?} ended
|
|
433
|
+
* @return {?}
|
|
434
|
+
*/
|
|
435
|
+
function (ended) {
|
|
436
|
+
if (ended && !this.isModalShown && this.iframe) {
|
|
437
|
+
this.destroyImporter();
|
|
438
|
+
}
|
|
439
|
+
};
|
|
440
|
+
// Puts the importer away: the next open builds a new iframe with a new token.
|
|
441
|
+
// Puts the importer away: the next open builds a new iframe with a new token.
|
|
442
|
+
/**
|
|
443
|
+
* @private
|
|
444
|
+
* @return {?}
|
|
445
|
+
*/
|
|
446
|
+
CSVBoxButtonComponent.prototype.destroyImporter =
|
|
447
|
+
// Puts the importer away: the next open builds a new iframe with a new token.
|
|
448
|
+
/**
|
|
449
|
+
* @private
|
|
450
|
+
* @return {?}
|
|
451
|
+
*/
|
|
452
|
+
function () {
|
|
453
|
+
if (this.holder) {
|
|
454
|
+
this.holder.style.display = 'none';
|
|
455
|
+
this.holder.style.pointerEvents = 'auto';
|
|
456
|
+
this.holder.remove();
|
|
457
|
+
}
|
|
458
|
+
this.holder = null;
|
|
459
|
+
this.iframe = null;
|
|
460
|
+
this.isModalShown = false;
|
|
461
|
+
this.isIframeLoaded = false;
|
|
462
|
+
this.openModalOnIframeLoad = false;
|
|
463
|
+
this.messageGate.reset();
|
|
464
|
+
this.importTracker.reset();
|
|
465
|
+
// A new iframe is built on the next open, so the origin is learned again.
|
|
466
|
+
this.clearProbeTimer();
|
|
467
|
+
unregisterOpenImporter(this.registryEntry);
|
|
468
|
+
};
|
|
164
469
|
/**
|
|
165
470
|
* @return {?}
|
|
166
471
|
*/
|
|
@@ -171,11 +476,14 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
171
476
|
if (this.loadStarted)
|
|
172
477
|
this.loadStarted();
|
|
173
478
|
this.uuid = generateUuid();
|
|
479
|
+
this.messageGate.reset();
|
|
480
|
+
this.importTracker.reset();
|
|
174
481
|
insertCSS();
|
|
175
482
|
/** @type {?} */
|
|
176
483
|
var iframe = document.createElement("iframe");
|
|
177
484
|
this.iframe = iframe;
|
|
178
485
|
iframe.setAttribute("src", this.safeUrl);
|
|
486
|
+
iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
|
|
179
487
|
iframe.frameBorder = "0";
|
|
180
488
|
/** @type {?} */
|
|
181
489
|
var self = this;
|
|
@@ -183,17 +491,19 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
183
491
|
* @return {?}
|
|
184
492
|
*/
|
|
185
493
|
function () {
|
|
494
|
+
self.disabled = false;
|
|
495
|
+
self.isIframeLoaded = true;
|
|
496
|
+
// The handshake goes first: a consumer that calls openModalWithFile() from the ready
|
|
497
|
+
// callback needs the importer to already have its customer, columns, options and token.
|
|
498
|
+
if (self.iframe && self.iframe.contentWindow) {
|
|
499
|
+
self.iframe.contentWindow.postMessage(buildInitPayload(self.user, self.dynamicColumns, self.options, (/** @type {?} */ (self.uuid))), "*");
|
|
500
|
+
}
|
|
186
501
|
if (self.onReady)
|
|
187
502
|
self.onReady();
|
|
188
503
|
if (self.isReady)
|
|
189
504
|
self.isReady();
|
|
190
505
|
if (self.importerReady)
|
|
191
506
|
self.importerReady();
|
|
192
|
-
self.disabled = false;
|
|
193
|
-
self.isIframeLoaded = true;
|
|
194
|
-
if (self.iframe && self.iframe.contentWindow) {
|
|
195
|
-
self.iframe.contentWindow.postMessage(buildInitPayload(self.user, self.dynamicColumns, self.options, (/** @type {?} */ (self.uuid))), "*");
|
|
196
|
-
}
|
|
197
507
|
if (self.openModalOnIframeLoad) {
|
|
198
508
|
self.openModal();
|
|
199
509
|
}
|
|
@@ -203,6 +513,8 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
203
513
|
this.holder.setAttribute('id', "csvbox-embed-" + this.uuid);
|
|
204
514
|
this.holder.appendChild(iframe);
|
|
205
515
|
document.body.insertAdjacentElement('beforeend', this.holder);
|
|
516
|
+
// The holder did not exist yet if openModal() asked for the importer before it was built.
|
|
517
|
+
restackOpenImporters(openImporters());
|
|
206
518
|
};
|
|
207
519
|
/**
|
|
208
520
|
* @return {?}
|
|
@@ -211,6 +523,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
211
523
|
* @return {?}
|
|
212
524
|
*/
|
|
213
525
|
function () {
|
|
526
|
+
// Counts as open from the moment it is requested, so the other buttons are disabled while
|
|
527
|
+
// this importer is still loading, and so it is stacked above any importer opened earlier.
|
|
528
|
+
registerOpenImporter(this.registryEntry);
|
|
214
529
|
if (!this.iframe) {
|
|
215
530
|
this.openModalOnIframeLoad = true;
|
|
216
531
|
this.initImporter();
|
|
@@ -218,11 +533,36 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
218
533
|
}
|
|
219
534
|
if (!this.isModalShown) {
|
|
220
535
|
if (this.isIframeLoaded) {
|
|
221
|
-
this.
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
536
|
+
if (this.pendingFile) {
|
|
537
|
+
// The importer opens its own modal once it has the file, so that it can inject on
|
|
538
|
+
// 'shown.bs.modal'. Sending 'openModal' as well would race that.
|
|
539
|
+
//
|
|
540
|
+
// It can also decline: wrong step, an import file URL configured on the sheet, or
|
|
541
|
+
// an importer too old to know the message at all. So the holder goes up
|
|
542
|
+
// click-through and stays that way until 'csvbox-modal-shown' confirms the modal
|
|
543
|
+
// is really up. It covers the viewport at z-index 2147483647 and the importer
|
|
544
|
+
// renders transparent with its modal closed, so arming it on an unanswered message
|
|
545
|
+
// leaves an invisible sheet over the host page eating every click.
|
|
546
|
+
//
|
|
547
|
+
// display:block regardless, so the iframe lays out and animates normally; only
|
|
548
|
+
// pointer-events is held back. isModalShown likewise waits for the confirmation,
|
|
549
|
+
// or a declined file would latch the importer shut for good.
|
|
550
|
+
if (this.holder) {
|
|
551
|
+
this.holder.style.pointerEvents = 'none';
|
|
552
|
+
this.holder.style.display = 'block';
|
|
553
|
+
}
|
|
554
|
+
this.fileSender.send();
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
this.isModalShown = true;
|
|
558
|
+
if (this.holder) {
|
|
559
|
+
// Explicit: a previously declined file leaves the holder click-through.
|
|
560
|
+
this.holder.style.pointerEvents = 'auto';
|
|
561
|
+
this.holder.style.display = 'block';
|
|
562
|
+
}
|
|
563
|
+
if (this.iframe && this.iframe.contentWindow) {
|
|
564
|
+
this.iframe.contentWindow.postMessage('openModal', '*');
|
|
565
|
+
}
|
|
226
566
|
}
|
|
227
567
|
}
|
|
228
568
|
else {
|
|
@@ -230,18 +570,177 @@ var CSVBoxButtonComponent = /** @class */ (function () {
|
|
|
230
570
|
}
|
|
231
571
|
}
|
|
232
572
|
};
|
|
573
|
+
/**
|
|
574
|
+
* Open the importer on a File the host page already has, instead of the file picker.
|
|
575
|
+
*
|
|
576
|
+
* Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
|
|
577
|
+
* or `@ViewChild(CSVBoxButtonComponent)`.
|
|
578
|
+
*
|
|
579
|
+
* The File crosses to the iframe by structured clone, so the importer receives the real
|
|
580
|
+
* object and applies its own extension, worksheet and size rules to it -- this does not
|
|
581
|
+
* bypass any of them. Pass a File; a Blob has no name for the importer to read an
|
|
582
|
+
* extension from.
|
|
583
|
+
*/
|
|
584
|
+
/**
|
|
585
|
+
* Open the importer on a File the host page already has, instead of the file picker.
|
|
586
|
+
*
|
|
587
|
+
* Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
|
|
588
|
+
* or `\@ViewChild(CSVBoxButtonComponent)`.
|
|
589
|
+
*
|
|
590
|
+
* The File crosses to the iframe by structured clone, so the importer receives the real
|
|
591
|
+
* object and applies its own extension, worksheet and size rules to it -- this does not
|
|
592
|
+
* bypass any of them. Pass a File; a Blob has no name for the importer to read an
|
|
593
|
+
* extension from.
|
|
594
|
+
* @param {?} file
|
|
595
|
+
* @return {?}
|
|
596
|
+
*/
|
|
597
|
+
CSVBoxButtonComponent.prototype.openModalWithFile = /**
|
|
598
|
+
* Open the importer on a File the host page already has, instead of the file picker.
|
|
599
|
+
*
|
|
600
|
+
* Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
|
|
601
|
+
* or `\@ViewChild(CSVBoxButtonComponent)`.
|
|
602
|
+
*
|
|
603
|
+
* The File crosses to the iframe by structured clone, so the importer receives the real
|
|
604
|
+
* object and applies its own extension, worksheet and size rules to it -- this does not
|
|
605
|
+
* bypass any of them. Pass a File; a Blob has no name for the importer to read an
|
|
606
|
+
* extension from.
|
|
607
|
+
* @param {?} file
|
|
608
|
+
* @return {?}
|
|
609
|
+
*/
|
|
610
|
+
function (file) {
|
|
611
|
+
if (typeof File === 'undefined' || !(file instanceof File)) {
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
this.pendingFile = file;
|
|
615
|
+
// Already open: hand it over now rather than holding it for the next open. The importer
|
|
616
|
+
// takes it only while it is still on the upload step, and ignores it once the user has a
|
|
617
|
+
// dataset and a mapping in progress.
|
|
618
|
+
if (this.isModalShown && this.iframe && this.isIframeLoaded) {
|
|
619
|
+
this.fileSender.send();
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
622
|
+
this.openModal();
|
|
623
|
+
};
|
|
624
|
+
/**
|
|
625
|
+
* @return {?}
|
|
626
|
+
*/
|
|
627
|
+
CSVBoxButtonComponent.prototype.clearProbeTimer = /**
|
|
628
|
+
* @return {?}
|
|
629
|
+
*/
|
|
630
|
+
function () {
|
|
631
|
+
this.clearFileAckTimer();
|
|
632
|
+
this.fileSender.reset();
|
|
633
|
+
};
|
|
634
|
+
/**
|
|
635
|
+
* @return {?}
|
|
636
|
+
*/
|
|
637
|
+
CSVBoxButtonComponent.prototype.startFileAckTimer = /**
|
|
638
|
+
* @return {?}
|
|
639
|
+
*/
|
|
640
|
+
function () {
|
|
641
|
+
var _this = this;
|
|
642
|
+
this.clearFileAckTimer();
|
|
643
|
+
this.fileAckTimer = setTimeout((/**
|
|
644
|
+
* @return {?}
|
|
645
|
+
*/
|
|
646
|
+
function () {
|
|
647
|
+
_this.fileAckTimer = null;
|
|
648
|
+
_this.giveUpOnFile();
|
|
649
|
+
}), FILE_ACK_TIMEOUT_MS);
|
|
650
|
+
};
|
|
651
|
+
/**
|
|
652
|
+
* @return {?}
|
|
653
|
+
*/
|
|
654
|
+
CSVBoxButtonComponent.prototype.clearFileAckTimer = /**
|
|
655
|
+
* @return {?}
|
|
656
|
+
*/
|
|
657
|
+
function () {
|
|
658
|
+
if (this.fileAckTimer) {
|
|
659
|
+
clearTimeout(this.fileAckTimer);
|
|
660
|
+
this.fileAckTimer = null;
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
// The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
|
|
664
|
+
// old to know the message). Without this the holder would stay up, invisible and click-through,
|
|
665
|
+
// and the other instances' buttons would stay disabled for good.
|
|
666
|
+
// The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
|
|
667
|
+
// old to know the message). Without this the holder would stay up, invisible and click-through,
|
|
668
|
+
// and the other instances' buttons would stay disabled for good.
|
|
669
|
+
/**
|
|
670
|
+
* @return {?}
|
|
671
|
+
*/
|
|
672
|
+
CSVBoxButtonComponent.prototype.giveUpOnFile =
|
|
673
|
+
// The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
|
|
674
|
+
// old to know the message). Without this the holder would stay up, invisible and click-through,
|
|
675
|
+
// and the other instances' buttons would stay disabled for good.
|
|
676
|
+
/**
|
|
677
|
+
* @return {?}
|
|
678
|
+
*/
|
|
679
|
+
function () {
|
|
680
|
+
if (this.isModalShown) {
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
/** @type {?} */
|
|
684
|
+
var holder = this.holder;
|
|
685
|
+
if (holder) {
|
|
686
|
+
holder.style.display = 'none';
|
|
687
|
+
holder.style.pointerEvents = 'auto';
|
|
688
|
+
}
|
|
689
|
+
unregisterOpenImporter(this.registryEntry);
|
|
690
|
+
console.warn("[csvbox] the importer did not respond to the supplied file");
|
|
691
|
+
};
|
|
692
|
+
/**
|
|
693
|
+
* @private
|
|
694
|
+
* @return {?}
|
|
695
|
+
*/
|
|
696
|
+
CSVBoxButtonComponent.prototype.syncBlocked = /**
|
|
697
|
+
* @private
|
|
698
|
+
* @return {?}
|
|
699
|
+
*/
|
|
700
|
+
function () {
|
|
701
|
+
var _this = this;
|
|
702
|
+
/** @type {?} */
|
|
703
|
+
var blocked = isBlockedByOpenImporter(this.registryEntry);
|
|
704
|
+
if (blocked !== this.blockedByOther) {
|
|
705
|
+
// The registry can call back from outside Angular's zone (another instance, another app).
|
|
706
|
+
this.zone.run((/**
|
|
707
|
+
* @return {?}
|
|
708
|
+
*/
|
|
709
|
+
function () {
|
|
710
|
+
_this.blockedByOther = blocked;
|
|
711
|
+
_this.cdr.markForCheck();
|
|
712
|
+
}));
|
|
713
|
+
}
|
|
714
|
+
};
|
|
715
|
+
/**
|
|
716
|
+
* @return {?}
|
|
717
|
+
*/
|
|
718
|
+
CSVBoxButtonComponent.prototype.ngOnDestroy = /**
|
|
719
|
+
* @return {?}
|
|
720
|
+
*/
|
|
721
|
+
function () {
|
|
722
|
+
window.removeEventListener("message", this.messageListener);
|
|
723
|
+
// Takes the holder out of document.body: left there, it would keep covering the page with
|
|
724
|
+
// an invisible full-screen layer that nothing is left to hide.
|
|
725
|
+
this.destroyImporter();
|
|
726
|
+
if (this.unsubscribeOpenImporters) {
|
|
727
|
+
this.unsubscribeOpenImporters();
|
|
728
|
+
this.unsubscribeOpenImporters = null;
|
|
729
|
+
}
|
|
730
|
+
};
|
|
233
731
|
CSVBoxButtonComponent.decorators = [
|
|
234
732
|
{ type: Component, args: [{
|
|
235
733
|
selector: 'csvbox-button',
|
|
236
|
-
template: "\n <div>\n <button [disabled]=\"disabled\"
|
|
734
|
+
template: "\n <div>\n <button [disabled]=\"disabled || blockedByOther\" (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n "
|
|
237
735
|
}] }
|
|
238
736
|
];
|
|
239
737
|
/** @nocollapse */
|
|
240
738
|
CSVBoxButtonComponent.ctorParameters = function () { return [
|
|
241
|
-
{ type: DomSanitizer }
|
|
739
|
+
{ type: DomSanitizer },
|
|
740
|
+
{ type: ChangeDetectorRef },
|
|
741
|
+
{ type: NgZone }
|
|
242
742
|
]; };
|
|
243
743
|
CSVBoxButtonComponent.propDecorators = {
|
|
244
|
-
initiator: [{ type: ViewChild, args: ['initiator', { static: false },] }],
|
|
245
744
|
onImport: [{ type: Input }],
|
|
246
745
|
onReady: [{ type: Input }],
|
|
247
746
|
onClose: [{ type: Input }],
|
|
@@ -277,8 +776,6 @@ if (false) {
|
|
|
277
776
|
/** @type {?} */
|
|
278
777
|
CSVBoxButtonComponent.prototype.isModalShown;
|
|
279
778
|
/** @type {?} */
|
|
280
|
-
CSVBoxButtonComponent.prototype.initiator;
|
|
281
|
-
/** @type {?} */
|
|
282
779
|
CSVBoxButtonComponent.prototype.onImport;
|
|
283
780
|
/** @type {?} */
|
|
284
781
|
CSVBoxButtonComponent.prototype.onReady;
|
|
@@ -337,8 +834,61 @@ if (false) {
|
|
|
337
834
|
/** @type {?} */
|
|
338
835
|
CSVBoxButtonComponent.prototype.disabled;
|
|
339
836
|
/** @type {?} */
|
|
837
|
+
CSVBoxButtonComponent.prototype.blockedByOther;
|
|
838
|
+
/**
|
|
839
|
+
* @type {?}
|
|
840
|
+
* @private
|
|
841
|
+
*/
|
|
842
|
+
CSVBoxButtonComponent.prototype.messageGate;
|
|
843
|
+
/**
|
|
844
|
+
* @type {?}
|
|
845
|
+
* @private
|
|
846
|
+
*/
|
|
847
|
+
CSVBoxButtonComponent.prototype.importTracker;
|
|
848
|
+
/**
|
|
849
|
+
* @type {?}
|
|
850
|
+
* @private
|
|
851
|
+
*/
|
|
852
|
+
CSVBoxButtonComponent.prototype.registryEntry;
|
|
853
|
+
/**
|
|
854
|
+
* @type {?}
|
|
855
|
+
* @private
|
|
856
|
+
*/
|
|
857
|
+
CSVBoxButtonComponent.prototype.fileSender;
|
|
858
|
+
/**
|
|
859
|
+
* @type {?}
|
|
860
|
+
* @private
|
|
861
|
+
*/
|
|
862
|
+
CSVBoxButtonComponent.prototype.unsubscribeOpenImporters;
|
|
863
|
+
/** @type {?} */
|
|
340
864
|
CSVBoxButtonComponent.prototype.holder;
|
|
341
865
|
/** @type {?} */
|
|
866
|
+
CSVBoxButtonComponent.prototype.pendingFile;
|
|
867
|
+
/** @type {?} */
|
|
868
|
+
CSVBoxButtonComponent.prototype.targetOrigin;
|
|
869
|
+
/** @type {?} */
|
|
870
|
+
CSVBoxButtonComponent.prototype.baseDomain;
|
|
871
|
+
/**
|
|
872
|
+
* @type {?}
|
|
873
|
+
* @private
|
|
874
|
+
*/
|
|
875
|
+
CSVBoxButtonComponent.prototype.fileAckTimer;
|
|
876
|
+
/**
|
|
877
|
+
* @type {?}
|
|
878
|
+
* @private
|
|
879
|
+
*/
|
|
880
|
+
CSVBoxButtonComponent.prototype.messageListener;
|
|
881
|
+
/** @type {?} */
|
|
342
882
|
CSVBoxButtonComponent.prototype.sanitizer;
|
|
883
|
+
/**
|
|
884
|
+
* @type {?}
|
|
885
|
+
* @private
|
|
886
|
+
*/
|
|
887
|
+
CSVBoxButtonComponent.prototype.cdr;
|
|
888
|
+
/**
|
|
889
|
+
* @type {?}
|
|
890
|
+
* @private
|
|
891
|
+
*/
|
|
892
|
+
CSVBoxButtonComponent.prototype.zone;
|
|
343
893
|
}
|
|
344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0lBRWpILFVBQVUsR0FBRyxRQUFRO0FBRTNCO0lBdURFLCtCQUFtQixTQUFzQjtRQUF0QixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBMUN6QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQXFCWixlQUFVLEdBQWtCLElBQUksQ0FBQztRQUVqQyxTQUFJLEdBQWtCLElBQUksQ0FBQztRQUMzQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBRy9CLFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBRTVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUV2QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBSS9CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBRS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7SUFFVSxDQUFDOzs7O0lBSTdDLHdDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7O1lBQ3ZCLFNBQVMsR0FBRyxjQUFjLENBQzVCO1lB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QUE0Qjs7SUFDNUIseUNBQTZCOztJQUU3QiwyQ0FBK0I7O0lBQy9CLHdDQUE0Qjs7SUFDNUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLDhDQUFrQzs7SUFDbEMsdUNBQTJCOztJQUMzQiwwQ0FBOEI7O0lBQzlCLHlDQUE2Qjs7SUFDN0IsNENBQWdDOztJQUVoQyxxQ0FBdUI7O0lBQ3ZCLCtDQUFpQzs7SUFDakMsMkNBQTBDOztJQUMxQyx3Q0FBMEI7O0lBQzFCLHFDQUFvQzs7SUFDcEMsNkNBQTRDOztJQUM1Qyw2Q0FBNEM7O0lBQzVDLHlDQUF3Qzs7SUFDeEMsNENBQThCOztJQUU5QixzQ0FBcUM7O0lBRXJDLCtDQUF5Qzs7SUFDekMsc0RBQWdEOztJQUVoRCxxQ0FBK0I7O0lBRS9CLHdDQUFhOztJQUViLHVDQUF3Qzs7SUFFeEMseUNBQWtDOztJQUlsQyx1Q0FBWTs7SUFGQSwwQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIEFmdGVyQ29udGVudEluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi4vdXRsaXMvaW5zZXJ0Q1NTJztcbmltcG9ydCB7IGJ1aWxkSW1wb3J0VXJsLCBnZW5lcmF0ZVV1aWQsIGJ1aWxkSW5pdFBheWxvYWQsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UgfSBmcm9tICdAc3VtaXRfeWV3YWxlL2FkYXB0ZXItY29yZSc7XG5cbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjE2JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgI2luaXRpYXRvciAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgXG59KVxuXG5leHBvcnQgY2xhc3MgQ1NWQm94QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2luaXRpYXRvcicsIHtzdGF0aWM6IGZhbHNlfSkgaW5pdGlhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25DbG9zZT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1N1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGltcG9ydGVyUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgY2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBsb2FkU3RhcnRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIHVzZXI/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zPzogb2JqZWN0O1xuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9ucz86IG9iamVjdDtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGN1c3RvbURvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ/OiBvYmplY3Q7XG5cbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzYWZlVXJsOiBhbnk7XG5cbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOkRvbVNhbml0aXplcikge31cblxuICBob2xkZXI6IGFueTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICBsZXQgaWZyYW1lVXJsID0gYnVpbGRJbXBvcnRVcmwoXG4gICAgICB7XG4gICAgICAgIGxpY2Vuc2VLZXk6IHRoaXMubGljZW5zZUtleSxcbiAgICAgICAgY3VzdG9tRG9tYWluOiB0aGlzLmN1c3RvbURvbWFpbixcbiAgICAgICAgZGF0YUxvY2F0aW9uOiB0aGlzLmRhdGFMb2NhdGlvbixcbiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5lbnZpcm9ubWVudFxuICAgICAgfSxcbiAgICAgIFwiYW5ndWxhclwiLFxuICAgICAgYXBwVmVyc2lvblxuICAgICk7XG4gICAgdGhpcy5zYWZlVXJsID0gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGlmcmFtZVVybCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmKGNoYW5nZXNbXCJ1c2VyXCJdICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1sndXNlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlclZhcmlhYmUoY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVXNlclZhcmlhYmUoZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy51c2VyID0gZGF0YTtcbiAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIFwiY3VzdG9tZXJcIiA6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudCkgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlKGV2ZW50LmRhdGEsIHRoaXMudXVpZCEpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJkYXRhLW9uLXN1Ym1pdFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtcHVzaC1zdGF0dXNcIikge1xuICAgICAgICBpZiAoIW1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLm1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTW9kYWxDbG9zZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICBpZih0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIucmVtb3ZlKCk7XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcbiAgfVxuXG4gIGluaXRJbXBvcnRlcigpIHtcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xuXG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsKTtcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcblxuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICBpZnJhbWUub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICBzZWxmLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzZWxmLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzZWxmLmlmcmFtZSAmJiBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoYnVpbGRJbml0UGF5bG9hZChzZWxmLnVzZXIsIHNlbGYuZHluYW1pY0NvbHVtbnMsIHNlbGYub3B0aW9ucywgc2VsZi51dWlkISksIFwiKlwiKTtcbiAgICAgIH1cbiAgICAgIGlmKHNlbGYub3Blbk1vZGFsT25JZnJhbWVMb2FkKSB7XG4gICAgICAgIHNlbGYub3Blbk1vZGFsKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmhvbGRlci5jbGFzc0xpc3QuYWRkKCdjc3Zib3gtaG9sZGVyJyk7XG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XG4gICAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxuICAgICAgJ2JlZm9yZWVuZCcsIHRoaXMuaG9sZGVyXG4gICAgKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBpZighdGhpcy5pZnJhbWUpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCF0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgaWYodGhpcy5pc0lmcmFtZUxvYWRlZCkge1xuICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgICBpZih0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgaWYodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcbiAgICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuIl19
|
|
894
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxlQUFlLEVBR2YsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztJQUdsTSxtQkFBbUIsR0FBRyxJQUFJOzs7O0FBT2hDLGdDQUFvRTs7O0lBQXRDLHNDQUFvQzs7Ozs7QUFDbEUsNEJBQW9GOzs7SUFBMUQsNkJBQTBCOztJQUFDLGtDQUE2Qjs7O0lBQzVFLGtCQUFrQixHQUFHLHVCQUF1Qjs7SUFDNUMsV0FBVyxHQUFHLFVBQVU7Ozs7QUFFOUIsU0FBUyxhQUFhOztRQUNkLENBQUMsR0FBRyxtQkFBQSxNQUFNLEVBQU87SUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEYsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMvQixDQUFDOzs7OztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPOzs7OztJQUFD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Ozs7O0lBRTlDLDhDQUE0RTs7Ozs7SUFFNUUsMkNBV0c7Ozs7O0lBRUgseURBQTZEOztJQUU3RCx1Q0FBWTs7SUFFWiw0Q0FBZ0M7O0lBRWhDLDZDQUFpQzs7SUFJakMsMkNBQXFDOzs7OztJQUVyQyw2Q0FBaUM7Ozs7O0lBcUNqQyxnREE4RkU7O0lBdEtVLDBDQUE2Qjs7Ozs7SUFBRSxvQ0FBOEI7Ozs7O0lBQUUscUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGluc2VydENTUyB9IGZyb20gJy4uL3V0bGlzL2luc2VydENTUyc7XG5pbXBvcnQgeyBidWlsZEltcG9ydFVybCwgZ2VuZXJhdGVVdWlkLCBidWlsZEluaXRQYXlsb2FkLCBjcmVhdGVNZXNzYWdlR2F0ZSwgY3JlYXRlSW1wb3J0VHJhY2tlciwgY3JlYXRlRmlsZVNlbmRlciwgY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZSwgY2xhc3NpZnlMZWdhY3lNZXNzYWdlIH0gZnJvbSAnQHN1bWl0X3lld2FsZS9hZGFwdGVyLWNvcmUnO1xuXG4vLyBIb3cgbG9uZyB3ZSB3YWl0IGZvciB0aGUgaW1wb3J0ZXIgdG8gY29uZmlybSBhIGZpbGUgaXQgd2FzIHNlbnQgYmVmb3JlIGdpdmluZyB1cCBvbiBpdC5cbmNvbnN0IEZJTEVfQUNLX1RJTUVPVVRfTVMgPSA4MDAwO1xuXG4vLyBQYWdlLXdpZGUgcmVjb3JkIG9mIHRoZSBpbXBvcnRlcnMgdGhhdCBhcmUgb3BlbiBvciBvcGVuaW5nLCBzaGFyZWQgYnkgZXZlcnkgQ1NWQm94IGFkYXB0ZXJcbi8vIG9uIHRoZSBwYWdlIChpdCBsaXZlcyBvbiB3aW5kb3cgc28gc2VwYXJhdGUgY29waWVzIG9mIGFuIGFkYXB0ZXIgc2VlIHRoZSBzYW1lIGxpc3QpLiBJdCBkb2VzXG4vLyB0d28gdGhpbmdzOiB0aGUgbmV3ZXN0IGltcG9ydGVyIGlzIHN0YWNrZWQgb24gdG9wIChldmVyeSBob2xkZXIgaXMgZml4ZWQsIGZ1bGwgc2NyZWVuIGFuZFxuLy8gei1pbmRleCAyMTQ3NDgzNjQ3LCBzbyBlcXVhbCB6LWluZGV4ZXMgd291bGQgbGVhdmUgdGhlIG9uZSB0aGF0IGNvbWVzIGZpcnN0IGluIHRoZSBET00gb25cbi8vIHRvcCksIGFuZCB0aGUgb3RoZXIgaW5zdGFuY2VzIGxlYXJuIHRoYXQgYW4gaW1wb3J0ZXIgaXMgb3BlbiBzbyB0aGV5IGNhbiBkaXNhYmxlIHRoZWlyIGJ1dHRvbi5cbmludGVyZmFjZSBPcGVuSW1wb3J0ZXJFbnRyeSB7IGdldEhvbGRlcjogKCkgPT4gSFRNTEVsZW1lbnQgfCBudWxsOyB9XG5pbnRlcmZhY2UgT3BlbkltcG9ydGVycyB7IG9wZW46IE9wZW5JbXBvcnRlckVudHJ5W107IGxpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD47IH1cbmNvbnN0IE9QRU5fSU1QT1JURVJTX0tFWSA9ICdfX2NzdmJveE9wZW5JbXBvcnRlcnMnO1xuY29uc3QgVE9QX1pfSU5ERVggPSAyMTQ3NDgzNjQ3O1xuXG5mdW5jdGlvbiBvcGVuSW1wb3J0ZXJzKCk6IE9wZW5JbXBvcnRlcnMge1xuICBjb25zdCB3ID0gd2luZG93IGFzIGFueTtcbiAgaWYgKCF3W09QRU5fSU1QT1JURVJTX0tFWV0pIHdbT1BFTl9JTVBPUlRFUlNfS0VZXSA9IHsgb3BlbjogW10sIGxpc3RlbmVyczogW10gfTtcbiAgcmV0dXJuIHdbT1BFTl9JTVBPUlRFUlNfS0VZXTtcbn1cblxuZnVuY3Rpb24gcmVzdGFja09wZW5JbXBvcnRlcnMocmVnOiBPcGVuSW1wb3J0ZXJzKTogdm9pZCB7XG4gIHJlZy5vcGVuLmZvckVhY2goKGVudHJ5LCBpKSA9PiB7XG4gICAgY29uc3QgaG9sZGVyID0gZW50cnkuZ2V0SG9sZGVyKCk7XG4gICAgaWYgKGhvbGRlcikgaG9sZGVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyhUT1BfWl9JTkRFWCAtIChyZWcub3Blbi5sZW5ndGggLSAxIC0gaSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJPcGVuSW1wb3J0ZXIoZW50cnk6IE9wZW5JbXBvcnRlckVudHJ5KTogdm9pZCB7XG4gIGNvbnN0IHJlZyA9IG9wZW5JbXBvcnRlcnMoKTtcbiAgaWYgKHJlZy5vcGVuLmluZGV4T2YoZW50cnkpID49IDApIHJldHVybjtcbiAgcmVnLm9wZW4ucHVzaChlbnRyeSk7XG4gIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZyk7XG4gIHJlZy5saXN0ZW5lcnMuc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKCkpO1xufVxuXG5mdW5jdGlvbiB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIGNvbnN0IGkgPSByZWcub3Blbi5pbmRleE9mKGVudHJ5KTtcbiAgaWYgKGkgPCAwKSByZXR1cm47XG4gIHJlZy5vcGVuLnNwbGljZShpLCAxKTtcbiAgcmVzdGFja09wZW5JbXBvcnRlcnMocmVnKTtcbiAgcmVnLmxpc3RlbmVycy5zbGljZSgpLmZvckVhY2goZm4gPT4gZm4oKSk7XG59XG5cbmZ1bmN0aW9uIGlzQmxvY2tlZEJ5T3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IGJvb2xlYW4ge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIHJldHVybiByZWcub3Blbi5sZW5ndGggPiAwICYmIHJlZy5vcGVuLmluZGV4T2YoZW50cnkpIDwgMDtcbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlT3BlbkltcG9ydGVycyhmbjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIHJlZy5saXN0ZW5lcnMucHVzaChmbik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29uc3QgaSA9IHJlZy5saXN0ZW5lcnMuaW5kZXhPZihmbik7XG4gICAgaWYgKGkgPj0gMCkgcmVnLmxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gIH07XG59XG5cbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjIwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IGJsb2NrZWRCeU90aGVyXCIgKGNsaWNrKT1cIm9wZW5Nb2RhbCgpXCIgW2F0dHIuZGF0YS1jc3Zib3gtdG9rZW5dPVwidXVpZFwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcblxuZXhwb3J0IGNsYXNzIENTVkJveEJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25DbG9zZT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1N1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGltcG9ydGVyUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgY2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBsb2FkU3RhcnRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIHVzZXI/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zPzogb2JqZWN0O1xuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9ucz86IG9iamVjdDtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGN1c3RvbURvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ/OiBvYmplY3Q7XG5cbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzYWZlVXJsOiBhbnk7XG5cbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOkRvbVNhbml0aXplciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cblxuICAvLyBUcnVlIHdoaWxlIGEgZGlmZmVyZW50IGltcG9ydGVyIG9uIHRoZSBwYWdlIGlzIG9wZW46IHRoZSBidXR0b24gc3RheXMgZGlzYWJsZWQuXG4gIGJsb2NrZWRCeU90aGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBtZXNzYWdlR2F0ZSA9IGNyZWF0ZU1lc3NhZ2VHYXRlKCk7XG4gIHByaXZhdGUgaW1wb3J0VHJhY2tlciA9IGNyZWF0ZUltcG9ydFRyYWNrZXIoKTtcblxuICBwcml2YXRlIHJlZ2lzdHJ5RW50cnk6IE9wZW5JbXBvcnRlckVudHJ5ID0geyBnZXRIb2xkZXI6ICgpID0+IHRoaXMuaG9sZGVyIH07XG5cbiAgcHJpdmF0ZSBmaWxlU2VuZGVyID0gY3JlYXRlRmlsZVNlbmRlcih7XG4gICAgZ2V0SWZyYW1lOiAoKSA9PiB0aGlzLmlmcmFtZSxcbiAgICBnZXRUb2tlbjogKCkgPT4gdGhpcy51dWlkIGFzIHN0cmluZyxcbiAgICBnZXRUYXJnZXRPcmlnaW46ICgpID0+IHRoaXMudGFyZ2V0T3JpZ2luIGFzIHN0cmluZyxcbiAgICBnZXRCYXNlRG9tYWluOiAoKSA9PiB0aGlzLmJhc2VEb21haW4sXG4gICAgdGFrZUZpbGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBlbmRpbmdGaWxlO1xuICAgICAgdGhpcy5wZW5kaW5nRmlsZSA9IG51bGw7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9LFxuICAgIG9uU2VudDogKCkgPT4gdGhpcy5zdGFydEZpbGVBY2tUaW1lcigpXG4gIH0pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBob2xkZXI6IGFueTtcblxuICBwZW5kaW5nRmlsZTogRmlsZSB8IG51bGwgPSBudWxsO1xuXG4gIHRhcmdldE9yaWdpbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIERhdGEtbG9jYXRpb24gc2hlZXRzIHJlZGlyZWN0IHRvIGFub3RoZXIgaG9zdCwgc28gdGhlIGlmcmFtZSBvcmlnaW4gY2FuIGRpZmZlciBmcm9tXG4gIC8vIHRhcmdldE9yaWdpbi4gYmFzZURvbWFpbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSByZWFsIG9yaWdpbiBiZWZvcmUgdHJ1c3RpbmcgaXQuXG4gIGJhc2VEb21haW46IHN0cmluZyA9IFwiYXBwLmNzdmJveC5pb1wiO1xuXG4gIHByaXZhdGUgZmlsZUFja1RpbWVyOiBhbnkgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgIGxldCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICAvLyBEZWZhdWx0IHBsYWNlIHRvIHNlbmQgdGhlIGZpbGUuIEEgZmlsZSBpcyBvbmx5IGV2ZXIgc2VudCB0byBhIG5hbWVkIG9yaWdpbiwgbmV2ZXIgXCIqXCIuXG4gICAgdGhpcy50YXJnZXRPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVVybCkub3JpZ2luO1xuICAgIHRoaXMuYmFzZURvbWFpbiA9IHRoaXMuY3VzdG9tRG9tYWluIHx8IFwiYXBwLmNzdmJveC5pb1wiO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZihjaGFuZ2VzW1widXNlclwiXSAmJiBjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlICE9IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJlKGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVVzZXJWYXJpYWJlKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCIgOiBkYXRhXG4gICAgICB9LCBcIipcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlTGlzdGVuZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIC8vIE9sZGVyIGltcG9ydGVycyBzZW5kIHRoZXNlIGFzIGJhcmUgc3RyaW5ncywgd2l0aG91dCBhIHRva2VuLlxuICAgIGNvbnN0IGxlZ2FjeSA9IGNsYXNzaWZ5TGVnYWN5TWVzc2FnZShldmVudC5kYXRhKTtcbiAgICBpZiAobGVnYWN5KSB7XG4gICAgICAvLyBMZWdhY3kgbWVzc2FnZXMgY2Fycnkgbm8gdG9rZW4sIHNvIHRoZSBvbmx5IHdheSB0byB0ZWxsIHdoaWNoIGltcG9ydGVyIHNlbnQgb25lIGlzIGl0c1xuICAgICAgLy8gd2luZG93LiBJZ25vcmUgdGhvc2UgdGhhdCBjYW1lIGZyb20gYW5vdGhlciBpbnN0YW5jZSdzIGlmcmFtZSAob3IgYW55d2hlcmUgZWxzZSkuXG4gICAgICBpZiAoIXRoaXMuaWZyYW1lIHx8IGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBBIG5ld2VyIGltcG9ydGVyIHNlbmRzIHRoZSB0eXBlZCBtZXNzYWdlIGFzIHdlbGw7IGFjdCBvbiB0aGF0IG9uZSBvbmx5LlxuICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VHYXRlLmFsbG93TGVnYWN5KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZW5kZWQgPSB0aGlzLmltcG9ydFRyYWNrZXIub2JzZXJ2ZShsZWdhY3kpO1xuICAgICAgaWYgKGxlZ2FjeS50eXBlID09PSBcIm1haW5Nb2RhbEhpZGRlblwiKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTW9kYWxDbG9zZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAobGVnYWN5LnR5cGUgPT09IFwidXBsb2FkU3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChsZWdhY3kudHlwZSA9PT0gXCJ1cGxvYWRGYWlsZWRcIikge1xuICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmluaXNoSW1wb3J0KGVuZGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXQtZmlsZSBoYW5kc2hha2UgbWVzc2FnZXMuIFRoZSBzaGFyZWQgY29yZSBkb2VzIG5vdCBjbGFzc2lmeSB0aGVzZSwgc28gdGhleSBhcmVcbiAgICAvLyByZWFkIGhlcmUsIGJlaGluZCB0aGUgc2FtZSB1bmlxdWVfdG9rZW4gY2hlY2sgdGhlIGNvcmUgYXBwbGllcy5cbiAgICBjb25zdCByYXcgPSBldmVudC5kYXRhO1xuICAgIGlmIChyYXcgJiYgdHlwZW9mIHJhdyA9PT0gXCJvYmplY3RcIiAmJiByYXcuZGF0YSAmJiByYXcuZGF0YS51bmlxdWVfdG9rZW4gPT0gdGhpcy51dWlkKSB7XG4gICAgICB0aGlzLmZpbGVTZW5kZXIubGVhcm5PcmlnaW4oZXZlbnQpO1xuXG4gICAgICBpZiAocmF3LnR5cGUgPT09IFwiY3N2Ym94LXNldC1maWxlLXJlamVjdGVkXCIgJiYgcmF3LmRhdGEucmVhc29uID09PSBcIm5vdC1hLWZpbGVcIikge1xuICAgICAgICAvLyBSZXBseSB0byBvdXIgcHJvYmUgKGl0IGhhcyBubyBmaWxlKS4gSXQgb25seSB0ZWxscyB1cyB0aGUgb3JpZ2luLCBzbyBkbyBub3RoaW5nLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmF3LnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLXNob3duXCIpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgICAgICByZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgICAgICAvLyBXaGF0IHRoZSBmaWxlIHBhdGggaW4gb3Blbk1vZGFsKCkgaXMgd2FpdGluZyBmb3IuIGRpc3BsYXkgYXMgd2VsbCBhc1xuICAgICAgICAvLyBwb2ludGVyLWV2ZW50czogYSBzZWNvbmQgZmlsZSBkZWNsaW5lZCB3aGlsZSB0aGUgZmlyc3Qgd2FzIHN0aWxsIG9wZW5pbmcgdGhlXG4gICAgICAgIC8vIG1vZGFsIGhhcyBwdXQgdGhlIGhvbGRlciBhd2F5IGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcudHlwZSA9PT0gXCJjc3Zib3gtc2V0LWZpbGUtcmVqZWN0ZWRcIikge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgICAgIC8vIFRoZSBpbXBvcnRlciBoYXMgdGhlIGZpbGUgYW5kIHdpbGwgbm90IHRha2UgaXQuIFB1dCB0aGUgaG9sZGVyIGF3YXkgb25seSBpZiB0aGVcbiAgICAgICAgLy8gbW9kYWwgd2FzIG5ldmVyIGNvbmZpcm1lZCB1cDogYSBmaWxlIGRlY2xpbmVkIHdoaWxlIGl0IGlzIG9wZW4gbGVhdmVzIHRoYXQgbW9kYWxcbiAgICAgICAgLy8gd2hlcmUgaXQgaXMsIGFuZCBpdHMgb3duICdjc3Zib3gtbW9kYWwtaGlkZGVuJyB3aWxsIHB1dCB0aGUgaG9sZGVyIGF3YXkuXG4gICAgICAgIGlmICghdGhpcy5pc01vZGFsU2hvd24gJiYgdGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgICAgdW5yZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihcIltjc3Zib3hdIGltcG9ydGVyIGRlY2xpbmVkIHRoZSBzdXBwbGllZCBmaWxlOiBcIiArIHJhdy5kYXRhLnJlYXNvbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UoZXZlbnQuZGF0YSwgdGhpcy51dWlkISk7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZUdhdGUubWFya1R5cGVkKCk7XG4gICAgY29uc3QgZW5kZWQgPSB0aGlzLmltcG9ydFRyYWNrZXIub2JzZXJ2ZShtZXNzYWdlKTtcblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1vbi1zdWJtaXRcIikge1xuICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xuICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtZmFpbGVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuZmluaXNoSW1wb3J0KGVuZGVkKTtcbiAgfTtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyLCBmYWxzZSk7XG4gICAgdGhpcy5zeW5jQmxvY2tlZCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzID0gc3Vic2NyaWJlT3BlbkltcG9ydGVycygoKSA9PiB0aGlzLnN5bmNCbG9ja2VkKCkpO1xuXG4gICAgaWYodGhpcy5sYXp5KSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNb2RhbENsb3NlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbXBvcnRUcmFja2VyLmlzSW5GbGlnaHQoKSkge1xuICAgICAgLy8gQ2xvc2VkIGFmdGVyIHN1Ym1pdHRpbmcgYW5kIGJlZm9yZSB0aGUgcmVzdWx0IGFycml2ZWQ6IGtlZXAgdGhlIGlmcmFtZSBhbmQgaXRzIGxpc3RlbmVyXG4gICAgICAvLyBzbyB0aGUgbGF0ZSByZXN1bHQgc3RpbGwgcmVhY2hlcyBvbkltcG9ydC4gSXQgaXMgcmVtb3ZlZCBvbmNlIHRoYXQgcmVzdWx0IGhhcyBiZWVuXG4gICAgICAvLyBkZWxpdmVyZWQgKHNlZSBmaW5pc2hJbXBvcnQpLCBzbyB0aGUgbmV4dCBvcGVuIGlzIGEgZnJlc2ggbG9hZC5cbiAgICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgfVxuICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdHJveUltcG9ydGVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9uQ2xvc2UpIHRoaXMub25DbG9zZSgpO1xuICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB0aGlzLmlzQ2xvc2VkKCk7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB0aGlzLmNsb3NlZCgpO1xuICB9XG5cbiAgLy8gQ2FsbGVkIGFmdGVyIHRoZSByZXN1bHQgb2YgYW4gaW1wb3J0IGhhcyBiZWVuIGRlbGl2ZXJlZC4gSWYgdGhlIG1vZGFsIHdhcyBjbG9zZWQgaW4gdGhlXG4gIC8vIG1lYW50aW1lIHRoZSBpZnJhbWUgd2FzIG9ubHkgaGlkZGVuLCBzbyByZW1vdmUgaXQgbm93LlxuICBwcml2YXRlIGZpbmlzaEltcG9ydChlbmRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChlbmRlZCAmJiAhdGhpcy5pc01vZGFsU2hvd24gJiYgdGhpcy5pZnJhbWUpIHtcbiAgICAgIHRoaXMuZGVzdHJveUltcG9ydGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0cyB0aGUgaW1wb3J0ZXIgYXdheTogdGhlIG5leHQgb3BlbiBidWlsZHMgYSBuZXcgaWZyYW1lIHdpdGggYSBuZXcgdG9rZW4uXG4gIHByaXZhdGUgZGVzdHJveUltcG9ydGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIHRoaXMubWVzc2FnZUdhdGUucmVzZXQoKTtcbiAgICB0aGlzLmltcG9ydFRyYWNrZXIucmVzZXQoKTtcbiAgICAvLyBBIG5ldyBpZnJhbWUgaXMgYnVpbHQgb24gdGhlIG5leHQgb3Blbiwgc28gdGhlIG9yaWdpbiBpcyBsZWFybmVkIGFnYWluLlxuICAgIHRoaXMuY2xlYXJQcm9iZVRpbWVyKCk7XG4gICAgdW5yZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICB9XG5cbiAgaW5pdEltcG9ydGVyKCkge1xuICAgIGlmICh0aGlzLmxvYWRTdGFydGVkKSB0aGlzLmxvYWRTdGFydGVkKCk7XG5cbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICB0aGlzLm1lc3NhZ2VHYXRlLnJlc2V0KCk7XG4gICAgdGhpcy5pbXBvcnRUcmFja2VyLnJlc2V0KCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsKTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwiYWxsb3dcIiwgXCJjbGlwYm9hcmQtcmVhZDsgY2xpcGJvYXJkLXdyaXRlICpcIik7XG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuaXNJZnJhbWVMb2FkZWQgPSB0cnVlO1xuICAgICAgLy8gVGhlIGhhbmRzaGFrZSBnb2VzIGZpcnN0OiBhIGNvbnN1bWVyIHRoYXQgY2FsbHMgb3Blbk1vZGFsV2l0aEZpbGUoKSBmcm9tIHRoZSByZWFkeVxuICAgICAgLy8gY2FsbGJhY2sgbmVlZHMgdGhlIGltcG9ydGVyIHRvIGFscmVhZHkgaGF2ZSBpdHMgY3VzdG9tZXIsIGNvbHVtbnMsIG9wdGlvbnMgYW5kIHRva2VuLlxuICAgICAgaWYgKHNlbGYuaWZyYW1lICYmIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShidWlsZEluaXRQYXlsb2FkKHNlbGYudXNlciwgc2VsZi5keW5hbWljQ29sdW1ucywgc2VsZi5vcHRpb25zLCBzZWxmLnV1aWQhKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICBpZihzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xuICAgICAgICBzZWxmLm9wZW5Nb2RhbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xuICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcbiAgICAgICdiZWZvcmVlbmQnLCB0aGlzLmhvbGRlclxuICAgICk7XG4gICAgLy8gVGhlIGhvbGRlciBkaWQgbm90IGV4aXN0IHlldCBpZiBvcGVuTW9kYWwoKSBhc2tlZCBmb3IgdGhlIGltcG9ydGVyIGJlZm9yZSBpdCB3YXMgYnVpbHQuXG4gICAgcmVzdGFja09wZW5JbXBvcnRlcnMob3BlbkltcG9ydGVycygpKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICAvLyBDb3VudHMgYXMgb3BlbiBmcm9tIHRoZSBtb21lbnQgaXQgaXMgcmVxdWVzdGVkLCBzbyB0aGUgb3RoZXIgYnV0dG9ucyBhcmUgZGlzYWJsZWQgd2hpbGVcbiAgICAvLyB0aGlzIGltcG9ydGVyIGlzIHN0aWxsIGxvYWRpbmcsIGFuZCBzbyBpdCBpcyBzdGFja2VkIGFib3ZlIGFueSBpbXBvcnRlciBvcGVuZWQgZWFybGllci5cbiAgICByZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgIGlmKCF0aGlzLmlmcmFtZSkge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICBpZih0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgIGlmKHRoaXMucGVuZGluZ0ZpbGUpIHtcbiAgICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgb3BlbnMgaXRzIG93biBtb2RhbCBvbmNlIGl0IGhhcyB0aGUgZmlsZSwgc28gdGhhdCBpdCBjYW4gaW5qZWN0IG9uXG4gICAgICAgICAgLy8gJ3Nob3duLmJzLm1vZGFsJy4gU2VuZGluZyAnb3Blbk1vZGFsJyBhcyB3ZWxsIHdvdWxkIHJhY2UgdGhhdC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEl0IGNhbiBhbHNvIGRlY2xpbmU6IHdyb25nIHN0ZXAsIGFuIGltcG9ydCBmaWxlIFVSTCBjb25maWd1cmVkIG9uIHRoZSBzaGVldCwgb3JcbiAgICAgICAgICAvLyBhbiBpbXBvcnRlciB0b28gb2xkIHRvIGtub3cgdGhlIG1lc3NhZ2UgYXQgYWxsLiBTbyB0aGUgaG9sZGVyIGdvZXMgdXBcbiAgICAgICAgICAvLyBjbGljay10aHJvdWdoIGFuZCBzdGF5cyB0aGF0IHdheSB1bnRpbCAnY3N2Ym94LW1vZGFsLXNob3duJyBjb25maXJtcyB0aGUgbW9kYWxcbiAgICAgICAgICAvLyBpcyByZWFsbHkgdXAuIEl0IGNvdmVycyB0aGUgdmlld3BvcnQgYXQgei1pbmRleCAyMTQ3NDgzNjQ3IGFuZCB0aGUgaW1wb3J0ZXJcbiAgICAgICAgICAvLyByZW5kZXJzIHRyYW5zcGFyZW50IHdpdGggaXRzIG1vZGFsIGNsb3NlZCwgc28gYXJtaW5nIGl0IG9uIGFuIHVuYW5zd2VyZWQgbWVzc2FnZVxuICAgICAgICAgIC8vIGxlYXZlcyBhbiBpbnZpc2libGUgc2hlZXQgb3ZlciB0aGUgaG9zdCBwYWdlIGVhdGluZyBldmVyeSBjbGljay5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGRpc3BsYXk6YmxvY2sgcmVnYXJkbGVzcywgc28gdGhlIGlmcmFtZSBsYXlzIG91dCBhbmQgYW5pbWF0ZXMgbm9ybWFsbHk7IG9ubHlcbiAgICAgICAgICAvLyBwb2ludGVyLWV2ZW50cyBpcyBoZWxkIGJhY2suIGlzTW9kYWxTaG93biBsaWtld2lzZSB3YWl0cyBmb3IgdGhlIGNvbmZpcm1hdGlvbixcbiAgICAgICAgICAvLyBvciBhIGRlY2xpbmVkIGZpbGUgd291bGQgbGF0Y2ggdGhlIGltcG9ydGVyIHNodXQgZm9yIGdvb2QuXG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWxlU2VuZGVyLnNlbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0OiBhIHByZXZpb3VzbHkgZGVjbGluZWQgZmlsZSBsZWF2ZXMgdGhlIGhvbGRlciBjbGljay10aHJvdWdoLlxuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGltcG9ydGVyIG9uIGEgRmlsZSB0aGUgaG9zdCBwYWdlIGFscmVhZHkgaGFzLCBpbnN0ZWFkIG9mIHRoZSBmaWxlIHBpY2tlci5cbiAgICpcbiAgICogUmVhY2hhYmxlIHRocm91Z2ggYSB0ZW1wbGF0ZSByZWZlcmVuY2UgKGAjaW1wb3J0ZXJgIHRoZW4gYGltcG9ydGVyLm9wZW5Nb2RhbFdpdGhGaWxlKGZpbGUpYClcbiAgICogb3IgYEBWaWV3Q2hpbGQoQ1NWQm94QnV0dG9uQ29tcG9uZW50KWAuXG4gICAqXG4gICAqIFRoZSBGaWxlIGNyb3NzZXMgdG8gdGhlIGlmcmFtZSBieSBzdHJ1Y3R1cmVkIGNsb25lLCBzbyB0aGUgaW1wb3J0ZXIgcmVjZWl2ZXMgdGhlIHJlYWxcbiAgICogb2JqZWN0IGFuZCBhcHBsaWVzIGl0cyBvd24gZXh0ZW5zaW9uLCB3b3Jrc2hlZXQgYW5kIHNpemUgcnVsZXMgdG8gaXQgLS0gdGhpcyBkb2VzIG5vdFxuICAgKiBieXBhc3MgYW55IG9mIHRoZW0uIFBhc3MgYSBGaWxlOyBhIEJsb2IgaGFzIG5vIG5hbWUgZm9yIHRoZSBpbXBvcnRlciB0byByZWFkIGFuXG4gICAqIGV4dGVuc2lvbiBmcm9tLlxuICAgKi9cbiAgb3Blbk1vZGFsV2l0aEZpbGUoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgIGlmKHR5cGVvZiBGaWxlID09PSAndW5kZWZpbmVkJyB8fCAhKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0ZpbGUgPSBmaWxlO1xuXG4gICAgLy8gQWxyZWFkeSBvcGVuOiBoYW5kIGl0IG92ZXIgbm93IHJhdGhlciB0aGFuIGhvbGRpbmcgaXQgZm9yIHRoZSBuZXh0IG9wZW4uIFRoZSBpbXBvcnRlclxuICAgIC8vIHRha2VzIGl0IG9ubHkgd2hpbGUgaXQgaXMgc3RpbGwgb24gdGhlIHVwbG9hZCBzdGVwLCBhbmQgaWdub3JlcyBpdCBvbmNlIHRoZSB1c2VyIGhhcyBhXG4gICAgLy8gZGF0YXNldCBhbmQgYSBtYXBwaW5nIGluIHByb2dyZXNzLlxuICAgIGlmKHRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaWZyYW1lICYmIHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5zZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgfVxuXG4gIGNsZWFyUHJvYmVUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlU2VuZGVyLnJlc2V0KCk7XG4gIH1cblxuICBzdGFydEZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlQWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUFja1RpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2l2ZVVwT25GaWxlKCk7XG4gICAgfSwgRklMRV9BQ0tfVElNRU9VVF9NUyk7XG4gIH1cblxuICBjbGVhckZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWxlQWNrVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbGVBY2tUaW1lcik7XG4gICAgICB0aGlzLmZpbGVBY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGltcG9ydGVyIG5ldmVyIGNvbmZpcm1lZCB0aGUgZmlsZSBpdCB3YXMgc2VudCAoYW4gb3JpZ2luIHdlIGRvIG5vdCB0cnVzdCwgb3IgYW4gaW1wb3J0ZXIgdG9vXG4gIC8vIG9sZCB0byBrbm93IHRoZSBtZXNzYWdlKS4gV2l0aG91dCB0aGlzIHRoZSBob2xkZXIgd291bGQgc3RheSB1cCwgaW52aXNpYmxlIGFuZCBjbGljay10aHJvdWdoLFxuICAvLyBhbmQgdGhlIG90aGVyIGluc3RhbmNlcycgYnV0dG9ucyB3b3VsZCBzdGF5IGRpc2FibGVkIGZvciBnb29kLlxuICBnaXZlVXBPbkZpbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuaG9sZGVyO1xuICAgIGlmIChob2xkZXIpIHtcbiAgICAgIGhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSB0aGUgaW1wb3J0ZXIgZGlkIG5vdCByZXNwb25kIHRvIHRoZSBzdXBwbGllZCBmaWxlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQmxvY2tlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBibG9ja2VkID0gaXNCbG9ja2VkQnlPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAoYmxvY2tlZCAhPT0gdGhpcy5ibG9ja2VkQnlPdGhlcikge1xuICAgICAgLy8gVGhlIHJlZ2lzdHJ5IGNhbiBjYWxsIGJhY2sgZnJvbSBvdXRzaWRlIEFuZ3VsYXIncyB6b25lIChhbm90aGVyIGluc3RhbmNlLCBhbm90aGVyIGFwcCkuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5ibG9ja2VkQnlPdGhlciA9IGJsb2NrZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyKTtcbiAgICAvLyBUYWtlcyB0aGUgaG9sZGVyIG91dCBvZiBkb2N1bWVudC5ib2R5OiBsZWZ0IHRoZXJlLCBpdCB3b3VsZCBrZWVwIGNvdmVyaW5nIHRoZSBwYWdlIHdpdGhcbiAgICAvLyBhbiBpbnZpc2libGUgZnVsbC1zY3JlZW4gbGF5ZXIgdGhhdCBub3RoaW5nIGlzIGxlZnQgdG8gaGlkZS5cbiAgICB0aGlzLmRlc3Ryb3lJbXBvcnRlcigpO1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycykge1xuICAgICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|