code:
App.Markets["Husk Slave"] = function() {
	const el = new DocumentFragment();
	let r = [];

	if (V.huskSlaveOrdered === 0) {
		r.push(`You lay out a new order for a braindead slave to be put aside for your use.`);
	} else {
		r.push(`You review your posted husk order.`);
	}
	r.push(`Your order requests a body with the following characteristics:`);

	App.UI.DOM.appendNewElement("p", el, r.join(" "));

	setupHusk();
	el.append(age());
	el.append(sex());
	el.append(nationality());
	el.append(raceSelect());
	el.append(virginity());
	App.UI.DOM.appendNewElement("h2", el, "Reservations");
	el.append(reserve());
	return el;

	function setupHusk() {
		if (V.huskSlave.dick === 0 && V.huskSlave.vagina === -1) {
			V.huskSlave.vagina = 0;
		}
		V.huskSlave.age = Math.clamp(V.huskSlave.age, V.minimumSlaveAge, V.retirementAge - 1);
	}
	function age() {
		const p = document.createElement("p");
		App.UI.DOM.appendNewElement("div", p, "Age:");
		App.UI.DOM.appendNewElement(
			"div",
			p,
			App.UI.DOM.makeTextBox(
				V.huskSlave.age,
				v => {
					V.huskSlave.age = v;
					refresh();
				},
				true
			)
		);
		return p;
	}
	function sex() {
		const p = document.createElement("p");
		p.append("Sex: ");
		if (V.huskSlave.sex === 1) {
			p.append(`Female.`);
		} else if (V.huskSlave.sex === 2) {
			p.append(`Male.`);
		} else if (V.huskSlave.sex === 3) {
			p.append(`Futanari.`);
		}
		const choices = {
			Female: 1,
			Male: 2,
			Both: 3
		};
		p.append(links(choices, "sex"));
		return p;
	}

	function nationality() {
		const p = document.createElement("p");
		App.UI.DOM.appendNewElement("div", p, "Nationality:");
		App.UI.DOM.appendNewElement(
			"div",
			p,
			App.UI.DOM.makeTextBox(
				V.huskSlave.nationality,
				v => {
					V.huskSlave.nationality = v;
					refresh();
				},
			)
		);
		p.append(links(App.Data.misc.baseNationalities.concat(["Stateless"]), "nationality"));
		return p;
	}

	function raceSelect() {
		const p = document.createElement("p");
		App.UI.DOM.appendNewElement("div", p, "Race: ");
		App.UI.DOM.appendNewElement(
			"div",
			p,
			App.UI.DOM.makeTextBox(
				V.huskSlave.race,
				v => {
					V.huskSlave.race = v;
					refresh();
				},
			)
		);

		const linkArray = [];
		const races = new Map(App.Data.misc.filterRacesPublic);
		races.set("not important", "Not Important");
		for (const [race, capRace] of races) {
			if (V.huskSlave.race === race) {
				linkArray.push(
					App.UI.DOM.disabledLink(
						capRace,
						["current selection"]
					)
				);
			} else {
				linkArray.push(
					App.UI.DOM.link(
						capRace,
						() => {
							V.huskSlave.race = race;
							refresh();
						}
					)
				);
			}
		}
		App.UI.DOM.appendNewElement("div", p, App.UI.DOM.generateLinksStrip(linkArray));
		return p;
	}
	function virginity() {
		const p = document.createElement("p");
		p.append("Virginity: ");
		if (V.huskSlave.sex === 1) {
			p.append(`Female.`);
		} else if (V.huskSlave.sex === 2) {
			p.append(`Male.`);
		} else if (V.huskSlave.sex === 3) {
			p.append(`Futanari.`);
		}
		const choices = {
			"Important": 0,
			"Not Important": 1,
		};
		p.append(links(choices, "virgin"));
		return p;
	}

	function reserve() {
		const p = document.createElement("p");
		App.UI.DOM.appendNewElement("div", p, `Reserving a body will cost ${cashFormat(10000)} up front. Canceling an order will refund your money; however, if a delivered body is rejected, your money will not be refunded.`);

		if (V.huskSlaveOrdered === 1) {
			p.append(
				App.UI.DOM.link(
					`Withdraw body order`,
					() => {
						V.huskSlaveOrdered = 0;
						cashX(10000, "slaveTransfer");
					},
					[],
					"Main"
				)
			);
		} else if (V.cash < 10000) {
			App.UI.DOM.appendNewElement("span", p, `You lack the credits to place a body reservation.`, "note");
		} else {
			p.append(
				App.UI.DOM.link(
					`Post body order`,
					() => {
						V.huskSlaveOrdered = 1;
						cashX(-10000, "slaveTransfer");
					},
					[],
					"Main"
				)
			);
		}

		return p;
	}

	function links(choices, global) {
		const linkArray = [];
		if (Array.isArray(choices)) {
			for (let i = 0; i < choices.length; i++) {
				makeLink(choices[i], choices[i]);
			}
		} else {
			for (const choice in choices) {
				makeLink(choice, choices[choice]);
			}
		}
		return App.UI.DOM.makeElement("div", App.UI.DOM.generateLinksStrip(linkArray));

		function makeLink(title, value) {
			if (V.huskSlave[global] === value) {
				linkArray.push(
					App.UI.DOM.disabledLink(
						title,
						["current selection"]
					)
				);
			} else {
				linkArray.push(
					App.UI.DOM.link(
						title,
						() => {
							V.huskSlave[global] = value;
							refresh();
						}
					)
				);
			}
		}
	}

	function refresh() {
		jQuery("#slave-markets").empty().append(App.Markets["Husk Slave"]);
	}
};


