Basic Authentication with #Sitecore 9.3

A few months back I was given a task to put in basic authentication into Sitecore 9.3. It was mainly from preventing anyone to get into staging sites. I came across and older blog that is currently missing. I wanted to give them credit since it was the inspiration for this blog. You can find the original blog post on the web archives here. I have made some of my own updates including Rules Based Configuration.

using System;
using System.Web;
using Sitecore.Diagnostics;
using Sitecore.Pipelines.HttpRequest;
using System.Text;
using System.Net.Http.Headers;
using System.Linq;

namespace Abc.SharedSource.SitecoreProcessors
    public class BasicAuthentication : HttpRequestProcessor
        private bool CheckPassword(string username, string password)
            string[] userlist = Sitecore.Configuration.Settings.GetSetting("BasicAuthUsername").Split(',');
            string[] passwords = Sitecore.Configuration.Settings.GetSetting("BasicAuthPassword").Split(',');

            if(userlist.Contains(username) && passwords.Contains(password))
                return true;
                return false;

        private void AuthenticateUser(string credentials)
                var encoding = Encoding.GetEncoding("iso-8859-1");
                credentials = encoding.GetString(Convert.FromBase64String(credentials));

                int separator = credentials.IndexOf(':');
                string name = credentials.Substring(0, separator);
                string password = credentials.Substring(separator + 1);
                if (!CheckPassword(name, password))
                    HttpContext.Current.Response.StatusCode = 401;
                HttpContext.Current.Response.StatusCode = 401;
        //Basic Auth Code End

        public override void Process(HttpRequestArgs args)
            Assert.ArgumentNotNull(args, "args");
            if (Sitecore.Context.Item != null || Sitecore.Context.Database == null || args.Url.ItemPath.Length == 0)

            if (Sitecore.Configuration.Settings.GetSetting("TurnonBasicAuth") != "True" || Sitecore.Configuration.Settings.GetSetting("TurnonBasicAuth") == "") return;
            if (PatternMatch()) return;
            var request = args.HttpContext.Request;

            var authHeader = request.Headers["Authorization"];
            if (authHeader != null)
                var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

                // RFC 2617 sec 1.2, "scheme" name is case-insensitive
                if (authHeaderVal.Scheme.Equals("basic",
                        StringComparison.OrdinalIgnoreCase) &&
                    authHeaderVal.Parameter != null)
                args.HttpContext.Response.StatusCode = 401;

            if (HttpContext.Current.Response.StatusCode == 401)
                string Realm = Sitecore.Context.Site.TargetHostName;//HttpContext.Current.Request.Url.AbsoluteUri;
                    string.Format("Basic realm=\"{0}\"", Realm));
        bool PatternMatch()
            string[] mockUrls = Sitecore.Configuration.Settings.GetSetting("ExcludedPaths").Split(',');
            string url = Sitecore.Context.Site.TargetHostName;// HttpContext.Current.Request.Url.AbsoluteUri;
            foreach (var urlval in mockUrls)
                var containsurl = url.Contains(urlval);
                    return true;
            return false;

Since this is Sitecore 9.3 the configuration below is using rules based. πŸ™‚ More than likely you would want to require the ContentManagement role, but you can modify the configuration to use any roles and environments. I put the username and settings in the configuration since Sitecore will also have its own and in this case is only for preventing anyone who accidently finds the site from seeing anything.

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:patch="" xmlns:localenv="" xmlns:role="">
<sitecore role:require="ContentManagement, Standalone">
    <pipelines localenv:require="DevBuild or LocalDeveloper">
        <processor type="Abc.SharedSource.SitecoreProcessors.BasicAuthentication, BrookfieldResidential.Extensions"
						   patch:before="processor[@type='Sitecore.Pipelines.HttpRequest.UserResolver, Sitecore.Kernel']"/>
    <settings localenv:require="DevBuild or LocalDeveloper">
      <setting name="TurnonBasicAuth" value="True"></setting>
      <setting name="ExcludedPaths" value="media,layouts,speak,/sitecore,/sitecore/admin," />
      <setting name="BasicAuthUsername" value="UserTest1,TestUser2,TesUser3" />
      <setting name="BasicAuthPassword" value="testpass1,testpass2,testpass3" />

You should then get the default login screen that looks like this:

