New TS w/INI support

A forum for you to dump all the macros you create, allowing users to use, modify, and comment on your work.

Moderator: MacroQuest Developers

Diggler
> Oid
Posts: 120
Joined: Thu Oct 09, 2003 3:28 pm
Location: Lexington, KY

New TS w/INI support

Post by Diggler » Thu Oct 16, 2003 5:01 am

Hiyas. Been a troll here for a long time (sorry) lol. Anyways, I felt it was high time I contributed something. Sat down today and worked out INI support for the much used TS macro. I basically added some bits that I like shamelessly stolen from other posts (waitfordrop/waitforpickup/ini stuff from forage) and rolled them into this tested, 100% working (for me at least) TS macro.

Code: Select all

|New TS
| ts.mac (tradeskill.mac) 
|INI Support by Diggler

#turbo 
#define INIFile "c:\macroquest\release\macros\recipes.ini"

#event SkillTrivial "You can no longer advance your skill from making this item" 
#event SkillUp "You have become better at" 
#event SkillFailure "You lacked the skills" 
#event SkillSuccess "You have fashioned the items together to create something new" 
#event FullInventory "There was no place to put that" 
#event CombineError "You cannot combine these items in this container type!" 
#chat tell 

Sub Main 
/declare ShowStats global 
/declare EndOnTrivial global 
/declare dly global 
/declare abt global 
/declare FinishedProduct global 
/declare DesiredSuccesses global 
/declare ErrorAtCombine global 
/declare CombineErrorCounter global 
/declare SkillTrivialCounter global 
/declare SkillFailCounter global 
/declare SkillSuccessCounter global 
/declare SuccessRate global 
/declare TotalAttempts global 
/declare SkillUpRate global 
/declare SkillUpCounter global 
/declare CombInt global 
/declare CombStr global 
/declare TotalComp global 
/declare l0 local 
/declare a array 
 
   /call SetDefaults 
   /if $defined(Param0)==false /call ExecError 
   /if "@Param0"=="help" /call ShowHelp 
   /call ParseArgs "@Param0" 

   /varset ErrorAtCombine 0 
   /varset CombineErrorCounter 0 
   /varset SkillTrivialCounter 0 
   /varset SkillFailCounter 0 
   /varset SkillSuccessCounter 0 
   /varset SuccessRate 0 
   /varset TotalAttempts 0 
   /varset SkillUpRate 0 
   /varset SkillUpCounter 0 
    
   /call CombFind "$ini("INIFile","@Param1","Cont")" 
   /if n @CombInt<=7 /varset CombStr "pack @CombInt" 
   /if @CombInt==8 { 
      /varset CombInt e 
      /varset CombStr enviro 
   } 
   /if @CombInt>=98 /if @CombInt<=99 { 
      /if n @CombInt==99 /echo Cannot find container << @Param1 >> 
      /if n @CombInt==98 /echo Too far away from << @Param1 >> 
      /endmacro 
   } 

 
   /varset TotalComp 0 
   /call ClearCursor @FinishedProduct 
   :CountComponents 
      /varset a(@TotalComp) "$ini("INIFile","@Param1","Comp$int(@TotalComp)")" 
      /varadd TotalComp 1 
      /if n $int(@TotalComp)>10 /call ExecError 
      /echo Component $int(@TotalComp): "@a($int($calc(@TotalComp-1))")" 
      /if "$ini("INIFile","@Param1","Comp$int(@TotalComp)")"~~"@" { 
         /goto :DestroyCheck 
      } else /if "$ini("INIFile","@Param1","Comp$int($calc(@TotalComp))")"=="NOTFOUND" { 
         /goto :DestroyCheck 
      } else { 
         /goto :CountComponents 
      } 

   :DestroyCheck      
   /if @FinishedProduct=="DESTROY" { 
      /press F1 
      /echo This macro is currently set to destroy successful combines!!!! 
   } 

   :Begin 
      /call ClearCursor @FinishedProduct 
      /doevents 

      /if "$target(name,clean)"=="$char(name)" { 
         /echo Pausing!! To resume, type /target clear or target something else. 
         :HoldingPattern 
            /delay 2s 
            /if "$target(name,clean)"=="$char(name)" /goto :HoldingPattern 
      } 
      /if n @DesiredSuccesses!=0 /if n @DesiredSuccesses<=@SkillSuccessCounter { 
         /echo Created $int(@DesiredSuccesses) items as requested! 
         /call EndCombines 
      } 
      /for l0 0 to $int($calc(@TotalComp-1)) 
         |/echo calling AddComp "@a(@l0)" @l0 
         /call AddComp "@a(@l0)" @l0 
      /next l0 

   :Combine 
      /doevents 
      /call DoCombine 

   :ClearCursor 
      /doevents 
      /call ClearCursor @FinishedProduct 
   }    
   /goto :Begin 
