4cheddit skin

Changes 4chan pages to look like Reddit

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name 4cheddit skin
// @namespace 4cheddit
// @version 2018.11.31
// @include *://*.4chan.org/*
// @include *://*.4channel.org/*
// @exclude *://is.4chan.org/*
// @grant unsafeWindow
// @grant GM_getValue
// @grant GM_setValue
// @description Changes 4chan pages to look like Reddit
// ==/UserScript==
'use strict';

//Fallback
if(document.getElementById('redditcss')){
	throw ''
}
if(typeof unsafeWindow=='undefined'){
	window.unsafeWindow=window
	window.GM_getValue=function(key){
		return localStorage['*4cheddit*'+key]
	}
	window.GM_setValue=function(key,val){
		localStorage['*4cheddit*'+key]=val
	}
}

// Create element function
function element(tag,parent,attributes,innerhtml){
	var newtag=document.createElement(tag)
	if(attributes){
		for(var i in attributes){
			newtag.setAttribute(i,attributes[i])
		}
	}
	if(innerhtml){
		newtag.innerHTML=innerhtml
	}
	if(parent){
		parent.appendChild(newtag)
	}
	return newtag
}

//Converts timestamp to relative time
function toreltime(inti,tnow){
	var timd=(tnow-inti)/1000
	var sec=timd%60|0
	timd/=60
	var min=timd%60|0
	timd/=60
	var hrs=timd%24|0
	timd/=24
	var day=timd%30.4375|0
	var week=timd/7|0
	var dayw=day%7|0
	timd/=30.4375
	var mon=timd%12|0
	var yer=Math.floor(timd/12)
	if(!mon&&!yer&&day>6){
		var tout=week+' week'+(week>1?'s ':' ')+(dayw&&week<2?'and '+dayw+' day'+(dayw>1?'s ':' '):'')
	}else{
		var till=[
			yer?yer+' year'+(yer>1?'s ':' '):'',
			mon&&yer<2?mon+' month'+(mon>1?'s ':' '):'',
			day&&mon<2?day+' day'+(day>1?'s ':' '):'',
			hrs&&day<2?hrs+' hour'+(hrs>1?'s ':' '):'',
			min&&hrs<3?min+' minute'+(min>1?'s ':' '):'',
			(sec&&min<10)||!min?sec+' second'+(sec>1?'s ':' '):''
		]
		for(var g=0;g<till.length&&!till[g];g++){}
		var tout=till[g]+(till[g+1]?'and '+till[g+1]:'')
	}
	var newdt=new Date(inti*1)
	return [tout+'ago',newdt.toDateString()+' '+newdt.toLocaleTimeString()]
}

//Update posts
function updateposts(event,timer){
	var cheddit=timer?'':':not(.cheddit)'
	if(event){
		var replies=document.querySelectorAll('#t'+event.detail.threadId+' .postContainer'+cheddit)
	}else{
		var replies=document.querySelectorAll('.thread .postContainer'+cheddit)
	}
	if(replies.length){
		if(timer!=1){
			var xposts=localStorage['4chan X.yourPosts']
			if(xposts){
				xposts=JSON.parse(xposts)
				for(var board in xposts.boards){
					for(var thread in xposts.boards[board]){
						var obj={}
						for(var post in xposts.boards[board][thread]){
							obj['>>'+post]=1
						}
						localStorage['4chan-track-'+board+'-'+thread]=JSON.stringify(obj)
					}
				}
			}
			var postsbyme=[]
			var currentthread='\\d+'
			if(activepage=='thread'){
				var resto=document.getElementsByName('resto')[0]
				if(resto){
					currentthread=resto.value
				}else{
					var match=location.pathname.match(/\/([0-9]+)/)
					if(match){
						currentthread=match[1]
					}
				}
			}
			for(var i in localStorage){
				var match=i.match(new RegExp('^4chan-track-'+currentboard+'-('+currentthread+')$'))
				if(match){
					var thread=JSON.parse(localStorage[i])
					for(var j in thread){
						postsbyme.push(j.substr(2))
					}
				}
			}
		}
		var tnow=new Date
		var utc=0
		if(replies.length>200){
			var end=200
		}else{
			var end=replies.length
		}
		for(var i=0;i<end;i++){
			if(i==200){
				var j=0
			}else{
				var j=i
			}
			var datetime=replies[j].querySelector('.postInfo.desktop .dateTime')
			var relarray=toreltime(datetime.dataset.utc*1000,tnow)
			datetime.classList.add('hasrelative')
			datetime.dataset.relative=relarray[0]
			if(!datetime.title){
				datetime.title=relarray[1]
			}
			if(timer!=1){
				replies[j].classList.add('cheddit')
				//Find bumps
				var dtime=replies[j].getElementsByClassName('dateTime')[0]
				var newutc=dtime.dataset.utc
				if(utc&&(newutc-utc)>=3600){
					replies[j].classList.add('postbump')
				}
				utc=newutc
				if(replies[j].classList.contains('opContainer')){
					var blockquote=replies[j].getElementsByTagName('blockquote')[0]
					if(!blockquote.innerHTML){
						blockquote.style.display='none'
					}
				}
				//Reposted images timestamp
				var filelink=replies[j].querySelector('.fileText>a,.file-info>a')
				if(filelink){
					var match=filelink.innerHTML.match(/^(\d{13})s?\.\w+$/)
					if(match&&match[1]>1042e9&&match[1]<tnow){
						var relarray=toreltime(match[1],new Date)
						filelink.parentNode.dataset.timestamp=relarray[0]+' ('+relarray[1]+')'
						filelink.parentNode.classList.add('filenamestamp')
					}
				}
				// Make spoilers clickable
				var spoilers=replies[j].getElementsByTagName('s')
				for(var k=0;k<spoilers.length;k++){
					spoilers[k].tabIndex=0
				}
				//Mark OP posts
				var nameblock=replies[j].querySelector('.desktop .nameBlock')
				var uid=nameblock.getElementsByClassName('posteruid')[0]
				if(j&&opname&&!replies[j].getElementsByClassName('submitterlink')[0]){
					var postname=nameblock.innerHTML.trim().replace(/<br>/g,'')
					if((uid&&opname==uid.className)||opname==postname){
						var opmark=element('span',0,0,' [<a href="'+location.pathname+'" class="submitterlink">S</a>] ')
						nameblock.parentNode.insertBefore(opmark,nameblock.parentNode.getElementsByClassName('dateTime')[0])
						nameblock.classList.add('submitterlink')
					}
				}
				//Mark my posts
				var postid=replies[j].querySelector('.postNum.desktop>:last-child').innerHTML
				if(j&&postsbyme&&postsbyme.indexOf(postid)+1&&!replies[j].getElementsByClassName('yourlink')[0]){
					var memark=element('span',0,0,' [')
					element('a',memark,{
						class:'pointer yourlink'
					},'U').onclick=function(){
						userlink()
					}
					memark.appendChild(document.createTextNode('] '))
					nameblock.parentNode.insertBefore(memark,nameblock.parentNode.getElementsByClassName('dateTime')[0])
					nameblock.classList.remove('submitterlink')
					nameblock.classList.add('yourlink')
				}
				//Mark capcodes
				var capcode=replies[j].querySelector('.postInfo .capcodeMod,.postInfo .capcodeAdmin')
				if(capcode&&capcode.lastChild.tagName=='IMG'){
					if(capcode.classList.contains('capcodeAdmin')){
						element('span',capcode,0,' [<a class="pointer" style="color:#f01">A</a>]')
					}else{
						element('span',capcode,0,' [<a class="pointer" style="color:#282">M</a>]')
					}
				}
				//Exand files
				if(thesettings.expandfiles){
					var thumblink=replies[j].querySelector('a.fileThumb')
					if(thumblink){
						thumblink.onclick=expandthumb
						expandlist.push(thumblink)
					}
				}
			}
		}
		if(postcount){
			var repliesnumber=document.querySelectorAll('.thread .replyContainer').length
			if(repliesnumber){
				postcount.innerHTML='all '+repliesnumber+' comments'
				postcount.style.marginBottom=''
			}
		}
	}
}

