<div id="notes">[[CONTENT NOTES|notes]]</div>\\n{{{blah blah blah - xax}}}\n\n[[character creation|cc]]
...\n\n[[←|Start]]
|<<toggle $child child feral feral>>|<<toggle $child child slums slums>>|<<toggle $child child industrial industrial>>|\n|<<toggle $adol adol prisoner prisoner>>|<<toggle $adol adol shaman shaman>>|<<toggle $adol adol soldier soldier>>|\n|<<toggle $job job smuggler smuggler>>|<<toggle $job job mercenary mercenary>>|<<toggle $job job hunter hunter>>|\n\\n<div class="statblock">\\n<<block child>>\\n<span><<display "child stats">></span>\\n<<endblock>>\\n<<block adol>>\\n<span><<display "adol stats">></span>\\n<<endblock>>\\n<<block job>>\\n<span><<display "job stats">></span>\n<<endblock>>\\n</div>\n\n<hr>\\n<<block child>>\\n<<block adol>>\\n<<block job>>\\n<<display "child history">>\n<<display "adol history">>\n<<display "job history">>\n<<endblock>>\\n<<endblock>>\\n<<endblock>>\\n\n<<block child>><<block adol>><<block job>><<if $child && $adol && $job>>[[→|cc done]]<<endif>><<endblock>><<endblock>><<endblock>>
<<if $child eq "feral">>\\nYou were discovered as a wild, feral child outside the Shelter city walls.\n<<else if $child eq "slums">>\\nYou were raised in the Shelter slums, and roved around town with gutter gangs.\n<<else if $child eq "industrial">>\\nYou were a child laborer in the industrial refineries all across the western edge of Shelter.\n<<endif>>
<<if $child eq "feral">>\\n<span class="buff">+1 track</span>\n<span class="buff">+2 social (monster)</span>\n<span class="dred">-1 social (gang)</span>\n<span class="dred">-1 social (factory)</span>\n<span class="dred">-1 social (military)</span>\n<<else if $child eq "slums">>\\n<span class="buff">+1 influence</span>\n<span class="dred">-2 social (monster)</span>\n<span class="buff">+1 social (gang)</span>\n<<else if $child eq "industrial">>\\n<span class="buff">+1 strength</span>\n<span class="dred">-2 social (monster)</span>\n<span class="buff">+1 social (factory)</span>\n<<endif>>
<<if $adol neq 0>>\\n<<if $child eq "feral">>\\nAfter being dragged into the city, \\n<<else if $child eq "slums">>\\nWhen you were still young, \\n<<else if $child eq "industrial">>\\nWhen you were still young, \\n<<endif>>\\n\\n<<if $adol eq "prisoner">>\\nyou were snatched off the street by the Guard in a district sweep, and thrown into prison to be a living experiment on {eco} energy.\n<<else if $adol eq "shaman">>\\nyou made contact with the wild spirits -- weak and innervated in these times -- and learned the ways of wielding {eco} energy.\n<<else if $adol eq "soldier">>\\nyou were conscripted into the Guard, showered with {eco} energy, and trained to uphold the government of Shelter.\n<<endif>>\\n<<endif>>
<<if $adol eq "prisoner">>\\n<span class="buff">x2 eco potency</span>\n<span class="dred">-100% eco control</span>\n<span class="opt">eco focus: wild</span>\n<<else if $adol eq "shaman">>\\n<span class="buff">+100% eco control</span>\n<span class="buff">+1 eco charge</span>\n<span class="opt">eco focus: nature</span>\n<<else if $adol eq "soldier">>\\n<span class="buff">+1 social (military)</span>\n<span class="opt">eco focus: combat</span>\n<<endif>>
<<if $job neq 0>>\\n<<if $adol eq "prisoner">>\\nAfter breaking out of prison, \\n<<else if $adol eq "shaman">>\\nAfter completing your shaman training, \\n<<else if $adol eq "soldier">>\\nAfter defecting from the guard, \\n<<endif>>\\n\\n<<if $job eq "smuggler">>\\nyou became a smuggler, getting credits by smuggling illegal goods -- guns, weapons, {eco} juice and crystals, general exotic merchandise -- through the Shelter underworks, between districts and bypassing the outer walls.\n<<else if $job eq "mercenary">>\\nyou became a mercenary, working as a guard or hired gun for whoever was willing to pay the highest rate.\n<<else if $job eq "hunter">>\\nyou became a hunter, going out into the wasteland beyond the city to hunt and kill the {metal head} monsters that beseige the city.\n<<endif>>\\n<<endif>>
<<if $job eq "smuggler">>\\n<span class="buff">+1 social (gang)</span>\n<span class="buff">+1 detect</span>\n<span class="buff">+1 influence</span>\n<<else if $job eq "mercenary">>\\n<span class="buff">+1 social (gang)</span>\n<span class="buff">+1 influence</span>\n<span class="buff">+1 strength</span>\n<<else if $job eq "hunter">>\\n<span class="buff">+1 social (gang)</span>\n<span class="buff">+1 track</span>\n<span class="buff">+1 detect</span>\n<<endif>>
<<nobr>>\n<<set $pc = {}>>\n<<set $pc.stats =\n { detect: 0\n , influence: 0\n , strength: 0\n , track: 0\n , soc_monster: 0\n , soc_gang: 0\n , soc_factory: 0\n , soc_military: 0\n , soc_rev: 0\n }>>\n<<set (function (c, pc) {\n switch (c) {\n case "feral":\n pc.stats.track += 1;\n pc.stats.soc_monster += 2;\n pc.stats.soc_gang -= 1;\n pc.stats.soc_factory -= 1;\n pc.stats.soc_military -= 1;\n break;\n case "slums":\n pc.stats.influence += 1;\n pc.stats.soc_monster -= 2;\n pc.stats.soc_gang += 1;\n break;\n case "industral":\n pc.stats.strength += 1;\n pc.stats.soc_monster -= 2;\n pc.stats.soc_factory += 1;\n break;\n default:\n break;\n }\n })($child, $pc)>>\n<<set (function (a, pc) {\n switch (a) {\n case "prisoner":\n break;\n case "shaman":\n break;\n case "soldier":\n break;\n default:\n break;\n }\n })($adol, $pc)>>\n<<set (function (j, pc) {\n switch (j) {\n case "smuggler":\n pc.stats.soc_gang += 1;\n pc.stats.detect += 1;\n pc.stats.influence += 1;\n break;\n case "mercenary":\n pc.stats.soc_gang += 1;\n pc.stats.strength += 1;\n pc.stats.influence += 1;\n break;\n case "hunter":\n pc.stats.soc_gang += 1;\n pc.stats.track += 1;\n pc.stats.detect += 1;\n break;\n default:\n break;\n }\n })($job, $pc)>>\n<<endnobr>>
window.stars = function (c, l) {\n if (l == undefined) { l = 5; }\n if (c < 0) {\n return ('<span class="neg">' + "★".repeat(Math.abs(c)) +'</span>' + "☆".repeat(l));\n }\n return ("★".repeat(c) + "☆".repeat(l-c));\n };
<table class="stats"><thead><tr><th>stats</th></tr></thead><tbody> <tr><td><span class="tooltip" title="detect hidden objects, disarm traps, successfully plant items, and generally perform shady business">detect</span></td><td><<print stars($pc.stats.detect)>></td></tr> <tr><td><span class="tooltip" title="persuade, threaten, cajole, and convince people">influence</span></td><td><<print stars($pc.stats.influence)>></td></tr> <tr><td><span class="tooltip" title="bash doors, move heavy objects, and win melee fights">strength</span></td><td><<print stars($pc.stats.strength)>></td></tr> <tr><td><span class="tooltip" title="follow a fleeing target, find a trail, and aim a gun">track</span></td><td><<print stars($pc.stats.track)>></td></tr> </tbody></table>\\n\\n<table class="stats"><thead><tr><th>social</th></tr></thead><tbody> <tr><td><span class="tooltip" title="connections with the wasteland or underground monsters">monster</span></td><td><<print stars($pc.stats.soc_monster)>></td></tr> <tr><td><span class="tooltip" title="connections with gangs and smuggling rings">gang</span></td><td><<print stars($pc.stats.soc_gang)>></td></tr> <tr><td><span class="tooltip" title="connections with city factory workers">factory</span></td><td><<print stars($pc.stats.soc_factory)>></td></tr> <tr><td><span class="tooltip" title="connections with city guards or military units">military</span></td><td><<print stars($pc.stats.soc_military)>></td></tr> <tr><td><span class="tooltip" title="connections with underground revolutionaries">underground</span></td><td><<print stars($pc.stats.soc_rev)>></td></tr> </tbody></table>\n\n-- eco powers gain xp and level up at the end of each sequence\n-- eco potency determines xp% multiplier\n-- eco control determines what % of level-ups you actually get to pick the tf of\n-- eco focus determines how a tf is picked for the automatically-picked level-ups\n\neco powers:\n {...}\n\nnext automatic eco powers:\n monstrous strength (+1 strength when transformed)\n leathery skin (+1 strength when transformed)\n lightning aura (automatically succeed one strength check per sequence)\n gnarled horns (reroll one failed strength check per sequence)\n back tentacles (reroll one failed strength check per sequence)\n\n bloodhound scent (+1 track when transformed)\n lashing tail (+1 track when transformed)\n bestial nose (automatically succeed one track check per sequence)\n snake tongue (reroll one failed track check per sequence)\n loping stride (reroll one failed track check per sequence)\n\n glowing eyes (+1 detect when transformed)\n eco blood (automatically succeed one detect check per sequence)\n bestial ears (reroll one failed detect check per sequence)\n nimble claws (reroll one failed detect check per sequence)\n\n eco aura (+1 influence when transformed)\n glimmering halo (reroll one failed influence check per sequence)
red - ... {muscles}\n (power/muscle)\n blue - ... {glowing eyes}\n (magic/electricity)\nyellow -\n green -\n black - ... {black veins} ... {lightning aura}\n\n... maybe have five wild monster types and associate an eco color with each one so that there's some sense of coherency w/ the tfs, but i don't really want it to be a furry tf game. so like probably all the tfs should be... human. stuff like "muscles" is fine, or "horns" "claws" sure, but not really tails or scales or fur or w/e. animal dicks are still okay.\n\nlike in jak, dark eco is like: claws, dark nails, horns(?), pale skin, black eyes, lightning aura. & in my porn it's also like, dark veins, oversized cock, and cum w/ a purple tint. which are all fine.\n\nred: big muscles, leathery skin, stubby tail\nblue: excessive drool, long tongue, huge loads, tentacles\nyellow: big dick, animal dick(?)\ngreen: stretchy asshole, can take extreme penetration, worm dick(?)\nblack: claws, horns, lightning aura, desaturated skin\n\n\nblack veins (/glowing blue veins / glowing yellow veins, etc)\nglowing eyes\n\nbloated cock\n\nknot on cock\nmedial ring on cock\nbarbs on cock\ntentacle cock\nunfurling/clasping cockhead\n\nhuge balls\nfour balls\n\n---\n\nmaybe a simple eco progression w/ the same basic tfs all the way along (big muscles, colored veins, glowing eyes, weird dick, claws, forked tongue, tail, hair) but with slightly different variations (color, pattern, shape, effects) based on the kind of eco\n\n then... i guess 'eco focus' determines the order you get tfs? 'combat' would be like, you start with muscles and get claws, fangs, actual powers, very early on; 'wild' would be a totally random ordering; and 'nature' or whatever the shaman focus is would have a focus on animal traits (claws, tongue, tail, hair, weird dick) before any of the other stuff\n\n not sure what eco control would actually do in that sense, unless it's like, pick the eco variant of each tf. or maybe something to do with 'upgrading' a tf, if that's a thing that you can do\n (like if you have current eco levels in all kinds of eco, and you gain them from certain events and you can spend them to use powers, then when you get a new tf it would be assigned a variant based on yr current eco levels. eco control would be something about the bias of that assignment: 100% control would let you pick from any eco level; 0% control would pick automatically, maybe pick from whatever the largest eco bloc you currently have; and 50% control would let you pick and apply that value 50% of the time and the rest of the time pick eco randomly, weighed by the amount of each eco you get)\n\n\ngameplay would be semi-procedural 'chapters', each being a mission, with free-roam downtime in between to let you pick whatever yr next mission would be.\n\n the chapters would all be specific goals a la jak missions: deliver something, travel through a zone (sewers, forest, slums, etc) with someone, infiltrate a military zone, kill some monsters.\n sometimes you'd have a supporting character\n and generally each chapter would have one or two sex scenes available, though not every character could get every one (e.g., unless you have 'feral' origin or have built up reputation w/ the metal heads, you probably won't have the option of sex scenes with them)\n then in downtime you could go through the world and talk to various npcs you've 'unlocked' through your missions and have sex with them (or get new missions)\n\nat least one character for each history choice, which you'd start with ranks on\n\nferal: big metal head monster living outside the city walls. like The Beast Of The Wilds except more-or-less peaceful if you don't make trouble; was kind of an older brother figure if you started w/ 'feral'\nslums: some slums gang member. tattoos, piercings, maybe kinda violent, etc; you ran in the same gang as kids if you started w/ 'slums', otherwise he shows up as maybe something of a minor antagonist\nindustrial: some refinery laborer about your age; yr childhood friends if you started with 'industral'; is somebody you can get factory information from otherwise\n\nprisoner: some eco-mutant who went through the same experimental process as you did\nshaman: the main apprentace of the old shaman. yr kind of rivals if you picked 'shaman'\nsolider: torn-alike, only without the 'leader of the resistance' part. muscular and angry and covered in solider tattoos; somebody who was in your squad if you picked 'soldier'\n\nsmuggler: jinx-alike\nmercenary: mog / grim-alike\nhunter: sig-alike\n\neach of these groups would also have a few minor characters, whether that's a specific character (e.g., bartender in smuggler bar, labor chief) or a generic category of people (e.g., ex-soldiers, metal head monsters), and there would be free-roam events with them based on how certain missions went. there would probably also be some other group categories like 'resistence member' or 'city official' that you never start with ranks with\n elite tantra-style soldier/ranger type\n\n maybe there would be some parametric sex scenes w/ generic npc-types. that might be too involved since parametricity can be very difficult to write
<<if $child !== 0 && $adol !== 0 && $job !== 0>>\\n<<display "stat setup">>\n<<display "stat sheet">>\n\n<<else>>\nyou gotta select all history options\n\n<<display "cc">>\n<<endif>>
window.radioSelected = function (selector) {\n var elems = document.querySelectorAll("input[name=\"" + selector + "\"]");\n for (var i = 0; i < elems.length; i++) {\n console.log (elems[i].checked + " / " + elems[i].value);\n if (elems[i].checked) {\n return elems[i].value;\n }\n }\n return null;\n}\n\nwindow.setViews = function () {\n console.log ("running passage load code");\n setTimeout (function () {\n var q = Array.from (document.querySelectorAll ("input"));\n console.log (q);\n q.map (function (elem) {\n if (["child", "adol", "job"].indexOf (elem.name) === -1) {\n return;\n }\n elem.addEventListener ('change', function () {\n reshow ("child");\n reshow ("adol");\n reshow ("job");\n });\n });\n }, 1);\n}
body { margin: 1em 10px; }\n#passages { margin-left: 5em; border: none; }\nul#sidebar { display: none; }\nhr { border: none; border-bottom: 1px solid #f09; margin: 1.2em 4em; }\n\na.internalLink { color: #f09; }\na.internalLink:hover { color: #f9c; text-decoration: none; }\n\n\n#notes {display: block; position: fixed; bottom: 0; right: 3em; width: 15em; height: 3em; line-height: 3em; text-align: center; background: linear-gradient(to top, #f09, transparent);\n}\n#notes a { color: #000; }\n\n.buff { color: #2f3; font-weight: bold; }\n.neg, .dred { color: #e32; font-weight: bold; }\n.opt { font-weight: bold; }\n\ntable label { display: block; }\ntable.stats { float: left; }\ntable.stats td { text-align: right; }\n.tooltip[title] { position: relative; border-bottom: 1px dotted #f09; }\n.tooltip[title]:hover:after { position: absolute; z-index: 1; top: 0; left: 120%; width: 12em; padding: 0.2em 0.5em; border: 1px outset #f09; box-shadow: 0 0 8px 4px #000; text-align: center; color: #fff; background: #100108; content: attr(title); }
#passagecc table { margin: 0 auto; text-align: center; }\n.statblock { clear: both; }\n.statblock > span { float: left; margin: 0.24em 1.5em; }\nhr { clear: both; }
input[type="radio"].toggleInput { display: none; }\ninput.toggleInput + label { padding: 2px; cursor: pointer; font-weight: bold; transition: 0.5s; }\n\ninput.toggleInput + label { background: transparent; color: #f09; }\ninput.toggleInput + label:hover { background: #400020; color: #f9c; }\ninput.toggleInput:checked + label { background: #f09; color: #000; }
function innercontent(tag, parser) {\n var\n i,\n textbegin = parser.source.indexOf(">>",parser.matchStart)+2,\n textend = -1,\n text = parser.source.slice(textbegin),\n depth = 0;\n for (i = 0; i < text.length; i++) {\n if (text.substr(i,tag.length + 5) === ("<<end" + tag)) {\n if(depth===0){\n textend=textbegin+i;\n break;\n }else{\n depth--;\n }\n } else if (text.substr(i,tag.length + 2) === ("<<" + tag)) {\n depth++;\n }\n }\n if (textend === -1) {\n throwError(place,"can't find matching end"+tag,parser.fullMatch())\n return;\n }\n return [textbegin, textend];\n}\n\nfunction parseArg (str) {\n return (str[0] == "$"\n ? eval(Wikifier.parse(str))\n : str);\n}\nfunction varArg (str) {\n return (str[0] == "$"\n ? str.substr(1)\n : str);\n}\n\nmacros.block = {\n handler: function (place, macroName, params, parser) {\n var class_ = params[0][0] == "$"\n ? eval(Wikifier.parse(params[0]))\n : params[0];\n var block = insertElement (null, "span", null, "blockSpan " + class_.replace(" ", "_"));\n var inner_index = innercontent ("block", parser);\n block.tweecode = parser.source.slice(inner_index[0], inner_index[1]);\n parser.nextMatch=inner_index[1];\n place.insertBefore(block,null);\n new Wikifier(block, block.tweecode);\n }\n};\nmacros.endblock = { handler: function () {}}\n\nmacros.toggle = {\n handler: function (place, macroName, params, parser) {\n var varName = params[0] !== undefined ? varArg(params[0]) : null;\n var group = params[1] !== undefined ? parseArg(params[1]) : null;\n var value = params[2] !== undefined ? parseArg(params[2]) : null;\n var display = params[3] !== undefined ? parseArg(params[3]) : null;\n\n var c = insertElement (null, "span", null, "toggleContainer", null);\n var toggleInput = insertElement (c, "input", "toggle_" + value, "toggleInput toggleGroup_" + group, null);\n var toggleLabel = insertElement (c, "label", null, "toggleLabel", display);\n toggleInput.type = "radio";\n toggleInput.name = group;\n toggleInput.value = value;\n toggleLabel.htmlFor = "toggle_" + value;\n\n var changeList = [group];\n toggleInput.addEventListener ('change', function () {\n console.log (params[0] + " set to \"" + toggleInput.value + "\"");\n state.history[0].variables[varName] = toggleInput.value;\n changeList.map (function (f) { console.log (f); reshow (f); });\n });\n\n place.insertBefore(c, null);\n }\n};\n\nwindow.reshow = function (name) {\n var\n rall=document.querySelectorAll(".passage .blockSpan." + name.replace(" ", "_")),\n ret=false;\n for(var i=0;i<rall.length;i++){\n ret=reshowOne(rall[i]);\n }\n return ret;\n}\n\nfunction reshowOne (target) {\n target.innerHTML="";\n new Wikifier(target,target.tweecode);\n target.classList.add("blockSpanIn");\n if(target.timeout){\n clearTimeout(target.timeout);\n }\n target.timeout=setTimeout(\n function(){\n target.classList.remove("blockSpanIn");\n },\n 1);\n}
(function(){version.extensions.replaceMacrosCombined={major:1,minor:1,revision:2};var nullobj={handler:function(){}};function showVer(n,notrans){if(!n){return\n}n.innerHTML="";new Wikifier(n,n.tweecode);n.setAttribute("data-enabled","true");n.style.display="inline";n.classList.remove("revision-span-out");\nif(!notrans){n.classList.add("revision-span-in");if(n.timeout){clearTimeout(n.timeout)}n.timeout=setTimeout(function(){n.classList.remove("revision-span-in");\nn=null},1)}}function hideVer(n,notrans){if(!n){return}n.setAttribute("data-enabled","false");n.classList.remove("revision-span-in");\nif(n.timeout){clearTimeout(n.timeout)}if(!notrans){n.classList.add("revision-span-out");n.timeout=setTimeout(function(){if(n.getAttribute("data-enabled")=="false"){n.classList.remove("revision-span-out");\nn.style.display="none";n.innerHTML=""}n=null},1000)}else{n.style.display="none";n.innerHTML="";n=null}}function tagcontents(b,starttags,desttags,endtags,k){var l=0,c="",tg,a,i;\nfunction tagfound(i,e){for(var j=0;j<e.length;j++){if(a.indexOf("<<"+e[j],i)==i){return e[j]}}}a=b.source.slice(k);for(i=0;\ni<a.length;i++){if(tg=tagfound(i,starttags)){l++}else{if((tg=tagfound(i,desttags))&&l==0){b.nextMatch=k+i+tg.length+4;return[c,tg]\n}else{if(tg=tagfound(i,endtags)){l--;if(l<0){return null}}}}c+=a.charAt(i)}return null}var begintags=[];var endtags=[];function revisionSpanHandler(g,e,f,b){var k=b.source.indexOf(">>",b.matchStart)+2,vsns=[],vtype=e,flen=f.length,becomes,c,cn,m,h,vsn;\nfunction mkspan(vtype){h=insertElement(m,"span",null,"revision-span "+vtype);h.setAttribute("data-enabled",false);h.style.display="none";\nh.tweecode="";return h}if(this.shorthand&&flen){while(f.length>0){vsns.push([f.shift(),(this.flavour=="insert"?"gains":"becomes")])\n}}else{if(this.flavour=="insert"||(this.flavour=="continue"&&this.trigger=="time")){vsns.push(["","becomes"])}}if(this.flavour=="continue"&&flen){b.nextMatch=k+b.source.slice(k).length;\nvsns.push([b.source.slice(k),vtype])}else{becomes=["becomes","gains"];c=tagcontents(b,begintags,becomes.concat(endtags),endtags,k);\nif(c&&endtags.indexOf(c[1])==-1){while(c){vsns.push(c);c=tagcontents(b,begintags,becomes,endtags,b.nextMatch)}c=tagcontents(b,begintags,["end"+e],endtags,b.nextMatch)\n}if(!c){throwError(g,"can't find matching end"+e);return}vsns.push(c);if(this.flavour=="continue"){k=b.nextMatch;b.nextMatch=k+b.source.slice(k).length;\nvsns.push([b.source.slice(k),""])}}if(this.flavour=="remove"){vsns.push(["","becomes"])}cn=0;m=insertElement(g,"span",null,e);\nm.setAttribute("data-flavour",this.flavour);h=mkspan("initial");vsn=vsns.shift();h.tweecode=vsn[0];showVer(h,true);while(vsns.length>0){if(vsn){vtype=vsn[1]\n}vsn=vsns.shift();h=mkspan(vtype);h.tweecode=vsn[0]}if(typeof this.setup=="function"){this.setup(m,g,f)}}function quantity(m){return(m.children.length-1)+(m.getAttribute("data-flavour")=="remove")\n}function revisionSetup(m,g,f){m.className+=" "+f[0].replace(" ","_")}function keySetup(m,g,f){var fl=this.flavour,key=f[0];\nm.setEventListener("keydown",function l(e){var done=!revise("revise",m);if(done){m.removeEventListener("keydown",l)}})}function timeSetup(m,g,f){function cssTimeUnit(s){if(typeof s=="string"){if(s.slice(-2).toLowerCase()=="ms"){return Number(s.slice(0,-2))||0\n}else{if(s.slice(-1).toLowerCase()=="s"){return Number(s.slice(0,-1))*1000||0}}}throwError(g,s+" isn't a CSS time unit");\nreturn 0}var fl=this.flavour;var tm=cssTimeUnit(f[0]);setTimeout(function timefn(){var done=!revise("revise",m);if(!done){setTimeout(timefn,tm)\n}},tm)}function hoverSetup(m){var fn,noMouseEnter=(document.head.onmouseenter!==null);m.onmouseenter=function(){revise("revise",this)\n};m.onmouseleave=function(){revise("revert",this)};if(noMouseEnter){fn=function(n){return function(e){if(!event.relatedTarget||(event.relatedTarget!=this&&!(this.compareDocumentPosition(event.relatedTarget)&Node.DOCUMENT_POSITION_CONTAINED_BY))){this[n]()\n}}};m.onmouseover=fn("onmouseenter");m.onmouseout=fn("onmouseleave")}m=null}function mouseSetup(m){var fl=this.flavour,evt=(document.head.onmouseenter===null?"onmouseenter":"onmouseover");\nm[evt]=function(){var done=!revise("revise",this);if(done){this[evt]=null}};m=null}function linkSetup(m,g,f){var fl=this.flavour,l=Wikifier.createInternalLink(),p=m.parentNode;\nl.className="internalLink replaceLink";p.insertBefore(l,m);l.insertBefore(m,null);l.onclick=function(){var p,done=false;if(m&&m.parentNode==this){done=!revise("revise",m);\nscrollWindowTo(m)}if(done){this.parentNode.insertBefore(m,this);this.parentNode.removeChild(this)}};l=null}function visitedSetup(m,g,f){var i,done,shv=state.history[0].variables,os="once seen",d=(m.firstChild&&(this.flavour=="insert"?m.firstChild.nextSibling:m.firstChild).tweecode);\nshv[os]=shv[os]||{};if(d&&!shv[os].hasOwnProperty(d)){shv[os][d]=1}else{for(i=shv[os][d];i>0&&!done;i--){done=!revise("revise",m,true)\n}if(shv[os].hasOwnProperty(d)){shv[os][d]+=1}}}[{name:"insert",flavour:"insert",trigger:"link",setup:linkSetup},{name:"timedinsert",flavour:"insert",trigger:"time",setup:timeSetup},{name:"insertion",flavour:"insert",trigger:"revisemacro",setup:revisionSetup},{name:"later",flavour:"insert",trigger:"visited",setup:visitedSetup},{name:"keyinsert",flavour:"insert",trigger:"key",setup:keySetup},{name:"replace",flavour:"replace",trigger:"link",setup:linkSetup},{name:"timedreplace",flavour:"replace",trigger:"time",setup:timeSetup},{name:"mousereplace",flavour:"replace",trigger:"mouse",setup:mouseSetup},{name:"hoverreplace",flavour:"replace",trigger:"hover",setup:hoverSetup},{name:"revision",flavour:"replace",trigger:"revisemacro",setup:revisionSetup},{name:"keyreplace",flavour:"replace",trigger:"key",setup:keySetup},{name:"timedremove",flavour:"remove",trigger:"time",setup:timeSetup},{name:"mouseremove",flavour:"remove",trigger:"mouse",setup:mouseSetup},{name:"hoverremove",flavour:"remove",trigger:"hover",setup:hoverSetup},{name:"removal",flavour:"remove",trigger:"revisemacro",setup:revisionSetup},{name:"once",flavour:"remove",trigger:"visited",setup:visitedSetup},{name:"keyremove",flavour:"remove",trigger:"key",setup:keySetup},{name:"continue",flavour:"continue",trigger:"link",setup:linkSetup},{name:"timedcontinue",flavour:"continue",trigger:"time",setup:timeSetup},{name:"mousecontinue",flavour:"continue",trigger:"mouse",setup:mouseSetup},{name:"keycontinue",flavour:"continue",trigger:"key",setup:keySetup},{name:"cycle",flavour:"cycle",trigger:"revisemacro",setup:revisionSetup},{name:"mousecycle",flavour:"cycle",trigger:"mouse",setup:mouseSetup},{name:"timedcycle",flavour:"cycle",trigger:"time",setup:timeSetup},{name:"keycycle",flavour:"replace",trigger:"key",setup:keySetup}].forEach(function(e){e.handler=revisionSpanHandler;\ne.shorthand=(["link","mouse","hover"].indexOf(e.trigger)>-1);macros[e.name]=e;macros["end"+e.name]=nullobj;begintags.push(e.name);\nendtags.push("end"+e.name)});function insideDepartingSpan(elem){var r=elem.parentNode;while(!r.classList.contains("passage")){if(r.classList.contains("revision-span-out")){return true\n}r=r.parentNode}}function reviseAll(rt,rname){var rall=document.querySelectorAll(".passage ."+rname),ret=false;for(var i=0;\ni<rall.length;i++){if(!insideDepartingSpan(rall[i])){ret=revise(rt,rall[i])||ret}}return ret}function revise(rt,r,notrans){var ind2,curr,next,ind=-1,rev=(rt=="revert"),rnd=(rt.indexOf("random")>-1),fl=r.getAttribute("data-flavour"),rc=r.childNodes,cyc=(fl=="cycle"),rcl=rc.length-1;\nfunction doToGainerSpans(n,fn){for(var k=n-1;k>=0;k--){if(rc[k+1].classList.contains("gains")){fn(rc[k],notrans)}else{break\n}}}for(var k=0;k<=rcl;k++){if(rc[k].getAttribute("data-enabled")=="true"){ind=k}}if(rev){ind-=1}curr=(ind>=0?rc[ind]:(cyc?rc[rcl]:null));\nind2=ind;if(rnd){ind2=(ind+(Math.floor(Math.random()*rcl)))%rcl}next=((ind2<rcl)?rc[ind2+1]:(cyc?rc[0]:null));var docurr=(rev?showVer:hideVer);\nvar donext=(rev?hideVer:showVer);var currfn=function(){if(!(next&&next.classList.contains("gains"))||rnd){docurr(curr,notrans);\ndoToGainerSpans(ind,docurr,notrans)}};var nextfn=function(){donext(next,notrans);if(rnd){doToGainerSpans(ind2+1,donext,notrans)\n}};if(!rev){currfn();nextfn()}else{nextfn();currfn()}return(cyc?true:(rev?(ind>0):(ind2<rcl-1)))}macros.revert=macros.revise=macros.randomise=macros.randomize={handler:function(a,b,c){var l,rev,rname;\nfunction disableLink(l){l.style.display="none"}function enableLink(l){l.style.display="inline"}function updateLink(l){if(l.className.indexOf("random")>-1){enableLink(l);\nreturn}var rall=document.querySelectorAll(".passage ."+rname),cannext,canprev,i,ind,r,fl;for(i=0;i<rall.length;i++){r=rall[i],fl=r.getAttribute("data-flavour");\nif(insideDepartingSpan(r)){continue}if(fl=="cycle"){cannext=canprev=true}else{if(r.firstChild.getAttribute("data-enabled")==!1+""){canprev=true\n}if(r.lastChild.getAttribute("data-enabled")==!1+""){cannext=true}}}var can=(l.classList.contains("revert")?canprev:cannext);\n(can?enableLink:disableLink)(l)}function toggleText(w){w.classList.toggle(rl+"Enabled");w.classList.toggle(rl+"Disabled");\nw.style.display=((w.style.display=="none")?"inline":"none")}var rl="reviseLink";if(c.length<2){throwError(a,b+" macro needs 2 parameters");\nreturn}rname=c.shift().replace(" ","_");l=Wikifier.createInternalLink(a,null);l.className="internalLink "+rl+" "+rl+"_"+rname+" "+b;\nvar v="";var end=false;var out=false;if(c.length>1&&c[0][0]=="$"){v=c[0].slice(1);c.shift()}switch(c[c.length-1]){case"end":end=true;\nc.pop();break;case"out":out=true;c.pop();break}var h=state.history[0].variables;for(var i=0;i<c.length;i++){var on=(i==Math.max(c.indexOf(h[v]),0));\nvar d=insertElement(null,"span",null,rl+((on)?"En":"Dis")+"abled");if(on){h[v]=c[i];l.setAttribute("data-cycle",i)}else{d.style.display="none"\n}insertText(d,c[i]);l.appendChild(d)}l.onclick=function(){reviseAll(b,rname);var t=this.childNodes,u=this.getAttribute("data-cycle")-0,m=t.length,n,lall,i;\nif((end||out)&&u==m-(end?2:1)){if(end){n=this.removeChild(t[u+1]);n.className=rl+"End";n.style.display="inline";this.parentNode.replaceChild(n,this)\n}else{this.parentNode.removeChild(this);return}}else{toggleText(t[u]);u=(u+1)%m;if(v){h[v]=c[u]}toggleText(t[u]);this.setAttribute("data-cycle",u)\n}lall=document.getElementsByClassName(rl+"_"+rname);for(i=0;i<lall.length;i++){updateLink(lall[i])}};l=null}};macros.mouserevise=macros.hoverrevise={handler:function(a,b,c,d){var endtags=["end"+b],evt=(window.onmouseenter===null?"onmouseenter":"onmouseover"),t=tagcontents(d,[b],endtags,endtags,d.source.indexOf(">>",d.matchStart)+2);\nif(t){var rname=c[0].replace(" ","_"),h=insertElement(a,"span",null,"hoverrevise hoverrevise_"+rname),f=function(){var done=!reviseAll("revise",rname);\nif(b!="hoverrevise"&&done){this[evt]=null}};new Wikifier(h,t[0]);if(b=="hoverrevise"){h.onmouseover=f;h.onmouseout=function(){reviseAll("revert",rname)\n}}else{h[evt]=f}h=null}}};macros.instantrevise={handler:function(a,b,c,d){reviseAll("revise",c[0].replace(" ","_"))}};macros.endmouserevise=nullobj;\nmacros.endhoverrevise=nullobj}());