/return 

Sub SetDefaults 
   /varset ShowStats 1 
   /varset EndOnTrivial 0 
   /varset dly 2 
   /varset abt 0 
   /varset FinishedProduct "keep" 
   /varset DesiredSuccesses 0 
/return 

Sub CheckOptions 
   /if "@Param1"=="" { 
      /echo Syntax: /call CheckOptions "option" "value" 
      /endmacro 
   } 
   /if "@Param0"=="combines" { 
    /varset DesiredSuccesses $int(@Param1) 
    /return 
   } 
   /if "@Param0"=="cursor-delay" { 
    /varset dly $int(@Param1) 
    /return 
   } 
   /if "@Param0"=="end-on-trivial" { 
    /varset EndOnTrivial $int(@Param1) 
    /return 
   } 
   /if "@Param0"=="abort-on-tell" { 
    /varset abt $int(@Param1) 
    /return 
   } 
   /if "@Param0"=="destroy" { 
    /if n @Param1==1 /varset FinishedProduct "destroy" 
    /return 
   } 
   /if "@Param0"=="show-stats" { 
    /varset ShowStats $int(@Param1) 
    /return 
   } 
   /echo unknown option @Param0 

/return 

Sub ParseArgs 
/declare l0 local 
/declare l1 local 
/declare l2 local 
/declare l3 local 
/declare l4 local 

   /if $defined(Param0)==false { 
      /echo Syntax: /call ParseArgs "space seperated string of arguments" 
      /endmacro 
   } 
   /if "@Param0"~~"default" { 
      /call SetDefaults 
      /goto :EndOptions 
   } 
   /varset l0 "@Param0" 
   /call CountArgs "@l0" 
   /varset l1 $int($return) 
   /for l2 1 to @l1 
      /if n @l1>1 /varset l0 "$arg($int(@l2),"@Param0")" 
      /varset l3 $left($instr("=","@l0"),"@l0") 
      /varset l4 $right($calc($strlen("@l0")-$instr("=","@l0")-1),"@l0") 
      /call CheckOptions "@l3" "@l4" 
   /next l2 
   :EndOptions 
/return 

Sub CountArgs 
/declare l0 local 
/declare l1 local 
   /if $defined(Param0)==false { 
      /echo Syntax: /call CountArgs "space seperated string of arguments" 
      /endmacro 
   } 
   /varset l0 1 
   /varset l1 1 
   :Loop 
      /if "$mid($int(@l1),1,"@Param0")"==" " /varadd l0 1 
      /varadd l1 1 
   /if n @l1<$strLen("@Param0") /goto :Loop 
/return $int(@l0) 

Sub ExecError 
   /echo Syntax error. 
   /echo Type the following for more help: 
   /echo /macro sits "help" 
   /endmacro 
/return 

