WEBVTT 00:00.000 --> 00:11.000 Yes, quick recap. 00:11.000 --> 00:15.000 This is me, Skinna Kewarkin. 00:15.000 --> 00:19.000 It's out there. 00:19.000 --> 00:22.000 AWS Lambda is a function as a service. 00:22.000 --> 00:28.000 So we can take our swift code and put it in the cloud and run it. 00:28.000 --> 00:30.000 In any way, we don't have to manage the server. 00:30.000 --> 00:31.000 So it is serverless. 00:31.000 --> 00:33.000 So that also just means we can put it there. 00:33.000 --> 00:36.000 We don't have to worry about suddenly we get like data. 00:36.000 --> 00:39.000 So we got like super popular and we have a bunch of requests. 00:39.000 --> 00:43.000 It will just handle that all of for us. 00:43.000 --> 00:44.000 And then quick. 00:44.000 --> 00:47.000 Some pricing about it is it's dependent on the number of requests that you have. 00:47.000 --> 00:51.000 And then the duration of those functions to execute. 00:51.000 --> 00:56.000 So for the free tier, you get 1 million requests per month. 00:56.000 --> 00:59.000 So if you just want to play around, you'll be totally fine. 00:59.000 --> 01:02.000 And then it's also dependent on your code to execute. 01:02.000 --> 01:04.000 But that will then depend on where you throw it. 01:04.000 --> 01:08.000 Like as in what kind of memory you give you allocate to it. 01:08.000 --> 01:11.000 So if you have like you know more memory, it takes more time to run. 01:11.000 --> 01:14.000 But like, sorry, more memory, but it takes less time to run. 01:14.000 --> 01:18.000 That pricing though will still be different than if you allocate less memory. 01:18.000 --> 01:21.000 And it runs like longer. 01:21.000 --> 01:25.000 Okay, let's just do some live coding because I like demos. 01:26.000 --> 01:31.000 So let's kick this off with. 01:31.000 --> 01:34.000 Can everybody see the font all the way in the back. 01:34.000 --> 01:37.000 Yay. Yay. Cool. 01:37.000 --> 01:39.000 Okay, so what we do is make a swift package. 01:39.000 --> 01:41.000 The first thing we do is type this. 01:41.000 --> 01:43.000 So swift package in it. 01:43.000 --> 01:44.000 Type is executable. 01:44.000 --> 01:46.000 And then we're just calling this my lambda. 01:46.000 --> 01:48.000 But you can see the example that I have. 01:48.000 --> 01:52.000 I actually called it demo with multiple O's because I had many demos going on. 01:52.000 --> 01:55.000 So this was the demo that made it. 01:55.000 --> 01:58.000 And we first go to our swift package. 01:58.000 --> 02:00.000 So we have package.swift. 02:00.000 --> 02:04.000 And this is how we add any other external packages into the application. 02:04.000 --> 02:07.000 So what we do is add the swift lambda. 02:07.000 --> 02:10.000 Or yes, swift AWS lambda runtime. 02:10.000 --> 02:17.000 And that is the runtime that actually like lets our swift code interact with how AWS lambda is set up. 02:17.000 --> 02:20.000 And then we are adding swift AWS lambda events. 02:20.000 --> 02:26.000 And those events are how we communicate with stuff like the API gateway to use wrist network requests. 02:26.000 --> 02:29.000 And then like every other swift package. 02:29.000 --> 02:31.000 Does anyone not done swift here? 02:31.000 --> 02:33.000 Cool. 02:33.000 --> 02:35.000 This is easy then. 02:35.000 --> 02:36.000 You know what this looks like. 02:36.000 --> 02:38.000 So then we have our demo and we add those dependencies to it. 02:38.000 --> 02:43.000 And that is your basic package.swift for like pretty much everything. 02:43.000 --> 02:48.000 So here is our main.swift file has the basic yellow world when you just make a new package. 02:48.000 --> 02:53.000 Let's turn this into an actual lambda function. 02:53.000 --> 02:55.000 So here is our hello world of lambda. 02:55.000 --> 03:00.000 We defined the runtime which is actually a closure as you can see and it takes two parameters. 03:00.000 --> 03:02.000 Event which is just a string. 03:02.000 --> 03:07.000 And then the lambda context which is what actually talks to an AWS lambda. 03:07.000 --> 03:10.000 And then all we do is run runtime. 03:10.000 --> 03:12.000 So let's go ahead and do that. 03:12.000 --> 03:15.000 We can do swift run. 03:15.000 --> 03:17.000 I don't know how to make the figure on that. 03:17.000 --> 03:20.000 So just trust me it works. 03:20.000 --> 03:24.000 We have swift run and it just runs hello world for us. 03:24.000 --> 03:26.000 And did I miss? 03:26.000 --> 03:29.000 Did I hear something? 03:29.000 --> 03:32.000 Save smart. 03:32.000 --> 03:36.000 There we go. 03:36.000 --> 03:39.000 Makes sense. 03:39.000 --> 03:43.000 Do we not have the set to auto save? 03:43.000 --> 03:47.000 It happens. 03:47.000 --> 03:52.000 So we are running our hello world and it's running a local lambda server. 03:52.000 --> 03:54.000 So that's what I was expecting. 03:54.000 --> 03:58.000 Is running our local lambda server on our Mac here. 03:58.000 --> 04:02.000 So now let's actually call to that. 04:02.000 --> 04:05.000 And we do that by using curl. 04:05.000 --> 04:08.000 And we are making a post request and sending it this string. 04:08.000 --> 04:10.000 So it'll say hello. 04:10.000 --> 04:15.000 And then it is on port 127001 slash invoke. 04:15.000 --> 04:17.000 And you can change that to something else if you want to. 04:17.000 --> 04:19.000 But by default, this is what it is. 04:19.000 --> 04:22.000 So when we do that, we get a basic hello. 04:22.000 --> 04:27.000 So this means that we were able to send the string via a post request. 04:27.000 --> 04:31.000 And then it just prints hello. 04:31.000 --> 04:33.000 So that looks pretty great in all. 04:33.000 --> 04:36.000 But let's make it a little bit more complicated. 04:36.000 --> 04:38.000 So let's do. 04:38.000 --> 04:46.000 So we're going to close that. 04:46.000 --> 04:50.000 Or actually I could just run it again. 04:50.000 --> 04:53.000 So I reran the program at the bottom here. 04:53.000 --> 04:56.000 And then this is a slightly more complicated example. 04:56.000 --> 04:59.000 So what we first do is again import the lambda runtime. 04:59.000 --> 05:02.000 But we're now also importing lambda events. 05:02.000 --> 05:05.000 So this is what allows us to now use the API gateway. 05:05.000 --> 05:10.000 The two requests because we are using the version to AWS lambda, 05:10.000 --> 05:15.000 which right now I'm running off of the main branch because it's not yet officially tagged as 2.0. 05:15.000 --> 05:22.000 So if you were going to do this, you have to just use main up until the point they tag it and everything. 05:22.000 --> 05:24.000 So we have our requests. 05:24.000 --> 05:29.000 And then we also return a response as opposed to previously returning a string. 05:29.000 --> 05:33.000 And all we are doing is taking this adding the header of application JSON. 05:33.000 --> 05:36.000 And echoing back out the request that we gave it. 05:36.000 --> 05:39.000 So you can see we are returning this V2 response. 05:39.000 --> 05:44.000 And in the body is this event parameter, which is just the request. 05:44.000 --> 05:47.000 So what we will get out is the exact same thing that we get in. 05:47.000 --> 05:48.000 So I went ahead. 05:48.000 --> 05:51.000 Did I save it in run at this time? 05:51.000 --> 05:52.000 It is. 05:52.000 --> 05:53.000 Looks like it is. 05:53.000 --> 05:58.000 We'll find out. 05:59.000 --> 06:01.000 So I run curl again. 06:01.000 --> 06:03.000 And then we are adding application JSON. 06:03.000 --> 06:06.000 And then I have this test event dot JSON. 06:06.000 --> 06:08.000 So that's just hanging out over here. 06:08.000 --> 06:11.000 Because we take in now an API gateway V2 request. 06:11.000 --> 06:13.000 We're not taking in a string. 06:13.000 --> 06:19.000 That whole JSON is the whole proper format of what that request looks like. 06:19.000 --> 06:22.000 So that's why I'm just grabbing it from over there. 06:22.000 --> 06:26.000 And we're not actually doing tests, but I just grabbed it from over there. 06:26.000 --> 06:29.000 And then you see an output that we have is in the body. 06:29.000 --> 06:33.000 It is just that request that we sent it. 06:33.000 --> 06:38.000 So this whole thing is the same as that event dot JSON that we sent. 06:38.000 --> 06:40.000 So this looks pretty good. 06:40.000 --> 06:42.000 I mean, this is an amazing function. 06:42.000 --> 06:44.000 It's very useful. 06:44.000 --> 06:47.000 I mean, technically it is if you're testing something. 06:47.000 --> 06:50.000 And so let's just go ahead and deploy this. 06:50.000 --> 06:55.000 So the nice thing is we will be using SAM, which is the serverless application model, 06:55.000 --> 06:56.000 to deploy everything. 06:56.000 --> 06:59.000 So that allows us to just write a YAML file. 06:59.000 --> 07:04.000 And then we can immediately deploy everything because that YAML file sets everything up for us. 07:04.000 --> 07:13.000 So let's make a new file called template dot YAML. 07:13.000 --> 07:17.000 And here is our template. 07:17.000 --> 07:18.000 Yes. 07:18.000 --> 07:20.000 So here is the template that we have. 07:20.000 --> 07:22.000 So it is a Lambda function. 07:22.000 --> 07:26.000 We call it demo with two O's because typos. 07:26.000 --> 07:27.000 It's a function name. 07:27.000 --> 07:32.000 And then right here is the full build path for where we are going to create a zip file. 07:32.000 --> 07:35.000 So how we actually deploy is it we zip everything up. 07:35.000 --> 07:37.000 Send it up to AWS Lambda. 07:37.000 --> 07:41.000 It provisions everything properly based on this template that we're writing right here. 07:41.000 --> 07:42.000 So we have a timeout. 07:42.000 --> 07:44.000 This bootstrap provided AL2. 07:44.000 --> 07:51.000 So I believe that's Amazon Linux 2, which is the operating system that's just provided by Amazon for running this environment. 07:52.000 --> 08:06.000 We set our debug level and then this events part is what we are using for the actual API gateway for sending that specific kind of requests as opposed to sending a string. 08:06.000 --> 08:09.000 So we do that. 08:09.000 --> 08:13.000 And hopefully we can zip everything. 08:13.000 --> 08:16.000 So we zip everything using Swift package archive. 08:16.000 --> 08:20.000 We are disabling the auto update because once when I went to try this this morning, 08:20.000 --> 08:23.000 it tries to update the operating system. 08:23.000 --> 08:28.000 And I was like, no, I'm not doing that on on a live demo. 08:28.000 --> 08:35.000 And then we have allow network connection requests because I think like you and had said packages run in a very siloed way. 08:35.000 --> 08:39.000 And we don't want them doing things they don't want to do or we don't want them to do. 08:39.000 --> 08:42.000 But we are allowing network connections for this. 08:42.000 --> 08:49.000 And I should have already hit enter while I was explaining that and now it's not. 08:49.000 --> 08:50.000 Give it a second. 08:50.000 --> 08:52.000 Let's go think about it. 08:52.000 --> 08:53.000 This internal working backs. 08:53.000 --> 08:59.000 Okay, backspace works. 08:59.000 --> 09:06.000 I saw it move. 09:06.000 --> 09:11.000 Try to get an zip demo. 09:11.000 --> 09:12.000 Oh, there we go. 09:12.000 --> 09:17.000 Okay, it first asks us allow this plugin to run in Docker. 09:17.000 --> 09:23.000 So what we are actually doing is compiling everything, making our zip, but we have to use Docker to do that. 09:23.000 --> 09:32.000 Because I am developing on macOS and the environment that it ends up running in is Amazon Linux 2, which is a Linux environment. 09:32.000 --> 09:38.000 Come in, not found. 09:38.000 --> 09:39.000 Did it work though? 09:39.000 --> 09:44.000 It looks like it works as archive created. 09:47.000 --> 09:49.000 There we go. 09:49.000 --> 09:52.000 How did it work though? 09:52.000 --> 09:54.000 Like, you see that right? 09:54.000 --> 09:57.000 Okay. 09:57.000 --> 09:59.000 Okay. 09:59.000 --> 10:01.000 We're good then. 10:01.000 --> 10:02.000 So we have our zip. 10:02.000 --> 10:06.000 It is now at this URL, which is on my desktop. 10:06.000 --> 10:13.000 And then you can see that URL matches this one because this one is relative from build forwards. 10:13.000 --> 10:18.000 And so because of that, it will use this to actually find the zip file to go and upload it. 10:18.000 --> 10:22.000 So let's upload this amazing function. 10:22.000 --> 10:24.000 And I have to spell the play right. 10:24.000 --> 10:27.000 Oh my gosh. 10:27.000 --> 10:29.000 Sam deployed guided. 10:29.000 --> 10:32.000 So once we hit enter on this, it asks us a couple of things. 10:32.000 --> 10:33.000 So what do we want to call this? 10:33.000 --> 10:35.000 We call it demo. 10:35.000 --> 10:37.000 I believe this is my account. 10:37.000 --> 10:40.000 It's set up on us east because, you know, I'm from the US. 10:40.000 --> 10:43.000 And that's where I originally set everything up. 10:43.000 --> 10:45.000 Confirm changes before deployment. 10:45.000 --> 10:46.000 Yes. 10:46.000 --> 10:47.000 Enter. 10:47.000 --> 10:49.000 Do we want to allow Sam CLI? 10:49.000 --> 10:50.000 I am. 10:50.000 --> 10:51.000 Roll. 10:51.000 --> 10:52.000 Roll creation. 10:52.000 --> 10:54.000 So that says, do we want to allow. 10:54.000 --> 10:59.000 Want to allow Sam to create all the proper roles necessary for creating this function? 10:59.000 --> 11:00.000 And they answer. 11:00.000 --> 11:01.000 Yes. 11:01.000 --> 11:02.000 Disable robot. 11:02.000 --> 11:03.000 Sure. 11:03.000 --> 11:05.000 This has no authentication. 11:05.000 --> 11:06.000 Is this okay? 11:06.000 --> 11:08.000 So this is a demo. 11:08.000 --> 11:10.000 So I'm not going to add authentication. 11:10.000 --> 11:14.000 But you should when you actually make your Lambda functions. 11:14.000 --> 11:15.000 Save arguments. 11:15.000 --> 11:16.000 Yes. 11:16.000 --> 11:17.000 Config. 11:17.000 --> 11:21.000 So these will save all of these configurations that I'm going through right now into a file called 11:21.000 --> 11:23.000 Samconfig.Tommel. 11:23.000 --> 11:24.000 Entomel. 11:24.000 --> 11:27.000 It's just another kind of email. 11:27.000 --> 11:30.000 I mean. 11:30.000 --> 11:33.000 And then it starts building. 11:33.000 --> 11:34.000 And uploading. 11:34.000 --> 11:35.000 So we took. 11:35.000 --> 11:36.000 Take our zip file. 11:36.000 --> 11:39.000 And this internet is actually pretty good. 11:39.000 --> 11:42.000 It is taking that and uploading it to. 11:42.000 --> 11:46.000 80 to eight WS and it's using S3 to do that. 11:46.000 --> 11:49.000 So you could see somewhere in here. 11:49.000 --> 11:50.000 Deploy. 11:50.000 --> 11:51.000 Yes. 11:51.000 --> 11:53.000 Somewhere in here it said. 11:53.000 --> 11:55.000 It's creating an S3 bucket. 11:55.000 --> 12:01.000 And that's where that zip file is actually living at the moment. 12:01.000 --> 12:02.000 Did I not turn? 12:02.000 --> 12:03.000 Do not disturb. 12:03.000 --> 12:05.000 Hmm. 12:05.000 --> 12:07.000 Oh, it's on. 12:07.000 --> 12:08.000 Okay. 12:08.000 --> 12:10.000 That can just bypass it. 12:10.000 --> 12:11.000 Is it going to do it? 12:11.000 --> 12:13.000 It was going pretty well. 12:13.000 --> 12:15.000 Not too bad. 12:15.000 --> 12:17.000 It has thick and slower. 12:17.000 --> 12:19.000 But a lot of times too when you zip everything together. 12:19.000 --> 12:21.000 And if you haven't done that before. 12:21.000 --> 12:22.000 Because it's using Docker. 12:22.000 --> 12:25.000 It has to pull down the entire operating system as well for like. 12:25.000 --> 12:29.000 The Amazon Linux to OS to actually zip it all together and send. 12:29.000 --> 12:30.000 So right now. 12:31.000 --> 12:32.000 So doing pretty good. 12:32.000 --> 12:33.000 Hopefully we can get it. 12:33.000 --> 12:34.000 Oh, there we go. 12:34.000 --> 12:39.000 We have successfully deployed our lovely function to the cloud. 12:39.000 --> 12:43.000 So let's see if it actually works. 12:43.000 --> 12:46.000 If we copy this, we should be able to write curl. 12:46.000 --> 12:48.000 And then paste that URL. 12:48.000 --> 12:50.000 If my auto complete. 12:50.000 --> 12:51.000 Oh my gosh. 12:51.000 --> 12:53.000 Doesn't freak out. 12:53.000 --> 12:55.000 Debited during this off. 12:55.000 --> 12:56.000 Let's see. 12:56.000 --> 12:57.000 Second. 13:00.000 --> 13:01.000 Man. 13:01.000 --> 13:02.000 Quit. 13:02.000 --> 13:03.000 Oh no. 13:03.000 --> 13:06.000 It doesn't quit. 13:06.000 --> 13:09.000 Got a fourth quit terminal. 13:09.000 --> 13:10.000 Oh my gosh. 13:10.000 --> 13:14.000 Where are you not responding? 13:14.000 --> 13:15.000 Yeah. 13:15.000 --> 13:16.000 Report. 13:16.000 --> 13:19.000 That's fine. 13:19.000 --> 13:20.000 Okay. 13:20.000 --> 13:21.000 There we go. 13:21.000 --> 13:26.000 Paste it at curl. 13:26.000 --> 13:29.000 And then the link. 13:29.000 --> 13:30.000 You're welcome. 13:30.000 --> 13:31.000 Someone's self-aware me. 13:31.000 --> 13:34.000 Sebastian, you're still here. 13:34.000 --> 13:37.000 So then we have. 13:37.000 --> 13:41.000 Curl and then pasting your URL for where it was just deployed to. 13:41.000 --> 13:42.000 And we should be able to enter. 13:42.000 --> 13:48.000 And we see coming back is the request that we had sent because the code that we had was 13:48.000 --> 13:50.000 the request response. 13:50.000 --> 13:53.000 So it's successfully deployed. 13:54.000 --> 14:02.000 But we can make this a little bit more fun because this is just your lovely demo. 14:02.000 --> 14:05.000 So let's make a new file called. 14:05.000 --> 14:07.000 Food handler. 14:07.000 --> 14:10.000 Swift. 14:10.000 --> 14:15.000 So I had to go through and find all the great Belgian food to eat, which includes fries, 14:15.000 --> 14:16.000 chocolate, waffles, and beer. 14:16.000 --> 14:19.000 And I think I've had three out of the four of these already. 14:19.000 --> 14:21.000 So it's been good. 14:21.000 --> 14:25.000 And let's change our demo instead of echoing back. 14:25.000 --> 14:28.000 Let's do this. 14:28.000 --> 14:31.000 And we're just going to use our basic food handler class. 14:31.000 --> 14:33.000 Or a struct that I had just created. 14:33.000 --> 14:37.000 All it is is just the struct with a function in it that returns a random one. 14:37.000 --> 14:38.000 But by default, it's for us. 14:38.000 --> 14:41.000 If that shouldn't be the default, let me know. 14:41.000 --> 14:42.000 We have our food handler. 14:42.000 --> 14:46.000 And then we are just taking the food handler, giving us the best food. 14:46.000 --> 14:49.000 And that'll just give us a random element. 14:49.000 --> 14:54.000 So we can, again, run this with just Swift run. 14:54.000 --> 15:01.000 And it ran and then it was. 15:01.000 --> 15:03.000 Yeah, this one. 15:03.000 --> 15:04.000 We just type curl. 15:04.000 --> 15:06.000 We give our response. 15:06.000 --> 15:11.000 And then we get back the correct answer of beer as what kind of food to have right after this. 15:11.000 --> 15:12.000 So we did that. 15:12.000 --> 15:14.000 And all we have to do is deploy this. 15:14.000 --> 15:17.000 So we've already done all the initial setup to do everything. 15:17.000 --> 15:21.000 So now to deploy, we just have to rezip everything. 15:21.000 --> 15:25.000 Which you can, this still had the wrong shortcut. 15:25.000 --> 15:32.000 You can put these steps together to be able to just zip and then send. 15:32.000 --> 15:35.000 I'm doing them separately because. 15:35.000 --> 15:37.000 But all does is takes our demo. 15:37.000 --> 15:40.000 Again, use this Docker to build the entire zip file. 15:40.000 --> 15:44.000 And then we will go ahead and send it off with just Sam to deploy. 15:44.000 --> 15:48.000 We don't have to ask all the questions anymore because we have them all saved. 15:48.000 --> 15:52.000 And the Samconfig.Tummel file. 15:52.000 --> 15:54.000 And then it's doing the exact same thing. 15:54.000 --> 15:58.000 So we're using a different S3 bucket because we have a different zip file that we're using. 15:58.000 --> 16:02.000 And it will go ahead zip it all together and say, let's send it. 16:02.000 --> 16:04.000 Waiting to be. 16:04.000 --> 16:07.000 Created. 16:07.000 --> 16:12.000 I wonder if it would be faster if I picked a region closer to here. 16:12.000 --> 16:14.000 Maybe that's why it's slow. 16:14.000 --> 16:16.000 But we said yes. 16:16.000 --> 16:20.000 And then now again, it'll go through those steps to take that zip. 16:20.000 --> 16:22.000 Send it to the cloud if we do a curl command. 16:22.000 --> 16:24.000 Again, we will see. 16:24.000 --> 16:26.000 Yep, put. 16:26.000 --> 16:28.000 So that is the basic demo. 16:28.000 --> 16:34.000 And what's super nice is because this is Amazon AWS Lambda. 16:34.000 --> 16:40.000 It uses the version two, which also uses the. 16:41.000 --> 16:43.000 We can use Swift testing. 16:43.000 --> 16:49.000 So I couldn't think of a unit test to write for this because all it's doing is returning a basic. 16:49.000 --> 16:57.000 Element from an array, but right here you can see an example using Swift testing, which was just released this pass to dub dub and see. 16:57.000 --> 16:59.000 How you can unit test this. 16:59.000 --> 17:01.000 And everything is also possible. 17:01.000 --> 17:05.000 So when you go to the Swift AWS Lambda runtime. 17:05.000 --> 17:09.000 It has a bunch of examples for what you can do how to do it. 17:09.000 --> 17:12.000 So using an actual example that has authentication. 17:12.000 --> 17:18.000 And you can check out that repo, which I will link right here. 17:18.000 --> 17:23.000 Has the link for all the things that you need to go ahead and then. 17:23.000 --> 17:24.000 See those examples. 17:24.000 --> 17:29.000 And then the other link that's on here is the doc sea tutorial that's I believe on like the Swift package index. 17:29.000 --> 17:34.000 So you can also like walk through it step by step of all the steps that we kind of went through here. 17:34.000 --> 17:36.000 So that's it. Thank you. 17:36.000 --> 17:38.000 Thank you. 17:42.000 --> 17:43.000 Amazing. 17:43.000 --> 17:44.000 You're part of it. 17:44.000 --> 17:45.000 Yeah. 17:45.000 --> 17:48.000 Can you tell us about the latency for the first call? 17:48.000 --> 17:50.000 You don't think you've set on this one. 17:50.000 --> 17:51.000 Yes. 17:51.000 --> 17:55.000 So the latency. 17:55.000 --> 17:56.000 Yeah. 17:56.000 --> 17:58.000 The latency. 17:58.000 --> 17:59.000 Yeah. 18:00.000 --> 18:01.000 The latency. 18:01.000 --> 18:06.000 I have seen it not be too bad between like the very first call and then subsequent calls. 18:06.000 --> 18:09.000 Because they are running on whether they're called Amazon. 18:09.000 --> 18:13.000 Fire via something like it's like a lightweight version of a VM. 18:13.000 --> 18:16.000 So it's not the entire virtual machine running. 18:16.000 --> 18:19.000 But it's like a smaller kind of box from that. 18:19.000 --> 18:20.000 I can't remember the name of it right now. 18:20.000 --> 18:23.000 But because of that, the latency is lower. 18:23.000 --> 18:26.000 I don't know the exact number of it, but it's not too terrible. 18:26.000 --> 18:32.000 We can also see because it's just deployed. 18:32.000 --> 18:34.000 Like that. Then we get beer again. 18:34.000 --> 18:36.000 So that's obvious answer. 18:36.000 --> 18:40.000 So I have to go, but thank you again to everybody. 18:40.000 --> 18:42.000 Amazing. 18:42.000 --> 18:44.000 As always. 18:44.000 --> 18:48.000 One of my favorite members of the community with the most infectious personality. 18:48.000 --> 18:52.000 And the best part about Michaela is her willingness and even 18:52.000 --> 18:54.000 this to learn in public. 18:54.000 --> 18:56.000 And make it amazing. 18:56.000 --> 18:58.000 So that's it.