//Update posts with delay
function updatepostsx(){
	var currenttime=+new Date
	var pasttime=replycache[0]
	if(pasttime+1000>=currenttime){
		setTimeout(function(){
			if(pasttime==replycache[0]){
				updatepostsx()
			}
		},pasttime+1000)
	}else{
		replycache[0]=currenttime
		updateposts()
	}
}

//Expand thumbnails
function expandthumb(event,close){
	getSelection().removeAllRanges()
	if(close){
		removeEventListener('keydown',expandkeydown)
		removeEventListener('keyup',expandkeyup)
		removeEventListener('blur',expandkeyup)
		removeEventListener('contextmenu',expandkeyup)
		expandkeyup()
		expanddiv.style.display='none'
		var fromtop=[pageXOffset,pageYOffset]
		expandlist[expandindex].focus()
		if(!event.shiftKey){
			scroll(fromtop[0],fromtop[1])
		}
		expandindex=-1
		expandnextfile()
		expandthis=0
	}else{
		event.preventDefault()
		event.stopPropagation()
		var target=event.target
		for(;target;){
			if(target.tagName=='A'){
				break
			}
			target=target.parentNode
		}
		expanddiv.style.display='block'
		expandindex=expandlist.indexOf(target)
		expandnextfile()
		addEventListener('keydown',expandkeydown)
		addEventListener('keyup',expandkeyup)
		addEventListener('blur',expandkeyup)
		addEventListener('contextmenu',expandkeyup)
	}
}
function expandkeydown(event){
	var nodefault=1
	if(expandmode){
		switch(event.keyCode){
			case 13:{ // Enter
				expandthumb(event,1)
				break
			}
			case 32:{ // Space
				if(event.ctrlKey){
					expanddiv.style.background='none'
					expandthis.style.opacity='.5'
				}else if(expandthis.paused){
					expandthis.play()
				}else{
					expandthis.pause()
				}
				break
			}
			case 37:{ // Left
				var totime=expandthis.currentTime-5
				if(totime<0){
					totime=0
				}
				expandthis.currentTime=totime
				break
			}
			case 39:{ // Right
				var totime=expandthis.currentTime+5
				var maxtime=expandthis.duration
				if(totime>=maxtime){
					if(expandthis.paused){
						totime=maxtime
					}else{
						if(expandthis.loop){
							totime=0
						}else{
							expandthis.pause()
							totime=maxtime
						}
					}
				}
				expandthis.currentTime=totime
				break
			}
			case 38:{ // Up
				expandnextfile(-1)
				break
			}
			case 40:{ // Down
				expandnextfile(1)
				break
			}
			default:{
				nodefault=0
				break
			}
		}
	}else{
		switch(event.keyCode){
			case 13:{ // Enter
				expandthumb(event,1)
				break
			}
			case 32:{ // Space
				expanddiv.style.background='none'
				expandthis.style.opacity='.5'
				break
			}
			case 37:
			case 38:{ // Left, Up
				expandnextfile(-1)
				break
			}
			case 39:
			case 40:{ // Right, Down
				expandnextfile(1)
				break
			}
			default:{
				nodefault=0
				break
			}
		}
	}
	if(nodefault){
		event.preventDefault()
	}
}
function expandkeyup(event){
	if(!event||event.keyCode==32||event.type=='blur'||event.type=='contextmenu'){
		expanddiv.style.background=
		expandthis.style.opacity=''
	}
}
function expandnextfile(dir){
	if(expandthis){
		var opacity=expandthis.style.opacity
		expanddiv.removeChild(expandthis)
	}
	if(expandindex+1){
		if(dir){
			expandindex=(expandindex+dir)%expandlist.length
			if(expandindex<0){
				expandindex=expandlist.length-1
			}
		}
		var url=expandlist[expandindex].href
		if(/\.webm$/.test(url)){
			expandmode=1
			expandthis=element('video',expanddiv,{
				preload:1,
				controls:1
			})
			if(!thesettings.pausevideos){
				expandthis.autoplay=1
			}
			if(!thesettings.noloopvideos){
				expandthis.loop=1
			}
			if(!thesettings.unmuteWebm){
				expandthis.muted='muted'
			}
		}else{
			expandmode=0
			expandthis=element('img',expanddiv)
		}
		expandthis.src=url
		expandthis.style.opacity=opacity
	}
}

