Files
dandelion/db.js
2024-03-24 22:51:33 -07:00

136 lines
21 KiB
JavaScript

// 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 });
store.createIndex("postIDIndex", "data.post_id", { unique: true });
}
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkJBQTJCO0FBQzNCLGdCQUFnQjtBQUNoQixrQkFBa0I7QUFDbEIsbUJBQW1CO0FBQ25CLElBQUk7QUFFSixNQUFNLE1BQU0sR0FBVyxNQUFNLENBQUM7QUFDOUIsTUFBTSxhQUFhLEdBQVcsT0FBTyxDQUFDO0FBQ3RDLElBQUksT0FBTyxHQUFHLHFCQUFxQixDQUFBO0FBQ25DLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQVliLE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBYTtJQUN0QyxNQUFNLFNBQVMsR0FBRyxHQUFHLGFBQWEsSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUUvQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ25DLE1BQU0sT0FBTyxHQUFxQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1RCxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDL0IsbUZBQW1GO1lBQ25GLE1BQU0sVUFBVSxHQUFHLEtBQXdCLENBQUM7WUFDNUMsTUFBTSxDQUFDLG1CQUFtQixVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQztRQUVGLE9BQU8sQ0FBQyxlQUFlLEdBQUcsQ0FBQyxLQUE0QixFQUFFLEVBQUU7WUFDdkQsTUFBTSxFQUFFLEdBQWlCLEtBQUssQ0FBQyxNQUEyQixDQUFDLE1BQU0sQ0FBQztZQUNsRSxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDMUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVB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QUN4QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLGdFQUFnRTtnQkFDaEUsOENBQThDO2dCQUM5QyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2pELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLDBEQUEwRDthQUNqRjtRQUNMLENBQUMsQ0FBQztRQUVGLFVBQVUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUNsQyxtRkFBbUY7WUFDbkYsTUFBTSxVQUFVLEdBQUcsS0FBd0IsQ0FBQztZQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMseUNBQXlDO1FBQzlFLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGludGVyZmFjZSBNeUpzb25PYmplY3Qge1xuLy8gICBpZDogc3RyaW5nO1xuLy8gICBuYW1lOiBzdHJpbmc7XG4vLyAgIGVtYWlsOiBzdHJpbmc7XG4vLyB9XG5cbmNvbnN0IGRiTmFtZTogc3RyaW5nID0gXCJkZGxuXCI7XG5jb25zdCBzdG9yZU5hbWVCYXNlOiBzdHJpbmcgPSBcInBvc3RzXCI7XG5sZXQga2V5QmFzZSA9IFwiZGFuZGVsaW9uX3Bvc3RzX3YxX1wiXG5sZXQga2V5ID0gXCJcIjtcblxuXG5pbnRlcmZhY2UgSURCUmVxdWVzdEV2ZW50PFQgPSBhbnk+IGV4dGVuZHMgRXZlbnQge1xuICAgIHRhcmdldDogSURCUmVxdWVzdDxUPjtcbn1cblxuLy8gSW5kZXhlZERCIHVzZXMgRE9NRXhjZXB0aW9uLCBzbyBsZXQncyB1c2UgaXQgZm9yIGVycm9yIHR5cGluZ1xudHlwZSBEQkVycm9yID0gRXZlbnQgJiB7XG4gICAgdGFyZ2V0OiB7IGVycm9yQ29kZTogRE9NRXhjZXB0aW9uIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKHVzZXJJRDpzdHJpbmcpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUsIDEpO1xuXG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSBhIHR5cGUgYXNzZXJ0aW9uIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyBvZiBJREJSZXF1ZXN0IGVycm9yIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBlcnJvckV2ZW50ID0gZXZlbnQgYXMgSURCUmVxdWVzdEV2ZW50O1xuICAgICAgICAgICAgcmVqZWN0KGBEYXRhYmFzZSBlcnJvcjogJHtlcnJvckV2ZW50LnRhcmdldC5lcnJvcj8ubWVzc2FnZX1gKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudDogSURCVmVyc2lvbkNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYjogSURCRGF0YWJhc2UgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcbiAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhzdG9yZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoc3RvcmVOYW1lLCB7IGtleVBhdGg6IFwiaWRcIiwgYXV0b0luY3JlbWVudDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBzdG9yZS5jcmVhdGVJbmRleChcImRhdGV0aW1lSW5kZXhcIiwgXCJwb3N0X3RpbWVzdGFtcFwiLCB7IHVuaXF1ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgc3RvcmUuY3JlYXRlSW5kZXgoXCJwb3N0SURJbmRleFwiLCBcImRhdGEucG9zdF9pZFwiLCB7IHVuaXF1ZTogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGI6IElEQkRhdGFiYXNlID0gKGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0KS5yZXN1bHQ7XG4gICAgICAgICAgICByZXNvbHZlKGRiKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGREYXRhKHVzZXJJRDogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzdG9yZU5hbWUgPSBgJHtzdG9yZU5hbWVCYXNlfV8ke3VzZXJJRH1gO1xuICAgICAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EYXRhYmFzZSh1c2VySUQpO1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgICBjb25zdCBhZGRSZXF1ZXN0ID0gc3RvcmUuYWRkKHtwb3N0X3RpbWVzdGFtcDogZGF0YS5wb3N0X3RpbWVzdGFtcCwgZGF0YTpkYXRhfSk7XG5cbiAgICAgICAgYWRkUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdEYXRhIGhhcyBiZWVuIGFkZGVkOicsIChlLnRhcmdldCBhcyBJREJSZXF1ZXN0KS5yZXN1bHQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGFkZFJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSBhIHR5cGUgYXNzZXJ0aW9uIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyBvZiBJREJSZXF1ZXN0IGVycm9yIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBlcnJvckV2ZW50ID0gZXZlbnQgYXMgSURCUmVxdWVzdEV2ZW50O1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gYWRkaW5nIGRhdGE6JywgZXJyb3JFdmVudC50YXJnZXQuZXJyb3I/Lm1lc3NhZ2UpO1xuICAgICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIG9wZW5pbmcgZGF0YWJhc2U6JywgZXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZERhdGFBcnJheSh1c2VySUQ6IHN0cmluZywgYXJyYXk6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuRGF0YWJhc2UodXNlcklEKTtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG5cbiAgICAgICAgbGV0IGNvdW50ID0gMDtcblxuICAgICAgICBhcnJheS5yZXZlcnNlKCk7XG5cbiAgICAgICAgZm9yIChsZXQgZGF0YSBvZiBhcnJheSkge1xuICAgICAgICAgICAgY29uc3QgYWRkUmVxdWVzdCA9IHN0b3JlLmFkZCh7cG9zdF90aW1lc3RhbXA6IGRhdGEucG9zdF90aW1lc3RhbXAsIGRhdGE6ZGF0YX0pO1xuICAgICAgICAgICAgYWRkUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnRGF0YSBoYXMgYmVlbiBhZGRlZDonLCAoZS50YXJnZXQgYXMgSURCUmVxdWVzdCkucmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgXG4gICAgICAgICAgICBhZGRSZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIGEgdHlwZSBhc3NlcnRpb24gdG8gYWNjZXNzIHRoZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIG9mIElEQlJlcXVlc3QgZXJyb3IgZXZlbnRcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvckV2ZW50ID0gZXZlbnQgYXMgSURCUmVxdWVzdEV2ZW50O1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGFkZGluZyBkYXRhOicsIGVycm9yRXZlbnQudGFyZ2V0LmVycm9yPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvdW50Kys7XG5cbiAgICAgICAgICAgIC8vIGlmIChjb3VudCAlIDEwMCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGBBZGRlZCAke2NvdW50fSBwb3N0cy4uLmApO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG5cbiAgICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBvcGVuaW5nIGRhdGFiYXNlOicsIGVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREYXRhKHVzZXJJRDpzdHJpbmcsIGxvd2VySUQ6RGF0ZSwgdXBwZXJJRDpEYXRlKTogUHJvbWlzZTxhbnkgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdG9yZU5hbWUgPSBgJHtzdG9yZU5hbWVCYXNlfV8ke3VzZXJJRH1gO1xuICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRhdGFiYXNlKHVzZXJJRCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZG9ubHlcIik7XG4gICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qga2V5UmFuZ2VWYWx1ZSA9IElEQktleVJhbmdlLmJvdW5kKGxvd2VySUQsIHVwcGVySUQpO1xuXG4gICAgICAgIGNvbnN0IHJlY29yZHM6IGFueVtdID0gW107XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBzdG9yZS5pbmRleChcImRhdGV0aW1lSW5kZXhcIik7XG5cblxuICAgICAgICBjb25zdCBjdXJzb3JSZXF1ZXN0ID0gaW5kZXgub3BlbkN1cnNvcihrZXlSYW5nZVZhbHVlKTtcblxuICAgICAgICBjdXJzb3JSZXF1ZXN0Lm9uc3VjY2VzcyA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkucmVzdWx0IGFzIElEQkN1cnNvcldpdGhWYWx1ZTtcbiAgICAgICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgICAgICByZWNvcmRzLnB1c2goY3Vyc29yLnZhbHVlLmRhdGEpOyAvLyBDb2xsZWN0IHRoZSByZWNvcmRcbiAgICAgICAgICAgICAgICBjdXJzb3IuY29udGludWUoKTsgLy8gTW92ZSB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSByYW5nZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBObyBtb3JlIGVudHJpZXMgaW4gdGhlIHJhbmdlXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZWNvcmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjdXJzb3JSZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBVc2UgYSB0eXBlIGFzc2VydGlvbiB0byBhY2Nlc3MgdGhlIHNwZWNpZmljIHByb3BlcnRpZXMgb2YgSURCUmVxdWVzdCBlcnJvciBldmVudFxuICAgICAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50IGFzIElEQlJlcXVlc3RFdmVudDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyYW5zYWN0aW9uIGZhaWxlZDonLCBlcnJvckV2ZW50LnRhcmdldC5lcnJvcj8ubWVzc2FnZSk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3JFdmVudC50YXJnZXQuZXJyb3IpOyAvLyBSZWplY3QgdGhlIHByb21pc2UgaWYgdGhlcmUncyBhbiBlcnJvclxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGF0YSh1c2VySUQ6c3RyaW5nKTogUHJvbWlzZTxhbnkgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdG9yZU5hbWUgPSBgJHtzdG9yZU5hbWVCYXNlfV8ke3VzZXJJRH1gO1xuICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRhdGFiYXNlKHVzZXJJRCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZG9ubHlcIik7XG4gICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZ2V0UmVxdWVzdCA9IHN0b3JlLmdldEFsbCgpO1xuXG4gICAgICAgIGdldFJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdldFJlcXVlc3QucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZygnUmV0cmlldmVkIGRhdGE6JywgZ2V0UmVxdWVzdC5yZXN1bHQuanNvbkRhdGEpO1xuICAgICAgICAgICAgICAgIC8vIHJlc29sdmUoZ2V0UmVxdWVzdC5yZXN1bHQuanNvbkRhdGEgYXMgYW55KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGdldFJlcXVlc3QucmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIGRhdGEgcmVjb3JkIGZvdW5kIGZvciBrZXknLCBrZXkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTsgLy8gZXhwbGljaXRseSByZXNvbHZlIHdpdGggdW5kZWZpbmVkIHdoZW4gbm8gZGF0YSBpcyBmb3VuZFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGdldFJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSBhIHR5cGUgYXNzZXJ0aW9uIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyBvZiBJREJSZXF1ZXN0IGVycm9yIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBlcnJvckV2ZW50ID0gZXZlbnQgYXMgSURCUmVxdWVzdEV2ZW50O1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVHJhbnNhY3Rpb24gZmFpbGVkOicsIGVycm9yRXZlbnQudGFyZ2V0LmVycm9yPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJlamVjdChlcnJvckV2ZW50LnRhcmdldC5lcnJvcik7IC8vIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGVyZSdzIGFuIGVycm9yXG4gICAgICAgIH07XG4gICAgfSk7XG59XG4iXX0=