TGchan ID Tracker

Provides info about each poster and allows per-poster navigation.

// ==UserScript==
// @name        TGchan ID Tracker
// @namespace   TGchanIDTracker
// @include     *//tgchan.org/kusaba/quest/res/*
// @include     *//tgchan.org/kusaba/questarch/res/*
// @include     *//tgchan.org/kusaba/questdis/res/*
// @include     *//tgchan.org/kusaba/graveyard/res/*
// @description Provides info about each poster and allows per-poster navigation.
// @version     8
// @grant       none
// @icon        data:image/vnd.microsoft.icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAAANklEQVQokWNgoBOI2mJKpEomMvQgNAxRPUy4JGjjJJqoZoSrZmBgWOZzGlk/mlKILBMafxAAAE1pG/UEXzMMAAAAAElFTkSuQmCC
// ==/UserScript==
"use strict";
if (document.body.querySelector("#navUp")) { //sanity check; don't run the script if it already ran
  return;
}
const debug = false;
var timeStart = Date.now();
var regex = getRegexes(); //a cache object for precompiled regular expressions
var boardName = document.forms.postform.board.value;
var totalFiles = 0;
var posts = getPosts(); //extract and cache whatever stuff we need from DOM;
var threadID = posts[0].postID;
var userNodes = {}; //dictionary => userID / user node ; we use these nodes to build a graph, connecting one ID to the other
var author = find(makeSet(posts[0].userID)); //author is the user that made the first post
var questFixes = getFixes(threadID); //for quests where we can't correctly determine updates, we have a built-in database of fixes
applyMissedAuthorFixes();
doPartialUnionFind(); //do a partial union-find run to determine if this is an image quest
author = find(author);
var imageQuest = isImageQuest(); //Image quests are usually when the author posts images more than 50% of the time.
if (debug) console.log(`imageQuest = ${imageQuest}`);
if (!imageQuest) { //do normal union-find again from the start
  userNodes = {};
  doNormalUnionFind();
  author = find(userNodes[posts[0].userID]);
  applyMissedAuthorFixes();
}
else { //continue from the previous partial union-find, but adhere to certain union rules
  doConditionalUnionFind(); //specifically, even if author's ID has a link to some other user's ID, we will not merge the two unless that other user posted files
  doUserAnalytics(); //do some advanced analytics to determine which users could also be the author and consequently merge them with the author
}
setPostUsers(); //do final user unification
setPostCountElements(); //set correct post count to our cached elements based on which user they belong to
var hrefString = "/kusaba/" + boardName + "/res/" + threadID + ".html#";
setPostLinkElements(); //set correct targets to our up/down link elements based on which user they belong to
setPostUpdates(); //set a flag to posts that are updates
if (boardName != "questdis") {
  setPostMetadata(); //add additional data next to our elements, such as when a poster made multiple posts within an update
}
//finally insert stuff into DOM
insertButtonIcons(); //add icons for our elements;
insertCSS(); //add CSS for our elements
insertPostInfo(); //add poster info next to each post's ID
if (debug) console.log(getUsers()); //outputs a list of users, their post counts, and the IDs that each user uses
console.log(`TGchan ID Tracker run time = ${Date.now() - timeStart}ms`);
//THE END