code:
App.Markets["Prestigious Slave"] = function() {
	let slave;
	let seed;
	const el = document.createElement("span");
	const options = [
		"porn star",
		"trophy wife",
		"sports star",
		"young model",
		"albino",
		"old-timer",
		"b-list actress",
		"politician",
		"princess",
		"arcology",
		"streamer",
	];
	const dickOptions = [
		"d herm",
		"d young herm",
		"d pornstar",
		"d trophy husband",
		"d sports star",
		"d young model",
		"d albino",
		"d old-timer",
		"d b-list actress",
		"d politician",
		"d princess",
		"d arcology",
		"d streamer",
	];
	App.UI.DOM.appendNewElement("p", el, `You check to see if any especially prestigious slaves are on auction.`);
	const content = App.UI.DOM.appendNewElement("span", el);
	if (V.prestigeAuctioned === 1) {
		App.UI.DOM.appendNewElement("span", el, ` There are none available right now, but there probably will be next week.`);
	} else {
		V.prestigeAuctioned = 1;
		seed = jsEither(Math.random() * 100 < V.seeDicks ? dickOptions : options);
		content.append(passage());
	}
	return el;

	function passage() {
		const frag = new DocumentFragment();
		if (V.cheatMode || V.debugMode) {
			const reload = () => {
				$(content).empty();
				content.append(passage());
			};
			const cheatOptions = (V.seeDicks > 0) ? options.concat(...dickOptions) : Array.from(options);
			frag.append(App.UI.DOM.makeSelect(cheatOptions.map(v => {
				return {key: v, name: capFirstChar(v)};
			}), seed, v => {
				seed = v;
				reload();
			}));
			App.UI.DOM.appendNewElement("span", frag, App.UI.DOM.link(" Refresh slave", reload));
		}
		slave = makeSlave(seed);
		const cost = slaveCost(slave);
		App.UI.DOM.appendNewElement("p", frag, `It will take ${cashFormat(cost)} to win the auction.`);

		if (V.cash >= cost) {
			App.UI.DOM.appendNewElement(
				"p",
				frag,
				App.UI.DOM.link(
					`Place that bid`,
					() => {
						cashX(forceNeg(cost), "slaveTransfer", slave);
						jQuery("#slave-markets").empty().append(App.UI.newSlaveIntro(slave));
					}
				)
			);
		} else {
			App.UI.DOM.appendNewElement("p", frag, `You lack the necessary funds to place a winning bid.`, "note");
		}

		frag.append(App.Desc.longSlave(slave, {market: "generic"}));
		return frag;
	}

	function makeSlave(choice) {
		let slave;
		switch (choice) {
			case "porn star":
				slave = GenerateNewSlave("XX", {minAge: Math.min(24, V.minimumSlaveAge + 6), maxAge: 40, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once a noted adult film star, and was sold into slavery by $his unscrupulous managers.";
				slave.career = "a porn star";
				slave.boobsImplant += random(4, 6) * 200;
				slave.boobs += slave.boobsImplant;
				slave.boobsImplantType = "string";
				if (slave.boobsImplant / slave.boobs >= 0.90) {
					slave.boobShape = "spherical";
					slave.nipples = "flat";
				} else {
					slave.nipples = either("cute", "huge", "puffy");
				}
				slave.areolae = 1;
				slave.butt += 1;
				slave.buttImplant += 1;
				slave.buttImplantType = "normal";
				slave.lips += 10;
				slave.lipsImplant += 10;
				slave.face = Math.clamp(slave.face + 20, -100, 100);
				slave.faceImplant += 20;
				slave.faceShape = "sensual";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				slave.anus = 2;
				slave.vagina = 2;
				slave.weight = 0;
				slave.piercing.genitals.weight = 1;
				slave.piercing.tongue.weight = 1;
				slave.piercing.nipple.weight = 1;
				slave.piercing.nose.weight = 1;
				slave.piercing.ear.weight = 1;
				slave.skill.vaginal = 100;
				slave.skill.oral = 100;
				slave.skill.anal = 100;
				slave.skill.whoring = 15;
				slave.skill.entertainment = 100;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy");
				slave.fetish = "none";
				slave.fetishKnown = 1;
				slave.custom.desc = "$He has seen and done almost everything sexually possible, on camera.";
				break;
			case "trophy wife":
				slave = GenerateNewSlave("XX", {minAge: Math.min(19, Math.max(V.fertilityAge, V.minimumSlaveAge) + 1), maxAge: 22, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once the young trophy $wife of a powerful man in the old world, but he sold $him into slavery in revenge for $his infidelity.";
				slave.career = "a trophy wife";
				slave.boobsImplant += random(1, 3) * 200;
				slave.boobs += slave.boobsImplant;
				slave.boobsImplantType = "normal";
				slave.butt += 1;
				slave.buttImplant += 1;
				slave.buttImplantType = "normal";
				slave.lips += 10;
				slave.lipsImplant += 10;
				slave.face = Math.clamp(slave.face + 20, -100, 100);
				slave.faceImplant += 20;
				slave.faceShape = "sensual";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(60, 80), 0, 0, 0);
				slave.anus = 1;
				slave.vagina = 1;
				slave.weight = 0;
				slave.piercing.genitals.weight = 1;
				slave.piercing.nipple.weight = 1;
				slave.piercing.ear.weight = 1;
				slave.skill.vaginal = 35;
				slave.skill.oral = 35;
				slave.skill.anal = 15;
				slave.skill.whoring = 35;
				slave.skill.entertainment = 15;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy");
				slave.fetish = "none";
				slave.fetishKnown = 1;
				slave.custom.tattoo = "$His ex-husband's name is prettily tattooed on $his left arm, but a black line has been subsequently tattooed across it.";
				break;
			case "sports star":
				slave = GenerateNewSlave("XX", {minAge: 21, maxAge: 25, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once expected to become a major sports star, but flamed out due to injury and was recently enslaved due to debt.";
				slave.career = "an athlete";
				slave.intelligence = random(-90, -20);
				slave.intelligenceImplant = 0;
				slave.muscles = 50;
				slave.heels = 1;
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(80, 90), 0, jsRandom(5, 10), 0, jsRandom(10, 30));
				slave.anus = 1;
				slave.vagina = 1;
				slave.weight = 0;
				slave.piercing.ear.weight = 1;
				slave.piercing.eyebrow.weight = random(0, 1);
				slave.piercing.nose.weight = random(0, 1);
				slave.piercing.navel.weight = random(0, 1);
				slave.skill.vaginal = 15;
				slave.skill.oral = 15;
				slave.skill.anal = 0;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 0;
				slave.skill.combat = 1;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.sexualFlaw = either("hates anal", "hates oral", "hates penetration");
				slave.behavioralFlaw = "arrogant";
				slave.custom.desc = "$He's not particularly bright, and enjoys solving problems with physical force.";
				break;
			case "young model":
				slave = GenerateNewSlave("XX", {maxAge: 21, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once a rising young model, but apparently someone decided to take a shortcut in cashing in on $his great beauty.";
				slave.career = "a model";
				slave.boobs = random(2, 4) * 100;
				slave.butt = random(1, 3);
				slave.lips = random(15, 25);
				slave.face = 55;
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-20, 20), 0, 0, 0, jsRandom(10, 30));
				slave.anus = 1;
				slave.vagina = 1;
				slave.weight = 0;
				slave.piercing.ear.weight = 1;
				slave.skill.vaginal = 15;
				slave.skill.oral = 15;
				slave.skill.anal = 0;
				slave.skill.whoring = 15;
				slave.skill.entertainment = 35;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.behavioralFlaw = either("anorexic", "arrogant");
				slave.custom.desc = "$He moves with the practiced grace of someone who unconsciously still pictures $himself on the runway.";
				break;
			case "albino":
				slave = GenerateNewSlave("XX", {maxAge: 18, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He is a natural albino, and was quickly enslaved due to the great demand for physically unusual specimens.";
				slave.geneticQuirks.albinism = 2;
				slave.albinismOverride = {skin: "pure white", eyeColor: "pale grey", hColor: "white"};
				applyGeneticColor(slave);
				slave.career = "a slave";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				eyeSurgery(slave, "both", "blur");
				setHealth(slave, jsRandom(40, 60), 0, 0, 0, jsRandom(10, 30));
				slave.custom.desc = "$His eyes are unsettling; though $his irises are a pale grey color, in some lights the whole eye takes on a red cast.";
				break;
			case "old-timer":
				slave = GenerateNewSlave("XX", {
					minAge: (V.minimumSlaveAge + 15), maxAge: 35, disableDisability: 1, ageOverridesPedoMode: 1
				});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 2;
				slave.prestigeDesc = "$He is one of the longest legally-enslaved persons in the world, having been a slave for 15 years. $He has spent almost all that time working as a slave prostitute, and has been heavily modified to keep $him productive.";
				slave.career = "a slave";
				slave.boobsImplant += random(10, 15) * 200;
				slave.boobs += slave.boobsImplant;
				slave.boobsImplantType = "fillable";
				if (slave.boobsImplant / slave.boobs >= 0.90) {
					slave.boobShape = "spherical";
					slave.nipples = "flat";
				} else {
					slave.nipples = either("cute", "huge", "puffy");
				}
				slave.areolae = 2;
				slave.butt += 4;
				slave.buttImplant += 4;
				slave.buttImplantType = "fillable";
				slave.lips = random(75, 85);
				slave.lipsImplant = 50;
				slave.face = 55;
				slave.faceImplant = 40;
				slave.faceShape = "exotic";
				slave.devotion = random(25, 45);
				slave.trust = random(0, 15);
				setHealth(slave, jsRandom(20, 40), 0, jsRandom(0, 5), 0, jsRandom(10, 30));
				slave.anus = 3;
				slave.vagina = 3;
				slave.weight = 0;
				slave.piercing.genitals.weight = 2;
				slave.piercing.tongue.weight = 2;
				slave.piercing.nipple.weight = 2;
				slave.piercing.nose.weight = 2;
				slave.piercing.lips.weight = 2;
				slave.piercing.vagina.weight = 2;
				slave.piercing.anus.weight = 2;
				slave.piercing.navel.weight = 2;
				slave.piercing.eyebrow.weight = 2;
				slave.piercing.ear.weight = 2;
				slave.skill.vaginal = 100;
				slave.skill.oral = 100;
				slave.skill.anal = 100;
				slave.skill.whoring = 100;
				slave.skill.entertainment = 0;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.sexualFlaw = "none";
				slave.behavioralFlaw = "none";
				slave.energy = 100;
				slave.fetish = "none";
				slave.fetishKnown = 1;
				slave.custom.desc = "$He has almost no inhibitions left at all.";
				slave.custom.tattoo = "'50,000 Served!' is tattooed across $his back.";
				slave.counter.publicUse += 1000;
				break;
			case "b-list actress":
				slave = GenerateNewSlave("XX", {minAge: 24, maxAge: 28, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 2;
				slave.prestigeDesc = "$He was once a B-list actress, but fell on hard times and drug addiction and was recently enslaved due to debt.";
				slave.career = "an actress";
				slave.boobs += 200;
				slave.boobsImplant += 200;
				slave.boobsImplantType = "normal";
				slave.butt += 1;
				slave.buttImplant += 1;
				slave.buttImplantType = "normal";
				slave.lips += 10;
				slave.lipsImplant += 10;
				slave.face = 55;
				slave.faceImplant += 20;
				slave.faceShape = "cute";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-70, -40), undefined, undefined, 0, jsRandom(30, 80));
				slave.anus = 1;
				slave.vagina = 1;
				slave.weight = 0;
				slave.piercing.ear.weight = 1;
				slave.skill.vaginal = 15;
				slave.skill.oral = 15;
				slave.skill.anal = 15;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 100;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.addict = 20;
				slave.sexualFlaw = either("hates anal", "hates oral", "hates penetration");
				slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy", "odd");
				slave.custom.desc = "$He sometimes forgets $himself and acts as though $he were still a coming celebrity.";
				break;
			case "politician":
				slave = GenerateNewSlave("XX", {minAge: 38, maxAge: 42, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 2;
				slave.prestigeDesc = "$He was once a rising old world politician, but was forced to flee from the increasingly dangerous politics common in a stressed world, and was subsequently enslaved.";
				slave.career = "a politician";
				slave.boobs += 100;
				slave.butt += 1;
				slave.face = Math.clamp(slave.face + 20, -100, 100);
				slave.faceImplant += 20;
				slave.faceShape = "normal";
				slave.height += 10;
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-45, -25), 0, 0, 0, jsRandom(30, 70));
				slave.anus = 0;
				slave.vagina = 1;
				slave.weight = 0;
				slave.skill.vaginal = 15;
				slave.skill.oral = 0;
				slave.skill.anal = 0;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 35;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.behavioralFlaw = either("arrogant", "bitchy");
				slave.custom.tattoo = "A small tattoo of the crest of an old world sorority is visible on $his left shoulder blade.";
				slave.custom.desc = "$His face is still recognizable as that which once graced a million campaign posters.";
				break;
			case "princess":
				slave = GenerateNewSlave("XX", {maxAge: 18, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 3;
				slave.prestigeDesc = "$He was born a $daughter of royalty, but $his family was overthrown when $he was still young. $He is a graduate cum laude of the world's most renowned slave school.";
				slave.career = "a slave";
				slave.boobs += 100;
				slave.butt += 1;
				slave.lips += 10;
				slave.face = Math.clamp(slave.face + 20, -100, 100);
				slave.height += 10;
				slave.devotion = random(75, 90);
				slave.trust = random(-45, -25);
				setHealth(slave, 100, 0, 0, 0, jsRandom(0, 20));
				slave.anus = 0;
				slave.vagina = 0;
				slave.weight = 0;
				slave.skill.vaginal = 0;
				slave.skill.oral = 100;
				slave.skill.anal = 0;
				slave.skill.whoring = 15;
				slave.skill.entertainment = 35;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.sexualFlaw = "none";
				slave.behavioralFlaw = "none";
				slave.custom.tattoo = "$His family crest is tattooed on $his cheek.";
				slave.custom.desc = "$His recognizable face marks $him as a descendant of an overthrown royal family.";
				break;
			case "arcology":
				slave = GenerateNewSlave("XX", {minAge: 28, maxAge: 42, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 3;
				slave.prestigeDesc = "$He was once an arcology owner like you, but lost a Free Cities power struggle and was enslaved. An object lesson in the need to stay vigilant.";
				slave.career = "an arcology owner";
				slave.boobsImplant += random(20, 40) * 200;
				slave.boobs += slave.boobsImplant;
				slave.boobsImplantType = "advanced fillable";
				slave.boobs += 1000;
				if (slave.boobsImplant / slave.boobs >= 0.90) {
					slave.boobShape = "spherical";
					slave.nipples = "flat";
				} else {
					slave.nipples = either("cute", "huge", "puffy");
				}
				slave.areolae = 2;
				slave.buttImplant += random(6, 8);
				slave.butt += slave.buttImplant;
				slave.buttImplantType = "advanced fillable";
				slave.heels = 1;
				slave.voice = 0;
				slave.lips = random(75, 85);
				slave.lipsImplant = 50;
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-70, -60), undefined, undefined, undefined, jsRandom(40, 90));
				slave.anus = 3;
				slave.vagina = 3;
				slave.weight = -20;
				slave.piercing.nipple.weight = 2;
				slave.piercing.genitals.weight = 2;
				slave.piercing.vagina.weight = 2;
				slave.piercing.dick.weight = 2;
				slave.piercing.anus.weight = 2;
				slave.piercing.lips.weight = 2;
				slave.piercing.tongue.weight = 2;
				slave.piercing.ear.weight = 2;
				slave.piercing.nose.weight = 2;
				slave.piercing.eyebrow.weight = 2;
				slave.piercing.navel.weight = 2;
				slave.boobsTat = "rude words";
				slave.buttTat = "rude words";
				slave.vaginaTat = "rude words";
				slave.dickTat = "rude words";
				slave.lipsTat = "rude words";
				slave.anusTat = "rude words";
				slave.shouldersTat = "rude words";
				slave.armsTat = "rude words";
				slave.legsTat = "rude words";
				slave.stampTat = "rude words";
				slave.skill.vaginal = 15;
				slave.skill.oral = 15;
				slave.skill.anal = 15;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 0;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.hStyle = "shaved";
				slave.hLength = 0;
				slave.behavioralFlaw = either("odd");
				slave.custom.desc = "$His back is covered in a fine network of hairline scars, as though $he's been repeatedly flogged bloody, healed with curatives, and then flogged again.";
				slave.custom.tattoo = "'ARCOLOGY OWNER' is tattooed across $his forehead.";
				break;
			case "streamer":
				slave = GenerateNewSlave("XX", {maxAge: 28, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once a popular creator on a live streaming service, but donations dropped off after getting caught up in some controversy.";
				slave.career = "a camgirl";
				slave.boobs = random(1, 4) * 100;
				slave.butt = random(1, 3);
				slave.lips = random(15, 25);
				slave.face = 55;
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-45, -25), 0, 0, 0, jsRandom(30, 70));
				slave.anus = 1;
				slave.vagina = 1;
				slave.weight = 20;
				slave.piercing.ear.weight = 1;
				slave.skill.vaginal = 15;
				slave.skill.oral = 15;
				slave.skill.anal = 1;
				slave.skill.whoring = 5;
				slave.skill.entertainment = 70;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.behavioralFlaw = either("arrogant", "bitchy", "odd");
				slave.custom.desc = "$He is very comfortable in front of a camera and in public performances, having spent a long time entertaining $his viewers.";
				break;
			case "d herm":
				slave = GenerateNewSlave("XY", {
					minAge: 24, maxAge: 40, disableDisability: 1, ageOverridesPedoMode: 1
				});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He is a natural-born hermaphrodite. $He was enslaved as an adult and subjected to treatment to upgrade both $his halves to full functionality.";
				slave.devotion = random(-45, -25);
				slave.trust = random(-90, -75);
				setHealth(slave, jsRandom(-40, -30), undefined, undefined, 0, jsRandom(30, 70));
				slave.chem = 100;
				slave.anus = random(1, 2);
				slave.dick = random(1, 2);
				if (slave.dick > 0) {
					slave.foreskin = slave.dick;
				}
				slave.prostate = 1;
				slave.vagina = 1;
				slave.ovaries = 1;
				slave.preg = 0;
				slave.balls = random(1, 2);
				if (slave.balls > 0) {
					slave.scrotum = slave.balls;
				}
				slave.weight = random(-80, -20);
				slave.attrXX = random(30, 50);
				slave.attrXY = random(30, 50);
				slave.energy = random(5, 20);
				slave.skill.vaginal = 0;
				slave.skill.oral = 15;
				slave.skill.anal = 15;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 0;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.custom.desc = "$He has had a very difficult time adjusting to $his unusual biology.";
				break;
			case "d young herm":
				slave = GenerateNewSlave("XX", {maxAge: 19, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He is a natural-born hermaphrodite. $He received treatment to ensure both $his halves would be fully functional from an early age.";
				slave.career = "a slave";
				slave.devotion = random(25, 45);
				slave.trust = random(25, 45);
				setHealth(slave, jsRandom(0, 20), 0, 0, 0, jsRandom(20, 60));
				slave.chem = 200;
				slave.boobs += 100 * random(2, 4);
				slave.butt += random(1, 2);
				slave.anus = 1;
				slave.dick = random(4, 6);
				slave.prostate = 1;
				if (slave.dick > 0) {
					slave.foreskin = slave.dick;
				}
				slave.balls = random(4, 6);
				if (slave.balls > 0) {
					slave.scrotum = slave.balls;
				}
				slave.weight = random(20, 80);
				slave.attrXX = random(80, 100);
				slave.attrXY = random(80, 100);
				slave.energy = random(60, 90);
				slave.skill.vaginal = 0;
				slave.skill.oral = 0;
				slave.skill.anal = 0;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 15;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.sexualFlaw = "none";
				slave.behavioralFlaw = "none";
				slave.sexualQuirk = either("caring", "perverted", "romantic", "tease");
				slave.behavioralQuirk = either("adores men", "adores women", "advocate", "confident", "cutting", "funny");
				slave.custom.desc = "$He is very comfortable with $his unusual biology.";
				break;
			case "d pornstar":
				slave = GenerateNewSlave("XY", {minAge: 24, maxAge: 40, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once a noted adult film star, and was sold into slavery by $his unscrupulous managers.";
				slave.career = "a porn star";
				slave.boobsImplant += random(4, 6) * 200;
				slave.boobs += slave.boobsImplant;
				slave.boobsImplantType = "fillable";
				if (slave.boobsImplant / slave.boobs >= 0.90) {
					slave.boobShape = "spherical";
					slave.nipples = "flat";
				} else {
					slave.nipples = either("cute", "huge", "puffy");
				}
				slave.areolae = 1;
				slave.butt += 1;
				slave.buttImplant += 1;
				slave.buttImplantType = "normal";
				slave.lips += 10;
				slave.lipsImplant += 10;
				slave.face = Math.clamp(slave.face + 20, -100, 100);
				slave.faceImplant += 20;
				slave.faceShape = "androgynous";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, undefined, undefined, undefined, undefined, jsRandom(30, 70));
				slave.anus = 3;
				slave.dick = 5;
				if (slave.foreskin > 0) {
					slave.foreskin = slave.dick;
				}
				slave.balls = 5;
				if (slave.balls > 0) {
					slave.scrotum = slave.balls;
				}
				slave.weight = 0;
				slave.piercing.genitals.weight = 1;
				slave.piercing.tongue.weight = 1;
				slave.piercing.nipple.weight = 1;
				slave.piercing.nose.weight = 1;
				slave.piercing.ear.weight = 1;
				slave.skill.oral = 100;
				slave.skill.anal = 100;
				slave.skill.whoring = 15;
				slave.skill.entertainment = 100;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy");
				slave.fetish = "none";
				slave.fetishKnown = 1;
				slave.custom.desc = "$He has seen and done almost everything sexually possible, on camera.";
				break;
			case "d trophy husband":
				slave = GenerateNewSlave("XY", {minAge: 19, maxAge: 22, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once the young trophy husband of a powerful woman in the old world, but she sold $him into slavery in revenge for $his infidelities.";
				slave.career = "a trophy spouse";
				slave.face = Math.clamp(slave.face + 20, -100, 100);
				slave.faceImplant += 20;
				slave.faceShape = "cute";
				slave.muscles = random(20, 100);
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(60, 80), 0, 0, 0, jsRandom(10, 30));
				slave.weight = 0;
				slave.piercing.genitals.weight = 1;
				slave.skill.oral = 15;
				slave.skill.anal = 0;
				slave.skill.whoring = 15;
				slave.skill.entertainment = 15;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.behavioralFlaw = either("arrogant", "bitchy");
				slave.fetish = "none";
				slave.fetishKnown = 1;
				slave.custom.tattoo = "$His ex-wife's name is prettily tattooed on $his left arm, but a black line has been subsequently tattooed across it.";
				break;
			case "d sports star":
				slave = GenerateNewSlave("XY", {minAge: 21, maxAge: 25, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once expected to become a major sports star, but flamed out due to injury and was recently enslaved due to debt.";
				slave.career = "an athlete";
				slave.intelligence = random(-90, -20);
				slave.intelligenceImplant = 0;
				slave.muscles = 50;
				slave.heels = 1;
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(80, 90), 0, jsRandom(5, 10), 0, jsRandom(20, 50));
				slave.anus = 1;
				slave.dick = random(3, 5);
				if (slave.dick > 0) {
					slave.foreskin = slave.dick;
				}
				slave.balls = random(3, 5);
				if (slave.balls > 0) {
					slave.scrotum = slave.balls;
				}
				slave.weight = 0;
				slave.skill.oral = 15;
				slave.skill.anal = 0;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 0;
				slave.skill.combat = 1;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.sexualFlaw = either("hates anal", "hates oral", "hates penetration");
				slave.behavioralFlaw = "arrogant";
				slave.custom.desc = "$He's not particularly bright, and enjoys solving problems with physical force.";
				break;
			case "d young model":
				slave = GenerateNewSlave("XY", {maxAge: 21, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once a rising young model, but apparently someone decided to take a shortcut in cashing in on $his great beauty.";
				slave.career = "a model";
				slave.boobs = random(1, 3) * 100;
				slave.butt = random(1, 2);
				slave.muscles = 20;
				slave.lips = random(15, 25);
				slave.face = 55;
				slave.faceImplant = 20 * random(1, 2);
				slave.faceShape = "androgynous";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-20, 20), 0, 0, 0, jsRandom(10, 30));
				slave.anus = 2;
				slave.weight = 0;
				slave.piercing.ear.weight = 1;
				slave.skill.oral = 100;
				slave.skill.anal = 0;
				slave.skill.whoring = 15;
				slave.skill.entertainment = 35;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.sexualFlaw = either("judgemental");
				slave.behavioralFlaw = either("anorexic", "arrogant", "hates women");
				slave.custom.desc = "$He moves with the practiced grace of someone who unconsciously still pictures $himself on the runway.";
				break;
			case "d albino":
				slave = GenerateNewSlave("XY", {maxAge: 18, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He is a natural albino, and was quickly enslaved due to the great demand for physically unusual specimens.";
				slave.geneticQuirks.albinism = 2;
				slave.albinismOverride = {skin: "pure white", eyeColor: "pale grey", hColor: "white"};
				applyGeneticColor(slave);
				slave.career = "a slave";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				eyeSurgery(slave, "both", "blur");
				setHealth(slave, jsRandom(40, 60), 0, 0, 0, jsRandom(10, 30));
				slave.custom.desc = "$His eyes are unsettling; though $his irises are a pale grey color, in some lights the whole eye takes on a red cast.";
				break;
			case "d old-timer":
				slave = GenerateNewSlave("XY", {
					minAge: (V.minimumSlaveAge + 15), maxAge: 35, disableDisability: 1, ageOverridesPedoMode: 1
				});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 2;
				slave.prestigeDesc = "$He is one of the longest legally-enslaved persons in the world, having been a slave for 15 years. $He has spent almost all that time working as a slave prostitute, and has been heavily modified to keep $him productive.";
				slave.career = "a prostitute";
				slave.boobsImplant += random(10, 15) * 200;
				slave.boobs += slave.boobsImplant;
				slave.boobsImplantType = "advanced fillable";
				if (slave.boobsImplant / slave.boobs >= 0.90) {
					slave.boobShape = "spherical";
					slave.nipples = "flat";
				} else {
					slave.nipples = either("cute", "huge", "puffy");
				}
				slave.areolae = 2;
				slave.butt += 4;
				slave.buttImplant += 4;
				slave.buttImplantType = "fillable";
				slave.lips = random(25, 55);
				slave.lipsImplant = 25;
				slave.face = 55;
				slave.faceImplant = 40;
				slave.faceShape = "exotic";
				slave.devotion = random(25, 45);
				slave.trust = random(0, 15);
				setHealth(slave, jsRandom(20, 40), undefined, jsRandom(5, 10), undefined, jsRandom(30, 70));
				slave.anus = 3;
				slave.dick = 1;
				if (slave.foreskin > 0) {
					slave.foreskin = slave.dick;
				}
				if (slave.balls > 0) {
					slave.scrotum = slave.balls;
				}
				slave.balls = 0;
				slave.weight = 0;
				slave.piercing.genitals.weight = 2;
				slave.piercing.tongue.weight = 2;
				slave.piercing.nipple.weight = 2;
				slave.piercing.nose.weight = 2;
				slave.piercing.lips.weight = 2;
				slave.piercing.vagina.weight = 2;
				slave.piercing.anus.weight = 2;
				slave.piercing.navel.weight = 2;
				slave.piercing.eyebrow.weight = 2;
				slave.piercing.ear.weight = 2;
				slave.skill.oral = 100;
				slave.skill.anal = 100;
				slave.skill.whoring = 100;
				slave.skill.entertainment = 0;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.sexualFlaw = "none";
				slave.behavioralFlaw = "none";
				slave.energy = 100;
				slave.fetish = "none";
				slave.fetishKnown = 1;
				slave.custom.desc = "$He has almost no inhibitions left at all.";
				slave.custom.tattoo = "'50,000 Served!' is tattooed across $his back.";
				slave.counter.publicUse += 1000;
				break;
			case "d b-list actress":
				slave = GenerateNewSlave("XY", {minAge: 24, maxAge: 28, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 2;
				slave.prestigeDesc = "$He was once a B-list actress, but fell on hard times and drug addiction and was recently enslaved due to debt.";
				slave.career = "an actress";
				slave.boobs += 200;
				slave.boobsImplant += 200;
				slave.boobsImplantType = "normal";
				slave.butt += 1;
				slave.buttImplant += 1;
				slave.buttImplantType = "normal";
				slave.lips += 10;
				slave.lipsImplant += 10;
				slave.face = 55;
				slave.faceImplant += 20;
				slave.faceShape = "cute";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-80, -40), 0, 0, 0, jsRandom(30, 70));
				slave.anus = 1;
				slave.weight = 0;
				slave.piercing.ear.weight = 1;
				slave.skill.oral = 15;
				slave.skill.anal = 15;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 100;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.addict = 20;
				slave.sexualFlaw = either("hates anal", "hates oral", "hates penetration");
				slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy", "odd");
				slave.custom.desc = "$He sometimes forgets $himself and acts as though $he were still a coming celebrity.";
				break;
			case "d politician":
				slave = GenerateNewSlave("XY", {minAge: 38, maxAge: 42, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 2;
				slave.prestigeDesc = "$He was once a rising old world politician, but was forced to flee from the increasingly dangerous politics common in a stressed world, and was subsequently enslaved.";
				slave.career = "a politician";
				slave.muscles = random(10, 50);
				slave.height = random(160, 200);
				slave.face = Math.clamp(slave.face + 20, -100, 100);
				slave.faceImplant += 20;
				slave.faceShape = "masculine";
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(60, 80), 0, 0, 0, jsRandom(30, 70));
				slave.anus = 0;
				slave.weight = 0;
				slave.skill.oral = 0;
				slave.skill.anal = 0;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 35;
				slave.behavioralFlaw = either("arrogant", "bitchy");
				slave.custom.tattoo = "A small tattoo of the crest of an old world fraternity is visible on $his left shoulder blade.";
				slave.custom.desc = "$His face is still recognizable as that which once graced a million campaign posters.";
				break;
			case "d princess":
				slave = GenerateNewSlave("XY", {maxAge: 18, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 3;
				slave.prestigeDesc = "$He was born a child of royalty, but $his family was overthrown when $he was still young. $He is a graduate cum laude of the world's most renowned slave school.";
				slave.career = "a slave";
				slave.boobs += 100;
				slave.butt += 1;
				slave.lips += 10;
				slave.face = Math.clamp(slave.face + 20, -100, 100);
				slave.height += 10;
				slave.devotion = random(75, 85);
				slave.trust = random(-45, -25);
				setHealth(slave, 100, 0, 0, 0, jsRandom(0, 20));
				slave.anus = 0;
				slave.dick = 2;
				if (slave.foreskin > 0) {
					slave.foreskin = slave.dick;
				}
				slave.balls = 1;
				if (slave.balls > 0) {
					slave.scrotum = slave.balls;
				}
				slave.weight = 0;
				slave.skill.vaginal = 0;
				slave.skill.oral = 100;
				slave.skill.anal = 0;
				slave.skill.whoring = 15;
				slave.skill.entertainment = 35;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.sexualFlaw = "none";
				slave.behavioralFlaw = "none";
				slave.custom.tattoo = "$His family crest is tattooed on $his cheek.";
				slave.custom.desc = "$His recognizable face marks $him as a descendant of an overthrown royal family.";
				break;
			case "d arcology":
				slave = GenerateNewSlave("XY", {minAge: 28, maxAge: 42, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 3;
				slave.prestigeDesc = "$He was once an arcology owner like you, but lost a Free Cities power struggle and was enslaved. An object lesson in the need to stay vigilant.";
				slave.career = "an arcology owner";
				slave.muscles = random(10, 50);
				slave.heels = 1;
				slave.voice = 0;
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-80, -60), undefined, undefined, undefined, jsRandom(40, 90));
				slave.anus = 3;
				slave.weight = -20;
				slave.piercing.nipple.weight = 2;
				slave.piercing.genitals.weight = 2;
				slave.piercing.vagina.weight = 2;
				slave.piercing.dick.weight = 2;
				slave.piercing.anus.weight = 2;
				slave.piercing.lips.weight = 2;
				slave.piercing.tongue.weight = 2;
				slave.piercing.ear.weight = 2;
				slave.piercing.nose.weight = 2;
				slave.piercing.eyebrow.weight = 2;
				slave.piercing.navel.weight = 2;
				slave.boobsTat = "rude words";
				slave.buttTat = "rude words";
				slave.vaginaTat = "rude words";
				slave.dickTat = "rude words";
				slave.lipsTat = "rude words";
				slave.anusTat = "rude words";
				slave.shouldersTat = "rude words";
				slave.armsTat = "rude words";
				slave.legsTat = "rude words";
				slave.stampTat = "rude words";
				slave.skill.oral = 15;
				slave.skill.anal = 15;
				slave.skill.whoring = 0;
				slave.skill.entertainment = 0;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.hStyle = "shaved";
				slave.hLength = 0;
				slave.behavioralFlaw = either("odd");
				slave.custom.desc = "$His back is covered in a fine network of hairline scars, as though $he's been repeatedly flogged bloody, healed with curatives, and then flogged again.";
				slave.custom.tattoo = "'ARCOLOGY OWNER' is tattooed across $his forehead.";
				break;
			case "d streamer":
				slave = GenerateNewSlave("XY", {maxAge: 28, disableDisability: 1});
				slave.origin = "You bought $him at auction.";
				slave.prestige = 1;
				slave.prestigeDesc = "$He was once a popular creator on a live streaming service, but donations dropped off after getting caught up in some controversy.";
				slave.career = "a camgirl";
				slave.boobs = random(1, 3) * 100;
				slave.butt = random(1, 2);
				slave.muscles = random(0, 20);
				slave.lips = random(15, 25);
				slave.face = random(20, 55);
				slave.faceShape = either("androgynous", "masculine");
				slave.devotion = random(-90, -80);
				slave.trust = random(-45, -25);
				setHealth(slave, jsRandom(-45, -25), 0, 0, 0, jsRandom(20, 60));
				slave.anus = 2;
				slave.weight = 20;
				slave.piercing.ear.weight = 1;
				slave.skill.oral = 30;
				slave.skill.anal = 1;
				slave.skill.whoring = 5;
				slave.skill.entertainment = 70;
				slave.pubicHStyle = "waxed";
				slave.underArmHStyle = "waxed";
				slave.behavioralFlaw = either("arrogant", "bitchy", "odd");
				slave.custom.desc = "$He is very comfortable in front of a camera and in public performances, having spent a long time entertaining $his viewers.";
		}
		return slave;
	}
};

license: mit


code:
App.Markets.TFS = function() {
	const el = new DocumentFragment();
	let r = [];

	if (V.TFS.schoolPresent === 1) {
		App.UI.DOM.appendNewElement("p", el, `You pay a visit to the Futanari Sisters. They occupy a suite remodeled for their very special needs; it's surprisingly small, to house so many girls, since they live communally and do not believe in privacy. You are the only outsider permitted to enter the outer door. As you move towards the center of the suite, you pass through the outer ring of sleeping areas, kitchens, medical rooms, and workout stations that surround the inner sanctum.`);

		r.push(`This is a large, circular room with a shallow depression in the floor, filled with pillows and naked, fucking futas. Every possible interaction between mouths, nipples, breasts, penises, vaginas, and anuses is taking place, with most participants managing several at once. They are all very, very pretty, and it's easier to distinguish the older ones by their bigger tits, asses and cocks than by their apparent age. The older futas tend to be on top, but this is by no means the rule, and they like to switch around often.`);
		if (V.TFS.schoolUpgrade !== 0) {
			if (V.TFS.schoolUpgrade === 1) {
				r.push(`As they move, their lack of apparent testes catches your eye; the end result of your gracious endowment.`);
			} else if (V.TFS.schoolUpgrade === 2) {
				r.push(`As they move about, their swollen balls catch your eye; the end result of your gracious endowment.`);
			} else if (V.TFS.schoolUpgrade === 3 && V.TFS.compromiseWeek + 15 <= V.week) {
				r.push(`You beam over the variety of futas splayed out before you, proud that your endowment made this possible.`);
			}
		}
		App.UI.DOM.appendNewElement("p", el, r.join(" "));

		if (V.TFS.farmUpgrade === 2) {
			if (V.TFS.farmUpgradeAsked < V.week - 10) {
				App.UI.DOM.appendNewElement("p", el, `It's been long enough since you allowed them to use your organ farm to add ovaries to themselves and instructed them not to use contraceptives that most of them are visibly pregnant. This hasn't slowed their sexual congress at all, though. They've become much more focused on vaginal, and there's an obvious eagerness to cum inside Sisters who aren't obviously pregnant.`);
			} else {
				App.UI.DOM.appendNewElement("p", el, `It hasn't been long enough since you allowed them to use your organ farm to add ovaries to themselves for the effects to be obvious yet. Most of them are doubtless pregnant, however. There's been a subtle shift in their sexual behavior, too: they're much more likely to focus on vaginal sex than they were before, so much so that they often double penetrate each other's pussies. When there aren't any cunts available, they do their best to hold their orgasms until one opens up, so to speak.`);
			}
		} else if (V.TFS.farmUpgrade === 3) {
			if (V.TFS.farmUpgradeAsked < V.week - 20) {
				App.UI.DOM.appendNewElement("p", el, `It's been long enough since you allowed them to use your organ farm to add ovaries to themselves and instructed them not to use contraceptives that most of them are extremely pregnant. This hasn't slowed their sexual congress at all, though they've had to get creative with their positioning. They've become much more focused on vaginal, and there's an obvious eagerness to cum inside Sisters who aren't obviously pregnant.`);
			} else if (V.TFS.farmUpgradeAsked < V.week - 10) {
				App.UI.DOM.appendNewElement("p", el, `It's been long enough since you allowed them to use your organ farm to add ovaries to themselves and instructed them not to use contraceptives that most of them are visibly pregnant. This hasn't slowed their sexual congress at all, though. They've become much more focused on vaginal, and there's an obvious eagerness to cum inside Sisters who aren't obviously pregnant.`);
			} else {
				App.UI.DOM.appendNewElement("p", el, `It hasn't been long enough since you allowed them to use your organ farm to add ovaries to themselves for the effects to be obvious yet. Most of them are doubtless pregnant, however. There's been a subtle shift in their sexual behavior, too: they're much more likely to focus on vaginal sex than they were before, so much so that they often double penetrate each other's pussies. When there aren't any cunts available, they do their best to hold their orgasms until one opens up, so to speak.`);
			}
		}
		App.UI.DOM.appendNewElement("p", el, `Visitors are not common: in fact, visitors are only as frequent as you feel like visiting. It takes a while before they notice you. When a dreamy-eyed young futa finally does, she reaches a lazy hand over to alert the eldest one present by tugging on one of her nipples and pointing in your direction. The elder looks over at you and gives you a friendly wave followed by a wait-one-moment gesture. She's curled up on her back with her cockhead in her own mouth, using both hands to give her own shaft a boob job while a younger futa eats her ass and fingers her pussy. The futa matron orgasms promptly, sucking down her own cum. She gets up languidly, her plush body, softening forearm-sized dick, and enormous natural boobs making it a wonderful sight.`);

		r = [];
		if (V.PC.title === 1) {
			r.push(`"Protector,`);
		} else {
			r.push(`"Protectrix,`);
		}
		r.push(`thank you so much for coming to see us. Our own Selection of a Sister to serve in slavery is not to take place for some time, but our communications interface in that side room," she points, "will permit you to access a regional listing of Selected Sisters ${(V.TFS.farmUpgrade > 0) ? `, all of which are fully fertile and produce their own natural female hormones, thanks to you` : ``}." She looks uncharacteristically uncertain. "Will you permit me to`);
		if (V.PC.dick !== 0) {
			if (V.PC.vagina !== -1) {
				r.push(`worship your perfect genitalia`);
			} else {
				r.push(`serve your cock`);
			}
		} else {
			r.push(`adore your pussy`);
		}
		r.push(`while you use it? I think my Sisters will forgive me the infidelity."`);
		if (V.PC.dick !== 0 && V.PC.vagina !== -1 && V.PC.boobs >= 300) {
			r.push(`She looks at you speculatively. "Or you could join us for a while."`);
		}
		App.UI.DOM.appendNewElement("p", el, r.join(" "));

		const result = App.UI.DOM.appendNewElement("p", el);
		App.UI.DOM.appendNewElement(
			"div",
			result,
			App.UI.DOM.link(
				"Let her give you oral while you browse",
				() => {
					r = [];
					r.push(`You accept her offer, and she walks seductively over to the interface with the listing of available Sisters, getting down on her knees below it. When you step up to look through the listing, she presses her huge soft tits against your knees`);
					if (V.PC.dick !== 0) {
						if (V.PC.vagina !== -1) {
							r.push(`and nuzzles her plush lips and hot tongue against your womanhood, using one hand to massage your shaft languidly. Perusing the very thorough pictures and videos of the pretty futanari for sale here is arousing enough without a truly masterful oral queen pleasing both your cock and your pussy, and you cum quickly. She drinks your cum rapturously and returns her mouth to your wet cunt, eagerly working to bring more forth.`);
						} else {
							r.push(`and snuggles her face between your thighs, nuzzling her nose into your ballsack before licking it with appetite and then sucking each of your balls gently, one by one. Meanwhile one of her clever hands is languidly massaging your shaft, bringing forth a drop of precum which she laps up with appetite. Humming with pleasure, she deepthroats you without apparent effort, her mischievous tongue flicking forward to lap at your scrotum. You blow your load down her throat, and she starts to suck you hard again.`);
						}
					} else {
						r.push(`and trails nibbles and kisses along your inner thighs before nuzzling her plush lips and hot tongue against your womanhood. Perusing the very thorough pictures and videos of the pretty futanari for sale here is arousing enough without a truly masterful cunt pleaser working her magic between your legs, and you've orgasmed before you finish one listing. She prolongs the climax cleverly and then starts to build you towards another.`);
					}

					jQuery(result).empty().append(r.join(" "));
				}
			)
		);

		if (V.PC.dick !== 0 && V.PC.vagina >= 0 && V.PC.boobs >= 300) {
			App.UI.DOM.appendNewElement("div", result,
				App.UI.DOM.link(
					"Join the Sisters' orgy",
					() => {
						r = [];
						V.futaAddiction += 1;
						switch (V.futaAddiction) {
							case 1:
								r.push(`You agree to spend some time taking part in the Sisters' orgy. The futa matron looks doubtful. "You'd have to agree to act as one of us," she says. "No different. No special sexual treatment." Her voice rises cutely on the last syllable, as you take her enormous dick in one hand and begin to stroke it vigorously. "V-very well," she gasps, taking one of your breasts in each of her hands.`);
								if (V.PC.vagina === 0) {
									r.push(`You leave the Sisters' suite a few hours later, <span class="green">leaving your virginity behind.</span> You are tired and a bit sore, but satisfied.`);
									V.PC.vagina = 1;
								} else {
									r.push(`You leave the Sisters' suite after a few hours of fucking and being fucked, feeling tired but satisfied.`);
								}
								if (canGetPregnant(V.PC)) {
									knockMeUp(V.PC, 5, 0, -9);
								}
								break;
							case 2:
								r.push(`She doesn't have to explain the Sisters' sexual equality this time, or that you have to subject yourself to it. You remember, and you let her know you're willing by giving her a friendly hug that squashes your breasts against each other and rubs your stiff pricks together. She reaches around you to grab your ass, already pulling you towards the pile of futas. You leave the Sisters' suite after a few hours of fucking and being fucked, in a state of total sexual satiation.`);
								if (canGetPregnant(V.PC)) {
									knockMeUp(V.PC, 10, 0, -9);
								}
								break;
							case 3:
								r.push(`She asked that with a distinctly flirty tone, obviously hoping you'd agree again, and she isn't disappointed. You take her by the hand and skip over to the pile of futas, most of which know you very intimately by now. They see their Sister and you approaching, and those of them that don't have their mouths full greet you eagerly. Three of them quickly rearrange themselves to present you with a couple of dicks to sit on and a pussy to fuck, all at once. You leave the Sisters' suite after many hours of fucking and being fucked, tired but satisfied.`);
								if (canGetPregnant(V.PC)) {
									knockMeUp(V.PC, 20, 0, -9);
								}
								break;
							case 4:
								r.push(`She asked that in a knowing voice, confident you'd agree, and was already moving in to kiss you when you did. She seems to want you more than usual today, and pulls you down onto the edge of the pit, guiding your cock into her pussy. She isn't selfish, of course, and reaches around to spread your buttocks so you can get fucked while you fuck. You leave the Sisters' suite after many hours of this, very tired. You wonder when you can make time to visit the Sisters again.`);
								if (canGetPregnant(V.PC)) {
									knockMeUp(V.PC, 40, 0, -9);
								}
								break;
							case 5:
								r.push(`She runs her tongue over her lips as she asks, and sits you down on the edge of the pit and deepthroats you as soon as you agree. She wants your cum, and uses a couple of fingers to tickle your prostate and make it appear faster. You jerk with orgasm, and she pushes your wet cock up against your stomach so she can fuck your pussy. She pauses for a moment, letting a younger Sister enter her ass first. You leave the Sisters' suite after a full day of this, utterly exhausted but eager to return.`);
								if (canGetPregnant(V.PC)) {
									knockMeUp(V.PC, 60, 0, -9);
								}
								break;
							case 6:
								r.push(`You nod, and she turns back towards the orgy, not seeing any reason to lead you, since you know the way. You both sink back into the pile of cocks, pussies, mouths, asses, boobs; the hours go by without you noticing. You leave the Sisters' suite unable to remember specifics, but you clearly fucked and got fucked by every futa there at least once. You're surprised when you learn how long you were there, but the worries of being an arcology owner no longer seem as pressing as they once did.`);
								if (canGetPregnant(V.PC)) {
									knockMeUp(V.PC, 80, 0, -9);
								}
								break;
							case 7:
								r.push(`You don't even bother to respond, and head straight for the orgy. You insert yourself into an eager mouth, bending over so the matron following you can take you from behind. The worries of your life as an arcology owner seem very far away as she slides inside you. You only leave when ${V.assistant.name} repeatedly pages you over the arcology's public announcement system. On the way to your office, you notice how full of cum your stomach is, how relaxed your pussy and ass are, and how happy you feel.`);
								if (canGetPregnant(V.PC)) {
									knockMeUp(V.PC, 100, 0, -9);
								}
								break;
							case 8:
								V.gameover = "sisters";
								SugarCube.Engine.play("Gameover");
								break;
							default:
								V.futaAddiction = 0;
						}
						jQuery(result).empty().append(r.join(" "));
					}
				)
			);
		}
	} else {
		App.UI.DOM.appendNewElement("p", el, `The Futanari Sisters use the same legalistic structures as other slave schools, but are actually very different. They're quite enigmatic, and inquiry into their cult-like methods is politely discouraged. All the Sisters own the institution together, and seem to share the goal of pursuing transformation of themselves to fit the classic futanari fetish — that is, to transform themselves into beautiful, curvaceous women with large dicks. All Sisters remain within the closed society for at least seven years. The Sisters fund themselves by selling members into slavery: interestingly, the more impressive a member is, the older she seems to be when sold; there may be a sort of selection mechanism by which the losers are sold immediately and the winners remain, leading the Sisters. This does not mean that ex-Sisters are unhappy with enslavement. On the contrary, it seems to be an expected stage of their lives, and not shameful.`, "scene-intro");
		if (V.TFS.schoolUpgrade !== 0) {
			r.push(`Since you have supported the faction within the Sisters that favors`);
			if (V.TFS.schoolUpgrade === 3) {
				r.push(`a mix of futas with and without balls; its female members will appear without balls, while its male members will appear with extremely large testicles.`);
				if (V.TFS.compromiseWeek + 15 > V.week) {
					r.push(`Or they will, in around ${(V.TFS.compromiseWeek + 15) - V.week} weeks.`);
				}
			} else if (V.TFS.schoolUpgrade === 1) {
				r.push(`futas without balls, its members will now appear without visible testicles and increased submissiveness.`);
			} else {
				r.push(`futa balls, its members will now appear with extremely large testicles and increased sex drives.`);
			}
			r.push(`As a major`);
			if (V.PC.title === 0) {
				r.push(`benefactrix`);
			} else {
				r.push(`benefactor`);
			}
			r.push(`of the institution, you also receive a discount on them.`);
		}
		App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");
		App.UI.DOM.appendNewElement("p", el, `The Sisters offer a member selected for sale into slavery for inspection via video call. The feed is of an exhausted futa, fast asleep. Whatever ceremonies the Sisters perform before releasing a member into slavery, they seem to have tired her out. There are indistinct but obviously sexual sounds audible in the background; it sounds like an orgy with a very large number of participants is going on nearby.`);
	}
	const modifiers = [];
	modifiers.push({factor: -0.2, reason: "TFS base discount"});
	if (V.TFS.schoolSale !== 0) {
		modifiers.push({factor: -0.5, reason: "TFS sale"});
	} else if (V.TFS.schoolUpgrade !== 0) {
		modifiers.push({factor: -0.2, reason: "TFS endowment discount"});
	}
	el.append(
		App.Markets.purchaseFramework("TFS", {modifiers})
	);

	return el;
};


code:
/** build cost modifier array for schools; they're all supposed to behave basically the same way except TFS
 * @param {FC.SlaveSchoolName} school
 */
App.Markets.makeSchoolmodifiers = function(school) {
	const modifiers = [];
	if (V[school].schoolSale !== 0) {
		modifiers.push({factor: -0.5, reason: "slave school sale"});
	} else if (V[school].schoolUpgrade !== 0) {
		modifiers.push({factor: -0.2, reason: "slave school endowment discount"});
	}
	return modifiers;
}

App.Markets.GRI = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`The Growth Research Institute (GRI) is not primarily a slave school at all, but rather the world leader in female growth hormone development. It operates research centers in the Free Cities to avoid traditional medical research laws. GRI runs several slave schools to raise healthy, unmodified subjects for use in trials. After a year of experimental hormone treatment they are sold.`);
	if (V.GRI.schoolUpgrade !== 0) {
		r.push(`You have endowed`);
		if (V.GRI.schoolUpgrade === 1) {
			r.push(`a research focus on advanced curatives; most subjects now leave the GRI at unnatural levels of vitality.`);
		} else {
			r.push(`a research focus on milk production; subjects' breasts are bigger and milkier than ever.`);
		}
		if (V.PC.title === 0) {
			r.push(`As a major benefactrix`);
		} else {
			r.push(`As a major benefactor`);
		}
		r.push(`of the institution, you also receive a discount on them.`);
	}
	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	App.UI.DOM.appendNewElement("p", el, `GRI offers a fresh graduate for inspection via video call. The interview takes place in the graduate's bare-metal holding cell. Disturbingly, it is strongly reminiscent of an enclosure for a lab animal, only scaled up to contain a lab animal of human dimensions.`);
	const modifiers = App.Markets.makeSchoolmodifiers("GRI");
	el.append(
		App.Markets.purchaseFramework("GRI", {modifiers})
	);

	return el;
};

App.Markets.LDE = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`L'École des Enculées is one of the oldest networks of slave schools, but because its training must be started early, it is only now beginning to produce and show a return on its investors' stakes. It aims to produce graduates more feminine than the average naturally born female, in spite of their having been born male. The school is a global leader in hormonal feminization, which allows it to produce curvier slaves than many schools that focus on natural females. It also retains its graduates for a year after their majority and their enslavement, so as to be able to legally subject them to intensive sexual conditioning that focuses on their prostates as their main remaining locus of arousal.`);
	if (V.LDE.schoolUpgrade !== 0) {
		r.push(`Since you have endowed`);
		if (V.LDE.schoolUpgrade === 1) {
			r.push(`the regular application of drugs to induce extreme infatuation in its graduates towards the first dominant person they encounter, any graduate purchased here will now promptly fall in love with you.`);
		} else {
			r.push(`research into narrowly targeted hormonal treatments, its graduates are now available with generous members despite their femininity.`);
		}
		r.push(`As a major ${(V.PC.title === 0) ? `benefactrix` : `benefactor`} of the institution, you also receive a discount on them.`);
	}

	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	App.UI.DOM.appendNewElement("p", el, `L'École des Enculées offers a fresh graduate for inspection via video call. The interview takes place in the dormitory for the oldest class of girls. Absurdly sexual squeals repeatedly interrupt the call, making it very clear that someone close by the interviewee is experiencing a strong combination of anal pain and anal pleasure.`);
	const modifiers = App.Markets.makeSchoolmodifiers("LDE");
	el.append(
		App.Markets.purchaseFramework("LDE", {modifiers})
	);

	return el;
};

App.Markets.NUL = function() {
	const el = new DocumentFragment();
	let r = [];

	r.push(`Nueva Universidad de Libertad is a unique slave school operating in the Free Cities. Its business model is to offer as close to asexuality as a sex slave can possess. All students have their sex organs surgically removed at a very young age, before the onset of puberty. This is followed by numerous cosmetic surgery alternations, alongside a steady regimen of hormone blockers, throughout their education. The result is an utterly physically androgynous slave.`);
	if (V.NUL.schoolUpgrade !== 0) {
		r.push(`You have endowed the school with advanced training courses in`);
		if (V.NUL.schoolUpgrade === 1) {
			r.push(`entertainment and conversation.`);
		} else {
			r.push(`the various sexual arts.`);
		}
		r.push(`As a major financial supporter of the institution, you also receive a discount on them.`);
	}

	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	App.UI.DOM.appendNewElement("p", el, `Nueva Universidad de Libertad offers a fresh graduate for inspection via video call. The interview takes place in said graduate's dormitory. The room is sparse and utilitarian, and immaculately clean. Likely by design, it looks like the set from an old sci-fi movie.`);
	const modifiers = App.Markets.makeSchoolmodifiers("NUL");
	el.append(
		App.Markets.purchaseFramework("NUL", {modifiers})
	);

	return el;
};

App.Markets.SCP = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`St. Claver Preparatory is an old world preparatory school that was purchased by an old world medical school adapting to the demand for plastic surgeons from the Free Cities. It functions as a standard slave school until its students near graduation. At that point they are paired with a budding plastic surgeon. Intensive, flawless, and of course successful surgical modification of the student is required to complete certification as a Free Cities plastic surgeon of the top rank. All St. Claver's graduates are modified to a single exacting standard. Meanwhile, the slave school is free to train its students for obedience and sexual conformity.`);
	if (V.SCP.schoolUpgrade !== 0) {
		r.push(`You have endowed`);
		if (V.SCP.schoolUpgrade === 1) {
			r.push(`thorough use of mental suppressants that reliably produce total devotion at the price of total stupidity.`);
		} else {
			r.push(`diversification of the school's approach into general slave training that produces graduates with basic skills.`);
		}
		r.push(`As a major`);
		if (V.PC.title === 0) {
			r.push(`benefactrix`);
		} else {
			r.push(`benefactor`);
		}
		r.push(`of the institution, you also receive a discount on them.`);
	}

	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	App.UI.DOM.appendNewElement("p", el, `St. Claver Preparatory offers a fresh graduate for inspection via video call. The interview takes place in a very obviously medical office, with medical supply robots wheeling past its glass walls and nurses hurrying to and fro.
	`);
	const modifiers = App.Markets.makeSchoolmodifiers("SCP");
	el.append(
		App.Markets.purchaseFramework("SCP", {modifiers})
	);

	return el;
};

App.Markets.TCR = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`The Cattle Ranch is a controversial slave school operating primarily out of Pastoralistic Free Cities. Its business model is to offer the ideal free range dairy cow; one whose tits and belly reach the floor when on all fours. All cattle come optimized for milking, with big breasts and gravid middles. Slave orphans have their heels clipped shortly after birth and are conditioned to believe they are actual livestock, resulting in a mindbreak-like state. Between their wide hips and big butts and their heavy, milky breasts, they are often popular breeding slaves. They rarely display their stock over video call, instead favoring a more hands-on approach. Buyers can visit their local shops to view grazing cattle available for sale. Alternatively, they can watch the calves frolic among their mothers or enjoy the sight of a breeding bull impregnating an empty womb. Cows are also specially trained to respond to spectators banging on the fence; oral awaits if you drop trou for them!`);
	if (V.TCR.schoolUpgrade !== 0) {
		r.push(`You have endowed`);
		if (V.TCR.schoolUpgrade === 1) {
			r.push(`a healthy sum of credits to make their breeding bulls available for sale.`);
		} else {
			r.push(`a healthy sum of credits to encourage the sale of heifers.`);
		}
		r.push(`As a major ${(V.PC.title === 0) ? `benefactrix` : `benefactor`} of the ranch, you also receive a discount on them.`);
	}
	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	r = [];
	r.push(`The Cattle Ranch parades a choice selection of cows for your viewing pleasure. You're free to do as you please to the slaves, as long as you don't cause lasting harm to them.`);
	if (isFertile(V.PC) && V.PC.preg !== -1) {
		r.push(`You can't help but notice the number of bulls lining up along the fence sniffing at you.`);
	}
	App.UI.DOM.appendNewElement("p", el, r.join(" "));
	const modifiers = App.Markets.makeSchoolmodifiers("TCR");
	el.append(
		App.Markets.purchaseFramework("TCR", {modifiers, sTitleSingular: "cow", sTitlePlural: "cattle"})
	);

	return el;
};

App.Markets.TGA = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`The Gymnasium-Academy is a very unusual slave school. It sits at a bizarre juncture of the evolving gender roles and slave roles in the Free Cities. Its graduates are exclusively born male, and are not surgically or hormonally changed, but are thoroughly indoctrinated in the gender roles of the Free Cities to be accepting of their place in the new and rapidly changing world. Since the Gymnasium-Academy produces graduates with a greater ability to build muscle, fitness and virility than any of its competitors, it also trains for athletic perfection to further differentiate them. This training relies on traditional methods of corporal punishment.`);
	if (V.TGA.schoolUpgrade !== 0) {
		r.push(`Since you have endowed`);
		if (V.TGA.schoolUpgrade === 1) {
			r.push(`advanced training methods at the Gymnasium-Academy, its graduates are now fanatically loyal.`);
		} else {
			r.push(`a combat training center at the Gymnasium-Academy, its graduates are now deadly fighters.`);
		}
		r.push(`As a major`);
		if (V.PC.title === 0) {
			r.push(`benefactrix`);
		} else {
			r.push(`benefactor`);
		}
		r.push(`of the institution, you also receive a discount on them.`);
	}

	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	App.UI.DOM.appendNewElement("p", el, `The Gymnasium-Academy offers a fresh graduate for inspection via video call. The interview takes place in an office overlooking an expansive workout room, in which a large number of naked, fit young bodies are performing punishing workout routines.`);
	const modifiers = App.Markets.makeSchoolmodifiers("TGA");
	el.append(
		App.Markets.purchaseFramework("TGA", {modifiers})
	);

	return el;
};

App.Markets.HA = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`The Hippolyta Academy is one of the most famous slave bodyguarding schools in all the Free Cities. Its business model is to offer very high quality, highly trained girls. Their renowned amazonian maids are some of the best combatants in the world and can be often found at the side of the wealthiest citizens.`);
	if (V.HA.schoolUpgrade === 1) {
		r.push(`Recently the school was able to enhance its educational programs thanks to your generous donation. Their slaves are now some of the most well trained and educated on the market.`);
	} else if (V.HA.schoolUpgrade === 2) {
		r.push(`Recently the school was able to improve its drug enhancement program thanks to your generous donation. Their slaves are now some of the most physically impressive specimen on the market.`);
	} else if (V.HA.schoolUpgrade === 3) {
		r.push(`Recently the school redirected its focus to better align with the strongfat ideal, as of your suggestion. Their slaves are physically impressive yet maintain a soft and feminine aspect.`);
	}
	if (V.HA.schoolUpgrade !== 0) {
		r.push(`As a major financial supporter of the institution, you also receive a discount on them.`);
	}

	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	App.UI.DOM.appendNewElement("p", el, `The Hippolyta Academy offers a fresh graduate for inspection. The interview takes place in one of the many training areas of the school, where the physical prowess of the candidate can be easily showcased.`);
	const modifiers = App.Markets.makeSchoolmodifiers("HA");
	el.append(
		App.Markets.purchaseFramework("HA", {modifiers})
	);

	return el;
};

App.Markets.TSS = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`The Slavegirl School is the newest slave school operating in the Free Cities. Its business model is to offer simpler, cheaper wares than its competitors. All Slavegirl School graduates are natural-born females without surgical modifications. Their training emphasizes elimination of any serious psychological deformities. They are promptly enslaved and sold as soon as they reach their majorities, and are marketed as complete virgins.`);
	if (V.TSS.schoolUpgrade !== 0) {
		r.push(`You have endowed`);
		if (V.TSS.schoolUpgrade === 1) {
			r.push(`an alternative college at The Slavegirl School, which focuses on retraining good MILF stock into mature slave girls.`);
		} else {
			r.push(`an improvement in the simplistic school's approach that teaches good basic skills without losing too much efficiency.`);
		}
		r.push(`As a major`);
		if (V.PC.title === 0) {
			r.push(`benefactrix`);
		} else {
			r.push(`benefactor`);
		}
		r.push(`of the institution, you also receive a discount on them.`);
	}

	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	App.UI.DOM.appendNewElement("p", el, `The Slavegirl School offers a fresh graduate for inspection via video call. The interview takes place in a faculty member's office. Absurdly, it's barely distinguishable from an office at any traditional institution of higher education. The only giveaway is the profusion of sex toys on the desk and the pornography on the walls.`);
	const modifiers = App.Markets.makeSchoolmodifiers("TSS");
	el.append(
		App.Markets.purchaseFramework("TSS", {modifiers})
	);

	return el;
};

App.Markets.TUO = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`The Utopian Orphanage is where all slaves dream of being raised. Its business model is to offer intelligent, well educated girls just past their majority. The girls are treated exceptionally well and have no sexual ${(V.TUO.schoolUpgrade !== 2) ? "education or " : ""}experience.`);
	if (V.TUO.schoolUpgrade !== 0) {
		r.push(`You have endowed`);
		if (V.TUO.schoolUpgrade === 1) {
			r.push(`stricter admissions proceedings at the school, meaning only the finest children will get accepted in.`);
		} else {
			r.push(`the school with sexual education materials; the girls now have a better understanding of what sex is.`);
		}
		r.push(`As a major ${(V.PC.title === 0) ? `benefactrix` : `benefactor`} of the institution, you also receive a discount on them.`);
	}

	App.UI.DOM.appendNewElement("p", el, r.join(" "), "scene-intro");

	App.UI.DOM.appendNewElement("p", el, `The Utopian Orphanage offers a fresh graduate for inspection. The interview takes place in the girl's private room, where she showcases her education and wits.`);
	const modifiers = App.Markets.makeSchoolmodifiers("TUO");
	el.append(
		App.Markets.purchaseFramework("TUO", {modifiers})
	);

	return el;
};


code:
App.Markets.heap = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`You visit the slave markets off the arcology plaza. It's always preferable to examine merchandise in person.`);
	r.push(`You're in the corner of the slave market occupied by "The Flesh Heap", a dumping ground, of sorts, for broken slaves. Be it brain death, drug overdose, coma, or anything else, this market is willing to buy and sell them. Most of the worthwhile slaves have already been picked clean by pharmaceutical companies for drug testing, and the rest are practically nothing more than vegetables, but a handful remain just conscious enough to be profitable with effort as slaves. One should go in expecting only the worst quality possible, though if anything catches your eye, it will be rather cheap to purchase.`);

	let heap = jsRandom(1, 4);
	if (heap === 1) {
		r.push(`"Looking for a warm body to use as furniture? Perhaps as a decorative, living sculpture? We got what you want!"`);
	} else if (heap === 2) {
		r.push(`"I guarantee they are all alive, maybe not healthy, but alive. Well, except that one; just ignore that one."`);
	} else if (heap === 3) {
		r.push(`"We ask that you don't use this merchandise for organ harvesting; we have plenty of nonfunctional ones for that."`);
	} else {
		r.push(`"If you are looking for a body to do unmentionable things to, you came to the right place! Though these in particular just barely fall under slave laws."`);
	}
	el.append(r.join(" "));
	el.append(App.Markets.purchaseFramework("heap"));
	return el;
};

