@verified-network/verified-custody 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +80 -0
  2. package/dist/assets/icon128.png +0 -0
  3. package/dist/assets/icon16.png +0 -0
  4. package/dist/assets/icon32.png +0 -0
  5. package/dist/assets/icon48.png +0 -0
  6. package/dist/autoreload-bg.1777342b.js +392 -0
  7. package/dist/autoreload.af9e0afa.js +393 -0
  8. package/dist/main.js +2 -0
  9. package/dist/main.js.LICENSE.txt +190 -0
  10. package/dist/manifest.json +39 -0
  11. package/dist/src/scripts/background.js +866 -0
  12. package/dist/src/scripts/content.js +22029 -0
  13. package/dist/src/static/options.b1269179.js +22033 -0
  14. package/dist/src/static/options.html +9 -0
  15. package/dist/src/static/popup.e3c8c7b7.js +22043 -0
  16. package/dist/src/static/popup.html +9 -0
  17. package/dist/webext-prod/assets/icon128.png +0 -0
  18. package/dist/webext-prod/assets/icon16.png +0 -0
  19. package/dist/webext-prod/assets/icon32.png +0 -0
  20. package/dist/webext-prod/assets/icon48.png +0 -0
  21. package/dist/webext-prod/manifest.json +36 -0
  22. package/dist/webext-prod/src/scripts/background.js +2 -0
  23. package/dist/webext-prod/src/scripts/background.js.map +1 -0
  24. package/dist/webext-prod/src/scripts/content.js +35 -0
  25. package/dist/webext-prod/src/scripts/content.js.map +1 -0
  26. package/dist/webext-prod/src/static/options.a111dcd9.js +2 -0
  27. package/dist/webext-prod/src/static/options.a111dcd9.js.map +1 -0
  28. package/dist/webext-prod/src/static/options.html +1 -0
  29. package/dist/webext-prod/src/static/popup.70071e3e.js +35 -0
  30. package/dist/webext-prod/src/static/popup.70071e3e.js.map +1 -0
  31. package/dist/webext-prod/src/static/popup.cc04f56e.js +2 -0
  32. package/dist/webext-prod/src/static/popup.cc04f56e.js.map +1 -0
  33. package/dist/webext-prod/src/static/popup.e8a65b8a.js +35 -0
  34. package/dist/webext-prod/src/static/popup.e8a65b8a.js.map +1 -0
  35. package/dist/webext-prod/src/static/popup.html +1 -0
  36. package/package.json +51 -0