Sub ShowHelp 
   /echo Syntax: /macro ts <options> <keyword> 
   /echo Example: /macro ts "show-stats=0 destroy=0 abort-on-tell=0 end-on-trivial=0" swatch 
   /echo - 
   /echo MAKE SURE THAT: 
   /echo * INIFile is pointing to YOUR ini file! 
   /echo * Inventory is open. 
   /echo * All your containers are open. 
   /echo * Nothing crosses over each other, all windows (bags, inventory, buttons) must be free. 
   /echo * Your window positions are saved (by closing them and opening them again after they have been moved). 
   /echo - 
   /echo Options: 
   /echo -------- 
   /echo * show-stats 
   /echo -- Syntax: show-stats=1|0 
   /echo -- Example: show-stats=0 
   /echo -- Shows combine statistics. 
   /echo -- Set to 1 for show showing stats, 0 to leave out the stats. 
   /echo -- Default set to 1 (show stats). 
   /echo - 
   /echo * destroy 
   /echo -- Syntax: destroy=1|0 
   /echo -- Example: destroy=1 
   /echo -- Tells the macro wether end-result is destroyed or kept. 
   /echo -- Set to 1 for destroying end-result, 1 to keep end-result. 
   /echo -- Default set to 0 (keep end-result). 
   /echo - 
   /echo * abort-on-tell 
   /echo -- Syntax: abort-on-tell=1|0 
   /echo -- Example: abort-on-tell=1 
   /echo -- Tell the macro wether it should /endmacro when recieving a tell. 
   /echo -- Set to 1 for ending macro on tells, 0 to ignore tells. 
   /echo -- Default set to 0 (ignore tells). 
   /echo - 
   /echo * end-on-trivial 
   /echo -- Syntax: end-on-trivial=1|0 
   /echo -- Example: end-on-trivial=1 
   /echo -- Tell the macro wether it should stop combines when recieving a trivial message. 
   /echo -- Set to 1 for ending macro on trivial, 0 to ignore trivial. 
   /echo -- Default set to 0 (ignore trivial). 
   /echo - 
   /echo * cursor-delay 
   /echo -- Syntax: cursor-delay=# 
   /echo -- Example: cursor-delay=4 
   /echo -- The delay between mouse commands in the macro. 
   /echo -- Increase this number to make the macro combine slower, but more safely. Decrease the number to combine faster, but more prone to errors. 
   /echo -- Default set to 2 (this is as fast as it has been tested to be able to go) 
   /echo - 
   /echo * combines 
   /echo -- Syntax: combine=# 
   /echo -- Example: combine=100 
   /echo -- The number of successfull combines you want made (or till no more components are available). 
   /echo -- Set to 0 for unlimited combines (or till no more components are available), or to the wanted amount. 
   /echo -- Default set to 0 (unlimited). 
   /echo - 
   /echo * default 
   /echo -- Syntax: default 
   /echo -- Tell the macro to use all default settings, any other options set will be ignored and defaults will be used. 
   /endmacro 
/return 

Sub CleanPack 
/declare l0 local 
/declare l1 local 
   /press ctrl 
   /sendkey down shift 
   /if "@CombStr"=="enviro" { 
      /varset l0 10 
   } else { 
      /varcalc l0 $pack(@CombInt,slots)-1 
   } 

   /for l1 0 to @l0 
      /click left @CombStr @l1 
      /call WaitForPickup 
      /click left auto 
      /call WaitForDrop 
   /next l1 
   /sendkey up shift 
   /press shift 
/return 

sub ClearCursor 
/declare l0 local 
/declare l1 local 
/declare l2 local 
   :Loop 
      /delay @dly 
      /if $cursor()!=NULL { 
         /if "@Param0"=="DESTROY" { 
            /varset l0 0 
            :SubLoop 
              /if "@a(@l0)"~~"#" { 
                  /varset l1 "$right($calc($strlen("@a(@l0)")-1),"@a(@l0)")" 
                  /varset l2 0 
               } else { 
                  /varset l1 "@a(@l0)" 
                  /varset l2 1 
               } 
               /if n @l2==0 /if "$cursor(name)"~~"@l1" { 
                  /click left auto 
                  /delay @dly 
               } else /if n @l2==1 /if "$cursor(name)"=="@l1" { 
                  /click left auto 
                  /delay @dly 
               } 
               /if "$cursor()"!="NULL" { 
                  /if n @l0< $calc(@TotalComp-1) { 
                     /varadd l0 1 
                     /goto :SubLoop 
                  } else { 
                     /click left destroy 
                     /delay @dly 
                  } 
               } 
         } else { 
            /click left auto 
            /delay @dly 
         } 
      } 
      /if $cursor()!=NULL /goto :Loop 
/return 

sub DoCombine 
      /click left @CombStr combine
   :Loop 
      /doevents 
      /delay 2 
      | careful here, this seems to take a long time 
      /if $pack(@CombInt,empty)==FALSE /goto :Loop 
/return 

sub AddComp 
   /press shift 
   /sendkey down ctrl 
   /if "@Param0"~~# { 
      /finditem similar "$right($calc($strlen("@Param0")-1),"@Param0")" 
   } else { 
      /finditem "@Param0" 
   } 
   /if $find()==FALSE /goto :NoComp 
   /call WaitForPickup 
   /click left @CombStr @Param1 
   /call WaitForDrop 
   /goto :End 
   :NoComp 
      /echo Could not find << @Param0 >> 
      /call EndCombines 
   :End 
      /sendkey up ctrl 
      /press ctrl 
