diff --git a/src/app/activity-page.js b/src/app/activity-page.js
index d16730e..2b22dff 100644
--- a/src/app/activity-page.js
+++ b/src/app/activity-page.js
@@ -4,17 +4,17 @@ import Page from './page';
import RecentTorrents from './recent-torrents'
export default class ActivityPage extends Page {
- constructor(props) {
- super(props)
- this.setTitle('Rats On The Boat - Content Search Engine');
- }
- render() {
- return (
-
{
checkNotModal
- &&
-
+ &&
+
}
diff --git a/src/app/bad-words.js b/src/app/bad-words.js
index 322069f..641fd34 100644
--- a/src/app/bad-words.js
+++ b/src/app/bad-words.js
@@ -1,259 +1,259 @@
const XXX_BLOCK_WORDS = ['incestcash', 'asacp', 'xondemand', 'yankscash', 'klixxx', 'cybersitter', 'safesurf',
-'surfwatch', 'netcash', 'watersport', 'fuck', 'threesome', 'tits',
-'masturbating', 'incest', 'bestiality', 'analintercourse', 'analsex', 'animesex',
-'anitablonde', 'autosex', 'blackass', 'blackasses', 'boner', 'boobcruise',
-'boobies', 'bordello', 'braless', 'brothel', 'callgirl', 'callgirls',
-'clit', 'clitoris', 'clits', 'cums', 'cybererotic', 'cybererotica',
-'cybersex', 'cybersexx', 'ejaculation', 'erotica', 'eroticfilm', 'eroticfilms',
-'eroticism', 'eroticphoto', 'eroticphotography', 'eroticphotos', 'erotics', 'eroticsex',
-'eroticsexstories', 'eroticstories', 'eroticstory', 'erotik', 'erotika', 'antasysex',
-'gaysex', 'gruppensex', 'horny', 'jackoff', 'lesbo', 'lesbos',
-'makinglove', 'motherfucker', 'horsesex', 'dogsex', 'snakesex', 'sextracker',
-'tranny', 'bdsm', 'porn', 'beastality', 'bizarre', 'blowjob',
-'bondage', 'bondages', 'celebs', 'cum', 'cunt', 'transsexual',
-'transsexuals', 'cumbath', 'cumshot', 'dildo', 'dildos', 'transvestites',
-'transvestite', 'dominatrix', 'spank', 'dungeon', 'sexbilder', 'dungeons',
-'pussie', 'ebony', 'fisting', 'gayshop', 'facesitting', 'sexshop',
-'pussy', 'bukkake', 'escort', 'blowjobs', 'facial', 'facialized',
-'facials', 'fetish', 'footfetish', 'fuckingpussy', 'fucking', 'hardcore',
-'hentai', 'hustlerlatex', 'latex', 'lolita', 'lolitas', 'mlm',
-'oralsex', 'peepshow', 'peepshows', 'phonesex', 'pornstars', 'preteen',
-'preteens', 'pussies', 'shemale', 'shemales', 'sluts', 'whores',
-'whore', 'spanking', 'strapon', 'twinks', 'upskirts', 'voyeur',
-'whip', 'whipping', 'xxx', 'sexkey', 'femdom', 'gangbang',
-'gloryhole', 'adultbuffet', 'adultcartoons', 'adultchat', 'adultchatnetwork', 'adultdvd',
-'adultentertainment', 'adultentertainmenthouse', 'adulterotica', 'adultfilms', 'adultfree', 'adultfreepics',
-'adultfreepix', 'adultfun', 'adulthardcore', 'adultimages', 'adultjpeg', 'adultlink',
-'adultlinks', 'adultmovie', 'adultmovies', 'adultmpeg', 'adultmpegs', 'adultpass',
-'adultpersonals', 'adultphotos', 'adultpic', 'adultpics', 'adultpicture', 'adultpictures',
-'adultpix', 'adultporn', 'adultpornography', 'adultsearch', 'adultsex', 'adultsights',
-'adultsites', 'adultsonly', 'adultstars', 'adultstories', 'adultvideo', 'adultvideos',
-'adultweb', 'adultxxx', 'alt.sex', 'altsex', 'alt.sex.exhibitionism', 'alt.sex.pictures',
-'altsexst', 'alt.sex.stories', 'alt.sex.voyeurism', 'amateurerotica', 'amateurfotos', 'amateurhardcore',
-'amateurindex', 'amateurnaked', 'amateurnudes', 'amateurporn', 'amateurpussy', 'amateursex',
-'amateursxxx', 'amatuerhardcore', 'amatuersex', 'ampland', 'analaction', 'analcum',
-'analfuck', 'analfucking', 'analgallery', 'analingus', 'analpics', 'analpicture',
-'analsex', 'analsexpics', 'analsexpictures', 'analxxx', 'animalbeastiality', 'animehentai',
-'animeporno', 'animexxx', 'asiacarrera', 'assfuck', 'assfucking', 'asshole',
-'assholes', 'asslick', 'asspics', 'assworship', 'autofellatio', 'babepix',
-'badgirls', 'bakedchicks', 'baldcunt', 'baldpussies', 'baldpussy', 'barecelebs',
-'barenaked', 'barepussy', 'beastiality', 'beaverboy', 'beavershots', 'bigballs',
-'bigblackboobs', 'bigblackcocks', 'bigblackdicks', 'bigblacktits', 'bigboob', 'bigboobs',
-'bigbreast', 'bigbreastlovers', 'bigbreasts', 'bigbutt', 'bigbutts', 'bigclit',
-'bigclitoris', 'bigclits', 'bigcock', 'bigcocks', 'bigcunt', 'bigcunts',
-'bigdick', 'bigdicks', 'biggestboobs', 'biggestdick', 'biggesttit', 'biggesttits',
-'bighairyballs', 'bighardons', 'bighooters', 'bignipples', 'bigpussies', 'bigpussy',
-'bigtit', 'bigtits', 'bigtitties', 'bigtitts', 'bizarresex', 'bizarrexxx',
-'bizzaresex', 'blackbondage', 'blackboobs', 'blackbooty', 'blackbutt', 'blackcock',
-'blackcocks', 'blackcum', 'blackcunt', 'blackcunts', 'blackdick', 'blackdicks',
-'blackerotica', 'blackhardcore', 'blacknudes', 'blackonblondes', 'blackporn', 'blackporno',
-'blackpornography', 'blackpussy', 'blacksex', 'blacksluts', 'blacksonblondes', 'blacktit',
-'blacktits', 'blacktwat', 'blackxxx', 'blondepussy', 'blondsgay', 'bondagefree',
-'bondagegallery', 'bondagelinks', 'bondagepics', 'bondagepictures', 'bondagesex', 'bondagestories',
-'bondagestory', 'bukake', 'bustybabes', 'bustyblondes', 'bustyceleb', 'butt-fuck',
-'buttfuck', 'buttfucker', 'buttfuckers', 'buttfucking', 'buttholes', 'buttman',
-'buttpics', 'buttplug', 'buttthumbnails', 'cartoonporn', 'cartoonsex', 'cartoonsxxx',
-'cartoonxxx', 'celebritiesnaked', 'celebritiesnude', 'celebritiesxxx', 'celebritybush', 'celebritybutts',
-'celebritynude', 'celebritynudes', 'celebrityporn', 'celebritypussy', 'celebritysex', 'celebrityxxx',
-'celebsxxx', 'celebxxx', 'centerfolds', 'chaseylain', 'chatsex', 'cheerleadersxxx',
-'cheerleaderxxx', 'chickswithdicks', 'christycanyon', 'cicciolina', 'clitpics', 'clitpictures',
-'closeuppussy', 'comixxx', 'crotchless', 'cruisingforsex', 'cumbaths', 'cumcoveredcunts',
-'cumcunt', 'cumdrinker', 'cumdrinkers', 'cumdrinking', 'cumdrops', 'cumeater',
-'cumeaters', 'cumeating', 'cumface', 'cumfaces', 'cumfacial', 'cumfacials',
-'cumgallery', 'cumgargle', 'cumguzzlers', 'cumincunt', 'cumjunkies', 'cumlovers',
-'cummpeg', 'cumpic', 'cumpics', 'cumpicture', 'cumpictures', 'cumpussy',
-'cumsluts', 'cumsucker', 'cumsuckers', 'cumsucking', 'cumswallow', 'cumswallowers',
-'cumswallowing', 'cumtasting', 'cumthumbnails', 'cunilingus', 'cunnilingus', 'cuntcum',
-'cuntfuck', 'cuntfucking', 'cuntjuice', 'cuntlapper', 'cuntlick', 'cuntlickers',
-'cuntlicking', 'cuntpics', 'cuntpictures', 'cunts', 'cuntstories', 'cuntsuckers',
-'cuntz', 'cyberlust', 'cybernude', 'cyberporn', 'cyberpornlinks', 'cyberpornsexlinks',
-'cyberslut', 'd’amateur', 'danniashe', 'dicksex', 'dicksuckers', 'dicksucking',
-'digixxx', 'directporn', 'dirtypictures', 'dirtysex', 'doggiestyle', 'doggystyle',
-'domatrix', 'dominatrixes', 'downblouse', 'drinkingcum', 'drippingcunt', 'drippingcunts',
-'drippingpussy', 'easypic.com', 'eatcum', 'eatingcum', 'eatingpussy', 'eatpussy',
-'ebony+ayres', 'ebonyporn', 'ebonypussy', 'ebonysex', 'ebonyxxx', 'enormoustits',
-'erosvillage', 'eroticanime', 'eroticart', 'eroticas', 'eroticastories', 'eroticfiction',
-'eroticlesbianstories', 'eroticmovie', 'eroticmovies', 'erotico', 'eroticos', 'eroticpics',
-'eroticpicture', 'eroticpictures', 'eroticsites', 'eroticsounds', 'erotictales', 'erotictext',
-'eroticvideo', 'eroticvideos', 'eroticwomen', 'eroticwriting', 'erotikchat', 'erotique',
-'erotismo', 'escortservice', 'escortservices', 'eurosex', 'explicitsex', 'facecum',
-'facesit', 'facesitters', 'fastporn', 'fatass', 'fatsex', 'feetfetish',
-'feetsex', 'felatio', 'fellatio', 'fellations', 'fetishwear', 'fettegirls',
-'fingerbang', 'fingerfuck', 'flesh4free', 'footjobs', 'footlicking', 'footworship',
-'fornication', 'freeanal', 'freeanalsex', 'freeass', 'freebigboobs', 'freebigtit',
-'freebigtits', 'freeblackcunt', 'freeblackpussy', 'freeblowjob', 'freeblowjobs', 'freebondage',
-'freeboobs', 'freecum', 'freecumshot', 'freecumshots', 'freecunt', 'freecunts',
-'freedick', 'freeerotic', 'freeerotica', 'freeeroticstories', 'freefuck', 'freefucking',
-'freefuckpics', 'freegay', 'freegaypics', 'freehardcore', 'freehardcorepics', 'freehardcorepictures',
-'freehardcoreporn', 'freehardcoresex', 'freehardcoresexpics', 'freehentai', 'freehooters', 'freelargehooters',
-'freelesbian', 'freelesbianporn', 'freelesbiansex', 'freenakedpic', 'freenakedpics', 'freenakedpictures',
-'freenakedwomen', 'freenude', 'freenudecelebs', 'freenudephotos', 'freenudepics', 'freenudes',
-'freeporn', 'freepornmovies', 'freeporno', 'freepornography', 'freepornopics', 'freepornopictures',
-'freepornos', 'freepornpic', 'freepornpics', 'freepornpictures', 'freeporns', 'freepornsite',
-'freepornsites', 'freepussy', 'freepussypic', 'freepussypics', 'freepussypictures', 'freesex',
-'freesexchat', 'freesexmovies', 'freesexnet', 'freesexphotos', 'freesexpic', 'freesexpics',
-'freesexpicture', 'freesexpictures', 'freesexsites', 'freesexstories', 'freesexvideos', 'freesexycam',
-'freeshemale', 'freesmut', 'freetit', 'freetits', 'freevoyeur', 'freexxx',
-'freexxxmovie', 'freexxxmovies', 'freexxxmpeg', 'freexxxphotos', 'freexxxpic', 'freexxxpics',
-'freexxxpicture', 'freexxxpictures', 'freexxxstories', 'freexxxvideo', 'freexxxx', 'fuking',
-'gangbangs', 'gratishardcoregalerie', 'hardcorecelebs', 'hardcorefisting', 'hardcorefree', 'hardcorefucking',
-'hardcorehooters', 'hardcorejunkie', 'hardcorejunky', 'hardcoremovie', 'hardcoremovies', 'hardcorepic',
-'hardcorepics', 'hardcorepictures', 'hardcorepix', 'hardcoreporn', 'hardcoreporno', 'hardcorepornography',
-'hardcorepornos', 'hardcorepussy', 'hardcoresamples', 'hardcoresex', 'hardcoresexpictures', 'hardcorestories',
-'hardcorethumbnails', 'hardcorevideo', 'hardcorevideos', 'hardcorexxx', 'harddicks', 'hardnipples',
-'hardons', 'hardporn', 'indiasex', 'interacialhardcore', 'interacialsex', 'interacialxxx',
-'intercoursepositions', 'internetsex', 'interracialfucking', 'interracialhardcore', 'interracialporn', 'interracialpornography',
-'interracialsex', 'interracialsexstories', 'interracialxxx', 'intimatesex', 'ittybittytitty', 'japaneseporn',
-'japanesesex', 'japansex', 'japanxxx', 'jennacam.com', 'jennajameson', 'jennicam',
-'jerkoff', 'jism', 'jiz', 'jizz', 'juicycunts', 'juicypussy',
-'justhardcore', 'karasamateurs', 'karasxxx', 'kascha', 'kaylakleevage', 'kobetai',
-'koreasex', 'lapdance', 'largeclits', 'largecunts', 'largedicks', 'largehooters',
-'largepussy', 'largetit', 'largetits', 'latinapussy', 'latinasex', 'latinosex',
-'latinoxxx', 'latinxxx', 'legsex', 'lesbianerotica', 'lesbianhardcore', 'lesbianorgies',
-'lesbianorgy', 'lesbianpics', 'lesbianpink', 'lesbianporn', 'lesbian-porno', 'lesbianporno',
-'lesbianpornography', 'lesbianpornos', 'lesbianpussy', 'lesbiansex', 'lesbiansexpics', 'lesbiansexstories',
-'lesbianxxx', 'lickadick', 'lickingpussy', 'lindalovelace', 'lingeriexxx', 'literotica',
-'littleboobs', 'littlepussy', 'littletits', 'livefucking', 'liveporn', 'livesex',
-'livesexcam', 'livesexcams', 'longdicks', 'lovedoll', 'lovedolls', 'magazinessex',
-'makinglove', 'malaysex', 'malenudes', 'malesex', 'mangaporno', 'mangax',
-'mangaxxx', 'manpics', 'mansex', 'marilynchambers', 'massivecocks', 'masterbating',
-'masturbation', 'masturbationvideos', 'maturefucking', 'maturesex', 'maturexxx', 'megaboobs',
-'megaporno', 'megapussy', 'megatits', 'mensdicks', 'mensex', 'm.i.l.f.',
-'milf', 'milfhunterpic', 'milfmpegsample', 'modelsex', 'mondoporn', 'monstercocks',
-'monsterdicks', 'motherfucker', 'moviepost.com', 'mpegsex', 'mpegxxx', 'muffdiving',
-'myslutwife', 'nacktfotos', 'nakedbabes', 'nakedblackwomen', 'nakedcelebrity', 'nakedcelebs',
-'nakedcheerleader', 'nakedchicks', 'nakedgirls', 'nakedguys', 'nakedladies', 'nakedlady',
-'nakedman', 'nakedmen', 'nakedness', 'nakedphotographs', 'nakedphotography', 'nakedphotos',
-'nakedpic', 'nakedpics', 'nakedpicture', 'nakedpictures', 'nakedpussy', 'nakedstars',
-'nakedwife', 'nakedwoman', 'nakedwomen', 'nastychat', 'nastypussy', 'nastysex',
-'nastythumbs', 'naturaltits', 'naughty.com', 'naughtylinks', 'naughtylinx', 'naughtylynx',
-'naughtynurses', 'netsex', 'niceass', 'nicetits', 'nikkinova', 'nikkityler',
-'nipples', 'nookie', 'nookies', 'nudeactress', 'nudeactresses', 'nudeamateur',
-'nudeamateurs', 'nudeasianwomen', 'nudebabes', 'nudebigboobs', 'nudeblack', 'nudeblackwomen',
-'nudeblondes', 'nudeceleb', 'nudeceleberties', 'nudecelebraties', 'nudecelebrites', 'nudecelebrities',
-'nudecelebrity', 'nudecelebs', 'nudecollegegirls', 'nudefemale', 'nudefemales', 'nudefree',
-'nudegay', 'nudeimages', 'nudeladies', 'nudelesbians', 'nudemale', 'nudemales',
-'nudeman', 'nudemen', 'nudepic', 'nudepics', 'nudepicture', 'nudepictures',
-'nudepornography', 'nudepussy', 'nuderaider', 'nuderedheads', 'nudes', 'nudesex',
-'nudestar', 'nudestars', 'nudevideoconferencing', 'nudewoman', 'nudewomen', 'nudism',
-'nudist', 'nudists', 'nudity', 'nylonfetish', 'nylonsex', 'nympho',
-'nymphos', 'olderbabes', 'oldersex', 'oldersluts', 'oldpussy', 'oldsex',
-'oldsluts', 'openlegs', 'openpussy', 'oral4free', 'oral-sex', 'oralsexpictures',
-'orgie', 'orgies', 'orgypics', 'orgys', 'pantyhosefetish', 'pantyhosesex',
-'peepcam', 'persiankitty', 'persiankitty.com', 'perverted', 'picsxxx', 'picturesex',
-'picturesofsex', 'picturessex', 'pimpserver', 'pimpserver.com', 'pinkpussy', 'pissing',
-'pixxx', 'poontang', 'pornagraphy', 'porncast', 'porncity', 'porndirectory',
-'porne', 'pornfree', 'pornmovies', 'pornno', 'pornnude', 'porno',
-'pornoadult', 'pornocartoons', 'pornochat', 'pornodeluxe', 'pornoe', 'pornofilms',
-'pornofree', 'pornogame', 'pornografi', 'pornografia', 'pornografie', 'pornografy',
-'pornograph', 'pornographi', 'pornographia', 'pornographic', 'pornographicpictures', 'pornographics',
-'pornographicvideo', 'pornographicvideos', 'pornographie', 'pornography', 'pornographyfree', 'pornographyphotos',
-'pornographypictures', 'pornography-sex', 'pornographysex', 'pornoland', 'pornolinks', 'pornolynx',
-'pornomagazines', 'pornomovies', 'pornompeg', 'pornophotos', 'pornopic', 'pornopics',
-'pornopicture', 'pornopictures', 'pornos', 'pornosex', 'pornosite', 'pornosites',
-'pornostar', 'pornostories', 'pornovideo', 'pornovideos', 'pornoxxx', 'pornphotos',
-'pornpics', 'pornpictures', 'pornpix', 'pornpost', 'pornqueens', 'pornrated',
-'porns', 'pornsex', 'pornstar', 'pornstories', 'porntrack', 'pornvideo',
-'pornvideos', 'pornypics', 'porstars', 'privatesex', 'privatex', 'privatexx',
-'privatexxx', 'prono', 'pronography', 'publicnudity', 'puffynipples', 'purple+passion',
-'pussyboard', 'pussycam', 'pussycams', 'pussycloseup', 'pussycloseups', 'pussycum',
-'pussycunt', 'pussyeater', 'pussyeaters', 'pussyeating', 'pussyfuck', 'pussyfucking',
-'pussyhair', 'pussyheaven', 'pussyjuice', 'pussylickers', 'pussylicking', 'pussylink',
-'pussylips', 'pussyphotos', 'pussyporno', 'pussys', 'pussysex', 'pussyshots',
-'pussythumbnails', 'pussytits', 'pusy', 'racqueldarrian', 'rape', 'rawlinks',
-'rawpussy', 'rawsex', 'realhardcore', 'realsex', 'redneckporn', 'redpussy',
-'rubberfetish', 'russianxxx', 'scat', 'schiffernude', 'seka', 'seniorsex',
-'sex4free', 'sex66', 'sexacts', 'sexadult', 'sexaids', 'sexamateur',
-'sexanal', 'sexandpictures', 'sexaphone', 'sexaudio', 'sexavi', 'sexbondage',
-'sexboner', 'sexbuttfucker', 'sexcam', 'sexcams', 'sexchat', 'sexchatrooms',
-'sexcites', 'sexclub', 'sexclubs', 'sex.com', 'sexdating', 'sexe',
-'sexfantasies', 'sexfantasy', 'sexfilm', 'sexgallery', 'sexgame', 'sexgames',
-'sexgirl', 'sexgirls', 'sexgroup', 'sexguide', 'sexhardcore', 'sexhphoto',
-'sexhungry', 'sexhungryjoe', 'sexhungryjoes', 'sexi', 'seximages', 'sexis',
-'sexjapan', 'sex.jpg', 'sexlinda', 'sexlinks', 'sexlinx', 'sexlive',
-'sexmagazine', 'sexmagazines', 'sexmature', 'sexmelayu', 'sexmodels', 'sexmovie',
-'sexmovies', 'sexmpeg', 'sexnude', 'sexnudity', 'sexo', 'sexoanal',
-'sexole', 'sexontheinternet', 'sexoral', 'sexpasswords', 'sexphoto', 'sexphotos',
-'sexpic', 'sexpicnet', 'sexpics', 'sexpicture', 'sexpictures', 'sexpicturesfree',
-'sexpix', 'sexplaza', 'sexporn', 'sexporno', 'sexpositions', 'sexpussy',
-'sexroulette', 'sexs', 'sexsamples', 'sexsearch', 'sexsex', 'sexsexsex',
-'sexshare', 'sexshops', 'sexshow', 'sexshows', 'sexsite', 'sexsites',
-'sexslave', 'sexsound', 'sexsounds', 'sexsource', 'sexspaces', 'sexspaces.com',
-'sexstories', 'sexstory', 'sexstorys', 'sextalk', 'sexteen', 'sexthumbnails',
-'sex-toons', 'sextoons', 'sextour', 'sextoy', 'sextoys', 'sextpus',
-'sextracker.com', 'sextropolis', 'sexualbondage', 'sexualfantasies', 'sexualfantasy', 'sexualintercourse',
-'sexualpictures', 'sexualpleasure', 'sexualpositions', 'sexuncensored', 'sexvideo', 'sexvision',
-'sexvote', 'sexwomen', 'sexworld', 'sexx', 'sexxx', 'sexxxx',
-'sexxxxx', 'sexyamateurs', 'sexybabes', 'sexyblack', 'sexyboobs', 'sexybookmark',
-'sexybookmarka', 'sexybookmarks', 'sexybutts', 'sexycunts', 'sexygirl', 'sexygirls',
-'sexyladies', 'sexylady', 'sexylegs', 'sexylingerie', 'sexymen', 'sexyphotos',
-'sexypics', 'sexypictures', 'sexypost', 'sexypussies', 'sexypussy', 'sexysites',
-'sexystories', 'sexywoman', 'sexywomen', 'shavedcunt', 'shavedcunts', 'shavedpussies',
-'shavedpussy', 'shavedpussypics', 'shavedsluts', 'shavedwomen', 'shavenpussies', 'shavenpussy',
-'shavepussy', 'sheboy', 'she-male', 'shemale+video', 'shemaleyum', 'showcam',
-'showcams', 'showercam', 'showercams', 'slavesex', 'smallboobs', 'smallbreasts',
-'smalldicks', 'smallpussy', 'smalltits', 'smut', 'smut69', 'smutland',
-'smutserver', 'smutshack', 'softcore', 'softporn', 'softpornography', 'spankingpage',
-'spreadpussy', 'spycamadult', 'stockingsex', 'storieserotic', 'storiessex', 'straightsex',
-'stretchedcunt', 'stripclub', 'stripclubs', 'stripshow', 'striptease', 'strokeit',
-'strokeme', 'suckdick', 'sucksex', 'superchicken', 'supersex', 'supertits',
-'swallowcum', 'swinger', 'swingerclub', 'swingers', 'swollenclits', 'syberporn',
-'sylviasaint', 'teenanal', 'teenanalsex', 'teenhardcore', 'teenie', 'teenies',
-'teennude', 'teenpics', 'teenporn', 'teenporno', 'teenpussy', 'teensex',
-'teenslut', 'teensluts', 'teensuck', 'teenxxx', 'tgp', 'thaipussy',
-'thaisex', 'thehun', 'threesomes', 'thumblords', 'thumbnailssex', 'thumbzilla',
-'tiffanytowers', 'tightcunt', 'tightpussies', 'tightpussy', 'tinypussy', 'tinytits',
-'tinytitties', 'tisandass', 'tit', 'titbondage', 'titfuck', 'titfucking',
-'tities', 'titman', 'titsandass', 'titsass', 'titties', 'titts',
-'titty', 'tittyfuck', 'tittyfucking', 'tittys', 'tokyotopless', 'tommysbookmark',
-'toplesswomen', 'trannies', 'transexual', 'transsexuels', 'twat', 'twats',
-'twink', 'ultradonkey', 'ultrahardcore', 'uncutcocks', 'vaginalintercourse', 'vaginapictures',
-'videoporno', 'videosex', 'videoxxx', 'vintageporn', 'virtualsex', 'vividtv',
-'wank', 'wankers', 'wanking', 'wendywhoppers', 'wetcunt', 'wetcunts',
-'wetdick', 'wetpanties', 'wetpussies', 'wetpussy', 'wetsex', 'wetvagina',
-'whitepussy', 'whitesex', 'whitetits', 'whitexxx', 'wifesharing', 'wifeswapping',
-'wildpussy', 'wildsex', 'womensex', 'worldsex', 'worldsexguide', 'x-rated',
-'xrated', 'x-ratedmovie', 'x-ratedmovies', 'x-ratedvideo', 'x-ratedvideos', 'xxx4free',
-'xxxadult', 'xxxadultmovies', 'xxxadultvideo', 'xxxadultvideos', 'xxxbabes', 'xxxcam',
-'xxxcelebrities', 'xxxfree', 'xxxfreepics', 'xxxgalleries', 'xxxhardcore', 'xxxjapan',
-'xxxlinks', 'xxxmodels', 'xxxmovie', 'xxxmovies', 'xxxmpeg', 'xxxpassword',
-'xxxphoto', 'xxxphotos', 'xxxpic', 'xxx-pics', 'xxxpics', 'xxxpicture',
-'xxxpictures', 'xxxpicturesfree', 'xxxpicx', 'xxxpirtures', 'xxxporn', 'xxxporno',
-'xxxpussy', 'xxx-rated', 'xxxrated', 'xxxsex', 'xxxsites', 'xxxsluts',
-'xxxstories', 'xxxteen', 'xxxthumbnails', 'xxxthumbs', 'xxxtoons', 'xxxtoys',
-'xxxvideo', 'xxxvideos', 'xxxwomen', 'xxxx', 'xxxxx', 'xxxxxx',
-'filthyfarm', 'adultcheck', 'erotic', 'mistresses', 'naughty',
-'adult', 'amateur', 'amateurs', 'anal', 'analau', 'poker',
-'anally', 'asian', 'swinging', 'ass', 'orgy', 'sexvideos',
-'babe', 'babes', 'bare', 'glamour', 'casino', 'bed',
-'vibrator', 'bikini', 'bisexual', 'blonde', 'breasted', 'breasts',
-'busty', 'butts', 'candy', 'caning', 'caps', 'catholic',
-'chained', 'chested', 'chubby', 'close-ups', 'coupling',
-'cucumber', 'doll', 'dolls', 'dolly', 'dominating', 'drinking',
-'drunk', 'fat', 'feet', 'fingering', 'fishnet', 'flasher',
-'footjob', 'foreplay', 'foreplaying', 'girlfriend', 'girlfriends', 'gymnast',
-'hairy', 'holly', 'horse', 'housewife', 'houswife', 'insertion',
-'insertions', 'interracial', 'jerka', 'juicy', 'kissing', 'kitty',
-'lactating', 'ladyboy', 'lance', 'latina', 'latins', 'leather',
-'legs', 'lesbian', 'lesbians', 'licking', 'lingerie', 'lubricants',
-'mature', 'midget', 'minor', 'mistress', 'nude',
-'older', 'olez', 'oral', 'panties', 'pantyhose', 'pedro',
-'peeing', 'penetration', 'pigtailed', 'pleasure', 'plump',
-'plumper', 'poser', 'posers', 'poses', 'posing', 'prosecuted',
-'punishment', 'reproducing', 'sex', 'shaved', 'shock', 'slave',
-'sleeping', 'speculums', 'spread', 'spreading', 'squirting', 'stripper',
-'stripping', 'swapping', 'thong', 'topless', 'toying',
-'trix', 'undressing', 'uniform', 'whipcream', 'brazzers', 'порно',
-'порн', 'лесб', 'гей', 'геи', 'прон'
+ 'surfwatch', 'netcash', 'watersport', 'fuck', 'threesome', 'tits',
+ 'masturbating', 'incest', 'bestiality', 'analintercourse', 'analsex', 'animesex',
+ 'anitablonde', 'autosex', 'blackass', 'blackasses', 'boner', 'boobcruise',
+ 'boobies', 'bordello', 'braless', 'brothel', 'callgirl', 'callgirls',
+ 'clit', 'clitoris', 'clits', 'cums', 'cybererotic', 'cybererotica',
+ 'cybersex', 'cybersexx', 'ejaculation', 'erotica', 'eroticfilm', 'eroticfilms',
+ 'eroticism', 'eroticphoto', 'eroticphotography', 'eroticphotos', 'erotics', 'eroticsex',
+ 'eroticsexstories', 'eroticstories', 'eroticstory', 'erotik', 'erotika', 'antasysex',
+ 'gaysex', 'gruppensex', 'horny', 'jackoff', 'lesbo', 'lesbos',
+ 'makinglove', 'motherfucker', 'horsesex', 'dogsex', 'snakesex', 'sextracker',
+ 'tranny', 'bdsm', 'porn', 'beastality', 'bizarre', 'blowjob',
+ 'bondage', 'bondages', 'celebs', 'cum', 'cunt', 'transsexual',
+ 'transsexuals', 'cumbath', 'cumshot', 'dildo', 'dildos', 'transvestites',
+ 'transvestite', 'dominatrix', 'spank', 'dungeon', 'sexbilder', 'dungeons',
+ 'pussie', 'ebony', 'fisting', 'gayshop', 'facesitting', 'sexshop',
+ 'pussy', 'bukkake', 'escort', 'blowjobs', 'facial', 'facialized',
+ 'facials', 'fetish', 'footfetish', 'fuckingpussy', 'fucking', 'hardcore',
+ 'hentai', 'hustlerlatex', 'latex', 'lolita', 'lolitas', 'mlm',
+ 'oralsex', 'peepshow', 'peepshows', 'phonesex', 'pornstars', 'preteen',
+ 'preteens', 'pussies', 'shemale', 'shemales', 'sluts', 'whores',
+ 'whore', 'spanking', 'strapon', 'twinks', 'upskirts', 'voyeur',
+ 'whip', 'whipping', 'xxx', 'sexkey', 'femdom', 'gangbang',
+ 'gloryhole', 'adultbuffet', 'adultcartoons', 'adultchat', 'adultchatnetwork', 'adultdvd',
+ 'adultentertainment', 'adultentertainmenthouse', 'adulterotica', 'adultfilms', 'adultfree', 'adultfreepics',
+ 'adultfreepix', 'adultfun', 'adulthardcore', 'adultimages', 'adultjpeg', 'adultlink',
+ 'adultlinks', 'adultmovie', 'adultmovies', 'adultmpeg', 'adultmpegs', 'adultpass',
+ 'adultpersonals', 'adultphotos', 'adultpic', 'adultpics', 'adultpicture', 'adultpictures',
+ 'adultpix', 'adultporn', 'adultpornography', 'adultsearch', 'adultsex', 'adultsights',
+ 'adultsites', 'adultsonly', 'adultstars', 'adultstories', 'adultvideo', 'adultvideos',
+ 'adultweb', 'adultxxx', 'alt.sex', 'altsex', 'alt.sex.exhibitionism', 'alt.sex.pictures',
+ 'altsexst', 'alt.sex.stories', 'alt.sex.voyeurism', 'amateurerotica', 'amateurfotos', 'amateurhardcore',
+ 'amateurindex', 'amateurnaked', 'amateurnudes', 'amateurporn', 'amateurpussy', 'amateursex',
+ 'amateursxxx', 'amatuerhardcore', 'amatuersex', 'ampland', 'analaction', 'analcum',
+ 'analfuck', 'analfucking', 'analgallery', 'analingus', 'analpics', 'analpicture',
+ 'analsex', 'analsexpics', 'analsexpictures', 'analxxx', 'animalbeastiality', 'animehentai',
+ 'animeporno', 'animexxx', 'asiacarrera', 'assfuck', 'assfucking', 'asshole',
+ 'assholes', 'asslick', 'asspics', 'assworship', 'autofellatio', 'babepix',
+ 'badgirls', 'bakedchicks', 'baldcunt', 'baldpussies', 'baldpussy', 'barecelebs',
+ 'barenaked', 'barepussy', 'beastiality', 'beaverboy', 'beavershots', 'bigballs',
+ 'bigblackboobs', 'bigblackcocks', 'bigblackdicks', 'bigblacktits', 'bigboob', 'bigboobs',
+ 'bigbreast', 'bigbreastlovers', 'bigbreasts', 'bigbutt', 'bigbutts', 'bigclit',
+ 'bigclitoris', 'bigclits', 'bigcock', 'bigcocks', 'bigcunt', 'bigcunts',
+ 'bigdick', 'bigdicks', 'biggestboobs', 'biggestdick', 'biggesttit', 'biggesttits',
+ 'bighairyballs', 'bighardons', 'bighooters', 'bignipples', 'bigpussies', 'bigpussy',
+ 'bigtit', 'bigtits', 'bigtitties', 'bigtitts', 'bizarresex', 'bizarrexxx',
+ 'bizzaresex', 'blackbondage', 'blackboobs', 'blackbooty', 'blackbutt', 'blackcock',
+ 'blackcocks', 'blackcum', 'blackcunt', 'blackcunts', 'blackdick', 'blackdicks',
+ 'blackerotica', 'blackhardcore', 'blacknudes', 'blackonblondes', 'blackporn', 'blackporno',
+ 'blackpornography', 'blackpussy', 'blacksex', 'blacksluts', 'blacksonblondes', 'blacktit',
+ 'blacktits', 'blacktwat', 'blackxxx', 'blondepussy', 'blondsgay', 'bondagefree',
+ 'bondagegallery', 'bondagelinks', 'bondagepics', 'bondagepictures', 'bondagesex', 'bondagestories',
+ 'bondagestory', 'bukake', 'bustybabes', 'bustyblondes', 'bustyceleb', 'butt-fuck',
+ 'buttfuck', 'buttfucker', 'buttfuckers', 'buttfucking', 'buttholes', 'buttman',
+ 'buttpics', 'buttplug', 'buttthumbnails', 'cartoonporn', 'cartoonsex', 'cartoonsxxx',
+ 'cartoonxxx', 'celebritiesnaked', 'celebritiesnude', 'celebritiesxxx', 'celebritybush', 'celebritybutts',
+ 'celebritynude', 'celebritynudes', 'celebrityporn', 'celebritypussy', 'celebritysex', 'celebrityxxx',
+ 'celebsxxx', 'celebxxx', 'centerfolds', 'chaseylain', 'chatsex', 'cheerleadersxxx',
+ 'cheerleaderxxx', 'chickswithdicks', 'christycanyon', 'cicciolina', 'clitpics', 'clitpictures',
+ 'closeuppussy', 'comixxx', 'crotchless', 'cruisingforsex', 'cumbaths', 'cumcoveredcunts',
+ 'cumcunt', 'cumdrinker', 'cumdrinkers', 'cumdrinking', 'cumdrops', 'cumeater',
+ 'cumeaters', 'cumeating', 'cumface', 'cumfaces', 'cumfacial', 'cumfacials',
+ 'cumgallery', 'cumgargle', 'cumguzzlers', 'cumincunt', 'cumjunkies', 'cumlovers',
+ 'cummpeg', 'cumpic', 'cumpics', 'cumpicture', 'cumpictures', 'cumpussy',
+ 'cumsluts', 'cumsucker', 'cumsuckers', 'cumsucking', 'cumswallow', 'cumswallowers',
+ 'cumswallowing', 'cumtasting', 'cumthumbnails', 'cunilingus', 'cunnilingus', 'cuntcum',
+ 'cuntfuck', 'cuntfucking', 'cuntjuice', 'cuntlapper', 'cuntlick', 'cuntlickers',
+ 'cuntlicking', 'cuntpics', 'cuntpictures', 'cunts', 'cuntstories', 'cuntsuckers',
+ 'cuntz', 'cyberlust', 'cybernude', 'cyberporn', 'cyberpornlinks', 'cyberpornsexlinks',
+ 'cyberslut', 'd’amateur', 'danniashe', 'dicksex', 'dicksuckers', 'dicksucking',
+ 'digixxx', 'directporn', 'dirtypictures', 'dirtysex', 'doggiestyle', 'doggystyle',
+ 'domatrix', 'dominatrixes', 'downblouse', 'drinkingcum', 'drippingcunt', 'drippingcunts',
+ 'drippingpussy', 'easypic.com', 'eatcum', 'eatingcum', 'eatingpussy', 'eatpussy',
+ 'ebony+ayres', 'ebonyporn', 'ebonypussy', 'ebonysex', 'ebonyxxx', 'enormoustits',
+ 'erosvillage', 'eroticanime', 'eroticart', 'eroticas', 'eroticastories', 'eroticfiction',
+ 'eroticlesbianstories', 'eroticmovie', 'eroticmovies', 'erotico', 'eroticos', 'eroticpics',
+ 'eroticpicture', 'eroticpictures', 'eroticsites', 'eroticsounds', 'erotictales', 'erotictext',
+ 'eroticvideo', 'eroticvideos', 'eroticwomen', 'eroticwriting', 'erotikchat', 'erotique',
+ 'erotismo', 'escortservice', 'escortservices', 'eurosex', 'explicitsex', 'facecum',
+ 'facesit', 'facesitters', 'fastporn', 'fatass', 'fatsex', 'feetfetish',
+ 'feetsex', 'felatio', 'fellatio', 'fellations', 'fetishwear', 'fettegirls',
+ 'fingerbang', 'fingerfuck', 'flesh4free', 'footjobs', 'footlicking', 'footworship',
+ 'fornication', 'freeanal', 'freeanalsex', 'freeass', 'freebigboobs', 'freebigtit',
+ 'freebigtits', 'freeblackcunt', 'freeblackpussy', 'freeblowjob', 'freeblowjobs', 'freebondage',
+ 'freeboobs', 'freecum', 'freecumshot', 'freecumshots', 'freecunt', 'freecunts',
+ 'freedick', 'freeerotic', 'freeerotica', 'freeeroticstories', 'freefuck', 'freefucking',
+ 'freefuckpics', 'freegay', 'freegaypics', 'freehardcore', 'freehardcorepics', 'freehardcorepictures',
+ 'freehardcoreporn', 'freehardcoresex', 'freehardcoresexpics', 'freehentai', 'freehooters', 'freelargehooters',
+ 'freelesbian', 'freelesbianporn', 'freelesbiansex', 'freenakedpic', 'freenakedpics', 'freenakedpictures',
+ 'freenakedwomen', 'freenude', 'freenudecelebs', 'freenudephotos', 'freenudepics', 'freenudes',
+ 'freeporn', 'freepornmovies', 'freeporno', 'freepornography', 'freepornopics', 'freepornopictures',
+ 'freepornos', 'freepornpic', 'freepornpics', 'freepornpictures', 'freeporns', 'freepornsite',
+ 'freepornsites', 'freepussy', 'freepussypic', 'freepussypics', 'freepussypictures', 'freesex',
+ 'freesexchat', 'freesexmovies', 'freesexnet', 'freesexphotos', 'freesexpic', 'freesexpics',
+ 'freesexpicture', 'freesexpictures', 'freesexsites', 'freesexstories', 'freesexvideos', 'freesexycam',
+ 'freeshemale', 'freesmut', 'freetit', 'freetits', 'freevoyeur', 'freexxx',
+ 'freexxxmovie', 'freexxxmovies', 'freexxxmpeg', 'freexxxphotos', 'freexxxpic', 'freexxxpics',
+ 'freexxxpicture', 'freexxxpictures', 'freexxxstories', 'freexxxvideo', 'freexxxx', 'fuking',
+ 'gangbangs', 'gratishardcoregalerie', 'hardcorecelebs', 'hardcorefisting', 'hardcorefree', 'hardcorefucking',
+ 'hardcorehooters', 'hardcorejunkie', 'hardcorejunky', 'hardcoremovie', 'hardcoremovies', 'hardcorepic',
+ 'hardcorepics', 'hardcorepictures', 'hardcorepix', 'hardcoreporn', 'hardcoreporno', 'hardcorepornography',
+ 'hardcorepornos', 'hardcorepussy', 'hardcoresamples', 'hardcoresex', 'hardcoresexpictures', 'hardcorestories',
+ 'hardcorethumbnails', 'hardcorevideo', 'hardcorevideos', 'hardcorexxx', 'harddicks', 'hardnipples',
+ 'hardons', 'hardporn', 'indiasex', 'interacialhardcore', 'interacialsex', 'interacialxxx',
+ 'intercoursepositions', 'internetsex', 'interracialfucking', 'interracialhardcore', 'interracialporn', 'interracialpornography',
+ 'interracialsex', 'interracialsexstories', 'interracialxxx', 'intimatesex', 'ittybittytitty', 'japaneseporn',
+ 'japanesesex', 'japansex', 'japanxxx', 'jennacam.com', 'jennajameson', 'jennicam',
+ 'jerkoff', 'jism', 'jiz', 'jizz', 'juicycunts', 'juicypussy',
+ 'justhardcore', 'karasamateurs', 'karasxxx', 'kascha', 'kaylakleevage', 'kobetai',
+ 'koreasex', 'lapdance', 'largeclits', 'largecunts', 'largedicks', 'largehooters',
+ 'largepussy', 'largetit', 'largetits', 'latinapussy', 'latinasex', 'latinosex',
+ 'latinoxxx', 'latinxxx', 'legsex', 'lesbianerotica', 'lesbianhardcore', 'lesbianorgies',
+ 'lesbianorgy', 'lesbianpics', 'lesbianpink', 'lesbianporn', 'lesbian-porno', 'lesbianporno',
+ 'lesbianpornography', 'lesbianpornos', 'lesbianpussy', 'lesbiansex', 'lesbiansexpics', 'lesbiansexstories',
+ 'lesbianxxx', 'lickadick', 'lickingpussy', 'lindalovelace', 'lingeriexxx', 'literotica',
+ 'littleboobs', 'littlepussy', 'littletits', 'livefucking', 'liveporn', 'livesex',
+ 'livesexcam', 'livesexcams', 'longdicks', 'lovedoll', 'lovedolls', 'magazinessex',
+ 'makinglove', 'malaysex', 'malenudes', 'malesex', 'mangaporno', 'mangax',
+ 'mangaxxx', 'manpics', 'mansex', 'marilynchambers', 'massivecocks', 'masterbating',
+ 'masturbation', 'masturbationvideos', 'maturefucking', 'maturesex', 'maturexxx', 'megaboobs',
+ 'megaporno', 'megapussy', 'megatits', 'mensdicks', 'mensex', 'm.i.l.f.',
+ 'milf', 'milfhunterpic', 'milfmpegsample', 'modelsex', 'mondoporn', 'monstercocks',
+ 'monsterdicks', 'motherfucker', 'moviepost.com', 'mpegsex', 'mpegxxx', 'muffdiving',
+ 'myslutwife', 'nacktfotos', 'nakedbabes', 'nakedblackwomen', 'nakedcelebrity', 'nakedcelebs',
+ 'nakedcheerleader', 'nakedchicks', 'nakedgirls', 'nakedguys', 'nakedladies', 'nakedlady',
+ 'nakedman', 'nakedmen', 'nakedness', 'nakedphotographs', 'nakedphotography', 'nakedphotos',
+ 'nakedpic', 'nakedpics', 'nakedpicture', 'nakedpictures', 'nakedpussy', 'nakedstars',
+ 'nakedwife', 'nakedwoman', 'nakedwomen', 'nastychat', 'nastypussy', 'nastysex',
+ 'nastythumbs', 'naturaltits', 'naughty.com', 'naughtylinks', 'naughtylinx', 'naughtylynx',
+ 'naughtynurses', 'netsex', 'niceass', 'nicetits', 'nikkinova', 'nikkityler',
+ 'nipples', 'nookie', 'nookies', 'nudeactress', 'nudeactresses', 'nudeamateur',
+ 'nudeamateurs', 'nudeasianwomen', 'nudebabes', 'nudebigboobs', 'nudeblack', 'nudeblackwomen',
+ 'nudeblondes', 'nudeceleb', 'nudeceleberties', 'nudecelebraties', 'nudecelebrites', 'nudecelebrities',
+ 'nudecelebrity', 'nudecelebs', 'nudecollegegirls', 'nudefemale', 'nudefemales', 'nudefree',
+ 'nudegay', 'nudeimages', 'nudeladies', 'nudelesbians', 'nudemale', 'nudemales',
+ 'nudeman', 'nudemen', 'nudepic', 'nudepics', 'nudepicture', 'nudepictures',
+ 'nudepornography', 'nudepussy', 'nuderaider', 'nuderedheads', 'nudes', 'nudesex',
+ 'nudestar', 'nudestars', 'nudevideoconferencing', 'nudewoman', 'nudewomen', 'nudism',
+ 'nudist', 'nudists', 'nudity', 'nylonfetish', 'nylonsex', 'nympho',
+ 'nymphos', 'olderbabes', 'oldersex', 'oldersluts', 'oldpussy', 'oldsex',
+ 'oldsluts', 'openlegs', 'openpussy', 'oral4free', 'oral-sex', 'oralsexpictures',
+ 'orgie', 'orgies', 'orgypics', 'orgys', 'pantyhosefetish', 'pantyhosesex',
+ 'peepcam', 'persiankitty', 'persiankitty.com', 'perverted', 'picsxxx', 'picturesex',
+ 'picturesofsex', 'picturessex', 'pimpserver', 'pimpserver.com', 'pinkpussy', 'pissing',
+ 'pixxx', 'poontang', 'pornagraphy', 'porncast', 'porncity', 'porndirectory',
+ 'porne', 'pornfree', 'pornmovies', 'pornno', 'pornnude', 'porno',
+ 'pornoadult', 'pornocartoons', 'pornochat', 'pornodeluxe', 'pornoe', 'pornofilms',
+ 'pornofree', 'pornogame', 'pornografi', 'pornografia', 'pornografie', 'pornografy',
+ 'pornograph', 'pornographi', 'pornographia', 'pornographic', 'pornographicpictures', 'pornographics',
+ 'pornographicvideo', 'pornographicvideos', 'pornographie', 'pornography', 'pornographyfree', 'pornographyphotos',
+ 'pornographypictures', 'pornography-sex', 'pornographysex', 'pornoland', 'pornolinks', 'pornolynx',
+ 'pornomagazines', 'pornomovies', 'pornompeg', 'pornophotos', 'pornopic', 'pornopics',
+ 'pornopicture', 'pornopictures', 'pornos', 'pornosex', 'pornosite', 'pornosites',
+ 'pornostar', 'pornostories', 'pornovideo', 'pornovideos', 'pornoxxx', 'pornphotos',
+ 'pornpics', 'pornpictures', 'pornpix', 'pornpost', 'pornqueens', 'pornrated',
+ 'porns', 'pornsex', 'pornstar', 'pornstories', 'porntrack', 'pornvideo',
+ 'pornvideos', 'pornypics', 'porstars', 'privatesex', 'privatex', 'privatexx',
+ 'privatexxx', 'prono', 'pronography', 'publicnudity', 'puffynipples', 'purple+passion',
+ 'pussyboard', 'pussycam', 'pussycams', 'pussycloseup', 'pussycloseups', 'pussycum',
+ 'pussycunt', 'pussyeater', 'pussyeaters', 'pussyeating', 'pussyfuck', 'pussyfucking',
+ 'pussyhair', 'pussyheaven', 'pussyjuice', 'pussylickers', 'pussylicking', 'pussylink',
+ 'pussylips', 'pussyphotos', 'pussyporno', 'pussys', 'pussysex', 'pussyshots',
+ 'pussythumbnails', 'pussytits', 'pusy', 'racqueldarrian', 'rape', 'rawlinks',
+ 'rawpussy', 'rawsex', 'realhardcore', 'realsex', 'redneckporn', 'redpussy',
+ 'rubberfetish', 'russianxxx', 'scat', 'schiffernude', 'seka', 'seniorsex',
+ 'sex4free', 'sex66', 'sexacts', 'sexadult', 'sexaids', 'sexamateur',
+ 'sexanal', 'sexandpictures', 'sexaphone', 'sexaudio', 'sexavi', 'sexbondage',
+ 'sexboner', 'sexbuttfucker', 'sexcam', 'sexcams', 'sexchat', 'sexchatrooms',
+ 'sexcites', 'sexclub', 'sexclubs', 'sex.com', 'sexdating', 'sexe',
+ 'sexfantasies', 'sexfantasy', 'sexfilm', 'sexgallery', 'sexgame', 'sexgames',
+ 'sexgirl', 'sexgirls', 'sexgroup', 'sexguide', 'sexhardcore', 'sexhphoto',
+ 'sexhungry', 'sexhungryjoe', 'sexhungryjoes', 'sexi', 'seximages', 'sexis',
+ 'sexjapan', 'sex.jpg', 'sexlinda', 'sexlinks', 'sexlinx', 'sexlive',
+ 'sexmagazine', 'sexmagazines', 'sexmature', 'sexmelayu', 'sexmodels', 'sexmovie',
+ 'sexmovies', 'sexmpeg', 'sexnude', 'sexnudity', 'sexo', 'sexoanal',
+ 'sexole', 'sexontheinternet', 'sexoral', 'sexpasswords', 'sexphoto', 'sexphotos',
+ 'sexpic', 'sexpicnet', 'sexpics', 'sexpicture', 'sexpictures', 'sexpicturesfree',
+ 'sexpix', 'sexplaza', 'sexporn', 'sexporno', 'sexpositions', 'sexpussy',
+ 'sexroulette', 'sexs', 'sexsamples', 'sexsearch', 'sexsex', 'sexsexsex',
+ 'sexshare', 'sexshops', 'sexshow', 'sexshows', 'sexsite', 'sexsites',
+ 'sexslave', 'sexsound', 'sexsounds', 'sexsource', 'sexspaces', 'sexspaces.com',
+ 'sexstories', 'sexstory', 'sexstorys', 'sextalk', 'sexteen', 'sexthumbnails',
+ 'sex-toons', 'sextoons', 'sextour', 'sextoy', 'sextoys', 'sextpus',
+ 'sextracker.com', 'sextropolis', 'sexualbondage', 'sexualfantasies', 'sexualfantasy', 'sexualintercourse',
+ 'sexualpictures', 'sexualpleasure', 'sexualpositions', 'sexuncensored', 'sexvideo', 'sexvision',
+ 'sexvote', 'sexwomen', 'sexworld', 'sexx', 'sexxx', 'sexxxx',
+ 'sexxxxx', 'sexyamateurs', 'sexybabes', 'sexyblack', 'sexyboobs', 'sexybookmark',
+ 'sexybookmarka', 'sexybookmarks', 'sexybutts', 'sexycunts', 'sexygirl', 'sexygirls',
+ 'sexyladies', 'sexylady', 'sexylegs', 'sexylingerie', 'sexymen', 'sexyphotos',
+ 'sexypics', 'sexypictures', 'sexypost', 'sexypussies', 'sexypussy', 'sexysites',
+ 'sexystories', 'sexywoman', 'sexywomen', 'shavedcunt', 'shavedcunts', 'shavedpussies',
+ 'shavedpussy', 'shavedpussypics', 'shavedsluts', 'shavedwomen', 'shavenpussies', 'shavenpussy',
+ 'shavepussy', 'sheboy', 'she-male', 'shemale+video', 'shemaleyum', 'showcam',
+ 'showcams', 'showercam', 'showercams', 'slavesex', 'smallboobs', 'smallbreasts',
+ 'smalldicks', 'smallpussy', 'smalltits', 'smut', 'smut69', 'smutland',
+ 'smutserver', 'smutshack', 'softcore', 'softporn', 'softpornography', 'spankingpage',
+ 'spreadpussy', 'spycamadult', 'stockingsex', 'storieserotic', 'storiessex', 'straightsex',
+ 'stretchedcunt', 'stripclub', 'stripclubs', 'stripshow', 'striptease', 'strokeit',
+ 'strokeme', 'suckdick', 'sucksex', 'superchicken', 'supersex', 'supertits',
+ 'swallowcum', 'swinger', 'swingerclub', 'swingers', 'swollenclits', 'syberporn',
+ 'sylviasaint', 'teenanal', 'teenanalsex', 'teenhardcore', 'teenie', 'teenies',
+ 'teennude', 'teenpics', 'teenporn', 'teenporno', 'teenpussy', 'teensex',
+ 'teenslut', 'teensluts', 'teensuck', 'teenxxx', 'tgp', 'thaipussy',
+ 'thaisex', 'thehun', 'threesomes', 'thumblords', 'thumbnailssex', 'thumbzilla',
+ 'tiffanytowers', 'tightcunt', 'tightpussies', 'tightpussy', 'tinypussy', 'tinytits',
+ 'tinytitties', 'tisandass', 'tit', 'titbondage', 'titfuck', 'titfucking',
+ 'tities', 'titman', 'titsandass', 'titsass', 'titties', 'titts',
+ 'titty', 'tittyfuck', 'tittyfucking', 'tittys', 'tokyotopless', 'tommysbookmark',
+ 'toplesswomen', 'trannies', 'transexual', 'transsexuels', 'twat', 'twats',
+ 'twink', 'ultradonkey', 'ultrahardcore', 'uncutcocks', 'vaginalintercourse', 'vaginapictures',
+ 'videoporno', 'videosex', 'videoxxx', 'vintageporn', 'virtualsex', 'vividtv',
+ 'wank', 'wankers', 'wanking', 'wendywhoppers', 'wetcunt', 'wetcunts',
+ 'wetdick', 'wetpanties', 'wetpussies', 'wetpussy', 'wetsex', 'wetvagina',
+ 'whitepussy', 'whitesex', 'whitetits', 'whitexxx', 'wifesharing', 'wifeswapping',
+ 'wildpussy', 'wildsex', 'womensex', 'worldsex', 'worldsexguide', 'x-rated',
+ 'xrated', 'x-ratedmovie', 'x-ratedmovies', 'x-ratedvideo', 'x-ratedvideos', 'xxx4free',
+ 'xxxadult', 'xxxadultmovies', 'xxxadultvideo', 'xxxadultvideos', 'xxxbabes', 'xxxcam',
+ 'xxxcelebrities', 'xxxfree', 'xxxfreepics', 'xxxgalleries', 'xxxhardcore', 'xxxjapan',
+ 'xxxlinks', 'xxxmodels', 'xxxmovie', 'xxxmovies', 'xxxmpeg', 'xxxpassword',
+ 'xxxphoto', 'xxxphotos', 'xxxpic', 'xxx-pics', 'xxxpics', 'xxxpicture',
+ 'xxxpictures', 'xxxpicturesfree', 'xxxpicx', 'xxxpirtures', 'xxxporn', 'xxxporno',
+ 'xxxpussy', 'xxx-rated', 'xxxrated', 'xxxsex', 'xxxsites', 'xxxsluts',
+ 'xxxstories', 'xxxteen', 'xxxthumbnails', 'xxxthumbs', 'xxxtoons', 'xxxtoys',
+ 'xxxvideo', 'xxxvideos', 'xxxwomen', 'xxxx', 'xxxxx', 'xxxxxx',
+ 'filthyfarm', 'adultcheck', 'erotic', 'mistresses', 'naughty',
+ 'adult', 'amateur', 'amateurs', 'anal', 'analau', 'poker',
+ 'anally', 'asian', 'swinging', 'ass', 'orgy', 'sexvideos',
+ 'babe', 'babes', 'bare', 'glamour', 'casino', 'bed',
+ 'vibrator', 'bikini', 'bisexual', 'blonde', 'breasted', 'breasts',
+ 'busty', 'butts', 'candy', 'caning', 'caps', 'catholic',
+ 'chained', 'chested', 'chubby', 'close-ups', 'coupling',
+ 'cucumber', 'doll', 'dolls', 'dolly', 'dominating', 'drinking',
+ 'drunk', 'fat', 'feet', 'fingering', 'fishnet', 'flasher',
+ 'footjob', 'foreplay', 'foreplaying', 'girlfriend', 'girlfriends', 'gymnast',
+ 'hairy', 'holly', 'horse', 'housewife', 'houswife', 'insertion',
+ 'insertions', 'interracial', 'jerka', 'juicy', 'kissing', 'kitty',
+ 'lactating', 'ladyboy', 'lance', 'latina', 'latins', 'leather',
+ 'legs', 'lesbian', 'lesbians', 'licking', 'lingerie', 'lubricants',
+ 'mature', 'midget', 'minor', 'mistress', 'nude',
+ 'older', 'olez', 'oral', 'panties', 'pantyhose', 'pedro',
+ 'peeing', 'penetration', 'pigtailed', 'pleasure', 'plump',
+ 'plumper', 'poser', 'posers', 'poses', 'posing', 'prosecuted',
+ 'punishment', 'reproducing', 'sex', 'shaved', 'shock', 'slave',
+ 'sleeping', 'speculums', 'spread', 'spreading', 'squirting', 'stripper',
+ 'stripping', 'swapping', 'thong', 'topless', 'toying',
+ 'trix', 'undressing', 'uniform', 'whipcream', 'brazzers', 'порно',
+ 'порн', 'лесб', 'гей', 'геи', 'прон'
];
const XXX_VERY_BAD_WORDS = [
- 'catgoddess', 'gracel', 'fatman', 'falko', 'pthc',
- 'ptsc', 'yukikax', 'ls-models', '3yo', '4yo', '5yo', '6yo', '7yo', '8yo', '9yo',
- '10yo', '11yo', '12yo', '13yo', '14yo', '15yo', '16yo'
+ 'catgoddess', 'gracel', 'fatman', 'falko', 'pthc',
+ 'ptsc', 'yukikax', 'ls-models', '3yo', '4yo', '5yo', '6yo', '7yo', '8yo', '9yo',
+ '10yo', '11yo', '12yo', '13yo', '14yo', '15yo', '16yo'
]
module.exports = {
- XXX_BLOCK_WORDS,
- XXX_VERY_BAD_WORDS
+ XXX_BLOCK_WORDS,
+ XXX_VERY_BAD_WORDS
};
diff --git a/src/app/changelog-page.js b/src/app/changelog-page.js
index a576448..6e59a09 100644
--- a/src/app/changelog-page.js
+++ b/src/app/changelog-page.js
@@ -4,23 +4,23 @@ import ReactMarkdown from 'react-markdown'
import fs from 'fs'
export default class ChangeLog extends Page {
- constructor(props) {
- super(props)
- this.setTitle('Changelog');
+ constructor(props) {
+ super(props)
+ this.setTitle('Changelog');
- let changelogPath = 'CHANGELOG.md'
- if(!fs.existsSync(changelogPath))
- changelogPath = 'resources/CHANGELOG.md'
+ let changelogPath = 'CHANGELOG.md'
+ if(!fs.existsSync(changelogPath))
+ changelogPath = 'resources/CHANGELOG.md'
- this.changelog = fs.readFileSync(changelogPath)
- if(!this.changelog)
- throw new Error('no changelog file')
- }
- render() {
- return (
-
-
-
- );
- }
+ this.changelog = fs.readFileSync(changelogPath)
+ if(!this.changelog)
+ throw new Error('no changelog file')
+ }
+ render() {
+ return (
+
+
+
+ );
+ }
}
diff --git a/src/app/component.js b/src/app/component.js
index 625e56c..d2060cf 100644
--- a/src/app/component.js
+++ b/src/app/component.js
@@ -6,13 +6,13 @@ export default class BTComponent extends Component {
// Свайп действия
if(
this.props.onSwipeLeft ||
- this.props.onSwipeRight ||
- this.props.onSwipeTop ||
- this.props.onSwipeBottom ||
- this.onSwipeLeft ||
- this.onSwipeRight ||
- this.onSwipeTop ||
- this.onSwipeBottom
+ this.props.onSwipeRight ||
+ this.props.onSwipeTop ||
+ this.props.onSwipeBottom ||
+ this.onSwipeLeft ||
+ this.onSwipeRight ||
+ this.onSwipeTop ||
+ this.onSwipeBottom
)
{
this.swipeFunctions = listenSwipe(this, {
diff --git a/src/app/config-page.js b/src/app/config-page.js
index e6f4ad8..e7c0bf8 100644
--- a/src/app/config-page.js
+++ b/src/app/config-page.js
@@ -9,302 +9,302 @@ import Slider from 'material-ui/Slider'
import fs from 'fs'
let dialog
if(typeof WEB === 'undefined')
- dialog = require('electron').remote.dialog
+ dialog = require('electron').remote.dialog
export default class ConfigPage extends Page {
- constructor(props) {
- super(props)
- this.setTitle('Rats settings');
- this.options = {}
- }
- componentDidMount() {
- this.loadSettings()
- }
- loadSettings() {
- window.torrentSocket.emit('config', window.customLoader((options) => {
- this.options = options;
- console.log(this.options)
- this.forceUpdate();
- }));
- }
- saveSettings() {
- window.torrentSocket.emit('setConfig', this.options)
- this.settingsSavedMessage = true
- this.forceUpdate()
- setTimeout(() => {
- this.settingsSavedMessage = false
- this.forceUpdate()
- }, 1000)
- }
- render() {
- return (
-
-
- {
- window.router('/')
- }} />
-
-
-
{
- this.options.indexer = checked
- if(!this.options.indexer)
- this.options.p2p = false
- this.forceUpdate()
- }}
- />
-
-
-
{__('Scanning port')}
-
0 ? undefined : __('This field is required')}
- value={this.options.spiderPort}
- onChange={(e, value) => {
- if(!value)
- value = 0
- if(value > 65535)
- value = 65535
+ constructor(props) {
+ super(props)
+ this.setTitle('Rats settings');
+ this.options = {}
+ }
+ componentDidMount() {
+ this.loadSettings()
+ }
+ loadSettings() {
+ window.torrentSocket.emit('config', window.customLoader((options) => {
+ this.options = options;
+ console.log(this.options)
+ this.forceUpdate();
+ }));
+ }
+ saveSettings() {
+ window.torrentSocket.emit('setConfig', this.options)
+ this.settingsSavedMessage = true
+ this.forceUpdate()
+ setTimeout(() => {
+ this.settingsSavedMessage = false
+ this.forceUpdate()
+ }, 1000)
+ }
+ render() {
+ return (
+
+
+ {
+ window.router('/')
+ }} />
+
+
+
{
+ this.options.indexer = checked
+ if(!this.options.indexer)
+ this.options.p2p = false
+ this.forceUpdate()
+ }}
+ />
+
+
+
{__('Scanning port')}
+
0 ? undefined : __('This field is required')}
+ value={this.options.spiderPort}
+ onChange={(e, value) => {
+ if(!value)
+ value = 0
+ if(value > 65535)
+ value = 65535
- this.options.spiderPort = parseInt(value)
- this.forceUpdate()
- }}
- />
-
-
* {__('For current work TCP and UDP ports must be fully open and forward in case of router usage')}
-
+ this.options.spiderPort = parseInt(value)
+ this.forceUpdate()
+ }}
+ />
+
+
* {__('For current work TCP and UDP ports must be fully open and forward in case of router usage')}
+
-
-
-
{__('Trackers responce port')}
-
0 ? undefined : __('This field is required')}
- value={this.options.udpTrackersPort}
- onChange={(e, value) => {
- if(!value)
- value = 0
- if(value > 65535)
- value = 65535
+
+
+
{__('Trackers responce port')}
+
0 ? undefined : __('This field is required')}
+ value={this.options.udpTrackersPort}
+ onChange={(e, value) => {
+ if(!value)
+ value = 0
+ if(value > 65535)
+ value = 65535
- this.options.udpTrackersPort = parseInt(value)
- this.forceUpdate()
- }}
- />
-
-
* {__('For current work UDP port must be fully open and forward in case of router usage')}
-
+ this.options.udpTrackersPort = parseInt(value)
+ this.forceUpdate()
+ }}
+ />
+
+
* {__('For current work UDP port must be fully open and forward in case of router usage')}
+
- {
- this.options.upnp = checked
- this.forceUpdate()
- }}
- />
+ {
+ this.options.upnp = checked
+ this.forceUpdate()
+ }}
+ />
-
-
{__('Collection directory')}
-
0 ? undefined : __('This field is required')}
- value={this.options.dbPath}
- onChange={(e, value) => {
- if(!fs.existsSync(value))
- return
+
+
{__('Collection directory')}
+
0 ? undefined : __('This field is required')}
+ value={this.options.dbPath}
+ onChange={(e, value) => {
+ if(!fs.existsSync(value))
+ return
- this.options.dbPath = value
- this.forceUpdate()
- }}
- />
- {
- if(!dialog)
- return
- const dir = dialog.showOpenDialog({properties: ['openDirectory']})[0]
- if(dir)
- {
- this.options.dbPath = dir
- this.forceUpdate()
- }
- }} />
-
+ this.options.dbPath = value
+ this.forceUpdate()
+ }}
+ />
+ {
+ if(!dialog)
+ return
+ const dir = dialog.showOpenDialog({properties: ['openDirectory']})[0]
+ if(dir)
+ {
+ this.options.dbPath = dir
+ this.forceUpdate()
+ }
+ }} />
+
-
-
{__('Download torrents directory')}
-
{
- if(!fs.existsSync(value))
- return
+
+
{__('Download torrents directory')}
+
{
+ if(!fs.existsSync(value))
+ return
- this.options.client.downloadPath = value
- this.forceUpdate()
- }}
- />
- {
- if(!dialog)
- return
- const dir = dialog.showOpenDialog({properties: ['openDirectory']})[0]
- if(dir)
- {
- this.options.client.downloadPath = dir
- this.forceUpdate()
- }
- }} />
-
+ this.options.client.downloadPath = value
+ this.forceUpdate()
+ }}
+ />
+ {
+ if(!dialog)
+ return
+ const dir = dialog.showOpenDialog({properties: ['openDirectory']})[0]
+ if(dir)
+ {
+ this.options.client.downloadPath = dir
+ this.forceUpdate()
+ }
+ }} />
+
- {
- this.options.trayOnMinimize = checked
- this.forceUpdate()
- }}
- />
+ {
+ this.options.trayOnMinimize = checked
+ this.forceUpdate()
+ }}
+ />
- {
- this.options.trayOnClose = checked
- this.forceUpdate()
- }}
- />
+ {
+ this.options.trayOnClose = checked
+ this.forceUpdate()
+ }}
+ />
- {__('P2P Rats network settings')}:
- {
- this.options.p2p = this.options.indexer && checked
- this.forceUpdate()
- }}
- />
-
-
{
- this.options.p2pBootstrap = checked
- this.forceUpdate()
- }}
- />
- * {__('Use extrnral bootstrap nodes to get p2p peers when network setted wrong or need external source')}
-
-
-
-
{__('Max peers limit')} ({__('current')}: {this.options.p2pConnections})
-
{
- this.options.p2pConnections = value
- this.forceUpdate()
- }}
- />
-
-
-
-
{
- this.options.p2pReplication = checked
- this.forceUpdate()
- }}
- />
- * {__('Enable torrents replication from another rats clients. Dont recomended if torrent scanner works correct')}.
-
+ {__('P2P Rats network settings')}:
+ {
+ this.options.p2p = this.options.indexer && checked
+ this.forceUpdate()
+ }}
+ />
+
+
{
+ this.options.p2pBootstrap = checked
+ this.forceUpdate()
+ }}
+ />
+ * {__('Use extrnral bootstrap nodes to get p2p peers when network setted wrong or need external source')}
+
+
+
+
{__('Max peers limit')} ({__('current')}: {this.options.p2pConnections})
+
{
+ this.options.p2pConnections = value
+ this.forceUpdate()
+ }}
+ />
+
+
+
+
{
+ this.options.p2pReplication = checked
+ this.forceUpdate()
+ }}
+ />
+ * {__('Enable torrents replication from another rats clients. Dont recomended if torrent scanner works correct')}.
+
- {__('Torrent network scanner settings')}:
-
-
-
{__('Scanner walk speed')} ({__('current')}: {this.options.spider && this.options.spider.walkInterval}) [{__('affected after program reload')}]
-
{
- this.options.spider.walkInterval = value
- this.forceUpdate()
- }}
- />
-
-
* {__('Low value')} - {__('fast initial scanning and high cpu usage')}. {__('High Value')} - {__('low cpu usage but very slow scanning')}.
- {__('Good value between')} 3-60. {__('Defaul value')}: 5
-
-
-
-
{__('Nodes usage')} ({__('current')}: {this.options.spider && this.options.spider.nodesUsage})
-
{
- this.options.spider.nodesUsage = value
- this.forceUpdate()
- }}
- />
-
-
* {__('Low Value')} - {__('very low usage of nodes, low network traffic, slow torrent scanning')}. {__('High value')} - {__('high traffic, fast scanning, high routers usage')}.
- {__('Recomended value between')} 10-1000. {__('Defaul value')}: 100. 0 - {__('Ignore this option')} ({__('no limit')}).
-
-
-
-
-
{__('Reduce network packages')} ({__('current')}: {this.options.spider && this.options.spider.packagesLimit})
-
{
- this.options.spider.packagesLimit = value
- this.forceUpdate()
- }}
- />
-
-
* {__('Low Value')} - {__('ignore more usless network packages, lower traffic and routers usage')}. {__('High Value')} - {__('high traffic and router usage in prospect')}.
- {__('Recomended value between')} 300-2000. {__('Defaul value')}: 500. 0 - {__('Ignore this option')} ({__('no limit')}).
-
-
+ {__('Torrent network scanner settings')}:
+
+
+
{__('Scanner walk speed')} ({__('current')}: {this.options.spider && this.options.spider.walkInterval}) [{__('affected after program reload')}]
+
{
+ this.options.spider.walkInterval = value
+ this.forceUpdate()
+ }}
+ />
+
+
* {__('Low value')} - {__('fast initial scanning and high cpu usage')}. {__('High Value')} - {__('low cpu usage but very slow scanning')}.
+ {__('Good value between')} 3-60. {__('Defaul value')}: 5
+
+
+
+
{__('Nodes usage')} ({__('current')}: {this.options.spider && this.options.spider.nodesUsage})
+
{
+ this.options.spider.nodesUsage = value
+ this.forceUpdate()
+ }}
+ />
+
+
* {__('Low Value')} - {__('very low usage of nodes, low network traffic, slow torrent scanning')}. {__('High value')} - {__('high traffic, fast scanning, high routers usage')}.
+ {__('Recomended value between')} 10-1000. {__('Defaul value')}: 100. 0 - {__('Ignore this option')} ({__('no limit')}).
+
+
+
+
+
{__('Reduce network packages')} ({__('current')}: {this.options.spider && this.options.spider.packagesLimit})
+
{
+ this.options.spider.packagesLimit = value
+ this.forceUpdate()
+ }}
+ />
+
+
* {__('Low Value')} - {__('ignore more usless network packages, lower traffic and routers usage')}. {__('High Value')} - {__('high traffic and router usage in prospect')}.
+ {__('Recomended value between')} 300-2000. {__('Defaul value')}: 500. 0 - {__('Ignore this option')} ({__('no limit')}).
+
+
- {
- this.settingsSavedMessage
+ {
+ this.settingsSavedMessage
&&
{__('Settings saved')}
- }
+ }
-
- {
- this.saveSettings()
- }} />
-
+
+ {
+ this.saveSettings()
+ }} />
+
-
-
- );
- }
+
+
+ );
+ }
}
diff --git a/src/app/content.js b/src/app/content.js
index 59083f0..2321641 100644
--- a/src/app/content.js
+++ b/src/app/content.js
@@ -236,7 +236,7 @@ const ContentCategoryProp = 'contentCategory';
const {
XXX_BLOCK_WORDS,
- XXX_VERY_BAD_WORDS
+ XXX_VERY_BAD_WORDS
} = require('./bad-words');
// блокируем порнографию
@@ -270,7 +270,7 @@ const detectSubCategory = (torrent, files, typesPriority, contentType) => {
fileCheck = fileCheck.join('.');
blockBadName(torrent, fileCheck);
-
+
return torrent[ContentTypeProp] == 'bad';
})
}
@@ -304,7 +304,7 @@ const torrentTypeDetect = (torrent, files) => {
}
}
let priority = Object.keys(typesPriority).sort(function(a, b){
- return typesPriority[b] - typesPriority[a]
+ return typesPriority[b] - typesPriority[a]
});
if(priority.length > 0)
torrent[ContentTypeProp] = priority[0];
diff --git a/src/app/dmca-page.js b/src/app/dmca-page.js
index 57b0f75..c627a61 100644
--- a/src/app/dmca-page.js
+++ b/src/app/dmca-page.js
@@ -7,27 +7,27 @@ import NavigationClose from 'material-ui/svg-icons/navigation/close';
export default class DMCAPage extends Page {
- render() {
- return (
-
-
{ window.router('/') }}> }
- />
+ render() {
+ return (
+
+
{ window.router('/') }}> }
+ />
-
-
RatsOnTheBoat.org is in compliance with 17 U.S.C. § 512, the Digital Millennium Copyright Act ("DMCA") and the Directive 2001/29/EC of the European Parliament.
-
-
Content status
+
+
RatsOnTheBoat.org is in compliance with 17 U.S.C. § 512, the Digital Millennium Copyright Act ("DMCA") and the Directive 2001/29/EC of the European Parliament.
+
+
Content status
- Our main goal is collect and make analysis of information from the torrent network. We don't save/distribute any real content/data and also don't save any torrents files - we are respect DMCA law.
- Information collected automaticly and the real source are torrent clients based on torrent protocol.
+ Our main goal is collect and make analysis of information from the torrent network. We don't save/distribute any real content/data and also don't save any torrents files - we are respect DMCA law.
+ Information collected automaticly and the real source are torrent clients based on torrent protocol.
-
Block mechanisms (for rightholders)
+
Block mechanisms (for rightholders)
- Right holders can block/remove content that they responsible for. Contact administration or left application about content removal.
-
-
- );
- }
+ Right holders can block/remove content that they responsible for. Contact administration or left application about content removal.
+
+
+ );
+ }
}
diff --git a/src/app/download-page.js b/src/app/download-page.js
index 96c3940..2b5554b 100644
--- a/src/app/download-page.js
+++ b/src/app/download-page.js
@@ -10,48 +10,48 @@ export default class TopPage extends Page {
downloads = []
constructor(props) {
- super(props)
- this.setTitle('Current Downloads');
+ super(props)
+ this.setTitle('Current Downloads');
}
getDownloads()
{
- window.torrentSocket.emit('downloads', window.customLoader((downloads) => {
- this.downloads = downloads
- this.forceUpdate()
- }))
+ window.torrentSocket.emit('downloads', window.customLoader((downloads) => {
+ this.downloads = downloads
+ this.forceUpdate()
+ }))
}
componentDidMount()
{
- super.componentDidMount();
- this.getDownloads()
- this.downloading = () => this.getDownloads()
- window.torrentSocket.on('downloading', this.downloading);
- this.downloadDone = () => this.getDownloads()
- window.torrentSocket.on('downloadDone', this.downloadDone);
+ super.componentDidMount();
+ this.getDownloads()
+ this.downloading = () => this.getDownloads()
+ window.torrentSocket.on('downloading', this.downloading);
+ this.downloadDone = () => this.getDownloads()
+ window.torrentSocket.on('downloadDone', this.downloadDone);
}
componentWillUnmount()
{
- if(this.downloading)
- window.torrentSocket.off('downloading', this.downloading);
- if(this.downloadDone)
- window.torrentSocket.off('downloadDone', this.downloadDone);
+ if(this.downloading)
+ window.torrentSocket.off('downloading', this.downloading);
+ if(this.downloadDone)
+ window.torrentSocket.off('downloadDone', this.downloadDone);
}
render() {
- return (
-
-
- {
- window.router('/')
- }} />
-
- {
- this.downloads.map((download, index) => {
- return
- })
- }
-
-
-
- );
+ return (
+
+
+ {
+ window.router('/')
+ }} />
+
+ {
+ this.downloads.map((download, index) => {
+ return
+ })
+ }
+
+
+
+ );
}
}
diff --git a/src/app/feed-page.js b/src/app/feed-page.js
index 41cad0d..8a11b42 100644
--- a/src/app/feed-page.js
+++ b/src/app/feed-page.js
@@ -8,89 +8,89 @@ import MenuItem from 'material-ui/MenuItem';
import Feed from './feed';
export default class FeedPage extends Page {
- constructor(props) {
- super(props)
- this.setTitle('Rats On The Boat - Content Search Engine');
- }
- componentDidMount()
- {
- Search.instance().onSearchUpdate = () => this.forceUpdate()
- }
- componentWillUnmount()
- {
- Search.instance().onSearchUpdate = () => {}
- }
- render() {
- const orderText = (text, field) => {
- if(field !== Search.instance().state.orderBy)
- return text;
+ constructor(props) {
+ super(props)
+ this.setTitle('Rats On The Boat - Content Search Engine');
+ }
+ componentDidMount()
+ {
+ Search.instance().onSearchUpdate = () => this.forceUpdate()
+ }
+ componentWillUnmount()
+ {
+ Search.instance().onSearchUpdate = () => {}
+ }
+ render() {
+ const orderText = (text, field) => {
+ if(field !== Search.instance().state.orderBy)
+ return text;
- if(Search.instance().state.orderDesc)
- return text + ' ⇩'
- else
- return text + ' ⇧'
- }
+ if(Search.instance().state.orderDesc)
+ return text + ' ⇩'
+ else
+ return text + ' ⇧'
+ }
- return (
-
-
-
{
- event.preventDefault(); // fix overclick on torrent
- if(value === 'none') {
- Search.instance().setState({orderBy: null}, () => {
- Search.instance().search(true)
- })
- return;
- }
+ return (
+
+
+ {
+ event.preventDefault(); // fix overclick on torrent
+ if(value === 'none') {
+ Search.instance().setState({orderBy: null}, () => {
+ Search.instance().search(true)
+ })
+ return;
+ }
- if(value === Search.instance().state.orderBy)
- {
- Search.instance().setState({orderDesc: !Search.instance().state.orderDesc}, () => {
- Search.instance().search(true)
- })
- return;
- }
+ if(value === Search.instance().state.orderBy)
+ {
+ Search.instance().setState({orderDesc: !Search.instance().state.orderDesc}, () => {
+ Search.instance().search(true)
+ })
+ return;
+ }
- Search.instance().setState({
- orderBy: value,
- orderDesc: (value === 'seeders' || value === 'completed' || value === 'added') ? true : Search.instance().state.orderDesc
- }, () => {
- Search.instance().search(true)
- })
- }}
- >
-
-
-
-
-
-
-
-
- }
+ Search.instance().setState({
+ orderBy: value,
+ orderDesc: (value === 'seeders' || value === 'completed' || value === 'added') ? true : Search.instance().state.orderDesc
+ }, () => {
+ Search.instance().search(true)
+ })
+ }}
+ >
+
+
+
+
+
+
+
+
+ }
- moreTorrentsEnabled={Search.instance().moreSearchTorrents && !Search.instance().state.searchingIndicator}
- moreFilesEnabled={Search.instance().moreSearchFiles && !Search.instance().state.searchingIndicator}
- onMoreTorrents={() => Search.instance().moreTorrents()}
- onMoreFiles={() => Search.instance().moreFiles()}
- moreTorrentsIndicator={Search.instance().state.moreTorrentsIndicator}
- moreFilesIndicator={Search.instance().state.moreFilesIndicator}
- />
-
-
-
-
-
- );
- }
+ moreTorrentsEnabled={Search.instance().moreSearchTorrents && !Search.instance().state.searchingIndicator}
+ moreFilesEnabled={Search.instance().moreSearchFiles && !Search.instance().state.searchingIndicator}
+ onMoreTorrents={() => Search.instance().moreTorrents()}
+ onMoreFiles={() => Search.instance().moreFiles()}
+ moreTorrentsIndicator={Search.instance().state.moreTorrentsIndicator}
+ moreFilesIndicator={Search.instance().state.moreFilesIndicator}
+ />
+
+
+
+
+
+ );
+ }
}
diff --git a/src/app/feed.js b/src/app/feed.js
index 6b55937..92d94e0 100644
--- a/src/app/feed.js
+++ b/src/app/feed.js
@@ -5,32 +5,32 @@ import Divider from 'material-ui/Divider';
import Subheader from 'material-ui/Subheader';
export default class RecentTorrents extends Component {
- constructor() {
- super()
- this.torrents = [];
- }
- componentDidMount() {
- window.torrentSocket.emit('feed', window.customLoader((data) => {
- if(data) {
- this.torrents = data;
- console.log(data)
- this.forceUpdate();
- }
- }))
- }
- render() {
- return (
-
-
- {__('Feed')}
-
-
- {
- this.torrents.map((torrent, index) =>{
- return ;
- })
- }
-
- );
- }
+ constructor() {
+ super()
+ this.torrents = [];
+ }
+ componentDidMount() {
+ window.torrentSocket.emit('feed', window.customLoader((data) => {
+ if(data) {
+ this.torrents = data;
+ console.log(data)
+ this.forceUpdate();
+ }
+ }))
+ }
+ render() {
+ return (
+
+
+ {__('Feed')}
+
+
+ {
+ this.torrents.map((torrent, index) =>{
+ return ;
+ })
+ }
+
+ );
+ }
}
diff --git a/src/app/filters-page.js b/src/app/filters-page.js
index 3fb82ef..43c999d 100644
--- a/src/app/filters-page.js
+++ b/src/app/filters-page.js
@@ -11,182 +11,182 @@ import MenuItem from 'material-ui/MenuItem';
import fs from 'fs'
export default class ConfigPage extends Page {
- constructor(props) {
- super(props)
- this.setTitle('Rats filters');
- this.options = {}
- }
- componentDidMount() {
- this.loadSettings()
- }
- loadSettings() {
- window.torrentSocket.emit('config', window.customLoader((options) => {
- this.options = options;
- console.log(this.options)
- this.forceUpdate();
- }));
- }
- saveSettings() {
- window.torrentSocket.emit('setConfig', this.options)
- this.settingsSavedMessage = true
- this.forceUpdate()
- setTimeout(() => {
- this.settingsSavedMessage = false
- this.forceUpdate()
- }, 1000)
- }
- render() {
- return (
-
-
- {
- window.router('/')
- }} />
-
+ constructor(props) {
+ super(props)
+ this.setTitle('Rats filters');
+ this.options = {}
+ }
+ componentDidMount() {
+ this.loadSettings()
+ }
+ loadSettings() {
+ window.torrentSocket.emit('config', window.customLoader((options) => {
+ this.options = options;
+ console.log(this.options)
+ this.forceUpdate();
+ }));
+ }
+ saveSettings() {
+ window.torrentSocket.emit('setConfig', this.options)
+ this.settingsSavedMessage = true
+ this.forceUpdate()
+ setTimeout(() => {
+ this.settingsSavedMessage = false
+ this.forceUpdate()
+ }, 1000)
+ }
+ render() {
+ return (
+
+
+ {
+ window.router('/')
+ }} />
+
-
+
-
-
-
{__('Max files per torrent')} ({__('current')}: {this.options.filters && this.options.filters.maxFiles})
-
{
- this.options.filters.maxFiles = value
- this.forceUpdate()
- }}
- />
- {
- if(!this.options.filters)
- return
+
+
+
{__('Max files per torrent')} ({__('current')}: {this.options.filters && this.options.filters.maxFiles})
+
{
+ this.options.filters.maxFiles = value
+ this.forceUpdate()
+ }}
+ />
+ {
+ if(!this.options.filters)
+ return
- this.options.filters.maxFiles = parseInt(value)
- this.forceUpdate()
- }}
- />
-
-
* 0 - {__('Disabled')}.
-
-
+ this.options.filters.maxFiles = parseInt(value)
+ this.forceUpdate()
+ }}
+ />
+
+
* 0 - {__('Disabled')}.
+
+
-
-
-
{__('Torrent name regular extension filtering')}
-
{
- if(!this.options.filters)
- return
+
+
+
{__('Torrent name regular extension filtering')}
+
{
+ if(!this.options.filters)
+ return
- this.options.filters.namingRegExp = value
- this.forceUpdate()
- }}
- />
- {
- if(!this.options.filters)
- return
+ this.options.filters.namingRegExp = value
+ this.forceUpdate()
+ }}
+ />
+ {
+ if(!this.options.filters)
+ return
- this.options.filters.namingRegExp = value
- this.forceUpdate()
- }}
- >
- \u0400-\u04FF]+$`} primaryText={__('Russian + English only (With symbols)')} />
- ]+$'} primaryText={__('English only (With symbols)')} />
-
-
-
-
{
- if(!this.options.filters)
- return
+ this.options.filters.namingRegExp = value
+ this.forceUpdate()
+ }}
+ >
+ \u0400-\u04FF]+$`} primaryText={__('Russian + English only (With symbols)')} />
+ ]+$'} primaryText={__('English only (With symbols)')} />
+
+
+
+ {
+ if(!this.options.filters)
+ return
- this.options.filters.namingRegExpNegative = checked
- this.forceUpdate()
- }}
- />
-
+ this.options.filters.namingRegExpNegative = checked
+ this.forceUpdate()
+ }}
+ />
+
* - {__('clean string means disabled')}
-
-
+
+
-
{
- if(!this.options.filters)
- return
+ {
+ if(!this.options.filters)
+ return
- this.options.filters.adultFilter = checked
- this.forceUpdate()
- }}
- />
+ this.options.filters.adultFilter = checked
+ this.forceUpdate()
+ }}
+ />
- {
- this.toRemoveProbably && this.toRemoveProbably > 0
- ?
- {__('Torrents to clean')}: {this.toRemoveProbably}
- :
- null
- }
- {
- this.toRemove && this.toRemove > 0
- ?
- {__('Torrents cleaned')}: {this.toRemove}
- :
- null
- }
+ {
+ this.toRemoveProbably && this.toRemoveProbably > 0
+ ?
+ {__('Torrents to clean')}: {this.toRemoveProbably}
+ :
+ null
+ }
+ {
+ this.toRemove && this.toRemove > 0
+ ?
+ {__('Torrents cleaned')}: {this.toRemove}
+ :
+ null
+ }
- {
- this.settingsSavedMessage
+ {
+ this.settingsSavedMessage
&&
{__('Settings saved')}
- }
+ }
-
- {
- window.torrentSocket.emit('removeTorrents', true, window.customLoader((toRemove) => {
- this.toRemoveProbably = toRemove
- this.forceUpdate()
- }));
- }} />
- {
- window.torrentSocket.emit('removeTorrents', false, window.customLoader((toRemove) => {
- this.toRemove = toRemove
- this.forceUpdate()
- }));
- }} />
-
+
+ {
+ window.torrentSocket.emit('removeTorrents', true, window.customLoader((toRemove) => {
+ this.toRemoveProbably = toRemove
+ this.forceUpdate()
+ }));
+ }} />
+ {
+ window.torrentSocket.emit('removeTorrents', false, window.customLoader((toRemove) => {
+ this.toRemove = toRemove
+ this.forceUpdate()
+ }));
+ }} />
+
-
- {
- this.saveSettings()
- }} />
-
+
+ {
+ this.saveSettings()
+ }} />
+
-
+
-
- );
- }
+
+ );
+ }
}
diff --git a/src/app/footer.js b/src/app/footer.js
index 19616c5..b0f11f5 100644
--- a/src/app/footer.js
+++ b/src/app/footer.js
@@ -3,18 +3,18 @@ import React from 'react';
export default (props) => {
return (
-
+
+ c5.308,6.188,7.074,12.091,4.423,11.212c-2.66-0.896-13.267-7.08-45.104-2.066c-4.126,1.17-21.221-12.682-44.513-12.977
+ c-23.283-0.295-40.381,6.346-64.85,72.296c-2.356,5.828-18.866,19.386-27.71,25.865C3.536,162.529,0.007,169.787,0,182.763
+ c-0.018,18.158,25.934,27.187,81.648,26.889c55.715-0.292,85.195-9.388,85.195-9.388c-62.789,6.773-158.907,10.52-158.907-18.687
+ c0-20.641,28.321-28.47,36.281-28.184c7.958,0.3,13.562,12.673,33.307,5.603c3.247-0.295,1.48,4.423-1.18,7.369
+ c-2.651,2.942-0.586,6.487,9.73,6.487c10.315,0,41.183,0.295,47.707,0c6.531-0.299,11.839-11.792-9.384-12.68
+ c-18.548,0.311,12.023-5.773,15.915-21.813c0.709-3.927,8.84-4.139,15.918-4.119c20.777,0.029,34.485,38.193,38.912,38.338
+ c4.416,0.15,17.979,1.621,17.683-4.273c-0.292-5.897-11.491-3.241-13.854-6.487c-2.359-3.234-10.023-15.504-7.366-21.104
+ c2.65-5.59,12.674-21.229,24.463-22.988c11.789-1.777,42.451,7.361,47.459,0c5.012-7.372-6.783-11.512-15.918-28.611
+ C243.779,80.572,238.768,71.728,220.195,71.427z"/>
-
+
)
}
\ No newline at end of file
diff --git a/src/app/format-bytes.js b/src/app/format-bytes.js
index d902356..e5905a3 100644
--- a/src/app/format-bytes.js
+++ b/src/app/format-bytes.js
@@ -1,8 +1,8 @@
export default function formatBytes(bytes,decimals) {
- if(bytes == 0) return '0 Byte';
- var k = 1000; // or 1024 for binary
- var dm = decimals + 1 || 3;
- var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
- var i = Math.floor(Math.log(bytes) / Math.log(k));
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
+ if(bytes == 0) return '0 Byte';
+ var k = 1000; // or 1024 for binary
+ var dm = decimals + 1 || 3;
+ var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
+ var i = Math.floor(Math.log(bytes) / Math.log(k));
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}
\ No newline at end of file
diff --git a/src/app/header.js b/src/app/header.js
index 72e0d51..d68b3ea 100644
--- a/src/app/header.js
+++ b/src/app/header.js
@@ -5,64 +5,64 @@ import RaisedButton from 'material-ui/RaisedButton';
import Search from './search'
class Header extends React.Component {
- constructor(props)
- {
- super(props)
- this.header = React.createRef();
- }
- componentDidMount()
- {
+ constructor(props)
+ {
+ super(props)
+ this.header = React.createRef();
+ }
+ componentDidMount()
+ {
window.onscroll = () => {
if (window.pageYOffset >= 15)
{
- const scrollHeight = Math.max(
- document.body.scrollHeight, document.documentElement.scrollHeight,
- document.body.offsetHeight, document.documentElement.offsetHeight,
- document.body.clientHeight, document.documentElement.clientHeight
- );
+ const scrollHeight = Math.max(
+ document.body.scrollHeight, document.documentElement.scrollHeight,
+ document.body.offsetHeight, document.documentElement.offsetHeight,
+ document.body.clientHeight, document.documentElement.clientHeight
+ );
- if(scrollHeight - 240 < document.documentElement.clientHeight)
- {
- return
- }
+ if(scrollHeight - 240 < document.documentElement.clientHeight)
+ {
+ return
+ }
if(!this.stickyHeader)
{
- this.stickyHeader = true
- this.header.current.classList.add("sticky");
+ this.stickyHeader = true
+ this.header.current.classList.add("sticky");
}
}
else
{
if(this.stickyHeader)
{
- this.stickyHeader = false
- this.header.current.classList.remove("sticky");
+ this.stickyHeader = false
+ this.header.current.classList.remove("sticky");
}
}
};
- }
- componentWillUnmount()
- {
- window.onscroll = null
- }
+ }
+ componentWillUnmount()
+ {
+ window.onscroll = null
+ }
- render()
- {
- return (
-