// interface MyJsonObject { // id: string; // name: string; // email: string; // } const dbName = "ddln"; const storeNameBase = "posts"; let keyBase = "dandelion_posts_v1_"; let key = ""; export function openDatabase(userID) { const storeName = `${storeNameBase}_${userID}`; return new Promise((resolve, reject) => { const request = indexedDB.open(dbName, 1); request.onerror = (event) => { // Use a type assertion to access the specific properties of IDBRequest error event const errorEvent = event; reject(`Database error: ${errorEvent.target.error?.message}`); }; request.onupgradeneeded = (event) => { const db = event.target.result; if (!db.objectStoreNames.contains(storeName)) { let store = db.createObjectStore(storeName, { keyPath: "id", autoIncrement: true }); store.createIndex("datetimeIndex", "post_timestamp", { unique: false }); } }; request.onsuccess = (event) => { const db = event.target.result; resolve(db); }; }); } export async function addData(userID, data) { try { const storeName = `${storeNameBase}_${userID}`; const db = await openDatabase(userID); const transaction = db.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); const addRequest = store.add({ post_timestamp: data.post_timestamp, data: data }); addRequest.onsuccess = (e) => { // console.log('Data has been added:', (e.target as IDBRequest).result); }; addRequest.onerror = (event) => { // Use a type assertion to access the specific properties of IDBRequest error event const errorEvent = event; console.error('Error in adding data:', errorEvent.target.error?.message); }; } catch (error) { console.error('Error in opening database:', error); } } export async function addDataArray(userID, array) { try { const storeName = `${storeNameBase}_${userID}`; const db = await openDatabase(userID); const transaction = db.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); let count = 0; array.reverse(); for (let data of array) { const addRequest = store.add({ post_timestamp: data.post_timestamp, data: data }); addRequest.onsuccess = (e) => { // console.log('Data has been added:', (e.target as IDBRequest).result); }; addRequest.onerror = (event) => { // Use a type assertion to access the specific properties of IDBRequest error event const errorEvent = event; console.error('Error in adding data:', errorEvent.target.error?.message); }; count++; // if (count % 100 === 0) { // console.log(`Added ${count} posts...`); // } } } catch (error) { console.error('Error in opening database:', error); } } export async function getData(userID, lowerID, upperID) { const storeName = `${storeNameBase}_${userID}`; const db = await openDatabase(userID); const transaction = db.transaction(storeName, "readonly"); const store = transaction.objectStore(storeName); return new Promise((resolve, reject) => { const keyRangeValue = IDBKeyRange.bound(lowerID, upperID); const records = []; const index = store.index("datetimeIndex"); const cursorRequest = index.openCursor(keyRangeValue); cursorRequest.onsuccess = (event) => { const cursor = event.target.result; if (cursor) { records.push(cursor.value.data); // Collect the record cursor.continue(); // Move to the next item in the range } else { // No more entries in the range resolve(records); } }; cursorRequest.onerror = (event) => { // Use a type assertion to access the specific properties of IDBRequest error event const errorEvent = event; console.error('Transaction failed:', errorEvent.target.error?.message); reject(errorEvent.target.error); // Reject the promise if there's an error }; }); } export async function getAllData(userID) { const storeName = `${storeNameBase}_${userID}`; const db = await openDatabase(userID); const transaction = db.transaction(storeName, "readonly"); const store = transaction.objectStore(storeName); return new Promise((resolve, reject) => { const getRequest = store.getAll(); getRequest.onsuccess = () => { if (getRequest.result) { // console.log('Retrieved data:', getRequest.result.jsonData); // resolve(getRequest.result.jsonData as any); resolve(getRequest.result); } else { console.log('No data record found for key', key); resolve(undefined); // explicitly resolve with undefined when no data is found } }; getRequest.onerror = (event) => { // Use a type assertion to access the specific properties of IDBRequest error event const errorEvent = event; console.error('Transaction failed:', errorEvent.target.error?.message); reject(errorEvent.target.error); // reject the promise if there's an error }; }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkJBQTJCO0FBQzNCLGdCQUFnQjtBQUNoQixrQkFBa0I7QUFDbEIsbUJBQW1CO0FBQ25CLElBQUk7QUFFSixNQUFNLE1BQU0sR0FBVyxNQUFNLENBQUM7QUFDOUIsTUFBTSxhQUFhLEdBQVcsT0FBTyxDQUFDO0FBQ3RDLElBQUksT0FBTyxHQUFHLHFCQUFxQixDQUFBO0FBQ25DLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQVliLE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBYTtJQUN0QyxNQUFNLFNBQVMsR0FBRyxHQUFHLGFBQWEsSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUUvQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ25DLE1BQU0sT0FBTyxHQUFxQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1RCxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDL0IsbUZBQW1GO1lBQ25GLE1BQU0sVUFBVSxHQUFHLEtBQXdCLENBQUM7WUFDNUMsTUFBTSxDQUFDLG1CQUFtQixVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQztRQUVGLE9BQU8sQ0FBQyxlQUFlLEdBQUcsQ0FBQyxLQUE0QixFQUFFLEVBQUU7WUFDdkQsTUFBTSxFQUFFLEdBQWlCLEtBQUssQ0FBQyxNQUEyQixDQUFDLE1BQU0sQ0FBQztZQUNsRSxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLElB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eEIsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BCLGdFQUFnRTtnQkFDaEUsOENBQThDO2dCQUM5QyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9CLENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQywwREFBMEQ7WUFDbEYsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLFVBQVUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUNsQyxtRkFBbUY7WUFDbkYsTUFBTSxVQUFVLEdBQUcsS0FBd0IsQ0FBQztZQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMseUNBQXlDO1FBQzlFLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGludGVyZmFjZSBNeUpzb25PYmplY3Qge1xuLy8gICBpZDogc3RyaW5nO1xuLy8gICBuYW1lOiBzdHJpbmc7XG4vLyAgIGVtYWlsOiBzdHJpbmc7XG4vLyB9XG5cbmNvbnN0IGRiTmFtZTogc3RyaW5nID0gXCJkZGxuXCI7XG5jb25zdCBzdG9yZU5hbWVCYXNlOiBzdHJpbmcgPSBcInBvc3RzXCI7XG5sZXQga2V5QmFzZSA9IFwiZGFuZGVsaW9uX3Bvc3RzX3YxX1wiXG5sZXQga2V5ID0gXCJcIjtcblxuXG5pbnRlcmZhY2UgSURCUmVxdWVzdEV2ZW50PFQgPSBhbnk+IGV4dGVuZHMgRXZlbnQge1xuICAgIHRhcmdldDogSURCUmVxdWVzdDxUPjtcbn1cblxuLy8gSW5kZXhlZERCIHVzZXMgRE9NRXhjZXB0aW9uLCBzbyBsZXQncyB1c2UgaXQgZm9yIGVycm9yIHR5cGluZ1xudHlwZSBEQkVycm9yID0gRXZlbnQgJiB7XG4gICAgdGFyZ2V0OiB7IGVycm9yQ29kZTogRE9NRXhjZXB0aW9uIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKHVzZXJJRDpzdHJpbmcpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUsIDEpO1xuXG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSBhIHR5cGUgYXNzZXJ0aW9uIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyBvZiBJREJSZXF1ZXN0IGVycm9yIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBlcnJvckV2ZW50ID0gZXZlbnQgYXMgSURCUmVxdWVzdEV2ZW50O1xuICAgICAgICAgICAgcmVqZWN0KGBEYXRhYmFzZSBlcnJvcjogJHtlcnJvckV2ZW50LnRhcmdldC5lcnJvcj8ubWVzc2FnZX1gKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudDogSURCVmVyc2lvbkNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYjogSURCRGF0YWJhc2UgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcbiAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhzdG9yZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoc3RvcmVOYW1lLCB7IGtleVBhdGg6IFwiaWRcIiwgYXV0b0luY3JlbWVudDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBzdG9yZS5jcmVhdGVJbmRleChcImRhdGV0aW1lSW5kZXhcIiwgXCJwb3N0X3RpbWVzdGFtcFwiLCB7IHVuaXF1ZTogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiOiBJREJEYXRhYmFzZSA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuICAgICAgICAgICAgcmVzb2x2ZShkYik7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkRGF0YSh1c2VySUQ6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuRGF0YWJhc2UodXNlcklEKTtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG5cbiAgICAgICAgY29uc3QgYWRkUmVxdWVzdCA9IHN0b3JlLmFkZCh7cG9zdF90aW1lc3RhbXA6IGRhdGEucG9zdF90aW1lc3RhbXAsIGRhdGE6ZGF0YX0pO1xuXG4gICAgICAgIGFkZFJlcXVlc3Qub25zdWNjZXNzID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnRGF0YSBoYXMgYmVlbiBhZGRlZDonLCAoZS50YXJnZXQgYXMgSURCUmVxdWVzdCkucmVzdWx0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBhZGRSZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBVc2UgYSB0eXBlIGFzc2VydGlvbiB0byBhY2Nlc3MgdGhlIHNwZWNpZmljIHByb3BlcnRpZXMgb2YgSURCUmVxdWVzdCBlcnJvciBldmVudFxuICAgICAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50IGFzIElEQlJlcXVlc3RFdmVudDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGFkZGluZyBkYXRhOicsIGVycm9yRXZlbnQudGFyZ2V0LmVycm9yPy5tZXNzYWdlKTtcbiAgICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBvcGVuaW5nIGRhdGFiYXNlOicsIGVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGREYXRhQXJyYXkodXNlcklEOiBzdHJpbmcsIGFycmF5OiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0b3JlTmFtZSA9IGAke3N0b3JlTmFtZUJhc2V9XyR7dXNlcklEfWA7XG4gICAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRhdGFiYXNlKHVzZXJJRCk7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICAgICAgYXJyYXkucmV2ZXJzZSgpO1xuXG4gICAgICAgIGZvciAobGV0IGRhdGEgb2YgYXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZFJlcXVlc3QgPSBzdG9yZS5hZGQoe3Bvc3RfdGltZXN0YW1wOiBkYXRhLnBvc3RfdGltZXN0YW1wLCBkYXRhOmRhdGF9KTtcbiAgICAgICAgICAgIGFkZFJlcXVlc3Qub25zdWNjZXNzID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0RhdGEgaGFzIGJlZW4gYWRkZWQ6JywgKGUudGFyZ2V0IGFzIElEQlJlcXVlc3QpLnJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgIFxuICAgICAgICAgICAgYWRkUmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBhIHR5cGUgYXNzZXJ0aW9uIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyBvZiBJREJSZXF1ZXN0IGVycm9yIGV2ZW50XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50IGFzIElEQlJlcXVlc3RFdmVudDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBhZGRpbmcgZGF0YTonLCBlcnJvckV2ZW50LnRhcmdldC5lcnJvcj8ubWVzc2FnZSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb3VudCsrO1xuXG4gICAgICAgICAgICAvLyBpZiAoY291bnQgJSAxMDAgPT09IDApIHtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhgQWRkZWQgJHtjb3VudH0gcG9zdHMuLi5gKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuXG4gICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gb3BlbmluZyBkYXRhYmFzZTonLCBlcnJvcik7XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YSh1c2VySUQ6c3RyaW5nLCBsb3dlcklEOkRhdGUsIHVwcGVySUQ6RGF0ZSk6IFByb21pc2U8YW55IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcbiAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EYXRhYmFzZSh1c2VySUQpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWRvbmx5XCIpO1xuICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleVJhbmdlVmFsdWUgPSBJREJLZXlSYW5nZS5ib3VuZChsb3dlcklELCB1cHBlcklEKTtcblxuICAgICAgICBjb25zdCByZWNvcmRzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gc3RvcmUuaW5kZXgoXCJkYXRldGltZUluZGV4XCIpO1xuXG5cbiAgICAgICAgY29uc3QgY3Vyc29yUmVxdWVzdCA9IGluZGV4Lm9wZW5DdXJzb3Ioa2V5UmFuZ2VWYWx1ZSk7XG5cbiAgICAgICAgY3Vyc29yUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJzb3IgPSAoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLnJlc3VsdCBhcyBJREJDdXJzb3JXaXRoVmFsdWU7XG4gICAgICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgcmVjb3Jkcy5wdXNoKGN1cnNvci52YWx1ZS5kYXRhKTsgLy8gQ29sbGVjdCB0aGUgcmVjb3JkXG4gICAgICAgICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7IC8vIE1vdmUgdG8gdGhlIG5leHQgaXRlbSBpbiB0aGUgcmFuZ2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gbW9yZSBlbnRyaWVzIGluIHRoZSByYW5nZVxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVjb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY3Vyc29yUmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gVXNlIGEgdHlwZSBhc3NlcnRpb24gdG8gYWNjZXNzIHRoZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIG9mIElEQlJlcXVlc3QgZXJyb3IgZXZlbnRcbiAgICAgICAgICAgIGNvbnN0IGVycm9yRXZlbnQgPSBldmVudCBhcyBJREJSZXF1ZXN0RXZlbnQ7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUcmFuc2FjdGlvbiBmYWlsZWQ6JywgZXJyb3JFdmVudC50YXJnZXQuZXJyb3I/Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yRXZlbnQudGFyZ2V0LmVycm9yKTsgLy8gUmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZXJlJ3MgYW4gZXJyb3JcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFsbERhdGEodXNlcklEOnN0cmluZyk6IFByb21pc2U8YW55IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcbiAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EYXRhYmFzZSh1c2VySUQpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWRvbmx5XCIpO1xuICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGdldFJlcXVlc3QgPSBzdG9yZS5nZXRBbGwoKTtcblxuICAgICAgICBnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChnZXRSZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2coJ1JldHJpZXZlZCBkYXRhOicsIGdldFJlcXVlc3QucmVzdWx0Lmpzb25EYXRhKTtcbiAgICAgICAgICAgICAgICAvLyByZXNvbHZlKGdldFJlcXVlc3QucmVzdWx0Lmpzb25EYXRhIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRSZXF1ZXN0LnJlc3VsdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBkYXRhIHJlY29yZCBmb3VuZCBmb3Iga2V5Jywga2V5KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7IC8vIGV4cGxpY2l0bHkgcmVzb2x2ZSB3aXRoIHVuZGVmaW5lZCB3aGVuIG5vIGRhdGEgaXMgZm91bmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBnZXRSZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBVc2UgYSB0eXBlIGFzc2VydGlvbiB0byBhY2Nlc3MgdGhlIHNwZWNpZmljIHByb3BlcnRpZXMgb2YgSURCUmVxdWVzdCBlcnJvciBldmVudFxuICAgICAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50IGFzIElEQlJlcXVlc3RFdmVudDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyYW5zYWN0aW9uIGZhaWxlZDonLCBlcnJvckV2ZW50LnRhcmdldC5lcnJvcj8ubWVzc2FnZSk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3JFdmVudC50YXJnZXQuZXJyb3IpOyAvLyByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlcmUncyBhbiBlcnJvclxuICAgICAgICB9O1xuICAgIH0pO1xufVxuIl19