//functions ; things which should be simple but are not
function getRegexes() {
  var regexes = {
    fileExtension: new RegExp("[.][^.]+$"), //finds ".png" in "image.png"
	lastNumber: new RegExp("([0-9]+)([^0-9]*)$"), //finds "50" in "image50.png"
	fraction: new RegExp("[0-9][ ]*/[ ]*[0-9]"), //finds "1/4" in "Update 1/4"
	diceRoll: new RegExp("^rolled [0-9].* = [0-9]+$"), //finds "rolled 10, 20 = 30"
	quotedTexts: new RegExp("[\"“”][^\"“”]*[\"“”]","gu"), //finds text inside quotes
	words: new RegExp("[a-zA-Z]+", "gu"), //finds a word
	endsWithPunctuation: new RegExp("[.,!?][ ]*[\"“”]$"), //binds if a quote ends with a punctuation
	bracketedTexts: new RegExp("(\\([^)]*\\))|(\\[[^\\]]*\\])|(\\{[^}]*\\})|(<[^>]*>)", "gu"), //finds text within various kinds of brackets
	canonID: new RegExp("^[0-9a-f]{6}$")
  };
  return regexes;
}
function getPosts() {
  var defaultName = boardName == "questdis" ? "Anonymous" : "Suggestion";
  var defaultFragment = createDefaultFragment(); //optimization => create a generic document fragment with post count and up/down link, which we'll be cloning
  var postsIndex = {}; //dictionary => postID / post object
  var postsArray = []; //array => post object
  document.querySelectorAll(".postwidth").forEach(function(postHeaderElement) { //querySelectorAll is faster than getElementsByClassName when DOM is large
	var postID = postHeaderElement.querySelector("span[id^=dnb]").id.split("-")[2];
	if (!postsIndex[postID]) { //checking this may seem unnecessary, but it's required for compatibility with some imageboard extensions
	  var uid, name, trip, subject, fileElement, fileExt, fileName = "", activeContent, contentElement;
	  var uidElement = postHeaderElement.querySelector(".uid");
	  uid = uidElement.textContent.substring(4);
	  trip = postHeaderElement.querySelector(".postertrip");
	  if (trip) { //use tripcode instead of name if it exists
		name = trip.textContent;
	  }
	  else {
		name = postHeaderElement.querySelector(".postername").textContent.trim();
		name = name == defaultName ? "" : name.toLowerCase();
	  }
	  subject = postHeaderElement.querySelector(".filetitle");
	  subject = subject ? subject.textContent.trim() : "";
	  fileElement = postHeaderElement.querySelector(".filesize");
	  if (fileElement) { //try to get the original file name
		fileName = fileElement.firstElementChild.href;
		var match = fileName.match(regex.fileExtension);
		fileExt = match ? match[0].toLowerCase() : "";
		if (fileExt == ".png" || fileExt == ".gif" || fileExt == ".jpg" || fileExt == ".jpeg") {
		  var fileInfo = fileElement.lastChild.textContent.split(", ");
		  if (fileInfo.length >= 3) {
			fileName = fileInfo[2].split("\n")[0];
		  }
		}
		else {
		  fileName = fileName.substr(fileName.lastIndexOf("/") + 1); //couldn't find original file name, use file name from server instead
		}
		fileName = fileName.replace(regex.fileExtension, ""); //ignore file's extension
	  }
	  contentElement = postHeaderElement.nextElementSibling;
	  activeContent = contentElement.querySelector("img, iframe") ? true : false; //does a post contain icons
	  postsIndex[postID] = {
		postID: postID,
		userID: uid,
		name: name,
		subject: subject,
		fileName: fileName,
		activeContent: activeContent,
		insertElement: uidElement, //element next to which we're gonna be inserting our stuff.
		contentElement: contentElement, //analyzing text content of every post would be too performance intensive; defer it for later when we know which posts are author's
		fragment: defaultFragment.cloneNode(true)
	  };
	}
  });
  //convert to an array
  for (var postID in postsIndex) {
	postsArray.push(postsIndex[postID]);
  }
  return postsArray;
}
function createDefaultFragment() {
  var fragment = document.createDocumentFragment();
  fragment.appendChild(document.createRange().createContextualFragment(
`<span class="postCount inherit"></span>
<a class="disabled"><svg class="navIcon"><use xlink:href="#navUp"/></svg></a>
<a class="disabled"><svg class="navIcon"><use xlink:href="#navDown"/></svg></a>`));
  return fragment;
}
function applyMissedAuthorFixes() {
  for (var id in questFixes.missedAuthors) {
	author = union(find(makeSet(id)), author);
	if (debug) console.log(`Merged "${id}" with author (manual fix)`);
  }
}
function doNormalUnionFind() {
  posts.forEach(function(post) {
	var user = !post.name ? find(makeSet(post.userID)) : union(makeSet(post.userID), makeSet(post.name));
	user.postCount++;
	if (post.fileName || post.activeContent) {
	  user.fileCount++;
	}
  });
}
function doPartialUnionFind() {
  posts.forEach(function(post) {
	if (post.fileName || post.activeContent) {
	  var user = !post.name ? find(makeSet(post.userID)) : union(makeSet(post.userID), makeSet(post.name));
	  user.postCount++;
	  user.fileCount++;
	  totalFiles++;
	}
  });
  posts.forEach(function(post) {
	if (!post.fileName && !post.activeContent) {
	  var userFromID = userNodes[post.userID];
	  var userFromName = userNodes[post.name];
	  if (userFromID && userFromName) {
		if (find(userFromID) != find(userFromName)) {
		  union(userFromID, userFromName).postCount++;
		}
		else {
		  find(userFromID).postCount++;
		}
	  }
	  else if (userFromID) {
		find(userFromID).postCount++;
	  }
	  else if (userFromName) {
		find(userFromName).postCount++;
	  }
	}
  });
}
function doConditionalUnionFind() {
  var alreadyCounted = {};
  for (var userNode in userNodes) {
	alreadyCounted[userNode] = true;
  }
  posts.forEach(function(post) {
	if (!post.fileName && !post.activeContent) {
	  var userFromID = find(makeSet(post.userID));
	  if (post.name) {
		var userFromName = find(makeSet(post.name));
		if (userFromID != author && userFromName != author) {
		  if (!alreadyCounted[userFromID.id] && !alreadyCounted[userFromName.id]) {
			userFromID.postCount++;
		  }
		  union(userFromID, userFromName);
		}
	  }
	  else if (!alreadyCounted[userFromID.id]) {
		userFromID.postCount++;
	  }
	}
  });
}
function isImageQuest() {
  if (questFixes.imageQuest !== undefined) {
	if (debug) console.log("manual fix for quest type applied");
	return questFixes.imageQuest;
  }
  else {
	return boardName != "questdis" && (author.fileCount / author.postCount) >= 0.5;
  }
}
function doUserAnalytics() {
  //consider posters, who follow the file naming scheme, as being the quest author
  //consider posters, who create posts that contain both icons and files, as the quest author
  //consider a poster, who posted more than 50% of images, as being the quest author.
  do {
	var predictedName1a = "", predictedName1b = "", predictedName2a = "", predictedName2b = "";
	var lastFileNames = [];
	var lastUsers = [ author ];
	var restart = false;
	for (var post of posts) {
	  if (post.fileName && !questFixes.wrongImageUpdates[post.postID]) {
		var user = find(makeSet(post.userID));
		if (user == author) {
		  var backwardsPredictedName = getPredictedFileName(post.fileName, -1);
		  for (let i = 0; i < lastUsers.length; i++) {
			if (lastUsers[i] != author && lastFileNames[i] == backwardsPredictedName) { //also predict backwards :)
			  author = union(lastUsers[i], author);
			  if (debug) console.log(`Merged "${lastUsers[i].id}" with author (post ${post.postID}) for file naming scheme (backwards)`);
			  restart = true;
			}
		  }
		  predictedName2a = predictedName1a;
		  predictedName2b = predictedName1b;
		  predictedName1a = getPredictedFileName(post.fileName, 1);
		  predictedName1b = getPredictedFileName(post.fileName, 2);
		  lastFileNames = [];
		  lastUsers = [];
		}
		else {
		  if (post.fileName == predictedName1a) {
			author = union(user, author);
			if (debug) console.log(`Merged "${user.id}" with author (post ${post.postID}) for file naming scheme`);
			restart = true;
		  }
		  else if (post.fileName == predictedName1b || post.fileName == predictedName2a || post.fileName == predictedName2b) {
			author = union(user, author);
			if (debug) console.log(`Merged "${user.id}" with author (post ${post.postID}) for file naming scheme (skipped one)`);
			restart = true;
		  }
		  else if (post.activeContent) {
			author = union(user, author);
			if (debug) console.log(`Merged "${user.id}" with author (post ${post.postID}) for making a post with file and icons`);
			restart = true;
		  }
		  else if (user.fileCount >= totalFiles / 2) {
			author = union(user, author);
			if (debug) console.log(`Merged "${user.id}" with author (post ${post.postID}) for being a majority image poster`);
			restart = true;
		  }
		  else {
			lastFileNames.push(post.fileName);
			lastUsers.push(user);
		  }
		}
		if (restart) {
		  break;
		}
	  }
	}
  }
  while (restart);
}
function setPostUsers() {
  posts.forEach(function(post) {
	post.user = find(makeSet(post.userID));
	if (post.name) {
	  var userFromName = find(makeSet(post.name));
	  if (post.user != userFromName && userFromName == author) {
		post.user = userFromName; //in case a post belongs to two unconnected users, which can only happen if one of them is the author, set its owner to the one that is the author
	  }
	}
  });
}
function setPostCountElements() {
  posts.forEach(function(post) {
	post.fragment.firstChild.textContent = "(" + post.user.postCount + ")";
  });
}
function setPostLinkElements() {
  var lastPosts = {}; //dictionary => userID / post object; remember last post for each poster so that we can create links between them
  posts.forEach(function(post) {
	var lastPost = lastPosts[post.user.id];
	if (lastPost) {
	  setLinkTarget(post.fragment.children[1], lastPost.postID);
	  setLinkTarget(lastPost.fragment.children[2], post.postID);
	}
	lastPosts[post.user.id] = post;
  });
}
function setLinkTarget(link, targetPostID) {
  link.className = "inherit";
  link.href = hrefString + targetPostID;
  link.onclick = function() { return highlight(targetPostID, true); };
  //unfortunately, previews break links which navigate down to a later post. TGchan <:)
  //link.className = "ref|"+boardName+"|"+threadID+"|" + targetPostID;
  //addmouseoverevents(link, targetPostID);
}
/*function addmouseoverevents(link, targetPostID) {
  if (link.addEventListener) {
    link.addEventListener("mouseover", addreflinkpreview, false);
    link.addEventListener("mouseout", delreflinkpreview, false);
  }
  else if (link.attachEvent) {
    link.attachEvent("onmouseover", addreflinkpreview);
    link.attachEvent("onmouseout", delreflinkpreview);
  }
}*/
function setPostUpdates() {
  // Updates are posts made by the author and, in case of image quests, author posts that contain files or icons
  posts.forEach(function(post) {
	if (post.user == author) {
	  if (post.fileName || post.activeContent) { //image post
		if (!questFixes.wrongImageUpdates[post.postID]) {
		  post.isUpdate = true;
		}
		else if (!questFixes.ignoreTextPosts[post.userID] && !questFixes.ignoreTextPosts[post.name]) {
		  post.isAuthorComment = true;
		}
	  }
	  else if (!questFixes.ignoreTextPosts[post.userID] && !questFixes.ignoreTextPosts[post.name]) { //text post
		if (!questFixes.wrongTextUpdates[post.postID] && (!imageQuest || isTextPostAnUpdate(post))) {
		  post.isUpdate = true;
		}
		else {
		  post.isAuthorComment = true;
		}
	  }
	  if (questFixes.missedTextUpdates[post.postID]) {
		if (debug) console.log(`Manually fixed missing update: ${post.postID}`);
		post.isUpdate = true;
		post.isAuthorComment = false;
	  }
	}
  });
}
function isTextPostAnUpdate(post) {
  if (regex.fraction.test(post.subject)) { //if the post subject contains a fraction e.g "update 1/4", then it's likely to be an update
	return true;
  }
  //extract post's text, but ignore text inside spoilers, links, dice rolls or any brackets
  var filteredContentText = "";
  post.contentElement.childNodes.forEach(function(node) {
	if (node.className !== "spoiler" && node.nodeName != "A" && (node.nodeName != "B" || !regex.diceRoll.test(node.textContent))) {
	  filteredContentText += node.textContent;
	}
  });
  filteredContentText = filteredContentText.replace(regex.bracketedTexts, "").trim();
  //if the post contains dialogue, then it's likely to be an update
  var quotedTexts = filteredContentText.match(regex.quotedTexts) || [];
  for (let q of quotedTexts) {
	if (regex.endsWithPunctuation.test(q)) {
	  return true;
	}
  }
  return false;
}
function setPostMetadata() {
  var lastPost = posts[(posts.length - 1)];
  var suggestionsGroup = {}; //dictionary => userID / array[postID] ; a group of posts made in-between two updates, grouped by user ID
  posts.forEach(function(post) {
	if (!post.isUpdate) {
	  if (!suggestionsGroup[post.user.id]) {
		suggestionsGroup[post.user.id] = [];
	  }
	  suggestionsGroup[post.user.id].push(post);
	}
	if (post.isUpdate || post == lastPost) { //process the group of suggestions
	  detectMultiposts(suggestionsGroup);
	  suggestionsGroup = {};
	}
	if (debug && post.isUpdate) post.fragment.appendChild(getNewCrimsonSpan(` (${!post.fileName && !post.activeContent ? "text " : ""}update)`));
	if (!post.isUpdate && post.fileName) {
	  post.fragment.appendChild(getNewCrimsonSpan(" (non-update)"));
	}
	if (post.isAuthorComment) {
	  post.fragment.appendChild(getNewCrimsonSpan(" (author comment)"));
	}
  });
}
function detectMultiposts(suggestionsGroup) {
  for (var userID in suggestionsGroup) {
	var user = suggestionsGroup[userID][0].user;
	var suggestions = suggestionsGroup[userID];
	var count = suggestions.length
	if (count == user.postCount) {
	  for (let i = 0; i < count; i++) { //mark post count for (new) posters who only made posts in this update
		suggestions[i].fragment.firstChild.className = "postCount crimson";
	  }
	}
	if (count > 1 && user != author) {
	  for (let i = 0; i < count; i++) { //mark posts of the users that made multiple posts inside an update
		suggestions[i].fragment.appendChild(getNewCrimsonSpan(" post " + (i+1) + "/" + count));
	  }
	}
  }
}
function getNewCrimsonSpan(text) {
  var newSpan = document.createElement("span");
  newSpan.textContent = text;
  newSpan.className = "crimson";
  return newSpan;
}