/return 

Sub CombFind 
/declare l0 local 
/declare l1 local 
/declare l2 local 
/declare l3 local 

   /varset CombInt 99 
   /if "@Param0"~~"#" { 
      /varset l1 "$right($calc($strlen("@Param0")-1),"@Param0")" 
      /varset l2 0 
   } else { 
      /varset l1 "@Param0" 
      /varset l2 1 
   } 
   /for l3 0 to 7 
      /if n @l2==0 /if "$pack(@l3,name)"~~"@l1" /varset CombInt @l3 
      /if n @l2==1 /if "$pack(@l3,name)"=="@l1" /varset CombInt @l3 
   /next l3 

   /if n @CombInt==99 { 
      /if "@l1"=="enviro" /varset CombInt 8 
      /if n @CombInt!=8 /itemtarget @Param0    
      /if n @CombInt!=8 /if n $ground(id)==0 /varset CombInt 99 
      /if n @CombInt!=8 /if n $distance(item)>20 /varset CombInt 98 
      /if n @CombInt!=8 /if n $ground(id)>0 /if n $distance(item)<=20 /varset CombInt 8 
   } 
/return @CombInt 

Sub DisplayStats 
   /echo Combine Statistics - Successes: $int(@SkillSuccessCounter), Failures: $int(@SkillFailCounter), Trivial: $int(@SkillTrivialCounter) 
   /varcalc TotalAttempts @SkillFailCounter + @SkillSuccessCounter 
   /if n @TotalAttempts>0 { 
   /varcalc SuccessRate @SkillSuccessCounter / @TotalAttempts * 100 
   /varcalc SkillUpRate @SkillUpCounter / @TotalAttempts * 100 
   /echo Successes Rate: $int(@SuccessRate) % out of $int(@TotalAttempts) attempts 
   } else { 
      /echo Unable to complete a combine.  No Stats to report 
   } 
   /if n @SkillUpCounter>0 /echo Skill Ups: $int(@SkillUpCounter) , Skill Rate: $int(@SkillUpRate) % out of $int(@TotalAttempts) attempts 
   /if n @SkillTrivialCounter>0 /echo THIS ITEM IS OR HAS GONE TRIVIAL! 
/return 

Sub EndCombines 
   /call CleanPack 
   /if n @ShowStats==1 /call DisplayStats 
   /endmacro 
/return 

Sub Event_Chat 
   /if "@abt"=="TRUE" { 
      /echo Got a tell, pausing. 
      /press F1 
   } 
/return 

Sub Event_CombineError 
   /varcalc ErrorAtCombine @SkillFailCounter + @SkillSuccessCounter 
   /varadd CombineErrorCounter 1 
   /if n @CombineErrorCounter<=1 { 
      /echo Attempting to recover from failed combine! 
      /call CleanPack 
   } else { 
      /echo Failed to recover from failed combine! 
      /call EndCombines 
   } 
/return 

Sub Event_FullInventory 
   /echo Your inventory is full, ending macro. 
   /call EndCombines 
/return 

Sub Event_SkillFailure 
   /varadd SkillFailCounter 1 
   /if n @CombineErrorCounter>=1 /varset CombineErrorCounter 0    
/return 

Sub Event_SkillSuccess 
   /varadd SkillSuccessCounter 1 
   /if n @CombineErrorCounter>=1 /varset CombineErrorCounter 0 
/return 

Sub Event_SkillUp 
   /varadd SkillUpCounter 1 
   /echo $int(@SkillUpCounter) skill ups in $int($calc(@SkillFailCounter+@SkillSuccessCounter)) attempts! 
/return 

Sub Event_SkillTrivial 
   /call ClearCursor @FinishedProduct 
   /varadd SkillTrivialCounter 1 
   /if n @ShowStats==1 /if n @SkillTrivialCounter==1 /echo THIS ITEM IS OR HAS GONE TRIVIAL! 
   /if n @EndOnTrivial==1 /if n @SkillTrivialCounter==1 /call EndCombines 
/return 

Sub WaitForPickup 
   :waiting 
   /if $cursor()==FALSE /goto :waiting 