//Automatically show quick reply
function showqr(){
	setTimeout(function(){
		unsafeWindow.QR.realshow=unsafeWindow.QR.show
		unsafeWindow.QR.show=function(){
			this.realshow.apply(this,arguments)
			document.getElementById('qrFile').setAttribute('accept',fileaccept)
			if(currentboard=='s4s'&&thesettings.autofortune){
				document.querySelector('#quickReply [name="email"]').value='fortune'
			}
			document.body.classList.add('qropened')
		}
		unsafeWindow.QR.realclose=unsafeWindow.QR.close
		unsafeWindow.QR.close=function(){
			this.realclose.apply(this,arguments)
			document.body.classList.remove('qropened')
		}
		if(activepage=='thread'){
			if(thesettings.qrautoopen&&!document.getElementsByClassName('closed').length){
				if(!document.getElementsByClassName('open-qr-wrap')[0]){
					QR.init()
				}
				QR.show(document.getElementsByName('resto')[0].value)
			}
			var update=document.querySelectorAll('[data-cmd="update"]')[1]
			if(update){
				update.accessKey='r'
			}
		}
		//Add new options to settings
		if(unsafeWindow.SettingsMenu){
			unsafeWindow.SettingsMenu.options['4cheddit Settings']={
				fullreddit:['Reddit logo and icon','Make everybody think that you\'re actually browsing Reddit',0],
				expandfiles:['Expand files to full screen [<a href="javascript:expandfiles()">Help</a>]','Overrides "Image expansion" option',1],
				pausevideos:['Don\'t autoplay videos','Videos can be played by pressing spacebar',0,1],
				noloopvideos:['Don\'t loop videos','You can temporarily turn on loop in video right click menu',0,1],
				qrautoopen:['Automatically open Quick Reply','Open Quick Reply as soon as the page loads',0],
				autofortune:['Always check your #fortune','Never worry that you\'ll break the first rule',0,1],
				listcatalog:['Catalog links in board list','Boards at the top of the page will always lead you to catalog',0],
				hidenavlinks:['Hide [Return] [Catalog] [Top] buttons','',true]
			}
			if(GM_getValue('wordreplace')){
				unsafeWindow.SettingsMenu.options['4cheddit Settings'].exportwordreplace=[
					'Export replace and highlight patterns: [<a href="javascript:exportreplace()">Export</a>]','It has been moved to a separate userscript',0
				]
			}
		}
		unsafeWindow.expandfiles=function(){
			var menu=element('div',document.body,{
				class:'UIPanel'
			})
			menu.innerHTML='<div class="extPanel reply" style="width:600px;margin-left:-300px"><div class="panelHeader">Expand files to full screen Help\
<span><img alt="Close" title="Close" class="pointer" src="'+unsafeWindow.Main.icons.cross+'"></span></div>\
With this setting on, the images and videos will be opened in the middle of the screen with a darkened background<br><br>\
Hotkeys:<br>\
<b><kbd>\u25C0</kbd>, <kbd>\u25B2</kbd>, <kbd>\u25B6</kbd>, <kbd>\u25BC</kbd> (only <kbd>\u25B2</kbd> and <kbd>\u25BC</kbd> for videos):</b><br>Go to previous/next file in the thread<br><br>\
<b><kbd>\u25C0</kbd>, <kbd>\u25B6</kbd> (videos):</b><br>Seek 5 seconds backwards/forwards<br><br>\
<b><kbd>Space</kbd> (videos):</b><br>Pause video<br><br>\
<b><kbd>Space</kbd> (<kbd>Ctrl</kbd>+<kbd>Space</kbd> for videos):</b><br>Hold the button to make the view transparent, useful when thying to read a post and looking at a picture at the same time<br><br>\
<b><kbd>Enter</kbd>, Click:</b><br>Closes the file<br><br>\
<b><kbd>\u21E7 Shift</kbd>+<kbd>Enter</kbd>, <kbd>\u21E7 Shift</kbd>+Click:</b><br>Close the file and also scroll to the post that it was attached to<br><br></div>'
			menu.onclick=closepanel
		}
		unsafeWindow.exportreplace=function(){
			var replace={
				patterns:[]
			}
			var wr_strings=GM_getValue('wordreplace')
			if(wr_strings){
				wr_strings=JSON.parse(wr_strings)
			}else{
				wr_strings=[]
			}
			for(var i in wr_strings){
				replace.patterns[i]={
					on:wr_strings[i][0],
					pattern:wr_strings[i][1],
					replace:wr_strings[i][2],
					board:wr_strings[i][3],
					mark:wr_strings[i][4]
				}
			}
			replace=JSON.stringify(replace).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')
			var menu=element('div',document.body,{
				class:'UIPanel'
			})
			menu.innerHTML='<div class="extPanel reply"><div class="panelHeader">Export replace and highlight patterns\
<span><img alt="Close" title="Close" class="pointer" src="'+unsafeWindow.Main.icons.cross+'"></span></div>\
<textarea style="width:100%;height:100px;box-sizing:border-box" id="replacetxt">'+replace+'</textarea>\
<div style="text-align:center">\
<input type="button" id="replacedl" value="Download"> \
<input type="button" id="replaceclear" value="Clear">\
</div>\
<br></div>'
			menu.onclick=closepanel
			document.getElementById('replacedl').onclick=function(){
				var txt=document.getElementById('replacetxt').value
				txt=btoa(encodeURIComponent(txt).replace(/%([0-9A-F]{2})/g,function(a,b){
					return String.fromCharCode('0x'+b)
				}))
				element('a',0,{
					href:'data:application/json;base64,'+txt,
					download:'wordreplace.json'
				}).click()
			}
			document.getElementById('replaceclear').onclick=function(event){
				if(confirm('Are you sure you want to clear your Replace and highlight patterns? This will remove the option to export them')){
					GM_setValue('wordreplace','')
					var parent=event.target.parentNode.parentNode.parentNode
					parent.parentNode.removeChild(parent)
				}
			}
		}
	},1000)
}
function closepanel(event){
	if(event.target.className=='UIPanel'){
		event.target.parentNode.removeChild(event.target)
	}
	if(event.target.tagName=='IMG'){
		var target=event.target.parentNode.parentNode.parentNode.parentNode
		target.parentNode.removeChild(target)
	}
	if(event.target.classList.contains('closeIcon')){
		var target=event.target.parentNode.parentNode.parentNode
		target.parentNode.removeChild(target)
	}
}

//User link that lists posts made by you
function userlink(board){
	if(board==undefined){
		var menu=element('div',document.body,{
			class:'UIPanel',
			id:'userlink'
		})
		if(activepage=='catalog'){
			var closebutton='<span class="icon closeIcon" title="Close"></span>'
		}else{
			if(unsafeWindow.Main){
				var iconurl=unsafeWindow.Main.icons.cross
			}else{
				var iconurl='//s.4cdn.org/image/buttons/futaba/cross.png'
			}
			var closebutton='<span><img alt="Close" title="Close" class="pointer" src="'+iconurl+'"></span>'
		}
		menu.innerHTML='<div class="extPanel reply" style="width:500px;margin-left:-250px;height:500px;max-height:100%"><div class="panelHeader">Posts made by you\
'+closebutton+'</div>\
<select id="userlinkselect"></select><div id="userlinkposts" style="text-align:center"></div><br><style id="userlinkstyle"></style></div>'
		menu.onclick=closepanel
		var userlinkselect=document.getElementById('userlinkselect')
		var userlinkposts=document.getElementById('userlinkposts')
		document.getElementById('userlinkselect').onchange=function(event){
			userlink(event.target.value)
		}
		var userlinkboards={}
		element('option',userlinkselect,{
			value:''
		},'All')
		for(var i in localStorage){
			var match=i.match(/^4chan-track-(\w+)-(\d+)$/)
			if(match){
				var thread=JSON.parse(localStorage[i])
				for(var j in thread){
					if(!userlinkboards[match[1]]){
						userlinkboards[match[1]]=[]
					}
					userlinkboards[match[1]].push([match[2]*1,j.substr(2)*1])
				}
			}
		}
		Object.keys(userlinkboards).sort().forEach(function(board){
			if(board=='s4s'){
				var boardname='[s4s]'
			}else{
				var boardname='/'+board+'/'
			}
			var option=element('option',userlinkselect,{
				value:board
			},boardname)
			var divparent=element('div',userlinkposts,{
				id:'userlink-'+board
			})
			element('br',divparent)
			element('b',divparent,0,boardname)
			var linkparent=element('ul',divparent)
			userlinkboards[board]=userlinkboards[board].sort(function(a,b){
				return a[1]>b[1]?1:-1
			})
			userlinkboards[board].forEach(function(post){
				if(board==currentboard){
					var text='>>'+post[1]
				}else{
					var text='>>>/'+board+'/'+post[1]
				}
				var li=element('li',linkparent)
				element('a',li,{
					href:'/'+board+'/thread/'+post[0]+'#p'+post[1]
				},text)
			})
		})
		userlinkselect.focus()
		if(userlinkboards[currentboard]){
			userlinkselect.value=currentboard
			userlink(currentboard)
		}
	}else{
		if(board){
			var style='#userlinkposts>:not(#userlink-'+board+'){display:none}'
		}else{
			var style=''
		}
		document.getElementById('userlinkstyle').innerHTML=style
	}
}