function getPredictedFileName(fileName, inc) {
  if (!fileName) {
	return;
  }
  var matches = fileName.match(regex.lastNumber);
  if (!matches) {
	return "";
  }
  //e.g. quest50.png => quest51.png
  return fileName.replace(regex.lastNumber, (+matches[1]+inc+"").padStart(matches[1].length,0)+"$2");
}

function insertCSS() {
  var newStyle = document.createElement("style");
  newStyle.innerText = " .inherit { color: inherit; } .crimson { color: crimson; } .disabled { color: grey; } .disabled:hover { color: grey; } .postCount { margin-left: 3px; } .navIcon { width: 12px; height: 18px; vertical-align: text-top; }";
  document.body.appendChild(newStyle);
}
function insertButtonIcons() {
  document.body.insertAdjacentHTML("beforeend",`
<div style="height: 0; width: 0; position: fixed;">
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <symbol viewBox="0 0 24 24" id="navUp"><path stroke="currentColor" fill="none" stroke-width="3" stroke-miterlimit="10" d="M3 22.5l9-9 9 9M3 13.5l9-9 9 9"/></symbol>
  <symbol viewBox="0 0 24 24" id="navDown"><path stroke="currentColor" fill="none" stroke-width="3" stroke-miterlimit="10" d="M3 11.5l9 9 9-9M3 2.5l9 9 9-9"/></symbol>
 </svg>
</div>`);
}
function insertPostInfo() {
  posts.forEach(function(post) {
	post.insertElement.parentNode.insertBefore(post.fragment, post.insertElement.nextSibling);
  });
}
function getUsers() {
  var users = Object.values(userNodes).filter(u => u.parent == u).map(u => Object.keys(userNodes).filter(k => find(userNodes[k]) == u));
  var sortedUsers = users.filter(u => u.length > 1 && find(userNodes[u[0]]) != author);
  var anons = users.filter(u => u.length == 1 && u[0] != author.id);
  sortedUsers.sort((a, b) => { return find(userNodes[b[0]]).postCount - find(userNodes[a[0]]).postCount; });
  sortedUsers.splice(0, 0, users.filter(u => find(userNodes[u[0]]) == author)[0]);
  sortedUsers.forEach(function(arr) {
	arr.sort((a,b) => { var am = regex.canonID.test(a); var bm = regex.canonID.test(b); if (am && bm || !am && !bm) return a.localeCompare(b); else return am ? 1 : -1; });
	arr.splice(0, 0, find(userNodes[arr[0]]).postCount);
  });
  anons.sort((a,b) => { return userNodes[b].postCount - userNodes[a].postCount; });
  anons = anons.map( anonID => `${anonID} (${userNodes[anonID].postCount})` );
  anons.splice(0, 0, "Anons:");
  sortedUsers.push(anons);
  return sortedUsers;
}

//Welcome to UNION-FIND. I'm using this algorithm to group id's and names
function makeSet(id) {
  var userNode = userNodes[id];
  if (!userNode) {
	var newUser = { id: id, postCount: 0, fileCount: 0 }; //I'm a special snowflake, so I'm gonna be using postCount instead of rank/size to determine how to merge sets
	newUser.parent = newUser;
    userNodes[id] = newUser;
	return newUser;
  }
  return userNode;
}
function find(node) { //find with included path compression
  while (node.parent != node) {
    var curr = node;
    node = node.parent;
    curr.parent = node.parent;
  }
  return node;
}
function union(node1, node2) {
  var node1root = find(node1);
  var node2root = find(node2);
  if (node1root == node2root) {
    return node1root;
  }
  if (node1root.postCount < node2root.postCount) {
    var temp = node1root;
    node1root = node2root;
	node2root = temp;
  }
  node2root.parent = node1root;
  node1root.postCount += node2root.postCount;
  node1root.fileCount += node2root.fileCount;
  return node1root;
}

function getFixes(threadID) {
  var allFixes = getAllFixes();
  var fixes = allFixes[threadID] || { };
  //convert array values to lower case and then into object properties for faster access
  for (let prop of [ "missedAuthors", "missedTextUpdates", "wrongTextUpdates", "wrongImageUpdates", "ignoreTextPosts" ]) {
	if (!fixes[prop]) {
	  fixes[prop] = { };
	}
	else { //can't use Array.reduce() because tgchan's js library protoaculous destroyed it
	  fixes[prop] = fixes[prop].reduceRight((acc, el) => { if (!el.startsWith("!")) el = el.toLowerCase(); acc[el] = true; return acc; }, { });
	}
  }
  return fixes;
}

// Manual fixes. In some cases it's simply impossible to automatically determine which posts are updates. So we fix those rare cases manually.
// list last updated on:
// 2018/07/19