/return 

Sub WaitForDrop 
   :waiting 
   /if $cursor()==TRUE /goto :waiting 
/return 
This, like I said, works for me. If it doesn't work for you, let me know, and I'll try and dig thru the code and see where I messed up, if I did. Here's a sample INI file if you don't know how to make one.

Code: Select all

[bits]
Cont=enviro
Comp0=Small Piece of Ore
Comp1=Small Piece of Ore
Comp2=Water Flask

[dough]
Cont=#mixing
Comp0=#egg
Comp1=#Milk
Comp2=#flour


EDITED 10/28/03: Updated code to fix the 'Cannot Combine when hands are full' etc. spam messages. Thx Catt for noticing ;)
Last edited by Diggler on Tue Oct 28, 2003 7:52 pm, edited 2 times in total.

MsRandom
orc pawn
orc pawn
Posts: 11
Joined: Fri Oct 03, 2003 6:04 am

Post by MsRandom » Thu Oct 16, 2003 9:18 pm

wowza!!! :shock:

/bow, /grovel, /scrape

Will be working with this the next few days to get set to my liking, but it looks yummah!!!!!!

thanks!

User avatar
psychotik
a ghoul
a ghoul
Posts: 112
Joined: Mon Oct 06, 2003 3:48 am

Post by psychotik » Fri Oct 17, 2003 2:45 am

crashed to desktop when i ran it =p

Diggler
> Oid
Posts: 120
Joined: Thu Oct 09, 2003 3:28 pm
Location: Lexington, KY

Post by Diggler » Fri Oct 17, 2003 5:16 pm

Works just fine for me, I use it daily. What build you running/etc?

bzt
a lesser mummy
a lesser mummy
Posts: 77
Joined: Fri Oct 10, 2003 3:39 pm

Post by bzt » Fri Oct 17, 2003 5:36 pm

I am a total newb.. how do I get this to work? Like step by step instructions. I think for t making , say, fishrolls, I would have to add to the ini

[fishrolls]
Cont=#spit
Comp0=#fish
Comp1=#Bat Wing


but how do I get it to make fishrolls and not dough?..( please forgive me if I sound stupid, I really dont know how to use most of these macros, it took me a week to figure out a spell casting macro..and there is no way I could write one fo these things)

thanks much for any help

Diggler
> Oid
Posts: 120
Joined: Thu Oct 09, 2003 3:28 pm
Location: Lexington, KY

Post by Diggler » Fri Oct 17, 2003 6:46 pm

First, you have to define the recipe in the INI file. Yes, what you put there is exactly what you should add to your INI.

Now, you would use the syntax of the macro to define your product. If you wanted to make fishrolls, you would type:

/macro ts "default" fishrolls

That should help you.

bzt
a lesser mummy
a lesser mummy
Posts: 77
Joined: Fri Oct 10, 2003 3:39 pm

Post by bzt » Sat Oct 18, 2003 12:19 am

so when I want more recipes, I just type em in the ini like the fishroll one, then type /macro ts "default" itemname?


and the ini goes in the macro folder?

bzt
a lesser mummy
a lesser mummy
Posts: 77
Joined: Fri Oct 10, 2003 3:39 pm

Post by bzt » Sat Oct 18, 2003 3:24 am

made the ts.mac.. and then made an ini in the macros folder, changed the macro to point to the ini ( mines not in the c: ). My ini is:

Code: Select all

[bits] 
Cont=enviro 
Comp0=Small Piece of Ore 
Comp1=Small Piece of Ore 
Comp2=Water Flask 

[dough] 
Cont=#mixing 
Comp0=#egg 
Comp1=#Milk 
Comp2=#flour

[fishrolls]
Cont=enviro
Comp0=Bat Wing
Comp1=Fresh Fish
I also tried with # in front of the items and get the same thing.

ok..I open all the bags, Open the oven, make sure no bags are overlapping. I have the batwings and fresh fish in a bag next to the oven. and type /macro ts "default" fishrolls

then the cursor goes nuts and picks up whatever is right next to the oven ( the right side), even if it is bat wing...and then says