#Sitecore Virtual Symposium Kickoff and My Plans #SitecoreSYM @AlphaSolutionUS

2020 sure has had its changes and challenges. Right now Chicago should be alive with Sitecore fans enjoying the best pizza in the world, but that is not possible this year. I am excited nonetheless to enjoy they symposium in the Chicago suburbs and can’t wait for the next few days.

My goal for this year is to concentrate on content marketing and learn as much as I can about the Sitecore Content Hub. That is something I have been excited to learn more about and can’t wait to dive in.

Things kicked off tonight with Happy Hour. I will let the pictures speak, but there was drink making, a chef and magic. Most of all enthusiasm.

Happy Hour
Making Drinks
Some great appetizers.
Da Bears! Okay they were not part of the kickoff, but they are playing tonight.

Disabling Identity Server in #Sitecore Installation with #PowerShell

Recently I was given the task to disable the identity login for a dev server. It can be done easily by renaming Sitecore.Owin.Authentication.Disabler.config.example and Sitecore.Owin.Authentication.IdentityServer.Disabler.config.example in the [sitefolder]\App_Config\Include\Examples\ folder. We needed an automated way though. Using the PowerShell script below did the trick.

#SitePhysicalRoot and Prefix are optional. If this script is inserted into a PowerShell install script that has these variables already. In my case XP0-SingleDeveloper.ps1.
#$SitePhysicalRoot = "F:\Sites"
#$Prefix = "testsite123"

