UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

259 lines (257 loc) 27.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.DuckDBWasmAdapter = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _duckdbWasm = _interopRequireWildcard(require("@duckdb/duckdb-wasm")); var duckdb = _duckdbWasm; var _perf = require("../utils/perf"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project var Connection = /*#__PURE__*/function () { function Connection(connection) { (0, _classCallCheck2["default"])(this, Connection); (0, _defineProperty2["default"])(this, "connection", void 0); this.connection = connection; } return (0, _createClass2["default"])(Connection, [{ key: "query", value: function () { var _query = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(statement) { return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: return _context.abrupt("return", this.connection.query(statement)); case 1: case "end": return _context.stop(); } }, _callee, this); })); function query(_x) { return _query.apply(this, arguments); } return query; }() }, { key: "insertArrowTable", value: function () { var _insertArrowTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(arrowTable, params) { return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return this.connection.insertArrowTable(arrowTable, params); case 2: case "end": return _context2.stop(); } }, _callee2, this); })); function insertArrowTable(_x2, _x3) { return _insertArrowTable.apply(this, arguments); } return insertArrowTable; }() }, { key: "close", value: function () { var _close = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() { return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return this.connection.close(); case 2: case "end": return _context3.stop(); } }, _callee3, this); })); function close() { return _close.apply(this, arguments); } return close; }() }]); }(); var DuckDBWasmAdapter = exports.DuckDBWasmAdapter = /*#__PURE__*/function () { function DuckDBWasmAdapter(options) { (0, _classCallCheck2["default"])(this, DuckDBWasmAdapter); (0, _defineProperty2["default"])(this, "duckDB", void 0); // pass existing AsyncDuckDB object created elsewhere if (options instanceof Promise || options instanceof _duckdbWasm.AsyncDuckDB) { this.duckDB = options; return; } // or create a new AsyncDuckDB object var _ref = options || {}, _ref$debug = _ref.debug, debug = _ref$debug === void 0 ? false : _ref$debug, config = _ref.config; this.duckDB = initializeDuckDbWasm(config, debug); } return (0, _createClass2["default"])(DuckDBWasmAdapter, [{ key: "connect", value: function () { var _connect = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() { var db, c; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return this.duckDB; case 2: db = _context4.sent; _context4.next = 5; return db.connect(); case 5: c = _context4.sent; return _context4.abrupt("return", new Connection(c)); case 7: case "end": return _context4.stop(); } }, _callee4, this); })); function connect() { return _connect.apply(this, arguments); } return connect; }() }, { key: "registerFileText", value: function () { var _registerFileText = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(filename, content) { var db; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return this.duckDB; case 2: db = _context5.sent; _context5.next = 5; return db.registerFileText(filename, content); case 5: case "end": return _context5.stop(); } }, _callee5, this); })); function registerFileText(_x4, _x5) { return _registerFileText.apply(this, arguments); } return registerFileText; }() }, { key: "registerFileHandle", value: function () { var _registerFileHandle = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(name, handle, protocol, directIO) { var db; return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: _context6.next = 2; return this.duckDB; case 2: db = _context6.sent; _context6.next = 5; return db.registerFileHandle(name, handle, protocol, directIO); case 5: case "end": return _context6.stop(); } }, _callee6, this); })); function registerFileHandle(_x6, _x7, _x8, _x9) { return _registerFileHandle.apply(this, arguments); } return registerFileHandle; }() }]); }(); /** * Initialize DuckDB with a browser-specific Wasm bundle. */ var initializeDuckDbWasm = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(config, debug) { var start, JSDELIVR_BUNDLES, bundle, worker_url, worker, logger, db, res, buffer, fileNameMatch; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: start = performance.now(); // Select a bundle based on browser checks JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles(); _context7.next = 4; return duckdb.selectBundle(JSDELIVR_BUNDLES); case 4: bundle = _context7.sent; if (bundle.mainWorker) { _context7.next = 7; break; } throw new Error('Failed to initialize DuckDB'); case 7: worker_url = URL.createObjectURL(new Blob(["importScripts(\"".concat(bundle.mainWorker, "\");")], { type: 'text/javascript' })); // Instantiate the async version of DuckDB-wasm worker = new Worker(worker_url); logger = debug ? new duckdb.ConsoleLogger() : new duckdb.VoidLogger(); db = new _duckdbWasm.AsyncDuckDB(logger, worker); _context7.next = 13; return db.instantiate(bundle.mainModule, bundle.pthreadWorker); case 13: URL.revokeObjectURL(worker_url); if (!config) { _context7.next = 28; break; } if (!config.path) { _context7.next = 26; break; } _context7.next = 18; return fetch(config.path); case 18: res = _context7.sent; _context7.next = 21; return res.arrayBuffer(); case 21: buffer = _context7.sent; fileNameMatch = config.path.match(/[^/]*$/); if (fileNameMatch) { config.path = fileNameMatch[0]; } _context7.next = 26; return db.registerFileBuffer(config.path, new Uint8Array(buffer)); case 26: _context7.next = 28; return db.open(config); case 28: if (debug) { (0, _perf.logElapsedTime)('DuckDB initialized', start); if (config) { console.debug("DuckDbConfig: ".concat(JSON.stringify(config, null, 2))); } } return _context7.abrupt("return", db); case 30: case "end": return _context7.stop(); } }, _callee7); })); return function initializeDuckDbWasm(_x10, _x11) { return _ref2.apply(this, arguments); }; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZHVja2RiV2FzbSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsImR1Y2tkYiIsIl9wZXJmIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQ29ubmVjdGlvbiIsImNvbm5lY3Rpb24iLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsIl9xdWVyeSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwic3RhdGVtZW50Iiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImFicnVwdCIsInF1ZXJ5Iiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5zZXJ0QXJyb3dUYWJsZSIsIl9jYWxsZWUyIiwiYXJyb3dUYWJsZSIsInBhcmFtcyIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImluc2VydEFycm93VGFibGUiLCJfeDIiLCJfeDMiLCJfY2xvc2UiLCJfY2FsbGVlMyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsImNsb3NlIiwiRHVja0RCV2FzbUFkYXB0ZXIiLCJleHBvcnRzIiwib3B0aW9ucyIsIlByb21pc2UiLCJBc3luY0R1Y2tEQiIsImR1Y2tEQiIsIl9yZWYiLCJfcmVmJGRlYnVnIiwiZGVidWciLCJjb25maWciLCJpbml0aWFsaXplRHVja0RiV2FzbSIsIl9jb25uZWN0IiwiX2NhbGxlZTQiLCJkYiIsImMiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJzZW50IiwiY29ubmVjdCIsIl9yZWdpc3RlckZpbGVUZXh0IiwiX2NhbGxlZTUiLCJmaWxlbmFtZSIsImNvbnRlbnQiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJyZWdpc3RlckZpbGVUZXh0IiwiX3g0IiwiX3g1IiwiX3JlZ2lzdGVyRmlsZUhhbmRsZSIsIl9jYWxsZWU2IiwibmFtZSIsImhhbmRsZSIsInByb3RvY29sIiwiZGlyZWN0SU8iLCJfY2FsbGVlNiQiLCJfY29udGV4dDYiLCJyZWdpc3RlckZpbGVIYW5kbGUiLCJfeDYiLCJfeDciLCJfeDgiLCJfeDkiLCJfcmVmMiIsIl9jYWxsZWU3Iiwic3RhcnQiLCJKU0RFTElWUl9CVU5ETEVTIiwiYnVuZGxlIiwid29ya2VyX3VybCIsIndvcmtlciIsImxvZ2dlciIsInJlcyIsImJ1ZmZlciIsImZpbGVOYW1lTWF0Y2giLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJwZXJmb3JtYW5jZSIsIm5vdyIsImdldEpzRGVsaXZyQnVuZGxlcyIsInNlbGVjdEJ1bmRsZSIsIm1haW5Xb3JrZXIiLCJFcnJvciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJjb25jYXQiLCJ0eXBlIiwiV29ya2VyIiwiQ29uc29sZUxvZ2dlciIsIlZvaWRMb2dnZXIiLCJpbnN0YW50aWF0ZSIsIm1haW5Nb2R1bGUiLCJwdGhyZWFkV29ya2VyIiwicmV2b2tlT2JqZWN0VVJMIiwicGF0aCIsImZldGNoIiwiYXJyYXlCdWZmZXIiLCJtYXRjaCIsInJlZ2lzdGVyRmlsZUJ1ZmZlciIsIlVpbnQ4QXJyYXkiLCJvcGVuIiwibG9nRWxhcHNlZFRpbWUiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsIl94MTAiLCJfeDExIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL2R1Y2tkYi13YXNtLWFkYXB0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCAqIGFzIGR1Y2tkYiBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcbmltcG9ydCB7QXN5bmNEdWNrREIsIER1Y2tEQkNvbmZpZywgQXN5bmNEdWNrREJDb25uZWN0aW9ufSBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcblxuaW1wb3J0IHtEYXRhYmFzZUFkYXB0ZXIsIERhdGFiYXNlQ29ubmVjdGlvbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7bG9nRWxhcHNlZFRpbWV9IGZyb20gJy4uL3V0aWxzL3BlcmYnO1xuXG5jbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGF0YWJhc2VDb25uZWN0aW9uIHtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uOiBBc3luY0R1Y2tEQkNvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQXN5bmNEdWNrREJDb25uZWN0aW9uKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KHN0YXRlbWVudDogc3RyaW5nKTogUHJvbWlzZTxhcnJvdy5UYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24ucXVlcnkoc3RhdGVtZW50KTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFycm93VGFibGUoYXJyb3dUYWJsZTogYXJyb3cuVGFibGUsIHBhcmFtczoge25hbWU6IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uaW5zZXJ0QXJyb3dUYWJsZShhcnJvd1RhYmxlLCBwYXJhbXMpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cbn1cblxudHlwZSBEdWNrREJXYXNtQWRhcHRlclByb3BzID1cbiAgfCB7XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBjb25maWc/OiBEdWNrREJDb25maWc7XG4gICAgfVxuICB8IFByb21pc2U8QXN5bmNEdWNrREI+O1xuXG5leHBvcnQgY2xhc3MgRHVja0RCV2FzbUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRhYmFzZUFkYXB0ZXIge1xuICBwcml2YXRlIGR1Y2tEQjogUHJvbWlzZTxBc3luY0R1Y2tEQj47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRHVja0RCV2FzbUFkYXB0ZXJQcm9wcykge1xuICAgIC8vIHBhc3MgZXhpc3RpbmcgQXN5bmNEdWNrREIgb2JqZWN0IGNyZWF0ZWQgZWxzZXdoZXJlXG4gICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQcm9taXNlIHx8IG9wdGlvbnMgaW5zdGFuY2VvZiBBc3luY0R1Y2tEQikge1xuICAgICAgdGhpcy5kdWNrREIgPSBvcHRpb25zIGFzIGFueTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBvciBjcmVhdGUgYSBuZXcgQXN5bmNEdWNrREIgb2JqZWN0XG4gICAgY29uc3Qge2RlYnVnID0gZmFsc2UsIGNvbmZpZ30gPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMuZHVja0RCID0gaW5pdGlhbGl6ZUR1Y2tEYldhc20oY29uZmlnLCBkZWJ1Zyk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5kdWNrREI7XG4gICAgY29uc3QgYyA9IGF3YWl0IGRiLmNvbm5lY3QoKTtcbiAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oYyk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlckZpbGVUZXh0KGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQpIHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZVRleHQoZmlsZW5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJGaWxlSGFuZGxlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGU6IGFueSxcbiAgICBwcm90b2NvbDogZHVja2RiLkR1Y2tEQkRhdGFQcm90b2NvbCxcbiAgICBkaXJlY3RJTzogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZUhhbmRsZShuYW1lLCBoYW5kbGUsIHByb3RvY29sLCBkaXJlY3RJTyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIER1Y2tEQiB3aXRoIGEgYnJvd3Nlci1zcGVjaWZpYyBXYXNtIGJ1bmRsZS5cbiAqL1xuY29uc3QgaW5pdGlhbGl6ZUR1Y2tEYldhc20gPSBhc3luYyAoXG4gIGNvbmZpZz86IER1Y2tEQkNvbmZpZyxcbiAgZGVidWc/OiBib29sZWFuXG4pOiBQcm9taXNlPEFzeW5jRHVja0RCPiA9PiB7XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgLy8gU2VsZWN0IGEgYnVuZGxlIGJhc2VkIG9uIGJyb3dzZXIgY2hlY2tzXG4gIGNvbnN0IEpTREVMSVZSX0JVTkRMRVMgPSBkdWNrZGIuZ2V0SnNEZWxpdnJCdW5kbGVzKCk7XG4gIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IGR1Y2tkYi5zZWxlY3RCdW5kbGUoSlNERUxJVlJfQlVORExFUyk7XG4gIGlmICghYnVuZGxlLm1haW5Xb3JrZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIER1Y2tEQicpO1xuICB9XG5cbiAgY29uc3Qgd29ya2VyX3VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgbmV3IEJsb2IoW2BpbXBvcnRTY3JpcHRzKFwiJHtidW5kbGUubWFpbldvcmtlcn1cIik7YF0sIHtcbiAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgfSlcbiAgKTtcblxuICAvLyBJbnN0YW50aWF0ZSB0aGUgYXN5bmMgdmVyc2lvbiBvZiBEdWNrREItd2FzbVxuICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlcl91cmwpO1xuICBjb25zdCBsb2dnZXIgPSBkZWJ1ZyA/IG5ldyBkdWNrZGIuQ29uc29sZUxvZ2dlcigpIDogbmV3IGR1Y2tkYi5Wb2lkTG9nZ2VyKCk7XG4gIGNvbnN0IGRiID0gbmV3IEFzeW5jRHVja0RCKGxvZ2dlciwgd29ya2VyKTtcbiAgYXdhaXQgZGIuaW5zdGFudGlhdGUoYnVuZGxlLm1haW5Nb2R1bGUsIGJ1bmRsZS5wdGhyZWFkV29ya2VyKTtcbiAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJfdXJsKTtcblxuICBpZiAoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5wYXRoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjb25maWcucGF0aCk7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb25maWcucGF0aC5tYXRjaCgvW14vXSokLyk7XG4gICAgICBpZiAoZmlsZU5hbWVNYXRjaCkge1xuICAgICAgICBjb25maWcucGF0aCA9IGZpbGVOYW1lTWF0Y2hbMF07XG4gICAgICB9XG4gICAgICBhd2FpdCBkYi5yZWdpc3RlckZpbGVCdWZmZXIoY29uZmlnLnBhdGgsIG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgIH1cbiAgICBhd2FpdCBkYi5vcGVuKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoZGVidWcpIHtcbiAgICBsb2dFbGFwc2VkVGltZSgnRHVja0RCIGluaXRpYWxpemVkJywgc3RhcnQpO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYER1Y2tEYkNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGI7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsV0FBQSxHQUFB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