[MacroQuest] Component 1: "#Bat Wing
[Sat Oct 18 01:21:51 2003] [MacroQuest] Component 2: "#Fresh Fish
[Sat Oct 18 01:21:51 2003] Couldn't find a 'bat wing'
[Sat Oct 18 01:21:51 2003] [MacroQuest] Could not find << #Bat Wing >>
[Sat Oct 18 01:21:54 2003] [MacroQuest] Combine Statistics - Successes: 0, Failures: 0, Trivial: 0
[Sat Oct 18 01:21:54 2003] [MacroQuest] Unable to complete a combine. No Stats to report
[Sat Oct 18 01:21:54 2003] Cleared the following: Timers Vars Arrays
[Sat Oct 18 01:21:54 2003] The current macro has ended.


what am I doing wrong?

Falco
orc pawn
orc pawn
Posts: 23
Joined: Fri Sep 26, 2003 5:25 am

Post by Falco » Sat Oct 18, 2003 7:39 am

hey, well i fiddled with this a bit, then found it works making yew leaf tempers if the water flask is in first inventory slot(bag of them) and yew leafs are in slot 2, havent tried any other way, but for some reason it keeps tagin the combine key 3 time or so before dropping it into inventory, i also changed the turbo to 150 so as to not draw any undo attention to my massive(100) combine of yew leafs.

Zalhain
decaying skeleton
decaying skeleton
Posts: 5
Joined: Mon Oct 20, 2003 12:07 pm
Contact:

Very Nice Macro

Post by Zalhain » Mon Oct 20, 2003 5:59 pm

I have been using this macro since you got it done and love it.. However I have decided to compile a complete multi-tradeskill INI file for it. I was just wondering, can the product names can be capitalized and have a space in them?

Code: Select all

[bits] 
Cont=enviro 
Comp0=Small Piece of Ore 
Comp1=Small Piece of Ore 
Comp2=Water Flask
Could be?

Code: Select all

[Metal Bits] 
Cont=enviro 
Comp0=Small Piece of Ore 
Comp1=Small Piece of Ore 
Comp2=Water Flask

MsRandom
orc pawn
orc pawn
Posts: 11
Joined: Fri Oct 03, 2003 6:04 am

Post by MsRandom » Tue Oct 21, 2003 6:48 am

I've been putting a large INI together too Zalhain, and I've just been running the name all together becuase I wasn't sure -- i.e. metalbits. For some that have combines under different skills, I just add a tag on the end to specify which recipe it is (since they'll be different containers) -- i.e. avialofprismaticdyebrew

Caveat - I haven't tested this out yet.


What I'm wondering is - is it possible to put in "flavor" text into an INI? For instance, little lines of some symbol to separate the skills to make it a bit easier to update when I want to while retaining some semblance of structure and organization?

Bio_War
a lesser mummy
a lesser mummy
Posts: 36
Joined: Sun Sep 29, 2002 1:03 pm

Alchemy recipe INI

Post by Bio_War » Tue Oct 21, 2003 7:11 pm

I just finished an INI file for Alchemy, let me know if it would be alright to post it, if not, cool, just PM me.

Bio

MsRandom
orc pawn
orc pawn
Posts: 11
Joined: Fri Oct 03, 2003 6:04 am

Post by MsRandom » Fri Oct 24, 2003 6:10 am

I dunno about anyone else, but I'd sure love to take a peek bio. :D

Guest

Post by Guest » Sat Oct 25, 2003 11:05 am

Great work!

I'd like to offer a small suggestion/change.

from:

Code: Select all

sub DoCombine 
   :Loop 
      /click left @CombStr combine 
      /doevents 
      /delay 2 
      | careful here, this seems to take a long time 
      /if $pack(@CombInt,empty)==FALSE /goto :Loop 
/return 
to:

Code: Select all

sub DoCombine 
      /click left @CombStr combine 
   :Loop 
      /doevents 
      /delay 2 
      | careful here, this seems to take a long time 
      /if $pack(@CombInt,empty)==FALSE /goto :Loop 
/return 
What this does is stops the multiple combine presses, which once in a while cause error messages in EQ, like "You cannot combine items when your hands are full!" and "You must place items in this object in order to create something new." which could be used / watched by SOE to detect macro usage.

Catt
a lesser mummy
a lesser mummy
Posts: 76
Joined: Mon Sep 16, 2002 2:49 am

Post by Catt » Sat Oct 25, 2003 11:07 am

Bah, I wasn't signed in.

The above was by me. :p