Reddit Downloader

Download your saved posts or directly posts from your feed with support for Direct links (png, jpg, gif, mp4...), (Gypcat kinda), Redgify, Imgur (Only when supplied with an API key)

当前为 2020-10-22 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Reddit Downloader
  3. // @namespace https://github.com/felixire/Reddit-Downloader
  4. // @version 0.2.1
  5. // @description Download your saved posts or directly posts from your feed with support for Direct links (png, jpg, gif, mp4...), (Gypcat kinda), Redgify, Imgur (Only when supplied with an API key)
  6. // @author felixire
  7. // @match https://www.reddit.com/*
  8. // @match https://reddit.com/*
  9. // @match https://www.old.reddit.com/*
  10. // @match https://old.reddit.com/*
  11. // @match https://www.new.reddit.com/*
  12. // @match https://new.reddit.com/*
  13. // @require https://greasyfork.org/scripts/28536-gm-config/code/GM_config.js?version=184529
  14. // @grant GM_download
  15. // @grant GM_notification
  16. // @grant GM_setValue
  17. // @grant GM_getValue
  18. // @grant GM_registerMenuCommand
  19. // ==/UserScript==
  20.  
  21. const DEBUG = false;
  22. let _LastDownloadedID = GM_getValue('LastDownloaded', '');
  23.  
  24. let _IsOnUserPage = false;
  25.  
  26. //#region Helpers
  27. function wait(ms) {
  28. return new Promise(res => setTimeout(res, ms));
  29. }
  30.  
  31. function randomName(length = 16) {
  32. let chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  33. let name = '';
  34. for (let index = 0; index < length; index++) {
  35. let ind = Math.floor(Math.random() * chars.length);
  36. name += chars.charAt(ind);
  37. }
  38. return name;
  39. }
  40.  
  41. function waitForElements(selectors, timeout = 1000) {
  42. return new Promise(async (res, rej) => {
  43. let time = 0;
  44. if (!Array.isArray(selectors))
  45. selectors = [selectors];
  46.  
  47. let eles = [];
  48.  
  49. selectors.forEach(async (sel, i) => {
  50. let ele = document.querySelector(sel.trim());
  51. while (ele == null || ele == undefined) {
  52. if (time >= timeout) {
  53. //console.error("Timed out while waiting for: " + sel);
  54. rej("Timed out while waiting for: " + sel);
  55. return;
  56. }
  57.  
  58. time += 10;
  59. await wait(10);
  60. ele = document.querySelector(sel);
  61. }
  62. eles.push(ele);
  63. if (i == (selectors.length - 1))
  64. res(eles);
  65. return;
  66. });
  67. })
  68. }
  69.  
  70. function createNotification(title, text) {
  71. GM_notification({
  72. title,
  73. text,
  74. timeout: 5000
  75. })
  76. }
  77.  
  78. function isOldReddit(){
  79. return new Promise((res) => {
  80. if (window.location.href.includes('old.reddit.com')){
  81. res(true);
  82. return true;
  83. }
  84. if (window.location.href.includes('new.reddit.com')){
  85. res(false);
  86. return false;
  87. }
  88. //Old page
  89. waitForElements('.redesign-beta-optin', 5000)
  90. .then(() => {
  91. res(true);
  92. return true;
  93. }).catch(() => {})
  94.  
  95. //New page
  96. waitForElements('#SHORTCUT_FOCUSABLE_DIV', 5000)
  97. .then(() => {
  98. res(false);
  99. return false;
  100. }).catch(() => {})
  101. })
  102. }
  103.  
  104. //#endregion
  105.  
  106. //#region Supported Downloaders
  107. class DownloadSite {
  108. constructor() {
  109.  
  110. }
  111.  
  112. checkSupport(href) {
  113. throw new Error('NOT IMPLEMENTD!');
  114. }
  115.  
  116. async downloadImages(info, folder = '') {
  117. return new Promise(async res => {
  118. let url = this._removeParams(info.url);
  119. let links = await this.getDownloadLinks(url);
  120. if (!Array.isArray(links)) links = [links];
  121. if (links.length > 1)
  122. await this._downloadBulk(links, folder, `/${randomName()}/`);
  123. else
  124. await this._downloadBulk(links, folder);
  125. // if(links.length > 1)
  126. // else
  127. // this._download(links[0], folder);
  128.  
  129. res();
  130. });
  131. }
  132.  
  133. /**
  134. * @return {Promise<Array<string>>}
  135. */
  136. getDownloadLinks(href) {
  137. throw new Error('NOT IMPLEMENTD!');
  138. }
  139.  
  140. _getExtension(href) {
  141. return href.replace(/.*\./, '');
  142. }
  143.  
  144. _getParams(href) {
  145. return href.match(/\?.*/gim);
  146. }
  147.  
  148. _removeAmpSymbols(href) {
  149. return href.replace(/amp;/gim, '');
  150. }
  151.  
  152. _removeParams(href) {
  153. return href.replace(/\?.*/gim, '');
  154. }
  155.  
  156. async _downloadBulk(links, folder = '', locationAppend = '') {
  157. return new Promise(async res => {
  158. for (let index = 0; index < links.length; index++) {
  159. const url = links[index];
  160. const params = this._getParams(url);
  161. const pureUrl = this._removeParams(url);
  162. const name = (links.length > 1 ? `[${index}]` : '') + `${randomName()}`;
  163.  
  164. this._download({
  165. url: url,
  166. folder,
  167. locationAppend,
  168. name,
  169. extension: this._getExtension(pureUrl)
  170. });
  171. await wait(100);
  172. }
  173.  
  174. res();
  175. })
  176. }
  177.  
  178. //_download(url, folder='', name=randomName(), locationAppend=''){
  179. _download(infos) {
  180. let folder = ((infos.folder != '' && infos.folder != null && infos.folder != undefined) ? `/${infos.folder}/` : '');
  181. let locationAppend = ((infos.locationAppend != null && infos.locationAppend != undefined) ? infos.locationAppend : '');
  182. let name = (infos.name != '' && infos.name != null && infos.name != undefined) ? infos.name : randomName();
  183. let downloadLocation = GM_config.get('download_location').substr(-1) != '/' ? GM_config.get('download_location')+'/' : GM_config.get('download_location');
  184.  
  185. let details = {
  186. url: infos.url,
  187. name: downloadLocation + folder + locationAppend + name + '.' + infos.extension,
  188. saveAs: false
  189. }
  190.  
  191. GM_download(details);
  192. }
  193. }
  194.  
  195. class DirectDownload extends DownloadSite {
  196. constructor() {
  197. super();
  198. this.supportedExtensions = ['png', 'jpg', 'jpeg', 'gif', 'gifv', 'mp4', 'mp3'];
  199. }
  200.  
  201. checkSupport(href) {
  202. return this.supportedExtensions.includes(this._getExtension(href));
  203. }
  204.  
  205. getDownloadLinks(href) {
  206. if (href.endsWith('.gifv')) href = href.replace('gifv', 'mp4');
  207. return [href];
  208. }
  209. }
  210.  
  211. class RedditGallery extends DownloadSite {
  212. constructor() {
  213. super();
  214. }
  215.  
  216. async downloadImages(info, folder) {
  217. return new Promise(async res => {
  218. let postJSON = await window.RedditDownloader._getPostData(info.og_url);
  219. let media_metadata = postJSON[0].data.children[0].data.media_metadata;
  220. if (media_metadata == null || media_metadata == undefined) {
  221. media_metadata = postJSON[0].data.children[0].data.crosspost_parent_list[0].media_metadata;
  222. }
  223.  
  224. let media_keys = Object.keys(media_metadata);
  225. let links = [];
  226.  
  227. for (let i = 0; i < media_keys.length; i++) {
  228. const key = media_keys[i];
  229. const url = media_metadata[key].s.u;
  230.  
  231. links.push(this._removeAmpSymbols(url));
  232. }
  233.  
  234. if (!Array.isArray(links)) links = [links];
  235. if (links.length > 1)
  236. await this._downloadBulk(links, folder, `/${randomName()}/`);
  237. else
  238. await this._downloadBulk(links, folder);
  239. // if(links.length > 1)
  240. // else{
  241. // let infos = {}
  242. // this._download(links[0], folder);
  243. // }
  244.  
  245. res();
  246. });
  247. }
  248.  
  249. checkSupport(href) {
  250. console.log('-----------------')
  251. console.log(href.includes('reddit.com/gallery/'));
  252. return (href.includes('reddit.com/gallery/'));
  253. }
  254. }
  255.  
  256. class Imgur extends DownloadSite {
  257. constructor() {
  258. super();
  259.  
  260. this._ApiEndpoint = 'https://api.imgur.com/3/';
  261. }
  262.  
  263. checkSupport(href) {
  264. return (href.includes('imgur.com/') && !href.includes('i.imgur.com/'));
  265. }
  266.  
  267. getDownloadLinks(href) {
  268. let id = href.replace(/.*\//igm, '');
  269. let isAlbum = href.replace(/.*imgur.com\//igm, '').startsWith('a');
  270. return isAlbum ? this.getAlbumLinks(id) : this.getGalleryLinks(id);
  271. }
  272.  
  273. getGalleryLinks(galleryID) {
  274. return new Promise((res, rej) => {
  275. if (!GM_config.get('imgur_client_id')) {
  276. rej('NO CLIENT ID!');
  277. return;
  278. }
  279. fetch(this._ApiEndpoint + `gallery/${galleryID}/images?client_id=${GM_config.get('imgur_client_id')}`)
  280. .then(body => body.text())
  281. .then(text => {
  282. let data = JSON.parse(text);
  283. if (data.data.images == undefined) {
  284. res([]);
  285. return;
  286. }
  287. let links = data.data.images.reduce((a, c) => {
  288. console.log(a, c);
  289. a.push(c.link);
  290. return a;
  291. }, []);
  292.  
  293.  
  294. console.log(links)
  295. res(links);
  296. });
  297. })
  298. }
  299.  
  300. getAlbumLinks(albumID) {
  301. return new Promise((res, rej) => {
  302. if (!GM_config.get('imgur_client_id')) {
  303. rej('NO CLIENT ID!');
  304. return;
  305. }
  306. fetch(this._ApiEndpoint + `album/${albumID}/images?client_id=${GM_config.get('imgur_client_id')}`)
  307. .then(body => body.text())
  308. .then(text => {
  309. let data = JSON.parse(text);
  310. let links = data.data.reduce((a, c) => {
  311. a.push(c.link);
  312. return a;
  313. }, []);
  314.  
  315. res(links);
  316. });
  317. })
  318. }
  319. }
  320.  
  321. class Gfycat extends DownloadSite {
  322. constructor() {
  323. super();
  324. }
  325.  
  326. checkSupport(href) {
  327. return (href.includes('//gfycat.com/') || href.includes('www.gfycat.com/'));
  328. }
  329.  
  330. getDownloadLinks(href) {
  331. //media => oembed => thumbnail_url
  332. //https://thumbs.gfycat.com/<ID>-size_restricted.gif
  333.  
  334. return href.replace('thumbs', 'giant').replace('-size_restricted.gif', '.mp4');
  335. }
  336. }
  337.  
  338. class Redgifs extends DownloadSite {
  339. constructor() {
  340. super();
  341.  
  342. this.gypcatList = [
  343. 'aardvark',
  344. 'aardwolf',
  345. 'abalone',
  346. 'abyssiniancat',
  347. 'abyssiniangroundhornbill',
  348. 'acaciarat',
  349. 'achillestang',
  350. 'acornbarnacle',
  351. 'acornweevil',
  352. 'acornwoodpecker',
  353. 'acouchi',
  354. 'adamsstaghornedbeetle',
  355. 'addax',
  356. 'adder',
  357. 'adeliepenguin',
  358. 'admiralbutterfly',
  359. 'adouri',
  360. 'aegeancat',
  361. 'affenpinscher',
  362. 'afghanhound',
  363. 'africanaugurbuzzard',
  364. 'africanbushviper',
  365. 'africancivet',
  366. 'africanclawedfrog',
  367. 'africanelephant',
  368. 'africanfisheagle',
  369. 'africangoldencat',
  370. 'africangroundhornbill',
  371. 'africanharrierhawk',
  372. 'africanhornbill',
  373. 'africanjacana',
  374. 'africanmolesnake',
  375. 'africanparadiseflycatcher',
  376. 'africanpiedkingfisher',
  377. 'africanporcupine',
  378. 'africanrockpython',
  379. 'africanwildcat',
  380. 'africanwilddog',
  381. 'agama',
  382. 'agouti',
  383. 'aidi',
  384. 'airedale',
  385. 'airedaleterrier',
  386. 'akitainu',
  387. 'alabamamapturtle',
  388. 'alaskajingle',
  389. 'alaskanhusky',
  390. 'alaskankleekai',
  391. 'alaskanmalamute',
  392. 'albacoretuna',
  393. 'albatross',
  394. 'albertosaurus',
  395. 'albino',
  396. 'aldabratortoise',
  397. 'allensbigearedbat',
  398. 'alleycat',
  399. 'alligator',
  400. 'alligatorgar',
  401. 'alligatorsnappingturtle',
  402. 'allosaurus',
  403. 'alpaca',
  404. 'alpinegoat',
  405. 'alpineroadguidetigerbeetle',
  406. 'altiplanochinchillamouse',
  407. 'amazondolphin',
  408. 'amazonparrot',
  409. 'amazontreeboa',
  410. 'amberpenshell',
  411. 'ambushbug',
  412. 'americanalligator',
  413. 'americanavocet',
  414. 'americanbadger',
  415. 'americanbittern',
  416. 'americanblackvulture',
  417. 'americanbobtail',
  418. 'americanbulldog',
  419. 'americancicada',
  420. 'americancrayfish',
  421. 'americancreamdraft',
  422. 'americancrocodile',
  423. 'americancrow',
  424. 'americancurl',
  425. 'americangoldfinch',
  426. 'americanindianhorse',
  427. 'americankestrel',
  428. 'americanlobster',
  429. 'americanmarten',
  430. 'americanpainthorse',
  431. 'americanquarterhorse',
  432. 'americanratsnake',
  433. 'americanredsquirrel',
  434. 'americanriverotter',
  435. 'americanrobin',
  436. 'americansaddlebred',
  437. 'americanshorthair',
  438. 'americantoad',
  439. 'americanwarmblood',
  440. 'americanwigeon',
  441. 'americanwirehair',
  442. 'amethystgemclam',
  443. 'amethystinepython',
  444. 'amethystsunbird',
  445. 'ammonite',
  446. 'amoeba',
  447. 'amphibian',
  448. 'amphiuma',
  449. 'amurminnow',
  450. 'amurratsnake',
  451. 'amurstarfish',
  452. 'anaconda',
  453. 'anchovy',
  454. 'andalusianhorse',
  455. 'andeancat',
  456. 'andeancockoftherock',
  457. 'andeancondor',
  458. 'anemone',
  459. 'anemonecrab',
  460. 'anemoneshrimp',
  461. 'angelfish',
  462. 'angelwingmussel',
  463. 'anglerfish',
  464. 'angora',
  465. 'angwantibo',
  466. 'anhinga',
  467. 'ankole',
  468. 'ankolewatusi',
  469. 'annashummingbird',
  470. 'annelid',
  471. 'annelida',
  472. 'anole',
  473. 'anophelesmosquito',
  474. 'ant',
  475. 'antarcticfurseal',
  476. 'antarcticgiantpetrel',
  477. 'antbear',
  478. 'anteater',
  479. 'antelope',
  480. 'antelopegroundsquirrel',
  481. 'antipodesgreenparakeet',
  482. 'antlion',
  483. 'anura',
  484. 'aoudad',
  485. 'apatosaur',
  486. 'ape',
  487. 'aphid',
  488. 'apisdorsatalaboriosa',
  489. 'aplomadofalcon',
  490. 'appaloosa',
  491. 'aquaticleech',
  492. 'arabianhorse',
  493. 'arabianoryx',
  494. 'arabianwildcat',
  495. 'aracari',
  496. 'arachnid',
  497. 'arawana',
  498. 'archaeocete',
  499. 'archaeopteryx',
  500. 'archerfish',
  501. 'arcticduck',
  502. 'arcticfox',
  503. 'arctichare',
  504. 'arcticseal',
  505. 'arcticwolf',
  506. 'argali',
  507. 'argentinehornedfrog',
  508. 'argentineruddyduck',
  509. 'argusfish',
  510. 'arieltoucan',
  511. 'arizonaalligatorlizard',
  512. 'arkshell',
  513. 'armadillo',
  514. 'armedcrab',
  515. 'armednylonshrimp',
  516. 'armyant',
  517. 'armyworm',
  518. 'arrowana',
  519. 'arrowcrab',
  520. 'arrowworm',
  521. 'arthropods',
  522. 'aruanas',
  523. 'asianconstablebutterfly',
  524. 'asiandamselfly',
  525. 'asianelephant',
  526. 'asianlion',
  527. 'asianpiedstarling',
  528. 'asianporcupine',
  529. 'asiansmallclawedotter',
  530. 'asiantrumpetfish',
  531. 'asianwaterbuffalo',
  532. 'asiaticgreaterfreshwaterclam',
  533. 'asiaticlesserfreshwaterclam',
  534. 'asiaticmouflon',
  535. 'asiaticwildass',
  536. 'asp',
  537. 'ass',
  538. 'assassinbug',
  539. 'astarte',
  540. 'astrangiacoral',
  541. 'atlanticblackgoby',
  542. 'atlanticbluetang',
  543. 'atlanticridleyturtle',
  544. 'atlanticsharpnosepuffer',
  545. 'atlanticspadefish',
  546. 'atlasmoth',
  547. 'attwatersprairiechicken',
  548. 'auk',
  549. 'auklet',
  550. 'aurochs',
  551. 'australiancattledog',
  552. 'australiancurlew',
  553. 'australianfreshwatercrocodile',
  554. 'australianfurseal',
  555. 'australiankelpie',
  556. 'australiankestrel',
  557. 'australianshelduck',
  558. 'australiansilkyterrier',
  559. 'austrianpinscher',
  560. 'avians',
  561. 'avocet',
  562. 'axisdeer',
  563. 'axolotl',
  564. 'ayeaye',
  565. 'aztecant',
  566. 'azurevase',
  567. 'azurevasesponge',
  568. 'azurewingedmagpie',
  569. 'babirusa',
  570. 'baboon',
  571. 'backswimmer',
  572. 'bactrian',
  573. 'badger',
  574. 'bagworm',
  575. 'baiji',
  576. 'baldeagle',
  577. 'baleenwhale',
  578. 'balloonfish',
  579. 'ballpython',
  580. 'bandicoot',
  581. 'bangeltiger',
  582. 'bantamrooster',
  583. 'banteng',
  584. 'barasinga',
  585. 'barasingha',
  586. 'barb',
  587. 'barbet',
  588. 'barebirdbat',
  589. 'barnacle',
  590. 'barnowl',
  591. 'barnswallow',
  592. 'barracuda',
  593. 'basenji',
  594. 'basil',
  595. 'basilisk',
  596. 'bass',
  597. 'bassethound',
  598. 'bat',
  599. 'bats',
  600. 'beagle',
  601. 'bear',
  602. 'beardedcollie',
  603. 'beardeddragon',
  604. 'beauceron',
  605. 'beaver',
  606. 'bedbug',
  607. 'bedlingtonterrier',
  608. 'bee',
  609. 'beetle',
  610. 'bellfrog',
  611. 'bellsnake',
  612. 'belugawhale',
  613. 'bengaltiger',
  614. 'bergerpicard',
  615. 'bernesemountaindog',
  616. 'betafish',
  617. 'bettong',
  618. 'bichonfrise',
  619. 'bighorn',
  620. 'bighornedsheep',
  621. 'bighornsheep',
  622. 'bigmouthbass',
  623. 'bilby',
  624. 'billygoat',
  625. 'binturong',
  626. 'bird',
  627. 'birdofparadise',
  628. 'bison',
  629. 'bittern',
  630. 'blackandtancoonhound',
  631. 'blackbear',
  632. 'blackbird',
  633. 'blackbuck',
  634. 'blackcrappie',
  635. 'blackfish',
  636. 'blackfly',
  637. 'blackfootedferret',
  638. 'blacklab',
  639. 'blacklemur',
  640. 'blackmamba',
  641. 'blacknorwegianelkhound',
  642. 'blackpanther',
  643. 'blackrhino',
  644. 'blackrussianterrier',
  645. 'blackwidowspider',
  646. 'blesbok',
  647. 'blobfish',
  648. 'blowfish',
  649. 'blueandgoldmackaw',
  650. 'bluebird',
  651. 'bluebottle',
  652. 'bluebottlejellyfish',
  653. 'bluebreastedkookaburra',
  654. 'bluefintuna',
  655. 'bluefish',
  656. 'bluegill',
  657. 'bluejay',
  658. 'bluemorphobutterfly',
  659. 'blueshark',
  660. 'bluet',
  661. 'bluetickcoonhound',
  662. 'bluetonguelizard',
  663. 'bluewhale',
  664. 'boa',
  665. 'boaconstrictor',
  666. 'boar',
  667. 'bobcat',
  668. 'bobolink',
  669. 'bobwhite',
  670. 'boilweevil',
  671. 'bongo',
  672. 'bonobo',
  673. 'booby',
  674. 'bordercollie',
  675. 'borderterrier',
  676. 'borer',
  677. 'borzoi',
  678. 'boto',
  679. 'boubou',
  680. 'boutu',
  681. 'bovine',
  682. 'brahmanbull',
  683. 'brahmancow',
  684. 'brant',
  685. 'bream',
  686. 'brocketdeer',
  687. 'bronco',
  688. 'brontosaurus',
  689. 'brownbear',
  690. 'brownbutterfly',
  691. 'bubblefish',
  692. 'buck',
  693. 'buckeyebutterfly',
  694. 'budgie',
  695. 'bufeo',
  696. 'buffalo',
  697. 'bufflehead',
  698. 'bug',
  699. 'bull',
  700. 'bullfrog',
  701. 'bullmastiff',
  702. 'bumblebee',
  703. 'bunny',
  704. 'bunting',
  705. 'burro',
  706. 'bushbaby',
  707. 'bushsqueaker',
  708. 'bustard',
  709. 'butterfly',
  710. 'buzzard',
  711. 'caecilian',
  712. 'caiman',
  713. 'caimanlizard',
  714. 'calf',
  715. 'camel',
  716. 'canadagoose',
  717. 'canary',
  718. 'canine',
  719. 'canvasback',
  720. 'capeghostfrog',
  721. 'capybara',
  722. 'caracal',
  723. 'cardinal',
  724. 'caribou',
  725. 'carp',
  726. 'carpenterant',
  727. 'cassowary',
  728. 'cat',
  729. 'catbird',
  730. 'caterpillar',
  731. 'catfish',
  732. 'cats',
  733. 'cattle',
  734. 'caudata',
  735. 'cavy',
  736. 'centipede',
  737. 'cero',
  738. 'chafer',
  739. 'chameleon',
  740. 'chamois',
  741. 'chanticleer',
  742. 'cheetah',
  743. 'chevrotain',
  744. 'chick',
  745. 'chickadee',
  746. 'chicken',
  747. 'chihuahua',
  748. 'chimneyswift',
  749. 'chimpanzee',
  750. 'chinchilla',
  751. 'chinesecrocodilelizard',
  752. 'chipmunk',
  753. 'chital',
  754. 'chrysalis',
  755. 'chrysomelid',
  756. 'chuckwalla',
  757. 'chupacabra',
  758. 'cicada',
  759. 'cirriped',
  760. 'civet',
  761. 'clam',
  762. 'cleanerwrasse',
  763. 'clingfish',
  764. 'clownanemonefish',
  765. 'clumber',
  766. 'coati',
  767. 'cob',
  768. 'cobra',
  769. 'cock',
  770. 'cockatiel',
  771. 'cockatoo',
  772. 'cockerspaniel',
  773. 'cockroach',
  774. 'cod',
  775. 'coelacanth',
  776. 'collardlizard',
  777. 'collie',
  778. 'colt',
  779. 'comet',
  780. 'commabutterfly',
  781. 'commongonolek',
  782. 'conch',
  783. 'condor',
  784. 'coney',
  785. 'conure',
  786. 'cony',
  787. 'coot',
  788. 'cooter',
  789. 'copepod',
  790. 'copperbutterfly',
  791. 'copperhead',
  792. 'coqui',
  793. 'coral',
  794. 'cormorant',
  795. 'cornsnake',
  796. 'corydorascatfish',
  797. 'cottonmouth',
  798. 'cottontail',
  799. 'cougar',
  800. 'cow',
  801. 'cowbird',
  802. 'cowrie',
  803. 'coyote',
  804. 'coypu',
  805. 'crab',
  806. 'crane',
  807. 'cranefly',
  808. 'crayfish',
  809. 'creature',
  810. 'cricket',
  811. 'crocodile',
  812. 'crocodileskink',
  813. 'crossbill',
  814. 'crow',
  815. 'crownofthornsstarfish',
  816. 'crustacean',
  817. 'cub',
  818. 'cuckoo',
  819. 'cur',
  820. 'curassow',
  821. 'curlew',
  822. 'cuscus',
  823. 'cusimanse',
  824. 'cuttlefish',
  825. 'cutworm',
  826. 'cygnet',
  827. 'dachshund',
  828. 'daddylonglegs',
  829. 'dairycow',
  830. 'dalmatian',
  831. 'damselfly',
  832. 'danishswedishfarmdog',
  833. 'darklingbeetle',
  834. 'dartfrog',
  835. 'darwinsfox',
  836. 'dassie',
  837. 'dassierat',
  838. 'davidstiger',
  839. 'deer',
  840. 'deermouse',
  841. 'degu',
  842. 'degus',
  843. 'deinonychus',
  844. 'desertpupfish',
  845. 'devilfish',
  846. 'deviltasmanian',
  847. 'diamondbackrattlesnake',
  848. 'dikdik',
  849. 'dikkops',
  850. 'dingo',
  851. 'dinosaur',
  852. 'diplodocus',
  853. 'dipper',
  854. 'discus',
  855. 'dobermanpinscher',
  856. 'doctorfish',
  857. 'dodo',
  858. 'dodobird',
  859. 'doe',
  860. 'dog',
  861. 'dogfish',
  862. 'dogwoodclubgall',
  863. 'dogwoodtwigborer',
  864. 'dolphin',
  865. 'donkey',
  866. 'dorado',
  867. 'dore',
  868. 'dorking',
  869. 'dormouse',
  870. 'dotterel',
  871. 'douglasfirbarkbeetle',
  872. 'dove',
  873. 'dowitcher',
  874. 'drafthorse',
  875. 'dragon',
  876. 'dragonfly',
  877. 'drake',
  878. 'drever',
  879. 'dromaeosaur',
  880. 'dromedary',
  881. 'drongo',
  882. 'duck',
  883. 'duckbillcat',
  884. 'duckbillplatypus',
  885. 'duckling',
  886. 'dugong',
  887. 'duiker',
  888. 'dungbeetle',
  889. 'dungenesscrab',
  890. 'dunlin',
  891. 'dunnart',
  892. 'dutchshepherddog',
  893. 'dutchsmoushond',
  894. 'dwarfmongoose',
  895. 'dwarfrabbit',
  896. 'eagle',
  897. 'earthworm',
  898. 'earwig',
  899. 'easternglasslizard',
  900. 'easternnewt',
  901. 'easteuropeanshepherd',
  902. 'eastrussiancoursinghounds',
  903. 'eastsiberianlaika',
  904. 'echidna',
  905. 'eel',
  906. 'eelelephant',
  907. 'eeve',
  908. 'eft',
  909. 'egg',
  910. 'egret',
  911. 'eider',
  912. 'eidolonhelvum',
  913. 'ekaltadeta',
  914. 'eland',
  915. 'electriceel',
  916. 'elephant',
  917. 'elephantbeetle',
  918. 'elephantseal',
  919. 'elk',
  920. 'elkhound',
  921. 'elver',
  922. 'emeraldtreeskink',
  923. 'emperorpenguin',
  924. 'emperorshrimp',
  925. 'emu',
  926. 'englishpointer',
  927. 'englishsetter',
  928. 'equestrian',
  929. 'equine',
  930. 'erin',
  931. 'ermine',
  932. 'erne',
  933. 'eskimodog',
  934. 'esok',
  935. 'estuarinecrocodile',
  936. 'ethiopianwolf',
  937. 'europeanfiresalamander',
  938. 'europeanpolecat',
  939. 'ewe',
  940. 'eyas',
  941. 'eyelashpitviper',
  942. 'eyra',
  943. 'fairybluebird',
  944. 'fairyfly',
  945. 'falcon',
  946. 'fallowdeer',
  947. 'fantail',
  948. 'fanworms',
  949. 'fattaileddunnart',
  950. 'fawn',
  951. 'feline',
  952. 'fennecfox',
  953. 'ferret',
  954. 'fiddlercrab',
  955. 'fieldmouse',
  956. 'fieldspaniel',
  957. 'finch',
  958. 'finnishspitz',
  959. 'finwhale',
  960. 'fireant',
  961. 'firebelliedtoad',
  962. 'firecrest',
  963. 'firefly',
  964. 'fish',
  965. 'fishingcat',
  966. 'flamingo',
  967. 'flatcoatretriever',
  968. 'flatfish',
  969. 'flea',
  970. 'flee',
  971. 'flicker',
  972. 'flickertailsquirrel',
  973. 'flies',
  974. 'flounder',
  975. 'fluke',
  976. 'fly',
  977. 'flycatcher',
  978. 'flyingfish',
  979. 'flyingfox',
  980. 'flyinglemur',
  981. 'flyingsquirrel',
  982. 'foal',
  983. 'fossa',
  984. 'fowl',
  985. 'fox',
  986. 'foxhound',
  987. 'foxterrier',
  988. 'frenchbulldog',
  989. 'freshwatereel',
  990. 'frigatebird',
  991. 'frilledlizard',
  992. 'frillneckedlizard',
  993. 'fritillarybutterfly',
  994. 'frog',
  995. 'frogmouth',
  996. 'fruitbat',
  997. 'fruitfly',
  998. 'fugu',
  999. 'fulmar',
  1000. 'funnelweaverspider',
  1001. 'furseal',
  1002. 'gadwall',
  1003. 'galago',
  1004. 'galah',
  1005. 'galapagosalbatross',
  1006. 'galapagosdove',
  1007. 'galapagoshawk',
  1008. 'galapagosmockingbird',
  1009. 'galapagospenguin',
  1010. 'galapagossealion',
  1011. 'galapagostortoise',
  1012. 'gallinule',
  1013. 'gallowaycow',
  1014. 'gander',
  1015. 'gangesdolphin',
  1016. 'gannet',
  1017. 'gar',
  1018. 'gardensnake',
  1019. 'garpike',
  1020. 'gartersnake',
  1021. 'gaur',
  1022. 'gavial',
  1023. 'gazelle',
  1024. 'gecko',
  1025. 'geese',
  1026. 'gelada',
  1027. 'gelding',
  1028. 'gemsbok',
  1029. 'gemsbuck',
  1030. 'genet',
  1031. 'gentoopenguin',
  1032. 'gerbil',
  1033. 'gerenuk',
  1034. 'germanpinscher',
  1035. 'germanshepherd',
  1036. 'germanshorthairedpointer',
  1037. 'germanspaniel',
  1038. 'germanspitz',
  1039. 'germanwirehairedpointer',
  1040. 'gharial',
  1041. 'ghostshrimp',
  1042. 'giantschnauzer',
  1043. 'gibbon',
  1044. 'gilamonster',
  1045. 'giraffe',
  1046. 'glassfrog',
  1047. 'globefish',
  1048. 'glowworm',
  1049. 'gnat',
  1050. 'gnatcatcher',
  1051. 'gnu',
  1052. 'goa',
  1053. 'goat',
  1054. 'godwit',
  1055. 'goitered',
  1056. 'goldeneye',
  1057. 'goldenmantledgroundsquirrel',
  1058. 'goldenretriever',
  1059. 'goldfinch',
  1060. 'goldfish',
  1061. 'gonolek',
  1062. 'goose',
  1063. 'goosefish',
  1064. 'gopher',
  1065. 'goral',
  1066. 'gordonsetter',
  1067. 'gorilla',
  1068. 'goshawk',
  1069. 'gosling',
  1070. 'gossamerwingedbutterfly',
  1071. 'gourami',
  1072. 'grackle',
  1073. 'grasshopper',
  1074. 'grassspider',
  1075. 'grayfox',
  1076. 'grayling',
  1077. 'grayreefshark',
  1078. 'graysquirrel',
  1079. 'graywolf',
  1080. 'greatargus',
  1081. 'greatdane',
  1082. 'greathornedowl',
  1083. 'greatwhiteshark',
  1084. 'grebe',
  1085. 'greendarnerdragonfly',
  1086. 'greyhounddog',
  1087. 'grison',
  1088. 'grizzlybear',
  1089. 'grosbeak',
  1090. 'groundbeetle',
  1091. 'groundhog',
  1092. 'grouper',
  1093. 'grouse',
  1094. 'grub',
  1095. 'grunion',
  1096. 'guanaco',
  1097. 'guernseycow',
  1098. 'guillemot',
  1099. 'guineafowl',
  1100. 'guineapig',
  1101. 'gull',
  1102. 'guppy',
  1103. 'gypsymoth',
  1104. 'gyrfalcon',
  1105. 'hackee',
  1106. 'haddock',
  1107. 'hadrosaurus',
  1108. 'hagfish',
  1109. 'hairstreak',
  1110. 'hairstreakbutterfly',
  1111. 'hake',
  1112. 'halcyon',
  1113. 'halibut',
  1114. 'halicore',
  1115. 'hamadryad',
  1116. 'hamadryas',
  1117. 'hammerheadbird',
  1118. 'hammerheadshark',
  1119. 'hammerkop',
  1120. 'hamster',
  1121. 'hanumanmonkey',
  1122. 'hapuka',
  1123. 'hapuku',
  1124. 'harborporpoise',
  1125. 'harborseal',
  1126. 'hare',
  1127. 'harlequinbug',
  1128. 'harpseal',
  1129. 'harpyeagle',
  1130. 'harrier',
  1131. 'harrierhawk',
  1132. 'hart',
  1133. 'hartebeest',
  1134. 'harvestmen',
  1135. 'harvestmouse',
  1136. 'hatchetfish',
  1137. 'hawaiianmonkseal',
  1138. 'hawk',
  1139. 'hectorsdolphin',
  1140. 'hedgehog',
  1141. 'heifer',
  1142. 'hellbender',
  1143. 'hen',
  1144. 'herald',
  1145. 'herculesbeetle',
  1146. 'hermitcrab',
  1147. 'heron',
  1148. 'herring',
  1149. 'heterodontosaurus',
  1150. 'hind',
  1151. 'hippopotamus',
  1152. 'hoatzin',
  1153. 'hochstettersfrog',
  1154. 'hog',
  1155. 'hogget',
  1156. 'hoiho',
  1157. 'hoki',
  1158. 'homalocephale',
  1159. 'honeybadger',
  1160. 'honeybee',
  1161. 'honeycreeper',
  1162. 'honeyeater',
  1163. 'hookersealion',
  1164. 'hoopoe',
  1165. 'hornbill',
  1166. 'hornedtoad',
  1167. 'hornedviper',
  1168. 'hornet',
  1169. 'hornshark',
  1170. 'horse',
  1171. 'horsechestnutleafminer',
  1172. 'horsefly',
  1173. 'horsemouse',
  1174. 'horseshoebat',
  1175. 'horseshoecrab',
  1176. 'hound',
  1177. 'housefly',
  1178. 'hoverfly',
  1179. 'howlermonkey',
  1180. 'huemul',
  1181. 'huia',
  1182. 'human',
  1183. 'hummingbird',
  1184. 'humpbackwhale',
  1185. 'husky',
  1186. 'hydatidtapeworm',
  1187. 'hydra',
  1188. 'hyena',
  1189. 'hylaeosaurus',
  1190. 'hypacrosaurus',
  1191. 'hypsilophodon',
  1192. 'hyracotherium',
  1193. 'hyrax',
  1194. 'iaerismetalmark',
  1195. 'ibadanmalimbe',
  1196. 'iberianbarbel',
  1197. 'iberianchiffchaff',
  1198. 'iberianemeraldlizard',
  1199. 'iberianlynx',
  1200. 'iberianmidwifetoad',
  1201. 'iberianmole',
  1202. 'iberiannase',
  1203. 'ibex',
  1204. 'ibis',
  1205. 'ibisbill',
  1206. 'ibizanhound',
  1207. 'iceblueredtopzebra',
  1208. 'icefish',
  1209. 'icelandgull',
  1210. 'icelandichorse',
  1211. 'icelandicsheepdog',
  1212. 'ichidna',
  1213. 'ichneumonfly',
  1214. 'ichthyosaurs',
  1215. 'ichthyostega',
  1216. 'icterinewarbler',
  1217. 'iggypops',
  1218. 'iguana',
  1219. 'iguanodon',
  1220. 'illadopsis',
  1221. 'ilsamochadegu',
  1222. 'imago',
  1223. 'impala',
  1224. 'imperatorangel',
  1225. 'imperialeagle',
  1226. 'incatern',
  1227. 'inchworm',
  1228. 'indianabat',
  1229. 'indiancow',
  1230. 'indianelephant',
  1231. 'indianglassfish',
  1232. 'indianhare',
  1233. 'indianjackal',
  1234. 'indianpalmsquirrel',
  1235. 'indianpangolin',
  1236. 'indianrhinoceros',
  1237. 'indianringneckparakeet',
  1238. 'indianrockpython',
  1239. 'indianskimmer',
  1240. 'indianspinyloach',
  1241. 'indigobunting',
  1242. 'indigowingedparrot',
  1243. 'indochinahogdeer',
  1244. 'indochinesetiger',
  1245. 'indri',
  1246. 'indusriverdolphin',
  1247. 'inexpectatumpleco',
  1248. 'inganue',
  1249. 'insect',
  1250. 'intermediateegret',
  1251. 'invisiblerail',
  1252. 'iraniangroundjay',
  1253. 'iridescentshark',
  1254. 'iriomotecat',
  1255. 'irishdraughthorse',
  1256. 'irishredandwhitesetter',
  1257. 'irishsetter',
  1258. 'irishterrier',
  1259. 'irishwaterspaniel',
  1260. 'irishwolfhound',
  1261. 'irrawaddydolphin',
  1262. 'irukandjijellyfish',
  1263. 'isabellineshrike',
  1264. 'isabellinewheatear',
  1265. 'islandcanary',
  1266. 'islandwhistler',
  1267. 'isopod',
  1268. 'italianbrownbear',
  1269. 'italiangreyhound',
  1270. 'ivorybackedwoodswallow',
  1271. 'ivorybilledwoodpecker',
  1272. 'ivorygull',
  1273. 'izuthrush',
  1274. 'jabiru',
  1275. 'jackal',
  1276. 'jackrabbit',
  1277. 'jaeger',
  1278. 'jaguar',
  1279. 'jaguarundi',
  1280. 'janenschia',
  1281. 'japanesebeetle',
  1282. 'javalina',
  1283. 'jay',
  1284. 'jellyfish',
  1285. 'jenny',
  1286. 'jerboa',
  1287. 'joey',
  1288. 'johndory',
  1289. 'juliabutterfly',
  1290. 'jumpingbean',
  1291. 'junco',
  1292. 'junebug',
  1293. 'kagu',
  1294. 'kakapo',
  1295. 'kakarikis',
  1296. 'kangaroo',
  1297. 'karakul',
  1298. 'katydid',
  1299. 'kawala',
  1300. 'kentrosaurus',
  1301. 'kestrel',
  1302. 'kid',
  1303. 'killdeer',
  1304. 'killerwhale',
  1305. 'killifish',
  1306. 'kingbird',
  1307. 'kingfisher',
  1308. 'kinglet',
  1309. 'kingsnake',
  1310. 'kinkajou',
  1311. 'kiskadee',
  1312. 'kissingbug',
  1313. 'kite',
  1314. 'kitfox',
  1315. 'kitten',
  1316. 'kittiwake',
  1317. 'kitty',
  1318. 'kiwi',
  1319. 'koala',
  1320. 'koalabear',
  1321. 'kob',
  1322. 'kodiakbear',
  1323. 'koi',
  1324. 'komododragon',
  1325. 'koodoo',
  1326. 'kookaburra',
  1327. 'kouprey',
  1328. 'krill',
  1329. 'kronosaurus',
  1330. 'kudu',
  1331. 'kusimanse',
  1332. 'labradorretriever',
  1333. 'lacewing',
  1334. 'ladybird',
  1335. 'ladybug',
  1336. 'lamb',
  1337. 'lamprey',
  1338. 'langur',
  1339. 'lark',
  1340. 'larva',
  1341. 'laughingthrush',
  1342. 'lcont',
  1343. 'leafbird',
  1344. 'leafcutterant',
  1345. 'leafhopper',
  1346. 'leafwing',
  1347. 'leech',
  1348. 'lemming',
  1349. 'lemur',
  1350. 'leonberger',
  1351. 'leopard',
  1352. 'leopardseal',
  1353. 'leveret',
  1354. 'lhasaapso',
  1355. 'lice',
  1356. 'liger',
  1357. 'lightningbug',
  1358. 'limpet',
  1359. 'limpkin',
  1360. 'ling',
  1361. 'lion',
  1362. 'lionfish',
  1363. 'littlenightmonkeys',
  1364. 'lizard',
  1365. 'llama',
  1366. 'lobo',
  1367. 'lobster',
  1368. 'locust',
  1369. 'loggerheadturtle',
  1370. 'longhorn',
  1371. 'longhornbeetle',
  1372. 'longspur',
  1373. 'loon',
  1374. 'lorikeet',
  1375. 'loris',
  1376. 'louse',
  1377. 'lovebird',
  1378. 'lowchen',
  1379. 'lunamoth',
  1380. 'lungfish',
  1381. 'lynx',
  1382. 'lynxÂ',
  1383. 'macaque',
  1384. 'macaw',
  1385. 'macropod',
  1386. 'madagascarhissingroach',
  1387. 'maggot',
  1388. 'magpie',
  1389. 'maiasaura',
  1390. 'majungatholus',
  1391. 'malamute',
  1392. 'mallard',
  1393. 'maltesedog',
  1394. 'mamba',
  1395. 'mamenchisaurus',
  1396. 'mammal',
  1397. 'mammoth',
  1398. 'manatee',
  1399. 'mandrill',
  1400. 'mangabey',
  1401. 'manta',
  1402. 'mantaray',
  1403. 'mantid',
  1404. 'mantis',
  1405. 'mantisray',
  1406. 'manxcat',
  1407. 'mara',
  1408. 'marabou',
  1409. 'marbledmurrelet',
  1410. 'mare',
  1411. 'marlin',
  1412. 'marmoset',
  1413. 'marmot',
  1414. 'marten',
  1415. 'martin',
  1416. 'massasauga',
  1417. 'massospondylus',
  1418. 'mastiff',
  1419. 'mastodon',
  1420. 'mayfly',
  1421. 'meadowhawk',
  1422. 'meadowlark',
  1423. 'mealworm',
  1424. 'meerkat',
  1425. 'megalosaurus',
  1426. 'megalotomusquinquespinosus',
  1427. 'megaraptor',
  1428. 'merganser',
  1429. 'merlin',
  1430. 'metalmarkbutterfly',
  1431. 'metamorphosis',
  1432. 'mice',
  1433. 'microvenator',
  1434. 'midge',
  1435. 'milksnake',
  1436. 'milkweedbug',
  1437. 'millipede',
  1438. 'minibeast',
  1439. 'mink',
  1440. 'minnow',
  1441. 'mite',
  1442. 'moa',
  1443. 'mockingbird',
  1444. 'mole',
  1445. 'mollies',
  1446. 'mollusk',
  1447. 'molly',
  1448. 'monarch',
  1449. 'mongoose',
  1450. 'mongrel',
  1451. 'monkey',
  1452. 'monkfishÂ',
  1453. 'monoclonius',
  1454. 'montanoceratops',
  1455. 'moorhen',
  1456. 'moose',
  1457. 'moray',
  1458. 'morayeel',
  1459. 'morpho',
  1460. 'mosasaur',
  1461. 'mosquito',
  1462. 'moth',
  1463. 'motmot',
  1464. 'mouflon',
  1465. 'mountaincat',
  1466. 'mountainlion',
  1467. 'mouse',
  1468. 'mouse / mice',
  1469. 'mousebird',
  1470. 'mudpuppy',
  1471. 'mule',
  1472. 'mullet',
  1473. 'muntjac',
  1474. 'murrelet',
  1475. 'muskox',
  1476. 'muskrat',
  1477. 'mussaurus',
  1478. 'mussel',
  1479. 'mustang',
  1480. 'mutt',
  1481. 'myna',
  1482. 'mynah',
  1483. 'myotisÂ',
  1484. 'nabarlek',
  1485. 'nag',
  1486. 'naga',
  1487. 'nagapies',
  1488. 'nakedmolerat',
  1489. 'nandine',
  1490. 'nandoo',
  1491. 'nandu',
  1492. 'narwhal',
  1493. 'narwhale',
  1494. 'natterjacktoad',
  1495. 'nauplius',
  1496. 'nautilus',
  1497. 'needlefish',
  1498. 'needletail',
  1499. 'nematode',
  1500. 'nene',
  1501. 'neonblueguppy',
  1502. 'neonbluehermitcrab',
  1503. 'neondwarfgourami',
  1504. 'neonrainbowfish',
  1505. 'neonredguppy',
  1506. 'neontetra',
  1507. 'nerka',
  1508. 'nettlefish',
  1509. 'newfoundlanddog',
  1510. 'newt',
  1511. 'newtnutria',
  1512. 'nightcrawler',
  1513. 'nighthawk',
  1514. 'nightheron',
  1515. 'nightingale',
  1516. 'nightjar',
  1517. 'nijssenissdwarfchihlid',
  1518. 'nilgai',
  1519. 'ninebandedarmadillo',
  1520. 'noctilio',
  1521. 'noctule',
  1522. 'noddy',
  1523. 'noolbenger',
  1524. 'northerncardinals',
  1525. 'northernelephantseal',
  1526. 'northernflyingsquirrel',
  1527. 'northernfurseal',
  1528. 'northernhairynosedwombat',
  1529. 'northernpike',
  1530. 'northernseahorse',
  1531. 'northernspottedowl',
  1532. 'norwaylobster',
  1533. 'norwayrat',
  1534. 'nubiangoat',
  1535. 'nudibranch',
  1536. 'numbat',
  1537. 'nurseshark',
  1538. 'nutcracker',
  1539. 'nuthatch',
  1540. 'nutria',
  1541. 'nyala',
  1542. 'nymph',
  1543. 'ocelot',
  1544. 'octopus',
  1545. 'okapi',
  1546. 'olingo',
  1547. 'olm',
  1548. 'opossum',
  1549. 'orangutan',
  1550. 'orca',
  1551. 'oregonsilverspotbutterfly',
  1552. 'oriole',
  1553. 'oropendola',
  1554. 'oropendula',
  1555. 'oryx',
  1556. 'osprey',
  1557. 'ostracod',
  1558. 'ostrich',
  1559. 'otter',
  1560. 'ovenbird',
  1561. 'owl',
  1562. 'owlbutterfly',
  1563. 'ox',
  1564. 'oxen',
  1565. 'oxpecker',
  1566. 'oyster',
  1567. 'ozarkbigearedbat',
  1568. 'pacaÂ',
  1569. 'pachyderm',
  1570. 'pacificparrotlet',
  1571. 'paddlefish',
  1572. 'paintedladybutterfly',
  1573. 'panda',
  1574. 'pangolin',
  1575. 'panther',
  1576. 'paperwasp',
  1577. 'papillon',
  1578. 'parakeet',
  1579. 'parrot',
  1580. 'partridge',
  1581. 'peacock',
  1582. 'peafowl',
  1583. 'peccary',
  1584. 'pekingese',
  1585. 'pelican',
  1586. 'pelicinuspetrel',
  1587. 'penguin',
  1588. 'perch',
  1589. 'peregrinefalcon',
  1590. 'pewee',
  1591. 'phalarope',
  1592. 'pharaohhound',
  1593. 'pheasant',
  1594. 'phoebe',
  1595. 'phoenix',
  1596. 'pig',
  1597. 'pigeon',
  1598. 'piglet',
  1599. 'pika',
  1600. 'pike',
  1601. 'pikeperchÂ',
  1602. 'pilchard',
  1603. 'pinemarten',
  1604. 'pinkriverdolphin',
  1605. 'pinniped',
  1606. 'pintail',
  1607. 'pipistrelle',
  1608. 'pipit',
  1609. 'piranha',
  1610. 'pitbull',
  1611. 'pittabird',
  1612. 'plainsqueaker',
  1613. 'plankton',
  1614. 'planthopper',
  1615. 'platypus',
  1616. 'plover',
  1617. 'polarbear',
  1618. 'polecat',
  1619. 'polliwog',
  1620. 'polyp',
  1621. 'polyturator',
  1622. 'pomeranian',
  1623. 'pondskater',
  1624. 'pony',
  1625. 'pooch',
  1626. 'poodle',
  1627. 'porcupine',
  1628. 'porpoise',
  1629. 'portuguesemanofwar',
  1630. 'possum',
  1631. 'prairiedog',
  1632. 'prawn',
  1633. 'prayingmantid',
  1634. 'prayingmantis',
  1635. 'primate',
  1636. 'pronghorn',
  1637. 'pseudodynerusquadrisectus',
  1638. 'ptarmigan',
  1639. 'pterodactyls',
  1640. 'pterosaurs',
  1641. 'puffer',
  1642. 'pufferfish',
  1643. 'puffin',
  1644. 'pug',
  1645. 'pullet',
  1646. 'puma',
  1647. 'pupa',
  1648. 'pupfish',
  1649. 'puppy',
  1650. 'purplemarten',
  1651. 'pussycat',
  1652. 'pygmy',
  1653. 'python',
  1654. 'quadrisectus',
  1655. 'quagga',
  1656. 'quahog',
  1657. 'quail',
  1658. 'queenalexandrasbirdwing',
  1659. 'queenalexandrasbirdwingbutterfly',
  1660. 'queenant',
  1661. 'queenbee',
  1662. 'queenconch',
  1663. 'queenslandgrouper',
  1664. 'queenslandheeler',
  1665. 'queensnake',
  1666. 'quelea',
  1667. 'quetzal',
  1668. 'quetzalcoatlus',
  1669. 'quillback',
  1670. 'quinquespinosus',
  1671. 'quokka',
  1672. 'quoll',
  1673. 'rabbit',
  1674. 'rabidsquirrel',
  1675. 'raccoon',
  1676. 'racer',
  1677. 'racerunner',
  1678. 'ragfish',
  1679. 'rail',
  1680. 'rainbowfish',
  1681. 'rainbowlorikeet',
  1682. 'rainbowtrout',
  1683. 'ram',
  1684. 'raptors',
  1685. 'rasbora',
  1686. 'rat',
  1687. 'ratfish',
  1688. 'rattail',
  1689. 'rattlesnake',
  1690. 'raven',
  1691. 'ray',
  1692. 'redhead',
  1693. 'redheadedwoodpecker',
  1694. 'redpoll',
  1695. 'redstart',
  1696. 'redtailedhawk',
  1697. 'reindeer',
  1698. 'reptile',
  1699. 'reynard',
  1700. 'rhea',
  1701. 'rhesusmonkey',
  1702. 'rhino',
  1703. 'rhinoceros',
  1704. 'rhinocerosbeetle',
  1705. 'rhodesianridgeback',
  1706. 'ringtailedlemur',
  1707. 'ringworm',
  1708. 'riograndeescuerzo',
  1709. 'roach',
  1710. 'roadrunner',
  1711. 'roan',
  1712. 'robberfly',
  1713. 'robin',
  1714. 'rockrat',
  1715. 'rodent',
  1716. 'roebuck',
  1717. 'roller',
  1718. 'rook',
  1719. 'rooster',
  1720. 'rottweiler',
  1721. 'sable',
  1722. 'sableantelope',
  1723. 'sablefishÂ',
  1724. 'saiga',
  1725. 'sakimonkey',
  1726. 'salamander',
  1727. 'salmon',
  1728. 'saltwatercrocodile',
  1729. 'sambar',
  1730. 'samoyeddog',
  1731. 'sandbarshark',
  1732. 'sanddollar',
  1733. 'sanderling',
  1734. 'sandpiper',
  1735. 'sapsucker',
  1736. 'sardine',
  1737. 'sawfish',
  1738. 'scallop',
  1739. 'scarab',
  1740. 'scarletibis',
  1741. 'scaup',
  1742. 'schapendoes',
  1743. 'schipperke',
  1744. 'schnauzer',
  1745. 'scorpion',
  1746. 'scoter',
  1747. 'screamer',
  1748. 'seabird',
  1749. 'seagull',
  1750. 'seahog',
  1751. 'seahorse',
  1752. 'seal',
  1753. 'sealion',
  1754. 'seamonkey',
  1755. 'seaslug',
  1756. 'seaurchin',
  1757. 'senegalpython',
  1758. 'seriema',
  1759. 'serpent',
  1760. 'serval',
  1761. 'shark',
  1762. 'shearwater',
  1763. 'sheep',
  1764. 'sheldrake',
  1765. 'shelduck',
  1766. 'shibainu',
  1767. 'shihtzu',
  1768. 'shorebird',
  1769. 'shoveler',
  1770. 'shrew',
  1771. 'shrike',
  1772. 'shrimp',
  1773. 'siamang',
  1774. 'siamesecat',
  1775. 'siberiantiger',
  1776. 'sidewinder',
  1777. 'sifaka',
  1778. 'silkworm',
  1779. 'silverfish',
  1780. 'silverfox',
  1781. 'silversidefish',
  1782. 'siskin',
  1783. 'skimmer',
  1784. 'skink',
  1785. 'skipper',
  1786. 'skua',
  1787. 'skunk',
  1788. 'skylark',
  1789. 'sloth',
  1790. 'slothbear',
  1791. 'slug',
  1792. 'smelts',
  1793. 'smew',
  1794. 'snail',
  1795. 'snake',
  1796. 'snipe',
  1797. 'snoutbutterfly',
  1798. 'snowdog',
  1799. 'snowgeese',
  1800. 'snowleopard',
  1801. 'snowmonkey',
  1802. 'snowyowl',
  1803. 'sockeyesalmon',
  1804. 'solenodon',
  1805. 'solitaire',
  1806. 'songbird',
  1807. 'sora',
  1808. 'southernhairnosedwombat',
  1809. 'sow',
  1810. 'spadefoot',
  1811. 'sparrow',
  1812. 'sphinx',
  1813. 'spider',
  1814. 'spidermonkey',
  1815. 'spiketail',
  1816. 'spittlebug',
  1817. 'sponge',
  1818. 'spoonbill',
  1819. 'spotteddolphin',
  1820. 'spreadwing',
  1821. 'springbok',
  1822. 'springpeeper',
  1823. 'springtail',
  1824. 'squab',
  1825. 'squamata',
  1826. 'squeaker',
  1827. 'squid',
  1828. 'squirrel',
  1829. 'stag',
  1830. 'stagbeetle',
  1831. 'stallion',
  1832. 'starfish',
  1833. 'starling',
  1834. 'steed',
  1835. 'steer',
  1836. 'stegosaurus',
  1837. 'stickinsect',
  1838. 'stickleback',
  1839. 'stilt',
  1840. 'stingray',
  1841. 'stinkbug',
  1842. 'stinkpot',
  1843. 'stoat',
  1844. 'stonefly',
  1845. 'stork',
  1846. 'stud',
  1847. 'sturgeon',
  1848. 'sugarglider',
  1849. 'sulphurbutterfly',
  1850. 'sunbear',
  1851. 'sunbittern',
  1852. 'sunfish',
  1853. 'swallow',
  1854. 'swallowtail',
  1855. 'swallowtailbutterfly',
  1856. 'swan',
  1857. 'swellfish',
  1858. 'swift',
  1859. 'swordfish',
  1860. 'tadpole',
  1861. 'tahr',
  1862. 'takin',
  1863. 'tamarin',
  1864. 'tanager',
  1865. 'tapaculo',
  1866. 'tapeworm',
  1867. 'tapir',
  1868. 'tarantula',
  1869. 'tarpan',
  1870. 'tarsier',
  1871. 'taruca',
  1872. 'tasmaniandevil',
  1873. 'tasmaniantiger',
  1874. 'tattler',
  1875. 'tayra',
  1876. 'teal',
  1877. 'tegus',
  1878. 'teledu',
  1879. 'tench',
  1880. 'tenrec',
  1881. 'termite',
  1882. 'tern',
  1883. 'terrapin',
  1884. 'terrier',
  1885. 'thoroughbred',
  1886. 'thrasher',
  1887. 'thrip',
  1888. 'thrush',
  1889. 'thunderbird',
  1890. 'thylacine',
  1891. 'tick',
  1892. 'tiger',
  1893. 'tigerbeetle',
  1894. 'tigermoth',
  1895. 'tigershark',
  1896. 'tilefish',
  1897. 'tinamou',
  1898. 'titi',
  1899. 'titmouse',
  1900. 'toad',
  1901. 'toadfish',
  1902. 'tomtitÂ',
  1903. 'topi',
  1904. 'tortoise',
  1905. 'toucan',
  1906. 'towhee',
  1907. 'tragopan',
  1908. 'treecreeper',
  1909. 'trex',
  1910. 'triceratops',
  1911. 'trogon',
  1912. 'trout',
  1913. 'trumpeterbird',
  1914. 'trumpeterswan',
  1915. 'tsetsefly',
  1916. 'tuatara',
  1917. 'tuna',
  1918. 'turaco',
  1919. 'turkey',
  1920. 'turnstone',
  1921. 'turtle',
  1922. 'turtledove',
  1923. 'uakari',
  1924. 'ugandakob',
  1925. 'uintagroundsquirrel',
  1926. 'ulyssesbutterfly',
  1927. 'umbrellabird',
  1928. 'umbrette',
  1929. 'unau',
  1930. 'ungulate',
  1931. 'unicorn',
  1932. 'upupa',
  1933. 'urchin',
  1934. 'urial',
  1935. 'uromastyxmaliensis',
  1936. 'uromastyxspinipes',
  1937. 'urson',
  1938. 'urubu',
  1939. 'urus',
  1940. 'urutu',
  1941. 'urva',
  1942. 'utahprairiedog',
  1943. 'vampirebat',
  1944. 'vaquita',
  1945. 'veery',
  1946. 'velociraptor',
  1947. 'velvetcrab',
  1948. 'velvetworm',
  1949. 'venomoussnake',
  1950. 'verdin',
  1951. 'vervet',
  1952. 'viceroybutterfly',
  1953. 'vicuna',
  1954. 'viper',
  1955. 'viperfish',
  1956. 'vipersquid',
  1957. 'vireo',
  1958. 'virginiaopossum',
  1959. 'vixen',
  1960. 'vole',
  1961. 'volvox',
  1962. 'vulpesvelox',
  1963. 'vulpesvulpes',
  1964. 'vulture',
  1965. 'walkingstick',
  1966. 'wallaby',
  1967. 'wallaroo',
  1968. 'walleye',
  1969. 'walrus',
  1970. 'warbler',
  1971. 'warthog',
  1972. 'wasp',
  1973. 'waterboatman',
  1974. 'waterbuck',
  1975. 'waterbuffalo',
  1976. 'waterbug',
  1977. 'waterdogs',
  1978. 'waterdragons',
  1979. 'watermoccasin',
  1980. 'waterstrider',
  1981. 'waterthrush',
  1982. 'wattlebird',
  1983. 'watussi',
  1984. 'waxwing',
  1985. 'weasel',
  1986. 'weaverbird',
  1987. 'weevil',
  1988. 'westafricanantelope',
  1989. 'whale',
  1990. 'whapuku',
  1991. 'whelp',
  1992. 'whimbrel',
  1993. 'whippet',
  1994. 'whippoorwill',
  1995. 'whitebeakeddolphin',
  1996. 'whiteeye',
  1997. 'whitepelican',
  1998. 'whiterhino',
  1999. 'whitetaileddeer',
  2000. 'whitetippedreefshark',
  2001. 'whooper',
  2002. 'whoopingcrane',
  2003. 'widgeon',
  2004. 'widowspider',
  2005. 'wildcat',
  2006. 'wildebeast',
  2007. 'wildebeest',
  2008. 'willet',
  2009. 'wireworm',
  2010. 'wisent',
  2011. 'wobbegongshark',
  2012. 'wolf',
  2013. 'wolfspider',
  2014. 'wolverine',
  2015. 'wombat',
  2016. 'woodborer',
  2017. 'woodchuck',
  2018. 'woodcock',
  2019. 'woodnymphbutterfly',
  2020. 'woodpecker',
  2021. 'woodstorks',
  2022. 'woollybearcaterpillar',
  2023. 'worm',
  2024. 'wrasse',
  2025. 'wreckfish',
  2026. 'wren',
  2027. 'wrenchbird',
  2028. 'wryneck',
  2029. 'wuerhosaurus',
  2030. 'wyvern',
  2031. 'xanclomys',
  2032. 'xanthareel',
  2033. 'xantus',
  2034. 'xantusmurrelet',
  2035. 'xeme',
  2036. 'xenarthra',
  2037. 'xenoposeidon',
  2038. 'xenops',
  2039. 'xenopterygii',
  2040. 'xenopus',
  2041. 'xenotarsosaurus',
  2042. 'xenurine',
  2043. 'xenurusunicinctus',
  2044. 'xerus',
  2045. 'xiaosaurus',
  2046. 'xinjiangovenator',
  2047. 'xiphias',
  2048. 'xiphiasgladius',
  2049. 'xiphosuran',
  2050. 'xoloitzcuintli',
  2051. 'xoni',
  2052. 'xrayfish',
  2053. 'xraytetra',
  2054. 'xuanhanosaurus',
  2055. 'xuanhuaceratops',
  2056. 'xuanhuasaurus',
  2057. 'yaffle',
  2058. 'yak',
  2059. 'yapok',
  2060. 'yardant',
  2061. 'yearling',
  2062. 'yellowbelliedmarmot',
  2063. 'yellowbellylizard',
  2064. 'yellowhammer',
  2065. 'yellowjacket',
  2066. 'yellowlegs',
  2067. 'yellowthroat',
  2068. 'yellowwhitebutterfly',
  2069. 'yeti',
  2070. 'ynambu',
  2071. 'yorkshireterrier',
  2072. 'yosemitetoad',
  2073. 'yucker',
  2074. 'zander',
  2075. 'zanzibardaygecko',
  2076. 'zebra',
  2077. 'zebradove',
  2078. 'zebrafinch',
  2079. 'zebrafish',
  2080. 'zebralongwingbutterfly',
  2081. 'zebraswallowtailbutterfly',
  2082. 'zebratailedlizard',
  2083. 'zebu',
  2084. 'zenaida',
  2085. 'zeren',
  2086. 'zethusspinipes',
  2087. 'zethuswasp',
  2088. 'zigzagsalamander',
  2089. 'zonetailedpigeon',
  2090. 'zooplankton',
  2091. 'zopilote',
  2092. 'zorilla',
  2093. 'abandoned',
  2094. 'able',
  2095. 'absolute',
  2096. 'academic',
  2097. 'acceptable',
  2098. 'acclaimed',
  2099. 'accomplished',
  2100. 'accurate',
  2101. 'aching',
  2102. 'acidic',
  2103. 'acrobatic',
  2104. 'adorable',
  2105. 'adventurous',
  2106. 'babyish',
  2107. 'back',
  2108. 'bad',
  2109. 'baggy',
  2110. 'bare',
  2111. 'barren',
  2112. 'basic',
  2113. 'beautiful',
  2114. 'belated',
  2115. 'beloved',
  2116. 'calculating',
  2117. 'calm',
  2118. 'candid',
  2119. 'canine',
  2120. 'capital',
  2121. 'carefree',
  2122. 'careful',
  2123. 'careless',
  2124. 'caring',
  2125. 'cautious',
  2126. 'cavernous',
  2127. 'celebrated',
  2128. 'charming',
  2129. 'damaged',
  2130. 'damp',
  2131. 'dangerous',
  2132. 'dapper',
  2133. 'daring',
  2134. 'dark',
  2135. 'darling',
  2136. 'dazzling',
  2137. 'dead',
  2138. 'deadly',
  2139. 'deafening',
  2140. 'dear',
  2141. 'dearest',
  2142. 'each',
  2143. 'eager',
  2144. 'early',
  2145. 'earnest',
  2146. 'easy',
  2147. 'easygoing',
  2148. 'ecstatic',
  2149. 'edible',
  2150. 'educated',
  2151. 'fabulous',
  2152. 'failing',
  2153. 'faint',
  2154. 'fair',
  2155. 'faithful',
  2156. 'fake',
  2157. 'familiar',
  2158. 'famous',
  2159. 'fancy',
  2160. 'fantastic',
  2161. 'far',
  2162. 'faraway',
  2163. 'farflung',
  2164. 'faroff',
  2165. 'gargantuan',
  2166. 'gaseous',
  2167. 'general',
  2168. 'generous',
  2169. 'gentle',
  2170. 'genuine',
  2171. 'giant',
  2172. 'giddy',
  2173. 'gigantic',
  2174. 'hairy',
  2175. 'half',
  2176. 'handmade',
  2177. 'handsome',
  2178. 'handy',
  2179. 'happy',
  2180. 'happygolucky',
  2181. 'hard',
  2182. 'icky',
  2183. 'icy',
  2184. 'ideal',
  2185. 'idealistic',
  2186. 'identical',
  2187. 'idiotic',
  2188. 'idle',
  2189. 'idolized',
  2190. 'ignorant',
  2191. 'ill',
  2192. 'illegal',
  2193. 'jaded',
  2194. 'jagged',
  2195. 'jampacked',
  2196. 'kaleidoscopic',
  2197. 'keen',
  2198. 'lame',
  2199. 'lanky',
  2200. 'large',
  2201. 'last',
  2202. 'lasting',
  2203. 'late',
  2204. 'lavish',
  2205. 'lawful',
  2206. 'mad',
  2207. 'madeup',
  2208. 'magnificent',
  2209. 'majestic',
  2210. 'major',
  2211. 'male',
  2212. 'mammoth',
  2213. 'married',
  2214. 'marvelous',
  2215. 'naive',
  2216. 'narrow',
  2217. 'nasty',
  2218. 'natural',
  2219. 'naughty',
  2220. 'obedient',
  2221. 'obese',
  2222. 'oblong',
  2223. 'oblong',
  2224. 'obvious',
  2225. 'occasional',
  2226. 'oily',
  2227. 'palatable',
  2228. 'pale',
  2229. 'paltry',
  2230. 'parallel',
  2231. 'parched',
  2232. 'partial',
  2233. 'passionate',
  2234. 'past',
  2235. 'pastel',
  2236. 'peaceful',
  2237. 'peppery',
  2238. 'perfect',
  2239. 'perfumed',
  2240. 'quaint',
  2241. 'qualified',
  2242. 'radiant',
  2243. 'ragged',
  2244. 'rapid',
  2245. 'rare',
  2246. 'rash',
  2247. 'raw',
  2248. 'recent',
  2249. 'reckless',
  2250. 'rectangular',
  2251. 'sad',
  2252. 'safe',
  2253. 'salty',
  2254. 'same',
  2255. 'sandy',
  2256. 'sane',
  2257. 'sarcastic',
  2258. 'sardonic',
  2259. 'satisfied',
  2260. 'scaly',
  2261. 'scarce',
  2262. 'scared',
  2263. 'scary',
  2264. 'scented',
  2265. 'scholarly',
  2266. 'scientific',
  2267. 'scornful',
  2268. 'scratchy',
  2269. 'scrawny',
  2270. 'second',
  2271. 'secondary',
  2272. 'secondhand',
  2273. 'secret',
  2274. 'selfassured',
  2275. 'selfish',
  2276. 'selfreliant',
  2277. 'sentimental',
  2278. 'talkative',
  2279. 'tall',
  2280. 'tame',
  2281. 'tan',
  2282. 'tangible',
  2283. 'tart',
  2284. 'tasty',
  2285. 'tattered',
  2286. 'taut',
  2287. 'tedious',
  2288. 'teeming',
  2289. 'ugly',
  2290. 'ultimate',
  2291. 'unacceptable',
  2292. 'unaware',
  2293. 'uncomfortable',
  2294. 'uncommon',
  2295. 'unconscious',
  2296. 'understated',
  2297. 'unequaled',
  2298. 'vacant',
  2299. 'vague',
  2300. 'vain',
  2301. 'valid',
  2302. 'wan',
  2303. 'warlike',
  2304. 'warm',
  2305. 'warmhearted',
  2306. 'warped',
  2307. 'wary',
  2308. 'wasteful',
  2309. 'watchful',
  2310. 'waterlogged',
  2311. 'watery',
  2312. 'wavy',
  2313. 'yawning',
  2314. 'yearly',
  2315. 'zany',
  2316. 'false',
  2317. 'active',
  2318. 'actual',
  2319. 'adept',
  2320. 'admirable',
  2321. 'admired',
  2322. 'adolescent',
  2323. 'adorable',
  2324. 'adored',
  2325. 'advanced',
  2326. 'affectionate',
  2327. 'afraid',
  2328. 'aged',
  2329. 'aggravating',
  2330. 'beneficial',
  2331. 'best',
  2332. 'better',
  2333. 'bewitched',
  2334. 'big',
  2335. 'bighearted',
  2336. 'biodegradable',
  2337. 'bitesized',
  2338. 'bitter',
  2339. 'black',
  2340. 'cheap',
  2341. 'cheerful',
  2342. 'cheery',
  2343. 'chief',
  2344. 'chilly',
  2345. 'chubby',
  2346. 'circular',
  2347. 'classic',
  2348. 'clean',
  2349. 'clear',
  2350. 'clearcut',
  2351. 'clever',
  2352. 'close',
  2353. 'closed',
  2354. 'decent',
  2355. 'decimal',
  2356. 'decisive',
  2357. 'deep',
  2358. 'defenseless',
  2359. 'defensive',
  2360. 'defiant',
  2361. 'deficient',
  2362. 'definite',
  2363. 'definitive',
  2364. 'delayed',
  2365. 'delectable',
  2366. 'delicious',
  2367. 'elaborate',
  2368. 'elastic',
  2369. 'elated',
  2370. 'elderly',
  2371. 'electric',
  2372. 'elegant',
  2373. 'elementary',
  2374. 'elliptical',
  2375. 'embarrassed',
  2376. 'fast',
  2377. 'fat',
  2378. 'fatal',
  2379. 'fatherly',
  2380. 'favorable',
  2381. 'favorite',
  2382. 'fearful',
  2383. 'fearless',
  2384. 'feisty',
  2385. 'feline',
  2386. 'female',
  2387. 'feminine',
  2388. 'few',
  2389. 'fickle',
  2390. 'gifted',
  2391. 'giving',
  2392. 'glamorous',
  2393. 'glaring',
  2394. 'glass',
  2395. 'gleaming',
  2396. 'gleeful',
  2397. 'glistening',
  2398. 'glittering',
  2399. 'hardtofind',
  2400. 'harmful',
  2401. 'harmless',
  2402. 'harmonious',
  2403. 'harsh',
  2404. 'hasty',
  2405. 'hateful',
  2406. 'haunting',
  2407. 'illfated',
  2408. 'illinformed',
  2409. 'illiterate',
  2410. 'illustrious',
  2411. 'imaginary',
  2412. 'imaginative',
  2413. 'immaculate',
  2414. 'immaterial',
  2415. 'immediate',
  2416. 'immense',
  2417. 'impassioned',
  2418. 'jaunty',
  2419. 'jealous',
  2420. 'jittery',
  2421. 'key',
  2422. 'kind',
  2423. 'lazy',
  2424. 'leading',
  2425. 'leafy',
  2426. 'lean',
  2427. 'left',
  2428. 'legal',
  2429. 'legitimate',
  2430. 'light',
  2431. 'masculine',
  2432. 'massive',
  2433. 'mature',
  2434. 'meager',
  2435. 'mealy',
  2436. 'mean',
  2437. 'measly',
  2438. 'meaty',
  2439. 'medical',
  2440. 'mediocre',
  2441. 'nautical',
  2442. 'near',
  2443. 'neat',
  2444. 'necessary',
  2445. 'needy',
  2446. 'odd',
  2447. 'oddball',
  2448. 'offbeat',
  2449. 'offensive',
  2450. 'official',
  2451. 'old',
  2452. 'periodic',
  2453. 'perky',
  2454. 'personal',
  2455. 'pertinent',
  2456. 'pesky',
  2457. 'pessimistic',
  2458. 'petty',
  2459. 'phony',
  2460. 'physical',
  2461. 'piercing',
  2462. 'pink',
  2463. 'pitiful',
  2464. 'plain',
  2465. 'quarrelsome',
  2466. 'quarterly',
  2467. 'ready',
  2468. 'real',
  2469. 'realistic',
  2470. 'reasonable',
  2471. 'red',
  2472. 'reflecting',
  2473. 'regal',
  2474. 'regular',
  2475. 'separate',
  2476. 'serene',
  2477. 'serious',
  2478. 'serpentine',
  2479. 'several',
  2480. 'severe',
  2481. 'shabby',
  2482. 'shadowy',
  2483. 'shady',
  2484. 'shallow',
  2485. 'shameful',
  2486. 'shameless',
  2487. 'sharp',
  2488. 'shimmering',
  2489. 'shiny',
  2490. 'shocked',
  2491. 'shocking',
  2492. 'shoddy',
  2493. 'short',
  2494. 'shortterm',
  2495. 'showy',
  2496. 'shrill',
  2497. 'shy',
  2498. 'sick',
  2499. 'silent',
  2500. 'silky',
  2501. 'tempting',
  2502. 'tender',
  2503. 'tense',
  2504. 'tepid',
  2505. 'terrible',
  2506. 'terrific',
  2507. 'testy',
  2508. 'thankful',
  2509. 'that',
  2510. 'these',
  2511. 'uneven',
  2512. 'unfinished',
  2513. 'unfit',
  2514. 'unfolded',
  2515. 'unfortunate',
  2516. 'unhappy',
  2517. 'unhealthy',
  2518. 'uniform',
  2519. 'unimportant',
  2520. 'unique',
  2521. 'valuable',
  2522. 'vapid',
  2523. 'variable',
  2524. 'vast',
  2525. 'velvety',
  2526. 'weak',
  2527. 'wealthy',
  2528. 'weary',
  2529. 'webbed',
  2530. 'wee',
  2531. 'weekly',
  2532. 'weepy',
  2533. 'weighty',
  2534. 'weird',
  2535. 'welcome',
  2536. 'welldocumented',
  2537. 'yellow',
  2538. 'zealous',
  2539. 'aggressive',
  2540. 'agile',
  2541. 'agitated',
  2542. 'agonizing',
  2543. 'agreeable',
  2544. 'ajar',
  2545. 'alarmed',
  2546. 'alarming',
  2547. 'alert',
  2548. 'alienated',
  2549. 'alive',
  2550. 'all',
  2551. 'altruistic',
  2552. 'blackandwhite',
  2553. 'bland',
  2554. 'blank',
  2555. 'blaring',
  2556. 'bleak',
  2557. 'blind',
  2558. 'blissful',
  2559. 'blond',
  2560. 'blue',
  2561. 'blushing',
  2562. 'cloudy',
  2563. 'clueless',
  2564. 'clumsy',
  2565. 'cluttered',
  2566. 'coarse',
  2567. 'cold',
  2568. 'colorful',
  2569. 'colorless',
  2570. 'colossal',
  2571. 'comfortable',
  2572. 'common',
  2573. 'compassionate',
  2574. 'competent',
  2575. 'complete',
  2576. 'delightful',
  2577. 'delirious',
  2578. 'demanding',
  2579. 'dense',
  2580. 'dental',
  2581. 'dependable',
  2582. 'dependent',
  2583. 'descriptive',
  2584. 'deserted',
  2585. 'detailed',
  2586. 'determined',
  2587. 'devoted',
  2588. 'different',
  2589. 'embellished',
  2590. 'eminent',
  2591. 'emotional',
  2592. 'empty',
  2593. 'enchanted',
  2594. 'enchanting',
  2595. 'energetic',
  2596. 'enlightened',
  2597. 'enormous',
  2598. 'filthy',
  2599. 'fine',
  2600. 'finished',
  2601. 'firm',
  2602. 'first',
  2603. 'firsthand',
  2604. 'fitting',
  2605. 'fixed',
  2606. 'flaky',
  2607. 'flamboyant',
  2608. 'flashy',
  2609. 'flat',
  2610. 'flawed',
  2611. 'flawless',
  2612. 'flickering',
  2613. 'gloomy',
  2614. 'glorious',
  2615. 'glossy',
  2616. 'glum',
  2617. 'golden',
  2618. 'good',
  2619. 'goodnatured',
  2620. 'gorgeous',
  2621. 'graceful',
  2622. 'healthy',
  2623. 'heartfelt',
  2624. 'hearty',
  2625. 'heavenly',
  2626. 'heavy',
  2627. 'hefty',
  2628. 'helpful',
  2629. 'helpless',
  2630. 'impartial',
  2631. 'impeccable',
  2632. 'imperfect',
  2633. 'imperturbable',
  2634. 'impish',
  2635. 'impolite',
  2636. 'important',
  2637. 'impossible',
  2638. 'impractical',
  2639. 'impressionable',
  2640. 'impressive',
  2641. 'improbable',
  2642. 'joint',
  2643. 'jolly',
  2644. 'jovial',
  2645. 'kindhearted',
  2646. 'kindly',
  2647. 'lighthearted',
  2648. 'likable',
  2649. 'likely',
  2650. 'limited',
  2651. 'limp',
  2652. 'limping',
  2653. 'linear',
  2654. 'lined',
  2655. 'liquid',
  2656. 'medium',
  2657. 'meek',
  2658. 'mellow',
  2659. 'melodic',
  2660. 'memorable',
  2661. 'menacing',
  2662. 'merry',
  2663. 'messy',
  2664. 'metallic',
  2665. 'mild',
  2666. 'negative',
  2667. 'neglected',
  2668. 'negligible',
  2669. 'neighboring',
  2670. 'nervous',
  2671. 'new',
  2672. 'oldfashioned',
  2673. 'only',
  2674. 'open',
  2675. 'optimal',
  2676. 'optimistic',
  2677. 'opulent',
  2678. 'plaintive',
  2679. 'plastic',
  2680. 'playful',
  2681. 'pleasant',
  2682. 'pleased',
  2683. 'pleasing',
  2684. 'plump',
  2685. 'plush',
  2686. 'pointed',
  2687. 'pointless',
  2688. 'poised',
  2689. 'polished',
  2690. 'polite',
  2691. 'political',
  2692. 'queasy',
  2693. 'querulous',
  2694. 'reliable',
  2695. 'relieved',
  2696. 'remarkable',
  2697. 'remorseful',
  2698. 'remote',
  2699. 'repentant',
  2700. 'required',
  2701. 'respectful',
  2702. 'responsible',
  2703. 'silly',
  2704. 'silver',
  2705. 'similar',
  2706. 'simple',
  2707. 'simplistic',
  2708. 'sinful',
  2709. 'single',
  2710. 'sizzling',
  2711. 'skeletal',
  2712. 'skinny',
  2713. 'sleepy',
  2714. 'slight',
  2715. 'slim',
  2716. 'slimy',
  2717. 'slippery',
  2718. 'slow',
  2719. 'slushy',
  2720. 'small',
  2721. 'smart',
  2722. 'smoggy',
  2723. 'smooth',
  2724. 'smug',
  2725. 'snappy',
  2726. 'snarling',
  2727. 'sneaky',
  2728. 'sniveling',
  2729. 'snoopy',
  2730. 'thick',
  2731. 'thin',
  2732. 'third',
  2733. 'thirsty',
  2734. 'this',
  2735. 'thorny',
  2736. 'thorough',
  2737. 'those',
  2738. 'thoughtful',
  2739. 'threadbare',
  2740. 'united',
  2741. 'unkempt',
  2742. 'unknown',
  2743. 'unlawful',
  2744. 'unlined',
  2745. 'unlucky',
  2746. 'unnatural',
  2747. 'unpleasant',
  2748. 'unrealistic',
  2749. 'venerated',
  2750. 'vengeful',
  2751. 'verifiable',
  2752. 'vibrant',
  2753. 'vicious',
  2754. 'wellgroomed',
  2755. 'wellinformed',
  2756. 'welllit',
  2757. 'wellmade',
  2758. 'welloff',
  2759. 'welltodo',
  2760. 'wellworn',
  2761. 'wet',
  2762. 'which',
  2763. 'whimsical',
  2764. 'whirlwind',
  2765. 'whispered',
  2766. 'yellowish',
  2767. 'zesty',
  2768. 'amazing',
  2769. 'ambitious',
  2770. 'ample',
  2771. 'amused',
  2772. 'amusing',
  2773. 'anchored',
  2774. 'ancient',
  2775. 'angelic',
  2776. 'angry',
  2777. 'anguished',
  2778. 'animated',
  2779. 'annual',
  2780. 'another',
  2781. 'antique',
  2782. 'bogus',
  2783. 'boiling',
  2784. 'bold',
  2785. 'bony',
  2786. 'boring',
  2787. 'bossy',
  2788. 'both',
  2789. 'bouncy',
  2790. 'bountiful',
  2791. 'bowed',
  2792. 'complex',
  2793. 'complicated',
  2794. 'composed',
  2795. 'concerned',
  2796. 'concrete',
  2797. 'confused',
  2798. 'conscious',
  2799. 'considerate',
  2800. 'constant',
  2801. 'content',
  2802. 'conventional',
  2803. 'cooked',
  2804. 'cool',
  2805. 'cooperative',
  2806. 'difficult',
  2807. 'digital',
  2808. 'diligent',
  2809. 'dim',
  2810. 'dimpled',
  2811. 'dimwitted',
  2812. 'direct',
  2813. 'disastrous',
  2814. 'discrete',
  2815. 'disfigured',
  2816. 'disgusting',
  2817. 'disloyal',
  2818. 'dismal',
  2819. 'enraged',
  2820. 'entire',
  2821. 'envious',
  2822. 'equal',
  2823. 'equatorial',
  2824. 'essential',
  2825. 'esteemed',
  2826. 'ethical',
  2827. 'euphoric',
  2828. 'flimsy',
  2829. 'flippant',
  2830. 'flowery',
  2831. 'fluffy',
  2832. 'fluid',
  2833. 'flustered',
  2834. 'focused',
  2835. 'fond',
  2836. 'foolhardy',
  2837. 'foolish',
  2838. 'forceful',
  2839. 'forked',
  2840. 'formal',
  2841. 'forsaken',
  2842. 'gracious',
  2843. 'grand',
  2844. 'grandiose',
  2845. 'granular',
  2846. 'grateful',
  2847. 'grave',
  2848. 'gray',
  2849. 'great',
  2850. 'greedy',
  2851. 'green',
  2852. 'hidden',
  2853. 'hideous',
  2854. 'high',
  2855. 'highlevel',
  2856. 'hilarious',
  2857. 'hoarse',
  2858. 'hollow',
  2859. 'homely',
  2860. 'impure',
  2861. 'inborn',
  2862. 'incomparable',
  2863. 'incompatible',
  2864. 'incomplete',
  2865. 'inconsequential',
  2866. 'incredible',
  2867. 'indelible',
  2868. 'indolent',
  2869. 'inexperienced',
  2870. 'infamous',
  2871. 'infantile',
  2872. 'joyful',
  2873. 'joyous',
  2874. 'jubilant',
  2875. 'klutzy',
  2876. 'knobby',
  2877. 'little',
  2878. 'live',
  2879. 'lively',
  2880. 'livid',
  2881. 'loathsome',
  2882. 'lone',
  2883. 'lonely',
  2884. 'long',
  2885. 'milky',
  2886. 'mindless',
  2887. 'miniature',
  2888. 'minor',
  2889. 'minty',
  2890. 'miserable',
  2891. 'miserly',
  2892. 'misguided',
  2893. 'misty',
  2894. 'mixed',
  2895. 'next',
  2896. 'nice',
  2897. 'nifty',
  2898. 'nimble',
  2899. 'nippy',
  2900. 'orange',
  2901. 'orderly',
  2902. 'ordinary',
  2903. 'organic',
  2904. 'ornate',
  2905. 'ornery',
  2906. 'poor',
  2907. 'popular',
  2908. 'portly',
  2909. 'posh',
  2910. 'positive',
  2911. 'possible',
  2912. 'potable',
  2913. 'powerful',
  2914. 'powerless',
  2915. 'practical',
  2916. 'precious',
  2917. 'present',
  2918. 'prestigious',
  2919. 'questionable',
  2920. 'quick',
  2921. 'repulsive',
  2922. 'revolving',
  2923. 'rewarding',
  2924. 'rich',
  2925. 'right',
  2926. 'rigid',
  2927. 'ringed',
  2928. 'ripe',
  2929. 'sociable',
  2930. 'soft',
  2931. 'soggy',
  2932. 'solid',
  2933. 'somber',
  2934. 'some',
  2935. 'sophisticated',
  2936. 'sore',
  2937. 'sorrowful',
  2938. 'soulful',
  2939. 'soupy',
  2940. 'sour',
  2941. 'spanish',
  2942. 'sparkling',
  2943. 'sparse',
  2944. 'specific',
  2945. 'spectacular',
  2946. 'speedy',
  2947. 'spherical',
  2948. 'spicy',
  2949. 'spiffy',
  2950. 'spirited',
  2951. 'spiteful',
  2952. 'splendid',
  2953. 'spotless',
  2954. 'spotted',
  2955. 'spry',
  2956. 'thrifty',
  2957. 'thunderous',
  2958. 'tidy',
  2959. 'tight',
  2960. 'timely',
  2961. 'tinted',
  2962. 'tiny',
  2963. 'tired',
  2964. 'torn',
  2965. 'total',
  2966. 'unripe',
  2967. 'unruly',
  2968. 'unselfish',
  2969. 'unsightly',
  2970. 'unsteady',
  2971. 'unsung',
  2972. 'untidy',
  2973. 'untimely',
  2974. 'untried',
  2975. 'victorious',
  2976. 'vigilant',
  2977. 'vigorous',
  2978. 'villainous',
  2979. 'violet',
  2980. 'white',
  2981. 'whole',
  2982. 'whopping',
  2983. 'wicked',
  2984. 'wide',
  2985. 'wideeyed',
  2986. 'wiggly',
  2987. 'wild',
  2988. 'willing',
  2989. 'wilted',
  2990. 'winding',
  2991. 'windy',
  2992. 'young',
  2993. 'zigzag',
  2994. 'anxious',
  2995. 'any',
  2996. 'apprehensive',
  2997. 'appropriate',
  2998. 'apt',
  2999. 'arctic',
  3000. 'arid',
  3001. 'aromatic',
  3002. 'artistic',
  3003. 'ashamed',
  3004. 'assured',
  3005. 'astonishing',
  3006. 'athletic',
  3007. 'brave',
  3008. 'breakable',
  3009. 'brief',
  3010. 'bright',
  3011. 'brilliant',
  3012. 'brisk',
  3013. 'broken',
  3014. 'bronze',
  3015. 'brown',
  3016. 'bruised',
  3017. 'coordinated',
  3018. 'corny',
  3019. 'corrupt',
  3020. 'costly',
  3021. 'courageous',
  3022. 'courteous',
  3023. 'crafty',
  3024. 'crazy',
  3025. 'creamy',
  3026. 'creative',
  3027. 'creepy',
  3028. 'criminal',
  3029. 'crisp',
  3030. 'dirty',
  3031. 'disguised',
  3032. 'dishonest',
  3033. 'dismal',
  3034. 'distant',
  3035. 'distant',
  3036. 'distinct',
  3037. 'distorted',
  3038. 'dizzy',
  3039. 'dopey',
  3040. 'downright',
  3041. 'dreary',
  3042. 'even',
  3043. 'evergreen',
  3044. 'everlasting',
  3045. 'every',
  3046. 'evil',
  3047. 'exalted',
  3048. 'excellent',
  3049. 'excitable',
  3050. 'exemplary',
  3051. 'exhausted',
  3052. 'forthright',
  3053. 'fortunate',
  3054. 'fragrant',
  3055. 'frail',
  3056. 'frank',
  3057. 'frayed',
  3058. 'free',
  3059. 'french',
  3060. 'frequent',
  3061. 'fresh',
  3062. 'friendly',
  3063. 'frightened',
  3064. 'frightening',
  3065. 'frigid',
  3066. 'gregarious',
  3067. 'grim',
  3068. 'grimy',
  3069. 'gripping',
  3070. 'grizzled',
  3071. 'gross',
  3072. 'grotesque',
  3073. 'grouchy',
  3074. 'grounded',
  3075. 'honest',
  3076. 'honorable',
  3077. 'honored',
  3078. 'hopeful',
  3079. 'horrible',
  3080. 'hospitable',
  3081. 'hot',
  3082. 'huge',
  3083. 'infatuated',
  3084. 'inferior',
  3085. 'infinite',
  3086. 'informal',
  3087. 'innocent',
  3088. 'insecure',
  3089. 'insidious',
  3090. 'insignificant',
  3091. 'insistent',
  3092. 'instructive',
  3093. 'insubstantial',
  3094. 'judicious',
  3095. 'juicy',
  3096. 'jumbo',
  3097. 'knotty',
  3098. 'knowing',
  3099. 'knowledgeable',
  3100. 'longterm',
  3101. 'loose',
  3102. 'lopsided',
  3103. 'lost',
  3104. 'loud',
  3105. 'lovable',
  3106. 'lovely',
  3107. 'loving',
  3108. 'modern',
  3109. 'modest',
  3110. 'moist',
  3111. 'monstrous',
  3112. 'monthly',
  3113. 'monumental',
  3114. 'moral',
  3115. 'mortified',
  3116. 'motherly',
  3117. 'motionless',
  3118. 'nocturnal',
  3119. 'noisy',
  3120. 'nonstop',
  3121. 'normal',
  3122. 'notable',
  3123. 'noted',
  3124. 'original',
  3125. 'other',
  3126. 'our',
  3127. 'outgoing',
  3128. 'outlandish',
  3129. 'outlying',
  3130. 'precious',
  3131. 'pretty',
  3132. 'previous',
  3133. 'pricey',
  3134. 'prickly',
  3135. 'primary',
  3136. 'prime',
  3137. 'pristine',
  3138. 'private',
  3139. 'prize',
  3140. 'probable',
  3141. 'productive',
  3142. 'profitable',
  3143. 'quickwitted',
  3144. 'quiet',
  3145. 'quintessential',
  3146. 'roasted',
  3147. 'robust',
  3148. 'rosy',
  3149. 'rotating',
  3150. 'rotten',
  3151. 'rough',
  3152. 'round',
  3153. 'rowdy',
  3154. 'square',
  3155. 'squeaky',
  3156. 'squiggly',
  3157. 'stable',
  3158. 'staid',
  3159. 'stained',
  3160. 'stale',
  3161. 'standard',
  3162. 'starchy',
  3163. 'stark',
  3164. 'starry',
  3165. 'steel',
  3166. 'steep',
  3167. 'sticky',
  3168. 'stiff',
  3169. 'stimulating',
  3170. 'stingy',
  3171. 'stormy',
  3172. 'straight',
  3173. 'strange',
  3174. 'strict',
  3175. 'strident',
  3176. 'striking',
  3177. 'striped',
  3178. 'strong',
  3179. 'studious',
  3180. 'stunning',
  3181. 'tough',
  3182. 'tragic',
  3183. 'trained',
  3184. 'traumatic',
  3185. 'treasured',
  3186. 'tremendous',
  3187. 'tremendous',
  3188. 'triangular',
  3189. 'tricky',
  3190. 'trifling',
  3191. 'trim',
  3192. 'untrue',
  3193. 'unused',
  3194. 'unusual',
  3195. 'unwelcome',
  3196. 'unwieldy',
  3197. 'unwilling',
  3198. 'unwitting',
  3199. 'unwritten',
  3200. 'upbeat',
  3201. 'violent',
  3202. 'virtual',
  3203. 'virtuous',
  3204. 'visible',
  3205. 'winged',
  3206. 'wiry',
  3207. 'wise',
  3208. 'witty',
  3209. 'wobbly',
  3210. 'woeful',
  3211. 'wonderful',
  3212. 'wooden',
  3213. 'woozy',
  3214. 'wordy',
  3215. 'worldly',
  3216. 'worn',
  3217. 'youthful',
  3218. 'attached',
  3219. 'attentive',
  3220. 'attractive',
  3221. 'austere',
  3222. 'authentic',
  3223. 'authorized',
  3224. 'automatic',
  3225. 'avaricious',
  3226. 'average',
  3227. 'aware',
  3228. 'awesome',
  3229. 'awful',
  3230. 'awkward',
  3231. 'bubbly',
  3232. 'bulky',
  3233. 'bumpy',
  3234. 'buoyant',
  3235. 'burdensome',
  3236. 'burly',
  3237. 'bustling',
  3238. 'busy',
  3239. 'buttery',
  3240. 'buzzing',
  3241. 'critical',
  3242. 'crooked',
  3243. 'crowded',
  3244. 'cruel',
  3245. 'crushing',
  3246. 'cuddly',
  3247. 'cultivated',
  3248. 'cultured',
  3249. 'cumbersome',
  3250. 'curly',
  3251. 'curvy',
  3252. 'cute',
  3253. 'cylindrical',
  3254. 'doting',
  3255. 'double',
  3256. 'downright',
  3257. 'drab',
  3258. 'drafty',
  3259. 'dramatic',
  3260. 'dreary',
  3261. 'droopy',
  3262. 'dry',
  3263. 'dual',
  3264. 'dull',
  3265. 'dutiful',
  3266. 'excited',
  3267. 'exciting',
  3268. 'exotic',
  3269. 'expensive',
  3270. 'experienced',
  3271. 'expert',
  3272. 'extralarge',
  3273. 'extraneous',
  3274. 'extrasmall',
  3275. 'extroverted',
  3276. 'frilly',
  3277. 'frivolous',
  3278. 'frizzy',
  3279. 'front',
  3280. 'frosty',
  3281. 'frozen',
  3282. 'frugal',
  3283. 'fruitful',
  3284. 'full',
  3285. 'fumbling',
  3286. 'functional',
  3287. 'funny',
  3288. 'fussy',
  3289. 'fuzzy',
  3290. 'growing',
  3291. 'growling',
  3292. 'grown',
  3293. 'grubby',
  3294. 'gruesome',
  3295. 'grumpy',
  3296. 'guilty',
  3297. 'gullible',
  3298. 'gummy',
  3299. 'humble',
  3300. 'humiliating',
  3301. 'humming',
  3302. 'humongous',
  3303. 'hungry',
  3304. 'hurtful',
  3305. 'husky',
  3306. 'intelligent',
  3307. 'intent',
  3308. 'intentional',
  3309. 'interesting',
  3310. 'internal',
  3311. 'international',
  3312. 'intrepid',
  3313. 'ironclad',
  3314. 'irresponsible',
  3315. 'irritating',
  3316. 'itchy',
  3317. 'jumpy',
  3318. 'junior',
  3319. 'juvenile',
  3320. 'known',
  3321. 'kooky',
  3322. 'kosher',
  3323. 'low',
  3324. 'loyal',
  3325. 'lucky',
  3326. 'lumbering',
  3327. 'luminous',
  3328. 'lumpy',
  3329. 'lustrous',
  3330. 'luxurious',
  3331. 'mountainous',
  3332. 'muddy',
  3333. 'muffled',
  3334. 'multicolored',
  3335. 'mundane',
  3336. 'murky',
  3337. 'mushy',
  3338. 'musty',
  3339. 'muted',
  3340. 'mysterious',
  3341. 'noteworthy',
  3342. 'novel',
  3343. 'noxious',
  3344. 'numb',
  3345. 'nutritious',
  3346. 'nutty',
  3347. 'onerlooked',
  3348. 'outrageous',
  3349. 'outstanding',
  3350. 'oval',
  3351. 'overcooked',
  3352. 'overdue',
  3353. 'overjoyed',
  3354. 'profuse',
  3355. 'proper',
  3356. 'proud',
  3357. 'prudent',
  3358. 'punctual',
  3359. 'pungent',
  3360. 'puny',
  3361. 'pure',
  3362. 'purple',
  3363. 'pushy',
  3364. 'putrid',
  3365. 'puzzled',
  3366. 'puzzling',
  3367. 'quirky',
  3368. 'quixotic',
  3369. 'quizzical',
  3370. 'royal',
  3371. 'rubbery',
  3372. 'ruddy',
  3373. 'rude',
  3374. 'rundown',
  3375. 'runny',
  3376. 'rural',
  3377. 'rusty',
  3378. 'stupendous',
  3379. 'stupid',
  3380. 'sturdy',
  3381. 'stylish',
  3382. 'subdued',
  3383. 'submissive',
  3384. 'substantial',
  3385. 'subtle',
  3386. 'suburban',
  3387. 'sudden',
  3388. 'sugary',
  3389. 'sunny',
  3390. 'super',
  3391. 'superb',
  3392. 'superficial',
  3393. 'superior',
  3394. 'supportive',
  3395. 'surefooted',
  3396. 'surprised',
  3397. 'suspicious',
  3398. 'svelte',
  3399. 'sweaty',
  3400. 'sweet',
  3401. 'sweltering',
  3402. 'swift',
  3403. 'sympathetic',
  3404. 'trivial',
  3405. 'troubled',
  3406. 'trusting',
  3407. 'trustworthy',
  3408. 'trusty',
  3409. 'truthful',
  3410. 'tubby',
  3411. 'turbulent',
  3412. 'twin',
  3413. 'upright',
  3414. 'upset',
  3415. 'urban',
  3416. 'usable',
  3417. 'used',
  3418. 'useful',
  3419. 'useless',
  3420. 'utilized',
  3421. 'utter',
  3422. 'vital',
  3423. 'vivacious',
  3424. 'vivid',
  3425. 'voluminous',
  3426. 'worried',
  3427. 'worrisome',
  3428. 'worse',
  3429. 'worst',
  3430. 'worthless',
  3431. 'worthwhile',
  3432. 'worthy',
  3433. 'wrathful',
  3434. 'wretched',
  3435. 'writhing',
  3436. 'wrong',
  3437. 'wry',
  3438. 'yummy',
  3439. 'true',
  3440. 'aliceblue',
  3441. 'antiquewhite',
  3442. 'aqua',
  3443. 'aquamarine',
  3444. 'azure',
  3445. 'beige',
  3446. 'bisque',
  3447. 'black',
  3448. 'blanchedalmond',
  3449. 'blue',
  3450. 'blueviolet',
  3451. 'brown',
  3452. 'burlywood',
  3453. 'cadetblue',
  3454. 'chartreuse',
  3455. 'chocolate',
  3456. 'coral',
  3457. 'cornflowerblue',
  3458. 'cornsilk',
  3459. 'crimson',
  3460. 'cyan',
  3461. 'darkblue',
  3462. 'darkcyan',
  3463. 'darkgoldenrod',
  3464. 'darkgray',
  3465. 'darkgreen',
  3466. 'darkgrey',
  3467. 'darkkhaki',
  3468. 'darkmagenta',
  3469. 'darkolivegreen',
  3470. 'darkorange',
  3471. 'darkorchid',
  3472. 'darkred',
  3473. 'darksalmon',
  3474. 'darkseagreen',
  3475. 'darkslateblue',
  3476. 'darkslategray',
  3477. 'darkslategrey',
  3478. 'darkturquoise',
  3479. 'darkviolet',
  3480. 'deeppink',
  3481. 'deepskyblue',
  3482. 'dimgray',
  3483. 'dimgrey',
  3484. 'dodgerblue',
  3485. 'firebrick',
  3486. 'floralwhite',
  3487. 'forestgreen',
  3488. 'fractal',
  3489. 'fuchsia',
  3490. 'gainsboro',
  3491. 'ghostwhite',
  3492. 'gold',
  3493. 'goldenrod',
  3494. 'gray',
  3495. 'green',
  3496. 'greenyellow',
  3497. 'honeydew',
  3498. 'hotpink',
  3499. 'indianred',
  3500. 'indigo',
  3501. 'ivory',
  3502. 'khaki',
  3503. 'lavender',
  3504. 'lavenderblush',
  3505. 'lawngreen',
  3506. 'lemonchiffon',
  3507. 'lightblue',
  3508. 'lightcoral',
  3509. 'lightcyan',
  3510. 'lightgoldenrod',
  3511. 'lightgoldenrodyellow',
  3512. 'lightgray',
  3513. 'lightgreen',
  3514. 'lightgrey',
  3515. 'lightpink',
  3516. 'lightsalmon',
  3517. 'lightseagreen',
  3518. 'lightskyblue',
  3519. 'lightslateblue',
  3520. 'lightslategray',
  3521. 'lightsteelblue',
  3522. 'lightyellow',
  3523. 'lime',
  3524. 'limegreen',
  3525. 'linen',
  3526. 'magenta',
  3527. 'maroon',
  3528. 'mediumaquamarine',
  3529. 'mediumblue',
  3530. 'mediumforestgreen',
  3531. 'mediumgoldenrod',
  3532. 'mediumorchid',
  3533. 'mediumpurple',
  3534. 'mediumseagreen',
  3535. 'mediumslateblue',
  3536. 'mediumspringgreen',
  3537. 'mediumturquoise',
  3538. 'mediumvioletred',
  3539. 'midnightblue',
  3540. 'mintcream',
  3541. 'mistyrose',
  3542. 'moccasin',
  3543. 'navajowhite',
  3544. 'navy',
  3545. 'navyblue',
  3546. 'oldlace',
  3547. 'olive',
  3548. 'olivedrab',
  3549. 'opaque',
  3550. 'orange',
  3551. 'orangered',
  3552. 'orchid',
  3553. 'palegoldenrod',
  3554. 'palegreen',
  3555. 'paleturquoise',
  3556. 'palevioletred',
  3557. 'papayawhip',
  3558. 'peachpuff',
  3559. 'peru',
  3560. 'pink',
  3561. 'plum',
  3562. 'powderblue',
  3563. 'purple',
  3564. 'red',
  3565. 'rosybrown',
  3566. 'royalblue',
  3567. 'saddlebrown',
  3568. 'salmon',
  3569. 'sandybrown',
  3570. 'seagreen',
  3571. 'seashell',
  3572. 'sienna',
  3573. 'silver',
  3574. 'skyblue',
  3575. 'slateblue',
  3576. 'slategray',
  3577. 'slategrey',
  3578. 'snow',
  3579. 'springgreen',
  3580. 'steelblue',
  3581. 'tan',
  3582. 'teal',
  3583. 'thistle',
  3584. 'tomato',
  3585. 'transparent',
  3586. 'turquoise',
  3587. 'violet',
  3588. 'violetred',
  3589. 'wheat',
  3590. 'white',
  3591. 'whitesmoke',
  3592. 'yellow',
  3593. 'yellowgreen'
  3594. ]
  3595. }
  3596.  
  3597. checkSupport(href) {
  3598. return (href.includes('//redgifs.com/') || href.includes('www.redgifs.com/'));
  3599. }
  3600.  
  3601. capatilizeWords(word) {
  3602. let words = [];
  3603. let remaing = word;
  3604. let ind = 0;
  3605. while (remaing.length > 0 && ind <= remaing.length) {
  3606. let word = remaing.slice(0, ++ind);
  3607. if (this.gypcatList.includes(word)) {
  3608. remaing = remaing.slice(ind);
  3609. words.push(word);
  3610. ind = 0;
  3611. }
  3612. }
  3613.  
  3614. return words.map(val => val[0].toUpperCase() + val.slice(1)).join('');
  3615. }
  3616.  
  3617. getDownloadLinks(href) {
  3618. //media => oembed => thumbnail_url
  3619. //https://thcf2.redgifs.com/<ID>.mp4
  3620. //https://redgifs.com/watch/<ID>
  3621.  
  3622. let words = href.split('/');
  3623. let cWords = this.capatilizeWords(words[words.length - 1]);
  3624. let url = words.slice(0, words.length - 1);
  3625. url = url.join('/').replace('www.', '').replace('/watch', '').replace('redgifs', 'thcf2.redgifs') + '/' + cWords + '.mp4'
  3626. return url;
  3627. }
  3628. }
  3629.  
  3630. const _SupportedSites = [new DirectDownload(), new RedditGallery(), new Imgur(), new Gfycat(), new Redgifs()];
  3631. //#endregion
  3632.  
  3633. //#region Downloader Class
  3634. class BaseRedditClass {
  3635. constructor() {
  3636.  
  3637. }
  3638.  
  3639. _getSavedPostsData(after = null) {
  3640. return new Promise((res, rej) => {
  3641. let username;
  3642. if (_IsOnUserPage) {
  3643. username = document.location.href.split('/');
  3644. username = username[username.indexOf('user') + 1];
  3645. } else if (GM_config.get('reddit_username') != '') {
  3646. username = _RedditUsername;
  3647. }
  3648.  
  3649. fetch(`${window.location.origin}/user/${username}/saved/.json?limit=20${after != null ? '&after=' + after : ''}`)
  3650. .then(resp => resp.text())
  3651. .then(text => res(JSON.parse(text)));
  3652. })
  3653. }
  3654.  
  3655. _getPostData(url) {
  3656. return new Promise((res, rej) => {
  3657. fetch(`${url}/.json`)
  3658. .then(resp => resp.text())
  3659. .then(text => res(JSON.parse(text)));
  3660. })
  3661. }
  3662.  
  3663. _parseData(data) {
  3664. return {
  3665. id: data.data.name,
  3666. url: data.data.url,
  3667. og_url: `https://www.reddit.com${data.data.permalink}`,
  3668. subreddit: data.data.subreddit
  3669. }
  3670. }
  3671.  
  3672. _getFilterArray() {
  3673. return new Promise((res, rej) => {
  3674. let str = GM_config.get('create_for_filter');
  3675. let arr = str.split(',').map(val => val.trim());
  3676. res(arr);
  3677. });
  3678. }
  3679.  
  3680. async downloadSingle(info, filter = null) {
  3681. return new Promise(async (res, rej) => {
  3682. if (filter == null) filter = await this._getFilterArray();
  3683. const url = info.url;
  3684.  
  3685. if (url == undefined) {
  3686. rej();
  3687. return;
  3688. };
  3689.  
  3690. for (let index = 0; index < _SupportedSites.length; index++) {
  3691. const site = _SupportedSites[index];
  3692. if (site.checkSupport(url)) {
  3693. let folder = null;
  3694. if (GM_config.get('create_subreddit_folder')) {
  3695. if (!GM_config.get('create_only_for_selected') || filter.includes(info.subreddit)) {
  3696. folder = info.subreddit;
  3697. }
  3698. }
  3699. await site.downloadImages(info, folder);
  3700. await wait(20);
  3701. break;
  3702. }
  3703. }
  3704. res();
  3705. })
  3706. }
  3707.  
  3708. async downloadAll() {
  3709. console.log('DOWNLOADING!');
  3710. //_SupportedSites.forEach(downloader => {
  3711. // downloader.checkSupport()
  3712. //})
  3713.  
  3714. //Before = newly added to page so page 1 => when using an id you go up the list
  3715. //Thats why you use Before as Paramter
  3716.  
  3717. //^^^ Screw that shit am i right
  3718.  
  3719. //resp.data.after => Pagnation
  3720. //resp.data.children[].data.name => ID
  3721. //resp.data.children[].data.url => url
  3722. //resp.data.children[].data.subreddit => subreddit
  3723.  
  3724. let running = true;
  3725. let after = null;
  3726. let postInfos = [];
  3727. let first = true;
  3728. let stopAt = _LastDownloadedID;
  3729. let filter = await this._getFilterArray();
  3730. while (running) {
  3731. let data = (await this._getSavedPostsData(after)).data;
  3732. after = data.after;
  3733. if (after == null || after == 'null') running = false;
  3734. for (let index = 0; index < data.children.length; index++) {
  3735. const postData = data.children[index];
  3736. const info = this._parseData(postData);
  3737.  
  3738. if (info.id == stopAt) {
  3739. running = false;
  3740. break;
  3741. }
  3742.  
  3743. if (first) {
  3744. first = false;
  3745. _LastDownloadedID = info.id;
  3746. GM_setValue('LastDownloaded', info.id);
  3747. }
  3748.  
  3749. postInfos.push(info);
  3750. }
  3751. }
  3752.  
  3753. let tmp_title = document.title;
  3754.  
  3755. for (let index = 0; index < postInfos.length; index++) {
  3756. document.title = `${index+1}/${postInfos.length}`;
  3757. const info = postInfos[index];
  3758. await this.downloadSingle(info, filter).catch(() => {
  3759. console.error("Failed to download image!")
  3760. });
  3761. /*const url = info.url;
  3762. //console.log(`Downloading ${index+1}/${links.length} - ${url}`);
  3763.  
  3764. if(url == undefined) continue;
  3765.  
  3766. for (let index = 0; index < _SupportedSites.length; index++) {
  3767. const site = _SupportedSites[index];
  3768. if(site.checkSupport(url)){
  3769. let folder = null;
  3770. if(GM_config.get('create_subreddit_folder')){
  3771. if(!GM_config.get('create_only_for_selected') || filter.includes(info.subreddit)){
  3772. folder = info.subreddit;
  3773. }
  3774. }
  3775. await site.downloadImages(url, folder);
  3776. await wait(20);
  3777. break;
  3778. }
  3779. }*/
  3780. }
  3781.  
  3782. createNotification('Reddit Downloader', `Finished downloading ${postInfos.length} Posts!`);
  3783.  
  3784. document.title = tmp_title;
  3785. }
  3786. }
  3787.  
  3788. class RedditDownloader extends BaseRedditClass {
  3789. constructor() {
  3790. super();
  3791.  
  3792. //this.addSavedDownloadButton();
  3793. this.addSettingsButton();
  3794. this.pageUpdateChecker();
  3795. }
  3796.  
  3797. addSavedDownloadButton() {
  3798. let aEles = document.querySelectorAll('a');
  3799. for (let index = 0; index < aEles.length; index++) {
  3800. const x = aEles[index];
  3801. if (x.innerText.toLowerCase().indexOf('overview') > -1) {
  3802. console.log(x);
  3803.  
  3804. let className = x.className;
  3805.  
  3806. let btn = document.createElement('a');
  3807. btn.className = className + ' download';
  3808. btn.innerText = 'DOWNLOAD';
  3809. btn.onclick = () => {
  3810. this.downloadAll()
  3811. };
  3812. x.parentNode.appendChild(btn);
  3813.  
  3814. return true;
  3815. }
  3816. }
  3817.  
  3818. return false;
  3819. }
  3820.  
  3821. async addPostDownloadButton() {
  3822. return new Promise(async (res, rej) => {
  3823. let postEles = [...document.querySelectorAll('.Post')];
  3824. let commentButton = document.querySelector('.icon-comment');
  3825. if (commentButton == null || commentButton == undefined) {
  3826. rej();
  3827. return;
  3828. }
  3829. let buttonClassName = commentButton.parentElement.parentElement.className;
  3830.  
  3831. for (let i = 0; i < postEles.length; i++) {
  3832. const post = postEles[i];
  3833. if (post.classList.contains('TMP_DOWNLOAD_ADDED') || post.querySelector('a[Reddit_Downloader="download"]') != null || post.classList.contains('promotedvideolink') || post == undefined) continue;
  3834. //console.log(post);
  3835. const link = post.querySelector('a[data-click-id="body"]');
  3836. let url;
  3837. if (link == undefined || link == null) {
  3838. if (window.location.href.includes('comments')) {
  3839. url = window.location.href;
  3840.  
  3841. if (post.children.length < 1 || post.children[0].getAttribute('data-test-id') != 'post-content') continue;
  3842.  
  3843. } else {
  3844. continue;
  3845. }
  3846.  
  3847. } else {
  3848. url = link.href
  3849. }
  3850. post.classList.add('TMP_DOWNLOAD_ADDED')
  3851.  
  3852. //TODO clean this shit up
  3853. let dwnBTN = document.createElement('a');
  3854. dwnBTN.className = buttonClassName;
  3855. dwnBTN.innerText = 'DOWNLOAD';
  3856. dwnBTN.setAttribute('Reddit_Downloader', 'download')
  3857. dwnBTN.onclick = () => {
  3858. console.log(`Getting Data from post: ${url}`);
  3859. this._getPostData(url)
  3860. .then(data => {
  3861. if (!document.body.contains(post)) {
  3862. rej();
  3863. return;
  3864. }
  3865. const info = this._parseData(data[0].data.children[0]);
  3866. this.downloadSingle(info);
  3867. })
  3868. };
  3869. post.querySelector('.icon-comment').parentElement.parentElement.parentNode.appendChild(dwnBTN);
  3870.  
  3871. // promises.push(this._getPostData(url)
  3872. // .then(data => {
  3873. // if(!document.body.contains(post)){
  3874. // rej();
  3875. // return;
  3876. // }
  3877. // const info = this._parseData(data[0].data.children[0]);
  3878.  
  3879. // // TODO clean this shit up
  3880. // let dwnBTN = document.createElement('a');
  3881. // dwnBTN.className = buttonClassName;
  3882. // dwnBTN.innerText = 'DOWNLOAD';
  3883. // dwnBTN.setAttribute('Reddit_Downloader', 'download')
  3884. // dwnBTN.onclick = () => this.downloadSingle(info);
  3885. // post.querySelector('.icon-comment').parentElement.parentElement.parentNode.appendChild(dwnBTN);
  3886. // }).catch(() => {}));
  3887. }
  3888.  
  3889. res();
  3890.  
  3891. // Promise.all(promises).then(values => {
  3892. // res();
  3893. // })
  3894. })
  3895. }
  3896.  
  3897. async addSettingsButton() {
  3898. waitForElements('#change-username-tooltip-id', 5000)
  3899. .then(parent => {
  3900. let chatButton = parent[0].children[0];
  3901. let settingsButton = chatButton.cloneNode(true);
  3902.  
  3903. settingsButton.setAttribute('title', 'Reddit Downloader Settings');
  3904. settingsButton.querySelector('a').href = '#';
  3905. settingsButton.querySelector('a').onclick = () => {
  3906. GM_config.open();
  3907. };
  3908. settingsButton.querySelector('svg').setAttribute('viewBox', '0 0 24 24');
  3909. //Icon link: https://iconmonstr.com/gear-1-svg/
  3910. settingsButton.querySelector('path').setAttribute('d', 'M24 13.616v-3.232c-1.651-.587-2.694-.752-3.219-2.019v-.001c-.527-1.271.1-2.134.847-3.707l-2.285-2.285c-1.561.742-2.433 1.375-3.707.847h-.001c-1.269-.526-1.435-1.576-2.019-3.219h-3.232c-.582 1.635-.749 2.692-2.019 3.219h-.001c-1.271.528-2.132-.098-3.707-.847l-2.285 2.285c.745 1.568 1.375 2.434.847 3.707-.527 1.271-1.584 1.438-3.219 2.02v3.232c1.632.58 2.692.749 3.219 2.019.53 1.282-.114 2.166-.847 3.707l2.285 2.286c1.562-.743 2.434-1.375 3.707-.847h.001c1.27.526 1.436 1.579 2.019 3.219h3.232c.582-1.636.75-2.69 2.027-3.222h.001c1.262-.524 2.12.101 3.698.851l2.285-2.286c-.744-1.563-1.375-2.433-.848-3.706.527-1.271 1.588-1.44 3.221-2.021zm-12 2.384c-2.209 0-4-1.791-4-4s1.791-4 4-4 4 1.791 4 4-1.791 4-4 4z');
  3911. parent[0].appendChild(settingsButton);
  3912. })
  3913. .catch(err => {
  3914. this.addSettingsButton();
  3915. });
  3916. }
  3917.  
  3918. async pageUpdateChecker() {
  3919. let isAdded = false;
  3920. let username = await this.getUsername();
  3921.  
  3922. while (true) {
  3923. await wait(50);
  3924. _IsOnUserPage = window.location.href.includes('reddit.com/user/' + username);
  3925.  
  3926. if (!_IsOnUserPage) {
  3927. isAdded = false;
  3928. if (window.RedditDownloader != undefined) await window.RedditDownloader.addPostDownloadButton().catch(() => {});
  3929. }
  3930. if (!isAdded && _IsOnUserPage) {
  3931. if (window.RedditDownloader != undefined) {
  3932. await wait(50);
  3933. isAdded = window.RedditDownloader.addSavedDownloadButton();
  3934. }
  3935. }
  3936. }
  3937. }
  3938.  
  3939. async getUsername() {
  3940. return new Promise(async (res, rej) => {
  3941. let usernameEle = [];
  3942. while (usernameEle == undefined || usernameEle == null || usernameEle.length == 0) {
  3943. usernameEle = await waitForElements('#email-collection-tooltip-id', 5000);
  3944. console.log("CALLED", usernameEle);
  3945. }
  3946.  
  3947. res(usernameEle[0].innerText.split('\n')[0]);
  3948. })
  3949. }
  3950. }
  3951.  
  3952. class OldRedditDownloader extends BaseRedditClass {
  3953. constructor() {
  3954. super();
  3955.  
  3956. //this.addSavedDownloadButton();
  3957. this.addSettingsButton();
  3958. this.pageUpdateChecker();
  3959. }
  3960.  
  3961. async addSavedDownloadButton() {
  3962. return new Promise(async (res) => {
  3963. waitForElements('.tabmenu')
  3964. .then(ele => {
  3965. let tabmenu = ele[0];
  3966.  
  3967. let downloadLi = document.createElement('li');
  3968. let downloadA = document.createElement('a');
  3969. downloadA.classList.add('choice');
  3970. downloadA.innerHTML = 'Download';
  3971. downloadA.style.cursor = 'pointer';
  3972. downloadA.onclick = () => {
  3973. this.downloadAll();
  3974. }
  3975.  
  3976. downloadLi.appendChild(downloadA);
  3977. tabmenu.appendChild(downloadLi);
  3978. })
  3979. .catch(() => {
  3980. res(false);
  3981. })
  3982. })
  3983. }
  3984.  
  3985. async addPostDownloadButton() {
  3986. return new Promise(async (res, rej) => {
  3987. let postEles = [...document.querySelectorAll('.thing[data-subreddit-prefixed]')];
  3988.  
  3989.  
  3990. for (let index = 0; index < postEles.length; index++) {
  3991. const post = postEles[index];
  3992.  
  3993. if (post.classList.contains('TMP_DOWNLOAD_ADDED') || post.querySelector('a[Reddit_Downloader="download"]') != null || post.classList.contains('promotedvideolink') || post == undefined) continue;
  3994.  
  3995. const link = post.querySelector('a[data-event-action="comments"]');
  3996. let url = link;
  3997. post.classList.add('TMP_DOWNLOAD_ADDED')
  3998.  
  3999. const buttons = post.querySelector('.flat-list.buttons');
  4000.  
  4001. const downloadButtonLi = document.createElement('li');
  4002. downloadButtonLi.classList.add('download-button');
  4003. const downloadButtonA = document.createElement('a');
  4004. downloadButtonA.innerHTML = 'Download';
  4005. downloadButtonA.setAttribute('Reddit_Downloader', 'download');
  4006.  
  4007. downloadButtonA.onclick = () => {
  4008. console.log(`Getting Data from post: ${url}`);
  4009. this._getPostData(url)
  4010. .then(data => {
  4011. if (!document.body.contains(post)) {
  4012. rej();
  4013. return;
  4014. }
  4015. const info = this._parseData(data[0].data.children[0]);
  4016. this.downloadSingle(info);
  4017. })
  4018. }
  4019.  
  4020. downloadButtonLi.appendChild(downloadButtonA);
  4021. buttons.appendChild(downloadButtonLi);
  4022.  
  4023. }
  4024.  
  4025. res();
  4026. })
  4027. }
  4028.  
  4029. async addSettingsButton() {
  4030. waitForElements('.tabmenu', 5000)
  4031. .then(parent => {
  4032. let tabmenu = parent[0];
  4033.  
  4034. let downloadLi = document.createElement('li');
  4035. let downloadA = document.createElement('a');
  4036. downloadA.classList.add('choice');
  4037. downloadA.innerHTML = 'RD-Settings';
  4038. downloadA.style.cursor = 'pointer';
  4039. downloadA.onclick = () => {
  4040. GM_config.open();
  4041. }
  4042.  
  4043. downloadLi.appendChild(downloadA);
  4044. tabmenu.appendChild(downloadLi);
  4045. })
  4046. .catch(() => {
  4047. this.addSettingsButton();
  4048. })
  4049. }
  4050.  
  4051. async pageUpdateChecker() {
  4052. let isAdded = false;
  4053. let username = await this.getUsername();
  4054.  
  4055. while (true) {
  4056. await wait(50);
  4057. _IsOnUserPage = window.location.href.includes('reddit.com/user/' + username);
  4058.  
  4059. if (!_IsOnUserPage) {
  4060. isAdded = false;
  4061. if (window.RedditDownloader != undefined) await window.RedditDownloader.addPostDownloadButton().catch(() => {});
  4062. }
  4063. if (!isAdded && _IsOnUserPage) {
  4064. if (window.RedditDownloader != undefined) {
  4065. await wait(50);
  4066. isAdded = await window.RedditDownloader.addSavedDownloadButton();
  4067. }
  4068. }
  4069. }
  4070. }
  4071.  
  4072. async getUsername() {
  4073. return new Promise(async (res, rej) => {
  4074. let usernameEle = [];
  4075. while (usernameEle == undefined || usernameEle == null || usernameEle.length == 0) {
  4076. usernameEle = await waitForElements('.user', 5000);
  4077. console.log("CALLED", usernameEle);
  4078. }
  4079.  
  4080. res(usernameEle[0].children[0].innerText.trim());
  4081. })
  4082. }
  4083. }
  4084. //#endregion
  4085.  
  4086.  
  4087. (async () => {
  4088. if (DEBUG) {
  4089. //let imgur = new Imgur();
  4090. //await imgur.downloadImages('https://imgur.com/a/w0ouO');
  4091.  
  4092. //let direct = new DirectDownload();
  4093. //await direct.downloadImages('')
  4094.  
  4095. //let redgif = new Redgifs();
  4096. //await redgif.downloadImages('');
  4097. }
  4098. })()
  4099.  
  4100. window.addEventListener('load', async () => {
  4101. if (window.top != window.self) {
  4102. return;
  4103. }
  4104.  
  4105. await wait(100);
  4106. let oldReddit = await isOldReddit();
  4107. if (oldReddit)
  4108. window.RedditDownloader = new OldRedditDownloader();
  4109. else
  4110. window.RedditDownloader = new RedditDownloader();
  4111.  
  4112. GM_config.init({
  4113. 'id': 'Reddit_Downloader',
  4114. 'fields': {
  4115. 'create_subreddit_folder': {
  4116. 'label': 'Create a subreddit folder which stores all subreddit entries.',
  4117. 'type': 'checkbox',
  4118. 'default': false
  4119. },
  4120. 'create_only_for_selected': {
  4121. 'label': 'Create a folder only if it passes the filter.',
  4122. 'type': 'checkbox',
  4123. 'default': false
  4124. },
  4125. 'create_for_filter': {
  4126. 'label': 'The names of the subreddits to create a folder for. (comma seperated)',
  4127. 'type': 'text',
  4128. 'size': 9999999,
  4129. 'default': ''
  4130. },
  4131. 'reddit_username': {
  4132. 'label': 'Your Reddit username. Not actually needed right now.',
  4133. 'type': 'text',
  4134. 'size': 9999999,
  4135. 'default': ''
  4136. },
  4137. 'imgur_client_id': {
  4138. 'label': 'Your imgur Client ID. Incase you want to download imgur images/albums.',
  4139. 'type': 'text',
  4140. 'size': 9999999,
  4141. 'default': ''
  4142. },
  4143. 'download_location': {
  4144. 'label': 'The download location of the files. Inside of your Downloads folder.',
  4145. 'type': 'text',
  4146. 'size': 9999999,
  4147. 'default': 'Reddit/Stuff/Stuff/'
  4148. }
  4149. }
  4150. });
  4151.  
  4152. GM_registerMenuCommand('Manage Settings', (() => {
  4153. GM_config.open();
  4154. }));
  4155. })