//missedAuthors: User IDs which should be linked to the author. Either because the automation failed, or the quest has guest authors / is a collaboration.
//ignoreTextPosts: User IDs of which text posts should not be set as author comments. It happens when a suggester shares an ID with the author and this suggester makes a text post. Or if the guest authors make suggestions.
//(An empty ignoreTextPosts string matches posts with an empty/default poster name)
//missedImageUpdates: Actually, no such fixes exist. All missed image update posts are added through adding author IDs to missedAuthors.
//missedTextUpdates: Post IDs of text-only posts which are not author comments, but quest updates. It happens when authors make text updates in image quests. Or forget to attach an image to the update post.
//wrongImageUpdates: Post IDs of image posts which are not quest updates. It happens when a suggester shares an ID with the author(s) and this suggester makes an image post. Or a guest author posts a non-update image post.
//wrongTextUpdates: Post IDs of text-only posts which were misidentified as updates. It happens when an author comment contains a valid quote and the script accidentally thinks some dialogue is going on.
//imageQuest: Forcefully set quest type. It happens when the automatically-determined quest type is incorrect. Either because of too many image updates in a text quest, or text updates in an image quest.
//(Also, if most of the author's text posts in an image quest are updates, then it's sometimes simpler to set the quest as a text quest, rather than picking them out one by one.)
function getAllFixes() {
  return {
	12: { missedAuthors: [ "!g9Qfmdqho2" ] },
	26: { ignoreTextPosts: [ "Coriell", "!DHEj4YTg6g" ] },
	101: { wrongTextUpdates: [ "442" ] },
	171: { wrongTextUpdates: [ "1402" ] },
	504: { missedTextUpdates: [ "515", "597", "654", "1139", "1163", "1180", "7994", "9951" ] },
	998: { ignoreTextPosts: [ "" ] },
	1292: { missedAuthors: [ "Chaptermaster II" ], missedTextUpdates: [ "1311", "1315", "1318" ], ignoreTextPosts: [ "" ] },
	1702: { wrongImageUpdates: [ "2829" ] },
	3090: { ignoreTextPosts: [ "", "!94Ud9yTfxQ", "Glaive" ] },
	4602: { missedTextUpdates: [ "4630", "6375" ] },
	7173: { missedTextUpdates: [ "8515", "10326" ] },
	8906: { missedTextUpdates: [ "9002", "9009" ] },
	9190: { missedTextUpdates: [ "26073" ] },
	13595: { wrongTextUpdates: [ "18058" ] },
	16114: { missedTextUpdates: [ "20647" ] },
	17833: { ignoreTextPosts: [ "!swQABHZA/E" ] },
	19308: { missedTextUpdates: [ "19425", "19600", "19912" ] },
	19932: { missedTextUpdates: [ "20038", "20094", "20173", "20252" ] },
	21601: { missedTextUpdates: [ "21629", "21639" ] },
	21853: { missedTextUpdates: [ "21892", "21898", "21925", "22261", "22266", "22710", "23308", "23321", "23862", "23864", "23900", "24206", "25479", "25497", "25943", "26453", "26787", "26799",
								 "26807", "26929", "27328", "27392", "27648", "27766", "27809", "29107", "29145" ] },
	22208: { missedAuthors: [ "fb5d8e" ] },
	24530: { wrongImageUpdates: [ "25023" ] },
	25354: { imageQuest: false},
	26933: { missedTextUpdates: [ "26935", "26955", "26962", "26967", "26987", "27015", "28998" ] },
	29636: { missedTextUpdates: [ "29696", "29914", "30025", "30911" ], wrongImageUpdates: [ "30973", "32955", "33107" ] },
	30350: { imageQuest: false, wrongTextUpdates: [ "30595", "32354", "33704" ] },
	30357: { missedTextUpdates: [ "30470", "30486", "30490", "30512", "33512" ] },
	33329: { wrongTextUpdates: [ "43894" ] },
	37304: { missedAuthors: [ "Cruxador", "!ifOCf11HXk" ], ignoreTextPosts: [ "", "GREEN", "!!x2ZmLjZmyu", "Adept", "Cruxador", "!ifOCf11HXk" ] },
	37954: { missedTextUpdates: [ "41649" ] },
	38276: { ignoreTextPosts: [ "!ifOCf11HXk" ] },
	41510: { missedTextUpdates: [ "41550", "41746" ] },
	44240: { missedTextUpdates: [ "44324", "45768", "45770", "48680", "48687" ] },
	45522: { missedTextUpdates: [ "55885" ] },
	45986: { missedTextUpdates: [ "45994", "46019" ] },
	49306: { missedTextUpdates: [ "54246" ] },
	49400: { ignoreTextPosts: [ "!!IzZTIxBQH1" ] },
	49937: { missedAuthors: [ "91caa1", "964033" ], missedTextUpdates: [ "52386" ] },
	53129: { wrongTextUpdates: [ "53505" ] },
	53585: { missedAuthors: [ "b1e366", "aba0a3", "18212a", "6756f8", "f98e0b", "1c48f4", "f4963f", "45afb1", "b94893", "135d9a" ], ignoreTextPosts: [ "", "!7BHo7QtR6I", "Test Pattern", "Rowan", "Insomnia", "!!L1ZwWyZzZ5" ] },
	54766: { missedAuthors: [ "9f0d45", "e16ca8", "fba9cb" ], ignoreTextPosts: [ "!!IzZTIxBQH1" ] },
	56194: { wrongTextUpdates: [ "61608" ] },
	59263: { missedTextUpdates: [ "64631" ] },
	62091: { imageQuest: true},
	65742: { missedTextUpdates: [ "66329", "66392", "67033", "67168" ] },
	67058: { missedTextUpdates: [ "67191", "67685" ] },
	68065: { missedAuthors: [ "158531", "7452df", "1d8589" ], ignoreTextPosts: [ "!!IzZTIxBQH1" ] },
	70778: { missedAuthors: [ "93e8e3" ] },
	70887: { missedAuthors: [ "e53955", "7c9cdd", "2084ff", "68d70c", "064d19", "51efff", "d3c8d2" ], ignoreTextPosts: [ "!!IzZTIxBQH1" ] },
	71660: { missedAuthors: [ "fa673e" ] },
	72794: { wrongTextUpdates: [ "76740" ] },
	74474: { missedAuthors: [ "309964" ] },
	75425: { missedTextUpdates: [ "75450", "75463", "75464", "75472", "75490", "75505", "77245" ] },
	75763: { missedAuthors: [ "068b0e", "c4f7d3" ], ignoreTextPosts: [ "!!IzZTIxBQH1" ] },
	76892: { missedTextUpdates: [ "86875", "86884", "87047", "88315" ] },
	79146: { missedAuthors: [ "4a3269" ] },
	79654: { missedTextUpdates: [ "83463", "83529" ] },
	79782: { missedTextUpdates: [ "79975", "80045" ] },
	82970: { missedTextUpdates: [ "84734" ] },
	83325: { missedAuthors: [ "076064" ] },
	84134: { imageQuest: false},
	85235: { missedTextUpdates: [ "85257", "85282", "113215", "114739", "151976", "152022", "159250" ] },
	86304: { missedAuthors: [ "ee22d7" ] },
	88264: { missedAuthors: [ "3fec76", "714b9c" ] },
	92162: { missedAuthors: [ "131526", "74fd41" ] },
	92605: { ignoreTextPosts: [ "" ] },
	94645: { missedTextUpdates: [ "97352" ] },
	95242: { missedTextUpdates: [ "95263" ] },
	96023: { missedTextUpdates: [ "96242" ] },
	96466: { ignoreTextPosts: [ "Reverie" ] },
	96481: { imageQuest: true},
	97014: { missedTextUpdates: [ "97061", "97404", "97915", "98124", "98283", "98344", "98371", "98974", "98976", "98978", "99040", "99674", "99684" ] },
	99095: { wrongImageUpdates: [ "111452" ] },
	99132: { ignoreTextPosts: [ "" ] },
	100346: { missedTextUpdates: [ "100626", "100690", "100743", "100747", "101143", "101199", "101235", "101239" ] },
	101388: { ignoreTextPosts: [ "Glaive" ] },
	102433: { missedTextUpdates: [ "102519", "102559", "102758" ] },
	102899: { missedTextUpdates: [ "102903" ] },
	103435: { missedTextUpdates: [ "104279", "105950" ] },
	103850: { ignoreTextPosts: [ "" ] },
	106656: { wrongTextUpdates: [ "115606" ] },
	107789: { missedTextUpdates: [ "107810", "107849", "107899" ] },
	109071: { missedTextUpdates: [ "109417" ] },
	111967: { missedAuthors: [ "498c52" ] },
	112133: { missedTextUpdates: [ "134867" ] },
	112414: { missedTextUpdates: [ "112455" ] },
	113768: { missedAuthors: [ "e9a4f7" ] },
	114133: { ignoreTextPosts: [ "" ] },
	115831: { missedTextUpdates: [ "115862" ] },
	119431: { ignoreTextPosts: [ "" ] },
	120384: { missedAuthors: [ "233aab" ] },
	126204: { imageQuest: true, missedTextUpdates: [ "127069", "127089", "161046", "161060", "161563" ] },
	126248: { missedTextUpdates: [ "193064" ] },
	128706: { missedAuthors: [ "2e2f06", "21b50e", "e0478c", "9c87f6", "931351", "e294f1", "749d64", "f3254a" ] },
	130991: { missedAuthors: [ "05411b" ] },
	131255: { missedTextUpdates: [ "151218" ] },
	137683: { missedTextUpdates: [ "137723" ] },
	139086: { ignoreTextPosts: [ "!TEEDashxDA" ] },
	139513: { missedTextUpdates: [ "139560" ] },
	141257: { missedTextUpdates: [ "141263", "141290", "141513", "146287" ], ignoreTextPosts: [ "" ], wrongImageUpdates: [ "141265" ] },
	146112: { missedAuthors: [ "//_emily" ] },
	153225: { missedTextUpdates: [ "153615", "153875" ] },
	155665: { missedTextUpdates: [ "155670", "155684", "155740" ] },
	156257: { missedTextUpdates: [ "156956" ] },
	157277: { missedAuthors: [ "23c8f1", "8bb533" ] },
	161117: { missedTextUpdates: [ "167255", "168000" ] },
	162089: { missedTextUpdates: [ "167940" ] },
	164793: { missedAuthors: [ "e973f4" ], ignoreTextPosts: [ "!TEEDashxDA" ] },
	165537: { missedAuthors: [ "a9f6ce" ] },
	173621: { ignoreTextPosts: [ "" ] },
	174398: { missedAuthors: [ "bf0d4e", "158c5c" ] },
	176965: { missedTextUpdates: [ "177012" ] },
	177281: { missedTextUpdates: [ "178846" ] },
	181790: { ignoreTextPosts: [ "Mister Brush" ], wrongImageUpdates: [ "182280" ] },
	183194: { wrongImageUpdates: [ "183207" ] },
	183637: { imageQuest: false, wrongTextUpdates: [ "183736" ] },
	185345: { wrongTextUpdates: [ "185347" ] },
	185579: { missedTextUpdates: [ "188091", "188697", "188731", "188748", "190868" ] },
	186709: { missedTextUpdates: [ "186735" ] },
	188253: { missedTextUpdates: [ "215980", "215984", "222136" ] },
	188571: { missedTextUpdates: [ "188633" ] },
	188970: { ignoreTextPosts: [ "" ] },
	191328: { missedAuthors: [ "f54a9c", "862cf6", "af7d90", "4c1052", "e75bed", "09e145" ] },
	191976: { missedAuthors: [ "20fc85" ] },
	192879: { missedTextUpdates: [ "193009" ] },
	193934: { missedTextUpdates: [ "212768" ] },
	196310: { missedTextUpdates: [ "196401" ] },
	196517: { missedTextUpdates: [ "196733" ] },
	198458: { missedTextUpdates: [ "198505", "198601", "199570" ] },
	200054: { missedAuthors: [ "a4b4e3" ] },
	201427: { missedTextUpdates: [ "201467", "201844" ] },
	203072: { missedTextUpdates: [ "203082", "203100", "206309", "207033", "208766" ] },
	206945: { missedTextUpdates: [ "206950" ] },
	207011: { ignoreTextPosts: [ "!TEEDashxDA" ] },
	207296: { missedTextUpdates: [ "214551" ] },
	207756: { missedTextUpdates: [ "208926" ] },
	209334: { missedTextUpdates: [ "209941" ] },
	210613: { missedTextUpdates: [ "215711", "220853" ] },
	210928: { missedTextUpdates: [ "215900" ] },
	211320: { ignoreTextPosts: [ "Kindling", "Bahu" ], wrongImageUpdates: [ "211587", "215436" ] },
	212584: { missedAuthors: [ "40a8d3" ] },
	212915: { missedTextUpdates: [ "229550" ] },
	217193: { missedAuthors: [ "7f1ecd", "620bfb", "c00244", "b4b04d", "a7a85a", "7c97d9", "05c9fd", "426169", "55c4cf", "1963d1", "cf68aa", "8c0848", "491db1", "f202ec", "c2c011", "858819", "e15f89",
							  "e31d52", "3ce5b4", "c1f2ce", "5f0943", "1dc978", "d65652", "72528c", "446ab5", "f906a7", "010554", "dad664", "a594b9", "231806" ] },
	217269: { imageQuest: false, wrongTextUpdates: [ "217860", "219314" ] },
	218385: { missedAuthors: [ "812dcf" ] },
	220049: { missedAuthors: [ "Slinkoboy" ], ignoreTextPosts: [ "Slinkoboy" ], wrongImageUpdates: [ "228035" ] },
	222777: { imageQuest: false},
	224095: { missedTextUpdates: [ "224196", "224300", "224620", "244476" ] },
	233213: { missedTextUpdates: [ "233498" ], ignoreTextPosts: [ "Bahu" ] },
	234437: { missedTextUpdates: [ "234657" ] },
	237125: { missedTextUpdates: [ "237192" ] },
	237665: { imageQuest: true, ignoreTextPosts: [ "" ] },
	238281: { ignoreTextPosts: [ "TK" ] },
	238993: { missedTextUpdates: [ "239018", "239028", "239094" ] },
	240824: { imageQuest: false},
	241467: { missedTextUpdates: [ "241709" ] },
	242200: { missedTextUpdates: [ "246465", "246473", "246513" ] },
	242657: { missedAuthors: [ "2563d4" ] },
	244225: { missedTextUpdates: [ "245099", "245195", "245201" ] },
	244557: { missedTextUpdates: [ "244561" ], ignoreTextPosts: [ "" ] },
	244830: { missedAuthors: [ "e33093" ] },
	247108: { ignoreTextPosts: [ "Bahu" ], wrongImageUpdates: [ "258883", "265446" ] },
	247714: { missedTextUpdates: [ "247852" ] },
	248067: { missedAuthors: [ "bf1e7e" ], ignoreTextPosts: [ "" ] },
	248856: { ignoreTextPosts: [ "" ] },
	248880: { imageQuest: true, ignoreTextPosts: [ "", "!qkgg.NzvRY", "!!EyA2IwLwVl", "!I10GFLsZCw", "!k6uRjGDgAQ", "Seven01a19" ] },
	251909: { missedTextUpdates: [ "255400" ] },
	252195: { missedTextUpdates: [ "260890" ] },
	252944: { missedAuthors: [ "Rizzie" ], ignoreTextPosts: [ "", "!!EyA2IwLwVl", "Seven01a19" ] },
	256339: { missedTextUpdates: [ "256359", "256379", "256404", "256440" ] },
	257726: { missedAuthors: [ "917cac" ] },
	258304: { missedTextUpdates: [ "269087" ] },
	261572: { imageQuest: false},
	261837: { missedAuthors: [ "14149d" ] },
	262128: { missedTextUpdates: [ "262166", "262219", "262455", "262500" ] },
	262574: { missedAuthors: [ "b7798b", "0b5a64", "687829", "446f39", "1aa4f8", "cc1ccd", "9d3d72", "72d5e4", "932db9", "4d7cb4", "4635e1", "9f327a", "940ab2", "a660d0" ], ignoreTextPosts: [ "" ] },
	263831: { imageQuest: false, wrongTextUpdates: [ "264063", "264716", "265111", "268733", "269012", "270598", "271254", "271852", "271855", "274776", "275128", "280425", "280812", "282417", "284354", "291231", "300074", "305150" ] },
	265656: { ignoreTextPosts: [ "Glaive17" ] },
	266542: { missedAuthors: [ "MidKnight", "c2c011", "f5e4b4", "e973f4", "d6aefc", "f123de", "2563d4", "6547ec" ], ignoreTextPosts: [ "", "!TEEDashxDA", "Not Cirr", "Ñ" ] },
	267348: { ignoreTextPosts: [ "" ] },
	269735: { ignoreTextPosts: [ "---" ] },
	270556: { ignoreTextPosts: [ "Bahu" ], wrongImageUpdates: [ "276022" ] },
	273047: { missedAuthors: [ "db463d", "16f0be", "77df62", "b6733e", "d171a3", "3a95e1", "21d450" ] },
	274088: { missedAuthors: [ "4b0cf3" ], missedTextUpdates: [ "294418" ], ignoreTextPosts: [ "" ] },
	274466: { missedAuthors: [ "c9efe3" ] },
	276562: { missedTextUpdates: [ "277108" ] },
	277371: { ignoreTextPosts: [ "!TEEDashxDA" ] },
	278168: { ignoreTextPosts: [ "!TEEDashxDA" ] },
	280381: { ignoreTextPosts: [ "!7BHo7QtR6I" ] },
	280985: { ignoreTextPosts: [ "!TEEDashxDA" ] },
	283246: { imageQuest: false},
	285210: { ignoreTextPosts: [ "", "Weaver" ] },
	287296: { ignoreTextPosts: [ "", "Asplosionz" ] },
	288346: { missedAuthors: [ "383006", "bf1e7e" ], ignoreTextPosts: [ "383006", "bf1e7e" ] },
	289254: { imageQuest: false},
	292033: { wrongTextUpdates: [ "295088" ] },
	293532: { ignoreTextPosts: [ "" ] },
	294351: { ignoreTextPosts: [ "Weaver" ] },
	295374: { ignoreTextPosts: [ "TK" ] },
	295832: { missedAuthors: [ "ac22cd", "7afbc4", "6f11ff" ], missedTextUpdates: [ "313940" ] },
	295949: { missedTextUpdates: [ "296256", "297926", "298549" ] },
	298133: { missedTextUpdates: [ "298187" ] },
	298860: { imageQuest: true, missedTextUpdates: [ "298871", "298877", "298880", "298908" ] },
	299352: { imageQuest: true, missedTextUpdates: [ "299375", "299627", "303689" ] },
	300694: { ignoreTextPosts: [ "TK" ] },
	300751: { missedTextUpdates: [ "316287" ] },
	303859: { ignoreTextPosts: [ "" ] },
	308257: { missedTextUpdates: [ "314653" ] },
	309753: { missedTextUpdates: [ "309864", "309963", "310292", "310944", "310987", "311202", "311219", "311548" ] },
	310586: { missedTextUpdates: [ "310945", "312747", "313144" ] },
	311021: { missedAuthors: [ "049dfa", "f2a6f9" ] },
	312418: { missedTextUpdates: [ "312786", "312790", "312792", "312984", "313185" ] },
	314825: { ignoreTextPosts: [ "TK" ] },
	314940: { missedTextUpdates: [ "314986", "315198", "329923" ] },
	318478: { ignoreTextPosts: [ "Toxoglossa" ] },
	319491: { ignoreTextPosts: [ "Bahu" ] },
	323481: { missedTextUpdates: [ "323843", "324125", "324574" ] },
	323589: { missedTextUpdates: [ "329499" ] },
	327468: { missedTextUpdates: [ "327480", "337008" ] },
	337661: { ignoreTextPosts: [ "", "hisgooddog" ] },
	338579: { ignoreTextPosts: [ "", "Zealo8", "Ñ" ] },
	343668: { missedTextUpdates: [ "343671" ] },
	348635: { ignoreTextPosts: [ "" ] },
	351064: { missedTextUpdates: [ "351634", "353263", "355326", "356289" ] },
	351264: { missedTextUpdates: [ "353077" ] },
	354201: { imageQuest: true, missedTextUpdates: [ "354340" ] },
	355404: { ignoreTextPosts: [ "Bahu" ] },
	356715: { missedTextUpdates: [ "356722" ] },
	357723: { missedAuthors: [ "7bad01", "aa4c27", "0448b9", "b9c01a" ], ignoreTextPosts: [ "", "SoqWizard" ] },
	359879: { imageQuest: false},
	359931: { missedAuthors: [ "Liam", "Dasaki", "Rynh", "Kinasa", "178c80" ], ignoreTextPosts: [ "", "Gnoll", "Lost Planet", "Dasaki", "Slinkoboy" ] },
	360617: { missedAuthors: [ "7a7217" ] },
	363529: { ignoreTextPosts: [ "Tenyoken" ] },
	365082: { missedTextUpdates: [ "381411", "382388" ] },
	366586: { missedAuthors: [ "f72f26" ] },
	366944: { missedTextUpdates: [ "367897" ] },
	367145: { wrongTextUpdates: [ "367887" ] },
	367824: { missedTextUpdates: [ "367841", "367858", "367948" ] },
	375293: { ignoreTextPosts: [ "Bahu" ] },
	382864: { ignoreTextPosts: [ "FlynnMerk" ] },
	387602: { missedAuthors: [ "!a1..dIzWW2" ], ignoreTextPosts: [ "!a1..dIzWW2" ], wrongImageUpdates: [ "390207", "392018", "394748" ] },
	388264: { ignoreTextPosts: [ "" ] },
	389918: { missedAuthors: [ "Doolbag" ] },
	392034: { missedAuthors: [ "046f13", "28ea8b" ] },
	392868: { missedAuthors: [ "e1359e" ] },
	393082: { ignoreTextPosts: [ "" ] },
	395700: { missedTextUpdates: [ "395701", "395758" ] },
	395817: { ignoreTextPosts: [ "" ] },
	397819: { ignoreTextPosts: [ "Bahu", "K-Dogg" ], wrongImageUpdates: [ "398064" ] },
	399426: { missedAuthors: [ "England Hat" ] },
	400842: { missedAuthors: [ "067a04", "b0d466" ], ignoreTextPosts: [ "", "!a1..dIzWW2" ], wrongImageUpdates: [ "412172", "412197" ] },
	403418: { missedAuthors: [ "02cbc6" ] },
	404177: { missedTextUpdates: [ "404633" ] },
	404491: { missedAuthors: [ "d6ae01" ] },
	409356: { missedTextUpdates: [ "480664", "485493" ], wrongTextUpdates: [ "492824" ] },
	410618: { ignoreTextPosts: [ "kathryn" ], wrongImageUpdates: [ "417836" ] },
	412463: { ignoreTextPosts: [ "" ] },
	413494: { ignoreTextPosts: [ "Bahu" ] },
	420600: { imageQuest: false},
	421477: { imageQuest: false},
	422052: { missedAuthors: [ "!a1..dIzWW2" ] },
	422087: { ignoreTextPosts: [ "Caz" ] },
	422856: { ignoreTextPosts: [ "", "???" ] },
	424198: { missedAuthors: [ "067a04" ], ignoreTextPosts: [ "!a1..dIzWW2" ] },
	425677: { missedTextUpdates: [ "425893", "426741", "431953" ] },
	426019: { ignoreTextPosts: [ "Taskuhecate" ] },
	427135: { ignoreTextPosts: [ "!7BHo7QtR6I" ] },
	427676: { ignoreTextPosts: [ "FRACTAL" ] },
	428027: { missedAuthors: [ "Larro", "Slinkoboy", "Robin", "Brom" ], ignoreTextPosts: [ "notrottel", "Bahu", "!a1..dIzWW2", "Trout", "Larro", "", "cuoqet" ], wrongImageUpdates: [ "428285", "498295" ] },
	430036: { missedTextUpdates: [ "430062", "430182", "430416" ], ignoreTextPosts: [ "" ] },
	431445: { imageQuest: false, missedAuthors: [ "efbb86" ] },
	435947: { missedTextUpdates: [ "436059" ] },
	437675: { wrongTextUpdates: [ "445770", "449255", "480401" ] },
	437768: { missedTextUpdates: [ "446536" ] },
	438515: { ignoreTextPosts: [ "TK" ] },
	438670: { ignoreTextPosts: [ "" ] },
	441226: { imageQuest: true, missedAuthors: [ "6a1ec2", "99090a", "7f2d33" ] },
	441745: { missedTextUpdates: [ "443831" ] },
	447830: { imageQuest: false, missedAuthors: [ "fc985a", "f8b208" ], wrongTextUpdates: [ "448476", "450379", "452161" ] },
	448900: { missedAuthors: [ "Pudding", "0c2256", "PuddOmega" ] },
	449505: { wrongTextUpdates: [ "450499" ] },
	450563: { missedAuthors: [ "6a1ec2", "!!AwZwHkBGWx", "Ham", "Conium", "Oregano" ], ignoreTextPosts: [ "", "chirps", "!!AwZwHkBGWx", "!!AwZwHkBGWx", "Ham" ] },
	452871: { missedAuthors: [ "General Q. Waterbuffalo", "!cZFAmericA" ], missedTextUpdates: [ "456083" ] },
	453480: { ignoreTextPosts: [ "TK" ], wrongImageUpdates: [ "474233" ] },
	453978: { missedTextUpdates: [ "453986" ] },
	454256: { missedTextUpdates: [ "474914", "474957" ] },
	456185: { ignoreTextPosts: [ "TK" ], wrongTextUpdates: [ "472446" ], wrongImageUpdates: [ "592622" ] },
	456798: { missedTextUpdates: [ "516303" ] },
	458432: { missedAuthors: [ "259cce", "34cbef" ] },
	463595: { missedTextUpdates: [ "463711", "465024", "465212", "465633", "467107", "467286" ], wrongTextUpdates: [ "463623" ] },
	464038: { missedAuthors: [ "266c5b", "df885d", "8474cd" ] },
	465919: { missedTextUpdates: [ "465921" ] },
	469321: { missedTextUpdates: [ "469332" ] },
	471304: { missedAuthors: [ "1766db" ] },
	476554: { ignoreTextPosts: [ "Fish is yum" ] },
	478624: { missedAuthors: [ "88c9b2" ] },
	479289: { missedAuthors: [ "67ba4b", "14a1d0" ] },
	479712: { ignoreTextPosts: [ "" ] },
	481277: { missedTextUpdates: [ "481301", "482210" ], ignoreTextPosts: [ "Santova" ] },
	481491: { missedTextUpdates: [ "481543", "481575", "484069" ], ignoreTextPosts: [ "Zach Leigh", "Santova", "Outaki Shiba" ] },
	482391: { missedTextUpdates: [ "482501", "482838" ] },
	482629: { missedTextUpdates: [ "484220", "484437" ], ignoreTextPosts: [ "Santova", "Tera Nospis" ] },
	483108: { missedAuthors: [ "2de44c" ], missedTextUpdates: [ "483418", "483658" ], ignoreTextPosts: [ "Santova" ] },
	484423: { missedTextUpdates: [ "484470", "486761", "488602" ], ignoreTextPosts: [ "Tera Nospis", "Zach Leigh" ] },
	484606: { missedTextUpdates: [ "486773" ], ignoreTextPosts: [ "Zach Leigh" ] },
	485964: { missedTextUpdates: [ "489145", "489760" ], ignoreTextPosts: [ "Tera Nospis", "Santova" ] },
	489488: { missedTextUpdates: [ "490389" ] },
	489694: { missedAuthors: [ "2c8bbe", "30a140", "8c4b01", "8fbeb2", "2b7d97", "17675d", "782175", "665fcd", "e91794", "52019c", "8ef0aa", "e493a6", "c847bc" ] },
	489830: { missedAuthors: [ "9ee824", "8817a0", "b8481c", "d81bd3", "704658" ] },
	490689: { ignoreTextPosts: [ "Santova" ] },
	491171: { ignoreTextPosts: [ "Santova", "Zach Leigh", "Zack Leigh", "The Creator" ] },
	491314: { missedTextUpdates: [ "491498" ], ignoreTextPosts: [ "" ] },
	492511: { missedAuthors: [ "???" ] },
	493099: { ignoreTextPosts: [ "Zach Leigh", "Santova" ] },
	494015: { ignoreTextPosts: [ "Coda", "drgruff" ] },
	496561: { ignoreTextPosts: [ "Santova", "DJ LaLonde", "Tera Nospis" ] },
	498874: { ignoreTextPosts: [ "Santova" ] },
	499607: { ignoreTextPosts: [ "Santova", "Tera Nospis" ] },
	499980: { ignoreTextPosts: [ "Santova", "Tera Nospis", "DJ LaLonde" ] },
	500015: { missedTextUpdates: [ "500020", "500029", "500274", "501462", "501464", "501809", "505421" ], ignoreTextPosts: [ "suggestion", "Chelz" ] },
	502751: { ignoreTextPosts: [ "suggestion" ] },
	503053: { missedAuthors: [ "Shopkeep", "CAI" ] },
	505072: { missedAuthors: [ "Necro" ], missedTextUpdates: [ "565461" ] },
	505569: { ignoreTextPosts: [ "!TEEDashxDA" ] },
	505633: { missedTextUpdates: [ "505694", "529582" ] },
	505796: { ignoreTextPosts: [ "Mister-Saturn" ] },
	506555: { ignoreTextPosts: [ "Tera Nospis" ] },
	507761: { ignoreTextPosts: [ "", "Rue" ] },
	508294: { missedTextUpdates: [ "508618" ] },
	509510: { missedTextUpdates: [ "509810", "510805", "510812", "510943", "511042", "512430", "514731", "515963" ] },
	510067: { missedTextUpdates: [ "510081" ] },
	511816: { imageQuest: true, missedTextUpdates: [ "512608" ] },
	512417: { ignoreTextPosts: [ "Uplifted" ] },
	512501: { ignoreTextPosts: [ "" ] },
	512569: { wrongImageUpdates: [ "512810" ] },
	513727: { missedAuthors: [ "!ljeDesIahk" ], missedTextUpdates: [ "519251" ], ignoreTextPosts: [ "!mYSM8eo.ng" ] },
	514174: { missedTextUpdates: [ "747164" ] },
	515255: { ignoreTextPosts: [ "" ] },
	516595: { imageQuest: true},
	517144: { ignoreTextPosts: [ "" ] },
	518737: { wrongTextUpdates: [ "521408", "522150", "522185", "522231", "535521" ] },
	518843: { ignoreTextPosts: [ "" ] },
	519463: { imageQuest: false},
	521196: { missedTextUpdates: [ "524608" ] },
	526472: { missedTextUpdates: [ "526524", "559848" ] },
	527296: { ignoreTextPosts: [ "Zealo8" ] },
	527546: { ignoreTextPosts: [ "suggestion" ] },
	527753: { missedAuthors: [ "7672c3", "9d78a6", "cb43c1" ] },
	528891: { ignoreTextPosts: [ "drgruff" ] },
	530940: { missedAuthors: [ "2027bb", "feafa5", "0a3b00" ] },
	533990: { missedTextUpdates: [ "537577" ] },
	534197: { ignoreTextPosts: [ "Stella" ] },
	535302: { ignoreTextPosts: [ "mermaid" ] },
	535783: { ignoreTextPosts: [ "drgruff" ] },
	536265: { missedAuthors: [ "!j5LDVAjzjo" ] },
	536268: { missedTextUpdates: [ "536296", "538173" ], ignoreTextPosts: [ "Archivemod" ], wrongImageUpdates: [ "537996" ] },
	537343: { missedTextUpdates: [ "539218" ] },
	537647: { missedTextUpdates: [ "537683" ] },
	537867: { missedAuthors: [ "369097" ] },
	539831: { missedAuthors: [ "52c28e" ], ignoreTextPosts: [ "" ] },
	540147: { ignoreTextPosts: [ "drgruff" ] },
	541026: { imageQuest: false},
	543428: { missedTextUpdates: [ "545458" ] },
	545071: { missedTextUpdates: [ "545081" ] },
	545791: { ignoreTextPosts: [ "" ] },
	545842: { missedTextUpdates: [ "550972" ] },
	548052: { missedTextUpdates: [ "548172" ], ignoreTextPosts: [ "Lucid" ] },
	548899: { missedTextUpdates: [ "548968", "549003" ] },
	549394: { missedTextUpdates: [ "549403" ] },
	553434: { missedTextUpdates: [ "553610", "553635", "553668", "554166" ] },
	553711: { missedTextUpdates: [ "553722", "553728", "554190" ] },
	553760: { missedTextUpdates: [ "554994", "555829", "556570", "556792", "556803", "556804" ] },
	554694: { missedTextUpdates: [ "557011", "560544" ] },
	556435: { missedAuthors: [ "Azathoth" ], missedTextUpdates: [ "607163" ], wrongTextUpdates: [ "561150" ] },
	557051: { missedTextUpdates: [ "557246", "557260", "557599", "559586" ], wrongTextUpdates: [ "557517" ] },
	557633: { imageQuest: true},
	557854: { missedTextUpdates: [ "557910", "557915", "557972", "558082", "558447", "558501", "561834", "561836", "562289", "632102", "632481", "632509", "632471" ] },
	561378: { missedAuthors: [ "!!MvZwquBGL0" ] },
	562193: { ignoreTextPosts: [ "" ] },
	563459: { missedTextUpdates: [ "563582" ] },
	564852: { missedAuthors: [ "Trout" ], ignoreTextPosts: [ "Trout" ] },
	564860: { missedAuthors: [ "0280a9" ], missedTextUpdates: [ "565391" ] },
	565909: { ignoreTextPosts: [ "" ] },
	567119: { missedTextUpdates: [ "573494", "586375" ] },
	567138: { missedAuthors: [ "211a31", "ca7ea1", "adc860", "4cf1b6" ] },
	568248: { missedTextUpdates: [ "569818" ] },
	568370: { ignoreTextPosts: [ "" ] },
	568463: { missedTextUpdates: [ "568470", "568473" ] },
	569225: { missedTextUpdates: [ "569289" ] },
	573815: { wrongTextUpdates: [ "575792" ] },
	578213: { missedTextUpdates: [ "578575" ] },
	581741: { missedTextUpdates: [ "581746" ] },
	582268: { missedTextUpdates: [ "587221" ] },
	585201: { ignoreTextPosts: [ "", "Bahustard", "Siphon" ] },
	586024: { ignoreTextPosts: [ "" ] },
	587086: { missedTextUpdates: [ "587245", "587284", "587443", "587454" ] },
	587562: { ignoreTextPosts: [ "Zealo8" ] },
	588902: { missedTextUpdates: [ "589033" ] },
	589725: { imageQuest: false},
	590502: { ignoreTextPosts: [ "" ], wrongTextUpdates: [ "590506" ] },
	590761: { missedTextUpdates: [ "590799" ], ignoreTextPosts: [ "" ] },
	591527: { missedTextUpdates: [ "591547", "591845" ] },
	592273: { imageQuest: false},
	592625: { imageQuest: false, wrongTextUpdates: [ "730228" ] },
	593047: { missedTextUpdates: [ "593065", "593067", "593068" ] },
	593899: { ignoreTextPosts: [ "mermaid" ] },
	595081: { ignoreTextPosts: [ "", "VoidWitchery" ] },
	595265: { imageQuest: false, wrongTextUpdates: [ "596676", "596717", "621360", "621452", "621466", "621469", "621503" ] },
	596262: { missedTextUpdates: [ "596291", "596611", "597910", "598043", "598145", "600718", "603311" ] },
	596345: { ignoreTextPosts: [ "mermaid" ] },
	596539: { missedTextUpdates: [ "596960", "596972", "596998", "597414", "614375", "614379", "614407", "616640", "668835", "668844", "668906", "668907", "668937", "668941", "669049", "669050",
								  "669126", "671651" ], ignoreTextPosts: [ "pugbutt" ] },
	598767: { ignoreTextPosts: [ "FRACTAL" ] },
	602894: { ignoreTextPosts: [ "" ] },
	604604: { missedTextUpdates: [ "605127", "606702" ] },
	609653: { missedTextUpdates: [ "610108", "610137" ] },
	611997: { missedTextUpdates: [ "612102", "612109" ], wrongTextUpdates: [ "617447" ] },
	613977: { missedTextUpdates: [ "614036" ] },
	615246: { missedTextUpdates: [ "638243", "638245", "638246", "638248" ] },
	615752: { ignoreTextPosts: [ "Uplifted" ] },
	617061: { ignoreTextPosts: [ "!TEEDashxDA" ] },
	617484: { missedTextUpdates: [ "617509", "617830" ] },
	618712: { missedTextUpdates: [ "619097", "619821", "620260" ] },
	620830: { missedAuthors: [ "913f0d" ], ignoreTextPosts: [ "", "Sky-jaws" ] },
	623178: { missedAuthors: [ "8df9f7" ] },
	623611: { ignoreTextPosts: [ "!5tTWT1eydY" ] },
	623897: { wrongTextUpdates: [ "625412" ] },
	625364: { missedTextUpdates: [ "635199" ] },
	625814: { missedAuthors: [ "330ce5", "f79974", "53688c", "fcebf0", "07b234", "fc3f9f", "a19cd5", "defceb" ], missedTextUpdates: [ "625990" ], ignoreTextPosts: [ "" ] },
	627139: { ignoreTextPosts: [ "", "Seal" ] },
	628023: { missedTextUpdates: [ "628323", "629276", "629668" ] },
	628357: { ignoreTextPosts: [ "" ] },
	632345: { ignoreTextPosts: [ "!TEEDashxDA" ] },
	632823: { missedTextUpdates: [ "632860", "633225", "633632", "633649", "633723", "634118" ], ignoreTextPosts: [ "" ] },
	633187: { missedTextUpdates: [ "633407", "633444", "634031", "634192", "634462" ] },
	633487: { missedAuthors: [ "8b8b34", "fe7a48", "20ca72", "668d91", "99d78f", "cfb12a" ] },
	634122: { ignoreTextPosts: [ "Apollo" ] },
	639382: { missedAuthors: [ "Sombermaster" ] },
	639549: { ignoreTextPosts: [ "Apollo" ] },
	641286: { missedTextUpdates: [ "641650" ] },
	641734: { missedAuthors: [ "Necro Curt" ] },
	642667: { missedTextUpdates: [ "643113" ] },
	642726: { missedTextUpdates: [ "648209", "651723" ] },
	643327: { ignoreTextPosts: [ "" ] },
	644179: { missedTextUpdates: [ "647317" ] },
	645426: { missedTextUpdates: [ "651214", "670665", "671751", "672911", "674718", "684082" ] },
	648109: { missedTextUpdates: [ "711809", "711811" ] },
	648646: { missedTextUpdates: [ "648681" ] },
	651220: { missedTextUpdates: [ "653791" ] },
	651382: { missedAuthors: [ "bbfc3d" ] },
	651540: { missedTextUpdates: [ "651629" ] },
	655158: { ignoreTextPosts: [ "" ] },
	662096: { ignoreTextPosts: [ "" ] },
	662196: { missedAuthors: [ "Penelope" ], ignoreTextPosts: [ "", "Brom", "Wire" ] },
	662452: { ignoreTextPosts: [ "" ] },
	662661: { ignoreTextPosts: [ "" ] },
	663088: { missedAuthors: [ "3bc92d", "f68a09", "8177e7" ], ignoreTextPosts: [ "", "!5tTWT1eydY", "Wire", "Brom", "Apollo", "Arhra" ] },
	663996: { missedTextUpdates: [ "673890" ] },
	668009: { missedTextUpdates: [ "668227" ] },
	668216: { imageQuest: false},
	669206: { imageQuest: true, missedAuthors: [ "75347e" ] },
	672060: { missedTextUpdates: [ "673216" ] },
	673444: { ignoreTextPosts: [ "" ] },
	673575: { missedAuthors: [ "a6f913", "3bc92d" ], ignoreTextPosts: [ "!5tTWT1eydY" ] },
	673811: { missedTextUpdates: [ "682275", "687221", "687395", "688995" ], ignoreTextPosts: [ "" ] },
	677271: { missedTextUpdates: [ "677384" ] },
	678114: { imageQuest: false},
	678608: { missedTextUpdates: [ "678789" ] },
	679357: { missedTextUpdates: [ "679359", "679983" ] },
	680125: { ignoreTextPosts: [ "", "BritishHat" ] },
	680206: { missedAuthors: [ "Gnuk" ] },
	681620: { missedAuthors: [ "d9faec" ] },
	686590: { imageQuest: false},
	688371: { missedTextUpdates: [ "696249", "696257" ], ignoreTextPosts: [ "", "Chaos", "Ariadne", "Melinoe", "\"F\"ingGenius" ] },
	691136: { missedTextUpdates: [ "697620" ], ignoreTextPosts: [ "" ], wrongImageUpdates: [ "706696" ] },
	691255: { ignoreTextPosts: [ "" ] },
	692093: { missedAuthors: [ "Bergeek" ], ignoreTextPosts: [ "Boxdog" ] },
	692872: { missedTextUpdates: [ "717187" ] },
	693509: { missedAuthors: [ "640f86" ] },
	693648: { missedAuthors: [ "Inez" ], missedTextUpdates: [ "694655" ] },
	694230: { ignoreTextPosts: [ "" ] },
	700573: { missedTextUpdates: [ "702352", "720330" ], ignoreTextPosts: [ "" ] },
	701456: { ignoreTextPosts: [ "" ] },
	702865: { ignoreTextPosts: [ "" ] },
	703060: { missedAuthors: [ "Necro", "Gnuk" ] },
	705639: { wrongTextUpdates: [ "794696" ] },
	706303: { missedAuthors: [ "9bd464", "5a8006" ] },
	706439: { missedTextUpdates: [ "714791" ] },
	706938: { ignoreTextPosts: [ "" ] },
	711320: { missedTextUpdates: [ "720646", "724022" ] },
	712179: { missedTextUpdates: [ "712255", "715182" ] },
	712785: { ignoreTextPosts: [ "" ] },
	713042: { missedTextUpdates: [ "713704" ] },
	714130: { imageQuest: true},
	714290: { missedTextUpdates: [ "714307", "714311" ] },
	714858: { ignoreTextPosts: [ "" ] },
	715796: { ignoreTextPosts: [ "" ] },
	717114: { missedTextUpdates: [ "717454", "717628" ] },
	718797: { missedAuthors: [ "FRACTAL on the go" ] },
	718844: { missedAuthors: [ "Drawfag I", "kome", "Vik", "Friptag", "Grap", "ghosty", "Truth" ], missedTextUpdates: [ "721242" ] },
	719505: { ignoreTextPosts: [ "" ] },
	719579: { imageQuest: false},
	722585: { wrongTextUpdates: [ "724938" ] },
	726944: { ignoreTextPosts: [ "" ] },
	727356: { ignoreTextPosts: [ "" ] },
	727581: { missedTextUpdates: [ "728169" ] },
	727677: { ignoreTextPosts: [ "Melinoe" ] },
	728411: { missedTextUpdates: [ "728928" ] },
	730993: { missedTextUpdates: [ "731061" ] },
	732214: { imageQuest: true, wrongTextUpdates: [ "732277" ] },
	734610: { ignoreTextPosts: [ "D3w" ] },
	735716: { missedAuthors: [ "ArtisanBubblegumMobile" ] },
	736484: { ignoreTextPosts: [ "Roman" ], wrongImageUpdates: [ "750212", "750213", "750214" ] },
	741609: { missedTextUpdates: [ "754524" ] },
	743976: { ignoreTextPosts: [ "", "Typo" ] },
	745694: { ignoreTextPosts: [ "Crunchysaurus" ] },
	750281: { ignoreTextPosts: [ "Autozero" ] },
	752572: { missedAuthors: [ "k0bold" ], missedTextUpdates: [ "752651", "752802", "767190" ] },
	754415: { missedAuthors: [ "Apollo", "Arhra", "riotmode", "Indonesian Gentleman", "!0iuTMXQYY." ], ignoreTextPosts: [ "", "!5tTWT1eydY", "!0iuTMXQYY.", "Indonesian Gentleman" ] },
	755378: { missedAuthors: [ "!Ykw7p6s1S." ] },
	758668: { ignoreTextPosts: [ "LD" ] },
	767346: { ignoreTextPosts: [ "" ] },
	768858: { ignoreTextPosts: [ "LD" ] },
	774368: { missedTextUpdates: [ "774500" ] },
	774930: { missedTextUpdates: [ "794040" ] },
	778045: { missedTextUpdates: [ "778427", "779363" ] },
	779564: { ignoreTextPosts: [ "" ] },
	784068: { wrongTextUpdates: [ "785618" ] },
	785044: { wrongTextUpdates: [ "801329" ] },
	789976: { missedTextUpdates: [ "790596", "793934", "800875", "832472" ] },
	794320: { wrongTextUpdates: [ "795183" ] },
	798380: { missedTextUpdates: [ "799784", "800444", "800774", "800817", "801212" ] },
	799546: { missedTextUpdates: [ "801103", "802351", "802753" ] },
	799612: { missedTextUpdates: [ "799968", "801579" ] },
	800605: { missedAuthors: [ "Boris Calija", "3373e2", "2016eb", "a80028" ], ignoreTextPosts: [ "", "Boris Calija" ] },
	802411: { missedTextUpdates: [ "805002" ] },
	807972: { wrongTextUpdates: [ "811969" ] },
	811957: { ignoreTextPosts: [ "via Discord" ] },
	814448: { missedTextUpdates: [ "817938" ] },
	822552: { imageQuest: false},
	823831: { missedAuthors: [ "Retro-LOPIS" ] },
	827264: { ignoreTextPosts: [ "LD", "DogFace" ] },
	830006: { missedAuthors: [ "Amaranth" ] },
	835062: { ignoreTextPosts: [ "Curves" ] },
	835750: { missedTextUpdates: [ "836870" ] },
	836521: { wrongTextUpdates: [ "848748" ] },
	837514: { ignoreTextPosts: [ "LD" ] },
	839906: { missedTextUpdates: [ "845724" ] },
	840029: { missedTextUpdates: [ "840044", "840543" ] },
	841851: { ignoreTextPosts: [ "Serpens", "Joy" ] },
	842392: { missedTextUpdates: [ "842434", "842504", "842544" ] },
	844537: { missedTextUpdates: [ "847326" ] },
	848887: { imageQuest: true, wrongTextUpdates: [ "851878" ] },
	854088: { missedTextUpdates: [ "860219" ], ignoreTextPosts: [ "Ursula" ] },
	854203: { ignoreTextPosts: [ "Zenthis" ] },
	857294: { wrongTextUpdates: [ "857818" ] },
	858913: { imageQuest: false},
	863241: { missedTextUpdates: [ "863519" ] },
	865754: { missedTextUpdates: [ "875371" ], ignoreTextPosts: [ "???" ] },
	869242: { ignoreTextPosts: [ "" ] },
	871667: { missedTextUpdates: [ "884575" ] },
	876808: { imageQuest: false},
	879456: { missedTextUpdates: [ "881847" ] },
	881097: { missedTextUpdates: [ "881292", "882339" ] },
	881374: { ignoreTextPosts: [ "LD" ] },
	884284: { missedAuthors: [ "ac5c24" ] },
	885481: { imageQuest: false, wrongTextUpdates: [ "886892" ] },
	889690: { missedAuthors: [ "1da7b0" ] },
	891150: { missedAuthors: [ "Harbard Grim" ] },
	1000012: { missedAuthors: [ "Happiness" ] }
  }
}