if(document.getElementsByTagName('meta').length){
	//Get settings
	var thesettings=localStorage['4chan-settings']
	if(thesettings){
		thesettings=JSON.parse(thesettings)
		if(thesettings.expandfiles==undefined){
			thesettings.expandfiles=true
			localStorage['4chan-settings']=JSON.stringify(thesettings)
		}
		if(thesettings.hidenavlinks==undefined){
			thesettings.hidenavlinks=true
			localStorage['4chan-settings']=JSON.stringify(thesettings)
		}
	}else{
		thesettings={}
		var fullreddit=GM_getValue('fullreddit')
		if(fullreddit){
			thesettings.fullreddit=fullreddit=='true'?1:0
		}
		thesettings.expandfiles=true
		thesettings.hidenavlinks=true
	}
	var homelinkimg,faviconimg,thecss
	longstrings()
	//Add CSS
	element('style',document.head,{
		id:'redditcss'
	},thecss)
	//Determine current page format, board name, and thread id
	if(document.body.classList.contains('is_index')){
		var activepage='index'
	}else if(document.getElementById('content')){
		var activepage='catalog'
	}else if(location.pathname.indexOf('/thread/')+1){
		var activepage='thread'
	}else{
		var activepage='main'
	}
	var currentboard=''
	var match=document.body.classList[0]
	if(match){
		match=match.match(/^board_(\w+)$/)
		if(match){
			var currentboard=match[1]
		}else if(activepage!='main'){
			match=location.pathname.match(/^\/(\w+)\//)
			if(match){
				var currentboard=match[1]
			}
		}
	}
	// Blue bar
	if(thesettings.listcatalog){
		var catalog='catalog'
	}else{
		var catalog=''
	}
	var bluebar=element('div',0,{
		id:'bluebar'
	})
	document.body.insertBefore(bluebar,document.body.firstChild)
	var boardlist=element('div',0,{
		id:'boardlist'
	})
	//Board list
	var boardarray=[]
	if(location.pathname=='/'){
		//Home page board list
		var boardlinks=document.querySelectorAll('#boards .boxcontent a')
		for(var i=0;i<boardlinks.length;i++){
			boardarray.push(boardlinks[i].href.match(/(\w+)\/$/)[1])
		}
	}else{
		//If this is empty there will be no boards at all
		var boardlinks=document.querySelectorAll('#boardNavDesktop>.boardList>a')
		for(var i=0;i<boardlinks.length;i++){
			boardarray.push(boardlinks[i].innerHTML)
		}
	}
	if(thesettings.customMenu&&thesettings.customMenuList){
		//Use boards from custom menu setting
		var customarray=thesettings.customMenuList.replace(/[^a-z\d]+/gi,' ').trim().split(/\s+/)
		if(customarray.length){
			boardarray.push(null)
			boardarray=boardarray.concat(customarray)
		}
	}
	var boardnodes=[]
	var boardlast=''
	for(var i in boardarray){
		if(boardarray[i]==null){
			boardlast=boardnodes.join(' - ')
			boardnodes=[]
		}else{
			var linkclass=boardarray[i]==currentboard?' class="currentboard"':''
			boardnodes.push('<a href="/'+boardarray[i]+'/'+catalog+'"'+linkclass+'>'+boardarray[i]+'</a>')
		}
	}
	var front=location.pathname=='/'?' class="currentboard"':''
	boardlist.innerHTML='<a href="/"'+front+'>front</a> - <a href="/#recent-threads">all</a> - <a id="randomboardlink">random</a> | '+boardnodes.join(' - ')
	if(boardlast){
		boardlist.appendChild(document.createTextNode(' | '))
		element('a',boardlist,0,'[...]').onclick=function(event){
			event.target.parentNode.removeChild(event.target)
			showallboards.style.display='inline'
		}
		var showallboards=element('span',boardlist,{
			style:'display:none'
		},boardlast)
	}
	document.body.insertBefore(boardlist,bluebar)
	document.getElementById('randomboardlink').addEventListener('click',function(){
		location='/'+boardarray[Math.random()*boardarray.length|0]+'/'+catalog
	})
	//Logo that links to home page
	var homelink=element('a',bluebar,{
		id:'bluebar-logo',
		href:'/'
	})
	element('img',homelink,{
		src:homelinkimg
	})
	if(currentboard){
		element('a',bluebar,{
			id:'bluebar-return',
			href:'/'+currentboard+'/'
		},currentboard)
	}
	if(activepage=='thread'){
		var newcontent='comments'
	}else{
		var newcontent='new'
	}
	if(activepage=='catalog'){
		var newclass='bluebar-inactive'
		var catalogclass='bluebar-active'
		var newhref='/'+currentboard+'/'
	}else{
		var newclass='bluebar-active'
		var catalogclass='bluebar-inactive'
		var newhref=location.pathname
	}
	//Either new or comments tab
	element('a',bluebar,{
		class:newclass,
		href:newhref
	},newcontent)
	//Catalog tab
	if(currentboard){
		element('a',bluebar,{
			class:catalogclass,
			href:'/'+currentboard+'/catalog'
		},'catalog')
	}
	
	if(thesettings.fullreddit){
		//Change favicon
		document.querySelector('[rel="shortcut icon"]').setAttribute('href',faviconimg)
	}
	
	if(activepage!='main'){
		//Paste fortune into traditional post form
		if(thesettings.autofortune&&currentboard=='s4s'){
			var forms=document.getElementsByName('email')
			for(var i=0;i<forms.length;i++){
				forms[i].value='fortune'
			}
		}
		//File form will only accept these media types
		var fileaccept='image/x-png,image/gif,image/jpeg,video/webm,application/pdf,application/vnd.adobe.flash-movie'
		var forms=document.getElementsByName('upfile')
		for(var i=0;i<forms.length;i++){
			forms[i].accept=fileaccept
		}
		//User bar
		var user=element('div',bluebar,{
			id:'bluebar-user'
		})
		var myname=''
		var cookies=document.cookie.split('; ')
		for(var i in cookies){
			var value=cookies[i].split('=')
			if(value[0]=='4chan_name'){
				myname=value[1]
				break
			}
		}
		if(!myname){
			myname='Anonymous'
		}
		element('a',user,0,myname).onclick=function(){
			userlink()
		}
		//Settings link
		var settingslink=document.getElementById('settingsWindowLink')
		if(unsafeWindow.SettingsMenu||settingslink){
			user.appendChild(document.createTextNode(' | '))
			var preferences=element('a',user,0,'preferences')
			if(unsafeWindow.SettingsMenu){
				preferences.onclick=unsafeWindow.SettingsMenu.toggle
			}else{
				preferences.onclick=function(){
					settingslink.click()
				}
			}
		}
	}
	var postcount
	var opname
	var replycache=[0,[]]
	if(activepage=='thread'){
		if(thesettings.hidenavlinks){
			var links=document.querySelectorAll('.navLinksBot>a:nth-of-type(-1n+3)')
			for(var i=links.length;i--;){
				links[i].parentNode.removeChild(links[i])
			}
		}
		var navchilds=document.getElementsByClassName('navLinksBot')[0].childNodes
		for(var i=navchilds.length;i--;){
			if(navchilds[i].nodeType==3){
				navchilds[i].parentNode.removeChild(navchilds[i])
			}
		}
		postcount=element('div',document.querySelector('.post.op'),{
			class:'postcount'
		})
		var repliesnumber=document.querySelectorAll('.thread .replyContainer').length
		if(repliesnumber){
			postcount.innerHTML='all '+repliesnumber+' comments'
		}else{
			postcount.innerHTML='no comments (yet)<div>there doesn\'t seem to be anything here</div>'
			postcount.style.marginBottom='30px'
		}
	}
	if(activepage=='index'||activepage=='thread'){
		var opcontainers=document.querySelectorAll('.opContainer')
		for(var opnum=0;opnum<opcontainers.length;opnum++){
			var postinfo=opcontainers[opnum].querySelector(':scope .postInfo.desktop')
			var newdiv=element('div')
			newdiv.appendChild(postinfo.getElementsByTagName('input')[0])
			var subject=postinfo.getElementsByClassName('subject')[0]
			newdiv.appendChild(postinfo.getElementsByClassName('subject')[0])
			if(!subject.innerHTML){
				var body=opcontainers[opnum].getElementsByTagName('blockquote')[0]
				subject.innerHTML=body.innerHTML.replace(/<br>/g,' ')
				var fortune=subject.getElementsByClassName('fortune')[0]
				if(fortune){
					fortune.parentNode.removeChild(fortune)
				}
				var spoilers=opcontainers[opnum].querySelectorAll(':scope .subject>s')
				for(var i=0;i<spoilers.length;i++){
					spoilers[i].innerHTML=spoilers[i].innerHTML.replace(/<\/?s>/g,'').replace(/&amp;|&[lg]t;|[^\s]/g,'?')
				}
				if(subject.textContent.length>50){
					var text=subject.textContent.slice(0,50).replace(/\W+\w+$/,'')
				}else{
					var text=subject.textContent
				}
				subject.innerHTML=''
				subject.appendChild(document.createTextNode(text))
				if(body.innerHTML==text){
					body.style.display='none'
				}
			}
			var replylink=opcontainers[opnum].getElementsByClassName('replylink')[0]
			var threadurl=replylink?replylink.href:location.pathname
			subject.innerHTML='<a href="'+threadurl+'">'+subject.innerHTML+'</a>'
			postinfo.insertBefore(postinfo.getElementsByClassName('nameBlock')[0],postinfo.firstChild)
			postinfo.insertBefore(document.createTextNode(' by '),postinfo.firstChild)
			postinfo.insertBefore(postinfo.getElementsByClassName('dateTime')[0],postinfo.firstChild)
			postinfo.insertBefore(document.createTextNode('submitted '),postinfo.firstChild)
			var op=opcontainers[opnum].getElementsByClassName('op')[0]
			var optable=element('div',0,{
				id:'optable'
			})
			var file=op.getElementsByClassName('file')[0]
			if(file){
				var filetext=file.querySelector(':scope .fileText,:scope .file-info')
				if(filetext){
					postinfo.insertBefore(filetext,postinfo.firstChild)
				}
				optable.appendChild(file)
			}
			postinfo.insertBefore(newdiv,postinfo.firstChild)
			optable.appendChild(postinfo)
			op.insertBefore(optable,op.firstChild)
		}
	}
	if(activepage=='thread'){
		var nameblock=document.querySelector('.opContainer .nameBlock')
		var uid=nameblock.getElementsByClassName('posteruid')[0]
		if(uid){
			opname=uid.className
		}else{
			var opsname=nameblock.innerHTML.trim().replace(/<br>/g,'')
			var tempopsname=opsname
			if(opsname.indexOf('class="flag')+1){
				var newdiv=element('div',0,0,opsname)
				newdiv.removeChild(newdiv.getElementsByClassName('flag')[0])
				tempopsname=newdiv.innerHTML.trim()
			}
			if(tempopsname!='<span class="name">Anonymous</span>'){
				opname=opsname
			}
		}
	}
	if(activepage=='index'||activepage=='thread'){
		//Expand images
		if(thesettings.expandfiles){
			var expanddiv=element('div',document.body,{
				id:'imgexpand',
				style:'display:none'
			})
			expanddiv.onclick=function(event){
				if(!expandmode||event.target!=expandthis){
					expandthumb(event,1)
				}
			}
			var expandthis
			var expandmode=0
			var expandlist=[]
			var expandindex=-1
		}
		setInterval(function(){
			updateposts(0,1)
		},30000)
		updateposts()
		document.addEventListener('4chanParsingDone',updateposts)
		document.addEventListener('PostsInserted',updatepostsx)
		//Show Quick Reply
		if(unsafeWindow.Main){
			showqr()
		}else{
			document.addEventListener('4chanMainInit',showqr)
		}
		document.addEventListener('4chanSettingsSaved',function(){
			var thesettings=JSON.parse(localStorage['4chan-settings'])
			GM_setValue('fullreddit',thesettings.fullreddit+'')
		})
	}
}

function longstrings(){
if(thesettings.fullreddit){
homelinkimg='data:;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAoCAMAAAACNM4XAAAAhFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLy+fn58/Pz8AAAAAAADv7+////8PDw8AAAAAAAAAAAB/f38AAAAAAABvb2+Pj4+/v7+vr69PT08fHx/f399fX1/Pz8//on//cz//8+//f0//xK//RQD/uZ//UA//rY//Zy//il8EhIVuAAAAGHRSTlMADx9vv3+v/+8v////n9////9fz4//Tz8+qhQLAAADlUlEQVR4Ab2VbXejLhOHhwcdNKIIGhobk+5Tdv97f//vd5cJ0pC65/iiyfViZX8duGTwEPgM4/SvkAWDp1KiKkVV1rtGPtXLkFdCt9iZrufPFFsHgeeLtYDAUI/1c1ut4jZFIZ7q3Tt4OswXWrZKDqJ6ltJzAF9i/XKYpul1PPZt8Z5Uj/bvVd1LOY8nk5jOOLRzL9kjvVztzAHHzmS81XNnzvKRYnE0u34ynzjXXYePFNvjqX8Npm/fv5Hxx8/vv8KzOT9WzPF4Dp5fl8vldxj8vFz+hOcJjxIeiUVq9O938X9h8P19YAJHx2E7TGuWJ1VJiS0Eg1Xw2uG/l78/aOt/Lv+jZCxgO6ARdZ5IRAHgENGtm9XJrPKyWRw18lNSgMXR7FDAGuVhXTz7LxAXoZ8YtuAVDpDh+27Ne2jhS3dcfCqAsiFz80I9n+qRrpDef4U4nvG6mLk6KE/nvm9qnMm76y18iTh+1atiYEN/vTNP00TPqVF7uKOCCPeQ46t7secfYqDyFTHhZX9+PcV7+lCrgkHCK7QwIDrSa3ynFTczQ6D5h9iG7irNotjRRIlEy+/N+7ZpEJummXE+z2X0plclnQewGHGxQuMV1UYxKzE62quYJnKM2HtvP0/GdNM0vYXPrHYsExMtu3pbqZJ5uAZIkJi8ziGRxDCs75ip12YyiWZqijux0hbovekeFXi9p3wIfLgvF7GNJbzMxP86Y1ubW/HLeFK5WFWxr44iWp/TySlGgY7iljoTkFvEw5iJx9HMVSamqSwOAg5xoA4US89o3QoR90DwLWI5ZeLjzjT+VtxCYI+obkK57HvZsqQ4lbgNYn24FYdxnYlleoMiEo6QgryqvFl92CAWx7DLRD2dED6LB8zJ1vI0log6zdsgZuptHE0CzYteEWvMkNladqs4R/Rjk7xv80FxWG2184kKVlqtb1YvN4gp7hbxAdsKVsR7RIRICngcO6oSiMhiojaJgbt0yHWoXxEzRBSp3jIKBiAqpCr+cSta3CYG2yydVmxdDJpuEkIoLChACpi7ikEuJUxtEtOdNxmiQVR2VczDYtpzbyWtSoEqqsq2GMUew+zKW4WbxPLYmcNMp7zrOzP1+zUxHWr2+2TzzzxPtogxOM91F7xTsJeZOP3Pt3hl+cXeKyScXKrskrgkrv4tVnhHAQlWygoSVkspS8vSX235HghWyaWKiTJUQCXLUCXksCzjYeH/NjtPA1utKpIAAAAASUVORK5CYII='
faviconimg='data:;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEJ0lEQVR4AbWXfyydVxjH3ev2LpdGhExMMg0LwhiSpmYmRFo/E8nEX5amTCSqa9lMLNIskw1LEMGYf/z6YyFjs0mQiagIksWinUldNCLVNKj53bHhfvd90pfcEr3uvD7JJ7znnOd5XrnnPuewUYm79DP6LtXTi/QXV1fXLf5spa/Rc+N1+ie9Sb+nRvqoqKgIQl5eHvh8i54bH9FCak5ZfX09hPLycvA5n54bnTSImuNmMBiMUVFR0Ov1D/jsRM+Fi/ThCXM6eolqqWro6Hv0Dv2W/kpnaRW9SS+rWTCU3qZX6Bu03NHRcSElJQWVlZXo7e3F6OgoxJ6eHpSVlSE5ORn29vaPufYr6qTE3lZyWUV2ZGQkqqqq4O7ubqLPGxsbsb29DUtsbm6iuroaLi4u615eXibJIbkkJz0dzs7Of0mx0tJSxMXFYW1tDdaysLCAsLAwNDc3Q3Ix5wq1OeqxAaJhA9kcGRlBSEgIdnZ2cMgf94BPw4HmL3AMGfuEcw/6ccD6+joCAgJgNBohOSU3PRVf8/NGfz+TmfPxFeCaDaXzRhzyZEoZp7cuw5yWlhYpDslJT41Gp9M93tvbw0vUZr8o8qE78PcmDtne4tilF3M1d2DO4uKiFL9PNfT0aLXah8c2nckEPLoPPF/HMTgmc7LGnPn5eTDdPWo1de3t7TgrNTU1YK4vqdW85enpubW0tARzGhoaMDg4iKPImPR/c+bm5uTr+Ew5sP4XH3AX/zM1NYUDJicnER8fD19fX8TExECU32VM5g4YGxuDh4eHHMcR9EyE8WCZzs3NxfT0NA6Q/TE7Oyu+1KDGx8eRmZkJbmI5hN6hqqCnd21tbU1BQUHIyMhARUUFmpqaIEobTktLg7+/PzQazZ7Sfm2parzt4ODwTIqvrKygr68PtbW1kEtHcXEx6urqMDAwgI2NDbi5uYE95AljPKk68C//ra2tDdHR0bBEYGAgurq6wLBeqgr+sbGxmJiYQFJSEiwh/X95eRmhoaFg7Jv0zCQXFBRA+nliYiIsIefH6uoqsrKywNir9MwkZGdn4+nTp4iIiIAl/Pz8sLu7i9TUVDD2fVVuvfye/yvngo+PD16FiW3Y29sb8gJyh2CsPVWF70pKShAcHPzKu8HMzAxko+bn54Mx31DVMNAf2ZDQ3d2Nk2ArliuZFG+iF6jqpKSnp+MkEhISpPg1ei5cpVV2dnb7Rw8oQdo0+8U215TRcKoqOfLZdnZ2orCwENevX4c5+/v7kF4ht+WOjg6Eh4ebGJNKz4SWXqAGXk5mpP0ODw9jaGgI0u1ycnIg7Ve8ceMG5OYr86K8KON+pwYlh5Zahcbsv1wnWkhb6Q+0nf5EO+jPih3KWLuyppV+Tp2UHHolp9VoqE5JYFCSOVBHJbmzopMy5qCsMSgxOkuF/wPG+KMUMQiaLQAAAABJRU5ErkJggg=='
}else{
homelinkimg='data:;base64,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'
}
thecss='\
/* Hide a lot of stuff */\
#ctrl-top,.boardBanner,body>.center,#delform>.center,#content>.center,hr,#blotter,#boardNavDesktopFoot,.stylechanger,#styleSwitcher,\
.cataloglink,#qf-clear,#content .navLinks,#content #settings>:nth-child(3),#op+.navLinks,.rules,#boardNavDesktop,.ad-plea,\
#qf-ctrl.active::after,#quote-preview .postcount,h1.qr-link-container+#togglePostFormLink{\
	display:none!important;\
}\
#qf-ctrl,#ctrl>#settings>:nth-child(5),#hidden-label,#togglePostForm,#togglePostFormLink,.hasrelative,.navLinksBot{\
	color:transparent!important;\
	font-size:0!important;\
}\
.is_index .board>hr{\
	display:block!important;\
}\
body{\
	font-family:verdana,arial,helvetica,arial unicode ms,symbola,sans-serif!important;\
	background:#fff;\
	min-height:100%;\
	margin:0!important;\
	padding:0;\
	color:#000;\
}\
/* Highlight dubs */\
.postNum [href$="00"]+a,\
.postNum [href$="11"]+a,.postNum [href$="22"]+a,.postNum [href$="33"]+a,\
.postNum [href$="44"]+a,.postNum [href$="55"]+a,.postNum [href$="66"]+a,\
.postNum [href$="77"]+a,.postNum [href$="88"]+a,.postNum [href$="99"]+a{\
	background:#ffa500;\
}\
#content [data-id$="00"],\
#content [data-id$="11"],#content [data-id$="22"],#content [data-id$="33"],\
#content [data-id$="44"],#content [data-id$="55"],#content [data-id$="66"],\
#content [data-id$="77"],#content [data-id$="88"],#content [data-id$="99"]{\
	outline:2px solid #ffa500;\
}\
/* Index page list */\
.pagelist{\
	background:none!important;\
	border:0!important;\
	clear:both;\
	white-space:nowrap;\
}\
.pagelist::before{\
	content:"view more:";\
	color:#808080;\
	font-size:12px;\
	float:left;\
}\
.prev input,.next input,.depagelink{\
	content:"next \\203A";\
	padding:1px 4px;\
	background:#eee;\
	border:1px solid #ddd;\
	border-radius:3px;\
	font-weight:bold;\
	color:#369!important;\
	cursor:pointer;\
	text-transform:lowercase;\
	font-size:12px;\
}\
.prev input:hover,.next input:hover{\
	background:#f0f0f0;\
	border:1px solid #82a6c9;\
}\
.prev input:active,.next input:active{\
	background:#e4e4e4;\
}\
/* Catalog */\
#search-cnt,#qf-cnt{\
	display:block!important;\
}\
#index-search,#search-box,#qf-box{\
	position:absolute;\
	display:block;\
	top:100px;\
	right:0;\
	border:1px solid #808080!important;\
	font-size:18px;\
	width:295px!important;\
	height:23px;\
	padding:2px;\
	background:none;\
	z-index:1;\
	box-sizing:content-box!important;\
}\
#index-search{\
	background:#fff!important;\
}\
#search-cnt::after,#qf-cnt::after{\
	content:"";\
	display:block;\
	position:absolute;\
	top:101px;\
	right:6px;\
	width:295px;\
	height:23px;\
	background:#fff;\
}\
#search-box:focus,#qf-box:focus{\
	background:#fff;\
}\
#content #settings{\
	float:none;\
	text-align:left;\
	margin:50px 0 0 70px;\
}\
#post-preview{\
	background:#fff;\
	color:#000;\
	border-radius:0;\
}\
#post-preview .post-last{\
	color:#888;\
}\
#post-preview .post-author{\
	color:#369;\
}\
#qf-ctrl::after{\
	content:"search 4chan";\
	display:block;\
	position:absolute;\
	top:100px;\
	right:5px;\
	width:301px;\
	height:29px;\
	z-index:2;\
	color:#a9a9a9;\
	font-size:18px;\
	padding:2px;\
	box-sizing:border-box;\
}\
#ctrl>#settings>:nth-child(5)>span{\
	cursor:text;\
}\
#ctrl>#info{\
	float:none;\
}\
#togglePostFormLink>a{\
	text-decoration:none;\
	display:block;\
	width:298px;\
	height:20px;\
	text-align:center;\
	padding:4px 0;\
	border:1px solid #c4dbf1;\
	background:#f0f6fd;\
	background:linear-gradient(to bottom,#fff,#ecf5fe);\
	border-top-right-radius:30px 15px;\
	border-bottom-right-radius:30px 15px;\
	margin:10px auto;\
}\
#togglePostFormLink>a::after{\
	content:"Submit a new text post";\
	font-size:15px;\
	font-family:verdana,arial,helvetica,arial unicode ms,symbola,sans-serif;\
	font-weight:bold;\
	color:#369;\
}\
#togglePostFormLink>a:hover{\
	border-color:#879eb4;\
	background:#a9c5df;\
	background:linear-gradient(to bottom,#ccdff1,#aec9e1 50%,#a5c2dd 51%,#6da1d2);\
}\
#togglePostFormLink>a:hover::after{\
	color:#fff!important;\
}\
/*Name, subject, etc. tabs on index and catalog*/\
.postForm>tbody>tr>td:first-child{\
	border:0!important;\
	color:#000!important;\
	background:none!important;\
	text-align:right;\
	font-size:10px!important;\
}\
/*Comment box on index and catalog*/\
tr[data-type="Comment"] textarea{\
	width:500px;\
	height:100px;\
}\
/*Post block*/\
#postForm{\
	margin-left:20px;\
}\
.post.op .file-info{\
	display:block;\
}\
.navLinks a,.fileText a,.file-info a{\
	color:#000!important;\
	text-decoration:underline;\
}\
.postContainer{\
	clear:both;\
	font-size:13px;\
}\
.post.reply{\
	border-color:transparent!important;\
	background:none!important;\
	min-width:400px;\
}\
blockquote{\
	word-wrap:break-word;\
	padding:5px;\
	font-size:14px;\
	margin:0;\
	min-height:1em;\
}\
.post.reply:target blockquote,.highlight blockquote{\
	background:#ffc!important;\
}\
.name{\
	color:#369!important;\
}\
.postInfo,.postNum a,.file,.postMenuBtn{\
	font-size:10px!important;\
	color:#888!important;\
}\
s:focus,s:focus *{\
	color:#fff;\
	outline:0;\
}\
.opContainer blockquote{\
	background-color:#fafafa;\
	border:1px solid #369;\
	border-radius:7px;\
	padding:7px 10px;\
	margin:5px 0 0 51px;\
	max-width:60em;\
}\
.opContainer .file,.opContainer .fileThumb,.opContainer .fileThumb img{\
	float:none!important;\
	display:inline-block!important;\
}\
/* Make space for quick reply window */\
.qropened .board{\
	margin-right:307px;\
}\
@media (max-width:1000px){\
	.board{\
		margin-right:0!important;\
	}\
}\
/* Quick reply comment height */\
#quickReply textarea{\
	min-height:150px;\
}\
/*Disclaimer at the very bottom*/\
#absbot,div#absbot a:not(:hover),#absbot a:hover{\
	color:#808080!important;\
	font-size:10px;\
}\
/*Top line*/\
.sideArrows{\
	width:15px;\
	height:30px;\
	color:transparent!important;\
	cursor:default;\
	background-position:-71px 0px;\
	margin:10px 6px 0 15px!important;\
}\
.navLinks{\
	clear:both;\
}\
.replyContainer{\
}\
.passNotice{\
	color:#888;\
}\
#header{\
	position:absolute!important;\
	top:-20px!important;\
}\
.thread-stats{\
	position:fixed;\
	top:100px;\
	right:5px;\
}\
.thread-stats>.ts-replies::before{\
	content:"Comments: ";\
}\
.thread-stats>.ts-images::before{\
	content:"Files: ";\
}\
.thread-stats>.ts-ips::before{\
	content:"Posters: ";\
}\
.thread-stats>.ts-page::before{\
	content:"Page ";\
}\
.navLinksBot{\
	margin-left:20px;\
}\
#quote-preview{\
	background:#fff!important;\
	border:1px solid #ccc!important;\
}\
.postbump .postNum::after{\
	content:" BUMP";\
	color:#f00;\
}\
.post:not(#quote-preview) s b{\
	opacity:0\
}\
.post:not(#quote-preview) s:hover b{\
	opacity:1;\
	text-shadow:0 0 3px #fff;\
}\
/* Expand images */\
#imgexpand{\
	position:fixed;\
	top:0;\
	left:0;\
	width:100%;\
	height:100%;\
	background:rgba(0,0,0,.5);\
	cursor:pointer;\
	z-index:2;\
}\
#imgexpand *{\
	position:fixed;\
	top:0;\
	left:0;\
	right:0;\
	bottom:0;\
	max-width:100%;\
	max-height:100%;\
	margin:auto;\
}\
#imgexpand img{\
	background:url(data:image/gif;base64,R0lGODlhEAAQAPABAOfn5////yH5BAAKAAAALAAAAAAQABAAAAIfhG+hq4jM3IFLJhoswNly/XkcBpIiVaInlLJr9FZWAQA7);\
}\
#imgexpand video{\
	background:#000;\
	cursor:default;\
}\
/* Blue bar */\
#bluebar{\
	border-bottom:1px solid #5f99cf;\
	background-color:#cee3f8;\
	margin:0;\
	text-align:left;\
	position:relative;\
}\
#bluebar-logo{\
	display:inline-block;\
	margin:2px 5px 0 0;\
	height:40px;\
}\
#bluebar-return{\
	color:#000;\
	text-decoration:none;\
	font-weight:bold;\
	font-variant:small-caps;\
	font-size:14px;\
	margin-right:7px;\
}\
#bluebar-return:hover{\
	text-decoration:underline;\
}\
.bluebar-active,.bluebar-inactive{\
	font-weight:bold;\
	margin:0 3px 1px 3px;\
	padding:2px 6px 0 6px;\
	font-size:12px;\
	text-decoration:none;\
}\
.bluebar-active,.bluebar-active:hover{\
	color:#ff4500!important;\
	background:#fff;\
	border:1px solid #5f99cf;\
	border-bottom:1px solid #fff;\
}\
.bluebar-inactive,.bluebar-inactive:hover{\
	color:#369!important;\
	background:#eff7ff;\
}\
#bluebar-user{\
	position:absolute;\
	right:0;\
	bottom:0;\
	background-color:#eff7ff;\
	padding:4px;\
	border-top-left-radius:7px;\
	font-size:10px;\
	color:gray;\
	cursor:default;\
}\
#bluebar-user a{\
	cursor:pointer;\
	color:#369;\
}\
#bluebar-user a:hover{\
	color:#369!important;\
	text-decoration:underline;\
}\
#boardlist{\
	background-color:#f0f0f0;\
	white-space:nowrap;\
	text-transform:uppercase;\
	border-bottom:1px solid #808080;\
	height:18px;\
	min-height:18px;\
	line-height:18px;\
	overflow:hidden;\
	cursor:default;\
	margin-top:0;\
	padding-left:5px;\
	color:#808080;\
	font-size:9px;\
	text-align:left;\
	transition:height .5s;\
}\
#boardlist:hover{\
	white-space:normal;\
	height:auto;\
}\
#boardlist a{\
	color:#000;\
	font-size:9px;\
	text-decoration:none;\
	cursor:pointer;\
}\
#boardlist a:hover{\
	text-decoration:underline;\
}\
#boardlist a.currentboard{\
	color:#ff4500;\
	font-weight:bold;\
}\
/*Settings*/\
.fPattern,.fBoards{\
	padding:1px!important;\
	font-size:11px!important;\
}\
#wr-body>div{\
	text-align:center;\
}\
#wr-add{\
	float:left;\
}\
.highlighttext{\
	background:#99f;\
	color:#ff3;\
}\
.postcount{\
	font-size:16px;\
	padding:10px 0 3px 0;\
	margin:10px 10px 0 15px;\
	border-bottom:1px dotted gray;\
	width:calc(100% - 25px);\
	clear:left;\
}\
.postcount div{\
	color:red;\
	font-size:13px;\
	position:absolute;\
	margin:14px 0 0 -10px;\
}\
.opContainer .postInfo.desktop .name{\
	font-weight:normal!important;\
}\
.subject a{\
	color:blue!important;\
	font-size:16px;\
	font-weight:normal;\
}\
.subject a:hover{\
	color:blue!important;\
}\
#optable{\
	display:table-row;\
}\
#optable>*{\
	display:table-cell!important;\
	vertical-align:bottom;\
}\
/* Images */\
.sideArrows,#content .nofile,#content .imgdel,.is_index .fileDeletedRes{\
	background-repeat:no-repeat;\
background-image:url("data:;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAAAyCAMAAADx7dyJAAAA3lBMVEUAAAC3t7e3t7cAAAAAAAAAAAC8vLy4uLi4uLgAAAAAAAAAAAAAAAAAAAAAAAAAAAC+vr69vb0AAAAAAAAAAAAAAADBwcHAwMAAAAC2tram0fqm0fqm0fqm0foAAACm0fqm0fqm0frKysrKysrOzs7CwsLOzs7T09PHx8fIyMjU1NTU1NTY2NjNzc3Y2Njb29vb29vc3Nzc3Nym0fr/RQD/RQD/RQD/RQD/RQD/RQD/RQCm0fr/RQD/RQD/RQD/RQD/RQD/RQCm0fqm0fr/RQD/RQD/RQD/RQCm0fqm0friiswmAAAASnRSTlMA/wATJhz//wBDMA5NPjkE//80SCEJ//8Y/x9/XwArP/+//wD//wD/////AP//AP8A/wAvKj8aAAo1D+8vVR8FSk9PrzpFJRVvDxwuszYAAANySURBVHgBrdcLV9s2H8fxnyuJVNJfErGszpQh0pZeHnqhF1iALS3sxvb+39AsYh07BBySPJ9wkmPD+WLLWBb4/yqezOHJYzHOxcrqzujpLTwdxKUSGokiY8k4DBntFuPiMUcrbenJlxUTxIAgy8Hqs6IofipWZzVpQFdKEik0ahoagaa613RHKweBS8wFw9HQxNB5vr+///NBVuzu7e0VzWt3tCprIlpWoSEIPYeTyeRFro7GRZGqjXExPAiBNFo1VQDz8aFssTtuFMVovNu8isFs5ZGhIi+pdMvZnpfjnZ2XrxK8GmAUOkFUGhjMHr1+/ezoTYI3D3NUY8By9u27d/87fp/g/cOEx3rZDx8/Hn34lODTvVjNOZeS84q5x2dPjo/fnnxO8HmJ5paIrLW8tFYSSVU/Mvvl5OTky9cEXzOn0XCVJBlrB2SMW/IxoOHYcLaD9rOWRKRc5b3S6Mu/S7n2R4Ds28osJ8WC8ETc4V5CeipZaD4CkK0ahEAVAOaNxkNcpJg+ZLmQ3R+6ZFwCEKQwd3p29ss0O784u7icNubfr8kh+zVlB/7AbAS0z9XfZo3vbfXHVbNxfT7vcsARQ/YiZQduB1UCxqI1S67a7PdZcjpNKtLQpPvZ34duXkGh+VrIXrfZ05xNrAWXQPbHZHI4ONUYYxSyqxT6s81eznpDwohTBWT7KTs0MWrTO7fL69nsrx/T1t9N9SJvSOJYyD4fnsYZoefmZto5vzmfZqVCzz+TycHwQ6fLDuL2zt170OkekWtno8XiM/Kg554HuqaATgi4n+FrLj98hY7tb/UEqtH59/Dw8NtB3/JiKUqHDNqTjIItTeFKrpgYl5Z2zkd0HJfU4FigSaw13yaCBPoCu3u0zlusl00UCQwJxrj1srkbFzvRqoCs9qm6CeEN6183GSW1O4Ki0mFDwZKt0bLGAaVso7LGFpgkGdltitj8XVeGiIzDNnyMhsgorgiJIfKqJm626jIKgKt56anNKp3eefAcm+MGtxTFMgBol7ilAvcOG7MRKWZ8jcQZkydE5wU2RqK3YJDWe51PAqrERvI5Cypde7NWLq/xAeG3uGIABMet6F1/P6Otspmgqre/PZOts7VXd/YT2z7LqatufbT5vxBmiCPbfmyhfO1YlGQ17mYriY05S0QmaiyqCTAKj/YfMfq5TiasXK8AAAAASUVORK5CYII=");\
}\
/*User link on catalog*/\
.UIPanel{\
	line-height:14px;\
	font-size:14px;\
	background-color:rgba(0,0,0,0.25);\
	position:fixed;\
	width:100%;\
	height:100%;\
	z-index:9002;\
	top:0;\
	left:0;\
}\
.UIPanel::after{\
	display:inline-block;\
	height:100%;\
	vertical-align:middle;\
	content:"";\
}\
.UIPanel>div{\
	-moz-box-sizing:border-box;\
	box-sizing:border-box;\
	display:inline-block;\
	height:auto;\
	max-height:100%;\
	position:relative;\
	width:400px;\
	left:50%;\
	margin-left:-200px;\
	overflow:auto;\
	box-shadow:0 0 5px rgba(0,0,0,0.25);\
	vertical-align:middle;\
	padding:2px;\
}\
#userlink ul{\
	-moz-column-width:140px;\
	-webkit-column-width:140px;\
	column-width:140px;\
}\
.nameBlock{\
	color:#369;\
	cursor:pointer;\
}\
.nameBlock:hover{\
	text-decoration:underline;\
}\
.submitterlink,.submitterlink .name{\
	color:#0055df!important;\
}\
.yourlink,.yourlink .name{\
	color:#000!important;\
}\
/*Compatibility with upboats*/\
.opContainer .cnt{\
	float:left;\
	width:50px;\
	margin-top:5px;\
}\
.replyContainer .nmb{\
	width:31px;\
}\
.opContainer .nmb{\
	width:51px;\
}\
.nmb{\
	margin-top:5px;\
}\
.extPanel{\
	background-color:#f0e0d6;\
	border:1px solid #d9bfb7;\
	border-left:none;\
	border-top:none;\
}\
body[style^="margin-top: 20%"]>h1{\
	margin-top:20%;\
}\
.navLinksBot>*{\
	color:#000;\
	font-size:13px;\
}\
.navLinksBot>a,.navLinksBot>label{\
	margin-right:5px;\
}\
.filenamestamp a{\
	text-decoration:none;\
	border-bottom:1px dashed;\
}\
.filenamestamp::after{\
	display:block;\
	position:absolute;\
	content:attr(data-timestamp);\
	color:#444;\
	background:#fff;\
	border:1px solid #767676;\
	font:13px segoe ui;\
	padding:1px 5px 2px 5px;\
	box-shadow:4px 4px 2px -2px rgba(0, 0, 0, 0.5);\
	pointer-events:none;\
	opacity:0;\
	margin:15px 0 0 50px;\
}\
.filenamestamp:hover::after{\
	opacity:1;\
	transition:opacity .2s .5s;\
}\
.hasrelative::after{\
	content:attr(data-relative);\
	font-size:10px;\
	color:#888;\
}\
.threadContainer{\
	border-left:1px dotted #ddf!important;\
}\
#index-mode,#index-sort,#index-size,.is_index .navLinks>.brackets-wrap{\
	float:left!important;\
	margin:50px 0 30px 0;\
}\
.is_index .navLinks>.brackets-wrap:first-child{\
	margin-left:70px;\
}\
.is_index .board{\
	clear:both;\
}\
'.replace(/\s+/g,' ').replace(/\/\*((?!\*\/).)*\*\//g,'').replace(/;? ?} ?/g,'}').replace(/ ?([{,;]) ?/g,'$1')
}