From 9b4b4a6be01352e19121b6f64179af6f6ca66a4e Mon Sep 17 00:00:00 2001 From: kopareigns <kopareigns@gmail.com> Date: Tue, 15 Jan 2019 02:20:24 -0500 Subject: [PATCH] Convert Feet.tw --- src/art/artJS.tw | 167 ++++++++++++++++++++++ src/art/vector/Feet.tw | 308 +---------------------------------------- 2 files changed, 168 insertions(+), 307 deletions(-) diff --git a/src/art/artJS.tw b/src/art/artJS.tw index a6f6f799812..806dd1736e3 100644 --- a/src/art/artJS.tw +++ b/src/art/artJS.tw @@ -2522,3 +2522,170 @@ window.ArtVectorCollar = function(slave) { return jsInclude("Art_Vector_Collar_Ancientegyptian"); } }; + +window.ArtVectorFeet = function(slave) { + const T = State.temporary; + let legSize = T.legSize; + let r = ""; + let outfit, stockings; + if (slave.legAccessory === "short stockings") + stockings = "SS"; + else if (slave.legAccessory === "long stockings") + stockings = "LL"; + + /* BEWARE: Uses _legSize set by Art_Vector_Leg_ */ + /* Updated 2018-10-25 by Fr0g */ + /* - added brackets to make boolean logic run */ + /* TODO: use additional JS function to combine shoes/legSize? */ + switch (slave.shoes) { + case "heels": + r += jsInclude("Art_Vector_Shoes_Heel"); + break; + case "pumps": + r += jsInclude("Art_Vector_Shoes_Pump"); + break; + case "extreme heels": + if (legSize === "Narrow") + r += jsInclude("Art_Vector_Shoes_Extreme_Heel_Narrow"); + else if (legSize === "Normal") + r += jsInclude("Art_Vector_Shoes_Extreme_Heel_Normal"); + else if (legSize === "Wide") + r += jsInclude("Art_Vector_Shoes_Extreme_Heel_Wide"); + else if (legSize === "Thick") + r += jsInclude("Art_Vector_Shoes_Extreme_Heel_Thick"); + break; + case "boots": + if (legSize === "Narrow") + r += jsInclude("Art_Vector_Shoes_Boot_Narrow"); + else if (legSize === "Normal") + r += jsInclude("Art_Vector_Shoes_Boot_Normal"); + else if (legSize === "Wide") + r += jsInclude("Art_Vector_Shoes_Boot_Wide"); + else if (legSize === "Thick") + r += jsInclude("Art_Vector_Shoes_Boot_Thick"); + break; + case "flats": + r += jsInclude("Art_Vector_Shoes_Flat"); + break; + default: + if (slave.amp === 0) { + r += jsInclude("Art_Vector_Feet_Normal"); + } else if (slave.PLimb === 1 || slave.PLimb === 2) { + if (slave.amp === -1) + r += jsInclude("Art_Vector_Feet_ProstheticBasic"); + else if (slave.amp === -2) + r += jsInclude("Art_Vector_Feet_ProstheticSexy"); + else if (slave.amp === -3) + r += jsInclude("Art_Vector_Feet_ProstheticBeauty"); + else if (slave.amp === -4) + r += jsInclude("Art_Vector_Feet_ProstheticCombat"); + else if (slave.amp === -5) + r += jsInclude("Art_Vector_Feet_ProstheticSwiss"); + } + } + + if (stockings && slave.amp !== 1) { + if (slave.shoes === "heels") { + if (legSize === "Narrow") + r += jsInclude(`Art_Vector_Shoes_Heel_${stockings}_Narrow`); + else if (legSize === "Normal") + r += jsInclude(`Art_Vector_Shoes_Heel_${stockings}_Normal`); + else if (legSize === "Wide") + r += jsInclude(`Art_Vector_Shoes_Heel_${stockings}_Wide`); + else if (legSize === "Thick") + r += jsInclude(`Art_Vector_Shoes_Heel_${stockings}_Thick`); + } else if (slave.shoes === "pumps") { + if (legSize === "Narrow") + r += jsInclude(`Art_Vector_Shoes_Pump_${stockings}_Narrow`); + else if (legSize === "Normal") + r += jsInclude(`Art_Vector_Shoes_Pump_${stockings}_Normal`); + else if (legSize === "Wide") + r += jsInclude(`Art_Vector_Shoes_Pump_${stockings}_Wide`); + else if (legSize === "Thick") + r += jsInclude(`Art_Vector_Shoes_Pump_${stockings}_Thick`); + } else if (slave.shoes === "flats") { + if (legSize === "Narrow") + r += jsInclude(`Art_Vector_Shoes_Flat_${stockings}_Narrow`); + else if (legSize === "Normal") + r += jsInclude(`Art_Vector_Shoes_Flat_${stockings}_Normal`); + else if (legSize === "Wide") + r += jsInclude(`Art_Vector_Shoes_Flat_${stockings}_Wide`); + else if (legSize === "Thick") + r += jsInclude(`Art_Vector_Shoes_Flat_${stockings}_Thick`); + } else if (slave.shoes === "none") { + if (legSize === "Narrow") + r += jsInclude(`Art_Vector_Shoes_Stockings_${stockings}_Narrow`); + else if (legSize === "Normal") + r += jsInclude(`Art_Vector_Shoes_Stockings_${stockings}_Normal`); + else if (legSize === "Wide") + r += jsInclude(`Art_Vector_Shoes_Stockings_${stockings}_Wide`); + else if (legSize === "Thick") + r += jsInclude(`Art_Vector_Shoes_Stockings_${stockings}_Thick`); + } + } + + switch (slave.clothes) { + case "a bra": + case "a button-up shirt": + case "a button-up shirt and panties": + case "a chattel habit": + case "a comfortable bodysuit": + case "a cybersuit": + case "a gothic lolita dress": + case "a hanbok": + case "a leotard": + case "a nice pony outfit": + case "a one-piece swimsuit": + case "a penitent nuns habit": + case "a scalemail bikini": + case "a skimpy loincloth": + case "a slutty klan robe": + case "a slutty outfit": + case "a slutty pony outfit": + case "a sports bra": + case "a string bikini": + case "a striped bra": + case "a sweater": + case "a sweater and panties": + case "a t-shirt": + case "a t-shirt and panties": + case "a t-shirt and thong": + case "a tank-top": + case "a tank-top and panties": + case "a thong": + case "a tube top": + case "a tube top and thong": + case "an oversized t-shirt": + case "attractive lingerie for a pregnant woman": + case "chains": + case "kitty lingerie": + case "no clothing": + case "panties": + case "panties and pasties": + case "shibari ropes": + case "striped panties": + case "striped underwear": + case "uncomfortable straps": + break; /* do nothing for these cases */ + case "a Fuckdoll suit": + case "a latex catsuit": + case "body oil": + case "restrictive latex": + if (State.variables.seeVectorArtHighlights === 1) /* special case for shiny clothing */ + outfit = "Shine"; + break; + default: + outfit = clothing2artSuffix(slave.clothes); + } + if (outfit) { + if (slave.amp !== 1) { + if (slave.clothes !== "a slutty qipao" && slave.clothes !== "harem gauze" && slave.clothes !== "slutty jewelry" && slave.clothes !== "Western clothing") /* these clothes have a stump/leg outfit, but no butt outfit */ + r += jsInclude(`Art_Vector_Butt_Outfit_${outfit}_${T.buttSize}`); + if (slave.clothes !== "a schoolgirl outfit") /* file is there, but contains no artwork */ + r += jsInclude(`Art_Vector_Leg_Outfit_${outfit}_${legSize}`); + } else { + r += jsInclude(`Art_Vector_Leg_Outfit_${outfit}_Stump`); + } + } + return r; +}; diff --git a/src/art/vector/Feet.tw b/src/art/vector/Feet.tw index 0212fcce766..ccd85b0a702 100644 --- a/src/art/vector/Feet.tw +++ b/src/art/vector/Feet.tw @@ -1,309 +1,3 @@ :: Art_Vector_Feet_ [nobr] -/* BEWARE: Uses _legSize set by Art_Vector_Leg_ */ -/* Updated 2018-10-25 by Fr0g */ -/* - added brackets to make boolean logic run */ - -<<if _artSlave.amp == 0>> - <<switch _artSlave.shoes>> - <<case "heels">> - <<include Art_Vector_Shoes_Heel>> - <<case "pumps">> - <<include Art_Vector_Shoes_Pump>> - <<case "extreme heels">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Extreme_Heel_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Extreme_Heel_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Extreme_Heel_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Extreme_Heel_Thick>> - <</if>> - <<case "boots">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Boot_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Boot_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Boot_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Boot_Thick>> - <</if>> - <<case "flats">> - <<include Art_Vector_Shoes_Flat>> - <<default>> - <<include Art_Vector_Feet_Normal>> - <</switch>> -<<elseif _artSlave.amp == -1 && (_artSlave.PLimb == 1 || _artSlave.PLimb == 2)>> - <<switch _artSlave.shoes>> - <<case "heels">> - <<include Art_Vector_Shoes_Heel>> - <<case "pumps">> - <<include Art_Vector_Shoes_Pump>> - <<case "extreme heels">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Extreme_Heel_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Extreme_Heel_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Extreme_Heel_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Extreme_Heel_Thick>> - <</if>> - <<case "boots">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Boot_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Boot_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Boot_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Boot_Thick>> - <</if>> - <<case "flats">> - <<include Art_Vector_Shoes_Flat>> - <<default>> - <<include Art_Vector_Feet_ProstheticBasic>> - <</switch>> -<<elseif _artSlave.amp == -2 && (_artSlave.PLimb == 1 || _artSlave.PLimb == 2)>> - <<switch _artSlave.shoes>> - <<case "heels">> - <<include Art_Vector_Shoes_Heel>> - <<case "pumps">> - <<include Art_Vector_Shoes_Pump>> - <<case "extreme heels">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Extreme_Heel_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Extreme_Heel_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Extreme_Heel_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Extreme_Heel_Thick>> - <</if>> - <<case "boots">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Boot_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Boot_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Boot_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Boot_Thick>> - <</if>> - <<case "flats">> - <<include Art_Vector_Shoes_Flat>> - <<default>> - <<include Art_Vector_Feet_ProstheticSexy>> - <</switch>> -<<elseif _artSlave.amp == -3 && (_artSlave.PLimb == 1 || _artSlave.PLimb == 2)>> - <<switch _artSlave.shoes>> - <<case "heels">> - <<include Art_Vector_Shoes_Heel>> - <<case "pumps">> - <<include Art_Vector_Shoes_Pump>> - <<case "extreme heels">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Extreme_Heel_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Extreme_Heel_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Extreme_Heel_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Extreme_Heel_Thick>> - <</if>> - <<case "boots">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Boot_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Boot_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Boot_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Boot_Thick>> - <</if>> - <<case "flats">> - <<include Art_Vector_Shoes_Flat>> - <<default>> - <<include Art_Vector_Feet_ProstheticBeauty>> - <</switch>> -<<elseif _artSlave.amp == -4 && (_artSlave.PLimb == 1 || _artSlave.PLimb == 2)>> - <<switch _artSlave.shoes>> - <<case "heels">> - <<include Art_Vector_Shoes_Heel>> - <<case "pumps">> - <<include Art_Vector_Shoes_Pump>> - <<case "extreme heels">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Extreme_Heel_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Extreme_Heel_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Extreme_Heel_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Extreme_Heel_Thick>> - <</if>> - <<case "boots">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Boot_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Boot_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Boot_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Boot_Thick>> - <</if>> - <<case "flats">> - <<include Art_Vector_Shoes_Flat>> - <<default>> - <<include Art_Vector_Feet_ProstheticCombat>> - <</switch>> -<<elseif _artSlave.amp == -5 && (_artSlave.PLimb == 1 || _artSlave.PLimb == 2)>> - <<switch _artSlave.shoes>> - <<case "heels">> - <<include Art_Vector_Shoes_Heel>> - <<case "pumps">> - <<include Art_Vector_Shoes_Pump>> - <<case "extreme heels">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Extreme_Heel_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Extreme_Heel_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Extreme_Heel_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Extreme_Heel_Thick>> - <</if>> - <<case "boots">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Boot_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Boot_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Boot_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Boot_Thick>> - <</if>> - <<case "flats">> - <<include Art_Vector_Shoes_Flat>> - <<default>> - <<include Art_Vector_Feet_ProstheticSwiss>> - <</switch>> -<</if>> - -<<if _artSlave.legAccessory == "short stockings" && _artSlave.amp != 1>> - <<if _artSlave.shoes == "heels">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Heel_SS_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Heel_SS_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Heel_SS_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Heel_SS_Thick>> - <</if>> - <<elseif _artSlave.shoes == "pumps">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Pump_SS_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Pump_SS_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Pump_SS_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Pump_SS_Thick>> - <</if>> - <<elseif _artSlave.shoes == "flats">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Flat_SS_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Flat_SS_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Flat_SS_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Flat_SS_Thick>> - <</if>> - <<elseif _artSlave.shoes == "none">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Stockings_SS_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Stockings_SS_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Stockings_SS_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Stockings_SS_Thick>> - <</if>> - <</if>> -<<elseif _artSlave.legAccessory == "long stockings" && _artSlave.amp != 1>> - <<if _artSlave.shoes == "heels">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Heel_LL_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Heel_LL_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Heel_LL_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Heel_LL_Thick>> - <</if>> - <<elseif _artSlave.shoes == "pumps">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Pump_LL_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Pump_LL_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Pump_LL_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Pump_LL_Thick>> - <</if>> - <<elseif _artSlave.shoes == "flats">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Flat_LL_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Flat_LL_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Flat_LL_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Flat_LL_Thick>> - <</if>> - <<elseif _artSlave.shoes == "none">> - <<if _legSize == "Narrow">> - <<include Art_Vector_Shoes_Stockings_LL_Narrow>> - <<elseif _legSize == "Normal">> - <<include Art_Vector_Shoes_Stockings_LL_Normal>> - <<elseif _legSize == "Wide">> - <<include Art_Vector_Shoes_Stockings_LL_Wide>> - <<elseif _legSize == "Thick">> - <<include Art_Vector_Shoes_Stockings_LL_Thick>> - <</if>> - <</if>> -<</if>> - -<<unset _art_outfit >> /* clean up variable possibly already set by prior widget run */ - -<<switch _artSlave.clothes>> /* select available clothes */ - <<case "a ball gown" "a biyelgee costume" "a bunny outfit" "a cheerleader outfit" "a dirndl" "a fallen nuns habit" "a halter top dress" "a hijab and abaya" "a huipil" "a kimono" "a latex catsuit" "a long qipao" "a maternity dress" "a military uniform" "a mini dress" "a monokini" "a mounty outfit" "a nice maid outfit" "a nice nurse outfit" "a red army uniform" "a schoolgirl outfit" "a schutzstaffel uniform" "a slave gown" "a slutty maid outfit" "a slutty nurse outfit" "a slutty qipao" "a slutty schutzstaffel uniform" "a succubus outfit" "a toga" "an apron" "attractive lingerie" "battlearmor" "battledress" "clubslut netting" "conservative clothing" "cutoffs and a t-shirt" "lederhosen" "nice business attire" "restrictive latex" "slutty business attire" "spats and a tank top" "stretch pants and a crop-top" "Western clothing" "a niqab and abaya" "a burqa" "a klan robe" "a hijab and blouse" "a burkini" "cutoffs" "sport shorts" "sport shorts and a sports bra" "sport shorts and a t-shirt" "jeans" "leather pants" "leather pants and pasties" "leather pants and a tube top" "boyshorts" "a t-shirt and jeans" "an oversized t-shirt and boyshorts" "a sweater and cutoffs" "a police uniform">> - <<set _art_outfit = clothing2artSuffix(_artSlave.clothes) >> -<</switch>> - -/* special case for shiny clothing */ -<<if $seeVectorArtHighlights == 1>> - /* this one is leg and partly butt-related, but needs to be here as shoes are drawn over legs and butt */ - <<if _artSlave.fuckdoll != 0 || _artSlave.clothes == "restrictive latex" || _artSlave.clothes == "a latex catsuit" || _artSlave.clothes == "body oil">> - <<set _art_outfit = "Shine" >> - <</if>> -<</if>> - -<<if def _art_outfit >> - <<if _artSlave.amp != 1>> - <<if ["an apron", "a ball gown", "a bunny outfit", "attractive lingerie", "a chattel habit", "a cheerleader outfit", "a fallen nuns habit", "a halter top dress", "a hijab and abaya", "a huipil", "a kimono", "a latex catsuit", "a maternity dress", "a military uniform", "a mini dress", "a monokini", "a nice maid outfit", "a nice nurse outfit", "a red army uniform", "a schoolgirl outfit", "a schutzstaffel uniform", "a slutty schutzstaffel uniform", "slutty business attire", "a slutty maid outfit", "a slutty nurse outfit", "spats and a tank top", "a slave gown", "a succubus outfit", "a toga", "battledress", "body oil", "clubslut netting", "conservative clothing", "cutoffs and a t-shirt", "nice business attire", "restrictive latex", "stretch pants and a crop-top", "a long qipao", "battlearmor", "a biyelgee costume", "lederhosen", "a dirndl", "a niqab and abaya", "a burqa", "a mounty outfit", "a klan robe", "a niqab and abaya", "a hijab and blouse", "a burkini", "cutoffs", "sport shorts", "sport shorts and a t-shirt", "jeans", "sport shorts and a sports bra", "leather pants", "leather pants and pasties", "leather pants and a tube top", "boyshorts", "a t-shirt and jeans", "an oversized t-shirt and boyshorts", "a sweater and cutoffs", "a police uniform"].includes(_artSlave.clothes)>> - <<set _art = "Art_Vector_Butt_Outfit_"+_art_outfit+"_"+_buttSize >><<include _art >> - <</if>> - <<if _artSlave.clothes != "a schoolgirl outfit">> - <<set _art = "Art_Vector_Leg_Outfit_"+_art_outfit+"_"+_legSize >><<include _art >> - <</if>> - <<else>> - <<if _artSlave.clothes != "a schoolgirl outfit">> - <<set _art = "Art_Vector_Leg_Outfit_"+_art_outfit+"_Stump" >><<include _art >> - <</if>> - <</if>> -<</if>> +<<= ArtVectorFeet(_artSlave)>> -- GitLab