App.Markets.wetware = function() {
	const el = new DocumentFragment();
	let r = [];
	const {heU, hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
	r.push(`You're in the corner of the slave market occupied by scientists and programmers, pioneers in perfecting the skills of slaves by removing all external stimuli and subjecting them to an inhumane regimen of simulated sexual and career training. Although their bodies are ruined, these slaves are guaranteed to be intelligent, skilled and trained in a variety of jobs. If you're willing to perform extensive repairs${(V.bodyswapAnnounced) ? `, or have a spare body ready` : ``}, these slaves have high potential in almost any role in your arcology.`);

	let wetware = jsRandom(1, 4);
	if (wetware === 1) {
		r.push(`Just past a scientist, you can see a`);
		if (V.seeExtreme === 1) {
			r.push(`limbless`);
		}
		r.push(`slave being extracted from a tank filled with fluid wearing a bizarre helmet. As the device is removed by a technician, the slave begins to panic as ${heU} is dragged from ${hisU} virtual life and realizes exactly what has happened to ${hisU} body.`);
	} else if (wetware === 2) {
		r.push(`A scientist turns to you and remarks "I almost envy the hardware. They believe they're having a fulfilling career with a loving family and meaningful relationships for a lifetime. Honestly, if the mental imprinting process wasn't so destructive to the human body, I'd probably hop in myself!"`);
	} else if (wetware === 3) {
		r.push(`Racks of ravaged bodies are laid across tables with plaques stating slave IQ, career, and sexual skill exam results.`);
	} else {
		r.push(`Curious, you ask a technician why it's necessary for the merchandise to be so badly treated. He replies "Forcing stimulus on the hardware takes an enormous toll on their nervous and circulatory system. The nonfunctional components are disabled and removed as necessary to ensure optimal response to the imprinting process."`);
	}
	el.append(r.join(" "));
	el.append(App.Markets.purchaseFramework("wetware"));
	return el;
};

App.Markets.kidnappers = function() {
	const el = new DocumentFragment();
	let r = [];
	const {hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
	r.push(`You're in the area of the slave market populated by slave kidnappers, though of course they prefer more polite titles. The slaves here are cheap, and they look it. They're almost all recent catches from bad parts of the old world, and most of them have seen considerable abuse between the moment of their capture and entering your arcology.`);
	if (V.arcologies[0].FSPaternalistSMR === 1) {
		r.push(`Fortunately for them, such behavior is not permitted here. Though they remain frightened and angry, they are safe from rape, for now.`);
	} else {
		let kidnappers = jsRandom(1, 4);
		r.push(`There's more merchandise out of sight in the holding areas. To go by what you can hear,`);
		if (kidnappers === 1 && jsRandom(1, 100) <= V.seeDicks) {
			r.push(`muffled insistence that the speaker is not a girl followed by struggling and then shrieks as a resistant dickgirl takes anal rape,`);
		} else if ((kidnappers === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
			r.push(`muffled begging followed by struggling and then crying as a new slave learns how it feels to have a slave's cunt,`);
		} else if (kidnappers === 3) {
			r.push(`muffled gagging followed gasping and sobbing as a new slave tries to get ${hisU} breath back after oral rape,`);
		} else {
			r.push(`the unmistakable slap of flesh on flesh,`);
		}
		r.push(`at least one of the slavers is amusing himself`);
		if (V.arcologies[0].FSGenderFundamentalist === "unset") {
			r.push(`(or herself)`);
		}
		r.push(`back there.`);
	}

	el.append(r.join(" "));
	el.append(App.Markets.purchaseFramework("kidnappers"));
	return el;
};

App.Markets.indentures = function() {
	const el = new DocumentFragment();
	let r = [];
	const {girlU, hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
	r.push(`You're in the area of the slave market that deals in indentured servants. The people sold here are slaves, but they are temporary slaves, and many of them have clauses in their indentures that prohibit some of the most severe practices. They exhibit a strange variety, with some looking more frightened than the most downtrodden slave and some looking almost cheerful.`);
	if (V.arcologies[0].FSPaternalistSMR === 1) {
		r.push(`The generous protections for slaves in your arcology lend this last group extra confidence.`);
	} else {
		let indentures = jsRandom(1, 4);
		r.push(`The area is crowded, and more indentured servants are packed together in the holding areas. To go by what you can hear,`);
		if (indentures === 1 && jsRandom(1, 100) <= V.seeDicks) {
			r.push(`the unmistakable mixed shrieks, sobs, and slaps of anal rape,`);
		} else if ((indentures === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
			r.push(`the characteristic crying and gasping of an unwilling ${girlU} giving up ${hisU} cunt,`);
		} else if (indentures === 3) {
			r.push(`the gagging and expectoration of someone who has just gotten a mouthful of unwelcome cum,`);
		} else {
			r.push(`disconsolate sobbing interrupted by a gasp as something is stuffed inside someone's mouth, and followed by muffled screams,`);
		}
		r.push(`one of them is learning exactly what ${hisU} indenture allows.`);
	}

	el.append(r.join(" "));
	el.append(App.Markets.purchaseFramework("indentures"));
	return el;
};

App.Markets.hunters = function() {
	const el = new DocumentFragment();
	let r = [];
	const {hisU, himU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
	r.push(`You're in the area of the slave market populated by runaway slave catchers, a proud group. The slaves here know their way around Free Cities slavery already, and their eyes are watchful. Most of them probably harbor thoughts of another attempt at escape, though the slavers to their best to disabuse them of these notions.`);
	if (V.arcologies[0].FSPaternalistSMR === 1) {
		r.push(`Their methods are somewhat limited, as the rules in your arcology preclude the more effective methods of punishment.`);
	} else {
		let hunters = jsRandom(1, 4);
		r.push(`The slave catchers consider their catches fair game, though they usually confine their amusements to the holding areas out of sight. Not out of earshot, though; to go by what you can hear,`);
		if (hunters === 1 && jsRandom(1, 100) <= V.seeDicks) {
			r.push(`vehement insistence that the speaker is not a girl followed by a beating and then shrieks as a rebellious dickgirl takes anal rape,`);
		} else if (hunters === 2 && jsRandom(0, 99) >= V.seeDicks) {
			r.push(`vehement protestations followed by a beating and then crying as a slave's cunt takes ${hisU} punishment for ${himU},`);
		} else if (hunters === 3) {
			r.push(`struggling and gagging followed gasping and angry swearing as a rebellious slave tries to get ${hisU} breath back after oral rape,`);
		} else {
			r.push(`struggling followed by the slap of flesh on flesh,`);
		}
		r.push(`at least one of the runaway hunters is amusing himself`);
		if (V.arcologies[0].FSGenderFundamentalist === "unset") {
			r.push(`(or herself)`);
		}
		r.push(`back there.`);
	}

	el.append(r.join(" "));
	el.append(App.Markets.purchaseFramework("hunters"));
	return el;
};

App.Markets["underage raiders"] = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`You're in the seediest area of the slave market populated by the cradle robbers, a despised group of slavers known for raiding elementary schools, orphanages and even preschools. They specifically target those who have yet to experience their first period. The extreme risk of these raids makes the slavers here aggressive and confident,`);
	if (V.arcologies[0].FSPaternalistSMR === 1) {
		r.push(`though they do obey the rules of your arcology that restrain them from abusing the slaves.`);
	} else {
		let ur = jsRandom(1, 4);
		r.push(`though they restrain themselves from reducing the value of their captures by taking virginities. They do have their fun, though; to go by what you can hear from the holding area where they keep underage slaves who can be sold,`);
		if (ur === 1 && jsRandom(1, 100) <= V.seeDicks) {
			r.push(`a muffled but obviously sadistic description of feminization, and the desperate sobbing in response,`);
		} else if ((ur === 2) && (jsRandom(0, 99) >= V.seeDicks)) {
			r.push(`a muffled but obviously sadistic description of breeding, and the desperate sobbing in response,`);
		} else if (ur === 3) {
			r.push(`faint struggling and crying that suggests that someone is being thoroughly groped and pinched,`);
		} else {
			r.push(`the lewd, lubricated noise of someone giving a reluctant handjob,`);
		}
		r.push(`at least one of the raiders is amusing himself`);
		if (V.arcologies[0].FSGenderFundamentalist === "unset") {
			r.push(`(or herself)`);
		}
		r.push(`back there.`);
	}

	el.append(r.join(" "));
	el.append(App.Markets.purchaseFramework("underage raiders"));
	return el;
};
App.Markets.raiders = function() {
	const el = new DocumentFragment();
	let r = [];
	r.push(`You're in the area of the slave market populated by girl raiders, that daredevil subset of slave kidnappers that specifically target old world schools, preparatory institutions, religious groups, and other sources of slaves that can soon be sold right after they reach their majorities. The extreme risk of these raids makes the slavers here aggressive and confident,`);
	if (V.arcologies[0].FSPaternalistSMR === 1) {
		r.push(`though they do obey the rules of your arcology that restrain them from abusing the slaves.`);
	} else {
		let raiders = jsRandom(1, 4);
		r.push(`though they restrain themselves from reducing the value of their captures by taking virginities. They do have their fun, though; to go by what you can hear from the holding area where they keep slaves of age who can be sold,`);
		if (raiders === 1 && jsRandom(1, 100) <= V.seeDicks) {
			r.push(`a muffled but obviously sadistic description of feminization, and the desperate sobbing in response,`);
		} else if (raiders === 2 && jsRandom(0, 99) >= V.seeDicks) {
			r.push(`a muffled but obviously sadistic description of breeding, and the desperate sobbing in response,`);
		} else if (raiders === 3) {
			r.push(`faint struggling and crying that suggests that someone is being thoroughly groped and pinched,`);
		} else {
			r.push(`the lewd, lubricated noise of someone giving a reluctant handjob,`);
		}
		r.push(`at least one of the raiders is amusing himself`);
		if (V.arcologies[0].FSGenderFundamentalist === "unset") {
			r.push(`(or herself)`);
		}
		r.push(`back there.`);
	}

	el.append(r.join(" "));
	el.append(App.Markets.purchaseFramework("raiders"));
	return el;
};

App.Markets.neighbor = function() {
	const arcology = V.arcologies[V.market.numArcology];
	const el = new DocumentFragment();
	el.append(`You're in the area of the slave market that specializes in slaves from within the Free City, viewing slaves from `);
	App.UI.DOM.appendNewElement("span", el, `${arcology.name}.`, "bold");
	el.append(` Some were trained there, specifically for sale, while others are simply being sold.`);
	const opinion = App.Neighbor.opinion(V.arcologies[0], arcology);
	const modifiers = [{factor: -(opinion/100) * 0.05, reason: opinion > 0 ? "cultural ties" : "cultural friction"}];
	if (opinion > 2) {
		el.append(` Your cultural ties with ${arcology.name} helps keep the price reasonable.`);
	} else if (opinion < -2) {
		el.append(` Your social misalignment with ${arcology.name} drives up the price.`);
	}

	el.append(App.Markets.purchaseFramework("neighbor", {modifiers}));
	return el;
};

App.Markets.trainers = function() {
	const el = new DocumentFragment();
	let r = [];
	const {girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
	r.push(`You're in the area of the slave market populated by slave trainers, easily the wealthiest vendors. The slaves here have received obedience training and medical care, and many have had some basic sexual skills forced on them.`);
	if (V.arcologies[0].FSPaternalistSMR === 1) {
		r.push(`Though the rules of your arcology protected them from the worst excesses of the training profession, many of the slaves on sale have the haunted look of people still coming to terms with the idea that they no longer have any bodily autonomy.`);
	} else {
		let trainers = jsRandom(1, 4);
		r.push(`The trainers are a competitive bunch, and to go by what you can hear,`);
		if (trainers === 1 && jsRandom(1, 100) <= V.seeDicks) {
			r.push(`moaning interspersed with lewd, well-lubricated noises coming from both anal sex and vigorous masturbation,`);
		} else if (trainers === 2 && jsRandom(0, 99) >= V.seeDicks) {
			r.push(`moaning and the distinctive slap of feminine buttocks on thighs beneath them as a ${girlU} rides a dick,`);
		} else if (trainers === 3) {
			r.push(`the lush, lewd sounds of diligent oral sex,`);
		} else {
			r.push(`the call-and-response of a trainer and a slave running through a memorized obedience exercise,`);
		}
		r.push(`at least one of them is applying some last-minute training to a slave in the holding pens nearby.`);
	}

	el.append(r.join(" "));
	el.append(App.Markets.purchaseFramework("trainers"));
	return el;
};