@@ -0,0 +1,393 @@
1
+ // modules are defined as an array
2
+ // [ module function, map of requires ]
3
+ //
4
+ // map of requires is short require name -> numeric require
5
+ //
6
+ // anything defined in a previous bundle is accessed via the
7
+ // orig method which is the require for previous bundles
8
+
9
+ (function(modules, entry, mainEntry, parcelRequireName, globalName) {
10
+ /* eslint-disable no-undef */
11
+ var globalObject =
12
+ typeof globalThis !== 'undefined'
13
+ ? globalThis
14
+ : typeof self !== 'undefined'
15
+ ? self
16
+ : typeof window !== 'undefined'
17
+ ? window
18
+ : typeof global !== 'undefined'
19
+ ? global
20
+ : {};
21
+ /* eslint-enable no-undef */
22
+
23
+ // Save the require from previous bundle to this closure if any
24
+ var previousRequire =
25
+ typeof globalObject[parcelRequireName] === 'function' &&
26
+ globalObject[parcelRequireName];
27
+
28
+ var cache = previousRequire.cache || {};
29
+ // Do not use `require` to prevent Webpack from trying to bundle this call
30
+ var nodeRequire =
31
+ typeof module !== 'undefined' &&
32
+ typeof module.require === 'function' &&
33
+ module.require.bind(module);
34
+
35
+ function newRequire(name, jumped) {
36
+ if (!cache[name]) {
37
+ if (!modules[name]) {
38
+ // if we cannot find the module within our internal map or
39
+ // cache jump to the current global require ie. the last bundle
40
+ // that was added to the page.
41
+ var currentRequire =
42
+ typeof globalObject[parcelRequireName] === 'function' &&
43
+ globalObject[parcelRequireName];
44
+ if (!jumped && currentRequire) {
45
+ return currentRequire(name, true);
46
+ }
47
+
48
+ // If there are other bundles on this page the require from the
49
+ // previous one is saved to 'previousRequire'. Repeat this as
50
+ // many times as there are bundles until the module is found or
51
+ // we exhaust the require chain.
52
+ if (previousRequire) {
53
+ return previousRequire(name, true);
54
+ }
55
+
56
+ // Try the node require function if it exists.
57
+ if (nodeRequire && typeof name === 'string') {
58
+ return nodeRequire(name);
59
+ }
60
+
61
+ var err = new Error("Cannot find module '" + name + "'");
62
+ err.code = 'MODULE_NOT_FOUND';
63
+ throw err;
64
+ }
65
+
66
+ localRequire.resolve = resolve;
67
+ localRequire.cache = {};
68
+
69
+ var module = (cache[name] = new newRequire.Module(name));
70
+
71
+ modules[name][0].call(
72
+ module.exports,
73
+ localRequire,
74
+ module,
75
+ module.exports,
76
+ this,
77
+ );
78
+ }
79
+
80
+ return cache[name].exports;
81
+
82
+ function localRequire(x) {
83
+ return newRequire(localRequire.resolve(x));
84
+ }
85
+
86
+ function resolve(x) {
87
+ return modules[name][1][x] || x;
88
+ }
89
+ }
90
+
91
+ function Module(moduleName) {
92
+ this.id = moduleName;
93
+ this.bundle = newRequire;
94
+ this.exports = {};
95
+ }
96
+
97
+ newRequire.isParcelRequire = true;
98
+ newRequire.Module = Module;
99
+ newRequire.modules = modules;
100
+ newRequire.cache = cache;
101
+ newRequire.parent = previousRequire;
102
+ newRequire.register = function(id, exports) {
103
+ modules[id] = [
104
+ function(require, module) {
105
+ module.exports = exports;
106
+ },
107
+ {},
108
+ ];
109
+ };
110
+
111
+ Object.defineProperty(newRequire, 'root', {
112
+ get: function() {
113
+ return globalObject[parcelRequireName];
114
+ },
115
+ });
116
+
117
+ globalObject[parcelRequireName] = newRequire;
118
+
119
+ for (var i = 0; i < entry.length; i++) {
120
+ newRequire(entry[i]);
121
+ }
122
+
123
+ if (mainEntry) {
124
+ // Expose entry point to Node, AMD or browser globals
125
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
126
+ var mainExports = newRequire(mainEntry);
127
+
128
+ // CommonJS
129
+ if (typeof exports === 'object' && typeof module !== 'undefined') {
130
+ module.exports = mainExports;
131
+
132
+ // RequireJS
133
+ } else if (typeof define === 'function' && define.amd) {
134
+ define(function() {
135
+ return mainExports;
136
+ });
137
+
138
+ // <script>
139
+ } else if (globalName) {
140
+ this[globalName] = mainExports;
141
+ }
142
+ }
143
+ })({"55RhX":[function(require,module,exports) {
144
+ var HMR_HOST = "localhost";
145
+ var HMR_PORT = null;
146
+ var HMR_SECURE = false;
147
+ var HMR_ENV_HASH = "d751713988987e9331980363e24189ce";
148
+ module.bundle.HMR_BUNDLE_ID = "f344c156756277e744aacd87af9e0afa"; // @flow
149
+ /* global HMR_HOST, HMR_PORT, HMR_ENV_HASH, HMR_SECURE */ /*::
150
+ import type {
151
+ HMRAsset,
152
+ HMRMessage,
153
+ } from '@parcel/reporter-dev-server/src/HMRServer.js';
154
+ interface ParcelRequire {
155
+ (string): mixed;
156
+ cache: {|[string]: ParcelModule|};
157
+ hotData: mixed;
158
+ Module: any;
159
+ parent: ?ParcelRequire;
160
+ isParcelRequire: true;
161
+ modules: {|[string]: [Function, {|[string]: string|}]|};
162
+ HMR_BUNDLE_ID: string;
163
+ root: ParcelRequire;
164
+ }
165
+ interface ParcelModule {
166
+ hot: {|
167
+ data: mixed,
168
+ accept(cb: (Function) => void): void,
169
+ dispose(cb: (mixed) => void): void,
170
+ // accept(deps: Array<string> | string, cb: (Function) => void): void,
171
+ // decline(): void,
172
+ _acceptCallbacks: Array<(Function) => void>,
173
+ _disposeCallbacks: Array<(mixed) => void>,
174
+ |};
175
+ }
176
+ declare var module: {bundle: ParcelRequire, ...};
177
+ declare var HMR_HOST: string;
178
+ declare var HMR_PORT: string;
179
+ declare var HMR_ENV_HASH: string;
180
+ declare var HMR_SECURE: boolean;
181
+ */ var OVERLAY_ID = '__parcel__error__overlay__';
182
+ var OldModule = module.bundle.Module;
183
+ function Module(moduleName) {
184
+ OldModule.call(this, moduleName);
185
+ this.hot = {
186
+ data: module.bundle.hotData,
187
+ _acceptCallbacks: [],
188
+ _disposeCallbacks: [],
189
+ accept: function(fn) {
190
+ this._acceptCallbacks.push(fn || function() {
191
+ });
192
+ },
193
+ dispose: function(fn) {
194
+ this._disposeCallbacks.push(fn);
195
+ }
196
+ };
197
+ module.bundle.hotData = undefined;
198
+ }
199
+ module.bundle.Module = Module;
200
+ var checkedAssets/*: {|[string]: boolean|} */ , acceptedAssets/*: {|[string]: boolean|} */ , assetsToAccept/*: Array<[ParcelRequire, string]> */ ;
201
+ function getHostname() {
202
+ return HMR_HOST || (location.protocol.indexOf('http') === 0 ? location.hostname : 'localhost');
203
+ }
204
+ function getPort() {
205
+ return HMR_PORT || location.port;
206
+ }
207
+ // eslint-disable-next-line no-redeclare
208
+ var parent = module.bundle.parent;
209
+ if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') {
210
+ var hostname = getHostname();
211
+ var port = getPort();
212
+ var protocol = HMR_SECURE || location.protocol == 'https:' && !/localhost|127.0.0.1|0.0.0.0/.test(hostname) ? 'wss' : 'ws';
213
+ var ws = new WebSocket(protocol + '://' + hostname + (port ? ':' + port : '') + '/');
214
+ // $FlowFixMe
215
+ ws.onmessage = function(event/*: {data: string, ...} */ ) {
216
+ checkedAssets = {
217
+ };
218
+ acceptedAssets = {
219
+ };
220
+ assetsToAccept = [];
221
+ var data = JSON.parse(event.data);
222
+ if (data.type === 'update') {
223
+ // Remove error overlay if there is one
224
+ removeErrorOverlay();
225
+ let assets = data.assets.filter((asset)=>asset.envHash === HMR_ENV_HASH
226
+ );
227
+ // Handle HMR Update
228
+ var handled = false;
229
+ assets.forEach((asset)=>{
230
+ var didAccept = asset.type === 'css' || asset.type === 'js' && hmrAcceptCheck(module.bundle.root, asset.id, asset.depsByBundle);
231
+ if (didAccept) handled = true;
232
+ });
233
+ if (handled) {
234
+ console.clear();
235
+ assets.forEach(function(asset) {
236
+ hmrApply(module.bundle.root, asset);
237
+ });
238
+ for(var i = 0; i < assetsToAccept.length; i++){
239
+ var id = assetsToAccept[i][1];
240
+ if (!acceptedAssets[id]) hmrAcceptRun(assetsToAccept[i][0], id);
241
+ }
242
+ } else window.location.reload();
243
+ }
244
+ if (data.type === 'error') {
245
+ // Log parcel errors to console
246
+ for (let ansiDiagnostic of data.diagnostics.ansi){
247
+ let stack = ansiDiagnostic.codeframe ? ansiDiagnostic.codeframe : ansiDiagnostic.stack;
248
+ console.error('🚨 [parcel]: ' + ansiDiagnostic.message + '\n' + stack + '\n\n' + ansiDiagnostic.hints.join('\n'));
249
+ }
250
+ // Render the fancy html overlay
251
+ removeErrorOverlay();
252
+ var overlay = createErrorOverlay(data.diagnostics.html);
253
+ // $FlowFixMe
254
+ document.body.appendChild(overlay);
255
+ }
256
+ };
257
+ ws.onerror = function(e) {
258
+ console.error(e.message);
259
+ };
260
+ ws.onclose = function(e) {
261
+ console.warn('[parcel] 🚨 Connection to the HMR server was lost');
262
+ };
263
+ }
264
+ function removeErrorOverlay() {
265
+ var overlay = document.getElementById(OVERLAY_ID);
266
+ if (overlay) {
267
+ overlay.remove();
268
+ console.log('[parcel] ✨ Error resolved');
269
+ }
270
+ }
271
+ function createErrorOverlay(diagnostics) {
272
+ var overlay = document.createElement('div');
273
+ overlay.id = OVERLAY_ID;
274
+ let errorHTML = '<div style="background: black; opacity: 0.85; font-size: 16px; color: white; position: fixed; height: 100%; width: 100%; top: 0px; left: 0px; padding: 30px; font-family: Menlo, Consolas, monospace; z-index: 9999;">';
275
+ for (let diagnostic of diagnostics){
276
+ let stack = diagnostic.codeframe ? diagnostic.codeframe : diagnostic.stack;
277
+ errorHTML += `\n <div>\n <div style="font-size: 18px; font-weight: bold; margin-top: 20px;">\n 🚨 ${diagnostic.message}\n </div>\n <pre>\n ${stack}\n </pre>\n <div>\n ${diagnostic.hints.map((hint)=>'<div>' + hint + '</div>'
278
+ ).join('')}\n </div>\n </div>\n `;
279
+ }
280
+ errorHTML += '</div>';
281
+ overlay.innerHTML = errorHTML;
282
+ return overlay;
283
+ }
284
+ function getParents(bundle, id) /*: Array<[ParcelRequire, string]> */ {
285
+ var modules = bundle.modules;
286
+ if (!modules) return [];
287
+ var parents = [];
288
+ var k, d, dep;
289
+ for(k in modules)for(d in modules[k][1]){
290
+ dep = modules[k][1][d];
291
+ if (dep === id || Array.isArray(dep) && dep[dep.length - 1] === id) parents.push([
292
+ bundle,
293
+ k
294
+ ]);
295
+ }
296
+ if (bundle.parent) parents = parents.concat(getParents(bundle.parent, id));
297
+ return parents;
298
+ }
299
+ function updateLink(link) {
300
+ var newLink = link.cloneNode();
301
+ newLink.onload = function() {
302
+ if (link.parentNode !== null) // $FlowFixMe
303
+ link.parentNode.removeChild(link);
304
+ };
305
+ newLink.setAttribute('href', // $FlowFixMe
306
+ link.getAttribute('href').split('?')[0] + '?' + Date.now());
307
+ // $FlowFixMe
308
+ link.parentNode.insertBefore(newLink, link.nextSibling);
309
+ }
310
+ var cssTimeout = null;
311
+ function reloadCSS() {
312
+ if (cssTimeout) return;
313
+ cssTimeout = setTimeout(function() {
314
+ var links = document.querySelectorAll('link[rel="stylesheet"]');
315
+ for(var i = 0; i < links.length; i++){
316
+ // $FlowFixMe[incompatible-type]
317
+ var href = links[i].getAttribute('href');
318
+ var hostname = getHostname();
319
+ var servedFromHMRServer = hostname === 'localhost' ? new RegExp('^(https?:\\/\\/(0.0.0.0|127.0.0.1)|localhost):' + getPort()).test(href) : href.indexOf(hostname + ':' + getPort());
320
+ var absolute = /^https?:\/\//i.test(href) && href.indexOf(window.location.origin) !== 0 && !servedFromHMRServer;
321
+ if (!absolute) updateLink(links[i]);
322
+ }
323
+ cssTimeout = null;
324
+ }, 50);
325
+ }
326
+ function hmrApply(bundle/*: ParcelRequire */ , asset/*: HMRAsset */ ) {
327
+ var modules = bundle.modules;
328
+ if (!modules) return;
329
+ if (asset.type === 'css') {
330
+ reloadCSS();
331
+ return;
332
+ }
333
+ let deps = asset.depsByBundle[bundle.HMR_BUNDLE_ID];
334
+ if (deps) {
335
+ var fn = new Function('require', 'module', 'exports', asset.output);
336
+ modules[asset.id] = [
337
+ fn,
338
+ deps
339
+ ];
340
+ } else if (bundle.parent) hmrApply(bundle.parent, asset);
341
+ }
342
+ function hmrAcceptCheck(bundle/*: ParcelRequire */ , id/*: string */ , depsByBundle/*: ?{ [string]: { [string]: string } }*/ ) {
343
+ var modules = bundle.modules;
344
+ if (!modules) return;
345
+ if (depsByBundle && !depsByBundle[bundle.HMR_BUNDLE_ID]) {
346
+ // If we reached the root bundle without finding where the asset should go,
347
+ // there's nothing to do. Mark as "accepted" so we don't reload the page.
348
+ if (!bundle.parent) return true;
349
+ return hmrAcceptCheck(bundle.parent, id, depsByBundle);
350
+ }
351
+ if (checkedAssets[id]) return;
352
+ checkedAssets[id] = true;
353
+ var cached = bundle.cache[id];
354
+ assetsToAccept.push([
355
+ bundle,
356
+ id
357
+ ]);
358
+ if (cached && cached.hot && cached.hot._acceptCallbacks.length) return true;
359
+ return getParents(module.bundle.root, id).some(function(v) {
360
+ return hmrAcceptCheck(v[0], v[1], null);
361
+ });
362
+ }
363
+ function hmrAcceptRun(bundle/*: ParcelRequire */ , id/*: string */ ) {
364
+ var cached = bundle.cache[id];
365
+ bundle.hotData = {
366
+ };
367
+ if (cached && cached.hot) cached.hot.data = bundle.hotData;
368
+ if (cached && cached.hot && cached.hot._disposeCallbacks.length) cached.hot._disposeCallbacks.forEach(function(cb) {
369
+ cb(bundle.hotData);
370
+ });
371
+ delete bundle.cache[id];
372
+ bundle(id);
373
+ cached = bundle.cache[id];
374
+ if (cached && cached.hot && cached.hot._acceptCallbacks.length) cached.hot._acceptCallbacks.forEach(function(cb) {
375
+ var assetsToAlsoAccept = cb(function() {
376
+ return getParents(module.bundle.root, id);
377
+ });
378
+ if (assetsToAlsoAccept && assetsToAccept.length) assetsToAccept.push.apply(assetsToAccept, assetsToAlsoAccept);
379
+ });
380
+ acceptedAssets[id] = true;
381
+ }
382
+
383
+ },{}],"48PW8":[function(require,module,exports) {
384
+ "use strict";
385
+ /* global window */ window.addEventListener('beforeunload', function() {
386
+ (window.chrome || window.browser).runtime.sendMessage({
387
+ __parcel_hmr_reload__: true
388
+ });
389
+ });
390
+
391
+ },{}]},["55RhX","48PW8"], "48PW8", "parcelRequire5c9f")
392
+
393
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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R0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sVUFBVSxFQUFFO1lBQ3pDLGtCQUFrQixHQUFHLEVBQUU7bUJBQ2xCLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFOztZQUV0QyxrQkFBa0IsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUM3QyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsa0JBQWtCOztJQUlsRSxjQUFjLENBQUMsRUFBRSxJQUFJLElBQUk7Ozs7Q0M3VzNCLFVBQVk7QUFFWixFQUFBLGVBQUEsRUFBbUIsQ0FDbkIsTUFBTSxDQUFDLGdCQUFnQixFQUFDLFlBQWM7S0FDbkMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ25ELHFCQUFxQixFQUFFLElBQUkiLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9AcGFyY2VsL2NvbmZpZy13ZWJleHRlbnNpb24vbm9kZV9tb2R1bGVzL0BwYXJjZWwvcnVudGltZS1icm93c2VyLWhtci9saWIvcnVudGltZS0wYTYwNmY2M2Y0OGFmMjMyZDFjNjYyYmUxMzRkY2VhOS5qcyIsIm5vZGVfbW9kdWxlcy9AcGFyY2VsL3RyYW5zZm9ybWVyLXdlYmV4dGVuc2lvbi9saWIvcnVudGltZS9hdXRvcmVsb2FkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBITVJfSE9TVCA9IFwibG9jYWxob3N0XCI7dmFyIEhNUl9QT1JUID0gbnVsbDt2YXIgSE1SX1NFQ1VSRSA9IGZhbHNlO3ZhciBITVJfRU5WX0hBU0ggPSBcImQ3NTE3MTM5ODg5ODdlOTMzMTk4MDM2M2UyNDE4OWNlXCI7bW9kdWxlLmJ1bmRsZS5ITVJfQlVORExFX0lEID0gXCJmMzQ0YzE1Njc1NjI3N2U3NDRhYWNkODdhZjllMGFmYVwiOy8vIEBmbG93XG4vKiBnbG9iYWwgSE1SX0hPU1QsIEhNUl9QT1JULCBITVJfRU5WX0hBU0gsIEhNUl9TRUNVUkUgKi9cblxuLyo6OlxuaW1wb3J0IHR5cGUge1xuICBITVJBc3NldCxcbiAgSE1STWVzc2FnZSxcbn0gZnJvbSAnQHBhcmNlbC9yZXBvcnRlci1kZXYtc2VydmVyL3NyYy9ITVJTZXJ2ZXIuanMnO1xuaW50ZXJmYWNlIFBhcmNlbFJlcXVpcmUge1xuICAoc3RyaW5nKTogbWl4ZWQ7XG4gIGNhY2hlOiB7fFtzdHJpbmddOiBQYXJjZWxNb2R1bGV8fTtcbiAgaG90RGF0YTogbWl4ZWQ7XG4gIE1vZHVsZTogYW55O1xuICBwYXJlbnQ6ID9QYXJjZWxSZXF1aXJlO1xuICBpc1BhcmNlbFJlcXVpcmU6IHRydWU7XG4gIG1vZHVsZXM6IHt8W3N0cmluZ106IFtGdW5jdGlvbiwge3xbc3RyaW5nXTogc3RyaW5nfH1dfH07XG4gIEhNUl9CVU5ETEVfSUQ6IHN0cmluZztcbiAgcm9vdDogUGFyY2VsUmVxdWlyZTtcbn1cbmludGVyZmFjZSBQYXJjZWxNb2R1bGUge1xuICBob3Q6IHt8XG4gICAgZGF0YTogbWl4ZWQsXG4gICAgYWNjZXB0KGNiOiAoRnVuY3Rpb24pID0+IHZvaWQpOiB2b2lkLFxuICAgIGRpc3Bvc2UoY2I6IChtaXhlZCkgPT4gdm9pZCk6IHZvaWQsXG4gICAgLy8gYWNjZXB0KGRlcHM6IEFycmF5PHN0cmluZz4gfCBzdHJpbmcsIGNiOiAoRnVuY3Rpb24pID0+IHZvaWQpOiB2b2lkLFxuICAgIC8vIGRlY2xpbmUoKTogdm9pZCxcbiAgICBfYWNjZXB0Q2FsbGJhY2tzOiBBcnJheTwoRnVuY3Rpb24pID0+IHZvaWQ+LFxuICAgIF9kaXNwb3NlQ2FsbGJhY2tzOiBBcnJheTwobWl4ZWQpID0+IHZvaWQ+LFxuICB8fTtcbn1cbmRlY2xhcmUgdmFyIG1vZHVsZToge2J1bmRsZTogUGFyY2VsUmVxdWlyZSwgLi4ufTtcbmRlY2xhcmUgdmFyIEhNUl9IT1NUOiBzdHJpbmc7XG5kZWNsYXJlIHZhciBITVJfUE9SVDogc3RyaW5nO1xuZGVjbGFyZSB2YXIgSE1SX0VOVl9IQVNIOiBzdHJpbmc7XG5kZWNsYXJlIHZhciBITVJfU0VDVVJFOiBib29sZWFuO1xuKi9cblxudmFyIE9WRVJMQVlfSUQgPSAnX19wYXJjZWxfX2Vycm9yX19vdmVybGF5X18nO1xuXG52YXIgT2xkTW9kdWxlID0gbW9kdWxlLmJ1bmRsZS5Nb2R1bGU7XG5cbmZ1bmN0aW9uIE1vZHVsZShtb2R1bGVOYW1lKSB7XG4gIE9sZE1vZHVsZS5jYWxsKHRoaXMsIG1vZHVsZU5hbWUpO1xuICB0aGlzLmhvdCA9IHtcbiAgICBkYXRhOiBtb2R1bGUuYnVuZGxlLmhvdERhdGEsXG4gICAgX2FjY2VwdENhbGxiYWNrczogW10sXG4gICAgX2Rpc3Bvc2VDYWxsYmFja3M6IFtdLFxuICAgIGFjY2VwdDogZnVuY3Rpb24oZm4pIHtcbiAgICAgIHRoaXMuX2FjY2VwdENhbGxiYWNrcy5wdXNoKGZuIHx8IGZ1bmN0aW9uKCkge30pO1xuICAgIH0sXG4gICAgZGlzcG9zZTogZnVuY3Rpb24oZm4pIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2VDYWxsYmFja3MucHVzaChmbik7XG4gICAgfSxcbiAgfTtcbiAgbW9kdWxlLmJ1bmRsZS5ob3REYXRhID0gdW5kZWZpbmVkO1xufVxubW9kdWxlLmJ1bmRsZS5Nb2R1bGUgPSBNb2R1bGU7XG5cbnZhciBjaGVja2VkQXNzZXRzIC8qOiB7fFtzdHJpbmddOiBib29sZWFufH0gKi8sXG4gIGFjY2VwdGVkQXNzZXRzIC8qOiB7fFtzdHJpbmddOiBib29sZWFufH0gKi8sXG4gIGFzc2V0c1RvQWNjZXB0IC8qOiBBcnJheTxbUGFyY2VsUmVxdWlyZSwgc3RyaW5nXT4gKi87XG5cbmZ1bmN0aW9uIGdldEhvc3RuYW1lKCkge1xuICByZXR1cm4gKFxuICAgIEhNUl9IT1NUIHx8XG4gICAgKGxvY2F0aW9uLnByb3RvY29sLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCA/IGxvY2F0aW9uLmhvc3RuYW1lIDogJ2xvY2FsaG9zdCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFBvcnQoKSB7XG4gIHJldHVybiBITVJfUE9SVCB8fCBsb2NhdGlvbi5wb3J0O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG52YXIgcGFyZW50ID0gbW9kdWxlLmJ1bmRsZS5wYXJlbnQ7XG5pZiAoKCFwYXJlbnQgfHwgIXBhcmVudC5pc1BhcmNlbFJlcXVpcmUpICYmIHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gIHZhciBob3N0bmFtZSA9IGdldEhvc3RuYW1lKCk7XG4gIHZhciBwb3J0ID0gZ2V0UG9ydCgpO1xuICB2YXIgcHJvdG9jb2wgPVxuICAgIEhNUl9TRUNVUkUgfHxcbiAgICAobG9jYXRpb24ucHJvdG9jb2wgPT0gJ2h0dHBzOicgJiZcbiAgICAgICEvbG9jYWxob3N0fDEyNy4wLjAuMXwwLjAuMC4wLy50ZXN0KGhvc3RuYW1lKSlcbiAgICAgID8gJ3dzcydcbiAgICAgIDogJ3dzJztcbiAgdmFyIHdzID0gbmV3IFdlYlNvY2tldChcbiAgICBwcm90b2NvbCArICc6Ly8nICsgaG9zdG5hbWUgKyAocG9ydCA/ICc6JyArIHBvcnQgOiAnJykgKyAnLycsXG4gICk7XG4gIC8vICRGbG93Rml4TWVcbiAgd3Mub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQgLyo6IHtkYXRhOiBzdHJpbmcsIC4uLn0gKi8pIHtcbiAgICBjaGVja2VkQXNzZXRzID0gKHt9IC8qOiB7fFtzdHJpbmddOiBib29sZWFufH0gKi8pO1xuICAgIGFjY2VwdGVkQXNzZXRzID0gKHt9IC8qOiB7fFtzdHJpbmddOiBib29sZWFufH0gKi8pO1xuICAgIGFzc2V0c1RvQWNjZXB0ID0gW107XG5cbiAgICB2YXIgZGF0YSAvKjogSE1STWVzc2FnZSAqLyA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAndXBkYXRlJykge1xuICAgICAgLy8gUmVtb3ZlIGVycm9yIG92ZXJsYXkgaWYgdGhlcmUgaXMgb25lXG4gICAgICByZW1vdmVFcnJvck92ZXJsYXkoKTtcblxuICAgICAgbGV0IGFzc2V0cyA9IGRhdGEuYXNzZXRzLmZpbHRlcihhc3NldCA9PiBhc3NldC5lbnZIYXNoID09PSBITVJfRU5WX0hBU0gpO1xuXG4gICAgICAvLyBIYW5kbGUgSE1SIFVwZGF0ZVxuICAgICAgdmFyIGhhbmRsZWQgPSBmYWxzZTtcbiAgICAgIGFzc2V0cy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgICAgdmFyIGRpZEFjY2VwdCA9XG4gICAgICAgICAgYXNzZXQudHlwZSA9PT0gJ2NzcycgfHxcbiAgICAgICAgICAoYXNzZXQudHlwZSA9PT0gJ2pzJyAmJlxuICAgICAgICAgICAgaG1yQWNjZXB0Q2hlY2sobW9kdWxlLmJ1bmRsZS5yb290LCBhc3NldC5pZCwgYXNzZXQuZGVwc0J5QnVuZGxlKSk7XG4gICAgICAgIGlmIChkaWRBY2NlcHQpIHtcbiAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIGNvbnNvbGUuY2xlYXIoKTtcblxuICAgICAgICBhc3NldHMuZm9yRWFjaChmdW5jdGlvbihhc3NldCkge1xuICAgICAgICAgIGhtckFwcGx5KG1vZHVsZS5idW5kbGUucm9vdCwgYXNzZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzc2V0c1RvQWNjZXB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGlkID0gYXNzZXRzVG9BY2NlcHRbaV1bMV07XG4gICAgICAgICAgaWYgKCFhY2NlcHRlZEFzc2V0c1tpZF0pIHtcbiAgICAgICAgICAgIGhtckFjY2VwdFJ1bihhc3NldHNUb0FjY2VwdFtpXVswXSwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIExvZyBwYXJjZWwgZXJyb3JzIHRvIGNvbnNvbGVcbiAgICAgIGZvciAobGV0IGFuc2lEaWFnbm9zdGljIG9mIGRhdGEuZGlhZ25vc3RpY3MuYW5zaSkge1xuICAgICAgICBsZXQgc3RhY2sgPSBhbnNpRGlhZ25vc3RpYy5jb2RlZnJhbWVcbiAgICAgICAgICA/IGFuc2lEaWFnbm9zdGljLmNvZGVmcmFtZVxuICAgICAgICAgIDogYW5zaURpYWdub3N0aWMuc3RhY2s7XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAn8J+aqCBbcGFyY2VsXTogJyArXG4gICAgICAgICAgICBhbnNpRGlhZ25vc3RpYy5tZXNzYWdlICtcbiAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgIHN0YWNrICtcbiAgICAgICAgICAgICdcXG5cXG4nICtcbiAgICAgICAgICAgIGFuc2lEaWFnbm9zdGljLmhpbnRzLmpvaW4oJ1xcbicpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW5kZXIgdGhlIGZhbmN5IGh0bWwgb3ZlcmxheVxuICAgICAgcmVtb3ZlRXJyb3JPdmVybGF5KCk7XG4gICAgICB2YXIgb3ZlcmxheSA9IGNyZWF0ZUVycm9yT3ZlcmxheShkYXRhLmRpYWdub3N0aWNzLmh0bWwpO1xuICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgICB9XG4gIH07XG4gIHdzLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO1xuICB9O1xuICB3cy5vbmNsb3NlID0gZnVuY3Rpb24oZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5QQVJDRUxfQlVJTERfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3BhcmNlbF0g8J+aqCBDb25uZWN0aW9uIHRvIHRoZSBITVIgc2VydmVyIHdhcyBsb3N0Jyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZW1vdmVFcnJvck92ZXJsYXkoKSB7XG4gIHZhciBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoT1ZFUkxBWV9JRCk7XG4gIGlmIChvdmVybGF5KSB7XG4gICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICBjb25zb2xlLmxvZygnW3BhcmNlbF0g4pyoIEVycm9yIHJlc29sdmVkJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JPdmVybGF5KGRpYWdub3N0aWNzKSB7XG4gIHZhciBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSBPVkVSTEFZX0lEO1xuXG4gIGxldCBlcnJvckhUTUwgPVxuICAgICc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDogYmxhY2s7IG9wYWNpdHk6IDAuODU7IGZvbnQtc2l6ZTogMTZweDsgY29sb3I6IHdoaXRlOyBwb3NpdGlvbjogZml4ZWQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDMwcHg7IGZvbnQtZmFtaWx5OiBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZTsgei1pbmRleDogOTk5OTtcIj4nO1xuXG4gIGZvciAobGV0IGRpYWdub3N0aWMgb2YgZGlhZ25vc3RpY3MpIHtcbiAgICBsZXQgc3RhY2sgPSBkaWFnbm9zdGljLmNvZGVmcmFtZSA/IGRpYWdub3N0aWMuY29kZWZyYW1lIDogZGlhZ25vc3RpYy5zdGFjaztcblxuICAgIGVycm9ySFRNTCArPSBgXG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICAgICAgICDwn5qoICR7ZGlhZ25vc3RpYy5tZXNzYWdlfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHByZT5cbiAgICAgICAgICAke3N0YWNrfVxuICAgICAgICA8L3ByZT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAke2RpYWdub3N0aWMuaGludHMubWFwKGhpbnQgPT4gJzxkaXY+JyArIGhpbnQgKyAnPC9kaXY+Jykuam9pbignJyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIGVycm9ySFRNTCArPSAnPC9kaXY+JztcblxuICBvdmVybGF5LmlubmVySFRNTCA9IGVycm9ySFRNTDtcblxuICByZXR1cm4gb3ZlcmxheTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50cyhidW5kbGUsIGlkKSAvKjogQXJyYXk8W1BhcmNlbFJlcXVpcmUsIHN0cmluZ10+ICovIHtcbiAgdmFyIG1vZHVsZXMgPSBidW5kbGUubW9kdWxlcztcbiAgaWYgKCFtb2R1bGVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIHBhcmVudHMgPSBbXTtcbiAgdmFyIGssIGQsIGRlcDtcblxuICBmb3IgKGsgaW4gbW9kdWxlcykge1xuICAgIGZvciAoZCBpbiBtb2R1bGVzW2tdWzFdKSB7XG4gICAgICBkZXAgPSBtb2R1bGVzW2tdWzFdW2RdO1xuXG4gICAgICBpZiAoZGVwID09PSBpZCB8fCAoQXJyYXkuaXNBcnJheShkZXApICYmIGRlcFtkZXAubGVuZ3RoIC0gMV0gPT09IGlkKSkge1xuICAgICAgICBwYXJlbnRzLnB1c2goW2J1bmRsZSwga10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChidW5kbGUucGFyZW50KSB7XG4gICAgcGFyZW50cyA9IHBhcmVudHMuY29uY2F0KGdldFBhcmVudHMoYnVuZGxlLnBhcmVudCwgaWQpKTtcbiAgfVxuXG4gIHJldHVybiBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW5rKGxpbmspIHtcbiAgdmFyIG5ld0xpbmsgPSBsaW5rLmNsb25lTm9kZSgpO1xuICBuZXdMaW5rLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChsaW5rLnBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICB9XG4gIH07XG4gIG5ld0xpbmsuc2V0QXR0cmlidXRlKFxuICAgICdocmVmJyxcbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zcGxpdCgnPycpWzBdICsgJz8nICsgRGF0ZS5ub3coKSxcbiAgKTtcbiAgLy8gJEZsb3dGaXhNZVxuICBsaW5rLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0xpbmssIGxpbmsubmV4dFNpYmxpbmcpO1xufVxuXG52YXIgY3NzVGltZW91dCA9IG51bGw7XG5mdW5jdGlvbiByZWxvYWRDU1MoKSB7XG4gIGlmIChjc3NUaW1lb3V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY3NzVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9XCJzdHlsZXNoZWV0XCJdJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV1cbiAgICAgIHZhciBocmVmIC8qOiBzdHJpbmcgKi8gPSBsaW5rc1tpXS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgIHZhciBob3N0bmFtZSA9IGdldEhvc3RuYW1lKCk7XG4gICAgICB2YXIgc2VydmVkRnJvbUhNUlNlcnZlciA9XG4gICAgICAgIGhvc3RuYW1lID09PSAnbG9jYWxob3N0J1xuICAgICAgICAgID8gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgJ14oaHR0cHM/OlxcXFwvXFxcXC8oMC4wLjAuMHwxMjcuMC4wLjEpfGxvY2FsaG9zdCk6JyArIGdldFBvcnQoKSxcbiAgICAgICAgICAgICkudGVzdChocmVmKVxuICAgICAgICAgIDogaHJlZi5pbmRleE9mKGhvc3RuYW1lICsgJzonICsgZ2V0UG9ydCgpKTtcbiAgICAgIHZhciBhYnNvbHV0ZSA9XG4gICAgICAgIC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QoaHJlZikgJiZcbiAgICAgICAgaHJlZi5pbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pICE9PSAwICYmXG4gICAgICAgICFzZXJ2ZWRGcm9tSE1SU2VydmVyO1xuICAgICAgaWYgKCFhYnNvbHV0ZSkge1xuICAgICAgICB1cGRhdGVMaW5rKGxpbmtzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjc3NUaW1lb3V0ID0gbnVsbDtcbiAgfSwgNTApO1xufVxuXG5mdW5jdGlvbiBobXJBcHBseShidW5kbGUgLyo6IFBhcmNlbFJlcXVpcmUgKi8sIGFzc2V0IC8qOiAgSE1SQXNzZXQgKi8pIHtcbiAgdmFyIG1vZHVsZXMgPSBidW5kbGUubW9kdWxlcztcbiAgaWYgKCFtb2R1bGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFzc2V0LnR5cGUgPT09ICdjc3MnKSB7XG4gICAgcmVsb2FkQ1NTKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGRlcHMgPSBhc3NldC5kZXBzQnlCdW5kbGVbYnVuZGxlLkhNUl9CVU5ETEVfSURdO1xuICBpZiAoZGVwcykge1xuICAgIHZhciBmbiA9IG5ldyBGdW5jdGlvbigncmVxdWlyZScsICdtb2R1bGUnLCAnZXhwb3J0cycsIGFzc2V0Lm91dHB1dCk7XG4gICAgbW9kdWxlc1thc3NldC5pZF0gPSBbZm4sIGRlcHNdO1xuICB9IGVsc2UgaWYgKGJ1bmRsZS5wYXJlbnQpIHtcbiAgICBobXJBcHBseShidW5kbGUucGFyZW50LCBhc3NldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaG1yQWNjZXB0Q2hlY2soXG4gIGJ1bmRsZSAvKjogUGFyY2VsUmVxdWlyZSAqLyxcbiAgaWQgLyo6IHN0cmluZyAqLyxcbiAgZGVwc0J5QnVuZGxlIC8qOiA/eyBbc3RyaW5nXTogeyBbc3RyaW5nXTogc3RyaW5nIH0gfSovLFxuKSB7XG4gIHZhciBtb2R1bGVzID0gYnVuZGxlLm1vZHVsZXM7XG4gIGlmICghbW9kdWxlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChkZXBzQnlCdW5kbGUgJiYgIWRlcHNCeUJ1bmRsZVtidW5kbGUuSE1SX0JVTkRMRV9JRF0pIHtcbiAgICAvLyBJZiB3ZSByZWFjaGVkIHRoZSByb290IGJ1bmRsZSB3aXRob3V0IGZpbmRpbmcgd2hlcmUgdGhlIGFzc2V0IHNob3VsZCBnbyxcbiAgICAvLyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uIE1hcmsgYXMgXCJhY2NlcHRlZFwiIHNvIHdlIGRvbid0IHJlbG9hZCB0aGUgcGFnZS5cbiAgICBpZiAoIWJ1bmRsZS5wYXJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBobXJBY2NlcHRDaGVjayhidW5kbGUucGFyZW50LCBpZCwgZGVwc0J5QnVuZGxlKTtcbiAgfVxuXG4gIGlmIChjaGVja2VkQXNzZXRzW2lkXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoZWNrZWRBc3NldHNbaWRdID0gdHJ1ZTtcblxuICB2YXIgY2FjaGVkID0gYnVuZGxlLmNhY2hlW2lkXTtcblxuICBhc3NldHNUb0FjY2VwdC5wdXNoKFtidW5kbGUsIGlkXSk7XG5cbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQuaG90ICYmIGNhY2hlZC5ob3QuX2FjY2VwdENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZXRQYXJlbnRzKG1vZHVsZS5idW5kbGUucm9vdCwgaWQpLnNvbWUoZnVuY3Rpb24odikge1xuICAgIHJldHVybiBobXJBY2NlcHRDaGVjayh2WzBdLCB2WzFdLCBudWxsKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhtckFjY2VwdFJ1bihidW5kbGUgLyo6IFBhcmNlbFJlcXVpcmUgKi8sIGlkIC8qOiBzdHJpbmcgKi8pIHtcbiAgdmFyIGNhY2hlZCA9IGJ1bmRsZS5jYWNoZVtpZF07XG4gIGJ1bmRsZS5ob3REYXRhID0ge307XG4gIGlmIChjYWNoZWQgJiYgY2FjaGVkLmhvdCkge1xuICAgIGNhY2hlZC5ob3QuZGF0YSA9IGJ1bmRsZS5ob3REYXRhO1xuICB9XG5cbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQuaG90ICYmIGNhY2hlZC5ob3QuX2Rpc3Bvc2VDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgY2FjaGVkLmhvdC5fZGlzcG9zZUNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNiKSB7XG4gICAgICBjYihidW5kbGUuaG90RGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGUgYnVuZGxlLmNhY2hlW2lkXTtcbiAgYnVuZGxlKGlkKTtcblxuICBjYWNoZWQgPSBidW5kbGUuY2FjaGVbaWRdO1xuICBpZiAoY2FjaGVkICYmIGNhY2hlZC5ob3QgJiYgY2FjaGVkLmhvdC5fYWNjZXB0Q2FsbGJhY2tzLmxlbmd0aCkge1xuICAgIGNhY2hlZC5ob3QuX2FjY2VwdENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNiKSB7XG4gICAgICB2YXIgYXNzZXRzVG9BbHNvQWNjZXB0ID0gY2IoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJlbnRzKG1vZHVsZS5idW5kbGUucm9vdCwgaWQpO1xuICAgICAgfSk7XG4gICAgICBpZiAoYXNzZXRzVG9BbHNvQWNjZXB0ICYmIGFzc2V0c1RvQWNjZXB0Lmxlbmd0aCkge1xuICAgICAgICBhc3NldHNUb0FjY2VwdC5wdXNoLmFwcGx5KGFzc2V0c1RvQWNjZXB0LCBhc3NldHNUb0Fsc29BY2NlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGFjY2VwdGVkQXNzZXRzW2lkXSA9IHRydWU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyogZ2xvYmFsIHdpbmRvdyAqL1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgKHdpbmRvdy5jaHJvbWUgfHwgd2luZG93LmJyb3dzZXIpLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgIF9fcGFyY2VsX2htcl9yZWxvYWRfXzogdHJ1ZVxuICB9KTtcbn0pOyJdLCJuYW1lcyI6W10sInZlcnNpb24iOjMsImZpbGUiOiJhdXRvcmVsb2FkLkhBU0hfUkVGX2YzNDRjMTU2NzU2Mjc3ZTc0NGFhY2Q4N2FmOWUwYWZhLmpzLm1hcCJ9