Tumblr - Mass Post Editor Features

MassReblog ArchiveDashTaggedLikes SelectShowBy:TagType MouseMultiSelect BackdateSchedule CaptionLink BatchPhotoset FollowersFollowees +more

// ==UserScript==
// @name        Tumblr - Mass Post Editor Features
// @namespace   https://jakejilg.com/mass_post_features
// @description MassReblog ArchiveDashTaggedLikes SelectShowBy:TagType MouseMultiSelect BackdateSchedule CaptionLink BatchPhotoset FollowersFollowees +more
// @include     https://www.tumblr.com/mega-editor
// @include     https://www.tumblr.com/mega-editor/*
// @include     https://www.tumblr.com/mega-editor/*/*/*
// @include     https://*/archive?fetch=first_post_timestamp&jump=*&name=*&to=*&year=*
// @version     4.01
// @grant       none
// @run-at      document-start
// @license MIT
// ==/UserScript==

// May 2020, Mass Post Editor Features 4 (from scratch) by Jake Jilg (benign-mx)

// this month widget stuff for both includes pages
var MassPostEditorFeatures4 = function () {

  // first, these 3 functions I didn't write myself
  // begin ripped functions here:
  // a java short code thing from StackOverflow
  var shortCode = function (str) {
    var hash = 0;
    var chr;
    for (var i = 0; i < str.length; i++) {
      chr = str.charCodeAt(i);
      hash = ((hash << 5) - hash) + chr;
      hash |= 0; // Convert to 32bit integer
    }
    return hash;
  };
  // a basic setCookie function from w3schools
  var setCookie = function (cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+ d.toUTCString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
  };
  // a basic readCookie function from w3schools
  var getCookie = function (cname) {
    var name = cname + "=";
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');
    for (var i = 0; i <ca.length; i++) {
      var c = ca[i];
      while (c.charAt(0) == ' ') {
        c = c.substring(1);
      }
      if (c.indexOf(name) == 0) {
        return c.substring(name.length, c.length);
      }
    }
    return "";
  };
  // end: my ripped functions ^ here
  // begin all original script below

  // and I begin my own flurb src="greasemonkey.user.js"... :P
  // drop an "end" in the missing lcontent
  if (typeof l === "undefined") {
    var lcontentDiv = document.createElement("div");
    lcontentDiv.classList.add("l-content");
    lcontentDiv.classList.add("albino");
    document.body.appendChild(lcontentDiv);
  }
  // for the custom month widget that doesn't open dead months like the default
  var doubleCheckDisabledMonths = function (currentYr, lTs, fTs, jump, jumpTo) {
    var mw = document.getElementById("browse_months_widget");
    var cy = mw.getElementsByClassName(
      "current_year"
    )[0].innerText;
    var yr1 = parseInt(cy);
    var timestampF;
    var timestampL;
    var mo = mw.getElementsByClassName("months")[0].
      getElementsByTagName("li");
    var a;
    var span;
    for (var i = 0; i < 12; i++) {
      timestampF = new Date(yr1, i+1, 1).getTime();
      timestampL = new Date(yr1, i, 1).getTime();
      if (timestampL >= lTs || timestampF <= fTs) {
        if (!mo[i].classList.contains("empty")) {
          mo[i].classList.add("empty");
        }
        a = mo[i].getElementsByTagName("a");
        if (a.length > 0) {
          span = document.createElement("span");
          span.appendChild(
            document.createTextNode(
              a[0].innerText
            )
          );
          mo[i].replaceChild(span, a[0]);
        }
      } else {
        if (mo[i].classList.contains("empty")) {
          mo[i].removeAttribute("class");
        }
        a = mo[i].getElementsByTagName("span");
        var month = i;
        var ts = (new Date(yr1, month + 1, 0)).getTime() / 1000;
        var href2g2 = "http://www.tumblr.com/mega-editor/published/" +
            name + "?" + jump + "&" + jumpTo + "&" + ts +
            "#month" + (i+1) + "year" + yr1;
        if (a.length > 0) {
          span = document.createElement("a");
          span.href = href2g2;
          span.target = "_top";
          span.setAttribute("data-month-index", i.toString());
          span.appendChild(
            document.createTextNode(
              a[0].innerText
            )
          );
          mo[i].replaceChild(span, a[0]);
        } else {
          mo[i].getElementsByTagName("a")[0].href = href2g2;
        }
      }
    }
  };

  // these ^v functions function on both includes pages... coding in 3D! :)

  var i;
  var lTs;
  var fTs;
  var name;
  var makeBrowseMonthsWidget = function (currentYr, lTs, fTs, jump, jumpTo) {
    // last timestamp, first timestamp
    var browseMonthsWidget2 = document.createElement("div");
    browseMonthsWidget2.classList.add("popover");
    browseMonthsWidget2.classList.add("popover_gradient");
    browseMonthsWidget2.id = "browse_months_widget";
    var browseMonthsPopInner = document.createElement("div");
    browseMonthsPopInner.classList.add("popover_inner");
    var browseMonthsYear = document.createElement("div");
    browseMonthsYear.classList.add("year");
    var browseMonthsYearNavigation = document.createElement("div");
    browseMonthsYearNavigation.classList.add("year_navigation");
    var prevYearVis = function (e) {
      e.preventDefault();
      e.stopPropagation();
      e.cancelBubble = true;
      var cy = document.getElementsByClassName(
        "current_year"
      )[0];
      var yr = parseInt(cy.innerText);
      if (this.classList.contains("previous_year")) {
        --yr;
        cy.innerText = yr;
      } else {
        ++yr;
        cy.innerText = yr;
      }
      doubleCheckDisabledMonths(yr, lTs, fTs, jump, jumpTo);
    };
    var browseMonthPrevYearA = document.createElement("a");
    browseMonthPrevYearA.href = "#";
    browseMonthPrevYearA.addEventListener("click", prevYearVis);
    var prevYearSpan = document.createElement("span");
    prevYearSpan.appendChild(
      document.createTextNode("prev")
    );
    browseMonthPrevYearA.classList.add("previous_year");
    browseMonthPrevYearA.appendChild(prevYearSpan);
    var browseMonthNextYearA = document.createElement("a");
    browseMonthNextYearA.href = "#";
    browseMonthNextYearA.addEventListener("click", prevYearVis);
    var nextYearSpan = document.createElement("span");
    nextYearSpan.appendChild(
      document.createTextNode("next")
    );
    browseMonthNextYearA.classList.add("next_year");
    browseMonthNextYearA.appendChild(nextYearSpan);
    var currentYearSpan = document.createElement("span");
    currentYearSpan.classList.add("current_year");
    currentYearSpan.appendChild(
      document.createTextNode(currentYr)
    );
    browseMonthsYearNavigation.appendChild(browseMonthPrevYearA);
    browseMonthsYearNavigation.appendChild(currentYearSpan);
    browseMonthsYearNavigation.appendChild(browseMonthNextYearA);
    browseMonthsYear.appendChild(browseMonthsYearNavigation);
    browseMonthsPopInner.appendChild(browseMonthsYear);
    var clear1 = document.createElement("div");
    clear1.classList.add("clear");
    browseMonthsYearNavigation.appendChild(clear1);
    var browseMonths = document.createElement("div");
    browseMonths.classList.add("months");
    var browseMonthsUl = document.createElement("ul");
    var month = [
      "January", "February", "March",
      "April", "May", "June", "July",
      "August", "September", "October",
      "November", "December"
    ];
    var browseMonthsLi;
    var browseMonthsA;
    for (i = 0; i < 12; i++) {
      browseMonthsA = document.createElement("span");
      browseMonthsA.appendChild(
        document.createTextNode(month[i])
      );
      browseMonthsLi = document.createElement("li");
      browseMonthsLi.appendChild(browseMonthsA);
      browseMonthsUl.appendChild(browseMonthsLi);
    }
    browseMonths.appendChild(browseMonthsUl);
    browseMonthsYear.appendChild(browseMonths);
    browseMonthsPopInner.appendChild(browseMonthsYear);
    browseMonthsWidget2.appendChild(browseMonthsPopInner);
    return browseMonthsWidget2;
  };
  if (
    document.location.href.match( // really big RegEx
/\/archive\?fetch=first_post_timestamp&jump=[^&]+&name=[^&]+&to=[^&]+&year=\d+/i
    ) !== null
  ) {
    var megaCss = document.createElement("link");
    megaCss.setAttribute("rel", "stylesheet");
    megaCss.setAttribute("type", "text/css");
    megaCss.setAttribute(
      "href", 'https://assets.tumblr.com/assets/styles/mega-editor.css'
    );
    var glbCss = document.createElement("link");
    glbCss.setAttribute("rel", "stylesheet");
    glbCss.setAttribute("type", "text/css");
    glbCss.setAttribute(
      "href", "https://assets.tumblr.com/client/prod/app/global.build.css"
    );
    var iCss = document.createElement("style");
    iCss.type = "text/css";
    iCss.appendChild(
      document.createTextNode(
(function () {/*
body {
  background: none transparent;
}
#browse_months_widget {
  height: 422px;
  width: 225px;
  padding: 0px;
  top: 0px;
  left: 0px;
}
*/}).toString().slice(16, -3))
    );
    // this browMoWidget ^ is inside the iframe
    var newH = document.createElement("html");
    var head = document.createElement("head");
    head.appendChild(glbCss);
    head.appendChild(megaCss);
    head.appendChild(iCss);
    newH.appendChild(head);
    var body = document.createElement("body");
    var currentYr = document.location.href.match(/year=(\d+)/i)[1];
    name = document.location.href.match(/&name=([^&]+)/i)[1];
    var jump = document.location.href.match(/jump=([^&]+)/i)[1];
    var jumpTo = document.location.href.match(/to=([^&]+)/i)[1];
    var html = document.documentElement.innerHTML;
    fTs = parseInt(html.match(
      /"firstPostTimestamp":(\d+)/
    )[1]) * 1000;
    lTs = parseInt(html.match(
      /"updated":(\d+)/
    )[1]) * 1000;
    // the default archive URL makes weird dead pages...
    // I want to replace the default glitchy/month/panel/2014
    // with a more simple yet functional panel ?month&beforetimestamp
    body.appendChild(makeBrowseMonthsWidget(currentYr, lTs, fTs, jump, jumpTo));
    newH.appendChild(body);
    document.getElementsByTagName("html")[0].parentNode.replaceChild(
      newH,
      document.getElementsByTagName("html")[0]
    );
    doubleCheckDisabledMonths(currentYr, lTs, fTs, jump, jumpTo);
    return;
    // prevent the other page stuff from going
  }
  // this ^ runs on archive page only :)

  // this v runs on the megaEditor page only
  var removeS = document.getElementsByTagName("script");
  for (i = 0; i < removeS.length; i++) {
    if (
      typeof removeS[i].src.split(/\/+/g)[1] === "undefined" ||
      removeS[i].src.split(/\/+/g)[1] !== "assets.tumblr.com"
    ) {
      removeS[i].parentNode.removeChild(removeS[i]);
    }
  }
  var rewrite1 = function () { // <= outside of plugin scope
    // Tumblr was animating with
    // JQuery DOM manipulation instead of CSS3 >:P
    window.way_too_big_to_animate = true;
    window.neueCorrectionIndex = 0;
    // Tumblr was written with prototype.js in 2014 and
    // it used a lot of clumsy intervals as listeners
    // which were passed down the the jQuery Tumbr MPE
    // in 2016 and are still being used...
    for (var i = 500; i > 0; i--) {
      clearInterval(i); // their intervals have no var names
    }
    // but we use intervals too because it's still Tumblr in 2014 :)
    var href = document.location.href.split(/[\/\?&#=]+/g);
    if (
      href[3] === "published" &&
      href[5] === "follows" ||
      href[5] === "followers" ||
      href[5] === "fans"
    ) {
      window.insert_tag = function(){};
      window.render_tag_editor = function(){};
    }
    window.cleanCssAnimate = setInterval(function () {
      if (
        href[5] === "photos"
      ) {
        clearInterval(window.cleanCssAnimate);
        return;
      }
      var l = document.getElementsByClassName("l-content")[0];
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      if (typeof l === "undefined") {
        return;
      }
      if (typeof l !== "undefined" && !l.classList.contains("albino")) {
        l.innerHTML = "";
        return;
      }
      var pause = document.getElementById(
        "pause_button"
      );
      var canvas = document.getElementById("status");
      var ctx = canvas.getContext("2d");
      if (
        canvas !== null &&
        typeof canvas !== "undefined" &&
        data.classList.contains("fetching-from-tumblr-api") &&
        pause !== null &&
        typeof pause !== "undefined" &&
        pause.classList.contains("playing")
      ) {
        var toSeconds = parseFloat(
          data.getAttribute("data-to-seconds")
        );
        toSeconds++;
        if (toSeconds > 30) {
          toSeconds = 0;
        }
        ctx.fillStyle = "#9da6af";
        ctx.fillRect(
          0, 0, canvas.width, canvas.height
        );
        var width = (canvas.width - 16) * (toSeconds / 30);
        ctx.fillStyle = "#74797e";
        ctx.fillRect(
          0, canvas.height / 2 + 2, canvas.width - 16, canvas.height / 2
        );
        ctx.fillStyle = "turquoise";
        ctx.fillRect(0, canvas.height/ 2 + 2, width, canvas.height/ 2);
        ctx.fillStyle = "#9da6af";
        for (var i = canvas.width/11; i < canvas.width; i+=canvas.width/11) {
          ctx.fillRect(
            i - 3, canvas.height/ 2 + 2, 2, canvas.height / 2
          );
        }
        ctx.font = "bold 10px Arial, sans-serif";
        ctx.fillStyle = "#fff"
        ctx.fillText(
          "Posts Loaded",
          canvas.width/2 - ctx.measureText("Posts Loaded").width / 2 - 3,
          canvas.height / 2
        );
        data.setAttribute("data-to-seconds", toSeconds);
      } else if (
        pause !== null &&
        canvas !== null &&
        typeof pause !== "undefined" &&
        pause.classList.contains("paused")
      ) {
        ctx = canvas.getContext("2d");
        ctx.font = "bold 10px Arial, sans-serif";
        ctx.fillStyle = "#9da6af";
        ctx.fillRect(
          0, 0, canvas.width, canvas.height / 2
        );
        ctx.fillStyle = "#fff";
        ctx.fillText(
          "Paused",
          canvas.width/2 - ctx.measureText("Paused").width / 2 - 6,
          canvas.height / 2
        );
      }
      var fChild = l.querySelectorAll(":scope > :not(.laid)");
      if (fChild.length !== 0) {
        fChild[0].classList.add("laid");
      } else if (data.classList.contains("next_page_false")) {
        clearInterval(window.cleanCssAnimate);
        // see ^ we clear our own animate interval, Tumblr!
        // (Tumblr doens't clear theirs...)
        var p = l.querySelectorAll(":scope > a");
        document.getElementById("p_loaded").innerHTML = "x" + p.length;
        pause.classList.add("done");
        pause.classList.remove("playing");
        pause.classList.remove("paused");
        var allDone = href[5] !== "followers" && href[5] !== "follows" ?
            "All posts loaded." : "All blogs loaded.";
        pause.setAttribute("title", allDone);
        document.getElementById(
          "ajax-info_button"
        ).setAttribute("title", allDone);
        var smi = new Image();
        smi.addEventListener("load", function() {
          var canvas = document.getElementById("status");
          var ctx = canvas.getContext("2d");
          ctx.font = "bold 10px Arial, sans-serif";
          ctx.fillStyle = "#9da6af";
          ctx.fillRect(
            0, 0, canvas.width, canvas.height
          );
          ctx.fillStyle = "#fff";
          ctx.fillText(
            href[5] === "fans" ||
            href[5] === "followers" ||
            href[5] === "follows" ?
            "All Blogs" : "All Posts",
            14,
            7
          );
          ctx.fillText(
            "Loaded",
            17,
            15
          );
          ctx.drawImage(this, 1, 1);
        });
        smi.src = "data:image/gif;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyu" +
          "AP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOa" +
          "GcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7";
      }
    }, 25);
    // we will need to rebuild on show only too
    (function (alias) {
      window.columns_need_rebuilding = function () {
        var data = document.getElementById(
          "mass_post_features-plugin_data"
        );
        if (document.getElementById("p_loaded") !== null) {
          var lcontent = document.getElementsByClassName("l-content");
          var p = lcontent[0].querySelectorAll(":scope > a");
          document.getElementById("p_loaded").innerHTML = "x" + p.length;
        }
        var rebuildAnyway = data.classList.contains("rebuild_anyway");
        window.column_gutter = parseInt(
          data.getAttribute("data-column_gutter")
        );
        window.column_full_width = window.column_width + window.column_gutter;
        if (
          rebuildAnyway ||
            document.documentElement.scrollWidth >
            document.documentElement.clientWidth
        ) {
          data.classList.remove("rebuild_anyway");
          return true;
        }
        return alias.apply(this, arguments);
      }
    })(window.columns_need_rebuilding);
    (function (alias) {
      // this fires after a delete to rebuild columns...
      window.get_selected_post_ids = function () {
        var data = document.getElementById(
          "mass_post_features-plugin_data"
        );
        data.classList.add("rebuild_anyway");
        var masonry = new CustomEvent("resize");
        window.dispatchEvent(masonry);
        return alias.apply(this, arguments);
      };
    })(window.get_selected_post_ids);
    // this ^ the pro way to alias
    clearInterval(window.timerid_auto_paginator);
    window.fetch_next_page = function () {};
    window.auto_paginator = function () {};
    // pagination? where we are going, we do not need pagination
  };
  var rewrite2 = function () {
    // my batch photos doesn't need certain functions :0
    var href = document.location.href.split(/[\/\?&#=]+/g);
    (function (alias) {
      // don't fear. these window scope references are
      // NOT unSafeWindow breaches from the plugin scope.
      // these rewrites are going into the DOM, and then
      // the plugin can no longer touch them.
      window.add_tags_to_selected_posts = function() {
        var data = document.getElementById(
          "mass_post_features-plugin_data"
        );
        // we must remove the tag from our own custom data first
        var tagsAllArr = JSON.parse(
          data.getAttribute("data-tags_all_arr")
        );
        var tagToIds = JSON.parse(
          data.getAttribute("data-tag_to_ids")
        );
        var idToTags = JSON.parse(
          data.getAttribute("data-id_to_tags")
        );
        var hl = document.getElementsByClassName("highlighted");
        var tokens = document.getElementById("tokens");
        var tags = tokens.getElementsByClassName("tag");
        var tag;
        var id;
        var tc;
        for (var i = 0; i < tags.length; i++) {
          tag = tags[i].innerHTML;
          if (tagsAllArr.indexOf(tag) === -1) {
            tagsAllArr.push(tag); // new Tag
          }
          for (var l = 0; l < hl.length; l++) {
            id = hl[l].getAttribute("data-id");
            if (typeof idToTags[id] === "undefined") {
              idToTags[id] = [tags];
            }
            if (idToTags[id].indexOf(tag) === -1) {
              idToTags[id].push(tag);
            }
            if (typeof tagToIds[tag] === "undefined") {
              tagToIds[tag] = [id];
            }
            if (tagToIds[tag].indexOf(id) === -1) {
              tagToIds[tag].push(id);
            }
            tc = hl[l].getElementsByClassName("tag-container")[0];
            if (
              typeof idToTags[id] !== "undefined" ||
              idToTags[id].length !== 0
            ) {
              // this will happen always
              tc.innerHTML = "#" + idToTags[id].join(" #");
            } else {
              tc.innerHTML = ""; // < this might not happen
            }
          }
        }
        data.setAttribute("data-tags_all_arr", JSON.stringify(tagsAllArr));
        data.setAttribute("data-tag_to_ids", JSON.stringify(tagToIds));
        data.setAttribute("data-id_to_tags", JSON.stringify(idToTags));
        return alias.apply(this, arguments);
      };
    })(window.add_tags_to_selected_posts);
    // this takes tags out of elements when removed...
    // pry easier/better than reloading each post
    (function (alias) {
      window.remove_tags_from_selected_posts = function() {
        var data = document.getElementById(
          "mass_post_features-plugin_data"
        );
        // we must remove the tag from our own custom data first
        var tagsAllArr = JSON.parse(
          data.getAttribute("data-tags_all_arr")
        );
        var tagToIds = JSON.parse(
          data.getAttribute("data-tag_to_ids")
        );
        var idToTags = JSON.parse(
          data.getAttribute("data-id_to_tags")
        );
        // you can take the w3c out of the jQuery,
        // but you can't take the jQuery out of w3c
        var tags2remove = document.querySelectorAll("#tags input:checked");
        // I love these new querySelector ^ things :)
        var hl = document.getElementsByClassName("highlighted");
        var id;
        var alt;
        var index;
        var tc;
        for (var i = 0; i < hl.length; i++) {
          id = hl[i].getAttribute("data-id");
          for (var l = 0; l < tags2remove.length; l++) {
            alt = tags2remove[l].getAttribute("alt");
            index = idToTags[id].indexOf(alt);
            idToTags[id].splice(index, 1);
            tc = hl[i].getElementsByClassName("tag-container")[0];
            if (
              typeof idToTags[id] !== "undefined" ||
              idToTags[id].length !== 0
            ) {
              tc.innerHTML = "#" + idToTags[id].join(" #");
            } else {
              tc.innerHTML = "";
            }
            index = tagToIds[alt].indexOf(id);
            tagToIds[alt].splice(index, 1);
            // remove when last tag removed
            if (
              typeof tagToIds[alt] === "undefined" ||
              tagToIds[alt].length === 0 // it could become undefined on shift
            ) {
              index = tagsAllArr.indexOf(alt);
              tagsAllArr.splice(index, 1);
            }
          }
        }
        data.setAttribute("data-tags_all_arr", JSON.stringify(tagsAllArr));
        data.setAttribute("data-tag_to_ids", JSON.stringify(tagToIds));
        data.setAttribute("data-id_to_tags", JSON.stringify(idToTags));
        return alias.apply(this, arguments);
      };
    })(window.remove_tags_from_selected_posts);
    // I've been told: this is the best way to alias a function
    (function (alias) {
      window.get_selected_post_ids = function () {
        window.postCountMake();
        return alias.apply(this, arguments);
      };
    })(window.get_selected_post_ids);
  };
  // some rewrites ^ to Tumblr's default code,  to use later...
  // this function is plugin scope
  var appendRichButtons = function(pbe, rich, brick) {
    // pbe meanse photo brick edit, but I recycled this
    // to make buttons for the caption adder thing too :)
    var addTextFormatting = function(e) {
      e.preventDefault();
      e.stopPropagation();
      var sel = window.getSelection();
      if(
        typeof sel.rangeCount !== "undefined" &&
        sel.rangeCount === 0
      ) {
        return;
      }
      var rng = sel.getRangeAt(0);
      var preRange = 0;
      var postRange = 0;
      var nod;
      var frag;
      var ancestor;
      var ancClone;
      var middle;
      var isNode = this.getAttribute("data-node") !== "none";
      if (isNode) {
        nod = document.createElement(this.getAttribute("data-node"));
        nod.appendChild(
          document.createTextNode(sel.toString())
        );
        if (this.getAttribute("data-class") !== "none") {
          nod.classList.add(
            this.getAttribute("data-class")
          );
        }
        if (
          this.getAttribute("data-node") === "a" &&
          this.getAttribute("data-attr") === "href"
        ) {
          nod.href = pbe.getElementsByClassName(
            "a_button_input"
          )[0].value;
        }
      } else {
        nod = document.createTextNode(sel.toString());
      }
      rng.deleteContents();
      // data-parent is like ul li || ol li...
      if (this.getAttribute("data-parent") !== "none") {
        var pnt = document.createElement(
          this.getAttribute("data-parent")
        );
        pnt.appendChild(nod);
        rng.insertNode(pnt);
      } else {
        rng.insertNode(nod);
      }
      if (!isNode) {
        if (rng.commonAncestorContainer !== rich) {
          frag = document.createDocumentFragment();
          ancestor = rng.commonAncestorContainer.cloneNode(true);
          ancClone = ancestor.cloneNode(true);
          middle = document.createDocumentFragment();
          middle.appendChild(
            document.createTextNode(
              sel.toString()
            )
          );
          ancestor.innerText = ancestor.innerText.substring(
            0, sel.anchorOffset
          );
          ancClone.innerText = ancClone.innerText.substring(
            sel.anchorOffset + sel.toString().length,
            ancClone.innerText.length
          );
          if(ancestor.innerHTML.length > 0) {
            frag.appendChild(ancestor);
          }
          frag.appendChild(middle);
          if(ancClone.innerHTML.length > 0) {
            frag.appendChild(ancClone);
          }
          rng.commonAncestorContainer.parentNode.replaceChild(
            frag, rng.commonAncestorContainer
          );
        }
      }
      brick.classList.remove("visible-colors");
      brick.classList.remove("visible-url");
      window.getSelection().removeAllRanges();
    };
    var xb = butt("X");
    xb.classList.add(xb.id);
    xb.setAttribute("data-node", "none");
    xb.setAttribute("data-class", "none");
    xb.setAttribute("data-attr", "none");
    xb.setAttribute("data-parent", "none");
    xb.removeAttribute("id");
    xb.setAttribute(
      "title", "Remove Formatting"
    );
    xb.addEventListener("click", addTextFormatting);
    var hb = butt("H");
    hb.classList.add(hb.id);
    hb.setAttribute("data-node", "h2");
    hb.setAttribute("data-class", "none");
    hb.setAttribute("data-attr", "none");
    hb.setAttribute("data-parent", "none");
    hb.removeAttribute("id");
    hb.setAttribute(
      "title", "Heading"
    );
    hb.addEventListener("click", addTextFormatting);
    var bb = butt("B");
    bb.classList.add(bb.id);
    bb.setAttribute("data-node", "b");
    bb.setAttribute("data-class", "none");
    bb.setAttribute("data-attr", "none");
    bb.setAttribute("data-parent", "none");
    bb.removeAttribute("id");
    bb.setAttribute(
      "title", "Bold"
    );
    bb.addEventListener("click", addTextFormatting);
    var ib = butt("i");
    ib.classList.add(ib.id);
    ib.setAttribute("data-node", "i");
    ib.setAttribute("data-class", "none");
    ib.setAttribute("data-attr", "none");
    ib.setAttribute("data-parent", "none");
    ib.removeAttribute("id");
    ib.setAttribute(
      "title", "Italic"
    );
    ib.addEventListener("click", addTextFormatting);
    var so = butt("S");
    so.classList.add(so.id);
    so.removeAttribute("id");
    so.setAttribute("data-node", "strike");
    so.setAttribute("data-class", "none");
    so.setAttribute("data-attr", "none");
    so.setAttribute("data-parent", "none");
    so.setAttribute(
      "title", "Strike"
    );
    so.addEventListener("click", addTextFormatting);
    var ab = butt("a");
    ab.classList.add(ab.id);
    ab.removeAttribute("id");
    var ok = butt("ok");
    ok.classList.add(ok.id);
    ok.removeAttribute("id");
    var urlInput = document.createElement("input");
    urlInput.type = "text";
    urlInput.addEventListener("focus", function () {
      this.select();
    });
    urlInput.classList.add("a_button_input");
    urlInput.value = "https://";
    ok.setAttribute("data-node", "a");
    ok.setAttribute("data-class", "none");
    ok.setAttribute("data-attr", "href");
    ok.setAttribute("data-parent", "none");
    ab.setAttribute(
      "title", "Link"
    );
    ok.addEventListener("click", addTextFormatting);
    ab.addEventListener("click", function() {
      brick.classList.add("visible-url");
    });
    var ol = butt("ol");
    ol.classList.add(ol.id);
    ol.removeAttribute("id");
    ol.setAttribute("data-node", "li");
    ol.setAttribute("data-class", "none");
    ol.setAttribute("data-attr", "none");
    ol.setAttribute("data-parent", "ol");
    ol.firstChild.innerHTML = "1.";
    ol.setAttribute(
      "title", "Ordered List"
    );
    ol.addEventListener("click", addTextFormatting);
    var ul = butt("ul");
    ul.classList.add(ul.id);
    ul.removeAttribute("id");
    ul.setAttribute("data-node", "li");
    ul.setAttribute("data-class", "none");
    ul.setAttribute("data-attr", "none");
    ul.setAttribute("data-parent", "ul");
    ul.firstChild.innerHTML = "&#x26AB;";
    ul.setAttribute(
      "title", "Unordered List (Bullet Point)"
    );
    ul.addEventListener("click", addTextFormatting);
    var bq = butt("bq");
    bq.classList.add(bq.id);
    bq.removeAttribute("id");
    bq.setAttribute("data-node", "blockquote");
    bq.setAttribute("data-class", "none");
    bq.setAttribute("data-attr", "none");
    bq.setAttribute("data-parent", "none");
    bq.firstChild.innerHTML = "&#x2590;";
    bq.setAttribute(
      "title", "Blockquote"
    );
    bq.addEventListener("click", addTextFormatting);
    var colorB = butt("colors");
    colorB.classList.add(colorB.id);
    colorB.removeAttribute("id");
    var color = document.createElement("div");
    color.classList.add("color");
    colorB.firstChild.innerHTML = color.outerHTML;
    colorB.setAttribute(
      "title", "Text Color"
    );
    colorB.addEventListener("click", function() {
      brick.classList.add("visible-colors");
    });
    var colors = [
      ["Pink", "#ff62ce", "niles"],
      ["Red", "#ff492f", "joey"],
      ["Orange", "#ff8a00", "monica"],
      ["Yellow", "#e8d73a", "phoebe"],
      ["Green", "#00cf35", "ross"],
      ["Cerulean", "#00b8ff", "rachel"],
      ["Blue", "#7c5cff", "chandler"]
    ];
    var cb;
    for (i = 0; i < colors.length; i++) {
      cb = butt(colors[i][0]);
      cb.classList.add(cb.id);
      cb.removeAttribute("id");
      cb.setAttribute(
        "title",
        colors[i][0] + " " +
        colors[i][2].charAt(0).toUpperCase() + colors[i][2].slice(1)
      );
      cb.classList.add("colors_buttons");
      cb.firstChild.innerHTML = "";
      cb.style.backgroundColor = colors[i][1];
      cb.setAttribute("data-node", "span");
      cb.setAttribute("data-class", "npf_color_" + colors[i][2]);
      cb.setAttribute("data-attr", "none");
      cb.setAttribute("data-parent", "none");
      cb.addEventListener("click", addTextFormatting);
      pbe.appendChild(cb);
    }
    var fb = butt("Q");
    fb.classList.add(fb.id);
    fb.removeAttribute("id");
    fb.setAttribute(
      "title", "Quirky/Fancy"
    );
    fb.setAttribute("data-node", "p");
    fb.setAttribute("data-class", "npf_quirky");
    fb.setAttribute("data-attr", "none");
    fb.setAttribute("data-parent", "none");
    fb.addEventListener("click", addTextFormatting);
    pbe.appendChild(xb);
    pbe.appendChild(bb);
    pbe.appendChild(ib);
    pbe.appendChild(so);
    pbe.appendChild(ab);
    pbe.appendChild(hb);
    pbe.appendChild(ol);
    pbe.appendChild(ul);
    pbe.appendChild(bq);
    pbe.appendChild(colorB);
    pbe.appendChild(fb);
    pbe.appendChild(urlInput);
    pbe.appendChild(ok);
  };
  var pluginBuildColumns = function() {
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    data.classList.add("rebuild_anyway");
    // we'll dispatch a masonry event, with window resize
    // because I don't want to appendChild script xMany
    // times, to communicate to window wrapper/scope...
    var masonry = new CustomEvent("resize");
    window.dispatchEvent(masonry);
  };
  // here are some button making things
  var butt = function (nam) { // buttons for widgets
    var sel = document.createElement("button");
    sel.id = nam.toLowerCase().replace(/\s+/, "_") + "_button";
    sel.classList.add("chrome");
    sel.classList.add("big_dark");
    var div = document.createElement("div");
    div.classList.add("chrome_button"); // numbers for same name buttons
    div.appendChild(document.createTextNode(nam.replace(/\d+$/,"")));
    sel.appendChild(div);
    return sel;
  };
  var newChromeButton = function (id, text, withWidget) {
    var container = document.createElement("span");
    container.classList.add("header_button");
    var button = document.createElement("button");
    button.id = id + "_button";
    button.classList.add("chrome");
    button.classList.add("big_dark");
    var cb;
    cb = document.createElement("div");
    cb.classList.add("chrome_button");
    if (typeof text === "string") {
      cb.innerHTML = text;
    } else { // assumed element/fragment
      cb.appendChild(text);
      var sv = cb.getElementsByTagName("svg");
      for (var i = 0; i < sv.length; i++) {
        sv[i].setAttribute("fill", "#fff");
        sv[i].setAttribute("width", "15");
        sv[i].setAttribute("height", "15");
      }
    }
    if (withWidget) {
      var arrow = document.createElement("div");
      arrow.classList.add("arrow");
      cb.appendChild(arrow);
      var input = document.createElement("input");
      input.type = "checkbox";
      input.id = id;
      button.addEventListener("click", function () {
        input.checked = !input.checked;
        input.dispatchEvent(new Event("change"));
      });
      button.appendChild(cb);
      container.appendChild(button);
      container.appendChild(input);
      var widget = document.createElement("div");
      widget.classList.add("widget");
      widget.id = id + "_widget";
      container.appendChild(widget);
    } else {
      button.appendChild(cb);
    }
    container.appendChild(button);
    return container;
  };
  // end buttons stuff
  var lcontent = document.getElementsByClassName("l-content")[0];
  if (typeof lcontent !== "undefined") {
    lcontent.innerHTML = "";
  }
  var en = document.getElementsByClassName("editor_navigation");
  var enable = en[0].getElementsByTagName("button");
  for (i = 0; i < enable.length; i++) {
    enable[i].classList.add("disable-when-none-selected");
  }
  // these functions & vars may be both plugin and window
  var postCountMake = function () {
    var hl = document.getElementsByClassName("highlighted");
    var x = hl.length;
    var i;
    var privateButton = document.getElementById("private_button");
    var privateCount = 0;
    for (i = 0; i < x; i++) {
      if (hl[i].classList.contains("private")) {
        privateCount++;
      }
    }
    if (
      privateButton !== null &&
      typeof privateButton !== "undefined" &&
      privateCount === hl.length && hl.length !== 0 &&
      privateButton.getElementsByTagName("span")[0].innerText !== "(Public)"
    ) {
      privateButton.getElementsByTagName("span")[0].innerText = "(Public)";
      privateButton.setAttribute(
        "data-edit_action",'{"post[state]":"0"}'
      ); // "0" is public usually
    } else if (
      privateButton !== null &&
      typeof privateButton !== "undefined" &&
      privateButton.getElementsByTagName("span")[0].innerText !== "Private"
    ) {
      privateButton.getElementsByTagName("span")[0].innerText = "Private";
      privateButton.setAttribute(
        "data-edit_action",'{"post[state]":"private"}'
      );
    }
    // make follow or unfollow
    var href = document.location.href.split(/[\/\?&#=]+/g);
    // make public if mostly private selected
    if (href[5] === "followers" || href[5] === "following" || href[5] === "fans") {
      var followButton = document.getElementById("unfollow_button");
      var followCount = 0;
      for (i = 0; i < x; i++) {
        if (hl[i].classList.contains("unfollowed")) {
          followCount++;
        }
      }
    }
    if (
      followButton !== null &&
      typeof followButton !== "undefined" &&
      followCount === hl.length && hl.length !== 0 &&
      followButton.getElementsByTagName("span")[0].innerText !== "Follow"
    ) {
      followButton.getElementsByTagName("span")[0].innerText = "Follow";
      followButton.setAttribute(
        "data-follow", "true"
      );
      followButton.setAttribute("title", "follow selected");
      followButton.getElementsByTagName("svg")[0].parentNode.replaceChild(
        svgForType.happy.cloneNode(true),
        followButton.getElementsByTagName("svg")[0]
      );
    } else if (
      followButton !== null &&
      typeof followButton !== "undefined" &&
      followButton.getElementsByTagName("span")[0].innerText !== "UnFollow"
    ) {
      followButton.setAttribute("title", "unfollow selected");
      followButton.getElementsByTagName("span")[0].innerText = "UnFollow";
      followButton.setAttribute(
        "data-follow", "false"
      );
      followButton.getElementsByTagName("svg")[0].parentNode.replaceChild(
        svgForType.sad.cloneNode(true),
        followButton.getElementsByTagName("svg")[0]
      );
    }
    var unsel = document.getElementById("unselect");
    var count = unsel.getElementsByClassName("chrome_button_right")[0];
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var del = document.getElementById("delete_posts");
    if (data.getAttribute("data-highlight-count") !== x.toString()) {
      data.setAttribute("data-select-all_needle", "0");
      data.setAttribute("data-select-by_needle", "0");
      document.getElementById(
        "select-all_button"
      ).getElementsByTagName("span")[0].innerHTML = "Select 100";
      data.setAttribute("data-highlight-count", x);
      document.title = data.getAttribute("doc-title") + " (" + x + ")";
      count.innerHTML = "&nbsp;(" + x + ")";
      if (del !== null) {
        del.getElementsByClassName(
          "chrome_button_right"
        )[0].innerHTML = "&nbsp;(" + x + ")";
      }
      var en = document.getElementsByClassName("editor_navigation");
      var enable = en[0].getElementsByClassName(
        "disable-when-none-selected"
      );
      // disable certain edit buttons, when 0 selected posts
      if (x === 0) {
        for (i = 0; i < enable.length; i++) {
          if (enable[i].id === "select-by_button") {
            continue;
          }
          enable[i].disabled = true;
        }
        count.innerHTML = "";
        if (del !== null) {
          del.getElementsByClassName(
            "chrome_button_right"
          )[0].innerHTML = "";
        }
        document.title = data.getAttribute("doc-title");
        data.classList.add("disable-temp");
      } else if (data.classList.contains("disable-temp")) {
        for(var l = 0; l < enable.length; l++) {
          enable[l].disabled = false;
        }
        data.classList.remove("disable-temp");
      }
    }
    // populate remove_tags widget...
    // sans ajax && sans%20escaped%20labels && sans jQuery
    var idToTags = JSON.parse(
      data.getAttribute("data-id_to_tags")
    );
    var createTagThing = function (i, tag) {
      var div = document.createElement("div");
      var input = document.createElement("input");
      input.type = "checkbox";
      input.id = "tag_checkbox_" + i;
      input.setAttribute("alt", tag);
      var label = document.createElement("label");
      label.setAttribute("for", "tag_checkbox_" + i);
      label.appendChild(
        document.createTextNode(tag)
      );
      div.appendChild(input);
      div.appendChild(label);
      return div;
    };
    var id;
    var tag;
    var tags;
    var tagsAdded = [];
    var tagsWidget = document.getElementById("tags");
    if (
      window.getComputedStyle(
        tagsWidget.parentNode
      ).getPropertyValue("display") !== "block"
    ) {
      tagsWidget.innerHTML = "";
      for (i = 0; i < hl.length; i++) {
        id = hl[i].getAttribute("data-id");
        tags = idToTags[id];
        if( typeof tags !== "undefined") {
          for (l = 0; l < tags.length; l++) {
            tag = tags[l];
            if (tagsAdded.indexOf(tag) === -1) {
              tagsAdded.push(tag);
              tagsWidget.appendChild(
                createTagThing(tagsAdded.length, tag)
              );
            }
          }
        }
      }
    }
    return x;
  };
  // end dual wrapper functions

  // these are pluginScope, but all DOM, so regardless
  var precountTheSelection = function () {
    var pick = document.getElementsByClassName("picked");
    while (pick.length > 0) {
      pick[0].classList.remove("picked");
    }
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var allToSelect = JSON.parse(
      data.getAttribute("data-all-to-select")
    );
    var typeToIds = JSON.parse(
      data.getAttribute("data-type_to_ids")
    );
    var tagToIds = JSON.parse(
      data.getAttribute("data-tag_to_ids")
    );
    var idToTags = JSON.parse(
      data.getAttribute("data-id_to_tags")
    );
    var idToTypes = JSON.parse(
      data.getAttribute("data-id_to_types")
    );
    var idToOrigin = JSON.parse(
      data.getAttribute("data-id_to_origin")
    );
    var idToState = JSON.parse(
      data.getAttribute("data-id_to_state")
    );
    var gt2select = JSON.parse(
      data.getAttribute("data-gt-to-select")
    );
    var lt2select = JSON.parse(
      data.getAttribute("data-lt-to-select")
    );
    // less than notes, the ID is the generated java shortcode thing
    var ltIs = data.classList.contains(// not more
      "istype-1902356151"
    );
    var gtIs = data.classList.contains( // more than notes
      "istype-454920947"// not less :)
    );
    var type;
    var id;
    var post;
    var tag;
    var ltgt;
    var toSelect = [];
    // contains tag
    for (var l = 0; l < allToSelect.istag.length; l++) {
      tag = allToSelect.istag[l];
      for (var i = 0; i < tagToIds[tag].length; i++) {
        id = tagToIds[tag][i];
        if(toSelect.indexOf(id) === -1) {
          toSelect.push(id);
        }
      }
    }
    var index;
    var spliceAfter;
    var originType;
    var origin = [
      "original",
      "reblog-self",
      "reblog-other"
    ];
    var stateType;
    if (toSelect.length === 0) {
      // contains type, go from 0, capture all
      for (l = 0; l < allToSelect.istype.length; l++) {
        type = allToSelect.istype[l];
        if (
          type === "notes-more-than" || type === "notes-less-than"
        ) {
          continue;
        }
        for (i = 0; i < typeToIds[type].length; i++) {
          id = typeToIds[type][i];
          if (
            allToSelect.istype.length > 1 && // capture some
            allToSelect.istype.indexOf(idToOrigin[id]) === -1 &&
            allToSelect.istype.indexOf(idToState[id]) === -1
          ) {
            continue; // has type1, but not type2
          } else {
            if(toSelect.indexOf(id) === -1) {
              toSelect.push(id);
            }
          }
        }
      }
    }
    if (toSelect.length !== 0) { // go twice, for 2 or 3 typeTypes
      // if doesn't contain type, remove  from selection
      for (l = 0; l < allToSelect.istype.length; l++) {
        type = allToSelect.istype[l];
        if (
          type === "notes-more-than" || type === "notes-less-than"
        ) {
          continue;
        }
        originType = origin.indexOf(type) !== -1;
        stateType = type === "private";
        for (i = 0; i < toSelect.length; i++) {
          id = toSelect[i];
          if (
            idToTypes[id] !== type && !originType && !stateType ||
            idToOrigin[id] !== type && originType ||
            idToState[id] !== type && stateType
          ) {
            index = toSelect.indexOf(id);
            if (index !== -1) {
              toSelect.splice(i, 1);
              i--;
            }
          }
        }
      }
    }
    // intermission/break here, continued from @ var notesLtGt
    if (ltIs) { // no :not, so no opposite-day ui confusion :)
      if (toSelect.length !== 0) {
        // after thought types like note count for LT
        for (i = 0; i < toSelect.length; i++) {
          id = toSelect[i];
          if(lt2select.indexOf(id) === -1) {
            toSelect.splice(i, 1);
            i--;
          }
        }
      } else {
        for (i = 0; i < lt2select.length; i++) {
          id = lt2select[i];
          if(toSelect.indexOf(id) === -1) {
            toSelect.push(id);
          }
        }
      }
    }
    if (gtIs) { // this has no :not, less confusion
      if (toSelect.length !== 0) {
        // after thought types like note count for GT
        for (i = 0; i < toSelect.length; i++) {
          id = toSelect[i];
          if(gt2select.indexOf(id) === -1) {
            toSelect.splice(i, 1);
            i--;
          }
        }
      } else {
        for (i = 0; i < gt2select.length; i++) {
          id = gt2select[i];
          if(toSelect.indexOf(id) === -1) {
            toSelect.push(id);
          }
        }
      }
    }
    // back to the normal function
    if (toSelect.length !== 0) { // remove from selection
      // doesn't contain tag
      for (l = 0; l < allToSelect.nottag.length; l++) {
        tag = allToSelect.nottag[l];
        for (i = 0; i < toSelect.length; i++) {
          id = toSelect[i];
          if(tagToIds[tag].indexOf(id) !== -1) {
            toSelect.push(id);
          }
        }
      }
    } else { // or wild select from 0, so add to selection
      for (l = 0; l < allToSelect.nottag.length; l++) {
        tag = allToSelect.nottag[l];
        for (id in idToTags) {
          if (idToTags[id] !== tag) {
            if(toSelect.indexOf(id) === -1) {
              toSelect.push(id);
            }
          }
        }
      }
    }
    if (toSelect.length !== 0) {
      // doesn't contain type, exclusive or whatever
      for (l = 0; l < allToSelect.nottype.length; l++) {
        type = allToSelect.nottype[l];
        if (
          type === "notes-more-than" || type === "notes-less-than"
        ) {
          continue;
        }
        originType = origin.indexOf(type) !== -1;
        stateType = type === "private";
        for (i = 0; i < toSelect.length; i++) {
          id = toSelect[i];
          if (
            idToTypes[id] === type && !originType && !stateType ||
            idToOrigin[id] === type && originType ||
            idToState[id] === type && originType
          ) {
            index = toSelect.indexOf(id);
            if (index !== -1) {
              toSelect.splice(i, 1);
              i--;
            }
          }
        }
      }
    } else { // select from nothing
      for (l = 0; l < allToSelect.nottype.length; l++) {
        type = allToSelect.nottype[l];
        if (
          type === "notes-more-than" || type === "notes-less-than"
        ) {
          continue;
        }
        for (var type2 in typeToIds) {
          if (type === type2) {
            continue;
          }
          for (i = 0; i < typeToIds[type2].length; i++) {
            id = typeToIds[type2][i];
            if (
              typeToIds[type].indexOf(id) !== -1 ||
              allToSelect.nottype.length > 1 && // capture some
              allToSelect.nottype.indexOf(idToOrigin[id]) !== -1 &&
              allToSelect.nottype.indexOf(idToState[id]) === -1
            ) {
              continue; // has type1, but not type2
            } else {
              if(toSelect.indexOf(id) === -1) {
                toSelect.push(id);
              }
            }
          }
        }
      }
    }
    // proudly show the posts select count
    var titleD = document.getElementById("select-by-widget_title");
    var countEl = titleD.getElementsByClassName("preselect-count")[0];
    countEl.classList.add("noanim");
    setTimeout(function (){
      countEl.classList.remove("noanim");
      countEl.innerHTML = " (x" + toSelect.length + ")";
    }, 1);
    var sb = document.getElementById("select_button");
    if (toSelect.length === 0) {
      if (!data.classList.contains("show-only")) {
        sb.disabled = true;
      }
    } else {
      sb.disabled = false;
      var sel;
      for (i = 0; i < toSelect.length; i++) {
        id = toSelect[i];
        sel = document.getElementById("post_" + id);
        if (sel !== null) {
          sel.classList.add("picked");
        }
      }
      data.setAttribute(
        "data-to-select",
        JSON.stringify(toSelect)
      );
    }// to be continued @ var selecto
  };
  var highlightBrick = function (brick, sel) {
    var x = postCountMake();
    var visible = !brick.classList.contains("display-none");
    var hilite = brick.classList.contains("highlighted");
    if(!hilite && sel && x < 100 && visible){
      brick.classList.remove("prevent-anim");
      brick.classList.add("highlighted");
    }
    if(hilite && !sel){
      brick.classList.add("prevent-anim");
      brick.classList.remove("highlighted");
      brick.classList.remove("edit-reblog-queue");
    }
    postCountMake();
  };
  var SVG = function (width, height, fill, viewBox, d) {
    var svg = document.createElementNS(
      "http://www.w3.org/2000/svg", "svg"
    );
    var path = document.createElementNS(
      "http://www.w3.org/2000/svg", "path"
    );
    path.setAttribute("d", d);
    svg.setAttribute("viewBox", viewBox);
    svg.setAttribute("width", width);
    svg.setAttribute("height", height);
    svg.setAttribute("fill", fill);
    svg.appendChild(path);
    return svg;
  };
  // these SVG are stringed wierdly... TODO, clean decimals, maybe?
  var svgForType = {
    "home": SVG(
      20, 20, "#fff", "0 0 25 25",
      'M 21,13 V 23 H 15 V 15 H 9 v 8 H 3 V 13 H 0 L 12,1 24,13 Z'
    ),
    "message": SVG(
      20, 20, "#fff", "0 0 25 25",
      'M 10.5 0 C 4.7 0 0 4.7 0 10.5 c 0 2.2 0.' +
      '7 4.2 1.8 5.8 l -0.7 4.1 l 4.5 -0.7 C 7.' +
      '1 20.5 8.8 21 10.5 21 C 16.3 21 21 16.2 ' +
      '21 10.4 S 16.3 0 10.5 0 Z M 5.9 7.6 c 0 ' +
      '-0.9 0.8 -1.7 1.7 -1.7 c 0.9 0 1.7 0.8 1' +
      '.7 1.7 c 0 0.9 -0.8 1.7 -1.7 1.7 c -0.9 ' +
      '0 -1.7 -0.8 -1.7 -1.7 Z m 4.6 8.4 c -2.1' +
      ' 0 -3.9 -1.1 -4.6 -2.7 c -0.3 -0.6 0.3 -' +
      '1.3 1.1 -1.3 h 6.8 c 0.8 0 1.4 0.7 1.1 1' +
      '.3 c -0.5 1.6 -2.3 2.7 -4.4 2.7 Z m 2.9 ' +
      '-6.8 c -0.9 0 -1.7 -0.8 -1.7 -1.7 c 0 -0' +
      '.9 0.8 -1.7 1.7 -1.7 c 0.9 0 1.7 0.8 1.7' +
      ' 1.7 c 0 0.9 -0.7 1.7 -1.7 1.7 Z'
    ),
    "friendly": SVG(
      20, 20, "rgba(0,0,0,0.65)", "-4 -4 30 30",
      'M 12 -2.2 C 7.5 -2.2 3.9 1.8 3.9 7.0 C 3.9 10' +
      '.5 5.7 13.6 8.3 15.1 C 7.7 14.9 7.1 14.5 6.5 ' +
      '14.1 C 2.5 15.9 0 21.5 0 24 L 24 24 C 24 21.5' +
      ' 21.4 15.9 17.4 14.1 C 16.8 14.5 16.3 14.9 15' +
      '.6 15.1 C 18.2 13.6 20.0 10.5 20.0 7.0 C 20.0' +
      ' 1.8 16.4 -2.2 12 -2.2 z '
    ),
    "mutual": SVG(
      20, 20, "rgba(0,0,0,0.65)", "-4 -4 30 30",
      'M 12 -2.2 C 7.5 -2.2 3.9 1.8 3.9 7.0 C 3.9 10' +
      '.5 5.7 13.6 8.3 15.1 C 7.7 14.9 7.1 14.5 6.5 ' +
      '14.1 C 2.5 15.9 0 21.5 0 24 L 24 24 C 24 21.5' +
      ' 21.4 15.9 17.4 14.1 C 16.8 14.5 16.3 14.9 15' +
      '.6 15.1 C 18.2 13.6 20.0 10.5 20.0 7.0 C 20.0' +
      ' 1.8 16.4 -2.2 12 -2.2 z M 11.8 15.2 C 12.7 1' +
      '5.1 13.6 15.5 14.1 16.4 C 15.2 14.4 18.5 15.0' +
      ' 18.5 17.5 C 18.5 19.3 16.4 21.1 14.1 23.6 C ' +
      '11.7 21.1 9.7 19.3 9.7 17.5 C 9.7 16.1 10.7 1' +
      '5.3 11.8 15.2 z '
    ),
    "happy": SVG(
      20, 20, "#fff", "0 0 25 25",
      'M 12 0.2 C 5.3 0.2 0 5.5 0 12.2 C 0 18.8 5.3 ' +
      '24.2 12 24.2 C 18.6 24.2 24 18.8 24 12.2 C 24' +
      ' 5.5 18.6 0.2 12 0.2 z M 16.1 4.5 A 2.2 3.3 0' +
      ' 0 1 18.4 7.9 A 2.2 3.3 0 0 1 16.1 11.2 A 2.2' +
      ' 3.3 0 0 1 13.9 7.9 A 2.2 3.3 0 0 1 16.1 4.5 ' +
      'z M 7.8 4.6 A 2.2 3.3 0 0 1 10.0 7.9 A 2.2 3.' +
      '3 0 0 1 7.8 11.3 A 2.2 3.3 0 0 1 5.6 7.9 A 2.' +
      '2 3.3 0 0 1 7.8 4.6 z M 4.2 11.4 C 6.3 13.3 8' +
      '.6 14.5 11.9 14.6 C 15.2 14.7 17.5 13.6 19.7 ' +
      '11.8 L 20.4 12.6 C 18.7 15.2 15.7 18.0 11.8 1' +
      '7.9 C 7.9 17.8 5.0 14.8 3.5 12.2 L 4.2 11.4 z' +
      ' '
    ),
    "sad": SVG(
      20, 20, "#fff", "0 0 25 25",
      'M 12 0.2 C 5.3 0.2 0 5.5 0 12.2 C 0 18.8 5.3 ' +
      '24.2 12 24.2 C 18.6 24.2 24 18.8 24 12.2 C 24' +
      ' 5.5 18.6 0.2 12 0.2 z M 16.1 4.5 A 2.2 3.3 0' +
      ' 0 1 18.4 7.9 A 2.2 3.3 0 0 1 16.1 11.2 A 2.2' +
      ' 3.3 0 0 1 13.9 7.9 A 2.2 3.3 0 0 1 16.1 4.5 ' +
      'z M 7.8 4.6 A 2.2 3.3 0 0 1 10.0 7.9 A 2.2 3.' +
      '3 0 0 1 7.8 11.3 A 2.2 3.3 0 0 1 5.6 7.9 A 2.' +
      '2 3.3 0 0 1 7.8 4.6 z M 11.8 12.6 C 15.7 12.5' +
      ' 18.7 15.3 20.3 18.0 L 19.6 18.8 C 17.5 16.9 ' +
      '15.1 15.8 11.8 15.8 C 8.5 15.9 6.2 17.0 4.1 1' +
      '8.9 L 3.4 18.1 C 5.0 15.5 7.9 12.6 11.8 12.6 ' +
      'z '
    ),
    "caption": SVG(
      20, 20, "#fff", "0 0 25 25",
      'M 2.3 2.8 L 2.3 4.8 L 21.2 4.8 L 21.2 2.' +
      '8 L 2.3 2.8 z M 2.5 8.6 L 2.5 10.6 L 21.' +
      '4 10.6 L 21.4 8.6 L 2.5 8.6 z M 2.5 14.5' +
      ' L 2.5 16.4 L 21.4 16.4 L 21.4 14.5 L 2.' +
      '5 14.5 z M 2.5 20.3 L 2.5 22.3 L 14.1 22' +
      '.3 L 14.1 20.3 L 2.5 20.3 z '
    ),
    "clock": SVG(
      20, 20, "#fff", "0 0 25 25",
      'M 12 0 C 5.3 0 -7.9e-17 5.3 0 12 C 0 18.' +
      '6 5.3 24 12 24 C 18.6 24 24 18.6 24 12 C' +
      ' 24 5.3 18.6 -7.9e-17 12 0 z M 12 3.9 C ' +
      '16.5 3.9 20.2 7.5 20.2 12 C 20.2 15.0 18' +
      '.4 17.7 15.8 19.1 C 14.6 19.7 13.3 20.0 ' +
      '12 20.0 C 7.4 20.0 3.7 16.4 3.7 12 C 3.7' +
      ' 7.5 7.4 3.9 12 3.9 z M 9.7 7.8 L 9.7 15' +
      '.0 L 15.3 15.0 L 15.3 12.3 L 12.3 12.3 L' +
      ' 12.3 7.8 L 9.7 7.8 z '
    ),
    "symlink": SVG( // symbol link :D
      20, 20, "#FFF", "0 0 17 17",
      'M 10.8 3.2 C 10.0 3.2 9.3 3.5 8.8 4.0 C ' +
      '8.0 4.8 7.8 7.2 7.8 8.5 L 7.6 9.4 C 7.5 ' +
      '10.8 7.2 11.7 7.0 11.9 C 6.4 12.4 5.5 12' +
      '.4 5.0 11.9 C 4.4 11.3 4.4 10.5 5.0 9.9 ' +
      'C 5.1 9.9 5.4 9.7 6.6 9.4 L 6.6 7.9 C 5.' +
      '5 8.0 4.5 8.3 4.0 8.8 C 2.9 9.9 2.9 11.8' +
      ' 4.0 12.9 C 5.1 14.1 7.0 14.0 8.1 12.9 C' +
      ' 8.7 12.2 9.0 10.6 9.1 9.3 L 10.4 9.0 C ' +
      '11.4 8.9 12.4 8.6 12.9 8.1 C 14.1 6.9 14' +
      '.1 5.1 12.9 4.0 C 12.3 3.4 11.5 3.2 10.8' +
      ' 3.2 z M 10.9 4.7 C 11.2 4.7 11.6 4.8 11' +
      '.9 5.0 C 12.5 5.6 12.5 6.4 11.9 7.0 C 11' +
      '.7 7.2 11.1 7.4 10.4 7.5 L 9.3 7.6 C 9.4' +
      ' 6.4 9.7 5.3 9.9 5.0 C 10.2 4.8 10.5 4.7' +
      ' 10.9 4.7 z '
    ),
    "select": SVG(
      20, 20, "rgba(255,255,255,1)", "0 0 1800 1800",
      'M 1190.5,1425 H 981.9 v 300 h 208.6 z m -445.0,0 H 536.' +
      '8 v 300 H 745.4 Z M 300.4,5 H 5 V 285.6 H 300.4 Z M 5,5' +
      '22.1 V 730.7 H 300.4 V 522.1 Z M 5,967.1 V 1175.8 H 300' +
      '.4 V 967.1 Z M 5,1412.2 V 1725 H 300.4 V 1412.2 Z M 142' +
      '7.0,1725 H 1725 V 1412.2 H 1427.0 Z M 1725,1175.8 V 967' +
      '.1 h -300 v 208.6 z m 0,-445.0 V 522.1 h -300 v 208.6 z' +
      ' m 0,-445.0 V 5 h -297.9 l -0.0,280.6 z M 536.8,305 H 7' +
      '45.4 V 5 H 536.8 Z m 445.0,0 H 1190.5 V 5 H 981.9 v 300'
    ),
    "unselect": SVG(
      20, 20, "rgba(255,255,255,1)", "0 0 1800 1800",
      'M 1190.5,1425 H 981.9 v 300 h 208.6 z m -445.0,0 H 536.' +
      '8 v 300 H 745.4 Z M 300.4,5 H 5 V 285.6 H 300.4 Z M 5,5' +
      '22.1 V 730.7 H 300.4 V 522.1 Z M 5,967.1 V 1175.8 H 300' +
      '.4 V 967.1 Z M 5,1412.2 V 1725 H 300.4 V 1412.2 Z M 142' +
      '7.0,1725 H 1725 V 1412.2 H 1427.0 Z M 1725,1175.8 V 967' +
      '.1 h -300 v 208.6 z m 0,-445.0 V 522.1 h -300 v 208.6 z' +
      ' m 0,-445.0 V 5 h -297.9 l -0.0,280.6 z M 536.8,305 H 7' +
      '45.4 V 5 H 536.8 Z m 445.0,0 H 1190.5 V 5 H 981.9 Z M 5' +
      '26.1,1392.8 870.3,1048.6 1214.6,1392.8 1402.4,1204.9 10' +
      '58.2,860.7 1402.4,516.5 1214.6,328.7 870.3,672.9 526.1,' +
      '328.7 338.3,516.5 682.5,860.7 338.3,1204.9 526.1,1392.8'
    ),
    "private": SVG(
      20, 20, "rgba(0,0,0,0.65)", "0 0 25 25",
      'M 12 0 C 8.687 0 6 2.687 6 6 L 6 10 L 3 ' +
      '10 L 3 24 L 21 24 L 21 10 L 18 10 L 18 6' +
      ' C 18 2.687 15.313 0 12 0 z M 12 2 C 14.' +
      '205 2 16 3.794 16 6 L 16 10 L 8 10 L 8 6' +
      ' C 8 3.794 9.794 2 12 2 z '
    ),
    "view": SVG(
      20, 20, "#fff", "0 0 25 25",
      'M 5 2 C 3.9 2 3 2.9 3 4 L 3 19 C 3 20.1 3' +
      '.9 21 5 21 L 9.90625 21 C 9.40625 20.4 9.' +
      '1125 19.7 8.8125 19 L 5 19 L 5 4 L 17 4 L' +
      ' 17 10.8125 C 17.7 11.0125 18.4 11.40625 ' +
      '19 11.90625 L 19 4 C 19 2.9 18.1 2 17 2 L' +
      ' 5 2 z M 15 12 C 12.254545 12 10 14.25454' +
      '5 10 17 C 10 19.745455 12.254545 22 15 22' +
      ' C 16.014334 22 16.958627 21.71405 17.75 ' +
      '21.1875 L 20.59375 24 L 22 22.59375 L 19.' +
      '1875 19.75 C 19.71405 18.958627 20 18.014' +
      '334 20 17 C 20 14.254545 17.745455 12 15 ' +
      '12 z M 15 14 C 16.654545 14 18 15.345455 ' +
      '18 17 C 18 18.654545 16.654545 20 15 20 C' +
      ' 13.345455 20 12 18.654545 12 17 C 12 15.' +
      '345455 13.345455 14 15 14 z'
    ),
    "see": SVG(
      20, 20, "#fff", "0 0 25 25",
      'M12.0 7c4.7 0 8.0 3.0 9.5 4.6-1.4 1.8-4.7 ' +
      '5.3-9.5 5.3-4.4 0-7.9-3.5-9.4-5.4 1.4-1.6 ' +
      '4.8-4.5 9.4-4.5zm0-2c-7.5 0-12.0 6.5-12.0 ' +
      '6.5s4.8 7.4 12.0 7.4c7.7 0 11.9-7.4 11.9-7' +
      '.4s-4.2-6.5-11.9-6.5zm-.0 3c-2.2 0-4 1.7-4' +
      ' 4s1.7 4 4 4c2.2 0 4-1.7 4-4s-1.7-4-4-4zm-' +
      '.0 3.9c-.5.5-1.4.5-2.0 0s-.5-1.4 0-2.0c.5-' +
      '.5 1.4-.5 2.0 0s.5 1.4 0 2.0z'
    ),
    "edit": SVG(
      20, 20, "#fff", "0 0 17.6 17.6",
      'M5.3 13.8l-2.1.7.7-2.1L10.3 6l1.4 1.4-6.' +
      '4 6.4zm6.4-9.3l-1.4-1.4-1.4 1.4-6.7 6.7-' +
      '.2.5-2 5.9 3.8-1.3 2.1-.7.4-.1.3-.3 7.8-' +
      '7.8c.1 0-2.7-2.9-2.7-2.9zm5.6-1.4L14.5.3' +
      'c-.4-.4-1-.4-1.4 0l-1.4 1.4L15.9 6l1.4-1' +
      '.4c.4-.5.4-1.1 0-1.5'
    ),
    "tag": SVG(
     20, 20, "rgba(0,0,0,0.65)", "0 0 25 25",
    'M 22.548,9 C 23.206256,8.9700327 23.650255,7.910999 23,7 H 1' +
    '7.636 L 19,1 C 18.752094,0.59934281 17.927011,0.1886722 17,1' +
    ' l -1.364,6 h -5 L 12,1 C 11.549885,0.14080067 10.499307,0.2' +
    '4688203 10,1 L 8.636,7 H 2.452 C 1.4285746,7.5060381 1.19403' +
    '09,8.6369341 2,9 H 8.182 L 6.818,15 H 1.458 C 0.88718577,15.' +
    '077045 -0.12646423,15.930092 1,17 H 6.364 L 5,23 c 0.085861,' +
    '0.788259 1.3877329,1.432281 2,0 l 1.364,-6 h 5 L 12,23 c -0.' +
    '149456,1.256123 1.798475,1.024039 2,0 l 1.364,-6 h 6.185 C 2' +
    '2.966246,16.643398 22.272209,14.963206 22,15 h -6.182 l 1.36' +
    '4,-6 z m -8.73,6 h -5 l 1.364,-6 h 5 z'
    ),
    "ask": SVG(
      20, 20, "rgba(0,0,0,0.65)", "0 0 17 17",
      'M8.7 0C4.1 0 .4 3.7.4 8.3c0 1.2.2 2.3.7 3.4-.2.6-.4 1.5-.7 2' +
      '.5L0 15.8c-.2.7.5 1.4 1.2 1.2l1.6-.4 2.4-.7c1.1.5 2.2.7 3.4.' +
      '7 4.6 0 8.3-3.7 8.3-8.3C17 3.7 13.3 0 8.7 0zM15 8.3c0 3.5-2.' +
      '8 6.3-6.4 6.3-1.2 0-2.3-.3-3.2-.9l-3.2.9.9-3.2c-.5-.9-.9-2-.' +
      '9-3.2.1-3.4 3-6.2 6.5-6.2S15 4.8 15 8.3z'
    ),
    "reblog-self": SVG(
      20, 20, "rgba(0,0,0,0.65)", "0 0 17 18.1",
      'M12.8.2c-.4-.4-.8-.2-.8.4v2H' +
      '2c-2 0-2 2-2 2v5s0 1 1 1 1-1' +
      ' 1-1v-4c0-1 .5-1 1-1h9v2c0 .' +
      '6.3.7.8.4L17 3.6 12.8.2zM4.2' +
      ' 17.9c.5.4.8.2.8-.3v-2h10c2 ' +
      '0 2-2 2-2v-5s0-1-1-1-1 1-1 1' +
      'v4c0 1-.5 1-1 1H5v-2c0-.6-.3' +
      '-.7-.8-.4L0 14.6l4.2 3.3z'
      ),
    "original": SVG(
      20, 20, "rgba(0,0,0,0.65)", "0 0 27 27",
      'M 12.2,5.3 14.1,9.9 l 4.3,0.5 -2.9,4.1 0' +
      '.9,4.7 -4.8,-2.1 C 7.2,11.3 10.6,11.3 12' +
      '.2,5.3 Z M 12,0.5 8.3,8.1 0,9.3 6.0,15.1' +
      ' 4.5,23.4 12,19.4 19.4,23.4 17.9,15.1 24' +
      ',9.3 15.6,8.1 Z'
    ),
    "reblog-other": SVG(
      20, 20, "rgba(0,0,0,0.6)", "18 10 67 67",
      'M 64.7 10.1 C 63.9 10.2 63.3 11.0 63.3 12.' +
      '4 L 63.3 20.0 L 25.5 20.0 C 17.9 20.0 18 2' +
      '7.5 18 27.5 L 18 46.4 C 18 46.4 17.9 50.2 ' +
      '21.7 50.2 C 25.5 50.2 25.5 46.4 25.5 46.4 ' +
      'L 25.5 31.3 C 25.5 27.5 27.4 27.5 29.3 27.' +
      '5 L 63.3 27.5 L 63.3 35.1 C 63.3 37.4 64.4' +
      ' 37.7 66.3 36.6 L 82.2 23.7 L 66.3 10.9 C ' +
      '65.8 10.3 65.2 10.1 64.7 10.1 z M 50.5 30.' +
      '1 C 42.2 30.1 35.5 36.7 35.5 44.9 C 35.5 5' +
      '3.1 42.2 59.8 50.5 59.8 C 58.8 59.8 65.5 5' +
      '3.1 65.5 44.9 C 65.5 36.7 58.8 30.1 50.5 3' +
      '0.1 z M 50.5 32.6 C 55.1 32.6 59.2 35.1 61' +
      '.3 38.8 L 39.7 38.8 C 41.8 35.1 45.9 32.6 ' +
      '50.5 32.6 z M 78.4 38.9 C 74.6 38.9 74.6 4' +
      '2.6 74.6 42.6 L 74.6 57.8 C 74.6 61.5 72.8' +
      ' 61.5 70.9 61.5 L 36.8 61.5 L 36.8 54.0 C ' +
      '36.8 51.7 35.7 51.3 33.8 52.5 L 18 65.3 L ' +
      '33.8 78.2 C 34.4 78.7 35.0 79.0 35.4 79.0 ' +
      'C 36.3 78.9 36.8 78.1 36.8 76.7 L 36.8 69.' +
      '1 L 74.6 69.1 C 82.2 69.1 82.2 61.5 82.2 6' +
      '1.5 L 82.2 42.6 C 82.2 42.6 82.2 38.9 78.4' +
      ' 38.9 z M 38.5 41.2 L 40.9 41.2 C 41.6 43.' +
      '1 43.3 44.9 45.9 44.9 C 49.0 44.9 48.6 42.' +
      '1 50.5 42.1 C 52.4 42.1 52.0 44.9 55.1 44.' +
      '9 C 57.7 44.9 59.4 43.1 60.1 41.2 L 62.4 4' +
      '1.2 C 62.8 42.4 63.0 43.7 63.0 44.9 C 63.0' +
      ' 51.8 57.4 57.3 50.5 57.3 C 43.6 57.3 38.0' +
      ' 51.8 38.0 44.9 C 38.0 43.7 38.2 42.4 38.5' +
      ' 41.2 z M 43.6 47.3 L 43.0 48.0 C 44.4 50.' +
      '1 47.0 52.4 50.5 52.4 C 54.0 52.4 56.6 50.' +
      '1 58.0 48.0 L 57.4 47.3 C 55.5 48.8 53.4 4' +
      '9.7 50.5 49.7 C 47.6 49.7 45.5 48.8 43.6 4' +
      '7.3 z '
    ),
    "notes": SVG(
      20, 20, "rgba(0,0,0,0.65)", "0 0 20 18",
      'M14.658 0c-1.625 0-3.21.767-4.463 2.156-' +
      '.06.064-.127.138-.197.225-.074-.085-.137' +
      '-.159-.196-.225C8.547.766 6.966 0 5.35 0' +
      ' 4.215 0 3.114.387 2.162 1.117c-2.773 2.' +
      '13-2.611 5.89-1.017 8.5 2.158 3.535 6.55' +
      '6 7.18 7.416 7.875A2.3 2.3 0 0 0 9.998 1' +
      '8c.519 0 1.028-.18 1.436-.508.859-.695 5' +
      '.257-4.34 7.416-7.875 1.595-2.616 1.765-' +
      '6.376-1-8.5C16.895.387 15.792 0 14.657 0' +
      'h.001zm0 2.124c.645 0 1.298.208 1.916.68' +
      '3 1.903 1.461 1.457 4.099.484 5.695-1.97' +
      '3 3.23-6.16 6.7-6.94 7.331a.191.191 0 0 ' +
      '1-.241 0c-.779-.631-4.966-4.101-6.94-7.3' +
      '32-.972-1.595-1.4-4.233.5-5.694.619-.475' +
      ' 1.27-.683 1.911-.683 1.064 0 2.095.574 ' +
      '2.898 1.461.495.549 1.658 2.082 1.753 2.' +
      '203.095-.12 1.259-1.654 1.752-2.203.8-.8' +
      '87 1.842-1.461 2.908-1.461h-.001z'
    ),
    "liked": SVG(
      20, 20, "rgba(255,0,0,1)", "0 0 20 18",
      'M17.888 1.1C16.953.38 15.87 0 14.758 0c-1.' +
      '6 0-3.162.76-4.402 2.139-.098.109-.217.249' +
      '-.358.42a12.862 12.862 0 0 0-.36-.421C8.4.' +
      '758 6.84 0 5.248 0 4.14 0 3.06.381 2.125 1' +
      '.1-.608 3.201-.44 6.925 1.14 9.516c2.186 3' +
      '.59 6.653 7.301 7.526 8.009.38.307.851.474' +
      ' 1.333.474a2.12 2.12 0 0 0 1.332-.473c.873' +
      '-.71 5.34-4.42 7.526-8.01 1.581-2.597 1.75' +
      '5-6.321-.968-8.418'
    ),
    "text": SVG(
      20, 20, "#000", "0 0 20.8 13",
      'M.1 13h2.8l.9-3h4.7l.8 3h2.9L7.7 0h-3L.1' +
      ' 13zm6-10.1l2 5.1H4.2l1.9-5.1zM20 10V6c0' +
      '-1.1-.2-1.9-1-2.3-.7-.5-1.7-.7-2.7-.7-1.' +
      '6 0-2.7.4-3.4 1.2-.4.5-.6 1.2-.7 2h2.4c.' +
      '1-.4.2-.6.4-.8.2-.3.6-.4 1.2-.4.5 0 .9.1' +
      ' 1.2.2.3.1.4.4.4.8 0 .3-.2.5-.5.7-.2.1-.' +
      '5.2-1 .2l-.9.1c-1 .1-1.7.3-2.2.6-.9.5-1.' +
      '4 1.3-1.4 2.5 0 .9.3 1.6.8 2 .6.5 1.3.9 ' +
      '2.2.9.7 0 1.2-.3 1.7-.6.4-.2.8-.6 1.2-.9' +
      ' 0 .2 0 .4.1.6 0 .2.1.8.2 1h2.7v-.8c-.1-' +
      '.1-.3-.2-.4-.3.1-.3-.3-1.7-.3-2zm-2.2-1.' +
      '1c0 .8-.3 1.4-.7 1.7-.4.3-1 .5-1.5.5-.3 ' +
      '0-.6-.1-.9-.3-.2-.2-.4-.5-.4-.9 0-.5.2-.' +
      '8.6-1 .2-.1.6-.2 1.1-.3l.6-.1c.3-.1.5-.1' +
      '.7-.2.2-.1.3-.1.5-.2v.8z'
    ),
    "image": SVG(
      20, 20, "#ff492f", "0 0 17 15",
      'M14.6 1h-2.7l-.6-1h-6l-.6 1H2.4C1.1 1 0 ' +
      '2 0 3.3v9.3C0 13.9 1.1 15 2.4 15h12.2c1.' +
      '3 0 2.4-1.1 2.4-2.4V3.3C17 2 15.9 1 14.6' +
      ' 1zM8.3 13.1c-2.9 0-5.2-2.3-5.2-5.1s2.3-' +
      '5.1 5.2-5.1c2.9 0 5.2 2.3 5.2 5.1s-2.3 5' +
      '.1-5.2 5.1zm5.9-8.3c-.6 0-1.1-.5-1.1-1.1' +
      ' 0-.6.5-1.1 1.1-1.1s1.1.5 1.1 1.1c0 .6-.' +
      '5 1.1-1.1 1.1zm-10 3.1c0 1.2.5 2.2 1.3 3' +
      ' 0-.2 0-.4-.1-.6 0-2.2 1.8-4 4.1-4 1.1 0' +
      ' 2 .4 2.8 1.1-.3-2-2-3.4-4-3.4-2.2-.1-4.' +
      '1 1.7-4.1 3.9z'
    ),
    "link": SVG(
      20, 20, "#00cf35", "0 0 17 17",
      'M9.9 5.1c-.2.3-.5 1.4-.6 2.6l1.1-.1c.7-.' +
      '1 1.3-.3 1.5-.5.6-.6.6-1.4 0-2-.6-.5-1.4' +
      '-.5-2 0zM8.5 0C3.8 0 0 3.8 0 8.5S3.8 17 ' +
      '8.5 17 17 13.2 17 8.5 13.2 0 8.5 0zm4.4 ' +
      '8.2c-.5.5-1.5.8-2.5.9l-1.2.2c-.1 1.3-.4 ' +
      '2.9-1 3.6-1.1 1.1-3 1.2-4.1 0-1.1-1.1-1.' +
      '1-3 0-4.1.5-.5 1.5-.8 2.6-.9v1.5c-1.2.3-' +
      '1.5.5-1.6.5-.6.6-.6 1.4 0 2 .5.5 1.4.5 2' +
      ' 0 .2-.2.5-1.1.6-2.5l.1-.9c0-1.3.2-3.6 1' +
      '-4.4 1.1-1.1 3-1.2 4.1 0 1.2 1.1 1.2 2.9' +
      ' 0 4.1z'
    ),
    "quote": SVG(
      20, 20, "#ff8a00", "0 0 17 13",
      'M3.5 5.5C4 3.7 5.8 2.4 7.2 1.3L5.9 0C3 1' +
      '.8 0 5 0 8.5 0 11 1.3 13 4 13c2 0 3.7-1.' +
      '5 3.7-3.6C7.7 7 6 5.5 3.5 5.5zm9.3 0c.4-' +
      '1.8 2.2-3.1 3.7-4.2L15.2 0c-2.8 1.8-5.9 ' +
      '5-5.9 8.5 0 2.4 1.3 4.5 4 4.5 2 0 3.7-1.' +
      '5 3.7-3.6 0-2.4-1.7-3.9-4.2-3.9z'
    ),
    "chat": SVG(
      20, 20, "#00b8ff", "0 0 18.7 17",
      'M16 6.1V2.6C16 .8 15 0 13.1 0H2.9C1 0 0 ' +
      '1.1 0 3.3v10.4C0 15.9 1 17 2.9 17h10.2c1' +
      '.9 0 2.9-.8 2.9-2.6v-2.9l2.7-2.9c0-.1-2.' +
      '7-2.5-2.7-2.5zm-4.5-.7c0-.5.3-.8.7-.8s.8' +
      '.3.8.8v1.7l-.3 2.5c0 .3-.2.4-.4.4s-.4-.1' +
      '-.4-.4l-.3-2.5V5.4zm-3.8 6.4c0 .4-.1.8-.' +
      '7.8-.5 0-.7-.4-.7-.8V9.1C6.3 8.4 6 8 5.4' +
      ' 8c-.5 0-1 .4-1 1.2v2.6c0 .4-.1.8-.7.8s-' +
      '.7-.4-.7-.8V5.4c0-.5.3-.8.7-.8.4 0 .7.3.' +
      '7.8v2.1c.3-.4.7-.8 1.5-.8s1.7.5 1.7 2c.1' +
      '.1.1 3.1.1 3.1zm2.5 0c0 .4-.1.8-.7.8-.5 ' +
      '0-.7-.4-.7-.8V7.5c0-.4.1-.8.7-.8.5 0 .7.' +
      '4.7.8v4.3zm-.7-5.6c-.4 0-.7-.4-.7-.8s.3-' +
      '.8.7-.8c.4 0 .7.4.7.8s-.3.8-.7.8zm2.8 6.' +
      '3c-.4 0-.8-.4-.8-.9s.3-.9.8-.9.8.4.8.9-.' +
      '4.9-.8.9z'
    ),
    "audio": SVG(
      20, 20, "#7c5cff", "0 0 19 16",
      'M17.7 7.3c-.4-4.4-4-7.3-8.3-7.3-4.3 0-7.' +
      '9 2.9-8.3 7.4C.5 7.4 0 8 0 8.6v5c0 .8.6 ' +
      '1.4 1.3 1.4H4c.2.4.8 1 1.2 1 .6 0 .8-1 .' +
      '8-1.6V7.8c0-.5-.2-1.6-.8-1.6-.4 0-1 .8-1' +
      '.2 1.1H2.9c.4-3.5 3.2-5.6 6.5-5.6s6.2 2.' +
      '1 6.5 5.6H15c0-.3-.7-1.1-1.1-1.1-.6 0-.9' +
      ' 1-.9 1.6v6.6c0 .5.3 1.6.9 1.6.4 0 1.1-.' +
      '6 1.2-1h2.6c.7 0 1.3-.6 1.3-1.3v-5c0-.8-' +
      '.6-1.3-1.3-1.4zM3 8.5v1l-2 1.3V8.5h2zm15' +
      ' .9l-2 1.3V8.5h2v.9zm-6.4.3l-1.6.5V6.4c0' +
      '-.1-.1-.2-.2-.2s-.2 0-.2.1L7.2 12v.2c.1.' +
      '1.1.1.2.1L9 12v3.8c0 .1-.2.2-.1.2h.3c.1 ' +
      '0 .2 0 .2-.1l2.4-5.9v-.2c-.1-.1-.2-.1-.2' +
      '-.1z'
    ),
    "video": SVG(
      20, 20, "#ff62ce", "0 0 16 15",
      'M15.7 7.8c-.2-.1-.5 0-.6.1l-2.9 2.2c-.1.' +
      '1-.1.1-.2.1V8H0v3h2v3.2c0 .4.3.8.8.8h8.4' +
      'c.5 0 .8-.4.8-.8V12c0 .1.1.2.2.2l2.9 2.2' +
      'c.2.2.4.2.6.1.2-.1.3-.3.3-.5V8.4c0-.2-.1' +
      '-.5-.3-.6zM2.8 6.9c.3 0 .8.1 1.1.1h5.5c.' +
      '3 0 .8-.1 1-.1 1.6-.3 2.8-1.7 2.8-3.4 0-' +
      '1.9-1.6-3.5-3.5-3.5-1.2 0-2.4.6-3 1.7h-.' +
      '1C5.9.6 4.8 0 3.6 0 1.6 0 0 1.6 0 3.5c0 ' +
      '1.7 1.2 3 2.8 3.4zM9 4.2c1 0 1.8-.8 1.8-' +
      '1.8v-.3c.4.3.6.8.6 1.4 0 1-.8 1.8-1.8 1.' +
      '8-.9 0-1.6-.6-1.8-1.5.3.3.7.4 1.2.4zm-6.' +
      '2.1c1 0 1.8-.8 1.8-1.8v-.3c.4.2.6.7.6 1.' +
      '3 0 1-.8 1.8-1.8 1.8-.9 0-1.6-.6-1.8-1.5' +
      '.3.3.7.5 1.2.5z'
    ),
  };
  svgForType.secondary = svgForType.friendly;
  // the profile user icon thing ^

  // begin the giant selectBy widget population things
  var populateSelectByWidget = function () {
    if (!document.getElementById("select-by").checked) {
      return;
    }
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    // these are large JSON attributes DOM, but it should run ok
    // as long as no mutation events/observers on Tumblr's side
    var tagsAllArr = JSON.parse(
      data.getAttribute("data-tags_all_arr")
    );
    var typesAllArr = JSON.parse(
      data.getAttribute("data-types_all_arr")
    );
    var idsAllArr = JSON.parse(
      data.getAttribute("data-ids_all_arr")
    );
    var idToTags = JSON.parse(
      data.getAttribute("data-id_to_tags")
    );
    var idToTypes = JSON.parse(
      data.getAttribute("data-id_to_types")
    );
    var idToOrigin = JSON.parse(
      data.getAttribute("data-id_to_origin")
    );
    var idToState = JSON.parse(
      data.getAttribute("data-id_to_state")
    );
    var idToNotes = JSON.parse(
      data.getAttribute("data-id_to_notes")
    );
    var tagToIds = JSON.parse(
      data.getAttribute("data-tag_to_ids")
    );
    var typeToIds = JSON.parse(
      data.getAttribute("data-type_to_ids")
    );
    var widgetFirstFocus = data.getAttribute(
      "widget_first-focus"
    );
    var rowsLength = 0;
    var anti = function () { // is and not checkboxes
      var ante = document.getElementById(
        this.getAttribute("anti")
      );
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var allToSelect = JSON.parse(
        data.getAttribute("data-all-to-select")
      );
      var tp = document.getElementsByClassName("type");
      var tg;
      var tg2;
      var tgi;
      if (this.checked && ante.checked) {
        ante.parentNode.classList.remove("ch");
        ante.classList.remove(this.id);
        ante.checked = false;
        tg = ante.getAttribute("data-is");
        tg2 = ante.getAttribute("data-tag");
        tgi = allToSelect[tg].indexOf(tg2);
        if (tgi !== -1) {
          allToSelect[tg].splice(tgi, 1);
        }
      }
      var tag = this.getAttribute("data-tag");
      var is = this.getAttribute("data-is");
      var i = allToSelect[is].indexOf(tag);
      var originSelected = false;
      if (this.checked) {
        this.parentNode.classList.add("ch");
        data.classList.add(this.id);
        var origin = ["original","reblog-self","reblog-other"];
        if(i === -1) {
          if (this.classList.contains("type")) {
            for (i = 0; i < tp.length; i++) {
              if (tp[i] !== this) {
                tg = tp[i].getAttribute("data-is");
                tg2 = tp[i].getAttribute("data-tag");
                if (tg2 === null) {
                  continue;
                }
                if (
                    (
                      data.classList.contains(tp[i].id) &&
                      tg2 !== "reblog-self" &&
                      tg2 !== "reblog-other" &&
                      tg2 !== "original" &&
                      tg2 !== "notes-less-than" &&
                      tg2 !== "notes-more-than" &&
                      tg2 !== "private" &&
                      tag !== "private"
                    ) || (
                      data.classList.contains(tp[i].id) &&
                      origin.indexOf(tg2) !== -1 &&
                      origin.indexOf(tag) !== -1
                    )
                ) {
                  // there can be only one...
                  tgi = allToSelect[tg].indexOf(tg2);
                  tp[i].parentNode.classList.remove("ch");
                  tp[i].checked = false;
                  data.classList.remove(tp[i].id);
                  if (tgi !== -1) {
                    allToSelect[tg].splice(tgi, 1);
                  }
                  // you can't select 1 post, with 2 basic types...
                  // it doesn't exist
                }
              }
            }
          }
          allToSelect[is].push(tag);
        }
      } else {
        this.parentNode.classList.remove("ch");
        data.classList.remove(this.id);
        if(i !== -1) {
          allToSelect[is].splice(i, 1);
        }
      }
      data.setAttribute(
        "data-all-to-select",
        JSON.stringify(allToSelect)
      );
      //istag, nottag, istype, nottype
      // step 1 ^ gain the checkBoxes
      // step 2 v preCount the selection
      precountTheSelection();
    };
    var notesLtGt = function () {
      var row = this.parentNode;
      var recount = row.getElementsByClassName("input_is")[0];
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var idToNotes = JSON.parse(
        data.getAttribute("data-id_to_notes")
      );
      var alreadyHidden = data.classList.contains(
         "some-posts-already-hidden"
       );
      var visibleIdsAllArr = JSON.parse(
        data.getAttribute("data-visible_ids_all_arr")
      );
      var op = this.getAttribute("data-operator")
      var ltb = op === "lt";
      var gtb = op === "gt";
      var count = 0;
      var ids = [];
      var nh; // not hidden
      var countEl = row.getElementsByClassName("count")[0];
      for (var id in idToNotes) {
        nh = ( // do not count for hidden posts
          alreadyHidden &&
          visibleIdsAllArr.indexOf(id) !== -1
        ) || !alreadyHidden;
        if(
          (idToNotes[id] < this.value && ltb && nh) ||
          (idToNotes[id] > this.value && gtb && nh)
        ) {
          ids.push(id);
          count++; // count the posts to select
        }
      }
      if (ltb) {
        data.setAttribute(
          "select-by-note_lt",
          this.value
        );
        data.setAttribute(
          "data-lt-to-select",
          JSON.stringify(ids)
        );
      }
      // to be continued @ var precountTheSelection
      if (gtb) {
         data.setAttribute(
          "select-by-note_gt",
          this.value
        );
        data.setAttribute(
          "data-gt-to-select",
          JSON.stringify(ids)
        );
      }
      countEl.innerHTML = count;
      if (recount.checked) {
        precountTheSelection();
      }
    };
    // make row function makeRow
    var widgetRow = function (tag, count, isType, tagIcon) {
      var row = document.createElement("div");
      var rowId = (isType? "type" : "tag") + shortCode(tag);
      row.id = rowId;
      row.setAttribute("data-row", rowsLength);
      row.classList.add("row");
      if (isType) {
        row.classList.add("type");
        row.classList.add(tag);
      } else {
        row.classList.add("tag");
      }
      var countColumn = document.createElement("div");
      countColumn.classList.add("count");
      countColumn.appendChild(
        document.createTextNode(
          count.toLocaleString(
            "en", {useGrouping:true}
          )
        )
      );
      var label1 = document.createElement("label");
      var label2 = document.createElement("label");
      var input1 = document.createElement("input");
      var input2 = document.createElement("input");
      input1.setAttribute("data-tag", tag);
      input2.setAttribute("data-tag", tag);
      var lb = (isType ? "type" : "tag");
      input1.setAttribute("data-is", "is" + lb);
      input2.setAttribute("data-is", "not" + lb);
      input1.classList.add(lb);
      input2.classList.add(lb);
      input1.classList.add("yes");
      input2.classList.add("no");
      input1.setAttribute("data-yn", "yes");
      input2.setAttribute("data-yn", "no");
      var id1 = "is" + rowId;
      var id2 = "not" + rowId;
      input1.setAttribute(
        "anti", "not" + rowId
      );
      input1.classList.add("input_is");
      input2.setAttribute(
        "anti", "is" + rowId
      );
      input2.classList.add("input_not");
      input1.id = id1;
      input2.id = id2;
      input1.addEventListener("change", anti);
      input2.addEventListener("change", anti);
      input1.type = "checkbox";
      input2.type = "checkbox";
      label1.setAttribute("for", id1);
      label2.setAttribute("for", id2);
      var div = document.createElement("div");
      div.classList.add("row-child");
      row.setAttribute("title", tag);
      label1.appendChild(countColumn);
      // we use html instead of textNode for emoji :(
      if (isType) {
        div.innerHTML = tag.replace(/-/g, " ").
        replace(/^.|\s./g, function (m){
          return m.toUpperCase();
        }).replace("Original","Original (op)");
      } else {
        div.innerHTML = tag;
      }
      tagIcon.classList.add("tag-icon");
      label1.appendChild(tagIcon);
      label1.appendChild(div);
      var is = document.createElement("span");
      is.appendChild(document.createTextNode("is: "))
      is.appendChild(input1);
      label2.appendChild(
        document.createTextNode("not: ")
      );
      label2.appendChild(input2);
      label1.classList.add("is");
      label2.classList.add("not");
      if (data.classList.contains("is" + rowId)) {
        input1.checked = true;
        is.classList.add("ch");
      } else if (data.classList.contains("not" + rowId)) {
        label2.classList.add("ch");
        input2.checked = true;
      }
      label1.appendChild(is);
      row.appendChild(label2);
      row.appendChild(label1);
      rowsLength++;
      return row;
    };
    var tag;
    var type;
    var widget = document.getElementById("select-by_widget");
    widget.innerHTML = "";
    var topPart = document.createElement("div");
    topPart.id = "widget-top-buttons";
    var abcSort = document.createElement("div");
    abcSort.classList.add("sort");
    abcSort.classList.add("abc");
    abcSort.appendChild(document.createTextNode("abc"));
    var numSort = document.createElement("div");
    numSort.classList.add("sort");
    numSort.classList.add("num");
    numSort.appendChild(document.createTextNode("123"));
    var dateSort = document.createElement("div");
    dateSort.classList.add("sort");
    dateSort.classList.add("date");
    dateSort.appendChild(document.createTextNode("date"));
    var redSort = document.createElement("div");
    redSort.classList.add("red");
    // the sorting method gets the arrow
    var arrow = document.createElement("div");
    arrow.classList.add("arrow");
    var widgetSortBy = data.getAttribute("widget_sort-by");
    dateSort.setAttribute("widget_sort-by", "date-down");
    abcSort.setAttribute("widget_sort-by", "abc-down");
    numSort.setAttribute("widget_sort-by", "num-down");
    if (widgetSortBy === "date-down") {
      dateSort.appendChild(arrow);
      // this is default sort method, do nothing
      dateSort.setAttribute("widget_sort-by", "date-up");
    }
    if (widgetSortBy === "date-up") {
      arrow.classList.add("reverse");
      dateSort.appendChild(arrow);
      // this is default sort method reversed
      typesAllArr.reverse();
      tagsAllArr.reverse();
    }
    if (widgetSortBy === "abc-down") {
      abcSort.appendChild(arrow);
      // sort by alphabetical
      typesAllArr.sort();
      tagsAllArr.sort();
      abcSort.setAttribute("widget_sort-by", "abc-up");
    }
    if (widgetSortBy === "abc-up") {
      arrow.classList.add("reverse");
      abcSort.appendChild(arrow);
      // sort by reverse alphabetical
      typesAllArr.sort();
      tagsAllArr.sort();
      typesAllArr.reverse();
      tagsAllArr.reverse();
    }
    var sortByCounts = function () {
      var typeArr = [];
      for(var type in typeToIds) {
        typeArr.push([typeToIds[type].length, type]);
      }
      typeArr.sort(function (a, b) {
        return parseFloat(b[0]) - parseFloat(a[0]);
      });
      for (var i = 0; i < typeArr.length; i++) {
        typesAllArr[i] = typeArr[i][1];
      }
      var tagArr = [];
      for(var tag in tagToIds) {
        tagArr.push([tagToIds[tag].length, tag]);
      }
      tagArr.sort(function (a, b) {
        return parseFloat(b[0]) - parseFloat(a[0]);
      });
      for (i = 0; i < tagArr.length; i++) {
        tagsAllArr[i] = tagArr[i][1];
      }
    };
    if (widgetSortBy === "num-down") {
      numSort.appendChild(arrow);
      // sort by counts
      sortByCounts();
      numSort.setAttribute("widget_sort-by", "num-up");
    }
    if (widgetSortBy === "num-up") {
      arrow.classList.add("reverse");
      numSort.appendChild(arrow);
      // sort by reverse counts
      sortByCounts();
      typesAllArr.reverse();
      tagsAllArr.reverse();
    }
    var sortBy = function () {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      data.setAttribute(
        "widget_sort-by",
        this.getAttribute("widget_sort-by")
      );
      populateSelectByWidget();
    };
    var reSte = typesAllArr.indexOf("private");
    if(reSte !== -1) {
      typesAllArr.splice(reSte, 1);
      typesAllArr.unshift("private");
    }
    var reOthr = typesAllArr.indexOf("reblog-other");
    if(reOthr !== -1) {
      typesAllArr.splice(reOthr, 1);
      typesAllArr.unshift("reblog-other");
    }
    var reSelf = typesAllArr.indexOf("reblog-self");
    if(reSelf !== -1) {
      typesAllArr.splice(reSelf, 1);
      typesAllArr.unshift("reblog-self");
    }
    var reOrgi = typesAllArr.indexOf("original");
    if(reOrgi !== -1) {
      typesAllArr.splice(reOrgi, 1);
      typesAllArr.unshift("original");
    }
    // ^ the last shall be first
    var inputFocus = function () {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      data.setAttribute(
        "widget_first-focus",
        this.id
      );
    };
    var memValue = function () {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var alreadyHidden = data.classList.contains(
        "some-posts-already-hidden"
      );
      var sb;
      var s;
      if (this.id === "uncheck") {
        s = document.getElementById(
          "select_button"
        );
        sb = s.firstChild;
        sb.innerHTML = this.checked ? "UnSelect" : "Select";
      }
      if (this.id === "show-only") {
        s = document.getElementById(
          "select_button"
        );
        sb = s.firstChild;
        sb.innerHTML = this.checked ?
          (alreadyHidden ? "ShowAll" : "Hide=!X") : "Select";
      }
      if (this.checked) {
        data.classList.add(this.id);
      } else {
        data.classList.remove(this.id);
      }
    };
    var memAndRePopulate = function () {
      var ante = document.getElementById(
        this.getAttribute("anti")
      );
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var href = document.location.href.split(/[\/\?&#=]+/g);
      if (this.checked && ante.checked) {
        ante.checked = false;
      }
      if (this.checked) {
        data.classList.add(this.id);
        data.classList.remove(ante.id);
      } else {
        data.classList.remove(this.id);
        if (ante.checked) {
          data.classList.add(ante.id);
        }
      }
    };
    dateSort.addEventListener("click", sortBy);
    abcSort.addEventListener("click", sortBy);
    numSort.addEventListener("click", sortBy);
    topPart.appendChild(numSort);
    topPart.appendChild(abcSort);
    topPart.appendChild(dateSort);
    topPart.appendChild(redSort);
    widget.appendChild(topPart);
    var scrollingPart = document.createElement("div");
    scrollingPart.classList.add("overflow-auto");
    scrollingPart.id = "widget_scrolling_part";
    widget.appendChild(scrollingPart);
    // the types / tags rows begin
    var div1 = document.createElement("div");
    div1.classList.add("tags_title");
    div1.appendChild(
      document.createTextNode(
        href[5] === "followers" || href[5] === "follows" || href[5] === "fans"?
        "Blogs By Type" :
        "Posts By Type"
      )
    );
    var wsp = document.getElementById("widget_scrolling_part");
    wsp.appendChild(div1);
    // firstly, add some integral buttons that need to go first
    var ltgtInput = document.createElement("input");
    ltgtInput.addEventListener("focus", inputFocus);
    ltgtInput.id = "hide-ltgt-than-tags";
    ltgtInput.type = "number";
    ltgtInput.addEventListener("change", function () {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      data.setAttribute("hide-ltgt-than-tags", this.value);
      var gtl = document.getElementById("gt_input");
      var ltl = document.getElementById("lt_input");
    });
    ltgtInput.value = parseFloat(data.getAttribute("hide-ltgt-than-tags"));
    var lt = document.createElement("input");
    lt.type = "checkbox";
    lt.id = "lt_input";
    lt.setAttribute("anti", "gt_input");
    var ltlabel = document.createElement("label");
    ltlabel.setAttribute("for", "lt_input");
    ltlabel.appendChild(document.createTextNode("Less Than"));
    var gt = document.createElement("input");
    gt.type = "checkbox";
    gt.id = "gt_input";
    gt.setAttribute("anti", "lt_input");
    var gtlabel = document.createElement("label");
    gtlabel.setAttribute("for", "gt_input");
    gtlabel.appendChild(document.createTextNode("More Than"));
    lt.checked = data.classList.contains("lt_input");
    gt.checked = data.classList.contains("gt_input");
    var hider = butt("Hide");
    hider.setAttribute("title", "Hide/Show");
    hider.addEventListener("click", function () {
      populateSelectByWidget();
    });
    var acheck = butt("Clear");
    acheck.firstChild.innerHTML = "UnCheck";
    acheck.setAttribute("title", "Uncheck All");
    acheck.addEventListener("click", function () {
      var ch = new CustomEvent("change");
      var wgt = document.getElementById("select-by_widget");
      var check = wgt.getElementsByTagName("input");
      for (var i = 0; i < check.length; i++) {
        if (
          check[i].getAttribute("type") === "checkbox" &&
          check[i].checked
        ) {
          check[i].checked = false;
          check[i].dispatchEvent(ch);
        } //else {
          //TODO ??
        //}
      }
      populateSelectByWidget();
    });
    var ltgtContainer = document.createElement("div");
    ltgtContainer.setAttribute(
      "title",
      "Hide tags that occur less than: X#"
    );
    gt.addEventListener("change", memAndRePopulate);
    lt.addEventListener("change", memAndRePopulate);
    ltgtContainer.appendChild(lt);
    ltgtContainer.appendChild(ltlabel);
    ltgtContainer.appendChild(gt);
    ltgtContainer.appendChild(gtlabel);
    ltgtContainer.appendChild(ltgtInput);
    ltgtContainer.classList.add("select-by_ltgt");
    ltgtContainer.appendChild(ltgtInput);
    ltgtContainer.appendChild(hider);
    widget.appendChild(ltgtContainer);
    // append rows for types
    var count;
    var countOver = document.getElementById("hide-ltgt-than-tags").value;
    // this boolean says to check post counts, to hide
    var lti = document.getElementById("lt_input");
    var gti = document.getElementById("gt_input");
    var postTypeTagHiddenCount = 0;
    var alreadyHidden = data.classList.contains(
      "some-posts-already-hidden"
    );
    var visibleIdsAllArr = JSON.parse(
      data.getAttribute("data-visible_ids_all_arr")
    );
    // start the types with note count rows
    var ltrow = widgetRow(
      "notes-less-than", "0", 1, svgForType.notes.cloneNode(true)
    );
    ltrow.getElementsByClassName("input_not")[0].disabled = true;
    ltrow.getElementsByClassName("not")[0].classList.add("disabled");
    var gtrow = widgetRow(
      "notes-more-than", "0", 1, svgForType.notes.cloneNode(true)
    );
    gtrow.getElementsByClassName("input_not")[0].disabled = true;
    gtrow.getElementsByClassName("not")[0].classList.add("disabled");
    var ltnumber = document.createElement("input");
    ltnumber.type = "number";
    // input focus, remembers focus, for constant DOM rebuild
    ltnumber.addEventListener("focus", inputFocus);
    var gtnumber = document.createElement("input");
    gtnumber.addEventListener("focus", inputFocus);
    gtnumber.type = "number";
    ltnumber.classList.add("number-input");
    gtnumber.classList.add("number-input");
    ltnumber.setAttribute("data-operator", "lt");
    gtnumber.setAttribute("data-operator", "gt");
    ltnumber.value = parseFloat(
      data.getAttribute("select-by-note_lt")
    );
    gtnumber.value = parseFloat(
      data.getAttribute("select-by-note_gt")
    );
    ltnumber.addEventListener("input", notesLtGt);
    gtnumber.addEventListener("input", notesLtGt);
    var quickInput = new CustomEvent("input");
    ltnumber.id = "select-by-notes_less-than";
    gtnumber.id = "select-by-notes_more-than";
    ltrow.append(ltnumber);
    gtrow.append(gtnumber);
    if (href[5] !== "follows" && href[5] !== "followers") {
      wsp.appendChild(ltrow);
      wsp.appendChild(gtrow);
    }
    // this func just counts the posts w/ note counts
    if(
      document.getElementById(
        "select-by-notes_less-than"
      ) !== null &&
      document.getElementById(
        "select-by-notes_more-than"
      ) !== null
    ) {
      document.getElementById(
        "select-by-notes_less-than"
      ).dispatchEvent(quickInput);
      document.getElementById(
        "select-by-notes_more-than"
      ).dispatchEvent(quickInput);
    }
    var div2 = document.createElement("div");
    div2.classList.add("tags_title");
    var newCount;
    var id;
    var l;
    for (var i = 0; i < typesAllArr.length; i++) {
      type = typesAllArr[i];
      if (type === "notes-more-than" || type === "notes-less-than") {
        continue;
      }
      count = typeToIds[type].length;
      if (alreadyHidden) {
        newCount = 0;
        // also do this for tags scroll below,
        // make sure id is visible
        for(l = 0; l < typeToIds[type].length; l++) {
          id = typeToIds[type][l];
          if (visibleIdsAllArr.indexOf(id) !== -1) {
            newCount++;
          }
        }
        // hide counts--; and rows that are invisible
        if(newCount === 0) {
          postTypeTagHiddenCount++;
          continue;
        } else {
          count = newCount;
        }
      }
      // skip if less than tags/type count :)
      if (
        // get both countOvers (type and tag, scroll down :)
        (
          type !== "reblog-self" &&
          type !== "reblog-other"
        ) && (
          (count < countOver && lti.checked) ||
          (count > countOver && gti.checked)
        )
      ) {
        postTypeTagHiddenCount++;
        continue;
      }
      wsp.appendChild(
        widgetRow(
          type, count, 1, svgForType[type].cloneNode(true)
        )
      );
    }
    // types / tags seperator
    div2.appendChild(
      document.createTextNode(
        href[5] === "followers" || href[5] === "follows" ?
        "" :
        "Posts By Tag"
      )
    );
    wsp.appendChild(div2);
    // append rows for tags
    for (i = 0; i < tagsAllArr.length; i++) {
      tag = tagsAllArr[i];
      count = tagToIds[tag].length;
      if (alreadyHidden) {
        newCount = 0;
        // also do this for types up above
        for(l = 0; l < tagToIds[tag].length; l++) {
          id = tagToIds[tag][l];
          if (visibleIdsAllArr.indexOf(id) !== -1) {
            newCount++;
          }
        }
        // hide counts--; and rows that are invisible (AGAIN)
        if(newCount === 0) {
          postTypeTagHiddenCount++;
          continue;
        } else {
          count = newCount;
        }
      }
      // skip if tags amount to lessThan / moreThan
      if (
        // get both countOvers (scroll up :)
        (count < countOver && lti.checked) ||
        (count > countOver && gti.checked)
      ) {
        postTypeTagHiddenCount++;
        continue;
      }
      wsp.appendChild(
        widgetRow(
          tag, count, 0, svgForType.tag.cloneNode(true)
        )
      );
    }
    // finish with the tags, show hidden count in top
    var wigTB = document.getElementById("widget-top-buttons");
    var redTB = wigTB.getElementsByClassName("red")[0];
    if (postTypeTagHiddenCount !== 0) {
      redTB.innerHTML = postTypeTagHiddenCount + " rows hidden";
    } else {
      wigTB.removeChild(redTB);
    }
    var re = butt("List");
    re.setAttribute("title", "Refresh Tags/Type List...");
    re.firstChild.innerHTML = "Refresh";
    re.addEventListener("click", function () {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var wsp = document.getElementById("widget_scrolling_part");
      data.setAttribute("widget_scroll-top", wsp.scrollTop);
      // refresh the tag select by widget
      document.getElementById("lt_input").checked = false;
      document.getElementById("gt_input").checked = false;
      data.classList.remove("lt_input");
      data.classList.remove("gt_input");
      populateSelectByWidget();
    });
    var cancel = butt("Cancel1");
    cancel.firstChild.innerHTML = "&#x274C;";
    cancel.setAttribute("title", "Cancel and Close Widget...");
    cancel.addEventListener("click", function () {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var pick = document.getElementsByClassName("picked");
      while (pick.length > 0) {
        pick[0].classList.remove("picked");
      }
      var wsp = document.getElementById("widget_scrolling_part");
      data.setAttribute("widget_scroll-top", wsp.scrollTop);
      document.getElementById("select-by").checked = false;
    });
    var needle = parseFloat(
      data.getAttribute("data-select-by_needle")
    );
    var selecto = butt("Select"); // this is the select-by/show-by button
    if (data.classList.contains("show-only")) {
      selecto.firstChild.innerHTML = (alreadyHidden ? "ShowAll" : "Hide=!X");
    } else if (
      needle > 0 &&
      !data.classList.contains("uncheck")
    ) {
      selecto.firstChild.innerHTML = "100more";
    }
    // "select by tag" "select by type"
    selecto.addEventListener("click", function () {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var limit = 100; // tumblr limit, for classic mass tag api
      var needle = parseFloat(
        data.getAttribute("data-select-by_needle")
      );
      var s = document.getElementById(
        "select_button"
      );
      var sb = s.firstChild;
      // Mass Post Features v3 by benign-mx (me) Jake Jilg
      // oh wait. I don't need this^ anymore... :) sorry...
      precountTheSelection();
      // continued from this^ function @ var precountTheSelection
      var toSelect = JSON.parse(
        data.getAttribute("data-to-select")
      );
      var idsAllArr = JSON.parse(
        data.getAttribute("data-ids_all_arr")
      );
      var alreadyHidden = data.classList.contains(
        "some-posts-already-hidden"
      );
      var visibleIdsAllArr = JSON.parse(
        data.getAttribute("data-visible_ids_all_arr")
      );
      var hl;
      var un = data.classList.contains("uncheck");
      var regularSelect = !data.classList.contains("show-only");
      // and finally select some posts
      var i = 0;
      var id;
      var hlBrick;
      hl = document.getElementsByClassName("highlighted");
      var needleBefore = needle;
      var selectedCount = 0;
      if (regularSelect) {
        while (hl.length > 0 && needle !== 0) {
          highlightBrick(hl[0], 0);
        }
        for (i = needle; i < toSelect.length; i++) {
          hlBrick = document.getElementById("post_" + toSelect[i]);
          if (hlBrick !== null) {
            // or deselect if uselect is checked
            if (!un) {
              needle++;
              if (needle > needleBefore + limit) { // stop at 100 select
                break;
              }
            }
            selectedCount++;
            highlightBrick(hlBrick, !un);
          }
        }
        if (selectedCount < limit) {
          needle = 0;
        }
        data.setAttribute("data-select-by_needle", needle);
      } else {
        // but this is the ShowOnly mode thing... :)
        var needRebuild = false;
        var brick;
        if (!alreadyHidden) {
          sb.innerHTML = "ShowAll";
          s.disabled = false;
          data.classList.add(
            "some-posts-already-hidden"
          );
          for (i = 0; i < idsAllArr.length; i++) {
            id = idsAllArr[i];
            brick = document.getElementById("post_" + id);
            if (toSelect.indexOf(id) !== -1){
               visibleIdsAllArr.push(id);
            }// a clone of toSelect,
            // but this staggers back for more after selections :)
            if (
              toSelect.indexOf(id) === -1 &&
              brick !== null
            ) {
              needRebuild = true;
              brick.classList.remove("brick");
              brick.classList.remove("laid");
              brick.classList.remove("highlighted");
              brick.classList.add("display-none");
            } else if (
              toSelect.indexOf(id) !== -1 &&
              brick !== null &&
              brick.classList.contains("display-none")
            ) {
              needRebuild = true;
              brick.classList.add("brick");
              brick.classList.add("laid");
              brick.classList.remove("display-none");
            }
          }
        } else {
          sb.innerHTML = "Hide=!X";
          var dn = document.getElementsByClassName("display-none");
          data.classList.remove(
            "some-posts-already-hidden"
          );
          needRebuild = dn.length > 0;
          while (dn.length > 0) {
            dn[0].classList.add("brick");
            dn[0].classList.add("laid");
            // this goes lass, or else dn[0] becomes undefined :)
            dn[0].classList.remove("display-none");
          }
        }
        if (needRebuild) {
          pluginBuildColumns();
        }
      }
      data.setAttribute(
        "data-visible_ids_all_arr",
        JSON.stringify(visibleIdsAllArr)
      );
      postCountMake();
      populateSelectByWidget();
    });
    cancel.setAttribute("title", "Close Widget");
    selecto.setAttribute("title", "Select or Show");
    widget.appendChild(selecto);
    widget.appendChild(cancel);
    widget.appendChild(acheck);
    widget.appendChild(re);
    var unlabel = document.createElement("label");
    var uncheck = document.createElement("input");
    uncheck.type = "checkbox";
    uncheck.id = "uncheck";
    uncheck.addEventListener("change", memValue);
    if (data.classList.contains("uncheck")) {
      uncheck.checked = true;
    }
    unlabel.setAttribute("for", "uncheck");
    unlabel.appendChild(document.createTextNode("Un"));
    var h1 = document.createElement("div");
    var shoLabel = document.createElement("label");
    var shoInput = document.createElement("input");
    shoInput.id = "show-only";
    shoInput.addEventListener("change", memValue);
    if (data.classList.contains("show-only")) {
      shoInput.checked = true;
    }
    shoInput.type = "checkbox";
    shoLabel.setAttribute("for", "show-only");
    shoLabel.appendChild(document.createTextNode("Show Only"));
    h1.appendChild(shoInput);
    h1.appendChild(shoLabel);
    h1.appendChild(uncheck);
    h1.appendChild(unlabel);
    h1.id = "select-by-widget_title";
    var innerSpan = document.createElement("span");
    innerSpan.appendChild(document.createTextNode("Select"));
    var countSpan = document.createElement("span");
    countSpan.classList.add("preselect-count");
    countSpan.appendChild(document.createTextNode("(x0)"));
    countSpan.setAttribute("title", "Selecting X Many...")
    innerSpan.appendChild(countSpan);
    h1.appendChild(innerSpan);
    // refocus number inputs
    var ff = document.getElementById(widgetFirstFocus);
    ff.focus();
    // all elements added, go back down/up scrollTop
    wsp.scrollTo(
      0,
      parseFloat(
        data.getAttribute("widget_scroll-top")
      )
    );
    // lastly, the title element textNode
    widget.appendChild(h1);
    precountTheSelection();
  }; // end var populateSelectByWidget

  // this had an alert(); yucky
  document.getElementById("unselect").
  parentNode.setAttribute(
    "onclick",
    (function () {
      var hl = document.getElementsByClassName("highlighted");
      while(hl.length > 0) {
        hl[0].classList.add("prevent-anim");
        hl[0].classList.remove("edit-reblog-queue");
        hl[0].classList.remove("highlighted");
      }
      window.postCountMake();
      return false;
    }).toString().slice(13,-1)
  );
  // end alert fix

  // this had escaped%20spaces in the tags eww!
  document.getElementById(
    "tags_loading"
  ).parentNode.removeChild(
    document.getElementById(
      "tags_loading"
    )
  );
  document.getElementById("remove_tags").
  parentNode.setAttribute(
    "onclick",
    (function () {
      window.just_clicked_remove_tags = !0;
      var hl = document.getElementsByClassName("highlighted");
      if (hl.length === 0) {
        document.getElementById(
          "no_tags_message"
        ).style.display = "block";
        document.getElementById(
          "remove_tag_button"
        ).style.display = "none";
      } else {
        document.getElementById(
          "remove_tag_button"
        ).style.display = "block";
        document.getElementById(
          "no_tags_message"
        ).style.display = "none";
      }
      document.getElementById(
        "remove_tags_widget"
      ).style.display = "block";
      return false;
    }).toString().slice(13,-1)
  );
  // end escape fix up in

  // these functions are only in plugin scope

  // API...? Where we are going, we won't need API :)
  var getResponseText = function (url, read, header) {
    var post = undefined;
    if (typeof url === "object") {
      post = url.post;
      url = url.url;
      // this ^ twist, maybe not elegant?
    }
    var get = "GET";
    if (// special URLs, make POST
      "/svc/secure_form_key" === url ||
      "/svc/post/update" === url.split(/\?/)[0] ||
      "/svc/post/upload_photo" === url.split(/\?/)[0] ||
      "/svc/post/upload_text_image" === url.split(/\?/)[0] ||
      "customize_api" === url.split("/")[1] &&
      typeof post !== "undefined"
    ) {
      get = "POST";
    }
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () {
      if (
        this.readyState == 4 && this.status == 200 &&
        typeof this.responseText !== "undefined"
      ) {
        read(
          "/svc/secure_form_key" === url ?
          { // we need the puppies, to make a new post
            puppies: this.getResponseHeader("x-tumblr-secure-form-key"),
            kittens: /* this.getAllResponseHeaders() */ 0
          } :// Idk what kittens is, but it happens after success
              this.responseText
        );
      }
      if (this.readyState == 4 && this.status != 200) {
        if (typeof responseText !== "undefined") {
          read("{\"response\":{\"is_friend\":false}}");
        } else {
          read(400);
        }
      }
    };
    xhttp.open(get, url, true);
    xhttp.onerror = function(){
      read(400);
    };
    // headers only after open and only before send
     if(typeof header !== "undefined") {
      for(var i = 0; i < header.length; i++) {
         xhttp.setRequestHeader(header[i][0], header[i][1]);
      }
    }
    if (get === "GET") {
      xhttp.send();
    } else {
      xhttp.send(post);
    }
  };

  // add a bouncey reblog or heart
  var reblogAnimation = function(id) {
    var cb = document.getElementById("post_" + id);
    var bigReblog = svgForType["reblog-self"].cloneNode(true);
    bigReblog.setAttribute("fill", "#7EFF29");
    bigReblog.setAttribute("width", "125");
    bigReblog.setAttribute("height", "125");
    bigReblog.classList.add("big-reblog");
    bigReblog.addEventListener("mousedown", function(){
      this.parentNode.removeChild(this);
    });
    setTimeout(function(){
      bigReblog.parentNode.removeChild(bigReblog);
    }, 1700);
    cb.appendChild(bigReblog);
  }
  // a bouncey horsey ^

  // this v creates a post template with selected blogs
  var blogDropping = false;
  var newPostNameDrop = function() {
    if (blogDropping) {
      return;
    }
    blogDropping = true;
    var highlighted = document.getElementsByClassName("highlighted");
    var portraits = document.createElement("canvas");
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    var pCtx = portraits.getContext("2d");
    var img;
    var l = 0;
    var t = 0;
    var w = 5;
    var d;
    portraits.width = w * 128;
    portraits.height = Math.ceil(highlighted.length / w) * 128;
    var blogList = [];
    for (var i = 0; i < highlighted.length; i++) {
      img = highlighted[i].getElementsByClassName("follower-avatar")[0];
      blogList.push(highlighted[i].getAttribute("data-name"));
      ctx.drawImage(img, 0, 0);
      pCtx.drawImage(canvas, l * 128, t * 128);
      l++;
      if (l >= w) {
        l = 0;
        t++;
      }
    }
    portraits.toBlob(function(blob) {
      var formData = new FormData();
      formData.append("image", blob, "image" + (new Date()).getTime() + ".png");
      var apiKey = data.getAttribute("data-x-tumblr-form-key");
      getResponseText(
        {url: "/svc/post/upload_text_image?post_id=undefined&channel=" + name, post: formData},
        function(re){
          api = JSON.parse(re);
          var img = new Image();
          var rawWidth = portraits.width;
          var rawHeight = portraits.height;
          if (
            typeof api !== "undefined" &&
            typeof api[0] !== "undefined" &&
            typeof api[0].url !== "undefined"
          ) {
            img.src = api[0].url;
            rawWidth = api[0].raw_width;
            rawHeight = api[0].raw_height;
          } else {
            img.src = portraits.toDataURL();
          }// whether we get the URL or not, the show must go on
          var mediaHolder = document.createElement("div");
          mediaHolder.classList.add("media-holder");
          mediaHolder.classList.add("media-holder-draggable");
          mediaHolder.classList.add("media-holder-figure");
          mediaHolder.setAttribute("contenteditable", "false");
          mediaHolder.setAttribute("draggable", "true");
          mediaHolder.style.display = "block";
          var mediaFigure = document.createElement("figure");
          mediaFigure.setAttribute("data-orig-width", rawWidth);
          mediaFigure.setAttribute("data-orig-height", rawHeight);
          img.setAttribute("data-orig-width", rawWidth);
          img.setAttribute("data-orig-height", rawHeight);
          var mediaRemove = document.createElement("div");
          mediaRemove.classList.add("media-button");
          mediaRemove.classList.add("icon_close");
          mediaRemove.classList.add("media-killer");
          mediaFigure.appendChild(img);
          mediaHolder.appendChild(mediaFigure);
          mediaHolder.appendChild(mediaRemove);
          var iframe2 = document.createElement("iframe");
          iframe2.id = "neue_post_form-iframe";
          iframe2.addEventListener("load", function () {
            blogDropping = false;
            var posterPending = true;
            var titlePending = true;
            // this checks if done editing/closed
            var reminisce2 = setInterval(function () {
              var w = document.getElementById(
                "neue_post_form-iframe"
              ).contentWindow;
              var p = w.document.getElementsByClassName(
                "post-forms-modal"
              )[0];
              var span;
              var ul;
              var br;
              var a;
              var editor = w.document.getElementsByClassName("editor-richtext");
              var title = w.document.getElementsByClassName("editor-plaintext");
              if (editor.length > 0 && posterPending) {
                span = document.createElement("p"); // it was going to be a span
                span.appendChild(
                   document.createTextNode(
                     "I want to give a shout out to these awesome blags!"
                   )
                );
                ul = document.createElement("p"); // and a ul, but the links
                for (var i = 0; i < blogList.length; i++) {
                  br = document.createElement("br");
                  ul.appendChild(
                    document.createTextNode(
                      " @" + blogList[i] + " "
                    )
                  );
                  ul.appendChild(br); // didn't refer popovers for some reason
                }
                posterPending = false;
                editor[0].appendChild(span);
                editor[0].appendChild(mediaHolder);
                editor[0].appendChild(ul);
                editor[0].focus();
                editor[0].dispatchEvent(new Event("input"));
              }
              if (editor.length > 0 && titlePending) {
                titlePending = false;
                span = document.createElement("span");
                span.appendChild(
                   document.createTextNode(
                     "Blog Name Drop"
                   )
                );
                title[0].appendChild(span);
              }
              if (
                typeof p === "undefined" ||
                typeof p !== "undefined" &&
                p.length === 0 ||
                typeof p !== "undefined" &&
                (
                  w.getComputedStyle(p).
                  getPropertyValue("display") === "none" ||
                  w.getComputedStyle(p).
                  getPropertyValue("opacity").toString() === "0"
                )
              ) {
                clearInterval(reminisce2);
                document.body.removeChild(
                  document.getElementById("neue_post_form-iframe")
                );
              }
            }, 500);
          });
          iframe2.src = "https://www.tumblr.com/neue_web/iframe/blog/" +
            name + "/new/text";
          iframe2.setAttribute("scrolling", "no");
          iframe2.setAttribute("frameborder", "0");
          iframe2.setAttribute("title", "Post forms");
          document.body.appendChild(iframe2);
        },
        [
          ["X-tumblr-form-key", apiKey],
          ["X-Requested-With", "XMLHttpRequest"]
        ]
      )
    });
  };
  // this ^ creates a post template with selected blogs

  // this function follows and unfollows
  var followOrUnFollow = function(liked, info, button, repeat) {
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var typeToIds = JSON.parse(
      data.getAttribute("data-type_to_ids")
    );
    var idToTypes = JSON.parse(
      data.getAttribute("data-id_to_types")
    );
    var apiKey = data.getAttribute("data-x-tumblr-form-key");
    var v2url = liked ?
        "/svc/unfollow" : "/svc/follow";
    var xhttp = new XMLHttpRequest();
    var whiteHeart;
    xhttp.onreadystatechange = function () {
      var href = document.location.href.split(/[\/\?&#=]+/g);
      if (this.readyState == 4 && this.status == 200) {
        data.setAttribute(
          "data-unstable-next-href",
          parseInt(
            data.getAttribute("data-unstable-next-href")
          ) + (liked ? -1 : 1)
        );
        button.innerHTML = "";
        var cb = document.getElementById(
          "post_" + button.getAttribute("data-id")
        );
        if (liked) {
          if (button.classList.contains("return-to-secondary")) {
            whiteHeart = svgForType.secondary.cloneNode(true);
            whiteHeart.setAttribute("fill", "#fff");
            button.setAttribute(
              "title",
              "UnFollowed Secondary. " +
              "It will be gone after you leave."
            );
          } else {
            whiteHeart = svgForType.notes.cloneNode(true);
            whiteHeart.setAttribute("fill", "#fff");
            button.setAttribute(
              "title",
              href[5] === "follows" ?
              "You no longer follow this blog." +
              "It will be gone after you leave." :
              "Click to Follow this Follower back :)"
            );
          }
          button.classList.remove("liked");
          button.classList.add("not-liked");
          cb.classList.remove("fellow");
          idToTypes[
            button.getAttribute("data-id")
          ] = "friendly";
          typeToIds["mutual"].splice(
            typeToIds["mutual"].indexOf(
              button.getAttribute("data-id")
            ), 1
          );
          typeToIds["friendly"].push(button.getAttribute("data-id"));
        } else {
          idToTypes[
            button.getAttribute("data-id")
          ] = "mutual";
          typeToIds["friendly"].splice(
            typeToIds["friendly"].indexOf(
              button.getAttribute("data-id")
            ), 1
          );
          typeToIds["mutual"].push(button.getAttribute("data-id"));
          if (button.classList.contains("return-to-secondary")) {
            whiteHeart = svgForType.secondary.cloneNode(true);
            whiteHeart.setAttribute("fill", "#9af");
            button.setAttribute(
              "title",
              "Secondary Blog:\n" +
              "Only primaries can follow you back." +
              "\n(click to unfollow)"
            );
          } else {
            whiteHeart = svgForType.liked.cloneNode(true);
            whiteHeart.setAttribute("fill", "#56f");
            button.setAttribute("title", "Mutual (Click to UnFollow)");
          }
          button.classList.add("liked");
          button.classList.remove("not-liked");
          // graphical aftertaste for reblog/follow
          var bigHeart = svgForType.liked.cloneNode(true);
          bigHeart.setAttribute("fill", "#56f");
          bigHeart.setAttribute("width", "125");
          bigHeart.setAttribute("height", "125");
          bigHeart.classList.add("big-heart");
          setTimeout(function(){
            bigHeart.parentNode.removeChild(bigHeart);
          }, 1700);
          cb.appendChild(bigHeart);
          button.classList.add("new-liked");
        }// liked means followed here; this saves css space
        button.appendChild(whiteHeart);
        button.classList.remove("clicked");
        var erq = document.getElementsByClassName("edit-reblog-queue");
        if (typeof repeat !== "undefined" && erq.length > 0) {
          erq[erq.length-1].classList.remove("edit-reblog-queue");
          repeat();
        }
        data.setAttribute(
          "data-id_to_types",
          JSON.stringify(idToTypes)
        );
        data.setAttribute(
          "data-type_to_ids",
          JSON.stringify(typeToIds)
        );
      }
    };
    xhttp.open("POST", v2url, true);
    // headers only after open and only before send
    xhttp.setRequestHeader(
      "X-tumblr-form-key", apiKey
    );
    xhttp.setRequestHeader(
      "Content-Type",
      "application/x-www-form-urlencoded; charset=UTF-8"
    );
    xhttp.setRequestHeader(
      "X-Requested-With", "XMLHttpRequest"
    );
    xhttp.send(info);
  };
  var followOrUnfollowSelected = function() {
    var erq = document.getElementsByClassName("edit-reblog-queue");
    var hl = document.getElementsByClassName("highlighted");
    while (erq.length < hl.length) {
      hl[erq.length].classList.add("edit-reblog-queue");
    }
    var repeat = function () {
      var erq = document.getElementsByClassName("edit-reblog-queue");
      var key = erq[erq.length-1].getAttribute("data-follower-key");
      var button = document.getElementById("follow_heart_" + key);
      var info = button.getAttribute("data-like-info");
      var liked = document.getElementById(
        "unfollow_button"
      ).getAttribute("data-follow") !== "true";
      followOrUnFollow(liked, info, button, repeat);
    };
    repeat(); // and follow/unfollow
  };
  // this v runs on a button ^ this runs 1 or many buttons
  var followOrUnFollowButton = function (e) {
    e.cancelBubble = true;
    e.stopPropagation();
    e.preventDefault();
    if (this.classList.contains("clicked")) {
      return;
    }
    this.classList.remove("new-liked");
    this.classList.add("clicked");
    var button = this;
    var liked = this.classList.contains("liked");
    var info = this.getAttribute("data-like-info");
    followOrUnFollow(liked, info, button);
  };
  // fun :)
  var stopToFindMutuals = function (
  me, them, url, key, link3, followerBrick, finished
  ) { // since the following API has no followback property...
    // the followers API has a followback propery tho; I guess
    // it's only because we know they already follow you...
    followerBrick.classList.add("following");
    // also ^ since these are your follows/following
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var tblg = JSON.parse(
      data.getAttribute("data-tumblelogs")
    );
    var typeToIds = JSON.parse(
      data.getAttribute("data-type_to_ids")
    );
    var idToTypes = JSON.parse(
      data.getAttribute("data-id_to_types")
    );
    if (typeof typeToIds["friendly"] === "undefined") {
      typeToIds["friendly"] = [];
    }
    if (typeof typeToIds["mutual"] === "undefined") {
      typeToIds["mutual"] = [];
    }
    if (typeof typeToIds["secondary"] === "undefined") {
      typeToIds["secondary"] = [];
    }
    var apiKey = data.getAttribute("data-x-tumblr-form-key");
    var primary = data.getAttribute("data-primary-blog");
    getResponseText(
      "/svc/blog/followed_by?tumblelog=" + tblg[me] + "&query=" + them,
      function (re) {
        link3.classList.add("liked");
        // this ^ comes in for all blogs on this page, because we already follow
        var whiteHeart;
        if(re === 400) { // these fill the error console with
          // ajax err messages, but this is the Tumblr server's own
          // throw; I don't know how to stop it... try catch, doesn't
          // work for asynchronous...
          // regardless, it still works :D
          console.log(
            "/svc/blog/followed_by?tumblelog=" + tblg[me] + "&query=" + them +
            "\nSecondary blogs can't follow blogs. Error 400 is thrown when" +
            "\nthose do not exist in the mutual followers database."
          );
          typeToIds["secondary"].push(key);
          idToTypes[key] = "secondary";
          whiteHeart = svgForType.friendly.cloneNode(true);
          whiteHeart.setAttribute("fill", "#9af");
          link3.href = url;
          link3.setAttribute(
            "title",
            "Secondary Blog:\n" +
            "Only primaries can follow you back." +
            "\n(click to unfollow)"
          );
          link3.classList.add("not-liked");
          link3.appendChild(whiteHeart);
          link3.classList.add("return-to-secondary");
          data.setAttribute(
            "data-id_to_types",
            JSON.stringify(idToTypes)
          );
          data.setAttribute(
            "data-type_to_ids",
            JSON.stringify(typeToIds)
          );
          link3.addEventListener("click", followOrUnFollowButton);
          followerBrick.classList.remove("missing-follows-info");
          setTimeout(finished, 40);
          return;
          // I use timeouts to slow it down on the repeat
          // checkIfFollowing seeIfFollowing etc. stuff
          // because when I leave the connection open too long
          // it makes more error 400s which are false errs
          // not to be confused with the true error 400s which
          // come from secondary blogs that can't follow you
        }
        var api = JSON.parse(re);
        if (
          typeof api !== "undefined" &&
          typeof api.response !== "undefined" &&
          typeof api.response.is_friend !== "undefined"
        ) {
          if (
            api.response.is_friend
          ) {
            typeToIds["mutual"].push(key);
            followerBrick.classList.add("mutual");
            idToTypes[key] = "mutual";
            whiteHeart = svgForType.liked.cloneNode(true);
            whiteHeart.setAttribute("fill", "#56f");
            link3.href = url + "#unfollow:" + tblg[me];
            link3.setAttribute(
              "title",
              "Mutual of " + tblg[me] + " and more..."+
              "\n(Click to UnFollow)"
            );
            link3.appendChild(whiteHeart);
            data.setAttribute(
              "data-id_to_types",
              JSON.stringify(idToTypes)
            );
            data.setAttribute(
              "data-type_to_ids",
              JSON.stringify(typeToIds)
            );
            link3.addEventListener("click", followOrUnFollowButton);
            followerBrick.classList.remove("missing-follows-info");
            setTimeout(finished, 40);
            // mutual doesn't need to be retested again...
            // a friend is a friend, if they follow any
            // of your blogs
            return;
          } else {
            // not a 2ndary, but not a follower
            // see if following other blogs instead...?
            if (me >= tblg.length - 1) {
              // not following anyone; df just a friendly
              typeToIds["friendly"].push(key);
              idToTypes[key] = "friendly";
              whiteHeart = svgForType.liked.cloneNode(true);
              whiteHeart.setAttribute("fill", "#56f");
              link3.href = url + "#unfollow:" + them;
              link3.setAttribute("title", "Click to UnFollow");
              // these will all be unfollow buttons, because
              // we are following everybody on this page
              link3.classList.add("not-liked");
              link3.appendChild(whiteHeart);
              data.setAttribute(
                "data-id_to_types",
                JSON.stringify(idToTypes)
              );
              data.setAttribute(
                "data-type_to_ids",
                JSON.stringify(typeToIds)
              );
              link3.addEventListener("click", followOrUnFollowButton);
              followerBrick.classList.remove("missing-follows-info");
              setTimeout(finished, 40);
            } else {
              // we have more blogs to check
              setTimeout(
                function () {
                  stopToFindMutuals(
                    (me + 1), them, url, key, link3, followerBrick, finished
                  );
                }, 40
              );
            }
          }
        }
      }
    );
  };
  // this ^ checks if blogs you follow, follow back

  // this v makes the snapshot saves to a theme page
  var makeSnap = function (cat) {
    var href = document.location.href.split(/[\/\?&#=]+/g);
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var fblg = JSON.parse(
      data.getAttribute("data-follow-blogs-all")
    );
    var mblg = JSON.parse(
      data.getAttribute("data-missing-blogs-all")
    );
    var nblg = JSON.parse(
      data.getAttribute("data-new-blogs-all")
    );
    var fblgTimestamp = JSON.parse(
      data.getAttribute("data-follow-blogs-all-updated")
    );
    var mblgTimestamp = JSON.parse(
      data.getAttribute("data-missing-blogs-all-updated")
    );
    var nblgTimestamp = JSON.parse(
      data.getAttribute("data-new-blogs-all-updated")
    );
    if (nblgTimestamp === 0) {
      nblgTimestamp = (new Date()).getTime();
    }
    if (mblgTimestamp === 0) {
      mblgTimestamp = (new Date()).getTime();
    }
    if (fblgTimestamp === 0) {
      fblgTimestamp = (new Date()).getTime();
    }
    var body = {
      "missing": mblg,
      "new": nblg,
      "all": fblg,
      "all-ch" : fblgTimestamp, // followers
      "new-ch" : nblgTimestamp, // new followers
      "missing-ch" : mblgTimestamp // missing followers
    };
    getResponseText( // this is SnapShot thing step #1
      "/customize/" + href[4],
      function(re2) {
        var div = document.createElement("div");
        div.innerHTML = re2. // parse the dom
        replace(/<(\/?)script[^>]*>/g, "<$1flurb>"). // no eval
        replace(/<img/g,"<space"); // do not onload img tags
        var flurb = div.getElementsByTagName("flurb");
        var userFormKey = false;
        var secureFormKey = false;
        var i;
        var reg1 = /Tumblr._init.user_form_key\s?=\s?['"]([^'"]+)['"]/;
        var reg2 = /Tumblr._init.secure_form_key\s?=\s?['"]([^'"]+)['"]/;
        for (i = 0; i < flurb.length; i++) {
          if (flurb[i].innerHTML.match(reg1) !== null) {
            userFormKey = flurb[i].innerHTML.match(reg1)[1];
          }
          if (flurb[i].innerHTML.match(reg2) !== null) {
            secureFormKey = flurb[i].innerHTML.match(reg2)[1];
          }
        }
        if (secureFormKey === false || userFormKey === false) {
          return;
        }
        var dogTreat = {
          "type": "custom_layout",
          "request_uri": "/mass-post-editor-snapshot-" + cat + "-data",
          "native_uri": false,
          "label": "",
          "show_link": false,
          "title": "",
          "body": JSON.stringify(body),
          "redirect_to": "",
          "user_form_key": userFormKey, // kittens
          "secure_form_key": secureFormKey // puppies
        };
        getResponseText(
          { // this is SnapShot thing step #2
            url: "/customize_api/blog/" + href[4] + "/pages",
            post: JSON.stringify(dogTreat)
          },
          function(re3) {
            // success
          },
          [ // the prev request brought us some puppies :)
            ["X-Requested-With", "XMLHttpRequest"],
            ["Content-Type", "application/json"],
            ["Accept", "application/json, text/javascript, */*; q=0.01"]
          ]
        );
      },
      [
        ["X-Requested-With", "XMLHttpRequest"]
      ]
    );
  };
  // this ^ makes a snapshot

  // this v reads the snapshot saves of a theme page
  var readSnap = function (cat, old) {
    var href = document.location.href.split(/[\/\?&#=]+/g);
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var fblg = JSON.parse(
      data.getAttribute("data-follow-blogs-all")
    );
    var mblg = JSON.parse(
      data.getAttribute("data-missing-blogs-all")
    );
    var nblg = JSON.parse(
      data.getAttribute("data-new-blogs-all")
    );
    var fblgTimestamp = JSON.parse(
      data.getAttribute("data-follow-blogs-all-updated")
    );
    var mblgTimestamp = JSON.parse(
      data.getAttribute("data-missing-blogs-all-updated")
    );
    var nblgTimestamp = JSON.parse(
      data.getAttribute("data-new-blogs-all-updated")
    );
    var snapBody = document.getElementById("snapshot-info_body");
    var bodyNew = {
      "missing": mblg,
      "new": nblg,
      "all": fblg,
      "all-ch" : fblgTimestamp, // followers
      "new-ch" : nblgTimestamp, // new followers
      "missing-ch" : mblgTimestamp // missing followers
    };
    getResponseText(
      {
        url: "/customize_api/blog/" + href[4] + "/pages",
        post:
          "method=read&uri=/mass-post-editor-snapshot-" +
          cat + "-data"
      },
      function (re) {
        if (re === 400) {
          var h2 = document.createElement("h2");
          h2.appendChild(
            document.createTextNode(
              "There is no recorded snapshot prior, " +
              "but one was just now made for future."
            )
          );
          snapBody.appendChild(h2);
          // normally data changes would go here,
          // but there is no old data to compare to
          if (!old) {
            makeSnap(cat);
          }
          // ^ blank new snapshot
        } else if (typeof re === "string") {
          var bodyOld = JSON.parse(JSON.parse(re).body);
          // 1 parse for object, +1 parse for its property
          var i;
          var blog;
          if (!old) {
            // first find new followers
            for (i = 0; i < bodyNew.all.length; i++) {
              blog = bodyNew.all[i];
              if (bodyOld.all.indexOf(blog) === -1) {
                bodyNew.new.push(blog);
              }
            }
            // then find missing followers
            for (i = 0; i < bodyOld.all.length; i++) {
              blog = bodyOld.all[i];
              if (bodyNew.all.indexOf(blog) === -1) {
                bodyNew.missing.push(blog);
              }
            }
            // now mind the new timestamps if any
            if (bodyNew.new.length > 0) {
              nblgTimestamp = (new Date).getTime(); // new
              fblgTimestamp = (new Date).getTime(); // all
            }
            if (bodyNew.missing.length > 0) {
              mblgTimestamp = (new Date).getTime(); // missing
              fblgTimestamp = (new Date).getTime(); // all
            }
          // tally the old with the new for record purposes
            for (i = 0; i < bodyNew.new.length; i++) {
              blog = bodyNew.new[i];
              if (bodyOld.new.indexOf(blog) === -1) {
                bodyOld.new.push(blog);
              }
            }
            for (i = 0; i < bodyNew.missing.length; i++) {
              blog = bodyNew.missing[i];
              if (bodyOld.missing.indexOf(blog) === -1) {
                bodyOld.missing.push(blog);
              }
            }
          }
          // sit down and show the results
          var snapCell1 = document.createElement("div");
          var snapCell2 = document.createElement("div");
          snapCell1.id = "missing-blogs";
          snapCell2.id = "new-blogs";
          var title1 = document.createElement("h2");
          var title2 = document.createElement("h2");
          title1.appendChild(
            document.createTextNode(
              "Missing Blogs"
            )
          );
          title2.appendChild(
            document.createTextNode(
              "New Blogs"
            )
          );
          snapBody.appendChild(title1);
          snapBody.appendChild(title2);
          // I'm running out of dexterity for making variable names
          var toTheBuns = function () {
            data.setAttribute(
              this.getAttribute("data-representing"),
              JSON.stringify([]) // this clears only
            );
            var a = document.getElementById(
              this.getAttribute("data-links-id")
            ).children;
            while (a.length > 0) {
              a[0].parentNode.removeChild(a[0]);
            }
            // "this parent node remove child this" :)
            this.parentNode.removeChild(this);
            // ^ what I said to my parents when I realized the
            // meaning of life is only a constructed meaning....
            makeSnap(cat);
          };
          var a;
          var leftBuns = butt("Forget1");
          leftBuns.setAttribute(
            "title",
            "Forget/Clear missing blogs from database."
          );
          leftBuns.setAttribute(
            "data-representing",
            "data-missing-blogs-all"
          );
          leftBuns.setAttribute(
            "data-links-id",
            "missing-blogs"
          );
          leftBuns.addEventListener("click", toTheBuns);
          var rightBuns = butt("Forget2");
          rightBuns.setAttribute(
            "title",
            "Forget/Clear new blogs from database."
          );
          rightBuns.setAttribute(
            "data-representing",
            "data-new-blogs-all"
          );
          rightBuns.setAttribute(
            "data-links-id",
            "new-blogs"
          );
          rightBuns.addEventListener("click", toTheBuns);
          for (i = 0; i < bodyOld.new.length; i++) {
            a = document.createElement("a");
            a.href = "https://www.tumblr.com/dashboard/blog/" + bodyOld.new[i];
            a.appendChild(
              document.createTextNode(
                bodyOld.new[i]
              )
            );
            a.target = "_blank";
            a.setAttribute(
              "title",
              bodyOld.new[i] + " is a new blag :)"
            );
            snapCell2.appendChild(a);
          }
          for (i = 0; i < bodyOld.missing.length; i++) {
            a = document.createElement("a");
            a.href = "https://" + bodyOld.missing[i] + ".tumblr.com/";
            a.appendChild(
              document.createTextNode(
                bodyOld.missing[i]
              )
            );
            a.target = "_blank";
            a.setAttribute(
              "title",
              bodyOld.missing[i] + " is missing, but mayhaps changed their name"
            );
            snapCell1.appendChild(a);
          }
          snapBody.appendChild(snapCell1);
          snapBody.appendChild(snapCell2);
          // but only if there is any news when compared to the past
          if (bodyOld.missing.length > 0 && !old) {
            snapBody.appendChild(leftBuns);
          }
          if (bodyOld.new.length > 0 && !old) {
            snapBody.appendChild(rightBuns);
          }
          if (!old) {
            data.setAttribute(
              "data-follow-blogs-all",
              JSON.stringify(bodyNew.all) // this adds or subtracts
            );
            data.setAttribute(
              "data-new-blogs-all",
              JSON.stringify(bodyOld.new) // this adds only
            );
            data.setAttribute(
              "data-missing-blogs-all",
              JSON.stringify(bodyOld.missing) // this adds only
            );
            data.setAttribute(
              "data-follow-blogs-all-updated",
              JSON.stringify(fblgTimestamp)
            );
            data.setAttribute(
              "data-new-blogs-all-updated",
              JSON.stringify(nblgTimestamp)
            );
            data.setAttribute(
              "data-missing-blogs-all-updated",
              JSON.stringify(mblgTimestamp)
            );
            // all this ^ data
            // goes v into this database
            makeSnap(cat);
          }
        }
      },
      [
        ["Accept", "application/json, text/javascript, */*; q=0.01"],
        ["X-Requested-With", "XMLHttpRequest"],
        ["Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"]
      ]
    );
  };
  // this ^ reads the snapshot saves of a theme page

  // this processes the snapshots
  var snapShotFollowers = function (cat) {
    if (document.getElementsByClassName("im-ready").length === 0) {
      if (document.getElementById("snapshot-info") !== null) {
        document.getElementById(
          "snapshot-info"
        ).parentNode.classList.add("im-ready");
        document.getElementById(
          "snapshot-load-gif"
        ).parentNode.removeChild(
          document.getElementById(
            "snapshot-load-gif"
          )
        );
      }
      document.getElementById("snapshot-info_body").innerHTML = "";
      readSnap(cat, false);
    }
  };
  var snapInfoGo = true;
  // this ^ runs on the follows/followers page only

  // this v also only runs on the follows/followers page
  var loadFollowers = function(nextHref) {
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var href = document.location.href.split(/[\/\?&#=]+/g);
    var unstableOffset = data.getAttribute("data-unstable-next-href");
    if (
      href[5] === "follows" &&
      unstableOffset !== "0" &&
      typeof nextHref !== "undefined" &&
      nextHref.match(/offset=\d+/) !== null
    ) {
      nextHref = nextHref.replace(/offset=\d+/, function (m) {
        return "offset=" +
          (
            parseInt(m.replace(/\D+/g,"")) +
          parseInt(unstableOffset)
        );
      });
    }
    if (document.getElementById("followers-css") === null) {
      var flrCss = document.createElement("style");
      flrCss.type = "text/css";
      flrCss.id = "followers-css";
      flrCss.appendChild(
        document.createTextNode(
          (function () {/*
#select-by_widget {
  height: 190px;
}
*/}).toString().slice(16, -3))
      );
      document.head.appendChild(flrCss);
      var npfrag = document.createDocumentFragment();
      npfrag.appendChild(
        svgForType.happy.cloneNode(true)
      );
      npfrag.appendChild(
        document.createTextNode("Name Drop")
      );
      var nameDrop_chrome = newChromeButton("namedrop", npfrag, false);
      nameDrop_chrome.setAttribute(
        "title",
        "Give a shout out to your (selected) closest " +
        "followers, to show your love. <3"
      );
      nameDrop_chrome.
      getElementsByTagName("button")[0].
      addEventListener("click", newPostNameDrop);
      nameDrop_chrome.
      getElementsByTagName("button")[0].
      classList.add("disable-when-none-selected");
      nameDrop_chrome.
      getElementsByTagName("button")[0].disabled = true;
      en.appendChild(nameDrop_chrome);
      var uffrag = document.createDocumentFragment();
      uffrag.appendChild(
        svgForType.sad.cloneNode(true)
      );
      var unfollowSpan = document.createElement("span");
      unfollowSpan.appendChild(
        document.createTextNode("Unfollow")
      );
      uffrag.appendChild(
        unfollowSpan
      );
      var unfollow_chrome = newChromeButton("unfollow", uffrag, false);
      unfollow_chrome.setAttribute(
        "title",
        "Unfollow :("
      );
      unfollow_chrome.
      getElementsByTagName("button")[0].
      addEventListener("click", followOrUnfollowSelected);
      unfollow_chrome.
      getElementsByTagName("button")[0].
      classList.add("disable-when-none-selected");
      unfollow_chrome.
      getElementsByTagName("button")[0].disabled = true;
      en.appendChild(unfollow_chrome);
      var snapshotInfo_frag = document.createDocumentFragment();
      snapshotInfo_frag.appendChild(svgForType.image.cloneNode(true));
      snapshotInfo_frag.appendChild(
        document.createTextNode(
          "Snapshot Info"
        )
      );
      var snapshotInfo_chrome = newChromeButton(
        "snapshot-info", snapshotInfo_frag, true
      );
      var snapshotInfo_widget = snapshotInfo_chrome.
      getElementsByClassName("widget")[0];
      var snapshotInfo_input = snapshotInfo_chrome.
      getElementsByTagName("input")[0];
      snapshotInfo_widget.style.top = "50px";
      snapshotInfo_widget.style.right = "90px";
      var snapshotInfo_body = document.createElement("div");
      snapshotInfo_body.id = "snapshot-info_body";
      var snapshot_h2 = document.createElement("h1"); // I changes the nodeName
      snapshot_h2.appendChild(
        document.createTextNode(
          "Snapshot Info"
        )
      );
      var snapShotLoadGif = new Image();
      snapShotLoadGif.src = "https://assets.tumblr.com/images/loading_ddd.gif";
      var snapshotInfo_info = document.createElement("div");
      snapshotInfo_info.id = "snapshot-load-gif";
      snapshot_h2.appendChild(snapShotLoadGif);
      snapshotInfo_body.appendChild(snapshot_h2);
      snapshotInfo_info.appendChild(
        document.createTextNode("loading...")
      );
      snapshotInfo_info.setAttribute(
        "title",
        "This feature is might not be possible for super huge blog lists."
      );
      snapshotInfo_body.appendChild(snapshotInfo_info);
      snapshotInfo_widget.appendChild(snapshotInfo_body);
      snapshotInfo_chrome.setAttribute(
        "title",
        "SnapShot Options"
      );
      en.appendChild(snapshotInfo_chrome);
      readSnap(href[5], true);
    }
    var idsAllArr = JSON.parse(
      data.getAttribute("data-ids_all_arr")
    );
    var typesAllArr = JSON.parse(
      data.getAttribute("data-types_all_arr")
    );
    var typeToIds = JSON.parse(
      data.getAttribute("data-type_to_ids")
    );
    var idToTypes = JSON.parse(
      data.getAttribute("data-id_to_types")
    );
    var tblg = JSON.parse(
      data.getAttribute("data-tumblelogs")
    );
    var fblg = JSON.parse(
      data.getAttribute("data-follow-blogs-all")
    );
    if (typeof typeToIds["friendly"] === "undefined") {
      typeToIds["friendly"] = [];
    }
    if (typeof typeToIds["mutual"] === "undefined") {
      typeToIds["mutual"] = [];
    }
    if (typeof typeToIds["secondary"] === "undefined") {
      typeToIds["secondary"] = [];
    }
    if (typesAllArr.indexOf("mutual") === -1) {
      typesAllArr.push("mutual");
    }
    if (typesAllArr.indexOf("friendly") === -1) {
      typesAllArr.push("friendly");
    }
    if (
      typesAllArr.indexOf("secondary") === -1 &&
      href[5] === "follows"
    ) {
      typesAllArr.push("secondary");
    }
    var ritpm = document.getElementsByClassName(
      "remove-in-third-party-mode"
    );
    while (ritpm.length > 0) {
      ritpm[0].parentNode.removeChild(ritpm[0]);
    }
    var csrfToken = data.getAttribute("data-csrf-token");
    var token = data.getAttribute("data-api-token");
    var apiKey = data.getAttribute("data-x-tumblr-form-key");
    var hasPrimary = JSON.parse(
      data.getAttribute("data-primary-known")
    );
    var followersLoading = JSON.parse(
      data.getAttribute("data-followers-loading")
    );
    if ( // this was firing twice, because I have to
      // check for two x headers twice...
      followersLoading
    ) {
      return;
    }
    if (token === "0" || !hasPrimary) {
      return;
    }
    data.setAttribute("data-followers-loading", "true");
    var primary = data.getAttribute("data-primary-blog");
    var isFollowersPage = href[5] === "followers";
    var isFollowsPage = href[5] === "follows";
    data.classList.add("fetching-from-tumblr-api");
    var mo = [
      "Jan ", "Feb ", "Mar ", "Apr ",
      "May ", "Jun ", "Jul ", "Aug ",
      "Sep ", "Oct ", "Nov ", "Dec "
    ];
    getResponseText(
      typeof nextHref !== "undefined" ?
      "/api" + nextHref :
      isFollowersPage ?
      "/api/v2/blog/" + name + "/followers?limit=50" :
      isFollowsPage ?
      "/api/v2/blog/" + primary + "/following?limit=5" :
      "/api/v2/blog/" + name + "/following?limit=5"
      ,
      function (re) {
        data.classList.remove("fetching-from-tumblr-api");
        var api = re;
        var ing = isFollowsPage;
        if(
         typeof api === "string"
        ) {
          api = JSON.parse(re);
        }
        if(
          !ing &&
          typeof api !== "undefined" &&
          typeof api.response !== "undefined" &&
          typeof api.response.users !== "undefined" ||
          ing &&
          typeof api !== "undefined" &&
          typeof api.response !== "undefined" &&
          typeof api.response.blogs !== "undefined"
        ) {
          if (!lcontent.classList.contains("albino")) {
            lcontent.classList.add("albino");
          }// this ^ is to clear away the vanilla editor posts,
          // which do not have our extra buttons,
          // but it seems to run on my other things too :/ oops
          if (lcontent.children.length === 0) {
            var followerHeader = document.createElement("div");
            var dt = (new Date());
            followerHeader.id = "who-follows-who";
            dt.setYear(dt.getFullYear() + 1);
            if (isFollowersPage) {
              followerHeader.classList.add("heading");
              followerHeader.appendChild(
                document.createTextNode(
                  "Blogs following your blogs, \u201C" + name + "\u201D"
                )
              );
              followerHeader.setAttribute("data-timestamp", dt.getTime());
              lcontent.appendChild(followerHeader);
            }
            if (!isFollowersPage) {
              followerHeader.classList.add("heading");
              followerHeader.appendChild(
                document.createTextNode(
                  "Blogs followed by your primary, \u201C" + primary + "\u201D"
                )
              );
              followerHeader.setAttribute("data-timestamp", dt.getTime());
              lcontent.appendChild(followerHeader);
            }
          }
          var user = ing ? api.response.blogs : api.response.users;
          var followerBrick;
          var firstChild;
          var cm;
          var nm;
          var nc;
          var tc;
          var middleChild;
          var middleChildT;
          var middleChildTR;
          var middleChildTD;
          var middleChildIB;
          var lastChild;
          var avatar;
          var date;
          var px;
          var b;
          var d;
          var date;
          var jz;
          var dt;
          var nextPage;
          var groupName;
          var group;
          var hding = document.getElementsByClassName("heading");
          var dt1 = new Date();
          var dt2 = new Date();
          var link1;
          var link2;
          var link3;
          var link4;
          var whiteHeart;
          var key;
          var uuid;
          var url;
          var descript;
          var title;
          var theme;
          var cancelProp = function (e){
            e.cancelBubble = true;
            e.stopProgagation();
          };
          for (var i = 0; i < user.length; i++) {
            dt1 = new Date(
              parseInt(hding[hding.length-1].getAttribute("data-timestamp"))
            );
            dt2 = new Date(
              ing ?
              user[i].resources[0].updated * 1000 :
              user[i].blog.updated * 1000
            );
            groupName = dt2.getFullYear() === (new Date()).getFullYear() ?
              "group_" + dt2.getMonth() + "_" + dt2.getFullYear() :
              "group_yesterdays_" + dt2.getFullYear()
            ;
            group = document.getElementsByClassName(groupName);
            followerBrick = document.createElement("a");
            followerBrick.classList.add(groupName);
            if (
              group.length === 0 &&
              (
                dt2.getFullYear() === (new Date()).getFullYear() &&
                (
                  dt2.getMonth() !== dt1.getMonth() ||
                  dt2.getFullYear() !== dt1.getFullYear()
                ) || dt2.getFullYear() !== dt1.getFullYear()
              )
            ) {
              followerHeader = document.createElement("div");
              followerHeader.classList.add("heading");
              followerHeader.appendChild(
                document.createTextNode(
                  dt2.getFullYear() === (new Date()).getFullYear() ?
                  "updated in " + mo[dt2.getMonth()] + dt2.getFullYear() :
                  "updated in " + dt2.getFullYear()
                )
              );
              followerHeader.setAttribute("data-timestamp", dt2.getTime());
              lcontent.appendChild(followerHeader);
            }
            followerBrick.style.width = "125px";
            followerBrick.style.height = "125px";
            followerBrick.classList.add("brick");
            followerBrick.classList.add("follow");
            followerBrick.classList.add("photo");
            followerBrick.addEventListener("click", function (e) {
              e.stopPropagation();
              e.preventDefault();
              e.cancelBubble = true;
              highlightBrick(this, !this.classList.contains("highlighted"));
            });
            key = ing ? user[i].resources[0].key : user[i].blog.key;
            uuid = ing ? user[i].resources[0].uuid : user[i].blog.uuid;
            url = ing ? user[i].resources[0].url : user[i].blog.url;
            title = ing ? user[i].resources[0].title : user[i].blog.title;
            descript = ing ?
			  user[i].resources[0].description : user[i].blog.description;
            theme = ing ? user[i].resources[0].theme : user[i].blog.theme;
            followerBrick.id = "post_" + key;
            followerBrick.setAttribute("target", "_blank");
            followerBrick.setAttribute("data-id", key);
            followerBrick.setAttribute("data-follower-key", key);
            followerBrick.setAttribute("data-follower-uuid", uuid);
            firstChild = document.createElement("div");
            firstChild.classList.add("highlight");
            cm = new Image();
            cm.src = "https://assets.tumblr.com/images/" +
                     "small_white_checkmark.png";
            cm.classList.add("checkmark");
            nm = ing ? user[i].resources[0].name : user[i].name;
            fblg.push(nm); // <= this array is for the snapshot later
            followerBrick.setAttribute("title", nm);
            followerBrick.setAttribute("href", url);
            idsAllArr.push(key);
            firstChild.appendChild(cm);
            tc = document.createElement("div");
            tc.classList.add("tag_count");
            tc.id = "tag_count_" + key;
            tc.appendChild(document.createTextNode(nm));
            firstChild.appendChild(tc);
            nc = document.createElement("div");
            nc.classList.add("note_count");
            firstChild.appendChild(nc);
            followerBrick.appendChild(firstChild);
            // meat & tators middle child (repeat)
            middleChild = document.createElement("div");
            middleChildT = document.createElement("div");
            middleChildTR = document.createElement("div");
            middleChildTD = document.createElement("div");
            middleChildIB = document.createElement("div");
            middleChild.classList.add("overflow-hidden");
            middleChildT.classList.add("links-layer");
            middleChildTR.classList.add("trow");
            middleChildTD.classList.add("tags-layer");
            middleChildIB.classList.add("tag-container");
            middleChildIB.innerHTML = "<h2>" + title + "</h2>" +
                                              descript;
            avatar = new Image();
            avatar.setAttribute("crossorigin", "anonymous");
            avatar.width = 125;
            avatar.height = 125;
            avatar.style.width = avatar.width + "px";
            avatar.style.height = avatar.height + "px";
            followerBrick.setAttribute("data-name", nm);
            avatar.src = "https://api.tumblr.com/v2/blog/" + nm + "/avatar/128";
            avatar.classList.add("follower-avatar");
            // some followers links
            link1 = document.createElement("a");
            link1.setAttribute("target", "_blank");
            link1.classList.add("link-edit");
            link1.href = "/dashboard/blog/" + nm;
            link1.setAttribute("title", "Peepr.");
            link1.appendChild(svgForType.view.cloneNode(true));
            link1.addEventListener("click", cancelProp);
            middleChildTD.appendChild(link1);
            link4= document.createElement("a");
            link4.setAttribute("target", "_blank");
            link4.classList.add("link-reblog");
            link4.href = "/dashboard/blog/" + nm + "#avatar";
            link4.setAttribute("title", "Large Avatar.");
            link4.setAttribute("data-name", nm);
            link4.setAttribute(
              "data-font", theme.title_font
            );
            link4.setAttribute(
              "data-weight", theme.title_font_weight
            );
            link4.setAttribute(
              "data-color", theme.title_color
            );
            link4.setAttribute(
              "data-bg", theme.background_color
            );
            link4.setAttribute(
              "data-title", title
            );
            link4.appendChild(svgForType.see.cloneNode(true));
            link4.addEventListener("click", function (e) {
              e.preventDefault();
              e.stopPropagation();
              e.cancelBubble = true;
              var popoverT = document.createElement("div");
              popoverT.addEventListener("click", function() {
                this.parentNode.removeChild(this);
              });
              popoverT.classList.add("follower-pop-t");
              var popoverTR = document.createElement("div");
              popoverTR.classList.add("follower-pop-tr");
              var popoverTD = document.createElement("div");
              popoverTD.classList.add("follower-pop-td");
              var popoverAv = document.createElement("div");
              popoverAv.classList.add("follower-pop-av");
              var popoverInner = document.createElement("div");
              popoverInner.classList.add("follower-pop-inner");
              var popoverImg = new Image();
              popoverImg.classList.add("follower-pop-img");
              popoverImg.src = "https://api.tumblr.com/v2/blog/" +
                               this.getAttribute("data-name") +
                               "/avatar/512";
              var popoverTitle = document.createElement("h1");
              popoverTitle.style.fontFamily = this.getAttribute("data-font");
              popoverTitle.style.color = this.getAttribute("data-color");
              popoverInner.style.backgroundColor = this.getAttribute("data-bg");
              popoverTitle.classList.add("follower-pop-title");
              popoverTitle.innerHTML = this.getAttribute("data-title");
              popoverAv.appendChild(popoverImg);
              popoverInner.appendChild(popoverAv);
              popoverInner.appendChild(popoverTitle);
              popoverTD.appendChild(popoverInner);
              popoverTR.appendChild(popoverTD);
              popoverT.appendChild(popoverTR);
              document.body.appendChild(popoverT);
            });
            // this ^ is neat. I'm proud of this ^ :)
            middleChildTD.appendChild(link4);
            link2 = document.createElement("a");
            link2.setAttribute("target", "_blank");
            link2.classList.add("link-view");
            link2.setAttribute("title", "Visit.");
            link2.appendChild(svgForType.symlink.cloneNode(true));
            link2.addEventListener("click", cancelProp);
            middleChildTD.appendChild(link2);
            link3 = document.createElement("a");
            link3.setAttribute("target", "_blank");
            link3.classList.add("link-like");
            link3.setAttribute("data-id", key);
            link3.setAttribute(
              "data-like-info", "data[tumblelog]=" + nm
            );
            link3.id = "follow_heart_" + key;
            link3.setAttribute("target", "_blank");
            // link3: start of the giant link3 follow button
            if (href[5] === "followers") {
              if (
                typeof user[i].following !== "undefined" &&
                user[i].following
              ) { // this only runs on ?followers...
                // it is absent on the ?follows (api/following)
                followerBrick.classList.add("following");
                // so if you follow, it's auto-mutuals
                typeToIds["mutual"].push(key);
                followerBrick.classList.add("mutual");
                idToTypes[key] = "mutual";
                whiteHeart = svgForType.liked.cloneNode(true);
                whiteHeart.setAttribute("fill", "#56f");
                link3.href = url + "#unfollow:" + nm;
                link3.setAttribute("title", "(Mutual) Click to UnFollow");
                link3.classList.add("liked");
                link3.appendChild(whiteHeart);
              } else if (
                typeof user[i].following !== "undefined" &&
                !user[i].following
              ) {
                typeToIds["friendly"].push(key);
                idToTypes[key] = "friendly";
                followerBrick.classList.add("unfollowed");
                whiteHeart = svgForType.notes.cloneNode(true);
                whiteHeart.setAttribute("fill", "#fff");
                link3.href = url + "#follow:" + nm;
                link3.setAttribute("title", "Click to Follow");
                link3.classList.add("not-liked");
                link3.appendChild(whiteHeart);
              }
              link3.addEventListener("click", followOrUnFollowButton);
            } else {
              followerBrick.classList.add("missing-follows-info");
            }
            // end 1 of link3 ^ giant follow button, but there is more of it
            // to be added below/later for the ?follows api/following part
            // because Tumblr doesn't include a property for follows/mutuals
            middleChildTD.appendChild(link3);
            // end followersBricks links... Woot! finally
            middleChild.appendChild(avatar);
            middleChildTD.appendChild(middleChildIB)
            middleChildTR.appendChild(middleChildTD);
            middleChildT.appendChild(middleChildTR)
            middleChild.appendChild(middleChildT);
            followerBrick.appendChild(middleChild);// < don't forget KEVIN!
            // close off the brick and return below     (home alone)
            lastChild = document.createElement("div");
            lastChild.classList.add("overlay");
            jz = document.createElement("div");
            jz.classList.add("inner");
            dt = document.createElement("div");
            d = new Date(
              ing ?
              user[i].resources[0].updated * 1000 :
              user[i].blog.updated * 1000
            );
            b = d.getDate();
            px = ["th ", "st ", "nd ", "rd ", "th ", "th ",
                      "th ", "th ", "th ", "th ", "th "][b % 10];
            if (b === 12 || b === 11) {
              px = "th ";
            }
            date = [
              "Sun - ", "Mon - ", "Tue - ", "Wed - ",
              "Thu - ", "Fri - ", "Sat - "
            ][d.getDay()] + mo[d.getMonth()] + b + px + d.getFullYear();
            dt.classList.add("date");
            dt.appendChild(document.createTextNode(date));
            jz.appendChild(dt);
            lastChild.appendChild(jz);
            followerBrick.appendChild(lastChild);
            if (group.length > 0) {
              lcontent.insertBefore(
                followerBrick, group[group.length-1].nextSibling
              );
            } else {
              lcontent.appendChild(followerBrick);
            }
          }
          data.setAttribute(
            "data-id_to_types",
            JSON.stringify(idToTypes)
          );
          data.setAttribute(
            "data-type_to_ids",
            JSON.stringify(typeToIds)
          );
          data.setAttribute(
            "data-types_all_arr",
            JSON.stringify(typesAllArr)
          );
          data.setAttribute(
            "data-ids_all_arr",
            JSON.stringify(idsAllArr)
          );
          data.setAttribute(
            "data-follow-blogs-all",
            JSON.stringify(fblg)
          );
          data.setAttribute("data-unstable-next-href", "0");
          pluginBuildColumns();
          nextPage = false; // maybe? find out later...
          data.setAttribute("data-id_to_types", JSON.stringify(idToTypes));
          data.setAttribute("data-type_to_ids", JSON.stringify(typeToIds));
          data.setAttribute("data-types_all_arr", JSON.stringify(typesAllArr));
          var repeatedTimeOut2;
          var nextPageOfFollowers = function() {
            data.setAttribute("data-page-repeat", nextPage); // loop much?
            // this delays pagination slightly, but it may be better...
            // it's steadier, non-bot-ish, and is easier to process :)
            var tagAlongDiff = document.getElementsByClassName("brick").length -
                document.getElementsByClassName("laid").length;
            if(
              document.getElementById(
                "pause_button"
              ).classList.contains("paused") ||
              tagAlongDiff > 10 // < this :)
            ) {// the CSS3 animation thing is also crash prevention :)
              return;
            }
            clearInterval(repeatedTimeOut2);
            data.setAttribute("data-followers-loading", "false");
            loadFollowers(nextPage);
          };
          var pauseBeforeNext = function() {
            // f stands for first followed
            var fBrick = document.getElementsByClassName(
              "missing-follows-info"
            );
            if (
              typeof fBrick !== "undefined" &&
              fBrick.length > 0
            ) {
              var fName = fBrick[0].getAttribute("data-name");
              var fKey = fBrick[0].getAttribute("data-follower-key");
              var fLink3 = document.getElementById(
                "follow_heart_" + fKey
              );
              var fUrl = fBrick[0].getAttribute("href");
              stopToFindMutuals(
                0 /* primary 1st and down the line */,
                fName,
                fUrl,
                fKey,
                fLink3,
                fBrick[0],
                pauseBeforeNext
              );
            } else if (!data.classList.contains("next_page_false")){
              // stop fetching mutual info and goto next page
              repeatedTimeOut2 = setInterval(nextPageOfFollowers, 500);
            }
          };
          if(
            typeof api !== "undefined" &&
            typeof api.response !== "undefined" &&
            typeof api.response._links !== "undefined" &&
            typeof api.response._links.next !== "undefined" &&
            typeof api.response._links.next.href !== "undefined"
          ) {
            nextPage = api.response._links.next.href;
            var fBrick = document.getElementsByClassName(
              "missing-follows-info"
            );
            if (
              (href[5] === "followers") &&
              nextPage !== false &&
              nextPage !== data.getAttribute("data-page-repeat")
            ) {
              // walk, don't run :)
              repeatedTimeOut2 = setInterval(nextPageOfFollowers, 500);
            } else if (
              href[5] === "follows" &&
              nextPage !== false &&
              nextPage !== data.getAttribute("data-page-repeat")
            ) {
              // this is unique, because if we unfollow any blogs
              // during pagination, we must step back the offset,
              // by -1, or else the blogs will be off by 1
              // &&
              // if we re-follow blog during pagination, we must
              // jostle back +1... it's very unstable, but solid
              data.setAttribute(
                "data-id_to_types",
                JSON.stringify(idToTypes)
              );
              data.setAttribute(
                "data-type_to_ids",
                JSON.stringify(typeToIds)
              );
              pauseBeforeNext();
            }
          } else {
            data.classList.add("next_page_false");
            if (
              href[5] === "follows" &&
              typeof fBrick !== "undefined" &&
              fBrick.length > 0
            ) {
              pauseBeforeNext();
            }
            snapShotFollowers(href[5]);
          }
        } else {
          snapShotFollowers(href[5]);
          // this ^ would run on an api fetch with 0 results
          data.classList.add("next_page_false");
          // but so far, that never happens...
        }
      },
      [
        ["Authorization", "Bearer " + token]
      ]
    );
  };
  // load followers ^ followers mode follow mode

  // load fans v
  var loadFans = function (notesList) {
    var firstRun = typeof notesList === "undefined";
    var href = document.location.href.split(/[\/\?&#=]+/g);
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var idsAllArr = JSON.parse(
      data.getAttribute("data-ids_all_arr")
    );
    var typesAllArr = JSON.parse(
      data.getAttribute("data-types_all_arr")
    );
    var typeToIds = JSON.parse(
      data.getAttribute("data-type_to_ids")
    );
    var idToTypes = JSON.parse(
      data.getAttribute("data-id_to_types")
    );
    if (typeof typeToIds["friendly"] === "undefined") {
      typeToIds["friendly"] = [];
    }
    if (typeof typeToIds["mutual"] === "undefined") {
      typeToIds["mutual"] = [];
    }
    if (typeof typeToIds["secondary"] === "undefined") {
      typeToIds["secondary"] = [];
    }
    var token = data.getAttribute("data-api-token");
    getResponseText(
      firstRun?
      "/activity/" + name :
      "/activity/" + notesList.channel + // name
      "/2/" + notesList.first +
      "?last_timestamp=" + notesList.last +
      "&c=" + notesList.c,
      function (re) {
        if (!firstRun) {
          re = JSON.parse(re).html;
        }
        var div = document.createElement("div");
        div.innerHTML = re. // parse the dom
        replace(/<(\/?)script[^>]*>/g, "<$1flurb>"). // no eval
        replace(/<img/g,"<space"); // do not onload img tags
        var flurb = div.getElementsByTagName("flurb");
        var notesListReg = /Tumblr\.NotesList\((\{[\s\S]*?\})\);/;
        var notesList = {}; // reset
        var i;
        for (i = 0; i < flurb.length; i++) {
          if (flurb[i].innerText.match(notesListReg) !== null) {
            eval("notesList = " + flurb[i].innerText.match(notesListReg)[1]);
            // eval('JSON.stringify...')... {bad: 'structure'}...
          }
        }
        var an = div.getElementsByClassName("activity-notification");
        var isFollower = an[0].classList.contains("is_follower");
        var isLike = an[0].classList.contains("is_like");
        var isReblog = an[0].classList.contains("is_reblog");
        var loopFirstBrick = function (an0) {
          var anName = an0.getElementsByClassName(
            "ui_avatar_tumblelog_name"
          )[0].innerText.replace(/\s+/g,"");
          var fanBrick = document.getElementById("post_" + anName);
          if (fanBrick === null) {
            // create fan brick
            getResponseText(
              "/api/v2/blog/" + anName + "/info",
              function (re2) {
                var api = JSON.parse(re2)
                if (
                  typeof api !== "undefined" &&
                  typeof api.response !== "undefined" &&
                  typeof api.response.blog !== "undefined"
                ) {// ...---***---... LOAD FANS ...---***---...
                  // with much casual copy over from load fans
                  if (!lcontent.classList.contains("albino")) {
                    lcontent.classList.add("albino");
                  }
                  if (lcontent.children.length === 0) {
                    var fanHeader = document.createElement("div");
                    var dt = (new Date());
                    fanHeader.id = "who-follows-who";
                    dt.setYear(dt.getFullYear() + 1);
                    fanHeader.classList.add("heading");
                    fanHeader.appendChild(
                      document.createTextNode(
                        "Fans of \u201C" + name + "\u201D"
                      )
                    );
                    fanHeader.setAttribute("data-timestamp", dt.getTime());
                    lcontent.appendChild(fanHeader);
                  }
                  var isFollower = an0.classList.contains("is_follower");
                  var isLike = an0.classList.contains("is_like");
                  var isReblog = an0.classList.contains("is_note");
                  var mo = [
                    "Jan ", "Feb ", "Mar ", "Apr ",
                    "May ", "Jun ", "Jul ", "Aug ",
                    "Sep ", "Oct ", "Nov ", "Dec "
                  ];
                  var hding = document.getElementsByClassName("heading");
                  var blog = api.response.blog;
                  var dt1 = new Date(
                    parseInt(hding[hding.length-1].getAttribute("data-timestamp"))
                  );
                  var dt2 = new Date(blog.updated * 1000);
                  var groupName = dt2.getFullYear() === (new Date()).getFullYear() ?
                      "group_" + dt2.getMonth() + "_" + dt2.getFullYear() :
                  "group_yesterdays_" + dt2.getFullYear()
                  ;
                  var group = document.getElementsByClassName(groupName);
                  var fanBrick = document.createElement("a");
                  fanBrick.classList.add(groupName);
                  if (
                    group.length === 0 &&
                    (
                      dt2.getFullYear() === (new Date()).getFullYear() &&
                      (
                        dt2.getMonth() !== dt1.getMonth() ||
                        dt2.getFullYear() !== dt1.getFullYear()
                      ) || dt2.getFullYear() !== dt1.getFullYear()
                    )
                  ) {
                    var fanHeader = document.createElement("div");
                    fanHeader.classList.add("heading");
                    fanHeader.appendChild(
                      document.createTextNode(
                        dt2.getFullYear() === (new Date()).getFullYear() ?
                        "updated in " + mo[dt2.getMonth()] + dt2.getFullYear() :
                        "updated in " + dt2.getFullYear()
                      )
                    );
                    fanHeader.setAttribute("data-timestamp", dt2.getTime());
                    lcontent.appendChild(fanHeader);
                  }
                  fanBrick.style.width = "125px";
                  fanBrick.style.height = "125px";
                  fanBrick.classList.add("brick");
                  fanBrick.classList.add("follow");
                  fanBrick.classList.add("photo");
                  fanBrick.addEventListener("click", function (e) {
                    e.stopPropagation();
                    e.preventDefault();
                    e.cancelBubble = true;
                    highlightBrick(this, !this.classList.contains("highlighted"));
                  });
                  var nm = blog.name;
                  var key = blog.key;
                  var uuid = blog.uuid;
                  var url = blog.url;
                  var title = blog.title;
                  var descript = blog.description;
                  var theme = blog.theme;
                  fanBrick.id = "post_" + nm;
                  fanBrick.setAttribute("target", "_blank");
                  fanBrick.setAttribute("data-id", nm);
                  fanBrick.setAttribute("data-fan-key", key);
                  fanBrick.setAttribute("data-fan-uuid", uuid);
                  var firstChild = document.createElement("div");
                  firstChild.classList.add("highlight");
                  var cm = new Image();
                  cm.src = "https://assets.tumblr.com/images/" +
                    "small_white_checkmark.png";
                  cm.classList.add("checkmark");
                  fanBrick.setAttribute("title", nm);
                  fanBrick.setAttribute("href", url);
                  idsAllArr.push(key);
                  firstChild.appendChild(cm);
                  var tc = document.createElement("div");
                  tc.classList.add("tag_count");
                  tc.id = "tag_count_" + key;
                  tc.appendChild(document.createTextNode("0 Likes"));
                  firstChild.appendChild(tc);
                  var nc = document.createElement("div");
                  nc.classList.add("note_count");
                  firstChild.appendChild(nc);
                  nc.appendChild(document.createTextNode("0 Reblog"));
                  if (isReblog) {
                    nc.innerText = (parseInt(nc.innerText.replace(/\D+/g,"")) + 1) + " Notes";
                  }
                  if (isLike) {
                    tc.innerText = (parseInt(tc.innerText.replace(/\D+/g,"")) + 1) + " Likes";
                  }
                  fanBrick.appendChild(firstChild);
                  // meat & tators middle child (repeat)
                  var middleChild = document.createElement("div");
                  var middleChildT = document.createElement("div");
                  var middleChildTR = document.createElement("div");
                  var middleChildTD = document.createElement("div");
                  var middleChildIB = document.createElement("div");
                  middleChild.classList.add("overflow-hidden");
                  middleChildT.classList.add("links-layer");
                  middleChildTR.classList.add("trow");
                  middleChildTD.classList.add("tags-layer");
                  middleChildIB.classList.add("tag-container");
                  middleChildIB.innerHTML = "<h2>" + title + "</h2>" +
                    descript;
                  var avatar = new Image();
                  avatar.setAttribute("crossorigin", "anonymous");
                  avatar.width = 125;
                  avatar.height = 125;
                  avatar.style.width = avatar.width + "px";
                  avatar.style.height = avatar.height + "px";
                  fanBrick.setAttribute("data-name", nm);
                  avatar.src = "https://api.tumblr.com/v2/blog/" + nm + "/avatar/128";
                  avatar.classList.add("fan-avatar");
                  // some fans links
                  var cancelProp = function (e){
                    e.cancelBubble = true;
                    e.stopProgagation();
                  };
                  var link1 = document.createElement("a");
                  link1.setAttribute("target", "_blank");
                  link1.classList.add("link-edit");
                  link1.href = "/dashboard/blog/" + nm;
                  link1.setAttribute("title", "Peepr.");
                  link1.appendChild(svgForType.view.cloneNode(true));
                  link1.addEventListener("click", cancelProp);
                  middleChildTD.appendChild(link1);
                  var link4= document.createElement("a");
                  link4.setAttribute("target", "_blank");
                  link4.classList.add("link-reblog");
                  link4.href = "/dashboard/blog/" + nm + "#avatar";
                  link4.setAttribute("title", "Large Avatar.");
                  link4.setAttribute("data-name", nm);
                  link4.setAttribute(
                    "data-font", theme.title_font
                  );
                  link4.setAttribute(
                    "data-weight", theme.title_font_weight
                  );
                  link4.setAttribute(
                    "data-color", theme.title_color
                  );
                  link4.setAttribute(
                    "data-bg", theme.background_color
                  );
                  link4.setAttribute(
                    "data-title", title
                  );
                  link4.appendChild(svgForType.see.cloneNode(true));
                  link4.addEventListener("click", function (e) {
                    e.preventDefault();
                    e.stopPropagation();
                    e.cancelBubble = true;
                    var popoverT = document.createElement("div");
                    popoverT.addEventListener("click", function() {
                      this.parentNode.removeChild(this);
                    });
                    popoverT.classList.add("fan-pop-t");
                    var popoverTR = document.createElement("div");
                    popoverTR.classList.add("fan-pop-tr");
                    var popoverTD = document.createElement("div");
                    popoverTD.classList.add("fan-pop-td");
                    var popoverAv = document.createElement("div");
                    popoverAv.classList.add("fan-pop-av");
                    var popoverInner = document.createElement("div");
                    popoverInner.classList.add("fan-pop-inner");
                    var popoverImg = new Image();
                    popoverImg.classList.add("fan-pop-img");
                    popoverImg.src = "https://api.tumblr.com/v2/blog/" +
                      this.getAttribute("data-name") +
                      "/avatar/512";
                    var popoverTitle = document.createElement("h1");
                    popoverTitle.style.fontFamily = this.getAttribute("data-font");
                    popoverTitle.style.color = this.getAttribute("data-color");
                    popoverInner.style.backgroundColor = this.getAttribute("data-bg");
                    popoverTitle.classList.add("fan-pop-title");
                    popoverTitle.innerHTML = this.getAttribute("data-title");
                    popoverAv.appendChild(popoverImg);
                    popoverInner.appendChild(popoverAv);
                    popoverInner.appendChild(popoverTitle);
                    popoverTD.appendChild(popoverInner);
                    popoverTR.appendChild(popoverTD);
                    popoverT.appendChild(popoverTR);
                    document.body.appendChild(popoverT);
                  });
                  // this ^ is neat. I'm proud of this ^ :)
                  middleChildTD.appendChild(link4);
                  var link2 = document.createElement("a");
                  link2.setAttribute("target", "_blank");
                  link2.classList.add("link-view");
                  link2.setAttribute("title", "Visit.");
                  link2.appendChild(svgForType.symlink.cloneNode(true));
                  link2.addEventListener("click", cancelProp);
                  middleChildTD.appendChild(link2);
                  var link3 = document.createElement("a");
                  link3.setAttribute("target", "_blank");
                  link3.classList.add("link-like");
                  link3.setAttribute("data-id", key);
                  link3.setAttribute(
                    "data-like-info", "data[tumblelog]=" + nm
                  );
                  link3.id = "follow_heart_" + key;
                  link3.setAttribute("target", "_blank");
                  // link3: start of the giant link3 follow button
                  var whiteHeart;
                  if (
                    typeof blog.followed !== "undefined" &&
                    blog.followed
                  ) { // this only runs on ?fans...
                    fanBrick.classList.add("following");
                    // so if you follow, it's auto-mutual
                    typeToIds["mutual"].push(key);
                    fanBrick.classList.add("mutual");
                    idToTypes[key] = "mutual";
                    whiteHeart = svgForType.liked.cloneNode(true);
                    whiteHeart.setAttribute("fill", "#56f");
                    link3.href = url + "#unfollow:" + nm;
                    link3.setAttribute("title", "(Mutual) Click to UnFollow");
                    link3.classList.add("liked");
                    link3.appendChild(whiteHeart);
                  } else if (
                    typeof blog.followed !== "undefined" &&
                    !blog.followed
                  ) {
                    typeToIds["friendly"].push(key);
                    idToTypes[key] = "friendly";
                    fanBrick.classList.add("unfollowed");
                    whiteHeart = svgForType.notes.cloneNode(true);
                    whiteHeart.setAttribute("fill", "#fff");
                    link3.href = url + "#follow:" + nm;
                    link3.setAttribute("title", "Click to Follow");
                    link3.classList.add("not-liked");
                    link3.appendChild(whiteHeart);
                  }
                  link3.addEventListener("click", followOrUnFollowButton);
                  // end 1 of link3 ^ giant follow button, but there is more of it
                  // to be added below/later for the ?follows api/following part
                  // because Tumblr doesn't include a property for follows/mutuals
                  middleChildTD.appendChild(link3);
                  // end fansBricks links... Woot! finally
                  middleChild.appendChild(avatar);
                  middleChildTD.appendChild(middleChildIB)
                  middleChildTR.appendChild(middleChildTD);
                  middleChildT.appendChild(middleChildTR)
                  middleChild.appendChild(middleChildT);
                  fanBrick.appendChild(middleChild);// < don't forget KEVIN!
                  // close off the brick and return below     (home alone)
                  var lastChild = document.createElement("div");
                  lastChild.classList.add("overlay");
                  var jz = document.createElement("div");
                  jz.classList.add("inner");
                  var dt = document.createElement("div");
                  var d = new Date(blog.updated * 1000);
                  var b = d.getDate();
                  var px = ["th ", "st ", "nd ", "rd ", "th ", "th ",
                            "th ", "th ", "th ", "th ", "th "][b % 10];
                  if (b === 12 || b === 11) {
                    px = "th ";
                  }
                  var date = [
                    "Sun - ", "Mon - ", "Tue - ", "Wed - ",
                    "Thu - ", "Fri - ", "Sat - "
                  ][d.getDay()] + mo[d.getMonth()] + b + px + d.getFullYear();
                  dt.classList.add("date");
                  dt.appendChild(document.createTextNode(nm));
                  jz.appendChild(dt);
                  lastChild.appendChild(jz);
                  fanBrick.setAttribute("title", nm + " " + date);
                  fanBrick.appendChild(lastChild);
                  if (group.length > 0) {
                    lcontent.insertBefore(
                      fanBrick, group[group.length-1].nextSibling
                    );
                  } else {
                    lcontent.appendChild(fanBrick);
                  }
                }
                data.setAttribute(
                  "data-id_to_types",
                  JSON.stringify(idToTypes)
                );
                data.setAttribute(
                  "data-type_to_ids",
                  JSON.stringify(typeToIds)
                );
                data.setAttribute(
                  "data-types_all_arr",
                  JSON.stringify(typesAllArr)
                );
                data.setAttribute(
                  "data-ids_all_arr",
                  JSON.stringify(idsAllArr)
                );
                data.setAttribute("data-unstable-next-href", "0");
                pluginBuildColumns();
                var nextPage = false; // maybe? find out later...
                data.setAttribute("data-id_to_types", JSON.stringify(idToTypes));
                data.setAttribute("data-type_to_ids", JSON.stringify(typeToIds));
                data.setAttribute("data-types_all_arr", JSON.stringify(typesAllArr));
                an0.classList.remove("activity-notification");
                if (an.length > 0) {
                  loopFirstBrick(an[0]);
                } else {
                  loadFans(notesList);
                }
              },
              [
                ["Authorization", "Bearer " + token]
              ]
            );
          } else {
            var nc = fanBrick.getElementsByClassName("note_count")[0]; // reblog
            var tc = fanBrick.getElementsByClassName("tag_count")[0]; // like count
            if (isReblog) {
              nc.innerText = (parseInt(nc.innerText.replace(/\D+/g,"")) + 1) + " Notes";
            }
            if (isLike) {
              tc.innerText = (parseInt(tc.innerText.replace(/\D+/g,"")) + 1) + " Likes";
            }
          }
        };
        loopFirstBrick(an[0]);
        notesList.last = an[an.length-1].getAttribute("data-timestamp");
        if (notesList.has_more) {
          setTimeout(function(){
            loadFans(notesList)
          }, 500);
        }
      },
      [
        // I don't want to parse HTML data
        ["X-Requested-With", "XMLHttpRequest"]
        // accept text/html    (-.-)_o  -BOO!
      ]
    );
  };
  // load fans ^

  // we'll need our own masonry for batch photo bricks
  var rebuildPhotoColumn = function() {
    // this fires once for each image
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var column = 150;
    var brk = document.getElementsByClassName("photo-brick");
    var rect;
    var iRct;
    var img;
    var mt; // margin Top
    var brkHeight = 0;
    var tallH;
    for (var i = 0; i < brk.length; i++) {
      img = brk[i].getElementsByClassName("photo-brick-img");
      if (
        img.length === 0 || img.length === 1 &&
        typeof img[0] !== "undefined" &&
        typeof img[0].children !== "undefined" &&
        img[0].children.length === 0
      ) {
        brk[i].parentNode.removeChild(brk[i]);
        i--;
        if (i > 0 && typeof brk[i] === "undefined") {
          break;
        }
      } else {
        brkHeight = 0;
        for (var l = 0; l < img.length; l++) {
          if(
            img[l].classList.contains("row-with-two-img") &&
            img[l].classList.contains("data-photoset-a") &&
            typeof img[l+1] !== "undefined" // nextSibling
          ){
            // neat row...? row same height #1
            tallH = Math.round(Math.min(
              img[l].children[0].clientHeight*
              (60/img[l].children[0].clientWidth),
              img[l+1].children[0].clientHeight*
              (60/img[l+1].children[0].clientWidth)
            )); //2
            img[l].style.height = tallH + "px";
            img[l+1].style.height = tallH + "px";
          }
          if(
            img[l].classList.contains("row-with-three-img") &&
            img[l].classList.contains("data-photoset-a") &&
            typeof img[l+1] !== "undefined" && // nextSibling
            typeof img[l+2] !== "undefined" // nextSibling&nextSibling
          ){
            // neat row...? row same height #1
            tallH = Math.round(Math.min(
              img[l].children[0].clientHeight*
              (38/img[l].children[0].clientWidth),
              img[l+1].children[0].clientHeight*
              (38/img[l+1].children[0].clientWidth),
              img[l+2].children[0].clientHeight*
              (38/img[l+2].children[0].clientWidth)
            )); //3
            img[l].style.height = tallH + "px";
            img[l+1].style.height = tallH + "px";
            img[l+2].style.height = tallH + "px";
          }
          if (
            typeof img[l] !== "undefined" &&
            typeof img[l].children[0] !== "undefined"
          ) {
            rect = img[l].getBoundingClientRect();
            iRct = img[l].children[0].getBoundingClientRect();
            mt = Math.round((rect.height - iRct.height) / 2);
            img[l].children[0].style.marginTop = mt + "px";
            if (
              img[l].classList.contains("row-with-one-img") ||
              img[l].classList.contains("data-photoset-a") &&
              !img[l].classList.contains("brick-dragging")
            ) {
              brkHeight += rect.height + 6;
            }
          }
        }
        if (brkHeight !== 0) {
          brk[i].style.height = Math.round(brkHeight) + "px";
          brk[i].getElementsByClassName("rich")[0].
            style.maxHeight = Math.round(brkHeight-42) > 100 ?
            Math.round(brkHeight-42) + "px" : "100px";
        }
      }
    }
    for (i = 0; i < brk.length; i++) {
      brk[i].style.top = column + "px";
      brk[i].style.left = "420px"; // :P
      column += brk[i].getBoundingClientRect().height + 6;
    }
    data.setAttribute("data-photos_height", column);
    lcontent.style.height = column + "px";
  };
  // end rebuildColumns for batch photos rebuildPhotoColumn

  // alternative name: makePhotoBrickFromUpload
  var allResized = 0;
  var brickIndex = 0;
  var reading = [{
    read: rebuildPhotoColumn
  }];
  var unreadFile = {};
  var readers = [];
  var loadPhotoIntoDOM = function(reloadedImg){
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    // new photo-brick
    var bricks = document.getElementsByClassName("photo-brick");
    var brick = document.createElement("div");
    var brickInner = document.createElement("div");
    brickInner.classList.add("photo-inner");
    brick.classList.add("photo-brick");
    brick.style.top = "-150px";
    brick.style.left = "420px";
    brick.setAttribute("onclick", "window.just_clicked_add_tags = true;");
    brick.id = "photo-brick_" + brickIndex;
    var img = new Image();
    if (
      typeof reloadedImg !== "undefined" &&
      typeof reloadedImg.target !== "undefined" &&
      typeof reloadedImg.target.imgCode !== "undefined"
    ) {
      img.setAttribute("img-code", reloadedImg.target.imgCode);
    }
    img.style.visibility = "hidden";
    img.setAttribute("data-id", brick.id);
    var pbi = document.createElement("div");
    pbi.setAttribute("data-id", brick.id);
    pbi.classList.add("row-with-one-img");
    pbi.classList.add("photo-brick-img");
    var pbic = document.createElement("div");
    pbic.classList.add("photo-brick-img-cell");
    var observer = document.createElement("div");
    observer.classList.add("resize-observer");
    // rebuildColumn after single photo dragged / resized
    new ResizeObserver(rebuildPhotoColumn).observe(observer);
    // these ^ are cool :)
    // editor portion
    var pbe = document.createElement("div");
    pbe.classList.add("photo-brick-edit");
    var rich = document.createElement("div");
    rich.setAttribute("title", "caption");
    rich.id = "rich_text_" + brickIndex;
    rich.setAttribute("data-id", brickIndex);
    var tags = document.createElement("div");
    tags.setAttribute("data-id", brickIndex);
    tags.classList.add("photo-tags");
    tags.addEventListener("click", function() {
      if (!brick.classList.contains("focused-rich")) {
        rich.focus();
      }
    });
    tags.id = "photo_tags_" + brickIndex;
    rich.contentEditable = true;
    rich.designMode = "on";
    rich.classList.add("rich");
    rich.addEventListener("focus", function () {
      if (data.classList.contains("photo-upload-in-progress")) {
        return;
      }
      if (!brick.classList.contains("focused-rich")) {
        var fr = document.getElementsByClassName("focused-rich");
        while (fr.length > 0 ) {
          fr[0].classList.remove("focused-rich");
        }
        var addTagsWidget = document.getElementById("add_tags_widget");
        addTagsWidget.style.display = "block";
        brick.classList.add("focused-rich");
      }
    });
    pbe.appendChild(rich);
    pbe.appendChild(tags);
    var stripe = document.createElement("div");
    stripe.classList.add("stripe");
    var clone = butt("Clone ABC");
    clone.classList.add(clone.id);
    clone.removeAttribute("id");
    clone.addEventListener("click", function () {
      var otherRich = document.getElementsByClassName("rich");
      for (var i = 0; i < otherRich.length; i++){
        if (otherRich[i] === rich) {
          continue;
        }
        otherRich[i].innerHTML = rich.innerHTML;
      }
    });
    clone.setAttribute(
      "title", "Copy this caption, to all photo captions."
    );
    pbe.appendChild(clone);
    appendRichButtons(pbe, rich, brick);
    pbe.appendChild(stripe);
    // end editor portion
    img.addEventListener("load", function() {
      var brick = document.getElementById(
        this.getAttribute("data-id")
      );
      var column = parseInt(
        data.getAttribute("data-photos_height")
      );
      var minBrickHeight = 120;
      this.removeAttribute("style");
      column += (this.height > minBrickHeight ?
	    this.height: minBrickHeight) + 6;
      data.setAttribute("data-photos_height", column);
      lcontent.style.height = column + "px";
    });
    img.src = typeof reloadedImg.nodeName === "undefined" ?
      this.result : reloadedImg.src;
    pbi.appendChild(img);
    observer.appendChild(pbi);
    pbic.appendChild(observer);
    brickInner.appendChild(pbic); // mayo?
    brickInner.appendChild(pbe); // lettuce?
    brick.appendChild(brickInner);
    if (typeof reading !== "undefined" && reading.length > 0) {
      reading.pop();
    }
    if (typeof reading !== "undefined" && reading.length > 0) {
      reading[reading.length - 1].read();
    }
    if (typeof reloadedImg.nodeName !== "undefined") {
      var hlb = document.getElementsByClassName("hl-bottom");
      var hlt = document.getElementsByClassName("hl-top");
      reloadedImg.parentNode.removeChild(reloadedImg);
      document.body.insertBefore(
        brick,
        hlb.length > 0 ? hlb[0].nextSibling : hlt.length > 0 ? hlt[0] :
        document.body.firstChild // < but not this usually
      );
    } else {
      document.body.appendChild(brick);
    }
    brickIndex++;
  };
  // end the batch photo brick maker thing

  // tampermonkey say this needs to be defined first Catch22
  // our own DOM builder for the Dash/Archive/Tagged API; end at return brick
  var makeBrickFromApiPost = function (post, type, content, index) {
    if (type === "undefined") {
      return false;
    }
    var i;
    var tp = {
      "chat": "conversation",
      "ask": "note",
      "image": "photo",
      "text": "regular",
      "link": "link",
      "video": "video",
      "audio": "audio",
      "quote": "quote"
    }; // tumblr 2014 post type names (archive.js)
    var smallestMedia = function (media) {
      var url = media[0].url;
      var width = 100000;
      var height = 125;
      for (var i = 0; i < media.length; i++) {
        if (typeof media[i].width === "undefined") {
          continue;
        }
        if (media[i].width === media[i].height) {
          width = media[i].width;
          height = media[i].height;
          url = media[i].url;
          break;
        }
        if (media[i].width < width && media[i].width >= 125) {
          width = media[i].width;
          height = media[i].height;
          url = media[i].url;
        }
      }
      if (width === 100000) {
        width = 125;
      }
      var img = new Image();
      img.src = url;
      img.width = 125;
      img.height = ((125/width) * height);
      img.style.width = img.width + "px";
      img.style.height = img.height + "px";
      return img;
    };
    var formatText = function (text, f, q) {
      if (typeof f === "undefined") {
        f = [];
      }
      if (typeof q === "undefined") {
        q = "nothing";
      }
      if (typeof text === "undefined") {
        text = "";
      }
      var chars = text.split("");
      chars.push("");
      var open;
      var close = "</span>";
      for (var i = 0; i < f.length; i++) {
        open = {
          "mention":
          "<span style=\"text-decoration:underline;\">",
          "link":
          "<span style=\"text-decoration:underline;\">",
          "bold":
          "<span style=\"font-weight:bold;\">",
          "color":
          "<span style=\"color:" + f[i].hex + ";\">",
          "italic":
          "<span style=\"font-style:italic;\">"
        }[f[i].type];
        chars[f[i].start] = open + chars[f[i].start];
        chars[f[i].end] = chars[f[i].end] + close;
      }
      if(q === "quirky") {
        chars.unshift(
          "<p class=\"quirky\">"
        );
        chars.push("</p>");
      }
      if(q === "heading1") {
        chars.unshift(
          "<p class=\"h1\">"
        );
        chars.push("</p>");
      }
      if(q === "heading2") {
        chars.unshift(
          "<p class=\"h2\">"
        );
        chars.push("</p>");
      }
      if(q === "link") {
        chars.unshift(
          "<div class=\"rq\">&#x2192;</div>" +
          "<p class=\"link\">"
        );
        chars.push("</p>");
      }
      if(q === "chat") {
        chars.unshift(
          "<p class=\"monospace\">"
        );
        chars.push("</p>");
      }
      if(q === "ordered-list-item") {
        chars.unshift(
          "<p class=\"ol\">"
        );
        chars.push("</p>");
      }
      if(q === "unordered-list-item") {
        chars.unshift(
          "<p class=\"ul\">"
        );
        chars.push("</p>");
      }
      if(q === "quote") {
        chars.unshift(
          "<div class=\"rq\">&rdquo;</div>" +
          "<p class=\"quote\">"
        );
        chars.push("</p>");
      }
      if(q === "note") {
        chars.unshift(
          "<div class=\"rq\">?</div>" +
          "<p class=\"quote\">"
        );
        chars.push("</p>");
      }
      return chars.join("");
    }; // format text
    var brick = document.createElement("a");
    brick.setAttribute("data-index", index);
    brick.classList.add("brick");
    brick.classList.add(tp[type]);
    brick.classList.add("timestamp_" + post.timestamp);
    brick.setAttribute("data-id", post.id);
    brick.setAttribute("data-timestamp", post.timestamp);
    brick.setAttribute("data-reblog_key", post.reblog_key);
    brick.id = "post_" + post.id;
    var firstChild = document.createElement("div");
    firstChild.classList.add("highlight");
    var cm = new Image();
    cm.src = "https://assets.tumblr.com/images/" +
      "small_white_checkmark.png";
    cm.classList.add("checkmark");
    firstChild.appendChild(cm);
    var tc = document.createElement("div");
    tc.classList.add("tag_count");
    tc.id = "tag_count_" + post.id;
    tc.appendChild(
      document.createTextNode(
        typeof post.tags === "undefined" ? "0 tags" :
        post.tags.length === 1 ? "1 tag" :
        post.tags.length + " tags"
      )
    );
    firstChild.appendChild(tc);
    var nc = document.createElement("div");
    nc.classList.add("note_count");
    nc.id = "note_count_" + post.id;
    nc.appendChild(
      document.createTextNode(
        typeof post.note_count === "undefined" ? "0 notes" :
        post.note_count === 1 ? "1 note" :
        post.note_count.toLocaleString("en", {useGrouping:true}) + " notes"
      )
    );
    firstChild.appendChild(nc);
    brick.appendChild(firstChild);
    // meat & tators middle child (again)
    var middleChild = document.createElement("div");
    var middleChildT = document.createElement("div");
    var middleChildTR = document.createElement("div");
    var middleChildTD = document.createElement("div");
    var middleChildIB = document.createElement("div");
    var fade = document.createElement("div");
    fade.classList.add("fade");
    var childTitle;
    var imgs;
    var h;
    var url;
    var av;
    var nm;
    var orly;
    var line;
    var op;
    var l;
    middleChild.classList.add("overflow-hidden");
    middleChildT.classList.add("overflow-table");
    middleChildTR.classList.add("overflow-row");
    middleChildTD.classList.add("overflow-cell");
    middleChildIB.classList.add("overflow-inline");
    if (
      type === "text" ||
      type === "chat" ||
      type === "quote" ||
      type === "ask" ||
      type === "link"
    ) {
      childTitle = document.createElement("div");
      childTitle.classList.add("title");
      if (
        typeof content[0] !== "undefined" &&
        typeof content[0].text !== "undefined"
      ) {
        childTitle.innerHTML = formatText(
          content[0].text,
          content[0].formatting,
          content[0].subtype
        );
      }
      if (type === "ask") {
        nm = typeof post.trail[0].layout[0].attribution !== "undefined" ?
          post.trail[0].layout[0].attribution.blog.name :
        post.trail[0].blog.name;
        url = "https://api.tumblr.com/v2/blog/" + nm + "/avatar/64";
        av = new Image();
        av.width = 24;
        av.height = 24;
        av.style.width = av.width + "px";
        av.style.height = av.height + "px";
        av.src = url;
        av.classList.add("ask-av");
        childTitle.appendChild(av);
        if (
          typeof post.trail[0] !== "undefined" &&
          typeof post.trail[0].content[0] !== "undefined" &&
          typeof post.trail[0].content[0].text !== "undefined"
        ) {
          childTitle.innerHTML += "<div class=\"rq\">?</div>" +
            "<div class=\"asker\">" +
            formatText(
            post.trail[0].content[0].text,
            post.trail[0].content[0].formatting,
            post.trail[0].content[0].subtype
          ) + "</div>";
        }
      }
      if (
        type === "ask" &&
        typeof post.trail[0] !== "undefined" &&
        typeof post.trail[0].content[1] !== "undefined" &&
        (
          typeof post.trail[0].content[1].text !== "undefined" ||
          typeof post.trail[0].content[1].media !== "undefined"
        )
      ) {
        if (typeof post.trail[0].content[1].text !== "undefined") {
          childTitle.innerHTML += "<div class=\"answer\">" +
            formatText(
            post.trail[0].content[1].text,
            post.trail[0].content[1].formatting,
            post.trail[0].content[1].subtype
          ) + "</div>";
        } else {
          imgs = post.trail[0].content[1].media;
          brick.classList.add("has-img");
          line = smallestMedia(imgs);
          h = line.height;
          childTitle.innerHTML +=
            line.outerHTML;
          childTitle.appendChild(fade);
        }
      }
      middleChildIB.appendChild(childTitle);
      if (
        typeof content[1] !== "undefined" &&
        typeof content[1].text !== "undefined"
      ) {
        op = document.createElement("div");
        op.classList.add("overprint");
        var alt = true;
        if (type === "chat") {
          for (i = 1; i < content.length; i++) {
            if (typeof content[i].text === "undefined") {
              continue;
            }
            line = document.createElement("div");
            line.classList = "line";
            if (alt) {
              line.classList.add("alt");
            }
            alt = !alt;
            line.innerHTML = formatText(
              content[i].text,
              content[i].formatting,
              content[i].subtype
            );
            op.appendChild(
              line
            );
          }
          middleChildIB.appendChild(op);
        }
        if (
          type === "text" || type === "quote" ||
          type === "ask" || type === "link"
        ) {
          if (
            typeof content === "undefined" ||
            typeof content !== "undefined" &&
            content.length === 0
          ) {
            if (
              typeof post.trail !== "undefined" &&
              typeof post.trail[0] !== "undefined" &&
              typeof post.trail[0].content !== "undefined" &&
              post.trail[0].content.length > 0
            ) {
              content = post.trail[0].content;
            }
          }
          for (i = 1; i < content.length; i++) {
            if (typeof content[i].text !== "undefined") {
              line = document.createElement("div");
              line.innerHTML = formatText(
                content[i].text,
                content[i].formatting,
                content[i].subtype
              );
              op.appendChild(
                line
              );
            }
            if (
              typeof content[i].media !== "undefined" &&
              content[i].media.length > 0 ||
              typeof content[i].poster !== "undefined" &&
              content[i].poster.length > 0
            ) {
              imgs = typeof content[i].poster === "undefined" ?
                content[i].media : content[i].poster;
              brick.classList.add("has-img");
              line = smallestMedia(imgs);
              h = line.height;
              op.appendChild(
                line
              );
              op.appendChild(fade);
            }
          }
          middleChildIB.appendChild(op);
        }
      }
    } // photo images, audio, video
    if (
      !(
        typeof content !== "undefined" &&
        typeof content[0] !== "undefined" &&
        typeof content[0].media !== "undefined" &&
        content[0].media.length > 0 ||
        typeof content !== "undefined" &&
        typeof content[0] !== "undefined" &&
        typeof content[0].poster !== "undefined" &&
        content[0].poster.length > 0
      )
    ) {
      if(
        typeof content !== "undefined" &&
        typeof post.content !== "undefined"
      ) {
        content = post.content; // another backflip :)
        // I'm done with ^ NPF neue posts here :)
      }
    }
    if (
      type === "link" &&
      typeof content !== "undefined" &&
      typeof content[0] !== "undefined" &&
      typeof content[0].title !== "undefined"
    ) {
      line = document.createElement("div");
      line.innerHTML = formatText(
        content[0].title,
        content[0].formatting,
        "link"
      );
      if (typeof content[0].description !== "undefined") {
        line.innerHTML += formatText(
          content[0].description,
          content[0].formatting,
          "normal"
        );
      }
      middleChildIB.appendChild(
        line
      );
    }
    if (
      typeof content !== "undefined" &&
      typeof content[0] !== "undefined" &&
      typeof content[0].media !== "undefined" &&
      content[0].media.length > 0 ||
      typeof content !== "undefined" &&
      typeof content[0] !== "undefined" &&
      typeof content[0].poster !== "undefined" &&
      content[0].poster.length > 0
    ) {
      imgs = typeof content[0].poster === "undefined" ?
        content[0].media : content[0].poster;
      line = smallestMedia(imgs);
      brick.classList.add("has-img");
      h = line.height;
      middleChildIB.appendChild(line);
      if (type === "text") {
        middleChildIB.appendChild(fade);
      }
    } else if (
      typeof content[1] !== "undefined" &&
      typeof content[1].media !== "undefined" &&
      content[1].media.length > 0 ||
      typeof content[1] !== "undefined" &&
      typeof content[1].poster !== "undefined" &&
      content[1].poster.length > 0
    ) {
      imgs = typeof content[1].poster === "undefined" ?
        content[1].media : content[1].poster;
      line = smallestMedia(imgs);
      brick.classList.add("has-img");
      h = line.height;
      middleChildIB.appendChild(line);
      if (type === "text") {
        middleChildIB.appendChild(fade);
      }
    }
    if (
      type === "image" || h < 125 &&
      type !== "text" &&
      type !== "ask"
    ) {
      brick.style.height = Math.round(h) + "px";
    } else {
      brick.style.height = "125px";
    }
    if (
      type === "image" || type === "video" || type === "audio"
    ) {
      // I discovered this looks nice, so I'm doing some design
      var captionInlineBlock = document.createElement("div");
      captionInlineBlock.classList.add("caption-inline-block");
      var captionTR = document.createElement("div");
      captionTR.classList.add("caption-tr");
      var captionTD = document.createElement("div");
      captionTD.classList.add("caption-td");
      var caption = document.createElement("div");
      caption.classList.add("caption");
      var capContent;
      if (
        typeof post.trail !== "undefined" &&
        post.trail.length > 0
      ) {
        for (i = 0; i < post.trail.length; i++) {
          if (
            typeof post.trail[i].content !== "undefined" &&
            post.trail[i].content.length > 0
          ) {
            capContent = post.trail[i].content;
            for (l = 0; l < capContent.length; l++) {
              if (
                typeof capContent[l].text !== "undefined"
              ) {
                captionInlineBlock.innerHTML += "<div>" + formatText(
                  capContent[l].text,
                  capContent[l].formatting,
                  capContent[l].subtype
                ) + "</div>";
              }
            }
          }
        }
      }
      if (captionInlineBlock.innerHTML.length === 0) {
        capContent = typeof post.content !== "undefined" &&
          post.content.length > 0 ?
          post.content : content;
        for (i = 0; i < capContent.length; i++) {
          if (typeof capContent[i].text !== "undefined") {
            captionInlineBlock.innerHTML += "<div>" + formatText(
              capContent[i].text,
              capContent[i].formatting,
              capContent[i].subtype
            ) + "</div>";
          }
        }
      }
      captionTD.appendChild(captionInlineBlock);
      captionTR.appendChild(captionTD);
      caption.appendChild(captionTR);
      brick.appendChild(caption);
    }
    if (type === "image") {
      var imgCount = -1;
      for (i = 1; i < content.length; i++) {
        if (typeof content[i].media !== "undefined") {
          ++imgCount;
        }
      }
      if (imgCount > 0) {
        var imgCountDiv = document.createElement("div");
        imgCountDiv.classList.add("img-count");
        imgCountDiv.appendChild(
          document.createTextNode("+" + imgCount + " more")
        );
        brick.appendChild(imgCountDiv);
      }
    }
    if (type === "video") {
      orly = document.createElement("div");
      orly.classList.add("play_overlay");
      brick.appendChild(orly);
    }
    if (type === "audio") {
      orly = document.createElement("div");
      orly.classList.add("listen_overlay");
      brick.appendChild(orly);
    }
    if (post.state === "private") {
      orly = document.createElement("div");
      orly.classList.add("private_overlay");
      brick.classList.add("private");
      brick.appendChild(orly);
    }
    // this is the tags and links thingy
    brick.href = post.post_url;
    brick.setAttribute("target", "_blank");
    var linksLayer = document.createElement("div");
    linksLayer.classList.add("links-layer");
    var linksTrow = document.createElement("div");
    linksTrow.classList.add("trow");
    var tagsLayer = document.createElement("div");
    tagsLayer.classList.add("tags-layer");
    if (typeof post.tags !== "undefined") {
      var tagsLayerContainer = document.createElement("div");
      tagsLayerContainer.classList.add("tag-container");
      post.tags.sort(function (a, b) {
        return a.length - b.length;
      });
      for (i = 0; i < post.tags.length; i++) {
        tagsLayerContainer.appendChild(
          document.createTextNode(
            "#" + post.tags[i] + " "
          )
        );
      }
      tagsLayer.appendChild(tagsLayerContainer);
    }
    var href = document.location.href.split(/[\/\?&#=]+/g);
    var noEdit = typeof href[5] !== "undefined" &&
        (
          href[5] === "dashboard" ||
          href[5] === "archive" ||
          href[5] === "tagged" ||
          href[5] === "likes" ||
          href[5] === "search"
        );
    // post bricks edit button
    var link1 = document.createElement("a");
    link1.setAttribute("target", "_blank");
    link1.classList.add("link-edit");
    link1.href = noEdit ?
      "/dashboard/blog/" + post.blog_name + "/" + post.id :
    "/edit/" + post.id;
    link1.setAttribute("title",
                       (noEdit ? "Peepr" : "Edit")
                      );
    link1.appendChild(
      (noEdit?
       svgForType.view.cloneNode(true):
       svgForType.edit.cloneNode(true)
      )
    );
    link1.setAttribute("data-id", post.id);
    // only add like/reblog buttons if posts are visible
    if (!noEdit) {
      link1.addEventListener("click", function(e) {
        e.preventDefault();
        e.stopPropagation();
        e.cancelBubble = true;
        var iframe = document.createElement("iframe");
        iframe.setAttribute("data-id", this.getAttribute("data-id"));
        document.getElementById(
          "post_" + this.getAttribute("data-id")
        ).classList.remove("prevent-anim");
        iframe.id = "neue_post_form-iframe";
        var reminisce = 0;
        iframe.addEventListener("load", function () {
          var replaceAfterEdit = this;
          var id = this.getAttribute("data-id");
          // this checks if done editing/closed
          clearInterval(reminisce);
          reminisce = setInterval(function () {
            var w = document.getElementById(
              "neue_post_form-iframe"
            ).contentWindow;
            var p = w.document.getElementsByClassName(
              "post-forms-modal"
            )[0];
            if (
              typeof p === "undefined" ||
              typeof p !== "undefined" &&
              p.length === 0 ||
              typeof p !== "undefined" &&
              (
                w.getComputedStyle(p).
                getPropertyValue("display") === "none" ||
                w.getComputedStyle(p).
                getPropertyValue("opacity").toString() === "0"
              )
            ) {
              clearInterval(reminisce);
              document.body.removeChild(
                document.getElementById("neue_post_form-iframe")
              );
              reloadBrick(replaceAfterEdit);
            }
          }, 500);
        });
        iframe.src = "https://www.tumblr.com/neue_web/iframe/edit/" +
          post.id;
        iframe.setAttribute("scrolling", "no");
        iframe.setAttribute("frameborder", "0");
        iframe.setAttribute("title", "Post forms");
        document.body.appendChild(iframe);
      });
    } else {
      link1.addEventListener("click", function (e){
        e.cancelBubble = true;
        e.stopProgagation();
      });
    }
    // post bricks view post link
    var link2 = document.createElement("a");
    link2.setAttribute("target", "_blank");
    link2.addEventListener("click", function (e){
      e.cancelBubble = true;
      e.stopProgagation();
    });
    link2.classList.add("link-view");
    link2.href = post.post_url;
    link2.setAttribute("target", "_blank");
    link2.setAttribute("title", "View Post");
    link2.appendChild(
      svgForType.see.cloneNode(true)
    );
    // post bricks like button
    var isReblogable = href[3] !== "draft" && href[3] !== "queued";
    if (isReblogable) {
      var link3 = document.createElement("a");
      link3.setAttribute("target", "_blank");
      link3.classList.add("link-like");
      link3.setAttribute("data-id", post.id);
      link3.href = post.post_url + "#like" + post.reblog_key;
      link3.setAttribute(
        "data-like-info",
        JSON.stringify({"id":post.id,"reblog_key":post.reblog_key})
      );
      link3.setAttribute("target", "_blank");
      link3.setAttribute("title", "Like Post");
      var whiteHeart = post.liked ?
          svgForType.liked.cloneNode(true):
      svgForType.notes.cloneNode(true);
      whiteHeart.setAttribute("fill", post.liked ? "#f56": "#fff");
      link3.appendChild(
        whiteHeart
      );
      link3.classList.add(post.liked ? "liked" : "not-liked");
      link3.addEventListener("click", function (e) {
        e.cancelBubble = true;
        e.stopPropagation();
        e.preventDefault();
        if (this.classList.contains("clicked")) {
          return;
        }
        var data = document.getElementById(
          "mass_post_features-plugin_data"
        );
        this.classList.remove("new-liked");
        this.classList.add("clicked");
        var button = this;
        var liked = this.classList.contains("liked");
        var info = this.getAttribute("data-like-info");
        var v2url = liked ?
            "/api/v2/user/unlike" : "/api/v2/user/like";
        var token = data.getAttribute("data-api-token");
        var href = document.location.href.split(/[\/\?&#=]+/g);
        var name = href[4];
        var csrfToken = data.getAttribute("data-csrf-token");
        if (csrfToken !== "0") {
          var xhttp = new XMLHttpRequest();
          xhttp.onreadystatechange = function () {
            if (this.readyState == 4 && this.status == 200) {
              button.innerHTML = "";
              var cb = document.getElementById(
                "post_" + button.getAttribute("data-id")
              );
              if (liked) {
                whiteHeart = svgForType.notes.cloneNode(true);
                whiteHeart.setAttribute("fill", "#fff");
                button.classList.remove("liked");
                button.classList.add("not-liked");
                cb.classList.remove("liked");
              } else {
                whiteHeart = svgForType.liked.cloneNode(true);
                whiteHeart.setAttribute("fill", "#f56");
                button.classList.add("liked");
                button.classList.remove("not-liked");
                cb.classList.add("liked");
                // graphical aftertaste for reblog
                var bigHeart = svgForType.liked.cloneNode(true);
                bigHeart.setAttribute("fill", "#f56");
                bigHeart.setAttribute("width", "125");
                bigHeart.setAttribute("height", "125");
                bigHeart.classList.add("big-heart");
                setTimeout(function(){
                  bigHeart.parentNode.removeChild(bigHeart);
                }, 1700);
                cb.appendChild(bigHeart);
                button.classList.add("new-liked");
              }
              button.appendChild(whiteHeart);
              button.classList.remove("clicked");
            }
          };
          xhttp.open("POST", v2url, true);
          // headers only after open and only before send
          xhttp.setRequestHeader(
            "Accept", "application/json;format=camelcase"
          );
          xhttp.setRequestHeader(
            "Authorization", "Bearer " + token
          );
          xhttp.setRequestHeader(
            "X-CSRF", csrfToken
          );
          xhttp.setRequestHeader(
            "Content-Type", "application/json; charset=utf8"
          );
          xhttp.setRequestHeader(
            "X-Version", "redpop/3/0//redpop/"
          );
          xhttp.send(info);
        } // else {
        // TODO, (just in case) get a new CSRF token here?
        // this may not be needed...?
        // the token seems to stay ok, so far :)
        //}
      });
      // posts bricks reblog button
      var link4 = document.createElement("a");
      link4.setAttribute("target", "_blank");
      link4.classList.add("link-reblog");
      link4.href = post.post_url + "#like" + post.reblog_key;
      link4.setAttribute("data-id", post.id);
      link4.setAttribute("data-reblog_key", post.reblog_key);
      link4.setAttribute("target", "_blank");
      link4.setAttribute("title", "Reblog Post");
      var whiteReblog = svgForType["reblog-self"].cloneNode(true);
      whiteReblog.setAttribute("fill", "#fff");
      link4.appendChild(
        whiteReblog
      );
      link4.addEventListener("click", function (e) {
        e.cancelBubble = true;
        e.stopPropagation();
        e.preventDefault();
        if (
          this.classList.contains("clicked") ||
          this.classList.contains("reblogged")
        ) {
          return;
        }
        var id = this.getAttribute("data-id");
        var key = this.getAttribute("data-reblog_key");
        var button = this;
        this.classList.remove("new-liked");
        this.classList.add("clicked");
        data.setAttribute("data-single_edit_id", id);
        data.setAttribute("data-current_edit_index", "-1");
        data.setAttribute("data-current_edit_action", "reblog");
        // negative index for outside of queue single reblogs
        fetchEditSubmit(
          function(){
            var cb = document.getElementById(
              "post_" + button.getAttribute("data-id")
            );
            button.children[0].setAttribute("fill", "#7EFF29");
            button.classList.remove("clicked");
            button.classList.add("reblogged");
            cb.classList.add("reblogged");
            reblogAnimation(button.getAttribute("data-id"));
          });
      });
    }
    tagsLayer.addEventListener("click", function (e) {
      e.cancelBubble = true;
      e.stopPropagation();
      e.preventDefault();
      var clickParentBrick = new Event("click");
      this.parentNode.parentNode.
      parentNode.dispatchEvent(clickParentBrick);
    });
    tagsLayer.appendChild(link1);
    tagsLayer.appendChild(link2);
    if (isReblogable) {
      tagsLayer.appendChild(link3);
      tagsLayer.appendChild(link4);
    }
    linksTrow.appendChild(tagsLayer);
    linksLayer.appendChild(linksTrow);
    brick.appendChild(linksLayer);
    // sandwich, yum
    middleChildTD.appendChild(middleChildIB);
    middleChildTR.appendChild(middleChildTD);
    middleChildT.appendChild(middleChildTR);
    middleChild.appendChild(middleChildT);
    brick.appendChild(middleChild);
    // close off the brick and return below
    var lastChild = document.createElement("div");
    lastChild.classList.add("overlay");
    var jz = document.createElement("div");
    jz.classList.add("inner");
    var dt = document.createElement("div");
    var d = new Date(post.timestamp * 1000);
    var b = d.getDate();
    var px = ["th ", "st ", "nd ", "rd ", "th ", "th ",
              "th ", "th ", "th ", "th ", "th "][b % 10];
    if (b === 12 || b === 11) {
      px = "th ";
    }
    var date = [
      "Sun - ", "Mon - ", "Tue - ", "Wed - ",
      "Thu - ", "Fri - ", "Sat - "
    ][d.getDay()] + [
      "Jan ", "Feb ", "Mar ", "Apr ",
      "May ", "Jun ", "Jul ", "Aug ",
      "Sep ", "Oct ", "Nov ", "Dec "
    ][d.getMonth()] + b + px + d.getFullYear();
    dt.classList.add("date");
    dt.appendChild(document.createTextNode(date));
    jz.appendChild(dt);
    lastChild.appendChild(jz);
    brick.appendChild(lastChild);
    if (
      typeof content !== "undefined" &&
      typeof content[0] !== "undefined" &&
      typeof content[0].attribution !== "undefined" &&
      typeof content[0].attribution.url !== "undefined"
    ) {
      var sourceLabel2 = document.createElement("div");
      sourceLabel2.setAttribute(
        "title",
        "link: " + content[0].attribution.url
      );
      var symlink1 = svgForType.symlink.cloneNode(true); //:D
      symlink1.setAttribute("fill", "rgba(100,110,255,1)");
      sourceLabel2.appendChild(symlink1);
      sourceLabel2.classList.add("source-label2");
      brick.appendChild(sourceLabel2);
    }
    if (
      typeof post.source_url_raw !== "undefined" &&
      post.source_url_raw !== "" &&
      post.source_url_raw !== false
    ) {
      var sourceLabel1 = document.createElement("div");
      sourceLabel1.setAttribute(
        "title",
        "source: " + post.source_url_raw
      );
      var symlink2 = svgForType.symlink.cloneNode(true); //:D
      symlink2.setAttribute("fill", "#eee");
      sourceLabel1.appendChild(symlink2);
      sourceLabel1.classList.add("source-label1");
      brick.appendChild(sourceLabel1);
    }
    // lastly create the event to highlight single stuff
    brick.addEventListener("click", function (e) {
      e.stopPropagation();
      e.preventDefault();
      e.cancelBubble = true;
      highlightBrick(this, !this.classList.contains("highlighted"));
    });
    return brick; // end from var makeBrickFromAPIPost
  }
  // end giant makeBrick brick building function

  // since tumblr put a somewhat api/v2 on the main domain,
  // instead of api.tumblr.com ect...
  // greasemonkey can use an api
  // without registering an oauth key (_-.-)shh
  var asyncRepeatApiRead = function (api) {
    if(typeof api === "string") {
      api = JSON.parse(api);
    }
    var lcontent = document.getElementsByClassName("l-content")[0];
    var href = document.location.href.split(/[\/\?&#=]+/g);
    var name = href[4];
    var endHeader;
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    data.classList.add("fetching-from-tumblr-api");
    if ( // this is the liked/by page if any JSON
      href[5] === "likes" &&
      typeof api.response.liked_posts !== "undefined" &&
      api.response.liked_posts.length > 0
    ) {
      api.response.posts = api.response.liked_posts;
    }
    if ( // this is the dashboards JSON
      typeof api.response.posts === "undefined" &&
      typeof api.response.timeline !== "undefined" &&
      typeof api.response.timeline.elements !== "undefined"
    ) {
      api.response.posts = api.response.timeline.elements;
    }
    if ( // tagged & search JSON
      typeof api.response.posts !== "undefined" &&
      typeof api.response.posts.data !== "undefined"
    ) {
      api.response.posts = api.response.posts.data;
      if (
        typeof api.response._links === "undefined" &&
        api.response.posts.length - 1 > 0
      ) {
        api.response._links = {
          "next": {
            "href":  data.getAttribute("data-ajax-first-subpage") +
            "&post_offset=" + api.response.posts[
              api.response.posts.length - 1
            ].timestamp
          }
        }
      };
      // I know, these ^ are endless
      // idea: [pause button]
    }
    if (
      typeof api.response.posts !== "undefined"
    ) {
      if(api.response.posts.length === 0) {
        endHeader = document.createElement("div");
        endHeader.classList.add("heading");
        endHeader.id = "heading_solum"; // end latin
        endHeader.appendChild(
          document.createTextNode("END") // idky... :)
        );
        lcontent.appendChild(endHeader);
        // done here too, should be
        data.classList.add("next_page_false");
        return;
      }
      var tagsAllArr = JSON.parse(
        data.getAttribute("data-tags_all_arr")
      );
      var idsAllArr = JSON.parse(
        data.getAttribute("data-ids_all_arr")
      );
      var typesAllArr = JSON.parse(
        data.getAttribute("data-types_all_arr")
      );
      var typeToIds = JSON.parse(
        data.getAttribute("data-type_to_ids")
      );
      var idToTags = JSON.parse(
        data.getAttribute("data-id_to_tags")
      );
      var idToTypes = JSON.parse(
        data.getAttribute("data-id_to_types")
      );
      var lastMonthTimestamp = parseFloat(
        data.getAttribute("data-last_month_timestamp")
      );
      var lastYearTimestamp = parseFloat(
        data.getAttribute("data-last_year_timestamp")
      );
      var idToOrigin = JSON.parse(
        data.getAttribute("data-id_to_origin")
      );
      var idToState = JSON.parse(
        data.getAttribute("data-id_to_state")
      );
      var idToTimestamp = JSON.parse(
        data.getAttribute("data-id_to_timestamp")
      );
      var idToNotes = JSON.parse(
        data.getAttribute("data-id_to_notes")
      );
      var tagToIds = JSON.parse(
        data.getAttribute("data-tag_to_ids")
      );
      var post = api.response.posts;
      var tag;
      var id;
      var type;
      var url;
      var reblog;
      var me;
      var media;
      var j;
      var newBrick;
      var monthHeader;
      var lastTimestamp;
      var lastYearstamp;
      if (!lcontent.classList.contains("albino")) {
        lcontent.classList.add("albino");
      }
      var t = [
        "text", "image", "chat", "ask", "video", "audio", "link", "quote"
      ];
      for (var i = 0; i < post.length; i++) {
        id = post[i].id;
        if (idsAllArr.indexOf(id) !== -1) {
          continue;
        }
        type = post[i].type;
        me = post[i];
        media = me.media;
        if (t.indexOf(type) === -1) { // neue type blocks???
          if (
            typeof post[i].trail != "undefined" &&
            typeof post[i].trail[0] !== "undefined" &&
            typeof post[i].trail[0].layout !== "undefined" &&
            typeof post[i].trail[0].layout[0] !== "undefined"
          ) {
            me = post[i].trail[0].layout;
            type = me[0].type;
          }
          if (
            t.indexOf(type) === -1 &&
            typeof post[i].trail != "undefined" &&
            typeof post[i].trail[0] !== "undefined" &&
            typeof post[i].trail[0].content !== "undefined" &&
            typeof post[i].trail[0].content[0] !== "undefined"
          ) {
            me = post[i].trail[0].content;
            type = me[0].type;
          }
          if (
            t.indexOf(type) === -1 &&
            typeof post[i].content !== "undefined" &&
            typeof post[i].content[0] === "undefined" &&
            typeof post[i].trail !== "undefined" &&
            typeof post[i].trail[0] !== "undefined" &&
            typeof post[i].trail[0].content !== "undefined"
          ) {
            me = post[i].trail[0].content;
            type = me[0].type;
          }
          if (
            t.indexOf(type) === -1 &&
            typeof post[i].content !== "undefined" &&
            typeof post[i].content[1] !== "undefined" &&
            typeof post[i].content[1].subtype !== "undefined"
          ) {
            me = post[i].content;
            type = me[1].subtype; // chat, maybe
          }
          if (
            t.indexOf(type) === -1 &&
            typeof post[i].content !== "undefined" &&
            typeof post[i].content[0] !== "undefined"
          ) {
            me = post[i].content;
            type = me[0].type;
          }
          if (
            typeof me !== "undefined" &&
            typeof me[0] !== "undefined" &&
            typeof me[0].subtype !== "undefined" &&
            type !== me[0].subtype &&
            t.indexOf(me[0].subtype) !== -1
          ) {
            type = me[0].subtype;
          }
        }
        if(typeof post[i].timestamp === "undefined") {
          continue;
        }
        lastTimestamp = (new Date(
          post[i].timestamp * 1000)
                        ).getMonth();
        lastYearstamp = (new Date(
          post[i].timestamp * 1000)
                        ).getFullYear();
        if(
          lastTimestamp !== lastMonthTimestamp ||
          lastYearstamp !== lastYearTimestamp
        ) {
          lastMonthTimestamp = lastTimestamp;
          lastYearTimestamp = lastYearstamp;
          data.setAttribute(
            "data-last_month_timestamp", lastMonthTimestamp
          );
          data.setAttribute(
            "data-last_year_timestamp", lastYearTimestamp
          );
          monthHeader = document.createElement("div");
          monthHeader.classList.add("heading");
          monthHeader.id = "heading_" + post[i].timestamp;
          monthHeader.appendChild(
            document.createTextNode([
              "Jan ", "Feb ", "Mar ", "Apr ",
              "May ", "Jun ", "Jul ", "Aug ",
              "Sep ", "Oct ", "Nov ", "Dec "
            ][lastTimestamp] + lastYearstamp)
          );
          lcontent.appendChild(monthHeader);
        }
        // this replaces everything Tumblr wrote inside the bricks
        // with our own flavor, of brick, new brick
        newBrick = makeBrickFromApiPost(
          post[i], type, me, i + parseInt(data.getAttribute("data-last-post-index"))
        );
        if (newBrick !== false) {
          lcontent.appendChild(newBrick);
        }
        idsAllArr.push(id);
        if (typesAllArr.indexOf(type) === -1) {
          typesAllArr.push(type);
          typeToIds[type] = [];
        }
        typeToIds[type].push(id);
        if (
          typeof post[i].reblogged_from_name !== "undefined"
        ) {
          reblog = post[i].reblogged_from_name;
          if (reblog === name) {
            if (
              typesAllArr.indexOf("reblog-self") === -1
            ) {
              typesAllArr.push("reblog-self");
              typeToIds["reblog-self"] = [];
            }
            typeToIds["reblog-self"].push(id);
            idToOrigin[id] = "reblog-self";
          } else {
            if (
              typesAllArr.indexOf("reblog-other") === -1
            ) {
              typesAllArr.push("reblog-other");
              typeToIds["reblog-other"] = [];
            }
            typeToIds["reblog-other"].push(id);
            idToOrigin[id] = "reblog-other";
          }
        } else {
          if (
            typesAllArr.indexOf("original") === -1
          ) {
            typesAllArr.push("original");
            typeToIds.original = [];
          }
          typeToIds.original.push(id);
          idToOrigin[id] = "original";
        }
        if (post[i].state === "private") {
          if (
            typesAllArr.indexOf("private") === -1
          ) {
            typesAllArr.push("private");
            typeToIds.private = [];

          }
          idToState[id] = "private";
          typeToIds.private.push(id);
        } else {
          idToState[id] = "public";
        }
        idToNotes[id] = post[i].note_count;
        idToTimestamp[id] = post[i].timestamp;
        idToTypes[id] = type;
        if (typeof post[i].tags !== "undefined") {
          for (var l = 0; l < post[i].tags.length; l++) {
            tag = post[i].tags[l];
            if (tagsAllArr.indexOf(tag) === -1) {
              tagsAllArr.push(tag);
              tagToIds[tag] = [];
            }
            tagToIds[tag].push(id);
            if (typeof idToTags[id] === "undefined") {
              idToTags[id] = [];
            }
            if (idToTags[id].indexOf(tag) === -1) {
              idToTags[id].push(tag)
            }
          }
        }
        if (i + 1 > post.length) {
          data.setAttribute(
            "data-last-post-index",
            parseInt(data.getAttribute("data-last-post-index")) + i
          );
        }
      }
      pluginBuildColumns();
      // the later onclick event to select-by runs outside of plugin scope
      // so we use the DOM for var memory
      data.setAttribute(
        "data-tags_all_arr", JSON.stringify(tagsAllArr)
      );
      data.setAttribute(
        "data-ids_all_arr", JSON.stringify(idsAllArr)
      );
      data.setAttribute(
        "data-types_all_arr", JSON.stringify(typesAllArr)
      );
      data.setAttribute(
        "data-id_to_tags", JSON.stringify(idToTags)
      );
      data.setAttribute(
        "data-id_to_types", JSON.stringify(idToTypes)
      );
      data.setAttribute(
        "data-id_to_origin", JSON.stringify(idToOrigin)
      );
      data.setAttribute(
        "data-id_to_state", JSON.stringify(idToState)
      );
      data.setAttribute(
        "data-id_to_timestamp", JSON.stringify(idToTimestamp)
      );
      data.setAttribute(
        "data-id_to_notes", JSON.stringify(idToNotes)
      );
      data.setAttribute(
        "data-tag_to_ids", JSON.stringify(tagToIds)
      );
      data.setAttribute(
        "data-type_to_ids", JSON.stringify(typeToIds)
      );
    }
    var token = data.getAttribute("data-api-token");
    var nextPage = false;
    if (
      typeof api.response !== "undefined" &&
      typeof api.response._links !== "undefined" &&
      typeof api.response._links.next !== "undefined" &&
      typeof api.response._links.next.href !== "undefined"
    ) {
      nextPage = api.response._links.next.href;
    } else if (
      typeof api.response !== "undefined" &&
      typeof api.response.timeline !== "undefined" &&
      typeof api.response.timeline._links.next !== "undefined" &&
      typeof api.response.timeline._links.next.href !== "undefined"
    ) {
      nextPage = api.response.timeline._links.next.href;
    }
    if (
	  nextPage !== false && nextPage !== data.getAttribute("data-page-repeat")
	) {
      data.setAttribute("data-page-repeat", nextPage); // loop much?
      // walk, don't run :)
      data.classList.add("fetching-from-tumblr-api");
      var repeatedTimeOut = setInterval(function() {
        // this delays pagination slightly, but it may be better...
        // it's steadier, non-bot-ish, and is easier to process :)
        var tagAlongDiff = document.getElementsByClassName("brick").length -
            document.getElementsByClassName("laid").length;
        if(
          document.getElementById(
            "pause_button"
          ).classList.contains("paused") ||
          tagAlongDiff > 10 // < this :)
        ) {// the CSS3 animation thing is also crash prevention :)
          return;
        }
        clearInterval(repeatedTimeOut);
        getResponseText(
          "/api" + nextPage,
          asyncRepeatApiRead,
          [
            ["Authorization", "Bearer " + token]
          ]
        );
      }, 500);
    } else {
      endHeader = document.createElement("div");
      endHeader.classList.add("heading");
      endHeader.id = "heading_solum"; // end latin
      endHeader.appendChild(
        document.createTextNode("END")
      );
      lcontent.appendChild(endHeader);
      // this is where it usually ends, mostly
      data.classList.add("next_page_false");
    }
  };
  // end var asyncRepeatApiRead

  // re the brick building for edits replaceBrick
  var reloadBrick = function (replaceAfterEdit) {
    if (
      typeof replaceAfterEdit === "undefined" || // what is this?
      replaceAfterEdit.classList.contains("reload-in-progress")
    ) {
      return;
    }
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var idsAllArr = JSON.parse(
      data.getAttribute("data-ids_all_arr")
    );
    replaceAfterEdit.classList.add("reload-in-progress");
    var highlightAfterReload = replaceAfterEdit.classList.contains("highlighted");
    var preloadContainer = document.createElement("div");
    preloadContainer.classList.add("edited-gif");
    var preloadTrow = document.createElement("div");
    preloadTrow.classList.add("trow");
    var preloadInner = document.createElement("div");
    preloadInner.classList.add("edited-center");
    // show spinner until post re-caches/updates
    var preLoad = new Image();
    preLoad.src = loderGifSrc;
    preLoad.style.width = "32px;"
    preLoad.style.height = "32px";
    preLoad.classList.add("bm_load_img");
    preloadInner.appendChild(preLoad);
    preloadTrow.appendChild(preloadInner);
    preloadContainer.appendChild(preloadTrow);
    replaceAfterEdit.appendChild(preloadContainer);
    setTimeout(function () {
      // this reloads the brick DOM after edit/close
      var href = document.location.href.split(/[\/\?&#=]+/g);
      var isDraft = href[3] === "draft";
      var isQueue = href[3] === "queued";
      var draftQueue = isQueue ? "/posts/queue" :
                       isDraft ? "/posts/draft" : "/posts";
      var id = replaceAfterEdit.getAttribute("data-id");
      var idBefore = idsAllArr.indexOf(id) - 1 > -1 ?
                     idsAllArr[idsAllArr.indexOf(id) - 1] : -1;
      var index = idsAllArr.indexOf(id);
      getResponseText(
        "/api/v2/blog/" + name + draftQueue +
        "?limit=1&reblog_info=1&npf=1&" +
        (
          isDraft ?
            idBefore !== -1 ?
            "before_id=" + idBefore :
            ""
          :// sloppy ^ yet functional :)
          isQueue ? // thanks oddly Tumblr draft and queue API
          index !== -1 ?
            "offset=" + index :
            ""
          :
          "id=" + id
        ),
        function (api) {// post to replace
          if(typeof api === "string") {
            api = JSON.parse(api);
          }
          var t = ["text", "image", "chat", "ask",
                   "video", "audio", "link", "quote"];
          var p2r = document.getElementById("post_" + id);
          var me;
          var type;
          // TODO, delete the superflous content/me argument
          // and put this inside the makeBrick function...
          // but only if it breaks...
          // not broken; don't fix it :)
          if (
            typeof api.response !== "undefined" &&
            typeof api.response.posts !== "undefined"
          ) {
            var post = api.response.posts;
            if (
              typeof post[0].trail != "undefined" &&
              typeof post[0].trail[0] !== "undefined" &&
              typeof post[0].trail[0].layout !== "undefined" &&
              typeof post[0].trail[0].layout[0] !== "undefined"
            ) {
              me = post[0].trail[0].layout;
              type = me[0].type;
            }
            if (
              t.indexOf(type) === -1 &&
              typeof post[0].trail != "undefined" &&
              typeof post[0].trail[0] !== "undefined" &&
              typeof post[0].trail[0].content !== "undefined" &&
              typeof post[0].trail[0].content[0] !== "undefined"
            ) {
              me = post[0].trail[0].content;
              type = me[0].type;
            }
            if (
              t.indexOf(type) === -1 &&
              typeof post[0].content !== "undefined" &&
              typeof post[0].content[0] === "undefined" &&
              typeof post[0].trail !== "undefined" &&
              typeof post[0].trail[0] !== "undefined" &&
              typeof post[0].trail[0].content !== "undefined"
            ) {
              me = post[0].trail[0].content;
              type = me[0].type;
            }
            if (
              t.indexOf(type) === -1 &&
              typeof post[0].content !== "undefined" &&
              typeof post[0].content[1] !== "undefined" &&
              typeof post[0].content[1].subtype !== "undefined"
            ) {
              me = post[0].content;
              type = me[1].subtype; // chat, maybe
            }
            if (
              t.indexOf(type) === -1 &&
              typeof post[0].content !== "undefined" &&
              typeof post[0].content[0] !== "undefined"
            ) {
              me = post[0].content;
              type = me[0].type;
            }
            if (
              typeof me !== "undefined" &&
              typeof me[0] !== "undefined" &&
              typeof me[0].subtype !== "undefined" &&
              type !== me[0].subtype &&
              t.indexOf(me[0].subtype) !== -1
            ) {
              type = me[0].subtype;
            }
            var newBrick = makeBrickFromApiPost(
              post[0], type, me, p2r.getAttribute("data-index")
            ); // this third ^ me argument could be expunged
            newBrick.classList.add("laid");
            var lcontent = document.getElementsByClassName(
              "l-content"
            )[0];
            lcontent.replaceChild(newBrick, p2r);
            if (highlightAfterReload) {
              highlightBrick(
                document.getElementById("post_" + id), true
              );
            }
            pluginBuildColumns();
          }
        },
        [
          [
            "Authorization",
            "Bearer " + data.getAttribute("data-api-token")
          ]
        ]
      );
    }, 1000); // delay 1 secode for cache update, perhaps?
  };
  // end the brick reload function

  // this is how we upload photos/images
  var photoUploadAndSubmit = function () { // and repeat asynchronously
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var asDraftCheck = document.getElementById("photos_as_draft");
    var papb = document.getElementById("post_all_photos_button");
    if (!data.classList.contains("photo-upload-in-progress")) {
      data.classList.add("photo-upload-in-progress");
      asDraftCheck.disabled = true;
      papb.disabled = true;
    }
    var asDraft = asDraftCheck.checked;
    var apiKey = data.getAttribute("data-x-tumblr-form-key");
    var brk = document.getElementsByClassName("photo-brick");
    var brick = brk[brk.length - 1];
    brick.classList.add("upload-working");
    brick.scrollIntoView({behavior: "smooth"});
    var i;
    var rich = brick.getElementsByClassName("rich")[0];
    var img = brick.getElementsByClassName("photo-brick-img");
    var uploaded = brick.getElementsByClassName("uploaded");
    var squeakyToy = {};
    var code;
    var formData;
    var upImg;
    var api;
    // upload first or return or repeat
    if (uploaded.length !== img.length) {
      code = img[uploaded.length].firstChild.getAttribute("img-code");
      formData = new FormData();
      formData.append("photo", unreadFile[code]);
      getResponseText(
        {url: "/svc/post/upload_photo?source=post_type_form", post: formData},
        function(re){
          api = JSON.parse(re);
          if (
            typeof api !== "undefined" &&
            typeof api.response !== "undefined" &&
            typeof api.response[0] !== "undefined" &&
            typeof api.response[0].url !== "undefined"
          ) {
            img[uploaded.length].firstChild.src = api.response[0].url;
          }// whether we get the URL or not, the show must go on
          img[uploaded.length].classList.add("uploaded");
          photoUploadAndSubmit();
          // the fallback is to post a straight data url and let
          // Tumblr backend convert it to image/png etc on post
          // but that shouldn't have to happen
        },
        [
          ["X-tumblr-form-key", apiKey],
          ["X-Requested-With", "XMLHttpRequest"]
        ]
      );
      return;
    }
    // AFTER THE UPLOAD, SUMMER HAS GONE...
    brick.style.top = (0 - brick.clientHeight) + "px";
    // this v runs after that ^ runs for each photo to upload
    squeakyToy["post[two]"] = rich.innerHTML;
    squeakyToy["post[three]"] = "";
    // this post is an edit
    squeakyToy.channel_id = name;
    squeakyToy["post[type]"] = "photo";
    squeakyToy["post[state]"] = asDraft ? "1" : "0";
    squeakyToy["post[slug]"] = "";
    squeakyToy["post[date]"] = "";
    squeakyToy["post[publish_on]"] = "";
    if (img.length > 0) {
      var order = [];
      var oneone = "";
      var one = 0;
      for (i = 0; i < img.length; i++) {
        order.push("o" + (i+1));
        if (img[i].classList.contains("row-with-one-img")) {
          oneone += "1"; // new photoset order
          one = 0;
        }
        if (img[i].classList.contains("row-with-two-img")) {
          if (one === 0) {
            oneone += "2"; // new photoset order
          }
          ++one;
          if (one >= 2) {
            one = 0;
          }
        }
        if (img[i].classList.contains("row-with-three-img")) {
          if (one === 0) {
            oneone += "3"; // new photoset order
          }
          ++one;
          if (one >= 3) {
            one = 0;
          }
        }
        squeakyToy["images[o" + (i+1) + "]"] = img[i].firstChild.src;
        squeakyToy["caption[o" + (i+1) + "]"] = "";
      }
      squeakyToy["post[photoset_order]"] = order.join(",");
      squeakyToy["post[photoset_layout]"] = oneone;
    }
    squeakyToy["post[tags]"] = "";
    var tag = brick.getElementsByClassName("tag");
    var tags = [];
    if (tag.length > 0) {
      for (i = 0; i < tag.length; i++) {
        tags.push(tag[i].innerHTML);
      }
      squeakyToy["post[tags]"] = tags.join(",");
    }
    getResponseText( // this is step #2
      "/svc/secure_form_key",
      function(re2) {
        getResponseText(
          { // this is step #3
            url: "/svc/post/update",
            post: JSON.stringify(squeakyToy)
          },
          function(re3) {
            if (!JSON.parse(re3).errors) { // success image posted!
              if (brk.length > 0) {
                brick.parentNode.removeChild(brick);
              }
              if (brk.length > 0) {
                photoUploadAndSubmit();
              } else {
                var blogLink = document.createElement("a");
                var bigHome = svgForType.home.cloneNode(true);
                bigHome.setAttribute("width", "40");
                bigHome.setAttribute("height", "40");
                bigHome.setAttribute("fill", "#555");
                blogLink.appendChild(bigHome);
                blogLink.appendChild(
                  document.createTextNode(
                    "Visit your new posts..."
                  )
                );
                blogLink.id = "return_to_dash_link";
                blogLink.href = "/blog/" + name + (asDraft ? "/drafts" : "");
                data.classList.remove("photo-upload-in-progress");
                asDraftCheck.disabled = false;
                papb.disabled = false;
                document.body.appendChild(blogLink);
              }
            }
          },
          [ // the prev request brought us some puppies :)
            ["X-tumblr-puppies", re2.puppies],
            ["X-tumblr-form-key", apiKey],
            ["X-Requested-With", "XMLHttpRequest"],
            ["Content-Type", "application/json"],
            ["Accept", "application/json, text/javascript, */*; q=0.01"]
          ]
        );
      },
      [
        ["Accept", "application/json, text/javascript, */*; q=0.01"],
        ["X-tumblr-form-key", apiKey],
        ["X-Requested-With", "XMLHttpRequest"]
      ]
    );
  };
  // end photoUploadAndSubmit

  // this edits posts and reblogs posts,
  // and it can even clone posts accidentally :P
  var fetchEditSubmit = function (success) {
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var isDraft = document.getElementById("re-as-draft").checked;
    var action = data.getAttribute("data-current_edit_action");
    var isReblog = action === "reblog";
    var href = document.location.href.split(/[\/\?&#=]+/g);
    var name = href[4];
    var reblogger = data.getAttribute("data-reblog-to-here"); // if any
    var apiKey = data.getAttribute("data-x-tumblr-form-key");
    var id;
    var key;
    var changes;
    var change;
    var brick;
    var editQueue = document.getElementsByClassName("edit-reblog-queue");
    // editReblog queue index
    var qIndex = parseInt(data.getAttribute("data-current_edit_index"));
    if (qIndex === -1) {
      id = data.getAttribute("data-single_edit_id");
      brick = document.getElementById("post_" + id);
      brick.classList.add("edit-reblog-queue");
      if (id === "0") {
        return; // just in case
      }
    } else { // batch  reblogEdit v / ^ single reblogEdit
      id = editQueue[qIndex].getAttribute("data-id");
      brick = document.getElementById("post_" + id);
    }
    var postInEdit = document.getElementById("post_" + id);
    key = postInEdit.getAttribute("data-reblog_key");
    if (apiKey !== "0") {
      getResponseText(// A Reblog/Edit Takes 4 AJAX Steps
        "/svc/post/fetch?" + (
          isReblog ?
          "reblog_id=" + id + "&reblog_key=" + key :
          "post_id=" + id
        ),
        // this is step #1
        function(re1) {
          var fetch = JSON.parse(re1).post;
          var bone = {}; // puppies / fetch / bone :)
          var reblog_post_id = typeof fetch.parent_id !== "undefined" ?
              fetch.parent_id :
          typeof fetch.root_id !== "undefined" ?
              fetch.root_id : id; // this is step #2// this is step #2
          // text chat quote
          if (typeof fetch.one !== "undefined") {
            bone["post[one]"] = fetch.one;
          }
          if (typeof fetch.two !== "undefined") {
            bone["post[two]"] = fetch.two;
          }
          if (typeof fetch.three !== "undefined") {
            bone["post[three]"] = fetch.three;
          }
          if (typeof fetch.source_url !== "undefined") {
            bone["post[source_url]"] = fetch.source_url;
          }
          if (typeof fetch["post[state]"] !== "undefined") {
            bone["post[state]"] = fetch["post[state]"];
          }
          bone["post[type]"] = fetch.type;
          if (isReblog) {
            // this post is a reblog
            bone.channel_id = reblogger;
            bone.reblog = true;
            bone.reblog_key = key;
            bone.reblog_post_id = reblog_post_id;
            bone.context_id = reblogger;
            bone["post[state]"] = isDraft ? "1" : "0";
            bone["post[slug]"] = ""; // bone, slug, and harmony :);
            bone["post[tags]"] = "";
            bone["post[date]"] = "";
            bone["post[publish_on]"] = "";
          } else {
            // this post is an edit
            bone.channel_id = name;
            bone.post_id = id;
            bone.edit_post_id = id;
            bone.reblog = false;
            bone["post[state]"] = fetch.state.toString();
            bone["post[slug]"] = fetch.slug; // lol what? :);
            bone["post[tags]"] = fetch.tags;
            bone["post[date]"] = fetch.date;
            bone["post[publish_on]"] = "";
            if (
              action !== "caption" &&
              action !== "backdate"
            ) {
              // simple edits, less dynamic and easy
              changes = JSON.parse(action);
              if(Array.isArray(changes)) {
                change = changes[qIndex];
              } else {
                change = changes;// turn and face the strange :)
              }
              for (var ch in change) {
                bone[ch] = change[ch];
              }
              var removeWhenDone =
                  typeof changes["post[state]"] !== "undefined" &&
                  changes["post[state]"] === "1" ||
                  changes["post[state]"] === "0" &&
                  href["3"] === "queued" ||
                  changes["post[state]"] === "0" &&
                  href["3"] === "draft" ||
                  changes["post[state]"] === "on.2" ||
                  changes["post[state]"] === "2"
            } else if (action === "caption") {
              var rich2 = document.getElementById(
                "rich_text_caption"
              );
              var b4 = document.getElementById(
                "prepend-caption-option"
              ).checked;
              var ow = document.getElementById(
                "overwrite-caption-option"
              ).checked;
              var af = document.getElementById(
                "append-caption-option"
              ).checked;
              bone["post[two]"] = af ? bone["post[two]"] + rich2.innerHTML:
                                  ow ? rich2.innerHTML:
                                  b4 ? rich2.innerHTML + bone["post[two]"] :
                                       bone["post[two]"] + rich2.innerHTML;//""?
            } else if (action === "backdate") {
              var isOneDay = document.getElementById(
                "bd-one-day"
              ).checked;
              var isTwoDay = document.getElementById(
                "bd-two-day"
              ).checked;
              var isNoDay = document.getElementById(
                "bd-no-day"
              ).checked;
              var isOneTime = document.getElementById(
                "bt-one-time"
              ).checked;
              var isTwoTime = document.getElementById(
                "bt-two-time"
              ).checked;
              var isNoTime = document.getElementById(
                "bt-no-time"
              ).checked;
              var mo1 = document.getElementById("moleft").value - 1;
              var mo2 = document.getElementById("moright").value - 1;
              var dt1 = document.getElementById("dtleft").value;
              var dt2 = document.getElementById("dtright").value;
              var yr1 = document.getElementById("yrleft").value;
              var yr2 = document.getElementById("yrright").value;
              var ho1 = document.getElementById("holeft").value;
              var ho2 = document.getElementById("horight").value;
              var mt1 = document.getElementById("mtleft").value;
              var mt2 = document.getElementById("mtright").value;
              var pm1 = document.getElementById("pmleft").checked;
              var pm2 = document.getElementById("pmright").checked;
              // 1000 because seconds to miliseconds...
              var ts = parseInt(editQueue[qIndex].getAttribute("data-timestamp"));
              var d1 = new Date();
              var d2 = new Date();
              if (isOneDay || isTwoDay) {
                d1.setMonth(mo1);
                d1.setDate(dt1);
                d1.setYear(yr1);
              }
              if (isOneTime || isTwoTime) {
                d1.setMinutes(mt1);
                d1.setHours(ho1 + pm1 ? 12 : 0);
              }
              if (isTwoDay) {
                d2.setMonth(mo2);
                d2.setDate(dt2);
                d2.setYear(yr2);
              }
              if (isTwoTime) {
                d2.setMinutes(mt2);
                d2.setHours(ho2 + pm2 ? 12 : 0);
              }
              var df = (d1.getTime() - d2.getTime()) / (editQueue.length+1);
              var b = new Date();
              b.setTime(d1.getTime() - df * qIndex);
              var dt = [
                "Jan ", "Feb ", "Mar ", "Apr ",
                "May ", "Jun ", "Jul ", "Aug ",
                "Sep ", "Oct ", "Nov ", "Dec "
              ][b.getMonth()] + b.getDate() + ", " + b.getFullYear();
              var h = (b.getHours() < 12 ? b.getHours() : b.getHours()-12);
              if (h === 0) {
                h = 12;
              }
              var time = " " + h + ":" +
                  (b.getMinutes()/100).toFixed(2).split(".")[1] + ":" +
                  (b.getSeconds()/100).toFixed(2).split(".")[1] +
                  (b.getHours() < 12 ? "am" : "pm");
              if (href[3] === "draft") {
                bone["post[publish_on]"] = dt + time;
                bone["post[state]"] = "on.2";
              } else {
                bone["post[date]"] = dt + time;
              }
            }
          }
          // photo posts
          if (typeof fetch.photos !== "undefined") {
            var order = [];
            var oneone = "";
            var photo;
            for (var i = 0; i < fetch.photos.length; i++) {
              photo = fetch.photos[i];
              order.push(photo.id);
              oneone += "1"; // backup photoset order
              bone["images[" + photo.id + "]"] = "";
              bone["caption[" + photo.id + "]"] = "";
            }
            bone["post[photoset_order]"] = order.join(",");
            bone["post[photoset_layout]"] = (
              typeof fetch.photoset_layout !== "undefined"
            ) ?
              fetch.photoset_layout : oneone;
          }
          getResponseText( // this is step #3
            "/svc/secure_form_key",
            function(re2) {
              getResponseText(
                { // this is step #4
                  url: "/svc/post/update",
                  post: JSON.stringify(bone)
                },
                function(re3) {
                  if (!JSON.parse(re3).errors) { // success reblogged!
                    brick.classList.remove("edit-reblog-queue");
                    if (!isReblog) {// assume edited appearance
                      if (
                        removeWhenDone
                      ) {
                        brick.parentNode.removeChild(brick);
                        pluginBuildColumns();
                      } else {
                        reloadBrick(brick);
                      }
                    } else {
                      reblogAnimation(id);
                    }
                    success(success);
                  } else {
                    brick.classList.remove("edit-reblog-queue");
                    success(success);// repeat for next
                  }
                },
                [ // the prev request brought us some puppies :)
                  ["X-tumblr-puppies", re2.puppies],
                  ["X-tumblr-form-key", apiKey],
                  ["X-Requested-With", "XMLHttpRequest"],
                  ["Content-Type", "application/json"],
                  ["Accept", "application/json, text/javascript, */*; q=0.01"]
                ]
              );
            },
            [
              ["Accept", "application/json, text/javascript, */*; q=0.01"],
              ["X-tumblr-form-key", apiKey],
              ["X-Requested-With", "XMLHttpRequest"]
            ]
          );
        },
        [
          ["Accept", "application/json, text/javascript, */*; q=0.01"],
          ["X-tumblr-form-key", apiKey],
          ["X-Requested-With", "XMLHttpRequest"]
        ]
      );
    }
  };
  // end the single fetchEdit reblog/edit

  // this function runs once v ^ then this goes repeatedly
  var fetchEditSubmitMulti = function () {
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var highlighted = document.getElementsByClassName("highlighted");
    var qIndex = -1;
    for (var i = 0; i < highlighted.length; i++) {
      if (
        this.getAttribute("data-edit_action") === "reblog" &&
        highlighted[i].classList.contains("private")
      ) {
        continue;
      }
      qIndex++;
      highlighted[i].classList.add("edit-reblog-queue");
    }
    data.setAttribute("data-current_edit_index", qIndex);
    data.setAttribute(
      "data-current_edit_action",
      this.getAttribute("data-edit_action")
    );
    fetchEditSubmit(function(success){
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var qIndex = parseInt(data.getAttribute("data-current_edit_index"));
      qIndex--;
      if (qIndex >= 0) {
        data.setAttribute("data-current_edit_index", qIndex);
        fetchEditSubmit(success);
        // repeat
      }
    });
  };
  // end edit/reblogging stuff

  // extra chrome buttons and widgets, and nav-links
  var mpe = document.createElement("div");
  var mpeIcon = new Image();
  mpeIcon.width = 18;
  mpeIcon.height = 16;
  mpeIcon.src = // PNG is the monkey emoji from windows 8.1
    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC' +
    'AAAAAcCAYAAAAAwr0iAAAABmJLR0QA/wD/AP+gvaeTAAAACX' +
    'BIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AUIEy8cVCgtoA' +
    'AAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTV' +
    'BkLmUHAAAGt0lEQVRIx62Xa2wU1xXHf/fO7MO7awMOdkyIU1' +
    'roIynhUbWGEh4BVB4NKDWvuGkaCkHQVHGkkGLvAkXFIpm1oa' +
    'QNBaXIxRAItagbmkARKCpQIkxJoUrSDy2VEESkYIgxNvauvb' +
    'Mzc/rBNjH4RSTOt7mPc/73f849/zuKPqzWmhe28RelVPBlD/' +
    '2QgbPHw3xjVnTHh9wj071N/Dn+s3CbCpZk0FI5UK4/nC2fhQ' +
    'dIw4qINFbVxF/8Tue6E9aiewfgT/HiLhPekDSBdVqpW2MKEP' +
    'SYCDefA/ib9ZQxObbv3gA4Fi9ifnQLAFs3rFXipEK+rBzyCn' +
    '6A63oACAo/KbKlfkWtVSjAi/csBVOj1VyMj+VQfGnOg8a1X2' +
    'aFfbu/PGYC949bSOQrBYhj39okdLCiZNAXCbaz/BfdvlXXgW' +
    'PxokEaryFDkngChHMZPGIM/ztzhAy/RrqsdTFOtapI8fTonr' +
    'P9BT5tzWVc7AAAr1f8ytB46oWSVU5nWrssnJMN6vrnRxVEXJ' +
    'Q27/RZB/LSuNjB6qPxp5kW3dvv6c9as7SJGzmnR84AFcj1Lr' +
    '8HXoPu81Io1S24oPAw3h0XO1hdVb7WnBbdS61V2GvgyooyAN' +
    'L4JyUJ3/iSd756mPffbRr3qofxxG0RUwRsm8BhUCkPLT05VA' +
    'gad8pR6+lNg+XaDNng0xNi+zlhLegRwLKSdQA4+GpctL6ihv' +
    '6wIHZwQFKFd6eVP3YLwPvWAibH/tgyKVYzu0Vlrb+psk8p5B' +
    'LwiaDq7/D79TA3X86Ruv21xtxigMmxGo5ZRT2C+G3Fpu8bOK' +
    'GkimwOqtTbALOiO58VjJG3AEyK1XA83u5genSPNTNa9VhB7O' +
    'BD42IHhtWrvFKFdONCIX6FV37CWrAYYGqsukcAGZIYrEA3M9' +
    'B/jSG+zvFMaVxzWwoej3Z38E78+SEZJGb3lmMDN2DgFh62fp' +
    'Lf3r6718M549EjHjr5gHwyNFOaMjrH3whEd+j+qjdEImziDO' +
    '9tXiEI+skgbc8BTIjtvw3E9ooNVPx83tWkCp8FVQgy/7Xy1z' +
    'TA7pUFzf0CsAnm2gTGgvRYlJ3dMUhyVa1VuEKWtYMAOBBfzv' +
    'KSte1APe/HIOdy5fLakfLPnN9VvNq3GHUxr4sU0BsIhYQ03u' +
    'aTw+cXv1P+fB7A3Oh2AE5ahUxfvffqVZW/UuMNVVCyhG19O+' +
    '20v8SXj/fTdmqgXMfrB69CsFUAm8AxQb2ukI+mRfdeADhq/Y' +
    'hpsbf4a/yZ4z7sKQkiI9L4z5v9EyCdrbcVVFLh3dcXEz5JiZ' +
    '/UVFsFpnro0yeshb9JqKxj06K/rwNIkLkxTy5NbFUZq/2klv' +
    'XLwKH4svEG7imT9Acm9p6gJNeAur+/faq9ZpSHxiZQ7eArTR' +
    'K6NCdWKSetefUe+sZEu+Zr+m6VzMCpmxLdtwXUprtZLyjVUR' +
    'sSoLUoSHLRABr9AAkVed9PasSrocqA7t+RxsAhU5pMgFbCV9' +
    'L46d6YeidDAR7GIx7aBzBI6o8D5EjdhNsAVJaX9VQBKQ9Nig' +
    'AALWpAwlYB94u8A1xMmtWAs3Uq326/VoYfREKSmGUesRYzM7' +
    'arXThK24VjS/mmoeO9o1kJssw20tMVQpPK1gAZJC74JfUPYH' +
    'znw6QvNhRCSgXrw7T8YXZ0h93BqqdxlY3/72Zn8APW8pyQSn' +
    'w3JIlhzfLxY4LO85PKVOKN9ZGmUWWfAwhJS1rjtTqYOJhnTJ' +
    'xWA3dSXwy0EVy/zb+2EfZ1KKNZYABLS9e/bbY/LhfOhRvzXX' +
    'wPGzj5A6WhzUN7HloE9ZGHrs3zPt3aUYxtCkm3EaRJZVc+4F' +
    '1811H+3QqZ3uvVxPG/YJeNKo4/kw5LIlfhLrLxf3rhlW8p83' +
    'B8yUxTGnfYBK5pvBhws7OCr+tc75wa3VBS8tN/hX8t5uH40l' +
    'GuNIxWyFdBofEGfXv14SsfWHNWuhhrBDXfwDXuTElEbq52MA' +
    'pBpTTuGA+DpIpE/22MxTRwy3zYg8/rRxY+W/rK8a4byza+mT' +
    'XZPTT5pDXvCaf1qeEG7miF5AH5HW00CFAQO/jxkfIlL2V4za' +
    'cdfGMc5RsuqJBPbFchuSbpfBNnIigczIaEytw6O1r1FoCpca' +
    'ua1H037gx+IL4ikuG+V2xKeh3gBmm9qBBXUA3AdZAmkDMAx+' +
    'NF6vHSqsvAZqrE2PrZplEGTmSwXHMypPnBgdLwqMYLeGidVJ' +
    'EPZ2TtrIZdn2tB2cZd31i3avF/rI3bia1a3vFbVhjSuE8q5J' +
    'spgmdNnMsGju64RoaNP2mr4PnvRd9s6iq9nep3N2Zt3M7/Ad' +
    'nvxY2Pj+AwAAAAAElFTkSuQmCC';
  mpe.id = "mpe_title";
  mpe.appendChild(mpeIcon);
  mpe.setAttribute("title", "Mass Post Editor Features 4");
  en = document.getElementsByClassName("editor_navigation")[0];
  var selectAllFrag = document.createDocumentFragment();
  selectAllFrag.appendChild(svgForType.select.cloneNode(true));
  var selectAllSpan = document.createElement("span");
  selectAllSpan.appendChild(document.createTextNode("Select 100"));
  selectAllFrag.appendChild(selectAllSpan);
  var selectAll_chrome = newChromeButton("select-all", selectAllFrag, false);
  var selectByFrag = document.createDocumentFragment();
  selectByFrag.appendChild(svgForType.select.cloneNode(true));
  selectByFrag.appendChild(document.createTextNode("Select By"));
  var selectBy_chrome = newChromeButton("select-by", selectByFrag, true);
  var selectBy_widget = selectBy_chrome.getElementsByClassName(
    "widget"
  )[0];
  selectBy_widget.style.top = "50px";
  selectBy_widget.style.right = "90px";
  // this shows the select-by widget and populates it with tags/types
  selectBy_chrome.getElementsByTagName("input")[0].
    addEventListener("change", populateSelectByWidget);
  var pauseFrag1 = document.createDocumentFragment();
  var playSpan = document.createElement("span");
  playSpan.classList.add("play");
  playSpan.innerHTML = "&#x25B6;";
  var pauseSpan = document.createElement("span");
  pauseSpan.classList.add("pause");
  pauseSpan.innerHTML = "&#x2590;&#x2590;";
  pauseFrag1.appendChild(playSpan);
  pauseFrag1.appendChild(pauseSpan);
  var pause_chrome = newChromeButton(
    "pause", pauseFrag1, false
  );
  var pauseFrag2 = document.createDocumentFragment();
  var canvas = document.createElement("canvas");
  canvas.id = "status";
  canvas.width = 72;
  canvas.height = 15;
  var pLoaded = document.createElement("span");
  pLoaded.id = "p_loaded";
  pLoaded.appendChild(
    document.createTextNode("x0")
  );
  pauseFrag2.appendChild(canvas);
  pauseFrag2.appendChild(pLoaded);
  var ajaxInfo_chrome = newChromeButton(
    "ajax-info", pauseFrag2, false
  );
  // gutter control (easy)
  var gutterFrag = document.createDocumentFragment();
  var gutterInputCheck = document.createElement("input");
  gutterInputCheck.type = "checkbox";
  gutterInputCheck.checked = false;
  var gutterInputNumber = document.createElement("input");
  gutterInputNumber.type = "number";
  gutterInputNumber.value = 6;
  gutterInputCheck.id = "gutter-checkbox";
  var gutterLabel = document.createTextNode("Gutter");
  var newGutterChange = function () {
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var newGutter = gutterInputNumber.value;
    if (gutterInputCheck.checked) {
      data.setAttribute("data-column_gutter", newGutter);
    } else {
      data.setAttribute("data-column_gutter", "6");
    }
    pluginBuildColumns();
  };
  gutterInputCheck.addEventListener("change", newGutterChange);
  gutterInputNumber.addEventListener("change", newGutterChange);
  gutterFrag.appendChild(gutterInputCheck);
  gutterFrag.appendChild(gutterLabel);
  gutterFrag.appendChild(gutterInputNumber);
  gutterInputNumber.addEventListener("click", function(e) {
    e.stopPropagation();
    e.preventDefault();
    e.cancelBubble = true;
  });
  gutterInputCheck.addEventListener("click", function(e) {
    this.checked = !this.checked;
  });
  var gutter_chrome = newChromeButton(
    "gutter", gutterFrag, false
  );
  gutter_chrome.getElementsByTagName("button")[0].
    addEventListener("click", function() {
    var b = this.getElementsByTagName("input")[0];
    b.checked = !b.checked;
    newGutterChange();
  });
  // view captions
  var hoverSpan = document.createElement("span");
  var hoverLabel = document.createElement("label");
  var hoverCheck = document.createElement("input");
  hoverCheck.type = "checkbox";
  hoverCheck.id = "hover-only";
  hoverCheck.addEventListener("change", function () {
    var lcontent = document.getElementsByClassName("l-content")[0];
    if (this.checked) {
      lcontent.classList.remove("hoverless");
      setCookie("view_hover", "on", 99);
    } else {
      lcontent.classList.add("hoverless");
      setCookie("view_hover", "", -1);
    }
  });
  hoverLabel.appendChild(
    svgForType.see.cloneNode(true)
  );
  hoverLabel.appendChild(
    document.createTextNode("+Hover")
  );
  hoverLabel.setAttribute("for", "hover-only");
  hoverSpan.appendChild(hoverCheck);
  hoverSpan.appendChild(hoverLabel);
  var captionsFrag = document.createDocumentFragment();
  captionsFrag.appendChild(svgForType.see.cloneNode(true));
  captionsFrag.appendChild(svgForType.caption.cloneNode(true));
  var captions_chrome = newChromeButton(
    "view-captions", captionsFrag, false
  );
  captions_chrome.getElementsByTagName(
    "button"
  )[0].addEventListener("click", function () {
    var lcontent = document.getElementsByClassName("l-content")[0];
    if (lcontent.classList.contains("with-captions")) {
      lcontent.classList.remove("with-captions");
      setCookie("view_captions", "", -1);
      this.removeAttribute("style");
      for (i = 0; i < 2; i++) {
        this.getElementsByTagName("svg")[i].setAttribute("fill", "#fff");
      }
    } else {
      lcontent.classList.add("with-captions");
      setCookie("view_captions", "on", 99);
      this.style.color = "rgba(0,65,100,1)";
      this.children[0].setAttribute("fill", "rgba(0,65,100,1");
      this.style.boxShadow = "inset 0 3px 2px 2px rgba(0,0,0,0.4)";
      for (i = 0; i < 2; i++) {
        this.getElementsByTagName("svg")[i].setAttribute(
		  "fill", "rgba(0,65,100,1)"
		);
      }
    }
  });
  // editlinksReblogLikeButton
  var linksFrag = document.createDocumentFragment();
  linksFrag.appendChild(svgForType.see.cloneNode(true));
  linksFrag.appendChild(svgForType.notes.cloneNode(true));
  linksFrag.appendChild(svgForType["reblog-self"].cloneNode(true));
  linksFrag.appendChild(svgForType.edit.cloneNode(true));
  var links_chrome = newChromeButton(
    "view-links", linksFrag, false
  );
  links_chrome.getElementsByTagName(
    "button"
  )[0].addEventListener("click", function () {
    var i;
    var lcontent = document.getElementsByClassName("l-content")[0];
    if (lcontent.classList.contains("with-links")) {
      for (i = 0; i < 4; i++) {
        this.getElementsByTagName("svg")[i].setAttribute("fill", "#fff");
      }
      this.removeAttribute("style");
      lcontent.classList.remove("with-links");
      setCookie("view_links", "", -1);
    } else {
      for (i = 0; i < 4; i++) {
        this.getElementsByTagName("svg")[i].setAttribute("fill", "rgba(0,65,100,1)");
      }
      this.style.boxShadow = "inset 0 3px 2px 2px rgba(0,0,0,0.4)";
      lcontent.classList.add("with-links");
      setCookie("view_links", "on", 99);
    }
  });
  // pause buttons
  pause_chrome.getElementsByTagName(
    "button"
  )[0].classList.add("playing");
  pause_chrome.getElementsByTagName(
    "button"
  )[0].addEventListener("click", function () {
    if (this.classList.contains("done")) {
      return;
    }
    var b = this.classList.contains("playing");
    this.classList.add(b?"paused":"playing");
    this.classList.remove(!b?"paused":"playing");
  });
  ajaxInfo_chrome.getElementsByTagName(
    "button"
  )[0].addEventListener("click", function () {
    var pause = document.getElementById(
      "pause_button"
    );
    if (pause.classList.contains("done")) {
      return;
    }
    var b = pause.classList.contains("playing");
    pause.classList.add(b?"paused":"playing");
    pause.classList.remove(!b?"paused":"playing");
  });
  ajaxInfo_chrome.setAttribute(
    "title", "Time Till Next Page - Posts Loaded"
  );
  pause_chrome.setAttribute("title", "Pause Page Loading");
  selectAll_chrome.getElementsByTagName("button")[0].
    addEventListener(
    "click",
    function () {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      var idsAllArr = JSON.parse(
        data.getAttribute("data-ids_all_arr")
      );
      var alreadyHidden = data.classList.contains(
        "some-posts-already-hidden"
      );
      var visibleIdsAllArr = JSON.parse(
        data.getAttribute("data-visible_ids_all_arr")
      );
      var needle = parseFloat(
        data.getAttribute("data-select-all_needle")
      );
      var id;
      var hlBrick;
      var unSelctBrick;
      var firstNeedle = needle;
      var i;
      var limit = 100; // tumblr limit; not mine
      var selectedCount = 0;
      unSelctBrick = document.getElementsByClassName("highlighted");
      while (unSelctBrick.length > 0 ) {
        highlightBrick(unSelctBrick[0], 0);
      }
      if (alreadyHidden) { // select from visible
        while(
          needle < visibleIdsAllArr.length &&
          needle < firstNeedle + limit
        ) {
          id = visibleIdsAllArr[needle];
          hlBrick = document.getElementById("post_" + id);
          if (hlBrick !== null) {
            highlightBrick(hlBrick, 1);
            selectedCount++;
          }
          needle++;
        }
      } else { // select from all
        while(
          needle < idsAllArr.length &&
          needle < firstNeedle + limit
        ) {
          id = idsAllArr[needle];
          hlBrick = document.getElementById("post_" + id);
          if (hlBrick !== null) {
            highlightBrick(hlBrick, 1);
            selectedCount++;
          }
          needle++;
        }
      }
      this.getElementsByTagName("span")[0].innerHTML = "100 More";
      if (selectedCount < limit) {
        needle = 0;
        this.getElementsByTagName("span")[0].innerHTML = "Select 100";
      }
      data.setAttribute("data-select-all_needle", needle);
    }
  );
  document.getElementById(
    "delete_posts"
  ).parentNode.classList.add("remove-in-third-party-mode");
  document.getElementById(
    "delete_posts"
  );
  document.getElementById(
    "remove_tags"
  ).parentNode.classList.add("remove-in-third-party-mode");
  document.getElementById(
    "add_tags"
  ).parentNode.classList.add("remove-in-third-party-mode");
  var href = document.location.href.split(/[\/\?&#=]+/g);
  var name = href[4];
  links_chrome.setAttribute(
    "title",
    href[5] !== "follows" && href[5] !== "following" ?
    "Links: See tags. View Posts. Edit posts." :
    "Links: Follow/Unfollow URL Peepr ect."
  );
  captions_chrome.setAttribute("title", "See photo captions.");
  selectBy_chrome.setAttribute("title", "Select posts by tag.");
  ajaxInfo_chrome.setAttribute("title", "Pause posts loading.");
  selectBy_chrome.setAttribute("title", "Pause posts loading.");
  selectAll_chrome.setAttribute("title", "Select all posts.");
  gutter_chrome.setAttribute("title", "Create bigger gutters.");
  // this is the make private button
  var privateFrag = document.createDocumentFragment();
  privateFrag.appendChild(svgForType.private.cloneNode(true));
  var privateSpan = document.createElement("span");
  privateSpan.appendChild(document.createTextNode("Private"));
  privateFrag.appendChild(privateSpan);
  var private_chrome = newChromeButton("private", privateFrag, false);
  private_chrome.classList.add("remove-in-third-party-mode");
  private_chrome.getElementsByTagName(
    "button"
  )[0].addEventListener("click", fetchEditSubmitMulti);
  private_chrome.getElementsByTagName("button")[0].
    disabled = true;
  private_chrome.getElementsByTagName("button")[0].
    classList.add("disable-when-none-selected");
  private_chrome.classList.add("remove-in-third-party-mode");
  private_chrome.classList.add("remove-in-drafts-queue-mode");
  private_chrome.setAttribute("title", "Make selected private/unprivate.");
  // append chromeButtons
  var unselectFrag = document.createDocumentFragment();
  var unselectIcon = svgForType.unselect.cloneNode(true);
  unselectIcon.setAttribute("width", "15");
  unselectIcon.setAttribute("height", "15");
  unselectFrag.appendChild(unselectIcon);
  var unselectSpan = document.createElement("span");
  unselectSpan.classList.add("chrome_button");
  unselectSpan.appendChild(document.createTextNode("UnSelect"));
  unselectFrag.appendChild(unselectSpan);
  var cbr = document.createElement("span");
  cbr.classList.add("chrome_button_right");
  unselectFrag.appendChild(cbr);
  var unslect = document.getElementById("unselect")
  unslect.innerHTML = "";
  unslect.appendChild(unselectFrag);
  var unPnt = unslect.parentNode;
  var rtPnt = document.getElementById("remove_tags").parentNode;
  var dlPnt = document.getElementById("delete_posts").parentNode;
  // editor navigation
  var remTag = document.getElementById("remove_tags").children[0];
  remTag.innerHTML = "";
  var remFrag = document.createDocumentFragment();
  var remSymbol = document.createElement("h2");
  remSymbol.appendChild(document.createTextNode("-"));
  var addTag = document.getElementById("add_tags").children[0];
  addTag.innerHTML = "";
  remFrag.appendChild(remSymbol);
  remFrag.appendChild(document.createTextNode("Tags"));
  var addSymbol = document.createElement("h2");
  var addFrag = document.createDocumentFragment();
  addSymbol.appendChild(document.createTextNode("+"));
  addFrag.appendChild(addSymbol);
  var captionFrag = document.createDocumentFragment();
  captionFrag.appendChild(addSymbol.cloneNode(true));
  captionFrag.appendChild(document.createTextNode("Caption"));
  var caption_chrome = newChromeButton("add-caption", captionFrag, true);
  caption_chrome.classList.add("remove-in-third-party-mode");
  var caption_widget = caption_chrome.getElementsByClassName("widget")[0];
  var caption_check = caption_chrome.getElementsByTagName("input")[0];
  caption_check.classList.add("disable-when-none-selected");
  caption_check.disabled = true;
  caption_chrome.setAttribute("title", "Caption selected posts.");
  // this part is all add caption widget
  var rich2 = document.createElement("div");
  rich2.setAttribute("title", "caption");
  rich2.id = "rich_text_caption";
  rich2.contentEditable = true;
  rich2.designMode = "on";
  rich2.classList.add("rich");
  appendRichButtons(caption_widget, rich2, caption_widget);
  var captionTitle = document.createElement("h2");
  captionTitle.appendChild(
    document.createTextNode("Caption Posts")
  );
  var captionSubtitle = document.createElement("div");
  captionSubtitle.appendChild(
    document.createTextNode("Image,Video,Audio,Quote,Link,Chat, and Text")
  );
  caption_widget.appendChild(captionTitle);
  caption_widget.appendChild(captionSubtitle);
  caption_widget.appendChild(rich2);
  var pendContainer = document.createElement("div");
  pendContainer.classList.add("pend-container");
  var pend1 = document.createElement("div");
  var pend2 = document.createElement("div");
  var pend3 = document.createElement("div");
  var b4Radio = document.createElement("input");
  b4Radio.id = "prepend-caption-option";
  var b4Label = document.createElement("label");
  b4Label.setAttribute("for", "prepend-caption-option");
  b4Label.appendChild(document.createTextNode("Prepend"));
  var owRadio = document.createElement("input");
  owRadio.id = "overwrite-caption-option";
  var owLabel = document.createElement("label");
  owLabel.setAttribute("for", "overwrite-caption-option");
  owLabel.appendChild(document.createTextNode("Overwrite"));
  var owWarn = document.createElement("span");
  owWarn.classList.add("robot-warning");
  owWarn.appendChild(
    document.createTextNode(
      "This will erase and replace the whole text body of any post."
    )
  );
  var afRadio = document.createElement("input");
  afRadio.id = "append-caption-option";
  var afLabel = document.createElement("label");
  afLabel.setAttribute("for", "append-caption-option");
  afLabel.appendChild(document.createTextNode("Append"));
  b4Radio.type = "radio";
  b4Radio.name = "pend";
  b4Radio.classList.add("pend");
  pend1.appendChild(b4Radio);
  pend1.appendChild(b4Label);
  owRadio.type = "radio";
  owRadio.name = "pend";
  owRadio.classList.add("pend");
  pend2.appendChild(owRadio);
  pend2.appendChild(owLabel);
  pend2.appendChild(owWarn);
  afRadio.type = "radio";
  afRadio.name = "pend";
  afRadio.classList.add("pend");
  afRadio.checked = true;
  pend3.appendChild(afRadio);
  pend3.appendChild(afLabel);
  pendContainer.appendChild(pend1);
  pendContainer.appendChild(pend2);
  pendContainer.appendChild(pend3);
  caption_widget.appendChild(pendContainer);
  var capButt = butt("Add Caption");
  capButt.id = "add-caption_button2";
  capButt.setAttribute("data-edit_action", "caption");
  capButt.style.top = "268px";
  capButt.style.right = "9px";
  capButt.style.padding = "0 7px";
  capButt.addEventListener("click", fetchEditSubmitMulti);
  caption_widget.appendChild(capButt);
  var cancelCaption = butt("Cancel3");
  cancelCaption.addEventListener("click", function () {
    document.getElementById("add-caption").checked = false;
  });
  cancelCaption.style.top = "238px";
  cancelCaption.style.right = "9px";
  cancelCaption.style.padding = "0 7px";
  cancelCaption.setAttribute("title", "Close widget");
  caption_widget.appendChild(cancelCaption);
  // this part is backdate widget
  var scheduleInstead = href[3] === "draft";
  var backdateFrag = document.createDocumentFragment();
  backdateFrag.appendChild(
    svgForType.clock.cloneNode(true)
  );
  backdateFrag.appendChild(
    document.createTextNode(scheduleInstead ? "Schedule" : "BackDate")
  );
  var backdate_chrome = newChromeButton(
    "backdate", backdateFrag, true
  );
  backdate_chrome.classList.add("remove-in-third-party-mode");
  var backdate_widget = backdate_chrome.getElementsByClassName("widget")[0];
  var backdate_check = backdate_chrome.getElementsByTagName("input")[0];
  backdate_check.addEventListener("change", function () {
    if (!this.checked) {
      return;
    }
    var hl = document.getElementsByClassName("highlighted");
    var d1 = new Date(
      parseInt(
        hl[0].getAttribute("data-timestamp")
      ) * 1000
    );
    var d2 = new Date(
      parseInt(
        hl[hl.length-1].getAttribute("data-timestamp")
      ) * 1000
    );
    var inp = new Event("input");
    document.getElementById("moleft").value = d1.getMonth() + 1;
    document.getElementById("moright").value = d2.getMonth() + 1;
    document.getElementById("dtleft").value = d1.getDate();
    document.getElementById("dtright").value = d2.getDate();
    document.getElementById("yrleft").value = d1.getFullYear();
    document.getElementById("yrright").value = d2.getFullYear();
    document.getElementById("holeft").value = d1.getHours() >= 12 ?
      d1.getHours() - 12 : d1.getHours();
    document.getElementById("horight").value = d2.getHours()>= 12 ?
      d2.getHours() - 12 : d2.getHours();
    document.getElementById("mtleft").value = d1.getMinutes();
    document.getElementById("mtright").value = d2.getMinutes();
    document.getElementById("pmleft").checked = d1.getHours() >= 12;
    document.getElementById("pmright").checked = d2.getHours() >= 12;
    document.getElementById("moleft").dispatchEvent(inp);
    document.getElementById("moright").dispatchEvent(inp);
    document.getElementById("mtleft").dispatchEvent(inp);
    document.getElementById("mtright").dispatchEvent(inp);
  });
  backdate_check.classList.add("disable-when-none-selected");
  backdate_check.disabled = true;
  backdate_chrome.setAttribute(
    "title", scheduleInstead ?
    "Schedule up to 200 posts." :
    "Backdate selected posts."
  );
  var bdBody = document.createElement("div");
  bdBody.id = "backdate-body";
  var backdateTitle = document.createElement("h2");
  var backdateRules = document.createElement("div");
  backdateTitle.appendChild(
    document.createTextNode(
      scheduleInstead ?
      "Schedule Month/Date/Year":
      "BackDate Month/Date/Year"
    )
  );
  backdateRules.appendChild(
    document.createTextNode(" ")
  );
  bdBody.appendChild(backdateTitle);
  bdBody.appendChild(backdateRules);
  // I don't like new-fangled type="date" inputs that throw NaN sometimes
  var dateByNumbers = function(id){ // I'm old fashioned like Safari
    var d = new Date();
    var container = document.createElement("div");
    container.classList.add("date-input-bunch");
    var day = document.createElement("label");
    var thday = [
      "Sun ", "Mon ", "Tue ", "Wed ",
      "Thu ", "Fri ", "Sat "
    ];
    day.innerText = thday[d.getDay()];
    var mo = document.createElement("input");
    mo.type = "number";
    mo.value = d.getMonth() + 1;
    mo.id = "mo" + id;
    mo.classList.add("linput");
    var moLabel = document.createElement("label");
    moLabel.classList.add("rlabel");
    moLabel.setAttribute("for", "mo" + id);
    var month = [0,
      "Jan", "Feb", "Mar", "Apr",
      "May", "Jun", "Jul", "Aug",
      "Sep", "Oct", "Nov", "Dec"
    ];
    moLabel.innerText = month[d.getMonth()+1];
    var dt = document.createElement("input");
    dt.type = "number";
    dt.value = d.getDate();
    dt.id = "dt" + id;
    var dtLabel = document.createElement("label");
    dtLabel.setAttribute("for", "dt" + id);
    dtLabel.classList.add("narrow");
    dt.classList.add("linput");
    dtLabel.classList.add("rlabel");
    var px = function (b) {
      var px = ["th", "st", "nd", "rd", "th", "th",
                "th", "th", "th", "th", "th"][b % 10];
      if (b === 12 || b === 11) {
        px = "th ";
      }
      return px;
    };
    var yr = document.createElement("input");
    yr.type = "number";
    yr.id = "yr" + id;
    yr.value = d.getFullYear();
    dtLabel.innerText = px(d.getDate());
    var inputs = function () {
      if (this === mo && mo.value < 1) {
        mo.value = 12;
      }
      if (this === mo && mo.value > 12) {
        mo.value = 1;
      }
      var s = mo.value.toString();
      if (
        this === mo &&
        (
          s.length >= 2 && s.charAt(0) === "1" ||
          s.length >= 1 && s.charAt(0) !== "1"
        )
      ) {
        dt.focus();
      }
      s = dt.value.toString();
      if (
        this === dt &&
        (
          s.length >= 2 && s.charAt(0) === "1" ||
          s.length >= 1 && s.charAt(0) !== "1" &&
          s.charAt(0) !== "2" && s.charAt(0) !== "3"
        )
      ) {
        yr.focus();
      }
      var newD = new Date(yr.value, mo.value, 0);
      if (this === dt && dt.value <= 0) {
        dt.value = newD.getDate();
      }
      if (this === dt && dt.value > newD.getDate()) {
        dt.value = 1;
      }
      if (this === yr && dt.value < 0) {
        dt.value = 1;
      }
      if (this === yr && dt.value > newD.getDate()) {
        dt.value = newD.getDate();
      }
      newD = new Date(yr.value, mo.value-1, dt.value);
      day.innerText = thday[newD.getDay()];
      moLabel.innerText = month[mo.value];
      dtLabel.innerText = px(dt.value);
    };
    mo.addEventListener("input", inputs);
    dt.addEventListener("input", inputs);
    yr.addEventListener("input", inputs);
    var thisSelect = function () {
      this.select();
    };
    mo.addEventListener("focus", thisSelect);
    dt.addEventListener("focus", thisSelect);
    yr.addEventListener("focus", thisSelect);
    container.appendChild(mo);
    container.appendChild(moLabel);
    container.appendChild(dt);
    container.appendChild(dtLabel);
    container.appendChild(yr);
    container.appendChild(day);
    return container;
  };
  var bddate1 = dateByNumbers("left");
  var bddate2 = dateByNumbers("right");
  var bdrowDate = document.createElement("div");
  var bdinput1 = document.createElement("input");
  var bdinput2 = document.createElement("input");
  var bdinput3 = document.createElement("input");
  var bdlabel1 = document.createElement("label");
  var bdlabel2 = document.createElement("label");
  var bdlabel3 = document.createElement("label");
  bdinput1.id = "bd-no-day";
  bdinput2.id = "bd-one-day";
  bdinput3.id = "bd-two-day";
  bdinput2.checked = true;
  bdinput1.name = "bd-date-option";
  bdinput2.name = "bd-date-option";
  bdinput3.name = "bd-date-option";
  bdlabel1.setAttribute("for", "bd-no-day");
  bdlabel2.setAttribute("for", "bd-one-day");
  bdlabel3.setAttribute("for", "bd-two-day");
  bdlabel1.appendChild(
    document.createTextNode("Keep Same Date")
  );
  bdlabel2.appendChild(
    document.createTextNode("All Same Date")
  );
  bdlabel3.appendChild(
    document.createTextNode("Between Dates")
  );
  bdinput1.type = "radio";
  bdinput2.type = "radio";
  bdinput3.type = "radio";
  bdrowDate.appendChild(bdinput2);
  bdrowDate.appendChild(bdlabel2);
  bdrowDate.appendChild(bdinput3);
  bdrowDate.appendChild(bdlabel3);
  bdrowDate.appendChild(bdinput1);
  bdrowDate.appendChild(bdlabel1);
  bdrowDate.appendChild(bddate1);
  bdrowDate.appendChild(bddate2);
  bdBody.appendChild(bdrowDate);
  backdateTitle = document.createElement("h2");
  backdateRules = document.createElement("div");
  backdateTitle.appendChild(
    document.createTextNode(
      scheduleInstead ?
      "Schedule Hour:Minute":
      "BackDate Hour:Minute"
    )
  );
  backdateRules.appendChild(
    document.createTextNode(" ")
  );
  bdBody.appendChild(backdateTitle);
  bdBody.appendChild(backdateRules);
  var btrowTime = document.createElement("div");
  var btinput1 = document.createElement("input");
  var btinput2 = document.createElement("input");
  var btinput3 = document.createElement("input");
  var btlabel1 = document.createElement("label");
  var btlabel2 = document.createElement("label");
  var btlabel3 = document.createElement("label");
  btinput1.id = "bt-no-time";
  btinput2.id = "bt-one-time";
  btinput3.id = "bt-two-time";
  btinput1.checked = true;
  btinput1.name = "bt-time-option";
  btinput2.name = "bt-time-option";
  btinput3.name = "bt-time-option";
  btlabel1.setAttribute("for", "bt-no-time");
  btlabel2.setAttribute("for", "bt-one-time");
  btlabel3.setAttribute("for", "bt-two-time");
  btlabel1.appendChild(
    document.createTextNode("Keep Same Time")
  );
  btlabel2.appendChild(
    document.createTextNode("All Same Time")
  );
  btlabel3.appendChild(
    document.createTextNode("Between Times")
  );
  btinput1.type = "radio";
  btinput2.type = "radio";
  btinput3.type = "radio";
  btrowTime.appendChild(btinput2);
  btrowTime.appendChild(btlabel2);
  btrowTime.appendChild(btinput3);
  btrowTime.appendChild(btlabel3);
  btrowTime.appendChild(btinput1);
  btrowTime.appendChild(btlabel1);
  var timeByNumbers = function(id){
    var d = new Date();
    var container = document.createElement("div");
    container.classList.add("date-input-bunch");
    var ho = document.createElement("input");
    ho.type = "number";
    ho.value = d.getHours();
    ho.id = "ho" + id;
    ho.classList.add("linput");
    var hoLabel = document.createElement("label");
    hoLabel.classList.add("rlabel");
    hoLabel.setAttribute("for", "ho" + id);
    hoLabel.innerText = ":"
    hoLabel.classList.add("narrow");
    var mt = document.createElement("input");
    mt.type = "number";
    mt.value = d.getMinutes();
    mt.id = "mt" + id;
    mt.classList.add("linput");
    var pm = document.createElement("input");
    pm.type = "checkbox";
    pm.id = "pm" + id;
    var pmLabel = document.createElement("label");
    pmLabel.checked = d.getHours() >= 12;
    pmLabel.setAttribute("for", "pm" + id);
    pmLabel.classList.add("rlabel");
    var inputs = function () {
      if (ho.value >= 12) {
        ho.value = 1;
      }
      if (ho.value <= 0) {
        ho.value = 12;
      }
      if (mt.value > 60) {
        mt.value = 1;
      }
      if (mt.value < 0) {
        mt.value = 60;
      }
      var s = ho.value.toString();
      if (
        this === ho &&
        (
          s.length >= 2 && s.charAt(0) === "1" ||
          s.length >= 1 && s.charAt(0) !== "1"
        )
      ) {
        mt.focus();
      }
      if (mt.value <= 9) {
        mt.value = "0" + mt.value;
      }
    };
    inputs();
    ho.addEventListener("input", inputs);
    mt.addEventListener("input", inputs);
    var thisSelect = function () {
      this.select();
    };
    ho.addEventListener("focus", thisSelect);
    mt.addEventListener("focus", thisSelect);
    container.appendChild(ho);
    container.appendChild(hoLabel);
    container.appendChild(mt);
    container.appendChild(pm);
    container.appendChild(pmLabel);
    return container;
  };
  var btTime1 = timeByNumbers("left");
  var btTime2 = timeByNumbers("right");
  btrowTime.appendChild(btTime1);
  btrowTime.appendChild(btTime2);
  bdBody.appendChild(btrowTime);
  backdateRules = document.createElement("i");
  backdateRules.appendChild(
    document.createTextNode(
      "Visual Post-Brick-Re-Order Happens After Reload"
    )
  );
  var backdate2 = butt("Backdate2");
  if (scheduleInstead) {
    backdate2.children[0].innerHTML = "Schedule";
  }
  backdate2.setAttribute("data-edit_action", "backdate");
  var cancelBackdate = butt("Cancel4");
  cancelBackdate.addEventListener("click", function () {
    document.getElementById("backdate").checked = false;
  });
  backdate2.addEventListener("click", fetchEditSubmitMulti);
  bdBody.appendChild(backdateRules);
  bdBody.appendChild(backdate2);
  bdBody.appendChild(cancelBackdate);
  backdate_widget.appendChild(bdBody);
  // this is the other stuff that squeezes into a widget/button
  var urlFrag = document.createDocumentFragment();
  var urlSVG = svgForType.symlink.cloneNode(true);
  urlSVG.setAttribute("viewBox", "2 2 13 13");
  urlFrag.appendChild(urlSVG); // :D
  urlFrag.appendChild(
    document.createTextNode("URLs")
  );
  var url_chrome = newChromeButton(
    "urlstuff", urlFrag, true
  );
  url_chrome.classList.add("remove-in-third-party-mode");
  var url_widget = url_chrome.getElementsByClassName("widget")[0];
  var url_check = url_chrome.getElementsByTagName("input")[0];
  url_check.disabled = true;
  url_check.classList.add("disable-when-none-selected");
  var urlRow1 = document.createElement("div");
  var urlTitle1 = document.createElement("h2");
  urlTitle1.appendChild(
    document.createTextNode("Source URL")
  );
  urlRow1.appendChild(urlTitle1);
  var urlInput1 = document.createElement("input"); // source URL
  urlInput1.type = "text";
  urlInput1.id = "source_url";
  var urlRow2 = document.createElement("div");
  var urlTitle2 = document.createElement("h2");
  urlTitle2.appendChild(
    document.createTextNode("ClickThrough Link")
  );
  var urlInput2 = document.createElement("input"); // clickthrough
  urlInput2.type = "text";
  urlInput2.id = "clickthrough";
  var urlRow3 = document.createElement("div");
  var urlTitle3 = document.createElement("h2");
  urlTitle3.innerHTML = ".../URL/<b>slug</b>";
  var urlInput3 = document.createElement("input"); // slug
  urlInput3.type = "text";
  urlInput3.id = "slug";
  var urlThing = document.createElement("div");
  urlThing.id = "urlstuff_body";
  var addURL = butt("Add URLs");
  addURL.addEventListener("click", fetchEditSubmitMulti);
  var setURLValues = function () {
    var changes = {
      "post[three]": urlInput2.value,
      "post[source_url]": urlInput1.value,
      "post[slug]": urlInput3.value
    };
    addURL.setAttribute("data-edit_action", JSON.stringify(changes));
  };
  setURLValues();
  urlInput1.addEventListener("input", setURLValues);
  urlInput2.addEventListener("input", setURLValues);
  urlInput3.addEventListener("input", setURLValues);
  var urlRules1 = document.createElement("div");
  urlRules1.appendChild(
    document.createTextNode("(Original Posts Only)")
  );
  var urlRules2 = document.createElement("div");
  urlRules2.appendChild(
    document.createTextNode("Leave Blank to Remove")
  );
  var urlRules3 = document.createElement("div");
  urlRules3.appendChild(
    document.createTextNode("Media/Image Posts Only")
  );
  urlRow1.appendChild(urlTitle1);
  urlRow1.appendChild(urlInput1);
  urlRow2.appendChild(urlTitle2);
  urlRow2.appendChild(urlInput2);
  urlRow3.appendChild(urlTitle3);
  urlRow3.appendChild(urlInput3);
  urlThing.appendChild(urlRules2);
  urlThing.appendChild(urlRow3);
  urlThing.appendChild(urlRow1);
  urlThing.appendChild(urlRules1);
  urlThing.appendChild(urlRow2);
  urlThing.appendChild(urlRules3);
  var cancelURL = butt("Cancel5");
  cancelURL.addEventListener("click", function () {
    document.getElementById("urlstuff").checked = false;
  });
  urlThing.appendChild(cancelURL);
  urlThing.appendChild(addURL);
  url_widget.appendChild(urlThing);
  // this part is mixing the editor nav panel a bit
  addFrag.appendChild(document.createTextNode("Tags"));
  addTag.appendChild(addFrag);
  addTag.setAttribute("title", "Add tags, from selected posts...");
  remTag.appendChild(remFrag);
  remTag.setAttribute("title", "Remove tags, from selected posts...");
  // get rid of oddly inline style attributes
  document.getElementById("tags").removeAttribute("style");
  // append all our new buttons "buttoned"
  en.insertBefore(pause_chrome, rtPnt);
  en.insertBefore(ajaxInfo_chrome, rtPnt);
  en.insertBefore(gutter_chrome, rtPnt);
  en.insertBefore(links_chrome, rtPnt);
  en.insertBefore(captions_chrome, rtPnt);
  en.insertBefore(hoverSpan, rtPnt);
  en.insertBefore(caption_chrome, rtPnt);
  en.insertBefore(backdate_chrome, rtPnt);
  en.insertBefore(url_chrome, rtPnt);
  en.insertBefore(private_chrome, rtPnt);
  en.appendChild(dlPnt);
  // turn links on by default
  if (getCookie("view_links") === "on") {
    document.getElementById("view-links_button").dispatchEvent(
      new Event("click")
    );
  }
  if (getCookie("view_captions") === "on") {
    document.getElementById("view-captions_button").dispatchEvent(
      new Event("click")
    );
  }
  if (getCookie("view_hover") === "on") {
    document.getElementById("hover-only").checked = true;
    document.getElementById("hover-only").dispatchEvent(
      new Event("change")
    );
  } else {
    lcontent.classList.add("hoverless");
  }
  // extra buttons for queue/drafts
  if (href[3] === "draft" || href[3] === "queued") {
    var publish_chrome = newChromeButton("publish", "Publish", false);
    publish_chrome.getElementsByTagName("button")[0].
      setAttribute(
        "data-edit_action", '{"post[state]":"0"}'
      );
    publish_chrome.getElementsByTagName("button")[0].
      addEventListener("click", fetchEditSubmitMulti);
    en.insertBefore(publish_chrome, rtPnt);
  }
  if (href[3] === "draft") {
    var queue_chrome = newChromeButton(
      "queue", "Queue Drafts", false
    );
    queue_chrome.getElementsByTagName("button")[0].
      setAttribute(
        "data-edit_action", '{"post[state]":"2"}'
      );
    queue_chrome.getElementsByTagName("button")[0].
      addEventListener("click", fetchEditSubmitMulti);
    en.insertBefore(queue_chrome, rtPnt);
  }
  if (href[3] === "queued") {
    var makeDraft_chrome = newChromeButton(
      "make-draft", "ReDraft", false
    );
    makeDraft_chrome.getElementsByTagName("button")[0].
      setAttribute(
        "data-edit_action", '{"post[state]":"1"}'
      );
    makeDraft_chrome.getElementsByTagName("button")[0].
      addEventListener("click", fetchEditSubmitMulti);
    en.insertBefore(makeDraft_chrome, rtPnt);
  }
  en.insertBefore(selectBy_chrome, unPnt);
  en.insertBefore(selectAll_chrome, dlPnt);
  var navLinks = document.getElementsByClassName("post-state-nav-item");
  var navDash = document.createElement("a");
  var navInputContainer = document.createElement("div");
  navInputContainer.classList.add("widget");
  navInputContainer.id = "reblog_widget";
  var navWidgetTrow = document.createElement("div");
  navWidgetTrow.classList.add("trow");
  var navWidgetInner = document.createElement("div");
  navWidgetInner.classList.add("inner");
  var navWidgetH2 = document.createElement("h2");
  navWidgetH2.appendChild(
    document.createTextNode("Load From Page for ReBlog")
  );
  navWidgetH2.id = "reblog-widget_h2";
  navWidgetInner.appendChild(navWidgetH2);
  var reblogDescription = document.createElement("div");
  reblogDescription.innerHTML = "Reblogging from the \"dashboard\"...";
  reblogDescription.id = "reblog-widget_description";
  var reblogInputText = document.createElement("input");
  reblogInputText.type = "text";
  reblogInputText.addEventListener("focus", function () {
    this.select();
  });
  reblogInputText.disabled = true;
  reblogInputText.id = "reblog-widget_input";
  reblogInputText.value = "dashboard";
  var loadp = butt("Load Page");
  var loadpSubmit = function () {
    var wGinput = document.getElementById(
      "reblog-widget_input"
    );
    var url = wGinput.getAttribute("data-url") + wGinput.value;
    if (wGinput.getAttribute("data-member-input") !== null) {
      setCookie(
        wGinput.getAttribute("data-member-input"),
        wGinput.value, 99
      );
    }
    document.location.href = url.replace(/\s+/g, "+");
  };
  reblogInputText.addEventListener("keyup", function (e) {
    if (e.keyCode === 13) {
      loadpSubmit();
    }
  });
  loadp.addEventListener("click", loadpSubmit);
  var cancelp = butt("Cancel2");
  cancelp.setAttribute( // so these aren't "undefined"
    "data-default-input", "null"
  );
  cancelp.setAttribute(
    "data-default-disabled", "null"
  );
  cancelp.setAttribute(
    "data-default-description", "null"
  );
  cancelp.setAttribute(
    "data-default-url", "null"
  );
  var openReblogsWidget = function (e) {
    e.preventDefault();
    e.cancelBubble = true;
    e.stopPropagation();
    var navLinks = document.getElementsByClassName(
      "post-state-nav-item"
    );
    var nav = navLinks[0].parentNode;
    if (nav.classList.contains("open")) {
      nav.classList.remove("open");
    } else {
      var data = document.getElementById(
        "mass_post_features-plugin_data"
      );
      data.classList.add("open-blog_menu");
      var wGinput = document.getElementById(
        "reblog-widget_input"
      );
      wGinput.value = this.getAttribute("data-default-input");
      wGinput.setAttribute(
        "data-member-input", this.getAttribute("data-member-input")
      );
      wGinput.disabled = this.getAttribute("data-default-disabled") === "1";
      wGinput.setAttribute("data-url", this.getAttribute("data-default-url"));
      document.getElementById(
        "reblog-widget_description"
      ).innerHTML = "Reblogging from the \"" +
        this.getAttribute("data-default-description") +
        "\"...";
      nav.classList.add("open");
    }
  };
  cancelp.addEventListener("click", openReblogsWidget);
  navWidgetInner.appendChild(reblogInputText);
  navWidgetInner.appendChild(loadp);
  navWidgetInner.appendChild(cancelp);
  var robotWarningReblogs = document.createElement("div");
  var robotTitleReblogs = document.createElement("strong");
  robotTitleReblogs.appendChild(
    document.createTextNode(
      "Friendly Robot Warning"
    )
  );
  robotWarningReblogs.classList.add("robot-warning");
  robotWarningReblogs.appendChild(robotTitleReblogs);
  robotWarningReblogs.appendChild(
    document.createTextNode(
      "Please: utilize \"Pause Button\" for extra long feeds. " +
      "Please: Reblog responsibly!"
    )
  );
  navWidgetInner.appendChild(reblogDescription);
  navWidgetInner.appendChild(robotWarningReblogs);
  navWidgetTrow.appendChild(navWidgetInner);
  navInputContainer.appendChild(navWidgetTrow);
  navLinks[0].parentNode.appendChild(navInputContainer);
  navDash.appendChild(
    svgForType["reblog-self"].cloneNode(true)
  );
  navDash.appendChild(
    document.createTextNode("Dashboard")
  );
  navDash.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navDash.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navDash.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  var navChive = document.createElement("a");
  navChive.appendChild(
    svgForType["reblog-self"].cloneNode(true)
  );
  navChive.appendChild(
    document.createTextNode("Archive")
  );
  navChive.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navChive.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navChive.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  var navTagged = document.createElement("a");
  navTagged.appendChild(
    svgForType["reblog-self"].cloneNode(true)
  );
  navTagged.appendChild(
    document.createTextNode("Tagged")
  );
  navTagged.id = "nav-tagged";
  navTagged.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navTagged.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navTagged.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  var navSearch = document.createElement("a");
  navSearch.appendChild(
    svgForType["reblog-self"].cloneNode(true)
  );
  navSearch.appendChild(
    document.createTextNode("Search")
  );
  navSearch.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navSearch.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navSearch.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  var navLikes = document.createElement("a");
  navLikes.id = "nav-likes";
  navLikes.appendChild(
    svgForType["reblog-self"].cloneNode(true)
  );
  navLikes.appendChild(
    document.createTextNode("Likes")
  );
  navLikes.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navLikes.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navLikes.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  var navPhoto = document.createElement("a");
  navPhoto.appendChild(
    svgForType.image.cloneNode(true)
  );
  navPhoto.appendChild(
    document.createTextNode("Batch")
  );
  navPhoto.id = "nav-photo";
  navPhoto.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navPhoto.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navPhoto.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  navPhoto.classList.add("post-state-nav-item");
  navPhoto.setAttribute(
    "href", "/mega-editor/published/" + name + "?photos"
  );
  navLinks[0].parentNode.appendChild(mpe);
  var navFollows = document.createElement("a");
  navFollows.appendChild(
    svgForType.friendly.cloneNode(true)
  );
  navFollows.appendChild(
    document.createTextNode("I Follow")
  );
  navFollows.id = "nav-follows";
  navFollows.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navFollows.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navFollows.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  navFollows.classList.add("post-state-nav-item");
  navFollows.setAttribute(
    "href", "/mega-editor/published/" + name + "?follows"
  );
  var navFollowers = document.createElement("a");
  navFollowers.appendChild(
    svgForType.friendly.cloneNode(true)
  );
  navFollowers.appendChild(
    document.createTextNode("Followers")
  );
  navFollowers.id = "nav-followers";
  navFollowers.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navFollowers.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navFollowers.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  navFollowers.classList.add("post-state-nav-item");
  navFollowers.setAttribute(
    "href", "/mega-editor/published/" + name + "?followers"
  );
  var navFans = document.createElement("a");
  navFans.appendChild(
    svgForType.mutual.cloneNode(true)
  );
  navFans.appendChild(
    document.createTextNode("Fans")
  );
  navFans.id = "nav-fans";
  navFans.getElementsByTagName("svg")[0].setAttribute("width", 15);
  navFans.getElementsByTagName("svg")[0].setAttribute("height", 15);
  navFans.getElementsByTagName("svg")[0].setAttribute("fill", "#fff");
  navFans.classList.add("post-state-nav-item");
  navFans.setAttribute(
    "href", "/mega-editor/published/" + name + "?fans"
  );
  var four = [// < there were only 4 when I named this...
    "dashboard", "archive", "tagged", "search", "likes", // reblogging pages
    "photos", "follows", "followers", "fans" //special features
  ];
  if (typeof href[5] !== "undefined" && four.indexOf(href[5]) !== -1) {
    document.getElementsByClassName("active")[0].classList.remove("active");
    if (href[5] === "dashboard") {
      navDash.classList.add("active");
    }
    if (href[5] === "archive") {
      navChive.classList.add("active");
    }
    if (href[5] === "tagged") {
      navTagged.classList.add("active");
    }
    if (href[5] === "search") {
      navSearch.classList.add("active");
    }
    if (href[5] === "likes") {
      navLikes.classList.add("active");
    }
    if (href[5] === "photos") {
      navPhoto.classList.add("active");
    }
    if (href[5] === "follows") {
      navFollows.classList.add("active");
    }
    if (href[5] === "followers") {
      navFollowers.classList.add("active");
    }
    if (href[5] === "fans") {
      navFans.classList.add("active");
    }
  }
  navTagged.setAttribute(
    "data-default-input", getCookie("cats") !== "" ? getCookie("cats") : "cats"
  );
  navTagged.setAttribute(
    "data-member-input", "cats"
  );
  navTagged.setAttribute(
    "data-default-description", "Tagged Page"
  );
  navTagged.setAttribute(
    "data-default-url", "/mega-editor/published/" + name + "?tagged&"
  );
  navTagged.addEventListener("click", openReblogsWidget);
  navTagged.href = "/mega-editor/published/" + name + "?tagged&" +
    (getCookie("cats") !== "" ? getCookie("cats") : "cats");
  navTagged.classList.add("post-state-nav-item");
  navLinks[0].parentNode.appendChild(navTagged);
  navLikes.setAttribute(
    "data-default-input", name
  );
  navLikes.setAttribute(
    "data-default-description", "Liked/By Page"
  );
  navLikes.setAttribute(
    "data-default-url", "/mega-editor/published/" + name + "?likes&"
  );
  navLikes.addEventListener("click", openReblogsWidget);
  navLikes.href = "/mega-editor/published/" + name + "?likes&" + name;
  navLikes.classList.add("post-state-nav-item");
  navLikes.setAttribute(
    "data-member-input", "name1"
  );
  navLinks[0].parentNode.appendChild(navLikes);
  navSearch.setAttribute(
    "data-default-input", getCookie("cats2") !== "" ? getCookie("cats2") : "cats"
  );
  navSearch.setAttribute(
    "data-default-disabled", "0"
  );
  navSearch.setAttribute(
    "data-default-description", "Search Page"
  );
  navSearch.setAttribute(
    "data-default-url", "/mega-editor/published/" + name + "?search&"
  );
  navSearch.addEventListener("click", openReblogsWidget);
  navSearch.href = "/mega-editor/published/" + name + "?search&" +
    (getCookie("cats2") !== "" ? getCookie("cats2") : "cats");
  navSearch.setAttribute(
    "data-member-input", "cats2"
  );
  navSearch.classList.add("post-state-nav-item");
  navLinks[0].parentNode.appendChild(navSearch);
  navChive.setAttribute(
    "data-default-input", getCookie("david") !== "" ? getCookie("david") : "david"
  );
  navChive.setAttribute(
    "data-member-input", "david"
  );
  navChive.setAttribute(
    "data-default-disabled", "0"
  );
  navChive.setAttribute(
    "data-default-description", "Archive Page"
  );
  navChive.setAttribute(
    "data-default-url", "/mega-editor/published/" + name + "?archive&"
  );
  navChive.addEventListener("click", openReblogsWidget);
  navChive.href = "/mega-editor/published/" + name + "?archive&" +
    (getCookie("david") !== "" ? getCookie("david") : "david");
  navChive.classList.add("post-state-nav-item");
  navLinks[0].parentNode.appendChild(navChive);
  navDash.setAttribute(
    "data-default-input", "dashboard"
  );
  navDash.setAttribute(
    "data-default-disabled", "1"
  );
  navDash.setAttribute(
    "data-default-description", "Dashboard"
  );
  navDash.setAttribute(
    "data-default-url", "/mega-editor/published/" + name + "?dashboard&"
  );
  navDash.addEventListener("click", openReblogsWidget);
  navDash.href = "/mega-editor/published/" + name + "?dashboard";
  navDash.classList.add("post-state-nav-item");
  navLinks[0].parentNode.appendChild(navDash);
  navLinks[0].parentNode.appendChild(navPhoto);
  navLinks[0].parentNode.appendChild(navFollows);
  navLinks[0].parentNode.appendChild(navFollowers);
  // navLinks[0].parentNode.appendChild(navFans); // html api, too unstable...
  navLinks[0].insertBefore(
    svgForType.edit.cloneNode(true), navLinks[0].firstChild
  );
  navLinks[1].insertBefore(
    svgForType.edit.cloneNode(true), navLinks[1].firstChild
  );
  navLinks[2].insertBefore(
    svgForType.edit.cloneNode(true), navLinks[2].firstChild
  );
  navLinks[0].getElementsByTagName("svg")[0].setAttribute("width", 15);
  navLinks[0].getElementsByTagName("svg")[0].setAttribute("height", 15);
  navLinks[1].getElementsByTagName("svg")[0].setAttribute("width", 15);
  navLinks[1].getElementsByTagName("svg")[0].setAttribute("height", 15);
  navLinks[2].getElementsByTagName("svg")[0].setAttribute("width", 15);
  navLinks[2].getElementsByTagName("svg")[0].setAttribute("height", 15);
  // end extra chrome buttons and widgets, and nav-links

  // the replace/alias some of the default functions
  var rewriterScript = document.createElement("script");
  rewriterScript.type = "text/javascript";
  rewriterScript.id = "mass_post_features-plugin_functions";
  rewriterScript.appendChild(
    document.createTextNode(
      rewrite1.toString().slice(13, -1)
    )
  );
  rewriterScript.appendChild(
    document.createTextNode(
      "// The doc_title (#) is superfluous; use a visible (#)\n" +
      "window.postCountMake = " +
      postCountMake.toString() + ";\n"
    )
  );
  rewriterScript.appendChild(
    document.createTextNode(
      rewrite2.toString().slice(13, -1)
    )
  );
  document.head.appendChild(rewriterScript);
  // end the default script replacements/aliases

  // begin the plugin css below
  // (I tweaked this CSS for hours upon days to be utmost pretty)
  var pluginStyle = document.createElement("style");
  pluginStyle.id = "mass_post_features-plugin_style";
  pluginStyle.type = "text/css";
  pluginStyle.appendChild(
    document.createTextNode(
      (function () {/*

h2 {
  display: block;
  font-weight: 600;
}

a {
  text-decoration: underline;
}

b, strong {
  font-weight: 700;
}

h2 b, h2 strong {
  font-weight: 900;
}

em, i {
  font-style: italic;
}

ol, ul {
  list-style: none;
}

blockquote, q {
  quotes: none;
}

blockquote {
  border-left: 3px solid #000;
  padding-left: 4px;
}

blockquote:after,
blockquote:before,
q:after,
q:before {
  content: none;
}

ol, ul {
  margin-bottom: .75em;
  padding-left: 2.8em;
}

ol ol,
ol ul,
ul ol,
ul ul {
  margin: 0;
  padding-left: 1.1em;
}

ul li {
  list-style-type: disc;
}

ul li li {
  list-style-type: circle;
}

ol li {
  list-style-type: decimal;
  font-feature-settings: "tnum";
}

blockquote, p,
pre {
  margin-bottom: .75em;
}

p.npf_quirky {
  font-family: Fairwater, serif;
  font-size: 24px;
  line-height: 1.3em;
}

p.npf_chat {
  font-family: Source Code Pro, monospace;
}

p.npf_color_joey,
span.npf_color_joey {
  color: #ff492f;
}

p.npf_color_monica,
span.npf_color_monica {
  color: #ff8a00;
}

p.npf_color_phoebe,
span.npf_color_phoebe {
  color: #e8d73a;
}

p.npf_color_ross,
span.npf_color_ross {
  color: #00cf35;
}

p.npf_color_rachel,
span.npf_color_rachel {
  color: #00b8ff;
}

p.npf_color_chandler,
span.npf_color_chandler {
  color: #7c5cff;
}

p.npf_color_niles,
span.npf_color_niles {
  color: #ff62ce;
}

p.npf_color_frasier,
span.npf_color_frasier {
  color: #001935;
}

p.npf_color_mr_big,
span.npf_color_mr_big {
  color: #000c1a;
}

@font-face {
  font-family: Gibson;
  src: url(https://assets.tumblr.com/pop/fonts/gibson/gibson-light-0db5d248.woff) format("woff");
  font-weight: 100;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Gibson;
  src: url(https://assets.tumblr.com/pop/fonts/gibson/gibson-regular-d83b428c.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Gibson;
  src: url(https://assets.tumblr.com/pop/fonts/gibson/gibson-semibold-b0fc2672.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Gibson;
  src: url(https://assets.tumblr.com/pop/fonts/gibson/gibson-bold-c6132b6e.woff) format("woff");
  font-weight: 900;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Gibson;
  src: url(https://assets.tumblr.com/pop/fonts/gibson/gibson-light-italic-ed49facd.woff) format("woff");
  font-weight: 100;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Gibson;
  src: url(https://assets.tumblr.com/pop/fonts/gibson/gibson-italic-e1dcd616.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Gibson;
  src: url(https://assets.tumblr.com/pop/fonts/gibson/gibson-semibold-italic-ae8d9810.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Bold;
  src: url(https://assets.tumblr.com/pop/fonts/gibson/gibson-bold-italic-94b05ba2.woff) format("woff");
  font-weight: 900;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Franklin Gothic Medium;
  src: url(https://assets.tumblr.com/pop/fonts/franklingothic/franklingothic-medium-1beb5103.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-stretch: normal;
  font-display: swap
}

@font-face {
  font-family: Franklin Gothic Medium Condensed;
  src: url(https://assets.tumblr.com/pop/fonts/franklingothic/franklingothic-medium-compressed-58222bfb.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Franklin Gothic Compressed;
  src: url(https://assets.tumblr.com/pop/fonts/franklingothic/franklingothic-compressed-02ac5e26.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Walsheim;
  src: url(https://assets.tumblr.com/pop/fonts/walsheim/walsheim-medium-40fd0505.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Fairwater;
  src: url(https://assets.tumblr.com/pop/fonts/fairwater/fairwater-regular-b7ab7a58.woff2) format("woff2");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Favorit;
  src: url(https://assets.tumblr.com/pop/fonts/favorit/favorit-85-8ff1c986.woff2) format("woff2");
  font-style: normal;
  font-weight: 400;
  font-display: swap
}

@font-face {
  font-family: Favorit;
  src: url(https://assets.tumblr.com/pop/fonts/favorit/favorit-85-italic-a883bce7.woff2) format("woff2");
  font-style: italic;
  font-weight: 400;
  font-display: swap
}

@font-face {
  font-family: Favorit;
  src: url(https://assets.tumblr.com/pop/fonts/favorit/favorit-medium-be005cc5.woff2) format("woff2");
  font-style: normal;
  font-weight: 700;
  font-display: swap
}

@font-face {
  font-family: Favorit;
  src: url(https://assets.tumblr.com/pop/fonts/favorit/favorit-medium-italic-4d1adc26.woff2) format("woff2");
  font-style: italic;
  font-weight: 700;
  font-display: swap
}

@font-face {
  font-family: "1785 GLC Baskerville";
  src: url(https://assets.tumblr.com/pop/fonts/1785glcbaskerville/1785glcbaskerville-regular-2c131a72.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: "1785 GLC Baskerville";
  src: url(https://assets.tumblr.com/pop/fonts/1785glcbaskerville/1785glcbaskerville-italic-1a724410.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Alternate Gothic;
  src: url(https://assets.tumblr.com/pop/fonts/alternategothic/alternategothic-regular-d11d1e96.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Arquitecta;
  src: url(https://assets.tumblr.com/pop/fonts/arquitecta/arquitecta-book-cee560b5.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Arquitecta;
  src: url(https://assets.tumblr.com/pop/fonts/arquitecta/arquitecta-bold-5ec6543e.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Avalon;
  src: url(https://assets.tumblr.com/pop/fonts/avalon/avalon-book-de1d38eb.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Avalon;
  src: url(https://assets.tumblr.com/pop/fonts/avalon/avalon-bold-26f8ad53.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Bodoni Recut FS;
  src: url(https://assets.tumblr.com/pop/fonts/bodonirecutfs/bodonirecutfs-regular-283bd6c9.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Bodoni Recut FS;
  src: url(https://assets.tumblr.com/pop/fonts/bodonirecutfs/bodonirecutfs-demi-1c2ff649.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Bodoni Recut FS;
  src: url(https://assets.tumblr.com/pop/fonts/bodonirecutfs/bodonirecutfs-italic-54315813.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Bodoni Recut FS;
  src: url(https://assets.tumblr.com/pop/fonts/bodonirecutfs/bodonirecutfs-demi-italic-b5e01932.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Bookmania;
  src: url(https://assets.tumblr.com/pop/fonts/bookmania/bookmania-regular-271d947c.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Bookmania;
  src: url(https://assets.tumblr.com/pop/fonts/bookmania/bookmania-bold-5e09e821.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Brutal Type;
  src: url(https://assets.tumblr.com/pop/fonts/brutaltype/brutaltype-regular-ef623c78.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Brutal Type;
  src: url(https://assets.tumblr.com/pop/fonts/brutaltype/brutaltype-bold-a5e007f4.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Calluna;
  src: url(https://assets.tumblr.com/pop/fonts/calluna/calluna-regular-60172bcd.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Calluna;
  src: url(https://assets.tumblr.com/pop/fonts/calluna/calluna-black-cfbfc0fb.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Calluna;
  src: url(https://assets.tumblr.com/pop/fonts/calluna/calluna-italic-405661eb.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Calluna;
  src: url(https://assets.tumblr.com/pop/fonts/calluna/calluna-bold-italic-760a50f4.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Calluna Sans;
  src: url(https://assets.tumblr.com/pop/fonts/callunasans/callunasans-regular-4c9b1de7.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Calluna Sans;
  src: url(https://assets.tumblr.com/pop/fonts/callunasans/callunasans-black-9c48542e.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Calluna Sans;
  src: url(https://assets.tumblr.com/pop/fonts/callunasans/callunasans-italic-83d2e0f0.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Calluna Sans;
  src: url(https://assets.tumblr.com/pop/fonts/callunasans/callunasans-black-italic-55e41442.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Capita;
  src: url(https://assets.tumblr.com/pop/fonts/capita/capita-regular-b20fa714.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Capita;
  src: url(https://assets.tumblr.com/pop/fonts/capita/capita-bold-16bd5c46.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Caslon FS;
  src: url(https://assets.tumblr.com/pop/fonts/caslonfs/caslonfs-book-b1f3d7b2.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Caslon FS;
  src: url(https://assets.tumblr.com/pop/fonts/caslonfs/caslonfs-bold-c9f15be5.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Clarendon Text Pro;
  src: url(https://assets.tumblr.com/pop/fonts/clarendontextpro/clarendontextpro-regular-8665c534.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Clarendon Text Pro;
  src: url(https://assets.tumblr.com/pop/fonts/clarendontextpro/clarendontextpro-bold-f0e91a3c.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Clarendon Text Pro;
  src: url(https://assets.tumblr.com/pop/fonts/clarendontextpro/clarendontextpro-italic-f50fadcc.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Clarendon Text Pro;
  src: url(https://assets.tumblr.com/pop/fonts/clarendontextpro/clarendontextpro-bold-italic-0b93f3fe.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Clearface FS;
  src: url(https://assets.tumblr.com/pop/fonts/clearface/clearface-regular-0877705c.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Clearface FS;
  src: url(https://assets.tumblr.com/pop/fonts/clearface/clearface-black-7307513a.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Clearface FS;
  src: url(https://assets.tumblr.com/pop/fonts/clearface/clearface-italic-12dd08d2.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Clearface FS;
  src: url(https://assets.tumblr.com/pop/fonts/clearface/clearface-black-italic-95e89c47.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Garamond Classic FS;
  src: url(https://assets.tumblr.com/pop/fonts/garamondclassicfs/garamondclassicfs-regular-37325adf.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Garamond Classic FS;
  src: url(https://assets.tumblr.com/pop/fonts/garamondclassicfs/garamondclassicfs-heavy-d6b7cb51.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Garamond Classic FS;
  src: url(https://assets.tumblr.com/pop/fonts/garamondclassicfs/garamondclassicfs-italic-a9e735d6.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Garamond Classic FS;
  src: url(https://assets.tumblr.com/pop/fonts/garamondclassicfs/garamondclassicfs-bold-italic-73da3cdb.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Grumpy Black\ 48;
  src: url(https://assets.tumblr.com/pop/fonts/grumpyblack48/grumpyblack48-60ad3944.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Grumpy Black\ 48;
  src: url(https://assets.tumblr.com/pop/fonts/grumpyblack48/grumpyblack48-60ad3944.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Lorimer No\ 2;
  src: url(https://assets.tumblr.com/pop/fonts/lorimerno2/lorimerno2-medium-5ed17651.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Lorimer No\ 2;
  src: url(https://assets.tumblr.com/pop/fonts/lorimerno2/lorimerno2-semibold-c615f79e.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Lorimer No\ 2;
  src: url(https://assets.tumblr.com/pop/fonts/lorimerno2/lorimerno2-medium-italic-a7cb2829.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Lorimer No\ 2;
  src: url(https://assets.tumblr.com/pop/fonts/lorimerno2/lorimerno2-semibold-italic-803dc0f4.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: News Gothic FS;
  src: url(https://assets.tumblr.com/pop/fonts/newsgothicfs/newsgothicfs-book-b71e5c48.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: News Gothic FS;
  src: url(https://assets.tumblr.com/pop/fonts/newsgothicfs/newsgothicfs-bold-dad27eb5.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: News Gothic FS;
  src: url(https://assets.tumblr.com/pop/fonts/newsgothicfs/newsgothicfs-book-oblique-0a0ccd73.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: News Gothic FS;
  src: url(https://assets.tumblr.com/pop/fonts/newsgothicfs/newsgothicfs-bold-oblique-4767b553.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Pratt Pro;
  src: url(https://assets.tumblr.com/pop/fonts/prattpro/prattpro-regular-27555c58.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Pratt Pro;
  src: url(https://assets.tumblr.com/pop/fonts/prattpro/prattpro-bold-f978900f.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Quadrat;
  src: url(https://assets.tumblr.com/pop/fonts/quadrat/quadrat-regular-eade9dc0.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Quadrat;
  src: url(https://assets.tumblr.com/pop/fonts/quadrat/quadrat-serial-f6e71145.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Sofia Pro;
  src: url(https://assets.tumblr.com/pop/fonts/sofiapro/sofiapro-regular-f2aae9ec.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Sofia Pro;
  src: url(https://assets.tumblr.com/pop/fonts/sofiapro/sofiapro-bold-cdb403a0.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Spade;
  src: url(https://assets.tumblr.com/pop/fonts/spade/spade-6085b923.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Spade;
  src: url(https://assets.tumblr.com/pop/fonts/spade/spade-6085b923.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Square Serif;
  src: url(https://assets.tumblr.com/pop/fonts/squareserif/squareserif-book-0a547297.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Square Serif;
  src: url(https://assets.tumblr.com/pop/fonts/squareserif/squareserif-demi-1bdcd0c8.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Square Serif;
  src: url(https://assets.tumblr.com/pop/fonts/squareserif/squareserif-book-italic-0ecc7c19.woff) format("woff");
  font-weight: 400;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Square Serif;
  src: url(https://assets.tumblr.com/pop/fonts/squareserif/squareserif-demi-italic-b4286785.woff) format("woff");
  font-weight: 700;
  font-style: italic;
  font-display: swap
}

@font-face {
  font-family: Streetscript;
  src: url(https://assets.tumblr.com/pop/fonts/streetscript/streetscript-e1665af6.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Streetscript;
  src: url(https://assets.tumblr.com/pop/fonts/streetscript/streetscript-e1665af6.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Typewriter FS;
  src: url(https://assets.tumblr.com/pop/fonts/typewriterfs/typewriterfs-regular-c0a07f03.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Typewriter FS;
  src: url(https://assets.tumblr.com/pop/fonts/typewriterfs/typewriterfs-bold-d4592705.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Ziclets;
  src: url(https://assets.tumblr.com/pop/fonts/ziclets/ziclets-b6989e95.woff) format("woff");
  font-weight: 400;
  font-style: normal;
  font-display: swap
}

@font-face {
  font-family: Ziclets;
  src: url(https://assets.tumblr.com/pop/fonts/ziclets/ziclets-b6989e95.woff) format("woff");
  font-weight: 700;
  font-style: normal;
  font-display: swap
}

@keyframes happy-bounce {
  0% {
    opacity: 0;
    transform: rotate(40deg) translateY(0);
  }

  10% {
    transform: rotate(0deg) translateY(-50px);
    opacity: 1;
  }

  20% {
    transform: rotate(-40deg) translateY(0);
  }

  30% {
    transform: rotate(0deg) translateY(-40px);
  }

  40% {
    transform: rotate(40deg) translateY(0);
  }

  50% {
    transform: rotate(0deg) translateY(-30px);
  }

  60% {
    transform: rotate(-40deg) translateY(0);
  }

  70% {
    transform: rotate(0deg) translateY(-20px);
  }

  80% {
    transform: rotate(40deg) translateY(0);
  }

  90% {
    opacity: 1;
    transform: rotate(0deg) translateY(-10px);
  }

  100% {
    opacity: 0;
    transform: rotate(-40deg) translateY(0);
  }
}

@keyframes blinking {
  0% {
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}

@keyframes updown {
  100% {
    margin-top: 0;
  }

  50% {
    margin-top: -15px;
  }

  0% {
    margin-top: 0;
  }
}

@keyframes flip {
  100% {
    transform: rotateX(0);
    opacity: 1;
  }

  0% {
    transform: rotateX(-180deg);
    opacity: 0;
  }
}

.l-content {
  min-height: calc(100vh - 177px);
}

.l-content>* {
  opacity: 0;
  transition: all 0.4s ease-out;
}

.l-content>*.display-none {
  display: none;
}

#select-by-widget_title .preselect-count,
#select-by_widget .row,
.l-content>*.laid {
  opacity: 1;
  animation: flip 0.25s ease-in-out both;
}

#select-by-widget_title .preselect-count.noanim,
#select-by_widget .row:active {
  animation: none;
  opacity: 1;
}

#mass_post_features-plugin_data {
  display: none;
}

#mass_post_features-plugin_selection_box {
  position: absolute;
  background-color: rgba(50, 90, 250, 0.4);
  box-shadow: inset 0 0 0 1px rgba(50, 90, 250, 1);
  z-index: 100;
  cursor: pointer;
}

a.blog_title {
  cursor: pointer;
}

#delete_posts {
  background-color: #c00;
}

#unselect .chrome_button_right {
  display: inline-block;
}

.blue_bar .editor_navigation {
  text-align: center;
  float: none;
  display: block;
}

.blue_bar .editor_navigation .header_button {
  display: inline-block;
  vertical-align: top;
}

#status {
  margin: 0px 0px -3px 0px;
}

#pause_button .play,
#pause_button .pause {
  color: #fff;
  font-size: 10px;
  padding: 0 2px;
}

#pause_button.playing .play,
#pause_button.paused .pause,
#pause_button.done .play,
#pause_button.done .pause {
  color: rgba(255, 255, 255, 0.3);
}

.chrome h2 {
  display: inline-block;
  font-size: 25px;
  vertical-align: top;
  color: inherit;
  font-weight: bold;
}


.chrome_button h2 {
  vertical-align: sub;
  font-family: monospace;
  position: relative;
}

#add_tag_button,
#cancel_add_tag_button,
#cancel_remove_tag_button,
#remove_tag_button {
  margin-bottom: -30px;
}

#tag_editor,
#tags {
  font: normal 11px 'Lucida Grande', Verdana, sans-serif;
  width: 326px;
  position: absolute;
  left: 20px;
  top: 19px;
  text-align: left;
  height: 170px;
  overflow: auto;
  color: #555;
  background-color: rgba(255, 255, 255, 0.7);
}

#unselect.chrome,
#select-all_button.chrome,
#select-by_button.chrome,
#view-links_button.chrome,
#view-captions_button.chrome {
  background: #7D99FF none;
}

.blue_bar .editor_navigation .header_button button.chrome {
  padding: 0 4px 0 0;
  margin: 1px 0 0 2px;
}

#gutter_button input[type="number"] {
  width: 40px;
  height: 18px;
  padding: 0 3px;
  background-color: #ccc;
  border: 0 none;
  box-shadow: inset 0 2px 2px 0px #000;
  top: -2px;
  position: relative;
}

#cancel5_button,
#add_urls_button,
#post_all_photos_button,
#cancel2_button,
#cancel1_button,
#select_button,
#clear_button,
#hide_button,
#list_button {
  border: 0 none;
  padding: 0 5px;
}

#select_button {
  position: absolute;
  bottom: 13px;
  left: 10px;
  width: 68px;
}

#reblog_widget .robot-warning {
  width: 190px;
  margin: 10px 10px 11px 10px;
}

#cancel2_button {
  position: absolute;
  bottom: 10px;
  right: 10px;
}

#cancel1_button {
  position: absolute;
  top: 10px;
  right: 10px;
}

#clear_button {
  position: absolute;
  bottom: 13px;
  right: 10px;
}

#hide_button {
  position: absolute;
  bottom: 7px;
  right: 6px;
  height: 24px;
}

#list_button {
  position: absolute;
  bottom: 13px;
  right: 307px;
  height: 24px;
}

#photos-drop-zone *,
#photos-drop-zone,
.blog_title,
#jump_to_month,
#mpe_title,
.post-state-nav-item,
.l-content>*,
button,
label {
  user-drag: none;
  user-select: none;
  -moz-user-select: none;
  -webkit-user-drag: none;
  -webkit-user-select: none;
  -ms-user-select: none;
}

.l-content .brick.photo {
    min-height: 50px;
    vertical-align: ;
}

.l-content .heading {
  padding-top: 20px;
}

.l-content .brick .overprint {
  width: 120px;
  top: 0px;
  left: 5px;
}

.l-content .brick.video .play_overlay,
.l-content .brick.audio .listen_overlay {
  z-index: 9;
}

.l-content .brick {
  overflow: visible;
  background: linear-gradient(135deg,
      rgba(242, 242, 242, 1) 0%,
      rgba(209, 209, 209, 1) 44%,
      rgba(209, 209, 209, 1) 100%,
      rgba(226, 226, 226, 1) 100%);
}

.l-content .brick .overflow-hidden {
  position: absolute;
  height: 100%;
  overflow: hidden;
  width: 125px;
  bottom: 0;
  right: 0;
  left: 0;
  top: 0;
}

.l-content .brick .monospace *,
.l-content .brick .monospace {
  font-family: "Courier", monospace;
}

.l-content .brick .ol {
  display: list-item;
  list-style: decimal inside;
}

.l-content .brick .ul {
  display: list-item;
  list-style: disc inside;
}

.l-content .brick .h1 {
  font-size: 115%;
  text-align: center;
}

.l-content .brick .quote {
  font-size: 125%;
  font-family: "Times", "Times New Roman", serif;
}

.l-content .brick .rq {
  font-size: 140px;
  font-weight: bold;
  font-family: "Times", "Times New Roman", "Times", serif;
  color: rgba(0, 0, 0, 0.15);
  position: absolute;
  top: 0px;
  right: 0;
  line-height: 110px;
}

.l-content .brick.link .rq {
  bottom: -20px;
}

.l-content .brick.note .ask-av {
  display: inline-block;
  vertical-align: middle;
  border-radius: 20px;
}

.l-content .brick.has-img .fade {
  width: 125px;
  height: 90px;
  position: absolute;
  left: 0;
  bottom: 0;
  background: linear-gradient(to bottom,
      rgba(206, 206, 206, 0) 0%,
      rgba(208, 208, 208, 0) 73%,
      rgba(209, 209, 209, 1) 100%);
}

.l-content .brick .asker {
  display: inline-block;
  vertical-align: middle;
}

.l-content .brick .answer {
  font-weight: normal;
  padding-top: 30px;
}

.l-content .brick .h2 {
  font-size: 105%;
}

.l-content .brick .link {
  text-decoration: underline;
}

.l-content .brick .quirky {
  font-family: Fairwater, serif;
  font-size: 112%;
}

.l-content .brick.highlighted .overlay {
  background: none;
  border: 0 none;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  text-align: center;
  color: #fff;
  opacity: 1;
  filter: none;
  z-index: 999;
  display: block;
}

.l-content .brick.highlighted .overlay .inner {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  margin-top: 0;
  height: 100%;
}

.l-content .brick.highlighted .overlay .inner .date {
  color: #fff;
  position: absolute;
  left: 0px;
  right: 0px;
  padding: 2px 6px 0px 2px;
  background-color: #73bae7;
  height: 13px;
  font-size: 10px;
  line-height: 11px;
}

.l-content .brick.highlighted .highlight .tag_count {
  display: block !important;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  max-width: 115px;
}

.tag_count[style]:after {
    content: " tags";
}

.l-content .brick.highlighted .highlight .note_count {
  color: #fff;
  position: absolute;
  right: 0px;
  bottom: 0px;
  padding: 2px 6px 0px 2px;
  background-color: #73bae7;
  background-color: rgba(115,186,231,0.8);
  height: 11px;
  font-size: 10px;
  line-height: 11px;
  border-top-left-radius: 5px;
  display: block !important;
}

.l-content .brick.highlighted .overlay .inner .notes {
  margin-top: 5px;
  position: absolute;
  bottom: 0px;
  right: 0px;
  padding: 3px 6px 0px 5px;
  background-color: #73bae7;
  height: 13px;
  font-size: 10px;
  line-height: 10px;
  border-top-left-radius: 5px;
  display: block !important;
}

#widget-top-buttons .red {
  border: 1px rgba(255, 0, 0, 0.4) solid;
  background-color: rgba(255, 0, 0, 0.1);
  color: rgba(255, 0, 0, 0.6);
  position: absolute;
  right: 7px;
  top: 30px;
  font-size: 10px;
  padding: 1px 6px;
  font-weight: bold;
}

#widget-top-buttons .arrow,
.blue_bar .arrow {
  display: inline-block;
  position: relative;
  top: -1px;
  width: 0;
  height: 0;
  margin-left: 4px;
  border-top: 6px solid;
  border-right: 6px solid transparent;
  border-left: 6px solid transparent;
}
#widget-top-buttons .arrow {
  border-top-color: #555;
}
#widget-top-buttons .arrow.reverse {
  border-bottom: 6px solid;
  border-bottom-color: #99a3ae;
  border-top: 0;
}

.blue_bar .chrome {
  cursor: pointer;
}

.blue_bar .chrome label .arrow {
  border-top-color: #fff;
}

.blue_bar .small_text {
  width: 280px;
  position: relative;
  margin: 0;
  padding: 0;
  color: #fff;
  font-size: 14px;
  font-weight: bold;
  letter-spacing: 0;
  line-height: 15px;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  display: block;
  left: 10px;
  text-align: center;
}

.blue_bar .title .blog_title {
  color: #99a3ae;
  text-decoration: none;
  top: -3px;
}

#blog_menu {
  display: none;
}

#blog_menu .avatar_img,
#blog_menu .avatar {
  display: inline-block;
  float: left;
  width: 36px;
  height: 36px;
  margin: 3px 0px 0px 3px;
  vertical-align: bottom;
}

#blog_menu .avatar_img {
  border: 1px solid #000;
  border-radius: 4px;
  background-color: rgba(255, 255, 255, 0.9);
}

#blog_menu .avatar {
  position: relative;
  top: 0;
  left: 0;
}

#blog_menu .avatar svg {
  display: none;
}

#blog_menu .avatar.reblog-to-here svg {
  display: block;
  position: absolute;
  background-color: rgba(0, 0, 0, 0.8);
  box-shadow: 0 0 0 2px #7D99FF;
  border-radius: 2px;
  top: 4px;
  left: 4px;
  width: 26px;
  height: 26px;
  padding: 5px;
}

.blog_menu_child {
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.13);
  padding: 2px 0px 4px 0px;
}

.subt {
  text-align: center;
  height: 40px;
  width: 300px;
  top: 5px;
  position: relative;
  margin: 0px 0px 0px 48px;
}

.subt a {
  padding: 2px;
  color: #7D99FF;
  margin: 2px;
}

.subt button,
.subt a {
  cursor: pointer;
}

.subt .blank-space,
.subt button,
.subt a {
  height: 24px;
  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
  font-size: 10px;
  line-height: 14px;
  font-weight: bold;
  text-decoration: none;
}

.subt .blank-space,
.subt button {
  display: inline-block;
  min-height: 52px;
  position: relative;
  margin: 0;
}

.subt button {
  width: 82px;
  min-height: 52px;
  white-space: normal;
  top: -17px;
  padding: 3px 8px 3px 8px;
  border-color: #000;
  border-radius: 2px;
  background-color: #444;
  border-width: 1px;
  border-style: solid;
  color: #fff;
  position: relative;
  left: 5px;
}

.subt .blank-space {
  width: 60px;
  height: 30px;
  top: -19px;
  vertical-align: middle;
}

.subt a:active {
  text-decoration: underline;
}

.subt button:active {
  background-color: #969696;
  border-color: #8a8f96;
  border-color: rgba(0, 0, 0, 0.2);
  box-shadow: none
}

.open #blog_menu {
  display: block;
  position: fixed;
  text-align: center;
  left: 0;
  width: 400px;
  height: auto;
  max-height: calc(100vh - 50px);
  padding: 0;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: #001935;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.13);
  z-index: 100;
  top: 0;
  padding-bottom: 10px;
}

a.open {
  cursor: normal;
}

#blog_menu::-webkit-scrollbar,
#widget_scrolling_part::-webkit-scrollbar {
  width: 8px;
  height: 10px;
}

#blog_menu::-webkit-scrollbar-thumb,
#widget_scrolling_part::-webkit-scrollbar-thumb {
  border-radius: 8px;
  background: #c2c9d2;
}

.editor_navigation span input+.widget {
  display: none;
}

.editor_navigation span input:checked+.widget {
  display: block;
}

#urlstuff_widget {
  padding: 30px;
}

#urlstuff_widget .chrome {
  margin: 14px;
}

.row label.not.disabled {
  background-color: rgba(0, 0, 0, 0.1);
  opacity: 0.3;
}

.row label.not.ch {
  background-color: rgba(250, 170, 100, 0.2);
}

#snapshot-info_widget,
#backdate_widget,
#urlstuff_widget,
#add-caption_widget,
#reblog_widget,
#remove_tags_widget,
#add_tags_widget,
#select-by_widget {
  cursor: grab !important;
}

#select-by,
#backdate,
#snapshot-info,
#urlstuff,
#add-caption {
  opacity: 0;
  width: 0;
  height: 0;
}

#urlstuff_body,
#backdate-body,
#reblog_widget button,
#reblog_widget input,
#tags {
  cursor: auto;
}

.brick-dragging *,
.brick-dragging,
#snapshot-info_widget.widget-dragging *,
#snapshot-info_widget.widget-dragging,
#backdate_widget.widget-dragging *,
#backdate_widget.widget-dragging,
#urlstuff_widget.widget-dragging *,
#urlstuff_widget.widget-dragging,
#add-caption_widget.widget-dragging *,
#add-caption_widget.widget-dragging,
#reblog_widget.widget-dragging *,
#reblog_widget.widget-dragging,
#remove_tags_widget.widget-dragging *,
#remove_tags_widget.widget-dragging,
#add_tags_widget.widget-dragging *,
#add_tags_widget.widget-dragging,
#select-by_widget.widget-dragging *,
#select-by_widget.widget-dragging {
  cursor: grabbing !important;
}

#reblog_widget h2,
#reblog_widget div,
#reblog_widget span,
#remove_tags_widget div,
#add-caption_widget div,
#add-caption_widget h2,
#backdate_widget h2,
#backdate_widget span,
#backdate_widget div,
#snapshot-info_widget h2,
#snapshot-info_widget span,
#snapshot-info_widget div,
#urlstuff_widget h2,
#urlstuff_widget span,
#urlstuff_widget div,
#add-caption_widget span,
#select-by_widget span,
#select-by_widget div {
  user-drag: none;
  user-select: none;
  -moz-user-select: none;
  -webkit-user-drag: none;
  -webkit-user-select: none;
  -ms-user-select: none;
}

#backdate-body {
  top: 20px;
  position: relative;
}

#select-by_widget .row span.ch {
  background-color: rgba(100, 170, 250, 0.2);
}

#select-by_widget .row label.is {
  position: absolute;
  left: 0;
  top: 0;
  right: 50px;
  height: 20px;
}

#select-by_widget .row svg {
  position: absolute;
  left: 78px;
  top: 0;
  width: 20px;
  height: 20px;
}

#select-by_widget .row label.is .row-child {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  display: inline-block;
  width: 255px;
  font-size: 11px;
  line-height: 19px;
  left: 102px;
  top: 0;
  position: absolute;
  height: 20px;
}

#select-by_widget .row .is span {
  height: 20px;
  line-height: 25px;
  font-size: 10px;
  position: absolute;
  width: 40px;
  right: 0px;
  text-align: center;
  top: 0;
}

#select-by_widget .row .not {
  height: 20px;
  line-height: 25px;
  font-size: 10px;
  position: absolute;
  width: 44px;
  right: 0;
  top: 0;
  text-align: center;
}

#select-by_widget .row label {
  cursor: pointer;
}

#select-by_widget .row div.count {
  width: 72px;
  background-color: rgba(50, 50, 50, 0.1);
  height: 20px;
  text-align: right;
  text-overflow: unset;
  padding-right: 4px;
  position: absolute;
  overflow: hidden;
  left: 0;
  top: 0;
}

#select-by_widget .row {
  height: 20px;
  position: relative;
  top: 0;
  left: 0;
  background-color: rgba(255, 255, 255, 0.6);
}

#select-by_widget .row,
#select-by_widget .tags_title {
  border-bottom: 1px solid #ccc;
}

#select-by_widget .tags_title {
  color: #555;
  height: 15px;
  font-size: 10px;
  font-weight: bold;
  text-align: center;
  background-color: rgba(50, 50, 50, 0.1);
}

#select-by_widget {
  height: 480px;
}

.widget,
#remove_tags_widget,
#add_tags_widget,
#reblog_widget,
#backdate_widget,
#snapshot-info_widget,
#urlstuff_widget,
#add-caption_widget,
#select-by_widget {
  background: rgba(235, 235, 235, 0.9) none !important;
  box-shadow: inset 0 0 4px 5px #fff,
    inset 0 0 5px 2px #000,
    0 0 8px 1px #000;
  border-radius: 9px;
  position: fixed;
}

#select-by_widget {
  font: normal 12px 'Lucida Grande', Verdana, sans-serif;
  padding: 9px;
  width: 440px;
  text-align: left;
  z-index: 10;
}

#tag_editor * {
  font: normal 14px/1.4 "Helvetica Neue",
    "HelveticaNeue", Helvetica, Arial, sans-serif;
}

#tags,
#tag_editor,
#widget_scrolling_part {
  box-shadow: inset 0 0 0 1px #ccc,
    inset 0px 3px 6px 0px #ccc;
}

#tag_editor {
  background: none rgba(255, 255, 255, 0.7);
}

#widget_scrolling_part {
  overflow-x: hidden;
  overflow-y: auto;
  position: absolute;
  top: 48px;
  left: 4px;
  right: 4px;
  bottom: 48px;
  cursor: default;
}

#widget-top-buttons,
#widget-top-buttons .sort {
  position: absolute;
}

#widget-top-buttons {
  top: 0;
  left: 0;
  right: 0;
}

#widget-top-buttons .sort {
  top: 30px;
  font-size: 12px;
  font-weight: bold;
  color: #555;
  cursor: pointer;
}

#widget-top-buttons .sort.num {
  left: 15px;
}

#widget-top-buttons .sort.abc {
  left: 90px;
}

#widget-top-buttons .sort.date {
  left: 185px;
}

.row .tag-icon {
  display: inline-block;
  width: 20px;
  height: 20px;
  margin-right: 5px;
  margin-left: 1px;
  opacity: 0.6;
}

.row.type.notes-more-than .number-input,
.row.type.notes-less-than .number-input {
  border: 1px solid #555;
  width: 90px;
  position: absolute;
  right: 88px;
  height: 18px;
  top: 0;
  border: 1px solid #555;
  box-shadow: inset 0 1px 2px 0px #ccc;
}

#urlstuff_widget input {
  width: 180px;
  height: 22px;
  border: 1px solid #999;
  padding: 2px;
  box-shadow: inset 0 1px 2px 0px #555;
}

#select-by-widget_title {
  font-size: 17px;
  font-weight: bold;
  color: #555;
}

#select-by-widget_title .preselect-count {
  color: rgba(0, 130, 0, 0.6);
  font-size: 12px;
  background-color: #fff;
  height: 21px;
  min-width: 60px;
  border-radius: 12px;
  box-shadow: inset 0 1px 2px 0px #555;
  margin-left: 12px;
  position: absolute;
  top: 8px;
  left: 160px;
  text-align: center;
  line-height: 21px;
  transform: translateX(-505%);
}

#uncheck+label {
  color: #999;
}

#show-only:checked+label+#uncheck+label+span,
#show-only+label {
  color: #999;
}

#show-only:checked+label,
#uncheck:checked+label {
  color: #555;
}

#show-only:checked+label+#uncheck+label,
#show-only:checked+label+#uncheck {
  visibility: hidden;
}

#show-only {
  margin-top: 5px;
  margin-right: 60px;
}

#show-only,
#show-only+label {
  float: right;
}

#select-by_widget .select-by_ltgt {
  position: absolute;
  bottom: 5px;
  right: 90px;
  border: 1px solid #888;
  width: 203px;
  height: 39px;
}

#gt_input,
#lt_input {
  position: absolute;
  left: 78px;
}

#lt_input,
#lt_input+label {
  top: 4px;
}

#gt_input,
#gt_input+label {
  top: 22px;
}

#gt_input+label,
#lt_input+label {
  left: 0px;
  width: 72px;
  position: absolute;
  color: #999;
  text-align: right;
  cursor: pointer;
}

#gt_input:checked+label,
#lt_input:checked+label {
  color: #555;
}

#lt_input+label+#gt_input+label+#hide-ltgt-than-tags {
  opacity: 0.5;
  width: 55px;
  position: absolute;
  top: 8px;
  left: 97px;
  border: 1px solid #555;
  box-shadow: inset 0 1px 2px 0px #ccc;
  height: 23px;
}

#lt_input+label+#gt_input:checked+label+#hide-ltgt-than-tags,
#lt_input:checked+label+#gt_input+label+#hide-ltgt-than-tags {
  opacity: 1;
}

.l-content .brick .title {
  margin: 0;
  padding: 0;
  background-color: rgba(255, 255, 255, 0.1);
  overflow: hidden;
  width: 110px;
}

.l-content .brick>* {
  max-width: 125px;
}

.l-content .brick.picked {
  overflow: visible;
  box-shadow: 0 0 12px 2px rgba(14, 19, 84, 0.5);
  z-index: 60;
}

.l-content .brick.highlighted {
  animation: updown 0.1s ease-in both;
}

.l-content .brick.highlighted.picked {
  overflow: visible;
  box-shadow: 0 0 12px 2px rgba(0, 0, 0, 0.5);
  z-index: 60;
}

.l-content .brick.prevent-anim,
.l-content .brick.highlighted.picked {
  animation: none;
}
*/}).toString().slice(15,-3) + // this is a pointing hand graphic
'.l-content .brick.picked:before { content: ""; top: -35px;\n'+
'width: 50px; height: 50px; position: absolute;left: 25px;\n' +
'animation: updown 0.5s infinite ease-out both;\n' + // bounces up&down :)
'background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iM' +
'S4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM' +
'6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0ia' +
'HR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly9' +
'3d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0ia' +
'HR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9' +
'yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY' +
'2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR' +
'0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9I' +
'jI0IgogICBoZWlnaHQ9IjI0IgogICB2aWV3Qm94PSIwIDAgMjQgMjQiCiAgIHZlcnNpb24' +
'9IjEuMSIKICAgaWQ9InN2ZzQiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImI2NC5zdmciCiAgI' +
'Glua3NjYXBlOnZlcnNpb249IjAuOS41ICgyMDYwZWMxZjlmLCAyMDIwLTA0LTA4KSI+CiA' +
'gPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTAiPgogICAgPHJkZjpSREY+CiAgICAgI' +
'DxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0Pml' +
'tYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgI' +
'HJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2U' +
'iIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KI' +
'CAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM4IiA' +
'vPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgI' +
'CAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICB' +
'vYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1a' +
'WRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICB' +
'pbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iN' +
'zMyIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR' +
'2aWV3NiIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iOS44I' +
'gogICAgIGlua3NjYXBlOmN4PSIxMiIKICAgICBpbmtzY2FwZTpjeT0iMTIiCiAgICAgaW5' +
'rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAga' +
'W5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWx' +
'heWVyPSJzdmc0IiAvPgogIDxwYXRoCiAgICAgZD0ibSA1LjQsMTYuNCBjIDEuMSwwLjIgN' +
'C42LDAuOSA1LjUsMS4wIHYgMy41IGMgMCwxLjYgMS4zLDIuOSAzLDIuOSAxLjYsMCAzLC0' +
'xLjMgMywtMi45IHYgLTcuNCBjIDAuNSwwLjMgMS4xLDAuNiAxLjgsMC43IEMgMjAuNiwxN' +
'C41IDIyLDEzLjMgMjIsMTEuOCAyMiwxMSAyMS42LDEwLjEgMjAuOSw5LjUgMTcuMCw1LjU' +
'gMTUuMiw0LjQgMTQuOSwwIEggNSB2IDEuNyBjIDAsNS4xIC0zLDYuMCAtMywxMC4wIDAsM' +
'i40IDEuMCw0LjEgMy40LDQuNiB6IgogICAgIGlkPSJwYXRoMTQiIC8+CiAgPHBhdGgKICA' +
'gICBkPSJNIDUuMSw4LjQgQyA1LjksNi45IDYuOSw1LjEgNi45LDIgaCA2LjEgYyAwLjcsM' +
'y44IDMuOCw2LjMgNi40LDguOSAwLjYsMC42IDAuMywxLjMgLTAuNCwxLjMgQyAxNy44LDE' +
'yLjMgMTYuMCwxMC40IDE1LDkuMSBWIDIxLjAgQyAxNSwyMS41IDE0LjUsMjIgMTQsMjIgM' +
'TMuNCwyMiAxMywyMS41IDEzLDIxLjAgdiAtNi45IGMgMCwtMC4zIC0wLjIsLTAuNSAtMC4' +
'1LC0wLjUgLTAuMywwIC0wLjUsMC4yIC0wLjUsMC41IHYgMC41IGMgMCwwLjUgLTAuNCwwL' +
'jkgLTEuMCwwLjggLTAuMywtMC4wIC0wLjYsLTAuNCAtMC42LC0wLjggdiAtMS4yIGMgMCw' +
'tMC4zIC0wLjIsLTAuNSAtMC41LC0wLjUgLTAuMywwIC0wLjUsMC4yIC0wLjUsMC41IHYgM' +
'C44IGMgMCwwLjUgLTAuNCwwLjkgLTEuMCwwLjggQyA3LjYsMTQuOSA3LjMsMTQuNiA3LjM' +
'sMTQuMiB2IC0xLjUgYyAwLC0wLjMgLTAuMiwtMC41IC0wLjUsLTAuNSAtMC4zLDAgLTAuN' +
'SwwLjIgLTAuNSwwLjUgdiAwLjkgYyAwLDAuNSAtMC41LDAuOCAtMS4wLDAuNiBDIDQuNSw' +
'xMy45IDQsMTMuMyA0LDExLjcgNCwxMC40IDQuNCw5LjUgNS4xLDguNCBaIgogICAgIGlkP' +
'SJwYXRoMiIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIiAvPgo8L3N2Zz4K") 0 0 ' +
'no-repeat transparent;\nbackground-size: 50px 50px; z-index: 1001;}' +
// this ^ is a hand pointing pointer graphic
// this v is a tiny robot head icon
'.robot-warning { padding: 8px 9px 8px 21px;' + // :) tampermonkey tells
'background: 4px 2px no-repeat url("' + //  me it's superfluous to combine
'data:image/png;base64,iVBORw0KGgoAAAANSU' + //  string literals with the
'hEUgAAABAAAAAYBAMAAAABjmA/AAAAElBMVEUAAA' + // + operator! but it's
'ABBABHSEajnp28trX8//tPIl81AAAAAXRSTlMAQO' + // also not lint to
'bYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAALiMAAC' + // go above 80 characters
'4jAXilP3YAAAAHdElNRQfkBQgSLgK2/ku1AAAAa0' + // in width...
'lEQVQI123O2w3AIAgFUNygoAxANzBxAasL+OH+qx' + // dear StackExchange...
'R8tGnS+3USLgEAAIQZ148J7m0jr9G1Rk8Z3Be4An' +
'SOCIQ6khWp1mKIkgp5BfeQe/tFxFTQOsW2k4KIRM' + // kumate!
'Q6zK1ZxxuiQuwk5ffWfuMG6yMYLhjK67sAAAAASU' +
'VORK5CYII=") rgba(255,190,170,1);' +
'box-shadow: 0 0 0 1px red;font-size: 12px;font-weight: normal;'+
'color: red; width: 172px;overflow-wrap: normal;'+
'white-space: normal;margin: 9px;display:block;}' +
(function () {/*
.l-content .brick .private_overlay {
  z-index: 9;
}

.robot-warning strong {
  font-size: 13px;
  font-weight: bold;
  display: block;
}

.blue_bar .editor_navigation .notice {
  color: rgba(150, 150, 150, 1);
  margin: 0;
  padding: 5px 0px 0px 5px;
  float: right;
}

.l-content .brick .caption {
  display: none;
}

.l-content.with-captions.hoverless .brick .caption,
.l-content.with-captions .brick:hover .caption {
  display: table;
  background: rgba(40, 50, 60, 0.6);
  box-shadow: inset 0 0 0 4px rgba(40, 50, 60, 0.6);
  color: #fff;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 99;
  text-align: left;
  width: 125px;
  height: 100%;
  animation: fadein 0.5s ease-in-out both;
}

.overflow-table {
  display: table;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 125px;
  height: 100%;
}

.overflow-row,
.caption-tr {
  display: table-row;
}

.overflow-cell,
.caption-td {
  display: table-cell;
  text-align: center;
  vertical-align: middle;
}

.overflow-inline {
  display: inline-block;
  text-align: left;
}

.caption-inline-block {
  display: inline-block;
  text-align: left;
  max-width: 115px;
  max-height: 115px;
  overflow: hidden;
}

.header_button > input[disabled]+.widget+.chrome svg,
.header_button > input[disabled]+.widget+.chrome .arrow,
.chrome.big_dark[disabled] svg {
  opacity: 0.5;
}

.blue_bar .editor_navigation .header_button .chrome .chrome_button {
  padding: 1px 0px 0px 2px;
  font-family: Franklin Gothic Medium Compressed, Arial, Helvetica, sans-serif;
  font-size: 13px;
  line-height: 14px;
  font-weight: normal;
}

.chrome.big_dark svg, .chrome_button svg {
  opacity: 1;
  margin-right: 1px;
  vertical-align: baseline;
  max-width: 13px;
  max-height: 13px;
  margin-left: 4px;
  position: relative;
}

#neue_post_form-iframe {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  z-index: 999;
  background-color: rgba(0, 10, 30, 0.9);
  animation: fadein 0.5s ease-in-out both;
}

.l-content .links-layer {
  display: none;
}

.l-content .brick .edited-gif,
.l-content.with-links .brick:hover .links-layer,
.l-content.with-links.hoverless .brick .links-layer {
  background-color: rgba(40, 50, 60, 0.6);
  box-shadow: inset 0 0 0 4px rgba(40, 50, 60, 0.6);
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  color: #fff;
  z-index: 100;
  display: table;
  width: 125px;
  height: 100%;
  animation: fadein 0.5s ease-in-out both;
}

.tags-layer h2, .tags-layer a {
  color: inherit;
}

.follow .tag-container {
  max-width: 89px;
  overflow: hidden;
  max-height: 100px;
}

.l-content.with-links .brick:hover .tags-layer,
.l-content.with-links .brick:hover .links-layer,
.l-content.with-links.hoverless .brick .tags-layer,
.l-content.with-links.hoverless .brick .links-layer {
  transition: all 0.2s ease-out;
}

.l-content.with-links.hoverless .brick:hover .links-layer,
.l-content.with-links.hoverless .brick:hover .tags-layer {
  color: rgba(255, 255, 255, 0);
  background-color: rgba(0, 0, 0, 0);
}

.l-content.with-links .brick.highlighted:hover .links-laye
.l-content.with-links.hoverless .brick.highlighted .links-layer {
  z-index: 1000;
  background-color: rgba(0, 80, 255, 0.5);
  box-shadow: inset 0 0 0 4px rgba(115, 186, 231, 1);
}

.l-content.with-links.hoverless .brick.highlighted:hover .links-layer {
  background-color: rgba(0, 80, 255, 0.05);
}

.brick.highlighted a.link-reblog,
.brick.highlighted a.link-like,
.brick.highlighted a.link-edit,
.brick.highlighted a.link-view {
  background: rgba(115, 186, 231, 1);
}

.l-content .brick .edited-gif .trow,
.l-content.with-links .brick:hover .links-layer .trow,
.l-content.with-links.hoverless .brick .links-layer .trow {
  display: table-row;
  vertical-align: middle;
  text-align: center;
}

.l-content .brick .tags-layer,
.l-content .brick .edited-center {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
  padding: 0px 18px 0 18px;
}

.links-layer a.link-view {
  position: absolute;
  right: 4px;
  top: 4px;
  border-bottom-left-radius: 5px
}

.links-layer a.link-edit {
  position: absolute;
  left: 4px;
  bottom: 4px;
  border-top-right-radius: 5px;
}

.links-layer a.link-like {
  right: 4px;
  bottom: 4px;
  border-top-left-radius: 5px;
}

.links-layer a.link-reblog {
  left: 4px;
  top: 4px;
  border-bottom-right-radius: 5px;
}

.links-layer a.link-reblog,
.links-layer a.link-like,
.links-layer a.link-edit,
.links-layer a.link-view {
  background-color: rgba(40, 50, 60, 0.6);
  padding: 3px;
  width: 20px;
  height: 20px;
  text-align: center;
  position: absolute;
}

svg.big-heart,
svg.big-reblog {
  position: absolute;
  left:0;
  bottom:0;
  width: 125px;
  height: 125px;
  z-index: 999;
  animation: happy-bounce 1.7s ease-out both;
}

.links-layer a.link-reblog.clicked svg,
.links-layer a.link-like.clicked svg {
  animation: flip 0.75s infinite ease-out both;
  position: relative;
}

.links-layer a.link-reblog.reblogged {
  cursor: default;
}

#view-links_button svg {
  margin: 0;
}

#mpe_title {
  position: relative;
  display: inline-block;
}

.post-state-nav-item {
  display: inline-block;
  text-decoration: none;
}

.post-state-nav-item svg {
  opacity: 0.5;
  display: inline-block;
  vertical-align: text-top;
}

.post-state-nav-item.active svg {
  opacity: 1;
}

.blue_bar .post-state-nav .post-state-nav-item {
  color: #99a3ae;
  font-weight: bold;
  padding: 3px 6px;
  top: -3px;
  left: 0;
  z-index: 9;
  position: relative;
  background: #001935 none;
}

#re-as-draft:checked+label+.robot-warning {
  display: none;
}

#re-as-draft+label {
  color: #7D99FF;
  padding-left: 5px;
  font-size: 20px;
}

#reblog_widget {
  display: none;
}

.open #reblog_widget {
  width: 300px;
  height: 200px;
  z-index: 999;
  left: 340px;
  display: table;
}

#urlstuff_widget,
#backdate_widget,
#snapshot-info_widget,
#add-caption_widget {
  z-index: 9;
}

#reblog_widget .trow {
  display: table-row;
}

#reblog_widget .inner {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
}

#reblog_widget h2 {
  color: #555;
  font-size: 17px;
}

#reblog-widget_input {
  width: 190px;
  padding: 6px;
  box-shadow: inset 0 2px 3px 0px rgba(0, 0, 0, 0.5);
  margin: 0;
  border: 0 none;
}

.header_button > input[disabled]+.widget+.chrome,
#reblog-widget_input[disabled] {
  color: #ccc;
}

#browse_months {
  position: relative;
  top: -3px;
  left: 0;
}

iframe#browse_months_widget {
  height: 423px;
  width: 226px;
  border-radius: 5px;
  box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2);
}

div#browse_months_widget {
  height: 422px;
  width: 225px;
  padding: 0px;
  top: 0px;
  left: 0px;
}

.post-state-nav,
#mpe_title,
#nav-photo {
  border-left: 1px solid #122943;
  padding-left: 20px;
}

#nav_archive {
    text-align: center;
    line-height: 18px;
}

.blue_bar .title, #browse_months {
    display: inline-block;
    flex-direction: unset;
    float: none;
}

.chrome_button_right, .chrome_button_left {
  display: inline;
}

#tags {
  padding: 5px;
}

#tags div {
  margin: 0px 5px 5px 0px;
  overflow: hidden;
  display: inline-block;
  border: solid 1px rgba(255,75,35,1);
  background-color: rgba(255,75,35,0.4);
  padding: 5px;
  border-radius: 2px;
  color: #111;
  max-width: 200px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

#photos-drop-zone.full {
  cursor: copy;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  height: 100%;
  width: 100%;
  background-color: rgba(200,255,200,0.5);
  z-index: 1000;
}

#photos-drop-zone {
  top: 90px;
  left: 20px;
  width: 300px;
  height: 190px;
  transition: all 0.4s ease-out;
  background-color: rgb(220, 220, 220);
  position: fixed;
  display: block;
  text-align: center;
  border-radius: 14px;
  box-shadow: inset 0 0 0 5px #f4f4f4, 0 0 0 4px rgb(220, 220, 220);
  z-index: 9;
}

#photos-drop-zone h2 {
  color: #f4f4f4;
  display: inline;
  font-size: 25px;
  font-weight: bold;
  top: 20px;
  position: relative;
  text-align: center;
  display: block;
}

#photos-drop-zone input {
  position: relative;
  top: 210px;
}

#drop_images_here {
  position: fixed;
  top: 168px;
  left: 70px;
  z-index: 12;
  font-size: 23px;
}

#photo_file_input {
  position: fixed;
  bottom: 40px;
  left: 40px;
}

#post_all_photos_button {
  position:fixed;
  top: 300px;
  cursor: pointer;
  color: #fff;
  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
  font-size: 14px;
  line-height: 14px;
  left: 40px;
}

#post_all_photos_button[disabled] {
  color: #ccc;
}

.photo-brick.upload-working {
  animation: updown 0.3s infinite linear;
}

span.im-ready {
  animation: updown 0.25s 5 ease-out;
  position: relative;
  display: inline-block;
  z-index: 9;
}

.photo-brick-img,
.photo-brick {
  transition: all 0.4s ease-out;
}
.photo-brick {
  position: absolute;
  width: 500px;
  background-color: rgb(220, 220, 220);
  cursor: grab;
  display: table;
  min-height: 150px;
}

.img-count {
  position: absolute;
  bottom: 0;
  right: 0;
  font-size: 21px;
  color: rgba(255,255,255,0.9);
  z-index: 9;
  font-weight: bold;
  background-color: rgba(0,0,0,0.65);
  padding: 6px 9px;
  border-top-left-radius: 9px;
}

.photo-inner {
  display: table-row;
  height: 100%;
  width: 100%;
}

.photo-brick-img.brick-dragging,
.photo-brick.brick-dragging {
  z-index: 1000;
  opacity: 0.3;
  box-shadow: 0 0 5px 2px #000;
  transition: none;
  postion: absolute;
}

.photo-brick.hl-top {
  border-top: 3px dashed #0cf;
  margin-top: 5px;
}

.photo-brick.hl-bottom {
  margin-top: -5px;
  border-bottom: 3px dashed #0cf;
}

.hl-up {
  border-top: 3px dashed #0cf;
  margin-top: 5px;
}

.hl-down {
  border-bottom: 3px dashed #0cf;
  margin-bottom: 5px;
}

.hl-left {
  border-left: 3px dashed #0cf;
  margin-left: 5px;
}

.hl-right {
  border-right: 3px dashed #0cf;
  margin-right: 5px;
}

.photo-brick-edit {
  display: table-cell;
}

.photo-brick-img-cell {
  position: relative;
  display: table-cell;
  vertical-align: middle;
  text-align: center;
  top: 0;
  left: 0;
  width: 137px;
  background-color: #001935;
}

.pre-photoset .photo-brick-img-cell {
  background-color: #405975;
  box-shadow: inset 0 0 8px 1px #fff;
}

.photo-brick-img:first-child {
  margin-top: 5px;
}

.photo-brick-img {
  display: inline-block;
  position: relative;
  top: 0;
  left: 0;
  margin-bottom: 5px;
}

.photo-brick-img.brick-dragging,
.photo-brick-img.brick-dragging img,
.row-with-one-img,
.row-with-one-img img {
  width: 125px;
}

.row-with-two-img,
.row-with-two-img img {
  width: 60px;
}

.row-with-three-img,
.row-with-two-img {
  overflow: hidden;
}

.row-with-three-img img,
.row-with-two-img img {
  width: 100%;
  height: auto;
  max-width: 125px;
}

.row-with-two-img.data-photoset-a {
  margin-right: 5px;
}

.row-with-three-img,
.row-with-three-img img {
  width: 38px;
}

.row-with-three-img.data-photoset-a,
.row-with-three-img.data-photoset-b {
  margin-right: 5px;
}

.photo-brick img {
  user-drag: none;
  user-select: none;
  -moz-user-select: none;
  -webkit-user-drag: none;
  -webkit-user-select: none;
  -ms-user-select: none;
}

.photo-brick-edit .rich {
  background-color: rgba(255,255,255,0.8);
  margin: 34px 6px 0px 6px;
  box-shadow: inset 0 2px 3px 0 #999;
  padding: 5px;
  cursor: auto;
  overflow-y: scroll;
  overflow-x: hidden;
  text-align: left;
  display: block;
  width: 340px;
  height: calc(100% - 42px);
}

#add-caption_widget .rich {
  background-color: rgba(255,255,255,0.8);
  margin: 30px 7px 0px 7px;
  box-shadow: inset 0 2px 3px 0 #999;
  padding: 5px;
  cursor: auto;
  overflow-y: scroll;
  overflow-x: hidden;
  display: block;
  width: 340px;
  height: 150px;
  text-align: left;
}

#add-caption_widget.visible-url .chrome,
#add-caption_widget .chrome,
.focused-rich.visible-url .photo-brick-edit .chrome,
.photo-brick-edit .chrome {
  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
  font-size: 14px;
  display: none;
  position: absolute;
  cursor: pointer;
  min-width: 30px;
}

#add-caption_widget {
  height: 300px;
  width: 365px;
}

#snapshot-info_body {
  cursor: auto;
}

#snapshot-info_widget {
  padding: 20px;
  width: 400px;
  height: 320px;
}

#snapshot-info_body {
  position: relative;
  top: 0;
  left: 0;
  height: 360px;
}

#new-blogs {
  right: 10px;
  bottom: 55px;
}

#missing-blogs {
  left: 10px;
  bottom: 55px;
}

#snapshot-info_body h2 {
  display: inline-block;
  width: 190px;
  text-align: center;
}

#missing-blogs, #new-blogs {
  border: 1px solid #555;
  height: 240px;
  width: 169px;
  padding: 8px;
  position: absolute;
  overflow-x: hidden;
  text-overflow: ellipsis;
  overflow-y: auto;
  font: normal 11px 'Lucida Grande', Verdana, sans-serif;
  color: #555;
  background-color: rgba(255, 255, 255, 0.7);
}

#backdate_widget {
  height: 260px;
  width: 540px;
  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
  font-size: 14px;
}

#backdate_widget .chrome{
  margin: 5px;
  float: right;
  padding: 0 8px;
}

#snapshot-info_widget .chrome,
#backdate_widget .chrome,
#add-caption_widget .chrome {
  border: 0 none;
}

.focused-rich.visible-url .photo-brick-edit .chrome,
.photo-brick-edit .chrome {
  top: 3px;
}

#add-caption_widget .chrome {
  top: 45px;
}

.photo-brick.focused-rich {
  z-index: 100;
  box-shadow: 0 0 5px 1px #03f;
  margin: -2px 0px 0px 5px;
}

.photo-brick-edit .photo-tags {
  max-height: 135px;
  display: inline-block;
  position: absolute;
  right: 0;
  max-width: 300px;
  overflow: hidden;
  text-overflow: ellipsis;
  top: 0;
  transform: translateX(100%);
}

.focused-rich .photo-tags {
  overflow: auto;
  background-color: rgba(0, 33, 255, 0.5);
  padding: 4px 0px 0px 6px;
}

#add-caption_widget.visible-url .chrome,
#add-caption_widget .chrome,
.focused-rich .photo-brick-edit .chrome {
  display: block;
}

.stripe {
  position: absolute;
  top: 7px;
  left: 143px;
  border-top: 5px solid #BBB;
  height: 10px;
  width: calc(100% - 150px);
  display: block;
  border-bottom: 5px solid #BBB;
}

.focused-rich .photo-brick-edit .stripe {
  display: none;
}

.focused-rich .photo-brick-edit .photo-tags .token {
  float: left;
  padding: 3px 5px;
  border: solid 1px #b7c963;
  background-color: #C7DA76;
  color: #111;
  margin: 0px 5px 5px 0px;
  border-radius: 2px;
  font: normal 14px/1.4 "Helvetica Neue",
    "HelveticaNeue", Helvetica, Arial, sans-serif;
  text-decoration: none;
  cursor: auto;
}

.photo-brick-edit .photo-tags .token .tag:before {
  content: "#";
  display: inline-block;
}

.focused-rich .photo-brick-edit .photo-tags .token .tag:before {
  content: "";
  display: none;
}

.photo-brick-edit .token a {
  display: none;
}

#add-caption_widget a,
.focused-rich .photo-brick-edit .token a {
  font-weight: bold;
  margin-left: 7px;
  text-decoration: none;
  color: #749440;
  display: inline-block;
}

.photo-brick-edit .photo-tags .token {
  float: left;
  padding: 3px 5px;
  color: #999;
  font-weight: bold;
  margin: 0px 5px 5px 0px;
  font: normal 14px/1.4 "Helvetica Neue",
    "HelveticaNeue", Helvetica, Arial, sans-serif;
  text-decoration: underline;
  display: inline-block;
  cursor: auto;
}

.photo-brick-edit .clone_abc_button {
  right: 265px;
  width: 94px;
  line-height: 11px;
  top: -31px;
  box-shadow: 0 1px 0 3px rgb(220, 220, 220),
              0 0 5px 3px #03f;
}

#add-caption_widget .pink_button,
#add-caption_widget .x_button,
.photo-brick-edit .pink_button,
.photo-brick-edit .x_button {
  right: 327px;
  font-weight: 900;
  color: #f00;
}

#add-caption_widget .red_button,
#add-caption_widget .b_button,
.photo-brick-edit .red_button,
.photo-brick-edit .b_button {
  right: 295px;
  font-weight: 900;
}

#add-caption_widget .orange_button,
#add-caption_widget .i_button,
.photo-brick-edit .orange_button,
.photo-brick-edit .i_button {
  right: 263px;
  font-style: italic;
}

#add-caption_widget .yellow_button,
#add-caption_widget .s_button,
.photo-brick-edit .yellow_button,
.photo-brick-edit .s_button {
  right: 231px;
  font-style: italic;
  text-decoration-line: line-through;
}

#add-caption_widget .green_button,
#add-caption_widget .a_button,
.photo-brick-edit .green_button,
.photo-brick-edit .a_button {
  right: 199px;
  color: #009;
  text-decoration-line: underline;
}

#add-caption_widget .ok_button,
.focused-rich .photo-brick-edit .ok_button {
  right: 7px;
  display: none;
}

#add-caption_widget.visible-url .chrome,
#add-caption_widget.visible-colors .chrome,
#add-caption_widget .colors_buttons,
.focused-rich.visible-colors .photo-brick-edit .chrome,
.photo-brick-edit .colors_buttons,
.focused-rich .photo-brick-edit .colors_buttons {
  display: none;
}

#add-caption_widget .a_button_input,
.photo-brick-edit .a_button_input,
.focused-rich .photo-brick-edit .a_button_input {
  display: none;
  right: 199px;
  color: #009;
  text-decoration-line: underline;
  position: absolute;
  top: 3px;
  height: 30px;
  width: 318px;
  padding: 0 3px;
  left: 143px;
  background-color: #fff;
  box-shadow: 0 0 0 1px #eee, inset 0 2px 2px 0 #000;
}

#add-caption_widget.visible-url .a_button_input,
#add-caption_widget.visible-url .ok_button,
.focused-rich.visible-url .photo-brick-edit .a_button_input,
.focused-rich.visible-url .photo-brick-edit .ok_button {
  display: block;
}

#add-caption_widget.visible-colors .colors_buttons,
.focused-rich.visible-colors .photo-brick-edit .colors_buttons {
  display: block;
}

#add-caption_widget .cerulean_button,
#add-caption_widget .h_button,
.photo-brick-edit .cerulean_button,
.photo-brick-edit .h_button {
  right: 167px;
  font-weight: 900;
}

#add-caption_widget .blue_button,
#add-caption_widget .ol_button,
.photo-brick-edit .blue_button,
.photo-brick-edit .ol_button {
  right: 135px;
}

#add-caption_widget .ul_button,
.photo-brick-edit .ul_button {
  right: 103px;
}

#add-caption_widget .bq_button,
.photo-brick-edit .bq_button {
  right: 71px;
}

#add-caption_widget .colors_button,
.photo-brick-edit .colors_button {
  right: 39px;
}

#add-caption_widget .q_button,
.photo-brick-edit .q_button {
  right: 7px;
  font-family: Fairwater, serif;
  font-size: 17px;
  line-height: 26px;
}

#add-caption_widget .colors_button .color,
.photo-brick-edit .colors_button .color {
  width: 14px;
  height: 17px;
  border-radius: 6px;
  box-shadow: inset 0 0 0 1px #fff;
  background: linear-gradient(
    to bottom,
    rgba(255,0,0,1) 0%,
    rgba(255,85,0,1) 20%,
    rgba(255,255,0,1) 40%,
    rgba(0,255,0,1) 60%,
    rgba(0,0,255,1) 80%,
    rgba(255,0,255,1) 100%
  );
}

#photos_as_draft_container {
    position: fixed;
    top: 340px;
    left: 50px;
}

#photos_as_draft + label + .robot-warning {
  display: block;
}

#photos_as_draft:checked + label + .robot-warning {
  display: none;
}

#return_to_dash_link {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  color: #555;
  font-size: 45px;
}

#add-caption_widget .robot-warning {
  display: inline-block;
}

.pend-container {
  text-align: left;
}

.pend-container div {
  height: 20px;
}

.pend-container label {
  cursor: pointer;
}

#overwrite-caption-option + label +.robot-warning {
  position: absolute;
  left: 70px;
  bottom: -11px;
  width: 136px;
  display: none;
  height: 50px;
}

#overwrite-caption-option:checked + label +.robot-warning {
  display: block;
}

.pend-container {
  position: relative;
  left: 6px;
  bottom: -6px;
}

#bt-no-time + label,
#bt-one-time + label,
#bt-two-time + label,
#bd-no-day + label,
#bd-one-day + label,
#bd-two-day + label {
  width: 130px;
  text-align: left;
  height: 19px;
  background-color: rgba(14,20,25,0.5);
  border-radius: 10px;
  color: #fff;
  padding: 5px 20px;
}

#bt-no-time:checked + label,
#bt-one-time:checked + label,
#bt-two-time:checked + label,
#bd-no-day:checked + label,
#bd-one-day:checked + label,
#bd-two-day:checked + label {
  background-color: #0ae;
}

#bt-no-time,
#bt-one-time,
#bt-two-time,
#bd-no-day,
#bd-one-day,
#bd-two-day {
  position: relative;
  left: 18px;
}

.date-input-bunch * {
  float: left;
  line-height: 17px;
}

.date-input-bunch {
  display: inline-block;
  background-color: rgba(30,85,125,1);
  color: #fff;
  margin: 0px 3px;
  width: 245px;
  height: 22px;
  top: 9px;
  position: relative;
  padding: 3px 0px 3px 5px;
}

.date-input-bunch input[type="number"] {
  margin-left: 3px;
  max-width: 50px;
  box-shadow: inset 0px 1px 3px 0px #000;
}

.date-input-bunch label {
  text-align: center;
  color: #0ae;
  width: 40px;
  font-size: 14px;
  font-weight: bold;
  line-height: 22px;
}

.date-input-bunch label.rlabel {
  background-color: #3bc;
  color: #fff;
  border-bottom-right-radius: 9px;
  border-top-right-radius: 9px;
  height: 21px;
}

.date-input-bunch label.rlabel.narrow {
  width: 20px;
}

.date-input-bunch .linput {
 width: 40px;
}

#bt-no-time:checked+label+.date-input-bunch+.date-input-bunch,
#bt-no-time:checked+label+.date-input-bunch,
#bd-no-day:checked+label+.date-input-bunch+.date-input-bunch,
#bd-no-day:checked+label+.date-input-bunch {
  opacity: 0.3;
}

#bt-one-time:checked+label+input+label+input+label+
.date-input-bunch+.date-input-bunch,
#bd-one-day:checked+label+input+label+input+label+
.date-input-bunch+.date-input-bunch {
  opacity: 0.3;
}

#backdate_widget div {
  margin-bottom: 7px;
}

#pmright+label:before,
#pmleft+label:before {
  position: relative;
  content: "am";
  display: inline-block;
}

#pmright:checked+label:before,
#pmleft:checked+label:before {
  content: "pm";
}

.source-label1 {
  position: absolute;
  bottom: 0;
  left: 0;
  z-index: 9;
  background-color: rgba(0,0,0,0.5);
  border-radius: 30px;
}

.source-label2 {
  position: absolute;
  bottom: 0;
  right: 0;
  z-index: 9;
  background-color: rgba(100,110,255,0.4);
  border-radius: 30px;
}

.follower-pop-t {
  display: table;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,0.8);
  z-index: 1000;
}

.follower-pop-tr {
  display: table-row;
  width: 100%;
  height: 100%;
}

.follower-pop-td {
  display: table-cell;
  width: 100%;
  height: 100%;
  text-align: center;
  vertical-align: middle;
}

.follower-pop-inner {
  display: inline-block;
  width: 512px;
}

.follower-pop-av,
.follower-pop-img {
  display: inline-block;
  width: 512px;
  height: 512px;
}

.follower-pop-title {
  font-size: 45px;
  padding: 9px;
  line-height: 45px;
}

.l-content .brick.follow.missing-follows-info .overlay {
  opacity: 1;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: url(https://assets.tumblr.com/images/loading_ddd.gif)
              50% 20px no-repeat rgba(255,255,255,0.9);
  width: 125px;
  height: 125px;
  border: 0 none;
}
.l-content .brick.edit-reblog-queue .highlight {
  background: url(https://assets.tumblr.com/images/loading_ddd.gif)
              50% 20px no-repeat rgba(225,185,35,0.9);
  display: block;
  border-color: rgba(225,95,35,1);
}

.l-content .brick.edit-reblog-queue .highlight .note_count,
.l-content .brick.edit-reblog-queue .highlight .tag_count,
.l-content .brick.edit-reblog-queue .highlight .tag_count:after,
.l-content .brick.edit-reblog-queue .overlay .inner .date {
  background-color: rgba(225,95,35,1);
}

#hover-only {
  margin-left: 3px;
}

#hover-only,
#hover-only+label svg {
  vertical-align: text-bottom;
}

#hover-only+label svg {
  width: 10px;
  height: 10px;
}

#hover-only+label {
  font-weight: bold;
  color: #fff;
  opacity: 0.5;
  font-size: 10px;
}

#hover-only:checked+label {
  opacity: 1;
}

#hover-only, #hover-only+label {
  top: 3px;
  position: relative;
}

#who-follows-who {
    font-size: 24px;
}

#snapshot-info_body * {
  font-family: "Helvetica Neue",
    "HelveticaNeue", Helvetica, Arial, sans-serif;
}

#forget1_button, #forget2_button {
  position: absolute;
  bottom: 29px;
  padding: 0 9px;
}

#snapshot-info_body a {
  display: block;
  text-align: left;
  margin: 4px;
  font-size: 14px;
}

#forget1_button {
  left: 65px;
}

#forget2_button {
  right: 65px;
}

#snapshot-info_body h1 {
  color: #555;
  font-size: 20px;
  display: block;
  font-weight: bold;
}

#snapshot-load-gif {
  position: absolute;
  top: 0;
  left: 0;
}

#new-blogs a {
  color: #59f;
}

#missing-blogs a {
  color: #f00;
}

.l-content~.l-content {
  display: none;
}
*/}).toString().slice(15,-3)
    )
  );
  // all of my extra css are in this ^ inline style
  document.head.appendChild(pluginStyle);
  // end extra CSS

  // my plugin will not use unSafeWindow, so instead
  // this v, is how I shall use fake window scope wrapper variables
  // for asynchronous window functions, the plugin data must be in the DOM
  // the DOM can be accessed by both wrapper scopes
  // it's like a 4 dimensional being :)
  var pluginData = document.createElement("div");
  pluginData.id = "mass_post_features-plugin_data";
  pluginData.classList.add("blog-menu-preload");
  pluginData.classList.add("month-menu-preload");
  pluginData.setAttribute("widget_sort-by", "date-down");
  pluginData.setAttribute("data-last-post-index", "0");
  pluginData.setAttribute("data-select-all_needle", "0");
  pluginData.setAttribute("data-select-by_needle", "0");
  pluginData.setAttribute("data-last_month_timestamp", "0")
  pluginData.setAttribute("data-last_year_timestamp", "0");
  pluginData.setAttribute("widget_scroll-top", "0");
  pluginData.setAttribute("widget_first-focus", "hide-ltgt-than-tags");
  pluginData.setAttribute("select-by-note_lt", "10");
  pluginData.setAttribute("select-by-note_gt", "5");
  pluginData.setAttribute("hide-ltgt-than-tags", "5");
  pluginData.setAttribute("data-to-seconds", "0");
  pluginData.setAttribute("data-unstable-next-href", "0");
  pluginData.setAttribute("data-lt-to-select", "[]");
  pluginData.setAttribute("data-gt-to-select", "[]");
  pluginData.setAttribute(
    "data-all-to-select",
    "{\"istag\":[],\"nottag\":[],\"istype\":[],\"nottype\":[]}"
  );// this ^ has the 4 dimensions of the select-by widget
  pluginData.setAttribute("data-to-select", "[]");
  pluginData.setAttribute("data-tags_all_arr", "[]");
  pluginData.setAttribute("data-ids_all_arr", "[]");
  pluginData.setAttribute("data-visible_ids_all_arr", "[]");
  pluginData.setAttribute("data-types_all_arr", "[]");
  pluginData.setAttribute("data-follow-blogs-all", "[]");
  pluginData.setAttribute("data-new-blogs-all", "[]");
  pluginData.setAttribute("data-missing-blogs-all", "[]");
  pluginData.setAttribute("data-follow-blogs-all-updated", "0");
  pluginData.setAttribute("data-new-blogs-all-updated", "0");
  pluginData.setAttribute("data-missing-blogs-all-updated", "0");
  pluginData.setAttribute("data-id_to_tags", "{}");
  pluginData.setAttribute("data-id_to_types", "{}")
  pluginData.setAttribute("data-id_to_image", "{}");
  pluginData.setAttribute("data-id_to_origin", "{}");
  pluginData.setAttribute("data-id_to_state", "{}");
  pluginData.setAttribute("data-id_to_timestamp", "{}");
  pluginData.setAttribute("data-id_to_notes", "{}");
  pluginData.setAttribute("data-tag_to_ids", "{}");
  pluginData.setAttribute("data-type_to_ids", "{}");
  pluginData.setAttribute("data-csrf-token", "0");
  pluginData.setAttribute("data-reblog-to-here", name);
  pluginData.setAttribute("data-primary-blog", name); // correct guess later
  pluginData.setAttribute("data-tumblelogs", "[]"); // all blogss
  pluginData.setAttribute("data-primary-known", "false");
  pluginData.setAttribute("data-followers-loading", "false");
  pluginData.setAttribute("data-x-tumblr-form-key", "0");
  pluginData.setAttribute("data-column_gutter", "6");
  pluginData.setAttribute("data-current_edit_index", "-1");
  pluginData.setAttribute("data-single_edit_id", "0");
  pluginData.setAttribute("data-current_edit_action", "reblog");
  pluginData.setAttribute("data-photos_height", "150");
  var pluginDataShell = document.createElement("div");
  pluginDataShell.appendChild(pluginData);
  document.body.insertBefore(pluginDataShell, document.body.firstChild);
  // this ^, per classList booleans and data-attributes, etc.
  // one giant DOM element attribute tree,
  // like every post on the Tumblr dashboard 2016

  // this v, is how I shall draw a selection box
  var data = document.getElementById(
    "mass_post_features-plugin_data"
  );
  data.setAttribute("doc-title", document.title);

  // the mousedown contains a variety of things for other functions
  window.addEventListener("mousedown", function (e) {
    if (e.which !== 1) {
      return true;
    }
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var selectionBox = document.getElementById(
      "mass_post_features-plugin_selection_box"
    );
    var targ = e.target;
    var cont = targ; // container(parent)
    // this only runs on the photos page
    if (data.classList.contains("is-uploading-photos")) {
      // batch photos dragging
      while (
        cont.parentNode !== null &&
        typeof cont.parentNode !== "undefined" &&
        cont.nodeName !== "BODY" &&
        cont.id !== "add_tags_widget" &&
        cont.nodeName !== "A" &&
        cont.nodeName !== "BUTTON" &&
        !cont.classList.contains("photo-tags") &&
        !cont.classList.contains("photo-brick") &&
        !cont.classList.contains("photo-brick-img") &&
        !cont.classList.contains("rich") // edit
      ) {
        cont = cont.parentNode;
      }
      if (
        !data.classList.contains("photo-upload-in-progress") &&
        typeof cont !== "undefined" &&
        typeof cont.nodeName !== "undefined" &&
        (
          cont.nodeName === "A" ||
          cont.nodeName === "BUTTON"
        )
      ) {
        if (cont.parentNode.classList.contains("token")) {
          cont.parentNode.parentNode.removeChild(
            cont.parentNode
          );
        }
        e.preventDefault();
        e.stopPropagation();
        e.cancelBubble = true;
        return true;
      }
      if (
        !data.classList.contains("photo-upload-in-progress") &&
        typeof cont !== "undefined" &&
        typeof cont.classList !== "undefined" &&
        (
          cont.classList.contains("photo-brick") ||
          cont.classList.contains("photo-brick-img")
        )
      ) {
        if (cont.classList.contains("focused-rich")) {
          var addTagsWidget = document.getElementById(
            "add_tags_widget"
          );
          addTagsWidget.style.display = "block";
        }
        var bcr = cont.getBoundingClientRect();
        cont.setAttribute("original-x", bcr.left);
        cont.setAttribute("original-y", bcr.top);
        var bmx = bcr.left - e.clientX;
        var bmy = bcr.top - e.clientY;
        if (cont.classList.contains("photo-brick-img")) {
          bmx -= 360;
          bmy -= cont.parentNode.getBoundingClientRect().top +
                 document.documentElement.scrollTop;
        }
        cont.setAttribute("mouse-x-from-left", bmx);
        cont.setAttribute("mouse-y-from-top", bmy - cont.clientHeight);
        cont.classList.add("brick-dragging");
        cont.style.marginBottom = "-" + cont.clientHeight + "px";
      } else if (
        typeof cont !== "undefined" &&
        typeof cont.classList !== "undefined" &&
        !cont.classList.contains("rich") &&
        cont.id !== "add_tags_widget"
      ) {
        var fr = document.getElementsByClassName("focused-rich");
        while (fr.length > 0 ) {
          fr[0].classList.remove("focused-rich");
        }
      }
    }
    targ = e.target;
    cont = targ;
    var initialMouseX = e.pageX;
    var initialMouseY = e.pageY;
    while (
      cont.parentNode !== null &&
      typeof cont.parentNode !== "undefined" &&
      cont.nodeName !== "BODY" &&
      cont.id !== "nav_archive" &&
      cont.id !== "blog_menu" &&
      cont.id !== "select-by_widget" &&
      cont.id !== "add-caption_widget" &&
      cont.id !== "backdate_widget" &&
      cont.id !== "snapshot-info_widget" &&
      cont.id !== "snapshot-info_body" &&
      cont.id !== "urlstuff_widget" &&
      cont.id !== "urlstuff_body" &&
      cont.id !== "backdate-body" &&
      cont.id !== "reblog_widget" &&
      cont.id !== "select-by-widget_title" &&
      cont.id !== "remove_tags_widget" &&
      cont.id !== "add_tags_widget" &&
      cont.id !== "tags" &&
      cont.id !== "tags_to_add" &&
      cont.id !== "tag_editor" &&
      cont.id !== "widget_scrolling_part" &&
      cont.id !== "reblog-widget_input" &&
      cont.id !== "rich_text_caption"
    ) {
      cont = cont.parentNode;
    }
    if (
        cont.id === "select-by_widget" ||
        cont.id === "select-by-widget_title" ||
        cont.id === "remove_tags_widget" ||
        cont.id === "add_tags_widget" ||
        cont.id === "reblog_widget" ||
        cont.id === "add-caption_widget" ||
        cont.id === "backdate_widget" ||
        cont.id === "snapshot-info_widget" ||
        cont.id === "urlstuff_widget"
    ) {
      var sbw = document.getElementById(
        cont.id === "select-by-widget_title" ? "select-by_widget": cont.id
      );
      // grabbing and dragging step #1
      var mx = sbw.getBoundingClientRect().left - e.clientX;
      var my = sbw.getBoundingClientRect().top - e.clientY;
      sbw.setAttribute("mouse-x-from-left", mx);
      sbw.setAttribute("mouse-y-from-top", my);
      sbw.classList.add("widget-dragging");
    }
    // close snapshot-info_widget
    var snapshotInfo = document.getElementById("snapshot-info");
    if (
      cont.id !== "snapshot-info_widget" &&
      cont.id !== "snapshot-info_body" &&
      snapshotInfo !== null && snapshotInfo.checked
    ) {
      snapshotInfo.checked = false;
    }
    // close urlstuff_widget
    var urlstuff = document.getElementById("urlstuff");
    if (
      cont.id !== "urlstuff_widget" &&
      cont.id !== "urlstuff_body" &&
      urlstuff !== null && urlstuff.checked
    ) {
      urlstuff.checked = false;
    }
    // close backdate_widget
    var backdate = document.getElementById("backdate");
    if (
      cont.id !== "backdate_widget" &&
      cont.id !== "backdate-body" &&
      backdate !== null && backdate.checked
    ) {
      backdate.checked = false;
    }
    // close add-caption_widget
    var addCaption = document.getElementById("add-caption");
    if (
      cont.id !== "add-caption_widget" &&
      cont.id !== "rich_text_caption" &&
      addCaption !== null && addCaption.checked
    ) {
      addCaption.checked = false;
    }
    // close select-by_widget
    var selectBy = document.getElementById("select-by");
    if (
      cont.id !== "select-by_widget" &&
      cont.id !== "select-by-widget_title" &&
      cont.id !== "widget_scrolling_part" &&
      selectBy !== null && selectBy.checked
    ) {
      var wsp = document.getElementById("widget_scrolling_part");
      data.setAttribute("widget_scroll-top", wsp.scrollTop);
      var pick = document.getElementsByClassName("picked");
      while (pick.length > 0) {
        pick[0].classList.remove("picked");
      }
      selectBy.checked = false;
    }
    // close blog menu, close reblog widget
    if (
      cont.id !== "blog_menu" &&
      cont.id !== "reblog_widget" &&
      cont.id !== "reblog-widget_input" &&
      data.classList.contains("open-blog_menu") &&
      !data.classList.contains("closing-blog_menu")
    ) {
      var o = document.getElementsByClassName("open");
      while (o.length > 0) {
        o[0].classList.remove("open");
      }
      data.classList.remove("open-blog_menu");
      e.cancelBubble = true;
      e.stopPropagation();
      data.classList.add("closing-blog_menu");
      data.classList.remove("open-blog_menu");
      return false;
    }
    if (data.classList.contains("closing-blog_menu")) {
      data.classList.remove("closing-blog_menu");
    }
    if (data.classList.contains("is-uploading-photos")) {
      return true;
      // we return here, because all this other thing
      // stuff is for other editor modes...
    }
    // draw selection box
    if (
      e.shiftKey &&
      !data.classList.contains("shift_key")
    ) {
      data.classList.add("shift_key");
    }
    if (
      !data.classList.contains("mousedown") &&
      cont !== null &&
      typeof cont === "object" &&
      cont.nodeName === "BODY" &&
      cont.id !== "nav_archive"
    ) {
      data.classList.add("mousedown");
      data.setAttribute("data-initial_mouse_x", initialMouseX);
      data.setAttribute("data-initial_mouse_y", initialMouseY);
    }
  });
  window.addEventListener("mouseup", function (e) {
    var drg = document.getElementsByClassName("widget-dragging");
    while (drg.length > 0) {
      drg[0].classList.remove("widget-dragging");
    }
    var pre = document.getElementsByClassName("pre-photoset");
    var hu;
    var hd;
    var hl;
    var hr;
    var hlb = document.getElementsByClassName("hl-bottom");
    var hlt = document.getElementsByClassName("hl-top");
    var bd = document.getElementsByClassName("brick-dragging");
    if (bd.length > 0 && bd[0].classList.contains("photo-brick")) {
      // drop row inbetween rows
      if (hlb.length + hlt.length === 0) {
        bd[0].style.left = bd[0].getAttribute("original-x") + "px";
        bd[0].style.top = bd[0].getAttribute("original-y") + "px";
      } else if (hlt.length > 0) {
        document.body.insertBefore(bd[0], hlt[0]);
      } else if (hlb.length > 0) {
        document.body.insertBefore(bd[0], hlb[0].nextSibling);
      }
      while (hlb.length > 0) {
        hlb[0].classList.remove("hl-bottom");
      }
      while (hlt.length > 0) {
        hlt[0].classList.remove("hl-top");
      }
      while (bd.length > 0) {
        bd[0].style.removeProperty("margin-bottom");
        bd[0].classList.remove("brick-dragging");
      }
      // rebuildColumn after row dragged
      rebuildPhotoColumn();
    } else if (
      bd.length > 0 && bd[0].classList.contains("photo-brick-img")
    ) {
      // drop into photoset instead...
      hu = document.getElementsByClassName("hl-up");
      hd = document.getElementsByClassName("hl-down");
      hl = document.getElementsByClassName("hl-left");
      hr = document.getElementsByClassName("hl-right");
      if (
        hlb.length + hlt.length > 0 &&
        hu.length + hd.length + hl.length + hr.length === 0
      ) {
        // drop into new Editor row thing, instead...
        bd[0].style.left = "0px";
        bd[0].style.top = "0px";
        loadPhotoIntoDOM(bd[0].children[0]);
      } else if (hu.length + hd.length + hl.length + hr.length > 0) {
        if (hu.length > 0) {
          // insert photo above, above (clap, clap, clap)
          if (
            hu[0].classList.contains("row-with-one-img") ||
            (
              (
                hu[0].classList.contains("row-with-two-img") &&
                hu[0].classList.contains("data-photoset-a")
              ) || (
                hu[0].classList.contains("row-with-three-img") &&
                hu[0].classList.contains("data-photoset-a")
              )
            )
          ) {
            // insertBefore... :P
            hu[0].parentNode.insertBefore(bd[0], hu[0]);
          } else if (
            (
              hu[0].classList.contains("row-with-two-img") &&
              hu[0].classList.contains("data-photoset-b")
            ) || (
              hu[0].classList.contains("row-with-three-img") &&
              hu[0].classList.contains("data-photoset-b")
            )
          ) {
            // insertBefore&Before
            hu[0].parentNode.insertBefore(
              bd[0], hu[0].previousSibling
            );
          } else if (
            hu[0].classList.contains("row-with-three-img") &&
            hu[0].classList.contains("data-photoset-c")
          ) {
            // insertAfter&Before&Before
            hu[0].parentNode.insertBefore(
              bd[0], // weird: siblings ARE always there and !== undefined
              hu[0].previousSibling.previousSibling
            ); // because everything is correct :P
          } else {
            hu[0].parentNode.insertBefore(bd[0], hu[0]);
          }
          bd[0].classList.add("row-with-one-img");
          bd[0].classList.remove("data-photoset-a");
          bd[0].classList.remove("data-photoset-b");
          bd[0].classList.remove("data-photoset-c"); // abc...
          bd[0].classList.remove("row-with-two-img");
          bd[0].classList.remove("row-with-three-img");
        } else if (hd.length > 0) {
          // insert photo below, below photo (clap, clap, clap)
          if (
            hd[0].classList.contains("row-with-one-img") ||
            (
              (
                hd[0].classList.contains("row-with-two-img") &&
                hd[0].classList.contains("data-photoset-b")
              ) || (
                hd[0].classList.contains("row-with-three-img") &&
                hd[0].classList.contains("data-photoset-c")
              )
            )
          ) {
            // insertAfter... :P
            hd[0].parentNode.insertBefore(bd[0], hd[0].nextSibling);
          } else if (
            (
              hd[0].classList.contains("row-with-two-img") &&
              hd[0].classList.contains("data-photoset-a")
            ) || (
              hd[0].classList.contains("row-with-three-img") &&
              hd[0].classList.contains("data-photoset-b")
            )
          ) {
            // insertAfter&After
            hd[0].parentNode.insertBefore(
              bd[0], hd[0].nextSibling.nextSibling
            );
          } else if (
            hd[0].classList.contains("row-with-three-img") &&
            hd[0].classList.contains("data-photoset-a")
          ) {
            // insertAfter&After&After
            hd[0].parentNode.insertBefore(
              bd[0], // assumed: my siblings ARE there and !== undefined
              hd[0].nextSibling.nextSibling.nextSibling
            ); // because everything is correct :P
          }
          bd[0].classList.add("row-with-one-img");
          bd[0].classList.remove("row-with-two-img");
          bd[0].classList.remove("row-with-three-img");
          // insert to the left, to the left... (clap, clap, clap)
        } else if (hl.length > 0) {
          // START: these next few chucks are: long and similar; don't get lost
          if (hl[0].classList.contains("row-with-one-img")) {
            bd[0].classList.add("data-photoset-a");
            hl[0].classList.add("data-photoset-b");
            // 123...
            bd[0].classList.remove("data-photoset-c");
            bd[0].classList.remove("data-photoset-b");
            hl[0].classList.remove("data-photoset-a");
            hl[0].classList.remove("data-photoset-c");
            // abc...
            hl[0].classList.remove("row-with-one-img");
            hl[0].classList.add("row-with-two-img");
            bd[0].classList.remove("row-with-one-img");
            bd[0].classList.add("row-with-two-img");
            bd[0].classList.remove("row-with-three-img");
          } else if (hl[0].classList.contains("row-with-two-img")) {
            // left of an "a" goes to the left
            if (hl[0].classList.contains("data-photoset-a")) {
              bd[0].classList.add("data-photoset-a");
              hl[0].classList.add("data-photoset-b");
              hl[0].nextSibling.classList.add("data-photoset-c");
              // 123...
              hl[0].nextSibling.classList.remove("data-photoset-b");
              hl[0].nextSibling.classList.remove("data-photoset-a");
              bd[0].classList.remove("data-photoset-c");
              bd[0].classList.remove("data-photoset-b");
              hl[0].classList.remove("data-photoset-a");
              hl[0].classList.remove("data-photoset-c");
              // abc...
              hl[0].classList.remove("row-with-two-img");
              hl[0].classList.add("row-with-three-img");
              hl[0].nextSibling.classList.remove("row-with-two-img");
              hl[0].nextSibling.classList.add("row-with-three-img");
              // left of a "b" goes in-between
            } else if (hl[0].classList.contains("data-photoset-b")) {
              hl[0].classList.add("data-photoset-c");
              bd[0].classList.add("data-photoset-b");
              hl[0].previousSibling.classList.add("data-photoset-a");
              // 123...
              hl[0].previousSibling.classList.remove("data-photoset-b");
              hl[0].previousSibling.classList.remove("data-photoset-c");
              bd[0].classList.remove("data-photoset-c");
              bd[0].classList.remove("data-photoset-a");
              hl[0].classList.remove("data-photoset-b");
              hl[0].classList.remove("data-photoset-a");
              // abc...
              hl[0].classList.remove("row-with-two-img");
              hl[0].classList.add("row-with-three-img");
              hl[0].previousSibling.classList.remove("row-with-two-img");
              hl[0].previousSibling.classList.add("row-with-three-img");
            }
            bd[0].classList.remove("row-with-one-img");
            bd[0].classList.remove("row-with-two-img");
            bd[0].classList.add("row-with-three-img");
          }
          // regardless, it's to the left...
          hl[0].parentNode.insertBefore(bd[0], hl[0]);
        } else if (hr.length > 0) {
          // insert to the right, to the right... (clap, clap, clap)
          if (hr[0].classList.contains("row-with-one-img")) {
            hr[0].classList.add("data-photoset-a");
            bd[0].classList.add("data-photoset-b");
            // 123...
            bd[0].classList.remove("data-photoset-c");
            bd[0].classList.remove("data-photoset-a");
            hr[0].classList.remove("data-photoset-b");
            hr[0].classList.remove("data-photoset-c");
            // abc...
            hr[0].classList.remove("row-with-one-img");
            hr[0].classList.add("row-with-two-img");
            bd[0].classList.remove("row-with-one-img");
            bd[0].classList.add("row-with-two-img");
            bd[0].classList.remove("row-with-three-img");
          } else if (hr[0].classList.contains("row-with-two-img")) {
            // right of an "a" goes to the in-between
            if (hr[0].classList.contains("data-photoset-a")) {
              hr[0].classList.add("data-photoset-a");
              bd[0].classList.add("data-photoset-b");
              hr[0].nextSibling.classList.add("data-photoset-c");
              // 123...
              hr[0].nextSibling.classList.remove("data-photoset-b");
              hr[0].nextSibling.classList.remove("data-photoset-a");
              bd[0].classList.remove("data-photoset-c");
              bd[0].classList.remove("data-photoset-a");
              hr[0].classList.remove("data-photoset-b");
              hr[0].classList.remove("data-photoset-c");
              // abc...
              hr[0].classList.remove("row-with-two-img");
              hr[0].classList.add("row-with-three-img");
              hr[0].nextSibling.classList.remove("row-with-two-img");
              hr[0].nextSibling.classList.add("row-with-three-img");
              // right of a "b" goes to the right
            } else if (hr[0].classList.contains("data-photoset-b")) {
              hr[0].previousSibling.classList.add("data-photoset-a");
              hr[0].classList.add("data-photoset-b");
              bd[0].classList.add("data-photoset-c");
              // 123...
              hr[0].previousSibling.classList.remove("data-photoset-b");
              hr[0].previousSibling.classList.remove("data-photoset-c");
              bd[0].classList.remove("data-photoset-a");
              bd[0].classList.remove("data-photoset-b");
              hr[0].classList.remove("data-photoset-a");
              hr[0].classList.remove("data-photoset-c");
              // abc...
              hr[0].classList.remove("row-with-two-img");
              hr[0].classList.add("row-with-three-img");
              hr[0].previousSibling.classList.remove("row-with-two-img");
              hr[0].previousSibling.classList.add("row-with-three-img");
            }
            bd[0].classList.remove("row-with-one-img");
            bd[0].classList.remove("row-with-two-img");
            bd[0].classList.add("row-with-three-img");
          }
          // regardless, it's to the right...
          hr[0].parentNode.insertBefore(bd[0], hr[0].nextSibling);
        }
      }
      if (
        !bd[0].classList.contains("row-with-one-img") &&
        !bd[0].classList.contains("row-with-two-img") &&
        !bd[0].classList.contains("row-with-three-img")
      ){
        bd[0].classList.add("row-with-one-img")
      }
      // END: thanks for bearing with me.
      pre = document.getElementsByClassName("pre-photoset");
      hu = document.getElementsByClassName("hl-up");
      hd = document.getElementsByClassName("hl-down");
      hl = document.getElementsByClassName("hl-left");
      hr = document.getElementsByClassName("hl-right");
      hlb = document.getElementsByClassName("hl-bottom");
      hlt = document.getElementsByClassName("hl-top");
      while (hlt.length > 0) {
        hlt[0].classList.remove("hl-top");
      }
      while (hlb.length > 0) {
        hlb[0].classList.remove("hl-bottom");
      }
      while (pre.length > 0) {
        pre[0].classList.remove("pre-photoset");
      }
      while (bd.length > 0) {
        bd[0].style.left = "0px";
        bd[0].style.top = "0px";
        bd[0].style.removeProperty("margin-bottom");
        bd[0].classList.remove("brick-dragging");
      }
      while (hu.length > 0) {
        hu[0].classList.remove("hl-up");
      }
      while (hd.length > 0) {
        hd[0].classList.remove("hl-down");
      }
      while (hl.length > 0) {
        hl[0].classList.remove("hl-left");
      }
      while (hr.length > 0) {
        hr[0].classList.remove("hl-right");
      }
      // observers should rebuildPhotoColumn
      setTimeout(rebuildPhotoColumn, 800);
      // but here goes one more time just in case :P
      // I thinks my pretty transition is delaying
      // the top/left/height... or something IDK...
    }
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var selectionBox = document.getElementById(
      "mass_post_features-plugin_selection_box"
    );
    if (data.classList.contains("mousedown")) {
      data.classList.remove("mousedown");
    }
    if (data.classList.contains("shift_key")) {
      data.classList.remove("shift_key");
    }
    if (selectionBox !== null) {
      selectionBox.parentNode.removeChild(selectionBox);
    }
    var ts = document.getElementsByClassName("temp-select");
    while (ts.length > 0) {
      ts[0].classList.remove("temp-select");
    }
  });
  var blueUp = 0;
  // resize the selection box and stuff :)
  window.addEventListener("mousemove", function (e) {
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    var i;
    if (
      document.getElementsByClassName(
        "brick-dragging"
      ).length === 1
    ) {
      var bdrg = document.getElementsByClassName(
        "brick-dragging"
      )[0]; // being dragged
      var brk = document.getElementsByClassName(
        "photo-brick"
      );
      var img = document.getElementsByClassName(
        "photo-brick-img-cell"
      );
      var bmx = parseFloat(bdrg.getAttribute("mouse-x-from-left"));
      var bmy = parseFloat(bdrg.getAttribute("mouse-y-from-top"));
      var pre = document.getElementsByClassName("pre-photoset");
      var st = document.documentElement.scrollTop;
      var bx = e.clientX + bmx;
      var by = e.clientY + bmy + st;
      bdrg.style.left = bx + "px";
      bdrg.style.top = by + "px";
      var t;
      var b;
      var l;
      var pbi;
      var pr;
      var hlb = document.getElementsByClassName("hl-bottom");
      var hlt = document.getElementsByClassName("hl-top");
      if (
        !data.classList.contains("blueup-drag-scroll") &&
        e.clientY < 90 &&
        typeof bdrg !== "undefined"
      ) {
        data.classList.add("blueup-drag-scroll");
        clearInterval(blueUp);
        blueUp = setInterval(function () {
          var doc = document.documentElement;
          window.scrollTo(doc.scrollLeft, doc.scrollTop - 10);
        }, 10);
      } else if (
        !data.classList.contains("blueup-drag-scroll") &&
        e.clientY > window.innerHeight - 90 &&
        typeof bdrg !== "undefined"
      ) {
        data.classList.add("blueup-drag-scroll");
        clearInterval(blueUp);
        blueUp = setInterval(function () {
          var doc = document.documentElement;
          window.scrollTo(doc.scrollLeft, doc.scrollTop + 10);
        }, 10);
      } else {
        data.classList.remove("blueup-drag-scroll");
        clearInterval(blueUp);
      }
      if (bdrg.classList.contains("photo-brick")) {
        for (i = 0; i < brk.length; i++) {
          b = brk[i].getBoundingClientRect();
          t = b.top + st; // dragging photo-brick over <this
          if (
            (by > t && by < t + b.height) ||
            (i === 0 && by < t) ||
            (i === brk.length -1 && by > t)
          ) {
            if (
              (by + b.height / 2 > t) ||
              (i === brk.length -1 && by > t)
            ) { // highlight bottom
              brk[i].classList.add("hl-bottom");
              brk[i].classList.remove("hl-top");
            } else if (
              (by - b.height / 2 < t) ||
              (i === 0 && by < t)
            ) { // highlight top
              brk[i].classList.add("hl-top");
              brk[i].classList.remove("hl-bottom");
            }
          } else {
            brk[i].classList.remove("hl-bottom");
            brk[i].classList.remove("hl-top");
          }
        }
      }else if (bdrg.classList.contains("photo-brick-img")) {
        while (hlb.length > 0) {
          hlb[0].classList.remove("hl-bottom");
        }
        while (hlt.length > 0) {
          hlt[0].classList.remove("hl-top");
        }
        // this part withdraws the dragged image bdrg from current row
        if (// this may seem repetative...
          bdrg.classList.contains("row-with-two-img") &&
          bdrg.classList.contains("data-photoset-a") &&
          bdrg.nextSibling.classList.contains("data-photoset-b")
        ) {
          bdrg.style.removeProperty("height");
          bdrg.nextSibling.style.removeProperty("height");
          // 2
          bdrg.classList.remove("row-with-two-img");
          bdrg.nextSibling.classList.remove("row-with-two-img");
          // 1
          bdrg.nextSibling.classList.add("row-with-one-img");
          // and shift pop around
          bdrg.nextSibling.classList.remove("data-photoset-b");
          // remove remnant
          bdrg.classList.remove("data-photoset-a");
        } else if (
          bdrg.classList.contains("row-with-two-img") &&
          bdrg.classList.contains("data-photoset-b") &&
          bdrg.previousSibling.classList.contains("data-photoset-a")
        ) {
          bdrg.style.removeProperty("height");
          bdrg.previousSibling.style.removeProperty("height");
          // 2
          bdrg.classList.remove("row-with-two-img");
          bdrg.previousSibling.classList.remove("row-with-two-img");
          // 1
          bdrg.previousSibling.classList.add("row-with-one-img");
          // and shift pop around
          bdrg.previousSibling.classList.remove("data-photoset-a");
          // remove remnant
          bdrg.classList.remove("data-photoset-b");
        } else if (
          bdrg.classList.contains("row-with-three-img") &&
          bdrg.classList.contains("data-photoset-a") &&
          bdrg.nextSibling.classList.contains("data-photoset-b")
        ) {
          bdrg.style.removeProperty("height");
          bdrg.nextSibling.style.removeProperty("height");
          bdrg.nextSibling.nextSibling.
          style.removeProperty("height");
          // 3
          bdrg.classList.remove("row-with-three-img");
          bdrg.nextSibling.classList.remove("row-with-three-img");
          bdrg.nextSibling.nextSibling.
          classList.remove("row-with-three-img");
          // 2
          bdrg.nextSibling.classList.add("row-with-two-img");
          bdrg.nextSibling.nextSibling.
          classList.add("row-with-two-img");
          // and shift pop around
          bdrg.nextSibling.classList.add("data-photoset-a");
          bdrg.nextSibling.classList.remove("data-photoset-b");
          bdrg.nextSibling.nextSibling.
          classList.add("data-photoset-b");
          bdrg.nextSibling.nextSibling.
          classList.remove("data-photoset-c");
          // remove remnant
          bdrg.classList.remove("data-photoset-a");
        } else if (
          bdrg.classList.contains("row-with-three-img") &&
          bdrg.classList.contains("data-photoset-b") &&
          bdrg.nextSibling.classList.contains("data-photoset-c")
        ) {
          bdrg.style.removeProperty("height");
          bdrg.nextSibling.style.removeProperty("height");
          bdrg.previousSibling.style.removeProperty("height");
          // 3
          bdrg.classList.remove("row-with-three-img");
          bdrg.nextSibling.classList.remove("row-with-three-img");
          bdrg.previousSibling.classList.remove("row-with-three-img");
          // 2
          bdrg.nextSibling.classList.add("row-with-two-img");
          bdrg.previousSibling.classList.add("row-with-two-img");
          // and shift pop around
          bdrg.nextSibling.classList.add("data-photoset-b");
          bdrg.nextSibling.classList.remove("data-photoset-c");
          // this is a rare chance flip around
          bdrg.parentNode.insertBefore(bdrg.nextSibling, bdrg);
          // remove remnant
          bdrg.classList.remove("data-photoset-b");
        } else if (
          bdrg.classList.contains("row-with-three-img") &&
          bdrg.classList.contains("data-photoset-c") &&
          bdrg.previousSibling.classList.contains("row-with-three-img")
        ) {
          bdrg.style.removeProperty("height");
          bdrg.previousSibling.style.removeProperty("height");
          bdrg.previousSibling.previousSibling
            .style.removeProperty("height");
          // 3
          bdrg.classList.remove("row-with-three-img");
          bdrg.previousSibling.classList.remove("row-with-three-img");
          bdrg.previousSibling.previousSibling.
          classList.remove("row-with-three-img");
          // 2
          bdrg.previousSibling.classList.add("row-with-two-img");
          bdrg.previousSibling.previousSibling.
          classList.add("row-with-two-img");
          // and shift pop around
          // b stays b, a stays a
          // remove remnant
          bdrg.classList.remove("data-photoset-c");
        } // last one ^
        bdrg.classList.remove("hl-up");
        bdrg.classList.remove("hl-down");
        bdrg.classList.remove("hl-left");
        bdrg.classList.remove("hl-right");
        rebuildPhotoColumn();
        for (i = 0; i < brk.length; i++) { // dragging image
          b = brk[i].getBoundingClientRect();
          if (
            e.clientX > b.left &&
            e.clientX < b.left + 137 &&
            e.clientY > b.top &&
            e.clientY < b.bottom
          ) {
            brk[i].classList.add("pre-photoset");
            pbi = brk[i].getElementsByClassName("photo-brick-img");
            for (l = 0; l < pbi.length; l++) {
              if (typeof pbi[l] === "undefined" || pbi[l] === bdrg) {
                continue;
              }
              if (
                pbi.length >= 10 &&
                brk[i].getElementsByClassName(
                  "brick-dragging"
                ).length === 0
              ) {
                break;
              }
              pr = pbi[l].getBoundingClientRect();
              if (
                e.clientX > pr.left &&
                e.clientX < pr.right &&
                e.clientY > pr.top &&
                e.clientY < pr.bottom &&
                brk[i].classList.contains("pre-photoset")
              ) { // I should use dragover, but this is (sophisticated :p)
                if (e.clientY < pr.top + pr.height / 3) {
                  pbi[l].classList.add("hl-up");
                  // sliding to the above
                  pbi[l].classList.remove("hl-down");
                  pbi[l].classList.remove("hl-left");
                  pbi[l].classList.remove("hl-right");
                  // sliding to the under
                } else if (e.clientY > pr.top + pr.height * 0.75) {
                  pbi[l].classList.add("hl-down");
                  pbi[l].classList.remove("hl-up");
                  pbi[l].classList.remove("hl-left");
                  pbi[l].classList.remove("hl-right");
                  // sliding to the right
                } else if (e.clientX > pr.left + pr.width / 2) {
                  if (!pbi[l].classList.contains("row-with-three-img")) {
                    pbi[l].classList.remove("hl-up");
                    pbi[l].classList.remove("hl-down");
                    pbi[l].classList.remove("hl-left");
                    pbi[l].classList.add("hl-right");
                  }
                  // sliding to the left
                } else if (e.clientX < pr.left + pr.width / 2) {
                  if (!pbi[l].classList.contains("row-with-three-img")) {
                    pbi[l].classList.remove("hl-up");
                    pbi[l].classList.remove("hl-down");
                    pbi[l].classList.add("hl-left");
                    pbi[l].classList.remove("hl-right");
                  }
                }
              } else {
                pbi[l].classList.remove("hl-up");
                pbi[l].classList.remove("hl-down");
                pbi[l].classList.remove("hl-left");
                pbi[l].classList.remove("hl-right");
              }
            }
          } else { // dragging out of a photoset into new row
            brk[i].classList.remove("pre-photoset");
            if (
              e.clientX > b.left + 177 &&
              e.clientX < b.left + b.width &&
              e.clientY > b.top &&
              e.clientY < b.bottom
            ) {
              if (
                (e.clientY + b.height / 2 > b.top) ||
                (i === brk.length -1 && e.clientY > b.bottom)
              ) { // highlight bottom
                brk[i].classList.add("hl-bottom");
                brk[i].classList.remove("hl-top");
              } else if (
                (e.clientY - b.height / 2 < b.top) ||
                (i === 0 && e.clientY < b.top)
              ) { // highlight top
                brk[i].classList.add("hl-top");
                brk[i].classList.remove("hl-bottom");
              }
            } else {
              brk[i].classList.remove("hl-bottom");
              brk[i].classList.remove("hl-top");
            }
          }
        }
      }
    }
    if (
      document.getElementsByClassName(
        "widget-dragging"
      ).length === 1
    ) {
      var drg = document.getElementsByClassName(
        "widget-dragging"
      )[0];
      // grabbing and dragging step #2
      var mx = parseFloat(drg.getAttribute("mouse-x-from-left"));
      var my = parseFloat(drg.getAttribute("mouse-y-from-top"));
      if (document.getElementById("reblog_widget") !== null) {
        document.getElementById(
          "reblog_widget"
        ).style.left = (e.clientX + mx) + "px";
        document.getElementById(
          "reblog_widget"
        ).style.top = (e.clientY + my) + "px";
      }
      if (document.getElementById("select-by_widget") !== null) {
        document.getElementById(
          "select-by_widget"
        ).style.left = (e.clientX + mx) + "px";
        document.getElementById(
          "select-by_widget"
        ).style.top = (e.clientY + my) + "px";
      }
      if (document.getElementById("remove_tags_widget") !== null) {
        document.getElementById(
          "remove_tags_widget"
        ).style.left = (e.clientX + mx) + "px";
        document.getElementById(
          "remove_tags_widget"
        ).style.top = (e.clientY + my) + "px";
      }
      if (document.getElementById("add_tags_widget") !== null) {
        document.getElementById(
          "add_tags_widget"
        ).style.left = (e.clientX + mx) + "px";
        document.getElementById(
          "add_tags_widget"
        ).style.top = (e.clientY + my) + "px";
      }
      if (document.getElementById("add-caption_widget") !== null) {
        document.getElementById(
          "add-caption_widget"
        ).style.left = (e.clientX + mx) + "px";
        document.getElementById(
          "add-caption_widget"
        ).style.top = (e.clientY + my) + "px";
      }
      if (document.getElementById("backdate_widget") !== null) {
        document.getElementById(
          "backdate_widget"
        ).style.left = (e.clientX + mx) + "px";
        document.getElementById(
          "backdate_widget"
        ).style.top = (e.clientY + my) + "px";
      }
      if (document.getElementById("urlstuff_widget") !== null) {
        document.getElementById(
          "urlstuff_widget"
        ).style.left = (e.clientX + mx) + "px";
        document.getElementById(
          "urlstuff_widget"
        ).style.top = (e.clientY + my) + "px";
      }
      if (document.getElementById("snapshot-info_widget") !== null) {
        document.getElementById(
          "snapshot-info_widget"
        ).style.left = (e.clientX + mx) + "px";
        document.getElementById(
          "snapshot-info_widget"
        ).style.top = (e.clientY + my) + "px";
      }
    }
    var targ = e.target;
    var cont = targ;
    var initialMouseX = parseFloat(
      data.getAttribute("data-initial_mouse_x")
    );
    var initialMouseY = parseFloat(
      data.getAttribute("data-initial_mouse_y")
    );
    var newMouseX = e.pageX;
    var newMouseY = e.pageY;
    var mouseWidth = Math.abs(initialMouseX - newMouseX);
    var mouseHeight = Math.abs(initialMouseY - newMouseY);
    var mouseDiff = Math.hypot(mouseWidth, mouseHeight);
    var selectionBox = document.getElementById(
      "mass_post_features-plugin_selection_box"
    );
    if (
      mouseDiff > 6 &&
      data.classList.contains("mousedown") &&
      selectionBox === null
    ) {
      var pluginSelectionBox = document.createElement("div");
      pluginSelectionBox.id = "mass_post_features-" +
                              "plugin_selection_box";
      document.body.appendChild(pluginSelectionBox);
      selectionBox = document.getElementById(
        "mass_post_features-plugin_selection_box"
      );
      if (!data.classList.contains("shift_key")) {
        var hl = document.getElementsByClassName("highlighted");
        while (hl.length > 0) {
          highlightBrick(hl[0], 0);
        }
      }
    }
    if (
      mouseDiff > 6 &&
      data.classList.contains("mousedown") &&
      selectionBox !== null
    ) {
      var selLeft;
      var selTop;
      if (initialMouseX < newMouseX) {
        selectionBox.style.left = initialMouseX + "px";
        selLeft = initialMouseX;
      }
      if (initialMouseY < newMouseY) {
        selectionBox.style.top = initialMouseY + "px";
        selTop = initialMouseY;
      }
      if (initialMouseX > newMouseX) {
        selectionBox.style.left = (initialMouseX - mouseWidth) + "px";
        selLeft = initialMouseX - mouseWidth;
      }
      if (initialMouseY > newMouseY) {
        selectionBox.style.top = (initialMouseY - mouseHeight) + "px";
        selTop = initialMouseY - mouseHeight;
      }
      selectionBox.style.width = mouseWidth + "px";
      selectionBox.style.height = mouseHeight + "px";
      var brick = document.getElementsByClassName("brick");
      var rec;
      var sT = document.documentElement.scrollTop;
      var sL = document.documentElement.scrollLeft; // 0
      for (i = 0; i < brick.length; i++) {
        rec = brick[i].getBoundingClientRect();
         if (
           !brick[i].classList.contains("highlighted") &&
           !brick[i].classList.contains("temp-select") &&
           rec.right + sL > selLeft &&
           rec.left + sL < selLeft + mouseWidth &&
           rec.bottom + sT > selTop &&
           rec.top + sT < selTop + mouseHeight
         ) {
           brick[i].classList.add("temp-select");
           highlightBrick(brick[i], 1);
         } else if (
           brick[i].classList.contains("temp-select") &&
           brick[i].classList.contains("highlighted") &&
           (
             (
               rec.right + sL < selLeft ||
               rec.left + sL > selLeft + mouseWidth
             ) || (
               rec.bottom + sT < selTop ||
               rec.top + sT > selTop + mouseHeight
             )
           )
         ) {
           brick[i].classList.remove("temp-select");
           highlightBrick(brick[i], 0);
         }
      }
    }
  });
  // end of selection box feature

  // begin blogs menu / blog menu dropdown
  var loderGifSrc =
        'data:image/gif;base64,R0lGODlhIAAgAPUZAA' +
        'QEBDo6OhYWFg4ODi4uLoCAgAgICBgYGAICAmxsbH' +
        'h4eBwcHF5eXsDAwLS0tJKSkvLy8v///xISEhAQEE' +
        'ZGRqioqGRkZFBQUCIiIiYmJjY2Np6enk5OTuDg4D' +
        'AwMNLS0lZWVoKCgqCgoLKysgAAAAAAAAAAAAAAAA' +
        'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
        'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
        'AAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAA' +
        'Ah/hlPcHRpbWl6ZWQgdXNpbmcgZXpnaWYuY29tAC' +
        'H5BAUKABkALAAAAAAgACAAAAbkwIxwSCQOIJBFcc' +
        'k0GoiBSCRQBDSZl8YGKqUOB4fnFdpoUIbR6Tc8GB' +
        'crZXHamwEf3EVCOSGcCwFseEUhcRl+dWFuBARVZQ' +
        '+GXYiJTl8FlkpDDGUYAwEBdpN/EoF1FpYFDG2ljF' +
        'UTCKJsqmgKp5+CoKNMABSnIHi4bgMMBZhjCKS/gn' +
        'VNgLhgyojNzZ7U1ALK07EH1dV3t9rgztjS0szY0A' +
        'ahV82/o+rMsfDa7fNO8aJL7JLI+/bkx+rSBUznrx' +
        '+oVsEClZMEDZaYhQKtoAu1kOE4isgqJpxQcI3Ehh' +
        '4/glz37koQACH5BAkKABIALAAAAAAZABgAAAaVQI' +
        'lwSCQaHA5BcWkEEAmNBqEYYEo0BcszOh2KIg8moV' +
        'DoXrnDQARsTZCdZ+nwsx5YF2SKECqXMNYFVkIgb3' +
        'FTAxARHU1FA3mGEgVrVUIGAZd2aW+WBAYLaw1GHp' +
        'eYlSALS1CojaQBCwiCsQgYrbG2AASutrsGu00AwM' +
        'GwvpUHxsfGxMXIx8oSCMLCztPU1dbX2NfDgkEAIf' +
        'kECQoAFgAsAAAAAB8AGAAABr9Ai3BIJAIUikFxyR' +
        'waEMZCYVEkNJeHgCc6JSoaiatRK3BKqUJCAywmas' +
        'jp83CzNrSdcMtCbqGsGXducHtdBg5rYgAARQBaVo' +
        'RUDGtWXmEWCAeZi3gBTwufAmsPbh0REZQTmgNQlx' +
        'lKVRtleg2mEQ1GqnZ3AyK1HYBYqncjtV1NmJl3BB' +
        'EiaG2sykyYitSKgUKbuKqa19aM29yB3rjV1N3Zz9' +
        '3n6MfJiRLh7wdXyMLPq+32rcGs7Hju2HI9qXclCA' +
        'Ah+QQJCgAZACwAAAAAIAAYAAAGvcCMcEgkIgIBQH' +
        'HJNBYHyMGzyTQcJsYokVOgUJ9XpRCaHC4K3S/4YN' +
        'YKLWixehweuwnowHyNyJClAApoagBydFd+WgFxRR' +
        'cXQwhhhlaSA5FoDFsVDQ0YZpWQhmMWUn4PnA0PfI' +
        'hzBgqoFV5VknMhqAwGX5GsXxgNCgJ7fsKes4XHhc' +
        'RIy1FhzrxqARHT1NPPtHvS1dSRyMfKzG5LfXvk5d' +
        'BN34QSdevt45bYuvHvh+8Ton749tDy+pW7+rULAg' +
        'Ah+QQJCgAUACwAAAAAIAAZAAAGwECKcEgsHo7FpJ' +
        'KIMB4BxqXSgBwCnsRMACN1VinX72Cb6XqtWKGHbG' +
        'amw1Awu+1GwuVb89U7AGMXc0MaGmhpQlR2UACBFB' +
        'kJBQUChYYDcUwecQIMkAUMfF9di5wJBEuIoEsgnA' +
        'GWU5Wtpp19dE20ple4uHR4BL2+T8CoUgQNxcbFwc' +
        'C7xMfGCLm5y7+/psu7frBKARGRehKGUh8R456uwW' +
        '0LDeMRHwGflhPZuo0d6w91BvjPVM+gBRDjru0a0E' +
        'lIEAAh+QQJCgAWACwAAAAAIAAeAAAG2ECLcEgsHo' +
        '7FpJKIMB4BxqXSgBwCnsyq1IoVXrXfwdZ54IK1Y2' +
        '83rEanLQMsG+5OXsliNtV97rabdwh+cBoBAQZmfn' +
        'F2E02EhoZ4dVMZkBoCS3uTRpALjplxUGMGhqJpn6' +
        'OgV6t3b2ELsLFPs6ajBbe4t7O7b3C5uYKsq71xsr' +
        'GZxL10tUsEDQyIW69pGw3WFKqzpw/WDRsEkqaNSQ' +
        'EfC0LO3QlZaJrBghERIkQMDtZZqO/LUCLxAUwMLi' +
        'izAyHCh4FvCsRjgDBNh3hiGkoJsFDilgYROCgJAg' +
        'Ah+QQJCgAYACwAAAAAIAAgAAAF4CAmjmR5nGWqko' +
        'h5AuaqGugIvGwt27h467/BznXgAXVDXy+oRCYxAx' +
        'wT6kzdiEImzUkzSmBeKhUZbDV7YpcZEUWfq6u2Oz' +
        'efvQxDNhz7hPbNVjeCgn9ybUEvdXEBjI2MiZB/jo' +
        '56g1dPZYdxf31jSQsFAWAyiEkWBagEcYaApAyoBR' +
        'YLWF88KQQbAj4JsBR0eF6gBQsCDQ0KJAEKqDmtlR' +
        'gBEREBGArGqjaMeTjR01AODRudZyLd1BgM1+NfRe' +
        'XS5xgVxsCfaOYjBMYXhRPJ7yQPGsAb584bwR0DIE' +
        'CY9SQEACH5BAkKABQALAAAAAAgACAAAAXmICWOZH' +
        'mcZaqSiHkC5qoa6Ai8bC3buHjrv8HOdeABdUNfL6' +
        'hEJikDHBPqTN2IQibNSTNKYF4qFRlsNXtilxkRRZ' +
        '+rq7Y7N5+9DEM2HPuE9s1WN4KCfVSDZS91cYmMjX' +
        'uBjnqHgHmTVzN/hVtJAwELlHaKJgGkAouMnASkpV' +
        'hfPh8BVhZCUBqrGHR4Iw8REQQCDAwCAwUFHCQLqz' +
        'mUC70NFAQNDQQUHMULdEMNvdjR01AKxoUiAb0F5N' +
        'LU0NfjHdzo3yIJxWBJDL0MI97q6+JPHBE+IEtHgk' +
        'GBDONMEEy4w4ADB6aehAAAIfkECQoAFgAsAAAAAC' +
        'AAIAAABeCgJY5keZxlqpKIeQLmqhroCLxsLdu4eO' +
        'u/wc514AF1Q18vqEQmLQMcE+pM3YhCJs1JM0pgXi' +
        'oVGWw1e2KXGRFFn6urtjs3n70MQzYc+4T2zVY3go' +
        'J9VINlL3VxiYyNe4GOeoeAeZNXM39/BRABSYRDDB' +
        '0RER2eiSsEDaMRDQSmjCUPqx0cPhuuRG94I6sFQi' +
        'IJDa0DAQFtxXRFIwkPCyzCD1AFvlDFvzxDD8IC0t' +
        'QIxR6FIqkNDLbU1cbiFdvnzuPWfRTCFDbT7+nKSQ' +
        'ENGyQL9/6pE/cvIMEdABQouDYkBAAh+QQJCgAaAC' +
        'wAAAAAIAAgAAAF2aAmjmR5nGWqkoh5AuaqGugIvG' +
        'wt27h467/BznXgAXVDXy+oRCY1AxwT6kzdiEImzU' +
        'kzSmBeKhUZbDV7YpcZEUWfq6u2OzefvQxDNhz7hP' +
        'bNVgGCgwELfVQ3iRoQEY2OEQx/L5MHjI+NkU9BlA' +
        'uEg4aaiaKAMZp/DA4ESYpDFBUNsKuTcQ+wDQ8Ysp' +
        'QlCbYVAT4WoHRveCO2DMYaFAUFAmVuW0UjFwkCLM' +
        '2RA4JZc107DM1Z3E2HPs3AUORjYH0J4j7rY4cE6D' +
        'byU0kZBRYs8vPm/BUKmOffjhAAIfkECQoAFQAsAA' +
        'AAACAAIAAABujAinBILB6OxaSSiDAeAcal0oAcAp' +
        '7MqtSKFV6138HWeeCCtWNvN6xGpysDLBvuTjIYZD' +
        'Gb6qYOCRERHQFZSFd0aGFNcB+BESMLXEkIE4uUT2' +
        'JEDBCOBZljcZhTD44jaaF1Rg0RhKBdaQRvcEsCBL' +
        'a3trJ0V7wVDg3AwQ0UsmGYB7/CwMRvxse4uMW804' +
        'uTxcUBCpGuBrAJBeCnolMM4AUMAuLHRRTmCRltk5' +
        'VtrxXmAVBCGAH4l/6fiMr8oQAQAL9Ye+rRGRNtjs' +
        'JTB+lJ1KWBn6VXElLRijgxIDYPhfLF05WHZDONSY' +
        'IAACH5BAUKABYALAAAAAAgACAAAAbuQItwSCwejs' +
        'WkkkgYEAFHgHGpTEQ+z2jWQC0yIhHGEIoUkp1dYg' +
        'eMPo/L6WEA/DBrLe44scHG3+9UFBRGYA1+SAaAdn' +
        'INjQREBWCPUIdodn8bjQ0hAmYjAUkIEwiXihYUDp' +
        'oMXHEDURJSoQmaIa2vaQIPDY+4plQYenhLrgvFxp' +
        'a2UMoWCgXOzwW8ya9HzdDO0r3U28fIXaLK4cPBpH' +
        'qiAd5Ky7gaAe7TsaEE7u6s38SmGPQaE2+ho6XgnK' +
        'pXrhI4cAITJcQQr5JDfEbsDdOSx5c2VhUt/oKT51' +
        'Awh6XeCLzXT2RDYh//jUw5sWCaIAA7';
  var navArchive = document.getElementById("nav_archive");
  var blogMenu = document.createElement("div");
  blogMenu.id = "blog_menu";
  var blogMenuLink = navArchive.
    getElementsByClassName("title")[0].
    getElementsByTagName("a")[0];
  blogMenuLink.innerHTML = "Blogs";
  blogMenuLink.insertBefore(blogMenu, blogMenuLink.firstChild);
  var arrow = document.createElement("div");
  arrow.classList.add("arrow");
  blogMenuLink.removeAttribute("href");
  blogMenuLink.insertBefore(arrow, blogMenuLink.firstChild);
  // this makes a batch reblog button
  var reblogMenuButton = function (name) {
    var button = document.createElement("button");
    button.setAttribute(
	  "title", "Batch reblog selected posts to \"" + name + "\""
	);
    var svg = svgForType["reblog-self"].cloneNode(true);
    svg.setAttribute("width","11");
    svg.setAttribute("height","11");
    svg.setAttribute("fill","#fff");
    button.appendChild(svg);
    button.appendChild(
      document.createTextNode(
        " BATCH REBLOG SELECTED"
      )
    );
    button.setAttribute("data-edit_action", "reblog");
    button.setAttribute("data-name", name);
    button.addEventListener(
      "click",
      function() {
        var data = document.getElementById(
          "mass_post_features-plugin_data"
        );
        data.setAttribute(
          "data-reblog-to-here", this.getAttribute("data-name")
        );
        var rb = document.getElementsByClassName("reblog-to-here");
        while (rb.length > 0) {
          rb[0].classList.remove("reblog-to-here");
        }
        document.getElementById(
          "reblog-to_" + this.getAttribute("data-name")
        ).classList.add("reblog-to-here");
        data.setAttribute(
          "data-reblog-to-here", this.getAttribute("data-name")
        );
        fetchEditSubmitMulti.apply(this, arguments);
      }
    );
    return button;
  }
  // this loads the secondaries for menu and data
  if (
    document.getElementById("bm_load_img") === null &&
    data.classList.contains("blog-menu-preload")
  ) {
    data.classList.remove("blog-menu-preload");
    // first time open, fetch the blogs, if any
    var xhttp = new XMLHttpRequest();
    var preLoad = new Image();
    preLoad.src = loderGifSrc;
    preLoad.style.width = "32px;"
    preLoad.style.height = "32px";
    preLoad.id = "bm_load_img";
    document.getElementById("blog_menu").appendChild(preLoad);
    xhttp.onreadystatechange = function () {
      if (this.readyState == 4 && this.status == 200) {
        var data = document.getElementById(
          "mass_post_features-plugin_data"
        );
        var div = document.createElement("div");
        div.innerHTML = this.responseText. // parse the dom
        replace(/<(\/?)script[^>]*>/g, "<$1flurb>"). // no eval
        replace(/<img/g,"<space"); // do not onload img tags
        var apiKey = div.querySelectorAll(
          "meta[name=tumblr-form-key]"
        )[0].getAttribute("content");
        data.setAttribute("data-x-tumblr-form-key", apiKey);
        var l = div.getElementsByClassName("l-container")[0];
        var li = l.getElementsByClassName("is_tumblelog");
        var tumblelogs = [];
        var st;
        var a;
        var av;
        var ho;
        var tray;
        var subt;
        var name1;
        var link0;
        var link1;
        var link2;
        var link3;
        var link4;
        var edIcon;
        var visIcon;
        var reIcon;
        var primIcon;
        var frIcon;
        var phIcon;
        var href = document.location.href.split(/[\/\?&#=]+/g);
        var name = href[4];
        var reAsDraftContainer = document.createElement("div");
        reAsDraftContainer.classList.add("blog_menu_child");
        var reAsDraft = document.createElement("input");
        reAsDraft.type = "checkbox";
        reAsDraft.id = "re-as-draft";
        reAsDraft.checked = true;
        reAsDraftContainer.appendChild(reAsDraft);
        var reAsDraftLabel = document.createElement("label");
        reAsDraftLabel.setAttribute("for", "re-as-draft");
        reAsDraftLabel.appendChild(
          document.createTextNode("Reblog Posts as Draft")
        );
        var navFollows1;
        var robotWarning = document.createElement("div");
        var robotTitle = document.createElement("strong");
        robotTitle.appendChild(
          document.createTextNode(
            "Friendly Robot Warning"
          )
        );
        robotWarning.classList.add("robot-warning");
        robotWarning.appendChild(robotTitle);
        robotWarning.appendChild(
          document.createTextNode(
            "Dash flooding might make you lose followers!"
          )
        );
        reAsDraftContainer.appendChild(reAsDraftLabel);
        reAsDraftContainer.appendChild(robotWarning);
        document.getElementById("blog_menu").appendChild(reAsDraftContainer);
        for (var i = 0; i < li.length; i++) {
          a = li[i].getElementsByTagName("a")[0];
          av = a.getElementsByClassName("avatar")[0];
          av.removeAttribute("style");
          av.innerHTML = av.innerHTML.replace(/<space/g,"<img");
          st = a.getElementsByClassName("small_text")[0];
          ho = a.getElementsByClassName("hide_overflow")[0];
          tray = document.createElement("div");
          tray.classList.add("blog_menu_child");
          name1 = ho.innerHTML.replace(/\s+/g, "");
          tray.setAttribute("data-name", name1);
          tumblelogs.push(name1);
          if (i === 0) { // assuming primary is first blog :)
            data.setAttribute("data-primary-blog", name1);
            navFollows1 = document.getElementById("nav-follows");
            navFollows1.setAttribute(
              "href", "/mega-editor/published/" + name1 + "?follows"
            );
            data.setAttribute("data-primary-known", "true");
            // this is the follows and followers
            if (
              href[3] === "published" &&
              (
                href[5] === "follows" ||
                href[5] === "followers"
              )
            ) {
              loadFollowers();
            }
            var navLikes = document.getElementById("nav-likes");
            navLikes.setAttribute(
              "data-default-input", getCookie("name1") !== "" ? getCookie("name1") : name1
            );
            primIcon = svgForType.original.cloneNode(true);
            primIcon.setAttribute("width", 20);
            primIcon.setAttribute("height", 20);
            primIcon.setAttribute("title", "Primary Blog");
            primIcon.setAttribute("fill", "rgba(0,65,100,1)");
            st.insertBefore(primIcon, st.firstChild);
          }
          reIcon = svgForType["reblog-self"].cloneNode(true);
          reIcon.setAttribute("width", "26");
          reIcon.setAttribute("height", "26");
          reIcon.setAttribute("fill", "#7D99FF");
          av.appendChild(reIcon);
          av.setAttribute("title", "Select Avatar for Quick-Reblogs");
          av.setAttribute("data-name", name1);
          av.id = "reblog-to_" + name1;
          av.addEventListener("click", function() {
            var data = document.getElementById(
              "mass_post_features-plugin_data"
            );
            var rb = document.getElementsByClassName("reblog-to-here");
            while (rb.length > 0) {
              rb[0].classList.remove("reblog-to-here");
            }
            this.classList.add("reblog-to-here");
            data.setAttribute(
              "data-reblog-to-here", this.getAttribute("data-name")
            );
          });
          if (name.toLowerCase() === name1.toLowerCase()) {
            av.classList.add("reblog-to-here");
            data.setAttribute("data-reblog-to-here", name);
          }
          tray.appendChild(av);
          tray.appendChild(st);
          link0 = document.createElement("a");
          link1 = document.createElement("a");
          link2 = document.createElement("a");
          link3 = document.createElement("a");
          link4 = document.createElement("a");
          subt = document.createElement("div");
          link0.setAttribute(
            "title", "edit \"" + name1 + "\" drafts"
          );
          link0.setAttribute(
            "href", "https://www.tumblr.com/mega-editor/draft/" + name1
          );
          link1.setAttribute(
            "title", "visit \"" + name1 + "\""
          );
          link1.setAttribute(
            "href", "https://www.tumblr.com/blog/" + name1
          );
          link1.setAttribute(
            "target", "_blank"
          );
          link3.setAttribute(
            "title", "batch photo upload to \"" + name1 + "\""
          );
          link4.setAttribute(
            "title", "\"" + name1 + "\" followers"
          );
          link2.setAttribute(
            "href",
            "https://www.tumblr.com/mega-editor/published/" + name1
          );
          link3.setAttribute(
            "href",
            "https://www.tumblr.com/mega-editor/publish/" + name1 + "?photos"
          );
          link4.setAttribute(
            "href",
            "https://www.tumblr.com/mega-editor/published/" + name1 + "?followers"
          );
          link0.appendChild(
            document.createTextNode(
              "Drafts"
            )
          );
          link1.appendChild(
            document.createTextNode(
              "Visit"
            )
          );
          link2.appendChild(
            document.createTextNode(
              "Editor"
            )
          );
          link3.appendChild(
            document.createTextNode(
              "Photos"
            )
          );
          link4.appendChild(
            document.createTextNode(
              "Followers"
            )
          );
          edIcon = svgForType.edit.cloneNode(true);
          edIcon.setAttribute("width", 12);
          edIcon.setAttribute("height", 12);
          edIcon.setAttribute("fill", "#7D99FF");
          frIcon = svgForType.mutual.cloneNode(true);
          frIcon.setAttribute("width", 12);
          frIcon.setAttribute("height", 12);
          frIcon.setAttribute("fill", "#7D99FF");
          phIcon = svgForType.image.cloneNode(true);
          phIcon.setAttribute("width", 12);
          phIcon.setAttribute("height", 12);
          phIcon.setAttribute("fill", "#7D99FF");
          visIcon = svgForType.home.cloneNode(true);
          visIcon.setAttribute("width", 12);
          visIcon.setAttribute("height", 12);
          visIcon.setAttribute("fill", "#7D99FF");
          link0.appendChild(edIcon.cloneNode(true));
          link1.appendChild(visIcon.cloneNode(true));
          link2.appendChild(edIcon.cloneNode(true));
          link3.appendChild(phIcon.cloneNode(true));
          link4.appendChild(frIcon.cloneNode(true));
          subt.appendChild(link2);
          subt.appendChild(link0);
          subt.appendChild(link3);
          subt.appendChild(link4);
          subt.appendChild(link1);
          if (
            !data.classList.contains("is-uploading-photos") &&
            href[5] !== "followers" && href[5] !== "follows"
          ) {
            subt.appendChild(reblogMenuButton(name1));
          } else {
            var blankSpace = document.createElement("div");
            blankSpace.classList.add("blank-space");
            subt.appendChild(blankSpace);
          }
          subt.classList.add("subt");
          tray.appendChild(subt);
          document.getElementById("blog_menu").appendChild(tray);
        }
        data.setAttribute(
          "data-tumblelogs", JSON.stringify(tumblelogs)
        );
        document.getElementById("blog_menu").removeChild(
          document.getElementById("bm_load_img")
        );
      }
    };
    xhttp.open("GET", "/settings", true);
    xhttp.send();
  } // this loads the blog menu

  // this opens the blog menu
  blogMenuLink.addEventListener("click", function (e) {
    var data = document.getElementById(
      "mass_post_features-plugin_data"
    );
    // any other time, just open menu
    if (
      !this.classList.contains("open") &&
      !data.classList.contains("open-blog_menu") &&
      !data.classList.contains("closing-blog_menu")
    ) {
      data.classList.add("open-blog_menu");
      this.classList.add("open");
      e.cancelBubble = true;
      e.preventDefault();
      e.stopPropagation();
    }
    e.cancelBubble = true;
    e.stopPropagation();
  });
  // end of blogs menu blog dropdown...

  // tumblr now has its own default queue/drafts pages
  // so we'll fake a query with userscript booleans
  if(
    href[3] === "published" || href[3] === "draft" || href[3] === "queued"
  ) {
    getResponseText("/blog/" + name, function (re){
      var div = document.createElement("div");
      div.innerHTML = re. // parse the dom
      replace(/<(\/?)script[^>]*>/g, "<$1flurb>"). // no eval
      replace(/<img/g,"<space"); // do not onload img tags
      var flurb = div.getElementsByTagName("flurb");
      var keyReg = /"API_TOKEN"[^:]*:[^"]*"([^"]+)"/i;
      var csrfReg = /"CSRFTOKEN"[^:]*:[^"]*"([^"]+)"/i;
      // find the flurb :) not joking
      var apiToken = 0;
      var csrfToken = 0;
      var primary = name;
      for (var i = 0; i < flurb.length; i++) {
        if (flurb[i].innerText.match(keyReg) !== null) {
          apiToken = flurb[i].innerText.match(keyReg)[1];
          break;
        }
      }
      for (i = 0; i < flurb.length; i++) {
        if (flurb[i].innerText.match(csrfReg) !== null) {
          csrfToken = flurb[i].innerText.match(csrfReg)[1];
          break;
        }
      }
      if (apiToken !== 0) {
        // this is Tumblr's own API key! (0_0)
        data.setAttribute("data-api-token", apiToken);
        data.setAttribute("data-csrf-token", csrfToken);
        // please use this ^ responsibly! (O.O)
        if (
          href[3] === "published" &&
          href[5] === "fans"
        ) {
          var token = data.getAttribute("data-api-token");
        }
        if (
          href[3] === "published" &&
          (
            href[5] === "dashboard" ||
            href[5] === "archive" ||
            href[5] === "tagged" ||
            href[5] === "likes" ||
            href[5] === "search"
          )
        ) {
          // hide editor functions for archive view / reblog mode
          var ritpm = document.getElementsByClassName(
            "remove-in-third-party-mode"
          ); // edit buttons don't work in reblog mode... I tried :)
          while (ritpm.length > 0) {
            ritpm[0].parentNode.removeChild(ritpm[0]);
          }
          var notice = document.createElement("div");
          notice.classList.add("notice");
          notice.appendChild(
            document.createTextNode(
              "Page may be endless; Utilize pause button."
            )
          );
          document.getElementsByClassName(
            "editor_navigation"
          )[0].appendChild(notice);
          if (href[5] === "dashboard") {
            i = "dash";
          }
          if (href[5] === "archive") {
            i = "archive";
          }
          if (href[5] === "tagged") {
            i = "tagged";
          }
          if (href[5] === "likes") {
            i = "likes";
          }
          if (href[5] === "search") {
            i = "search";
          }
        } else {
          i = href[3];
          // this is the fans
          if (
            href[3] === "published" &&
            href[5] === "fans"
          ) {
           // loadFans(); // html api; too unstable
          }
        }
        if (
          href[3] === "published" && href[5] === "archive" ||
          href[3] === "published" && href[5] === "likes" ||
          href[3] === "published" && href[5] === "dashboard" ||
          href[3] === "published" && href[5] === "tagged" ||
          href[3] === "published" && href[5] === "search" ||
          (
            i === "published" && href[5] !== "photos" &&
            i === "published" && href[5] !== "follows" &&
            i === "published" && href[5] !== "followers" &&
            i === "published" && href[5] !== "fans"
          ) ||
          i === "queued" ||
          i === "draft"
        ) {
          var q = typeof href[6] !== "undefined" ? href[6] : "cats";
          var o = typeof href[7] !== "undefined" && !isNaN(href[7]) ?
              "&before=" + href[7] : "";
          if (q === name) {
            q = data.getAttribute("data-primary-blog");
            // all secondaries goto the blog that likes, for likes :)
          }
          var subpage = {
            "published" :
              "/v2/blog/" + name +
			  "/posts?limit=50&reblog_info=1&npf=1&page=1" + o,
            "likes":
              "/v2/blog/" + q +
			  "/likes?limit=50&reblog_info=1&npf=1&page=1" + o,
            "draft":
              "/v2/blog/" + name +
			  "/posts/draft?limit=50&reblog_info=1&npf=1&page=1" + o,
            "queued":
              "/v2/blog/" + name +
			  "/posts/queue?limit=50&reblog_info=1&npf=1&page=1" + o,
            "archive":
              "/v2/blog/" + q +
			  "/posts?limit=50&reblog_info=1&npf=1&page=1" + o,
            "dash" :
              "/v2/timeline/dashboard",
            "search" :
              "/v2/mobile/search/posts?blog_limit=0&post_limit=50&query=" + q +
              "&mode=top" + o,
            "tagged" : // why is these mobile? I'm not quite sure...
              "/v2/mobile/search/posts?blog_limit=0&post_limit=50m&query=" + q +
              "&mode=top&mode=recent" + o
          }[i];
          data.setAttribute("data-ajax-first-subpage", subpage);
          asyncRepeatApiRead({
            "response": { // we wil use all neue npf format, because
              "_links": { // some posts are neue npf, no matter what
                "next": { // (if you can't beat 'em, join 'em)
                  "href":  subpage
                }
              }
            }
          });// this thing paginates itself
        }
        // this is the follows and followers
        if (
          href[3] === "published" &&
          (
            href[5] === "follows" ||
            href[5] === "followers"
          )
        ) {
          loadFollowers();
        }
      }
    });
  };

  // the month widget must be modified to accomidate Archives
  var broMo = document.createElement("div");
  broMo.id = "browse_months";
  broMo.setAttribute("onclick", "just_clicked_browse_months = true;");
  var jum2mo = document.createElement("div");
  jum2mo.id = "jump_to_month";
  var aro2 = document.createElement("span");
  aro2.classList.add("arrow");
  jum2mo.appendChild(aro2);
  broMo.addEventListener("click", function () {
    var bmw = document.getElementById(
      "browse_months_widget"
    );
    if (
      window.getComputedStyle(bmw).
        getPropertyValue("display") === "none"
     ) {
      bmw.style.display = "block";
    } else {
      bmw.style.display = "none";
    }
  });
  var mo2;
  var jum = typeof href[5] !== "undefined" ? href[5] : "jump";
  var jumto = typeof href[6] !== "undefined" ? href[6] : name;
  var year = typeof href[7] !== "undefined" && !isNaN(href[7]) ?
        (new Date(parseInt(href[7]) * 1000)).getFullYear() :
        (new Date()).getFullYear();
  if (href[3] === "queued" || href[3] === "draft") {
    var ridqm = document.getElementsByClassName(
      "remove-in-drafts-queue-mode"
    );
    while (ridqm.length > 0) {
      ridqm[0].parentNode.removeChild(ridqm[0]);
    }
  }
  if (href[3] === "published" &&
      (
        typeof href[5] === "undefined" ||
        href[5] === "jump" ||
        href[5] === "archive"
      )
  ) {
    mo2 = document.createElement("span");
    mo2.classList.add("month");
    mo2.appendChild(document.createTextNode("Month"));
    jum2mo.appendChild(mo2);
    // this is a sneaky trick to get that elusive "firstPostTimeStamp"
    var monthIframe = document.createElement("iframe");
    monthIframe.style.display = "none";
    monthIframe.id = "browse_months_widget";
    monthIframe.setAttribute("scrolling", "no");
    monthIframe.setAttribute("frameborder", "0");
    monthIframe.setAttribute("title", "Post forms");
    monthIframe.src = "https://" + jumto + ".tumblr.com/" +
                      "archive?fetch=first_post_timestamp" +
                      "&jump=" + jum + "&name=" + name + "&to=" +
                      jumto + "&year=" + year;
    // these ^ url parameters need to be in alphabetical order
    jum2mo.appendChild(monthIframe);
    broMo.appendChild(jum2mo);
    document.getElementById(
      "browse_months"
    ).parentNode.replaceChild(
      broMo,
      document.getElementById(
        "browse_months"
      )
    );
  } else {
    mo2 = document.createElement("span");
    mo2.classList.add("month");
    mo2.appendChild(document.createTextNode("Month"));
    jum2mo.appendChild(mo2);
    // this is for getting before timestamps for other feeds
    jum = typeof href[5] !== "undefined" ? href[5] : "jump";
    jumto = typeof href[6] !== "undefined" ? href[6] : name;
    year = typeof href[7] !== "undefined" && !isNaN(href[7]) ?
        (new Date(parseInt(href[7]) * 1000)).getFullYear() :
        (new Date()).getFullYear();
    lTs = (new Date()).getTime();
    fTs = (new Date(1970, 0, 1)).getTime();
    var monthDiv = makeBrowseMonthsWidget(year, lTs, fTs, jum, jumto);
    monthDiv.style.display = "none";
    jum2mo.appendChild(monthDiv);
    broMo.appendChild(jum2mo);
    document.getElementById(
      "browse_months"
    ).parentNode.replaceChild(
      broMo,
      document.getElementById(
        "browse_months"
      )
    );
    doubleCheckDisabledMonths(year, lTs, fTs, jum, jumto);
  }

  // this is the new batch photos page! BATCH PHOTOS PAGE
  if (href[3] === "published" && href[5] === "photos") {
    navArchive = document.getElementById("nav_archive");
    navArchive.style.zIndex = "1000";
    var addTagsWidget = document.getElementById("add_tags_widget");
    navArchive.appendChild(addTagsWidget);
    var addTagButton = document.getElementById("add_tag_button");
    addTagButton.removeAttribute("onclick");
    var addTagButton2 = addTagButton.cloneNode(true);
    addTagButton.firstChild.innerHTML = "Add Tags (single)";
    addTagButton2.firstChild.innerHTML = "Add Tags to All";
    addTagButton2.id += "2";
    addTagButton2.style.position = "absolute";
    addTagButton2.style.bottom = "8px";
    addTagButton2.style.left = "161px";
    addTagButton2.addEventListener("click", function () {
      var token = document.getElementById("tokens").children;
      var pb = document.getElementsByClassName("photo-brick");
      var phTags;
      var aToken;
      var child;
      var a;
      var addToken = true;
      for (var j = 0; j < pb.length; j++) {//pb & j :)
        phTags = pb[j].getElementsByClassName("photo-tags")[0];
        aToken = phTags.children;
        for (var i = 0; i < token.length; i++) {
          addToken = true;
          for (var l = 0; l < aToken.length; l++) {
            if (token[i].innerHTML === aToken[l].innerHTML) {
              addToken = false;
              break;
            }
          }
          if (addToken) {
            child = token[i].cloneNode(true);
            a = child.getElementsByTagName("a");
            a[0].removeAttribute("onclick");
            phTags.appendChild(child);
          }
        }
      }
    });
    addTagButton.addEventListener("click", function () {
      var fr = document.getElementsByClassName("focused-rich");
      if (fr.length === 0) {
        return;
      }
      var token = document.getElementById("tokens").children;
      var phTags = fr[0].getElementsByClassName("photo-tags")[0];
      var aToken = phTags.children;
      var addToken = true;
      for (var i = 0; i < token.length; i++) {
        addToken = true;
        for (var l = 0; l < aToken.length; l++) {
          if (token[i].innerHTML === aToken[l].innerHTML) {
            addToken = false;
            break;
          }
        }
        if (addToken) {
          phTags.appendChild(token[i].cloneNode(true));
        }
      }
    });
    addTagButton.parentNode.parentNode.appendChild(addTagButton2);
    addTagsWidget.style.top = "83px";
    addTagsWidget.style.left = "15px";
    addTagsWidget.style.removeProperty("right");
    lcontent.classList.add("albino");
    lcontent.classList.add("hoverless");
    lcontent.classList.add("photo-page");
    data.classList.add("is-uploading-photos");
    var dragEnter = function(e){
      e.preventDefault();
      if (
        document.getElementsByClassName(
          "brick-dragging"
        ).length > 0
      ) {
        return;
      }
      var pdz = document.getElementById("photos-drop-zone");
      pdz.classList.add("full");
    };
    var dragLeave = function(e) {
      e.preventDefault();
      var pdz = document.getElementById("photos-drop-zone");
      pdz.classList.remove("full");
    };
    var drop = function(e) {
      e.preventDefault();
      var papb = document.getElementById("post_all_photos_button");
      if (papb.getAttribute("disabled") !== null) {
        papb.removeAttribute("disabled");
      }
      var pdz = document.getElementById("photos-drop-zone");
      pdz.classList.remove("full");
      var files;
      if (typeof e.dataTransfer !== "undefined") {
        files = e.dataTransfer.files;
      } else if (typeof this.files !== "undefined") {
        files = this.files;
      }
      var r;
      for (var i = 0; i < files.length; i++) {
        if(files[i].type.toString().split(/\//)[0] !== "image") {
          continue;
        }
        r = new FileReader();
        r.imgCode = "img"+shortCode(files[i].name);
        r.addEventListener("load", loadPhotoIntoDOM);
        reading.push(
          {
            read: function(){
              reading[reading.length - 1].reader.readAsDataURL(
                reading[reading.length - 1].file
              );
            },
            file: files[i],
            reader: r
          }
        );
        unreadFile["img"+shortCode(files[i].name)] = files[i];
      }
      reading[reading.length - 1].read();
    };
    en = document.getElementsByClassName("editor_navigation");
    // remove all navigation buttons, editor widgets, and start anew
    en[0].parentNode.removeChild(en[0]);
    var dropZone = document.createElement("div");
    dropZone.id = "photos-drop-zone";
    var dropTitle = document.createElement("h2");
    dropTitle.appendChild(
      document.createTextNode("Drop Photos Here")
    );
    dropTitle.id = "drop_images_here";
    var inputBackup = document.createElement("input");
    inputBackup.type = "file";
    inputBackup.accept = "image/x-png,image/gif,image/jpeg,image/png";
    inputBackup.multiple = true;
    inputBackup.addEventListener("change", drop);
    inputBackup.id = "photo_file_input";
    var postPhotos = butt("Post Photos");
    postPhotos.disabled = true;
    postPhotos.id = "post_all_photos_button";
    postPhotos.setAttribute("title", "Post All Photos");
    postPhotos.addEventListener("click", photoUploadAndSubmit);
    var photosAsDraft = document.createElement("input");
    photosAsDraft.id = "photos_as_draft";
    photosAsDraft.type = "checkbox";
    photosAsDraft.checked = true;
    var photosAsDraftLabel = document.createElement("label");
    photosAsDraftLabel.setAttribute("for", "photos_as_draft");
    photosAsDraftLabel.appendChild(
      document.createTextNode(
        "New Photo/Photoset Posts"
      )
    );
    var asB = document.createElement("strong");
    asB.appendChild(
      document.createTextNode(" as Draft")
    );
    photosAsDraftLabel.appendChild(asB);
    var photosAsDraftContainer = document.createElement("div");
    photosAsDraftContainer.id = "photos_as_draft_container";
    photosAsDraftContainer.appendChild(photosAsDraft);
    photosAsDraftContainer.appendChild(photosAsDraftLabel);
    var photosRobotWarning = document.createElement("div");
    photosRobotWarning.classList.add("robot-warning");
    var robotTitlePhotos = document.createElement("strong");
    robotTitlePhotos.appendChild(
      document.createTextNode(
        "Friendly Robot Warning"
      )
    );
    photosRobotWarning.appendChild(robotTitlePhotos);
    photosRobotWarning.appendChild(
      document.createTextNode(
        "Dash flooding might make you lose followers. " +
        "Perhaps \"check\" post \"as draft\" instead?"
      )
     );
    photosAsDraftContainer.appendChild(photosRobotWarning);
    document.body.appendChild(photosAsDraftContainer);
    document.body.appendChild(inputBackup);
    document.body.appendChild(postPhotos);
    document.body.appendChild(dropTitle);
    document.body.appendChild(dropZone);
    document.documentElement.addEventListener("dragenter", dragEnter, false);
    document.documentElement.addEventListener("dragover", dragEnter, false);
    document.documentElement.addEventListener("dragleave", dragLeave, false);
    document.documentElement.addEventListener("drop", drop, false);
  }
};
// May 2020, Mass Post Editor Features 4 (from scratch) by Jake Jilg (benign-mx)
document.onreadystatechange = function () {
  // Hello :)
  if (document.readyState === "interactive") {
    MassPostEditorFeatures4();
  }
}; // Hello world!