$filepath = $SitePhysicalRoot + '\' + $Prefix +'.sc\App_Config\Include\Examples\'
$filelist = @()
$fn1 = 'Sitecore.Owin.Authentication.Disabler.config.example'
$fn2 = 'Sitecore.Owin.Authentication.IdentityServer.Disabler.config.example'
$path1 = $filepath + $fn1
$path2 = $filepath + $fn2
$filelist = @($path1,$path2)

 foreach ($file in $filelist) {
    If (Test-Path $file){
        $rn = $file.replace(".example","")
        Rename-Item -Path $file -NewName $rn
        Write-Output $file was renamed to $rn
    } else {
    "{0} does not exist or already renamed" -f $file

#Sitecore Rule Based Configuration for Newbies

If you are like me, you must play around with a new feature to understand it better. When Rule Based configuration was introduced in Sitecore 9.3 that was the case for me. Now that I understand it better and have used it in a real application, I will explain it so if I ever read this blog again, I will understand it.



Depending on if you are running Sitecore locally or have setup a Content Management and Content Delivery server etc… this value will be different for each environment. In the Sitecore 9.3 you will find the following.

Specify the roles that you want this server to perform. A server can perform one or more roles. Enter the roles in a comma separated list. The supported roles are:
ContentDelivery, Indexing
ContentManagement, Indexing
Default value: Standalone

In this case we will just use the default for our example.

<add key="role:define" value="Standalone"/>


This is used to denote the type of local environment installed. For instance, you can have a CM server setup for staging and production. You might then have one value on the CM for staging that says “StageCM” the one on the production CM could be “ProdCM”. This is done so you can break down the configuration settings further. I will go into this more later. In this case we will pretend the role:define value is Standalone and this is a developer’s install. We are going to add the following:

<add key="localenv:define" value="DevEnviroment"/>

Let’s bring this together. Below is a simple example of how to make sure the configuration looks for the role Standalone and localenv value of DevEnviroment. Notice the xmlns:localenv= That is important to tell the process to look for that localenv key and xmlns:role= is used to tell the process to look for the role key. In this example we are doing this for sites, but this can be done for other tags.

<?xml version="1.0"?>
xmlns:patch="" xmlns:localenv="" xmlns:role="">
<sitecore role:require="Standalone">
<sites localenv:require="DevEnviroment">
//Add your transformation code here.

You can do many combinations. Keep in mind that you can use logical expressions as well. Like or and !.

<?xml version="1.0"?>
<configuration xmlns:patch=""xmlns:localenv=""xmlns:role="">
<sitecore role:require="Standalone or ContentDelivery">
<sites localenv:require="LocalDeveloper">
//Add your transformation code here.
<sites localenv:require="DevBuild"> //Add your transformation code here. </sites> <sites localenv:require="Prod"> //Add your transformation code here. </sites> <sites localenv:require="Stage"> //Add your transformation code here. </sites> </sitecore> <sitecore role:require="ContentManagement"> <sites localenv:require="Prod"> //Add your transformation code here. </sites> <sites localenv:require="Stage"> //Add your transformation code here. </sites> </sitecore> </configuration>

What is a good way to test all this? Well Sitecore has though of that.

Using [siteaddress]/sitecore/admin/showconfiglayers.aspx you can select a role and see what the configuration will look like. The result is similar to what you would see with showconfig.aspx.

One thing I should mention is so far, I have not gotten it to work with a non-Sitecore configuration transform. In those cases, you may still need to use something like SlowCheetah. Let me know if you have any questions.

Check out the links below for more reading on the rule based configurations.

#Sitecore Data Exchange Framework Gems

There are a lot of things I have found with each version of the Sitecore Data Exchange Framework that I wanted to explore, and others have asked me about. I will call them gems. These are things that might not always be used but can serve a good purpose I believe. I also wanted to get a higher understanding of what they do so here we are. I hope to go into more detail for each one in other blogs.

Telemetry Enabled

With telemetry enabled checkbox checked you can track the performance of each process. This information can be useful to IT support group as well as developers needed to know how the DEF process performs so adjustments can be made to processes/hardware for instance.

Create New Item

In the checkbox option below, it is defaulted as unchecked. Normally based on a unique field value a new item would be created when unchecked after checking if an existing item exists. Checking it the item will be only created in memory. There could be a variety of reasons to have an item in memory only. One of which would be for testing, it saves clean up time when you just need to test processing without worrying about getting rid of the Sitecore items.

Runtime Settings

This setting allows the pipeline step to be run on a different server. This saves resources on the Sitecore server. I can see this used for something where a lot of data is involved from a separate data source and/or if you finish extracting data from Sitecore another system can pick it up and continue. The DEF process can wait for that to be done and continue.


I have not used this, but from what I understand xDB analytics data migration would be logged here if you have a DEF process that does that. If you do not, make sure not to check any of the options. It can cause the DEF process not to work.

There are some more little gems I am going to look at for DEF in another blog. Also like I said before I am going to try and expand and go into more detail on each one of these. Let me know what you would like to see and I will try and cover it.

Working Remote. Tips from a Veteran Basement Warrior

I have been working remote for a long time and with the current events going on, I thought I would share some of my advice I learned along the way. Everyone is different so not everything I do will work for everyone. I am always tweaking things myself. A happy workplace = happy working. So, here are my top tips.

Get Your Dream Desk. A Sit/Stand Desk Perhaps

I always wanted the desk my old boss had. It was one of the nicest desks I have seen. When I started working remote, I end up purchasing something similar. However, with the stand-up desk movement I added a conversion for it. My tastes have changed since then and I wouldn’t go back to a traditional desk. I am in the process of upgrading my desk now. I wanted to go for a clean look and a sit/stand desk with a motor. I also ended up upgrading my chair to an ergonomic stool. You can find lots of YouTube videos on the clean look or you can always just go for a traditional look. Either way find something that makes you happy. This is the site where I got my current ergonomic stool has free fast shipping and desk that is on its way. Check out Autonomous here.

Get Out of the House

This could be going to the store, meeting up with a group to exercise, going to the gym etc.… It also could mean going out your front door and sitting on the porch for ten minutes. That fresh air will do you good.


Find out where professional meetups are in your area and try to attend. If you don’t have one, maybe start one. I attend Sitecore meetups in Chicago and Milwaukee. I have also spoke virtually at meetups. It is a great way to make connections and friends.


This is so important. You could run before working in the morning, go to the gym at lunch, take a bike ride, walk the dog etc.… Just get out there and take care of you.

Good Internet Connection and Strong Signal

This is important. Communication and productivity are key when working remote. Without a good internet connection with fast speeds you will run into many issues. Also, your Wi-Fi should reach the whole house. I highly recommend a mesh system instead.

Tweak Your Office

The nice thing about working from home is you can make your office the perfect setting. Tastes change. You get sick of looking at the same stuff or using the same electronics. You can try something new and mix things up. Paint your office or rearrange your desk. Whatever you do it is your choice.

Use Your Webcam

I know a lot of times you don’t want to be seen, because you may be in your pajamas. However, it is nice to get a face with the people you are talking to. I attend a virtual Sitecore lunch every Friday and we have our webcams on. It is fun to talk about our different backgrounds and put a name to a face.

Switch Office Places

Sometimes you need a change of scenery. Go to the coffee shop or library sometimes. Or maybe just sit on a recliner. This a big advantage you have working remote that you couldn’t do working in a company office. Can you imagine leaving and going to a coffee shop before you were remote?

Comfortable Footwear

I have gone through my fair share of slippers. Not a lot of good quality ones so they don’t last long, but they were fun to try. I had a running injury a while back and now I just use shoes. You should wear whatever you are comfortable in.

Dress Professional Sometimes

Believe it or not I miss some of the days of dressing nice for the office. I am not talking about formal wear, but business casual. Occasionally wear something you would wear in the office. It always feels good to dress the part.

Virtual Meetings

I briefly touched on this above. Meeting with co-workers, clients, professionals in the same are of work as you are great ways to keep connecting to the outside world. Most clients will already have virtual meetings, but that does not mean you can’t do lunch and learns with them and your co-workers.

Talk Off Topics with Your Co-Workers

Slack and Microsoft Teams are just a few of the ways to talk to your co-workers. Most modern companies are already are using these tools. Why not use it to talk about stuff you would normally share around a water cooler?

Use a Trackball Instead of a Mouse

This is my personal favorite. Trackballs have been around for a long time and don’t get the recognition they deserve. I am not a fan of using a touchpad or mouse. Trackballs are ergonomic, don’t take up a lot of space, easily portable and they are one of the neatest gadgets. Nobody can judge you for using one when working remote.

Keep Your Office Clean

You don’t have a cleaning crew usually working at your home office. So, you are it. I just threw away a ton of garbage in my office. Stuff like cables and paper (recycled what I could). Don’t be like me. Throw it away or recycle anything you can that you won’t probably need.

Work the Hours You Would Work in an Office

This is a given for most companies, but you may be tempted to work at different times throughout the day. I know there are different situations, but keeping to the 8-9 hour work days really helps make the remote situation more like you are in the office. Also, most people are available from 8-5, 9-5 etc.… Keep in mind time zones come into play, but more than likely the communication will be better when things are not off hours. Now of course these days working remote almost feels like you are always around. Which is true in a way. You will find yourself working off the clock more than when you are in a n office. Sometimes though you need to shut it off, so you are ready for the next workday.

I will update this blog as I think of new things and updates. For the ones who are new at this you will get the hang of it. If you have any questions don’t hesitate to ask.

#Sitecore #SCHackathon 2020 Team Sitecore Daredevil (My solo adventure.)

This was my fourth year competing in the Sitecore Hackathon. This year was a little different for me though. As I had to go in it alone. I am not going to lie; I was a little nervous doing this solo. I thought hey I will try and do what I can, but if after a few hours if I just don’t get it, I will be done. After all I had a lot going on as early in the morning, I would have to stop to do Dad duty. However, this experience made me better and I even discovered some things about myself. So, here is the play by play and what I learned along the way.


The last three years I learned a lot of how to prepare as much as I could. You can check out those experiences here. I learned my lesson in the past to install Sitecore beforehand. This year it was the latest version 9.3. Also learned to make sure I had access to my GitHub repo and to download the solution. All good there.

Hours 1-2

For some reason I did not get the topics emailed to me, but that didn’t stop me. I went on Slack to the Hackathon channel and one of the judges sent me them. I looked them over and my first thought was I need a team to do this.

Task were something like this (had to choose just one):

  • Create a meetup website.
  • Create a new site for Sitecore modules.
  • Create a new Hackathon website.

You see these tasks kind of needed a front-end developer to make it look pretty. Not that I can’t do front-end work, but not one of my strengths. However, I was in the same boat as others as I found out in Slack. So, functionality first then I will make it look as pretty as possible. I did need to envision the screen either way and I sketched out something for the meetup website task. Then after an hour of research I said no. I saw someone post in Slack about the KISS (keep it simple stupid) method. One of the best coding philosophies ever. So from the past I have learned go for the path with the least resistance and make it work. I chose to do the Hackathon website. I had ideas on how to make it better and utilize Sitecore out of the box. Just pure raw Sitecore is all I needed.

Hours 3-10

Did I ever mention I have run over ten marathons? If I could do that maybe I could do this I thought. Well in the words of Forrest Gump I was running. Except replace running with coding. Well to be honest I created the templates, layouts and content for the first few hours. Does that count as coding? I had a vision on how I could make the site easy to maintain. I want to mention that I used the icon Sitecore searcher. Thank you Gabrial Streza.

After creating the initial Sitecore stuff it was time to fire up Visual Studio and start integrating. I coded away. With each hour that went by I got a little further. In fact, I didn’t want to stop. I finally got to a point where I had to as I had to make a two-hour drive round trip and be on Dad duty at a sporting event.

Not going to lie. At this point I was really wishing I had a team. When you know you will have to go on little sleep the next day it is good to have someone there with you that you can tag in. Fortunately, just going on Slack helped me feel a little more supported.

Hours 11-13

I slept. Also dreamed about the Hackathon.

Hours 14-19

Drove and went to one of my kids sporting events. Thought about the Hackathon while there and if I will get the documentation done on time. Drove home and then I was back at it.

Hours 20-23

Finish up the code and make the screen look pretty as possible. Okay looks like the 90’s front-end and Netscape only compatible, but the functionality and my vision are there. Let’s package it up. Update the Readme file with installation instructions and screen shots. Okay got that. Now I must do a video. The part I was dreading the most. It was like when Scrooge was going to meet the ghost of Christmas future. So, after trying a few things decided what the heck time to buy Snagit. In one take I had my video. Checked in code and double checked it and checked it in a few more times to make sure it was perfect. Viewed the readme file which contained installation instructions, screen shots, package link and video link. Alright time to call it a day.

Lessons Learned This Year (short list this year)

  • Functionality first. I always knew this, but most of the time with Sitecore projects I prefer the screens done first.
  • Buy Snagit. It is worth every penny.
  • Do a clean install of the package. Not that it would fail, but I am thinking next year have another vanilla Sitecore site at the standby.


I have to say no matter what happens. I learned a lot about myself and gained some confidence I felt I have been missing. In 24 hours I got to be an architect, lead developer, senior developer and entry level developer. Others may not always believe in you and support you, but for sure you must be your own biggest cheerleader.

My Third #Sitecore Technology MVP Journey. #SitecoreMVP

I debate this every year. Should I write a blog about becoming a Sitecore MVP? I like to blog so why not. It is no secret that I love the Sitecore community and I am honored to be a part of it. Being an MVP last year I was able to help with feedback on a few things before they were released to rest of the community. I felt like the cool kid in class. So here is my goal check and what I would like to do this year.

Last year’s goals:

  • Write some more good quality blogs. (I believe I did this. I really hope my DEF blogs have helped at least one person.)
  • Attend all the local Sitecore meetups including one in Milwaukee. (Chicago didn’t have much for meetups, but drove the 2+ hours to go the Milwaukee meetup. I also got to present at one. Yay!)
  • Reach out help others in Slack and Sitecore Stack Exchange. (I love helping others so I won’t stop trying.)
  • Create Sitecore Runner Buttons and bring them to the Symposium. (Sadly I didn’t get to go this year, but if you want a button I can send you one. :()
  • Using my new MVP status network with the Sitecore family better. (I hope I did a good job with this, but I can always do better.)
  • Participate in the Sitecore Hackathon again. (Did that with a successful submission finally.)
  • Make a VLog. (I still have to make this happen.)
  • Finish that update on my DEF Reddit Module in the Sitecore Marketplace. (All updated and code shared.)

This Year’s Goals:

  • Helping others. I love doing this and feel I can do a better job.
  • Continue updating my blog and sharing my knowledge with the Sitecore community.
  • Come up with a good idea that hasn’t been done before with Sitecore (I got this, can’t share yet until I know it works.)
  • Speak again at a meetup. I was shy once. Hard to believe. I love speaking now in front of others.
  • Make that darn VLog. For my new idea I will need to.
  • Attend the Sitecore Symposium in Chicago. I can take the train. Even if it costs me vacation time and I have to pay for it I will be there.
  • Keep updating my DEF Reddit Module.


Ways Retailers and Brands Built With #Sitecore Can Compete Against Amazon

There are many ways to compete against Amazon. The digital market is still wide open for competition. Using Sitecore you have tools that can get your brand out in front of a wider audience with many more engagements and customer purchases. You can target customers based on their needs that would be a good fit to buy your brand. As a race director I have learned a few tricks on how to compete with other races. Participants want the experience of a good course, lots of support and some nice bling. Marketing in the digital world is not that much different. So, here are top five things that you can do to compete against Amazon and can be implemented with the custom site with a Sitecore CMS. Recently I got the chance to take a class on Sitecore’s commerce server. A lot of the features mentioned below are ready for use with little customization.

Drive Brand Awareness

There are many visuals and tools you can use to drive brand awareness. Here are some that are often used.

  • Infographics – Infographics embedded in various places will catch the attention of potential customers getting to engage more with your brand.
  • Social Media Tagging – Tagging related brands will not only make the brand company you tagged grateful it will also engage that company’s followers. In turn the brand company you tagged may tag you on another post.
  • Social Media Contests – Having a giveaway is a great way to build up your contact list and get potential customers interested in your brand.
  • Social media ad boosting – Many may see your ad but paying a little extra for your ad gets it in front of a wider range audience. We have all seen the sponsored ads in Facebook that we tend to click on.
  • Partner with others that compliment your products – This goes along with social media tagging, but there are other things you can do to partner. You can present a case of working together with another brand that makes your brand a must buy when using the other brand. For example, a company that sells rags for cleaning may partner with a company that makes chemicals used in cleaning.
  • Email Marketing – This is one of the best ways to keep your customer list up to date on new products and specials you may be running. It also keeps you on the customer’s mind when it is time for them to go shopping for your product brand.
  • Blogging – Talking about your brand and giving real life cases for it can be accomplished easily with blogging. Blogs also can be shared on many social sites as well. Building up followers for your blog will get many to engage as you publish new ones or a series of blogs about a certain topic.
  • Search Engine Optimization – A good site will be search engine friendly. Make sure each page in your site in the meta data describes the page well so search engines know to pick it up and show it in the expected results. Also having other complimentary brands link to your site helps search visibility as well.

Offer Fast Shipping

One of Amazon’s main selling point is their fast shipping for prime members. Many sites have now offered free shipping over a certain amount. A big difference between shipping from Amazon and a specific site is the personal touch a site gives to the order. If there is an issue the customer knows they can go directly to that company. Digital advertising of shipping is a keyway to get potential customers to order directly from you.

Dynamic Pricing – Shoppers are very price savvy these days. Checking competitor prices on brands you sell will keep you competitive with your competition’s prices. Amazon has done this to stay competitive and using dynamic pricing along with shipping deals can make sure a potential customer will buy from you.

Auto Delivery – Selling anything that will keep customers continuing to buy from you is a great way to keep current customers and make them happy, so they don’t run out of a product they continually buy. For instance, some vitamin shops will offer a 10% discount and free shipping when you use their auto-ship program. Ensuring you never run out.

Membership Pricing and Deals – It is always good to be part of the club. Having customers that are part of a free membership program will help you target their needs easier. When you have specials, they can be the first one that is notified based on their preferences.

Milwaukee #Sitecore October Meetup Recap. @layeronemedia #mkesug @ParagonInc

This was my second Milwaukee meetup and this one like the last one did not disappoint. I drove 2+ hours to get there both ways, but it was worth it. So here is the summary in pictures.

Food First

Presentation 1

The first presentation was “Keeping Content Editors In Mind When Implementing”​ presented by Andrew Schwabe. He talked about one of the most forgotten things when creating a website. The content editor. He emphasized to think of the customer as the content editor on how you could make their experience better. Lots of great tips such as getting the experience editor changes in front of them before the front-end done. So, they can get a feel of how they will change things. Also figuring out what the customer really needs and wants to change instead of giving them extra steps to do one thing.

Presentation 2


The second presentation was “Introduction to Sitecore JavaScript Services (JSS)​” by Phil Busch. This was one of the first times I have seen JSS in action and it did not disappoint. We started from PowerShell, then Visual Studio and then finally in Sitecore. One of the biggest things I learned is that you have to change your mind set and be more front-end focused then back-end focus which is normally the case when most Sitecore developers are coding.

Next meetup is Chicago meets Milwaukee. Always a good time at that one.