I got a t-shirt on how strong could these mark two versions be other than the fact that we've Already seen he's imparted nothing about marks, bro These guys are leveled up. Oh and instead of the orange ugly ball, bro This is what I meant by ten times more handsome. They just went Machia. Oh, look at him All right, I happen to be getting jumped response.  Don't run.  I'm trying bro.  I could use it also wait, bro I got it. I got to do this in my video to comments Who's dying first not me you guys have some time to guess I'll tell you right now The odds went down right now. I put instant transmission on just for this combo Never mind.  I can do some help. This is probably one of my favorite ultimate I can use some help.  I currently want to see him die now. No, I don't do that Don't do me like that, bro.  You'll fight me. Oh your ball help help. I try to get there in time I tried that tag was so problematic. God damn. Leave me alone.  I was gonna grab him. He really is my imposter.  This is why I was trying to go beast. Why am I fighting Dion? I don't know, but I'm killing you.  I Was like was that did he record that? Was that a recorded line get over here. Deon. Where you going?  I can tell he doesn't train Bro, he trains Mondays Thursdays and Fridays.   Oh, yeah, I never finished. Oh man meteor combination is the Oh, great. Oh brother.  I don't know he grip my forehead, man What's that? I'm so pissed. These imposters are whatever, but they just keep disrespecting me. Oh god. Please tell me you got them Honestly, we might win this first try Is this gonna be the shortest way video of all time?  I did not give them the best moves because you got simps and floors not actually a monitor Oops, it's not about oh, don't get about that.  Is he coming for me? Come here, bro. Where you going, bro? You're like that.  I come on bro. Help out We can finish this evil right now right now That was sick, bro. That's because we're teammates bro. We help you win those classes We can die in two seconds. So please be careful anyway audience now We all get now all the mark to uh robots have uh, let me ask you on rng. What do you mean? All right, let's just He means like just stand here and see who gets a cut. How many rocks can you like rotate around us? That's what I want to wait. Have it. Have any of us died yet? No, we have not So this is going to determine who in the comments was right about who died Yeah, ain't gonna be me this this rg right now and you guys you guys aren't gonna shield, right? It's not me For bro, well, what do you mean death? It's death. My answer is death bro.  Hold on. Let let macchiato cook Put some respect on here bro. That's not you Yeah, but I he's still he still needs that respect Oh Yeah, you can react to the the haka you can't react to my guys I'm dodging it. I'm dodging it. I am beating reacts. I'm beating I don't want to turn into a cookie. I don't want to turn into a cookie Okay I keep telling myself to turn into a cookie. I got us bro. I got us Well, thank god. I've walked this first half of the combo Castle I got him. I got him. I got myself Oh, that's not good. Yes. I ran that big ball and nothing to do with that You are so fast. I got serious on green. Hold on. Then we're just jumping him. I'm just jumping him then I'm waiting. I'm waiting. Oh Bro, the rhyme is not paying attention to me and he's trying to haka you guys randomly So just please be on the lookout. Don't worry. Don't worry. Don't worry. Don't worry.  Hello? I can't do anything about that dog. I'll give myself up. I'll give myself up. Is there any heels? Maybe where's the odd imposter? Deon you will not live.  Fine. Fine. Fine. Fine. Fine. I'll do sank It's not fine All right, that's good I'm back. Deon's gonna. He's down to two bars. Why do I not work? Hello? No, no, no. I'm getting drunk. Watch out. Watch out. I'm getting drunk. I'm getting drunk. I'm getting drunk. I'm getting drunk. There's too many. There's too many. There's too many. I'm just gonna base it on you, bro. Help. You know what?  No, you survive. You survive. You don't die. You don't die. I do. I do. I do. I do. I do. I do. Please. Thank you. All right, bro. All right. Deon, I'll see you in the battle. I'm still getting drunk. I'm still getting drunk.  Why? Don't lose. Don't lose. This is the best one we've ever had. Bro, this is all three. It's all three. It's all three on me. No. Bye, guys. I can't even stop that. I can't even stop that. There's nothing I can do. Hold on. Hold on. Let me charge my key. Let me charge my key. Goodbye, Deon. Can't wait to reopen the game. Is Deon dead? No. Yes. And he died to him. The worst possible outcome. The worst future. Hold on. Hold on. Hold on. Get Deon off of me. I got you. I got you. I got you. He's got either. He's crazy. Leave me alone. The pixels on my screen. It's kind of fun. No. I'm getting punched. No. I'm dead.  Oh, you're already dead, Deon. Yeah, I'm dead. I'm just down here on the ground with a broken nose though. I thought the impostered dota was you. Can I just say we did really well. I know. We had a good shot of winning that. Syriac was one ult away from dying. I think we should just run that back. A 10-2. We might win that. I gotta close the game. We'll be back soon. Oh, died to impostered Deon. He resets the whole game. I know. So annoying. Now we're back, baby. At 10-2. I know anyone who holds me back, bro. I'm going to try to. Never mind. But I will. Now let's form full power. Bro, it used to be, it used to be that we just, it used to be that we just got a shot, bro. We just got a chance to fight somebody one-on-one. And now we don't give him that respect. That's sick. Oh, brother. I am so sick. I'm getting hit by evasive. And I'm getting punched. And I'm depressed. And I'm sad. Oh, oh, oh, why am I super guarding? Why am I super guarding? Let me roll. And all three are locked on to me. I'll take a bar of health. Charge? Almost. Can you attack? Yeah, please.  I literally have just been beating Machiado down. He does not care. It's close attack. There we go. Now they're not locked on me. Up my game crashed. Up my game crashed. Game crashed. Don't say that to me. Yep, game crashed. I was cooking. Yeah, game crushed. The computer shut down. The game crashed. Oh, we're back a third time. My neck is cracked.  If they're not going to fight me, I'm just going to go beast. I am transformed. Why are you guys in front of me? Yeah, that's what happens. Oh, that's them, bro. Come here, fake me. Get punched. Honestly, I'm just going to take full key. Let's go. Hey, hey, bottom me, bro. Come here.  Yeah, where did bottom me think you were? I've never fought evasive in my role. Who's idea was that? I've never used that evasive in my entire life. What evasive? What evasive? It's the go takes one where he like yells. Never jump to me again because you're loud.  What do you mean by that? What do you mean by that?  Yeah, I'm doing that. Whoa, whoa. He's showboating on me. He perfect guarded me that started charging. No respect. High speed motion. High speed motion. Not the high speed mode. Hey, hey, hey. Pelvic thrust. Pelvic thrust. This guy thinks he's cool. We finished our fluid. Finish the fluid. All right, bro. Good thing Dada kept on mistraining. They're taking too long. We had a bad time to help them. It's a little risky, bro. The chances of dying are never not zero. I'm not good. Finish your food, Dada. All right. Bye-bye. There you go. His arm's broken. Nice. All you did was knock the screws loose, bro. Instantaneous cutscenes, man. I can't get no time to charge. You don't need it.  Why are we just not doing evasive? Cool. Cool. I lost half my health. That's crazy. Yeah, but then it is also, isn't it? I'm just going to give us a regen. How many times do I have to teach you this lesson?  If it cut out my regen, I did not mean to use that energy castle. You want to get your guy? You want to get your guy out of me? Yes, I do. That'd be sick. Why do you just feel like that'd be sick? SpongeBob, can you cover me at work today? That would be sick. SpongeBob. Sorry. I was at the clam last night and getting lint. Squidward, you're not supposed to get lint. Not on a work day. I'm not on a work day. I'm better than you. I'm better than you. Bye-bye. Oh, he's lying now. Oh, so we're just lying now. Back it again. Why do they all have unique combos? You didn't notice that? They all have unique combos. They all got something, bro. I usually been getting in this to kill, so. Does that mean that we could have unique combos, but Xenoverse just said not to? Yes. Yes. Give me the stamina. I keep going for this, and I keep paying the price. Finish my food. Oh, yeah, I got it. Yo. That's it. He's going to get killed. Watch it. I've seen somebody proud of it. Impostor reacts on the loose. There you go. On the loose.  Don't ask no help when he locks off of me. I'm dying. He's going to lock on to anybody on site. I'm finishing it. I'm finishing it.   Bro, finish your food. He's just straight up not a fan of you, man. And why am I getting sea bear circles here? Does anybody know where Rhyme's body is? I kind of want to sneak him when he gets up. I'm going to wait right here. Oh, no, they spawned. They spawned. Yeah. Nah, I don't believe it, bro.  Are you? Really? Oh, they did despawn. I hope he's just going to spawn right here. Really? Really? Really? Actually, I think he spawns where Dotto's standing. Damn, who threw these rocks at me, man? Yeah, watch this. Watch him. He's going to die from a distance over here. Watch this. Who threw these rocks at me? Watch this. I hope. I hope. Because if he don't, we will. Nah, he surely will come after us. Damn, he spawned all the way over there.  This is where he's really spawning.  I got him. I got him. I got him. I kind of got him. You want him or should I get him, Dotto? I got me.  Hey, fighting gets you all wrong. Your ego around here, and it's not him. I guess I'll go after him. I guess I'll go after him. I'm getting jumped. You're fine, bro. You're fine. There's a cutscene. I'm still getting jumped. It's too good. It'd be funny if you could get jumped like during the cutscene. Yeah, really funny stuff. Hey, fellas. Oh, hey, fellas. Damn! I don't even know who's who anymore. All right. Hey, Dotto's got him.  I didn't get up, but... Oh, what? Okay, I'm going to get up. Why was that one shot? I love getting jumped. I love this. Oh, dear God. I love this for me. Bro, why was that? Why? That was a super attack. Why is that an instant kill?  I guess I'm fighting Ultra and Stink. What? Dotto, I got you, bro. I got you, bro. He's a region. I'm fighting Ultra and Stink. He's dead. He's dead.  Dotto just jumps. He's annoying.  There you go. I'm getting snuck. Come here. How did he go? I don't know, but we can do this. For Dotto. For Dotto.  Oh my God. This is crazy. All right. We still gotta re-jangle. Bye. Bye, Dino. Good luck. No, no, no, no, no, no. I got you. I got you. I got you. Why are you? Why are you? Why are you? Why are you? Why are you? Why are you? Where are you? Oh no. I'm at full health. I can survive. I can survive. I got a mass circle. Oh my God. He's meshed like a ghost. You know, you know the only way we could win is if you would have had Parapara dance, but no, you decided to lose. Bro, we're not losing this time. We'll do it with whatever we can. Also, I threw on Kaio-ken and bending Kamehameha, because I'm that guy now. And it went backwards. Bend it backwards. I wish Dotto played Xenover, so he knew the worst attacks. Kaio-ken Kamehameha is going to look cool, I bet. It is instant, but always start by jumping me. It's always 10 seconds of them jumping me. Why is he using the go-takes evasive? You would never use that. Yeah, I also have that comment. Oh, damn, damn.  How about that? Come here, Dino. Come here, me. Dave, would you stop me? Oh, bend it.  I'm not my imposter. Please, he can't hurt you right now. Bro, I keep getting snucked.  Rage stage. I just keep getting snucked by Dotto's attack. This is the third recording of this. For those at home.  This is the last one. And I'm starting to get pissed. It's always the most challenging because by then we're just tuckered out. Not tuckered out, bro.  He thinks he's better than me. Every time we die, Dio has to back out and reset it. No, I'm not. I think I have it the worst because of that.  Who's locking on to me? Oh, I thought this was just Dion. Oh, why are you screaming at me? Let me handle him. All right. I'm going to pop a regen because I'm kind of hurt. I appreciate it. I kind of throw away anyone who holds me back. I'm going to let that happen. What in the hit attack do you just do on me? You got him, bro. I'm just banned. I've been to come out to predict myself. Staying. I'm going to stay next to my trophy.  He disappeared. Well, because he got up to Dino's stance. Yeah, I'm going to use that. Oh, he's next to me. Been to coming out from downtown, baby. For a bit of chip damage. You actually did sneak him. You did sneak him. I did, bro, because I can bend it, bro. Like Beckham himself. Come here, bro. He can't hit me. Get him, Sam. Bro, I've dropped. I've dropped the coming on each one of you guys so far. Get Carmel Frappuccino right now. The worst possible way to exit the cutscene. He's not Frappuccino, bro. He's locking up. Bro is Frappuccino. Bro is Moco. Goddamn, bro. Moco is a good name, too. Why is he not hitting him? Where's me? Where's me? Where's me? I'm tired. He snuck me. I'm about to sneak him back. Come here, bro. Bro, he's sneaking me right now. He's going to get snucked. I'm paying the ultimate price for this. Let's go. Let's go. Juggle these hands. Juggle these hands. Juggle these hands.  I love unblockable moves. I love unavailable moves. You're trying to exhilarating spirit. Me, bro? Come here, bro. Let's go. I'm teasing him. I'm getting jumped by Dotto. Why are you teasing Dotto? I was teasing me, but then things changed. I'm dead. I'm dead. I'm dead. I'm dead. I'm dead. No, I'm not going to look dead. I'm little dead. I'm little dead. Yeah, you're literally dead. Yeah, no. I'm glad you were teasing me because I'm dead now. Bro, you're back up, aren't you? No, we know it bugged. It bugged. Oh, no way. Oh, no, it worked. That was weird. I told you, bro. I told you. Regent, Regent, Regent. All three locked on, and you locked that for me. I got it. I got it. I got it. Deion, they might be locked onto you, but just remember that only for a second. Oh. Dad, that one second. Oh, my God. Resulted in me getting an insta kill.   Yeah, he's mad.  I'm tired.   That's exactly how I feel, too. All right, I killed me. I killed me.  I would appreciate it. You know what? I'm gonna have to bust out the Kayoken Kamenya. Oh, my God. The damage was crazy. Oh, my God. Ah, that one, not so much. All right, bro. Oh, not a help. Not a help. Not a help. I'm sorry. I'm sorry. I'm sorry. It's on the way. It's on the way. It's on the way. Goddamn, bro. Oh, my God. Oh, my God.  I'm dead. I'm dead.  You guys still need help. I can snipe him from here a little bit. I'm not always just doing this thing. He's just sniping. I'm just sniping him. Get off of him.  Bend me backwards. Damn. Bye again. I missed. Key Blast. Just keep us going. Hit him slowly. I said, just keep us going. Oh, how did he risk me here?  Here it comes. Here it comes. Here it comes.  But keep us. Thank you, bro. I appreciate the help. Now it's not done. All right, now I actually want to win, bro. I actually want to use my transport. During the window where he can hook me. We're like, it's like the Avengers scene. Damn. I should have tried to snipe where he was going to be again. I love how you only hook high to my video, but he doesn't do it to anybody in the intro here. Yeah. No, that was wild. What he was doing in your video. I actually thought that that was guaranteed at first. Yeah. Locked on me. Frame one. Love that for me. Nah, I got the smoke on him immediately, bro. You take him, Dotto. You can take him, Dotto. Oh, I'm taking him down. What do you want? Do you want him or are you on me? Bro, I'll take me. No, no, I want yours actually, bro. Lord August Dotto. No. Can't see. It's too late. He's gone. Well, he's gone. All right. Dotto, we'll carry this video like we did in your rage video. Yeah, yeah, yeah. Don't worry. I'll take me out. You can't stop me. Spirit. Yeah, I'm way too fast. Dotto's watching us from a race zone, whatever. Whatever the chalk zone he's in right now. Dotto's got the chalk, the chalk, the chalk zone. Dotto's got the chalk, the chalk, the chalk zone. Imposta, Dotto just Dino's dancing next to me.  I'm finally going to fight. Why did he grab me at that?  He actually snuck. You know what? I'm going to say it.  How about that? How about that? How about that? How about that? Who's that? Oh, no, no, no, no, no. Dab, dab, dab, dab, dab. Yeah, but dab and do. All right. I see you got cooked. Not me though. Never me. Let me show you guys why they call me the Xenoverse God.    The fuck? Bink? Binky?   Here's your binky. Stop side stepping, dab. What's up? What's up, shit? I hear no bell. You kind of spin. Because I hear no bell either. Crunch, crunch, crunch. And they go, yeah. Yeah, no bell. Yeah, yeah. I heard no bell. They're going to give me the no bell peace prize once I put you bitches down. Come back at me.  I think, I think I'm that guy. Trunks, Bulma, I do this for you. Could never do this. If real, you can't do this, then neither can imposter you. Am imposter, you're kind of doing it to me though. But I got super armor because my ego is ultra.  Let me show you what I'm truly capable of. Yeah.  But that's fine because I'm guarding with the super. Wait, I should let my stamina break first. Sorry, guys, but you lose. Yep, sorry, guys, but you lose. I'm just a little better. I understand Xenoverse AI. All I got to do is go up and down. Up, down, touch the ground. It's over for you now. It's over for you now. Yep, sorry, sorry. We don't get that funny. We don't get that funny. We don't get that funny. Shit, where I died. It's not going to happen. Hey, you're in green health. Is that green health life? Nigga to stay out of this? Yeah, no funny endings. Sorry, sorry, partner. No funny ending. No funny ending. I just win. I just win. I just win, and I beat the allegations of sucking. Yeah, I'm better. I'm better. I'm better. I'm better. I'm at least taking you out. At least taking you out. I'm at least taking you out. I'm at least taking you out. You're gone. You're gone.  I'm over here. Sorry partner. Oh Yeah, sweet didn't you now as long as they don't jump in the way You're done you're done you're done Divine no I'm in vulnerable and so that It's over probably we lost I don't think we're ever beating them. I hope I but hey good job And that was like a long last stand. I hope


OK, so we're going to continue our discussion of orthographic projection of points, lines, and planes. But we're going to talk about a different kind of shape or a different kind of line here. We're going to get a little more complicated by considering a curve, throwing you a curve ball if I didn't did it. All right, so we're going to take a curve and notice that if we have something that's sort of curved, a curved line, all right, that when we rotate it, if we rotate it in the right set, you can actually get it to the point that you can no longer even notice the curve. If you look at it from a particular angle, if the curve is flat in one plane, it will eventually flatten out and become a line. And in fact, if we rotate it again another 90 degrees, you'll still see a line. So it's possible that something that's curved may only look like a line from some other perspectives. You notice that's very true if we have something like a cup. Here I have a cup that I'm holding all my pencils in, okay? Notice if we look at the top of the cup, we have a round curve, but if we turn and look at it from the side of the cup, the curve disappears into a line and from just that perspective, you don't necessarily know that it's a curve without additional information. So let's see how we can represent a curve in our orthographic space. How do we go about taking information about a curve and translating it into three pictures? Well, it's not gonna be much different than a segment. In fact, the first thing we're gonna do here is exactly what we do for a segment. We're going to note the end points of the curve and we're gonna treat them exactly the same way. So I wanna go ahead and recreate this curve on the right side. So to do so, I'm going to take point one. Notice that it lines up with point one in my top view. Create my miter line so that I can move horizontally from point one in the front view, horizontally from point one in the plan. When we hit the miter line, we drop straight down and find a location for point one on the right side. Here's a location for point one on the right side. Do the same thing for point two. We'll notice that point two has a common X coordinate that we'll connect vertically here. We'll define the Z coordinate by coming straight across from there, and then we'll define the Y coordinate by coming across from the plan view, hitting the miter line, and dropping down to finish our box. And the location where they meet is point two. Now, the question is, how do we connect point one and point two? Because in the front view, they connect with a straight line. In the top view, they connect with the curve. Do I use a curve here, or do I use a straight line? What does it look like? Well, this is where it gets a little more complex, but what we're gonna do is we're gonna need to sort of make a point in the middle. We can pick any point along the curve. In fact, I'm gonna pick a point right here that's about two thirds of the way between point one and point two, okay? And by simply picking that point on the curve, I can figure out by going straight up what all three coordinates it has are, okay? It has a point right here. Notice this point seems to be in the middle of that curve, but it's about two thirds of the way over from the side. Does that make sense? Let's take a look. If I'm looking at something that's curved and I grab it right here in the middle, okay, so that it's halfway between, sort of halfway around the curve, and then I rotate it up for you to look at it, you'll notice there's a lot more, about two thirds of the curve is here and there's less of it on the part that's coming to you because it's basically turning and going vertical. So that does make some sense. So let's continue with this intermediate point we have here. It has one point here on the curve. It has one point here on the line. They have matched X coordinates. Let's find the Z coordinate, which is still on this same line as everything else, and let's find the Y coordinate, which if we move along here, we find a bouncing point, we bounce down here, and it turns out it ends up on that straight line between one and two. Well, I could do another one just to check, but it seems pretty clear to me that everything's going to end up on this line, so there is what our curve looks like from the side. Let's see if we can repeat that process. Go to another page here, page four, four. Okay, repeat that process for another curve, okay? And this one's a little bit easier. We don't have to use the miter line because we're making a front projection, but let's see how we do that. We'll start with point one. Establish our Z axis by coming horizontally from point one. Establish our X coordinate by coming vertically from point one in the plan view, and fill it in, there's point one, okay? And we'll do the same thing for point two. Establish the Z coordinate. Establish the X coordinate. There's where point two meets point two. However, we don't know what the curve looks like. Is it a line? Is it a curve? Before it ended up being a line, let's see if we can verify it. I pick any point along my curve. Let's do what we did last time. Let's go ahead and pick this point that's right. Let's, well, actually, let's pick a point right here in the middle of the curve. I'll pick this point here, some intermediate point between one and two. We could call it one and a half. If I drop straight down from one and a half, okay? Drop straight down from one and a half. Well, that establishes where the X position is, but I don't know where the Y position is. Looks like I might need my miter line after all, okay? But here's what's important. I can't just draw any miter line. I've gotta make sure my miter line is lined up. When I don't have something, I can draw the miter line where I would like. But now there is a miter line. It's definitely defined by these two things. So I gotta make sure that my miter line matches with my previous part. So I'm gonna go up from point two and over from point two, up from point one and over from point one to make sure that these meet, okay, and make sure my miter line runs between those two points because I could accidentally put my miter line shifted over someplace and that would mess things up. Okay, but notice that completes the box there. So now with my green intermediate point, I can come straight across. It appears to be, actually, it's a little bit below that point there. So I'm gonna come just a little below that line till it hits my miter line and then come straight down. Here we go and it seems to hit it right there on the, or maybe a little bit off, but on the one third point or so, okay? Well notice if I line those up, it's not real prominent here, but if we look carefully, you can see that that point on the front is just a little bit off. It's not directly between one and two. It's a little bit off of the curve, okay? So I would need to do my best to run my curve through that point. If I wanted more accuracy, I could pick more intermediate points and see where they reflect, but you see there's a very minor curve associated with this piece. Does that make sense? Well, let's see if we can take a look at it, okay? If you're looking at a plan view of something curved, so here's my curved piece, but I'm going to recognize that the side view has the top up a little bit higher. So here's the plan view that you see. If I rotate it 90 degrees, oops, I actually did it the wrong way. It's gonna be rotated this way. Here's the plan view that you see. If I rotate it 90 degrees so you can see the side, you'll see there's the angle. Now, trust me that I'm rotating at the right amount. And then if I rotate it so that you're seeing the front, you'll notice that there is, oops, too far, I did too far. You'll notice there is just a little bit of a curve. There's some, it's a combination of that diagonal view that we saw and the curve view that you saw from the top. So hopefully from that, you can see how you can approximate curves or get a sense for how to draw curves as long as you know the end points and have some sense for the curve and at least one of the view points.


Hi everyone, Sean with jaspyscasebrakes.com here doing 2020 Optic Football One Box Blaster Break. Random team number 199 to give away six spots in the multi-year football mixer. Hopefully we can pull it off tonight. All up to you guys. So 32 spots in the break, everyone gets a random team in the NFL, a NoVet common ship in the blaster. At the end of the break, we'll take all 32 customers' names, randomize them, and the top six names each win a spot in the multi-year football mixer. There you go guys. Here is everybody that bought in. Thanks for everybody getting in and good luck. From Bo Rinder, Goddard down to Sean Hughes with last spot, Modo times four. And the teams from the Cardinals, down to the Washington football team. First on the blaster break, then we'll do another dice roll and re-randomize the names from the original list. And top six will win spots in the break. Good luck. Dice roll for the break itself, four out of three, seven times. I like seven. That's a good number. That's good, man. I'm glad to hear you were good as well. Joe down to Monty. Joe, let's get you on top next time as well on the next randomizer. And seven times on the teams. And Dolphins down to the Jets. Seven times. There you go. So no trade window on this. We're not going to read through the full list, but there's a lot of potential highlights since this is 2020 rookie class. Right on top, Joe with the Dolphins and Tua Tagawa Loa options. Right under him, Scott Quinlan with the Packers and Jordan Love. You've got, let's see, where are the rest of our quarterback buddies? Cincinnati Bengals, Sean Hughes there, Joe Burrow opportunities for you. Justin Jefferson and the Vikings for Scott Quinlan. Eagles, Jalen Hertz, Bo Rinder Goddard and Chargers, my favorite. Justin Herbert, Sean Hughes and the Chargers. There you go. Got my card from Personal Break, that Griffey card from Spectra's beautiful card.  You get to turn it in the light and it reflects. That is a really cool looking card. I want to print first. We'll print that out. Yeah, it's a really nice insert. Short print, case hit, whatever it may be. Very cool looking. Here's our blaster. But congrats again, man, and thanks for getting in on that. Give me the opportunity to pull that for you. I think I got eyelash in my eye or something. After the break, I'll have to go flush it out. Damn, beautiful eyelashes. Easton Stick is still with the Chargers. He is a backup for good reason, obviously, with Justin Herbert. But I like the guy. And in all honesty, man, I really think that if he gets an opportunity to play, hopefully not for the Chargers, because if he's playing for the Chargers, that means that Herbert's hurt, I think he can do well. I'd love to see him get an opportunity for another team, but we'll see. He's a game manager, but he's very talented. You got Patrick Queen, Purple Shock for the Ravens, and Don McCrae. Joshua Kelly for my Chargers. And J.K. Dobbins Hollow for the Ravens, Don McCrae. Nice Clyde Edder-Guillere, Purple Shock for the Chiefs, Carlos Aguirre. And Jake Fromm, Rookie Phenoms for the Bills, Matthew Shira. Damon Arnett, Hollow for the Raiders, Joe Locas and Justin Herbert. There you go. Chargers, Sean Hughes. Daryl Taylor for the Seahawks, Purple Shock, Joe Locas. And Van Jefferson, he's been great this year. That is a Hollow for the Rams and Jason Asher. So there you go. That's the one box, one blaster box break. Some good names in there. Some good color too. I liked it. So I'll sleeve up the rest of it for you. But now let's see who's going to get those six spots. Here is that customer list again. So from Bo Rinder Goddard, back down to Sean Hughes with last spot mode to times four. Top six, win spots, as it says. So, new dice roll for you. Top six after four to four, eight times on the dice. Good luck, guys. Eight in final time. Okay, so eight times on the randomizer. Top six. So from spots seven down to 32. Thank you guys very much for getting in on the break and hopefully I can do better for you in a future filler. Don, sorry, first one out, first and second one out. Hopefully we get your name up there at least once in the top six as well. But special thank you and congratulations. There you go, Don. There's at least one. Mike Nishimura, Jason Asher, Joe Locus, Sean Hughes and Sean Hughes on the top. There you go. Two of your last spot mojo spots got you in. So congrats. There is the top six. So Don, first one out, but also last one in. I know Rebel, they changed it up all today. It's crazy. So there's your top six guys. That was 2020 Optic Football One Box Blaster Break, random team number 199 from jaspyscasebreaks.com. I'm Sean, jaspyscasebreaks.com. Thanks for hanging out. We'll see you next time.


So a very good afternoon to everyone who is present here and to those who are watching us on YouTube, hey mom and dad, this will make them a little happy. So today's breakout session, I will be talking about an advancement in the field of browser automation testing. And this is something which has been a part of my work since the past one year. So before we begin, I would like to give you a short introduction about myself. My name is Thamsil Sajid Amani and I work as a software engineer at BrowserStack. The main projects which I have worked on include the Selenium WebDriver. And some of my notable works include implementing the Virtual Authenticator and WebDriver Bydi in Selenium. And I am also a member of the Selenium's Commuters team, which means that I have access to review and merge the community's contributions. So let's start with the big question. Let me ask you like if you have ever been in this field of browser automation testing or if you have met someone who is in this field, so it is very likely that there would have come a point where the tests would be passing in some browsers and they would be failing in some others or that the tests were not able to handle events in real time. Now this is a very common problem which many of us face and in today's talk, we will try to find a solution to this problem. So I will take you to the history of browser automation testing and then we will check out the present tools and frameworks which are available to us to do the automation testing. And lastly, we will take a leap in the future and see what WebDriver Bydi has got to offer us. So it wasn't until the 1993 that the web came in 1993, all right? But it wasn't until 2004 that people thought about automation testing and with that came the Selenium project. Now in 2006, a person named Simon Stewart, he came up with a different approach of automation testing and it was called the WebDriver. Now these two projects, they merged in 2011 and it was called Selenium WebDriver. And this Selenium WebDriver, due to its popularity, was adopted in 2018 as a standard by the W3C, that is the World Wide Web Consortium and it came to be known as the WebDriver Classic Protocol. Now while this advancement was happening, other advancements too were taking place simultaneously. So in 2009, we got the Node.js and with that, there was an increase in the demand for automation tools based on Node.js. So with time, we got many automation tools such as WebDriver, IO, APM, Nightwatch, Cypress, Testcafe and Puppeteer. Now these testing tools can be categorized into three sets based on the underlying technology they used for the automation testing. So tools such as the WebDriver, IO, APM, Nightwatch, they used the WebDriver Classic Protocol, which I just told you above. Tools such as Cypress and Testcafe, they used Web APIs and Node.js to do the same thing and Puppeteer uses Chrome DevTools protocol. Now in the context when we talk about browser automation, there are two approaches. One is high level and the other is low level. So in high level concept, what we do is the tools, the automation tools, it injects a JavaScript within the browser and perform tests from that script. Now because of this, the automation tool is bound by the sandbox which is created by the JavaScript code. Now this approach has a drawback. What is the drawback? The security issue. We know that browsers are very picky and very cautious. So they do not trust any event which is coming out from a script. Hence, if you want to perform certain complex functions during your testing, like if you want to open a new tab or a new window or you want to test within iframes, the browser will not let you do that because it does not trust you enough and it won't let you move out of the sandbox which is created by the JavaScript code. So how are you going to overcome this problem? So for that, we come to the low level approach. In this approach, we execute the remote commands from outside the browser. So what this does is it adds the events directly in the event loop of the browser and the browser allows it. Why? Because the browser trusts it because it thinks that these events are generated by a user, that is the remote commands are being sent from outside the browser. But now you will ask how is the browser differentiating, like which event should it trust, which event should it not. So for that, the developers at Mozilla have defined a property of an event which is called the isTrusted property. So the isTrusted property is true when the event is generated by a user action and it is false when it is generated or created by a script. So by reading this property, the browser knows which events it has to trust and which events it should not. So as I said earlier, Cypress and TestCafit use or leverage the web APIs and NodeJS to bring about the automation testing at the high level approach. And at the low level approach, we have got two subsets, one set of the tools which use the web driver classic protocol and the other set which uses the CDP or Chrome Dev Tools protocol. So I will take your focus to these two protocols as they might help us find a solution to the original big problem which I asked you. So how does the web driver classic work? We have our automation tools and we have our browser drivers. So the automation tools will issue the commands to the browser drivers via HTTP request. Now this is an important point of focus. The connection between them is through HTTP request. And the browser drivers in turn will control the browsers. And now what are these browser drivers? These browser drivers are binaries which the browser vendors maintain for their respective browsers. For example, Google will maintain the Google Chrome driver for Google Chrome, Mozilla will maintain the Gecko driver for Mozilla Firefox and so on. Okay, time to see the web driver classic in action. So in this demo, we will navigate to a page BStackDemo.com and we will click on the add to cart button for our product iPhone 12. Let's see how we can achieve this with Selenium. So we navigate it to our website and click the add to cart button for iPhone 12. The Selenium code for the previous demo is shown here.  So before that, I am putting some options such as I want what window size I want when the browser fires up. And then I am creating an instance of the driver, which will use the Firefox browser along with the options which I have just created. Next I am performing the three set of functions or actions. So one is I will go to my URL using the driver dot get function. Second is I will find my add to cart button. So what I'm so in the first line when I do iPhone 12 is equal to driver dot find element by ID. Here I am finding the element by using its ID one. But it is possible that under this ID one, there is not one but multiple elements. So all those elements are collected and given to iPhone 12. And in the next line, using that collection, I am again finding my add to cart button by its class name that is shelf dash item underscore underscore by dash button. And in the third step, I using the click function, I am clicking my add to cart button. So this is the simple Serenium script for the previous demo. Now these actions can be translated into HTTP request as shown here. So to navigate to the page, we used the post request followed by the URL. We got a success successful reply. Second using we are finding our iPhone 12. So again using the post request and passing the element and using the CSS selector and its ID value one, we are finding iPhone 12 and we get a successful reply. And the third part, we are going to click the element again using the post request and the element ID and we get a successful response. Now this is the best case scenario that happened. But what if I tell you that iPhone 12 is not loaded yet because there may be some prerequisites or background checks that the iPhone 12 is still yet to load. So what will happen when you will send this HTTP request? You are not getting a positive response. So this is a problem. And we have to see what HTTP, what solution HTTP has given us to counter this. So HTTP gives us the long polling solution. What happens in this case is that we establish a session normally. Then to find the product, we will send a request is our iPhone 12 loaded. No, we get a negative response is our iPhone 12 loaded. No, we get a negative response. So doing this is not very practical and in today's modern web that is web 3.0. But in earlier times when web was 2.0, this solution would have suffice, but not today. We need better solutions and HTTP polling does not cater to that. So let's see the advantages and disadvantages of web driver classic protocol. The pros is that it has the best cross browser support. Why? Because all the browser vendors have implemented it in their respective browsers. It is also a W3C standard. As I told you, it is built for testing and it is built for scalability. So by scalability, I mean that in the selenium project, there is a component called selenium grid. So you can use selenium grid with web driver classic to run tests in parallel. So you can run a sim a single test on multiple browsers at the same time. Now the disadvantage is that it is not event driven. What I mean by this is that in our previous case when I said the iPhone 12 was not loaded or still loading, there will come a point when it will load fully and it will generate an event. But there is no technique or no way to send that event back to our automation tool. Why? Because HTTP does not allow that. And the second disadvantage is that it provides only high level control. Now what is this high level control? I will tell you as we progress forward. Our next protocol is the Chrome DevTools protocol. So CDP in short, as the name suggests, this DevTools protocol is designed especially for chromium based browsers. And some tools such as Puppetier have used it for doing a browser automation testing. So the working of the CDP is such that the automation tools do not need the drivers to communicate with the browsers. So in this case, they communicate directly with the browsers. So the automation tools will issue the commands through the CDP and the connection is made on WebSocket. So the focus point here is WebSocket. Earlier in web driver classic, we had communication through HTTP request. Now the same previous example, when seen from the CDP point of view, we have the following set of commands which the automation tools will send directly to the browser. So to navigate the page, we have the command page.navigate followed by the URL. And to find the iPhone 12, we have the command runtime.evaluate passing a parameter which has ID is equal to one. And finally, to click the add to cart button, we will perform two commands. One is to press the mouse button and the other is to release the mouse button. Now the advantage here is that if you take the previous problem where our product or element, the iPhone 12 was not loaded. So after some time when it is loaded and the event is generated in that case, that event will be able to go back to the automation tool. Why? Because in this case, the connection is through WebSockets and we know that WebSockets are bidirectional. So hence in short, we can say the CDP is event driven and it is bidirectional. Now I will compare CDP with web driver classic on this point that is the level control. So what is this level of control? Okay, imagine that while building a website and testing it, there are two aspects. The first one is through the developers aspect. So a developer wants to know what is going on with his website in depth, such as he wants to know what are the console logs or errors which the website is generating or what are the network requests which are being sent. So some browsers such as Chrome have developed a tool which is called the developers tool to help the developers to debug their work. So the CDP protocol which gets its name from the developers tool keeps the focus mainly on the developers and helps them with debugging. Now we come to the second aspect of building and testing a website from the user's perspective this time. So what we want is that when a user goes to a website, he is able to click a button properly or that he is able to enter a text in the text field properly and he is not. He does not want to know the underlying functionality like he does not want to know what console logs are being generated. He does not need to know what network requests are being sent. So the web driver classic was designed in this case. It was designed to emulate the user first and not the developer. So but now as we have seen the web has moved and the developers have advanced and now they need more out of their testing. So in short the pros and cons of CDP are like this. The pros are we have it is event driven and it has bi-directional messaging because of web sockets and it provides low level control for the developers. And the disadvantage is that it is only supported by chromium based browsers and it is not a standard. It is not a W3C standard and hence there with it changes with every version of Chrome. So if your test is using puppeteer so you need to make sure that you are using a version of Chrome which is compatible with puppeteer with that specific version of puppeteer. And lastly as we have seen CDP is a bit complex. It is built for debugging and not for testing. So now at this point you have this information the advantages and disadvantages of CDP and web driver classic. Can you think of a solution to our original big problem? Anyone? Okay. Fine. So what if I tell you I take the best of both worlds? I take the advantages of CDP and I take the advantages of web driver classic and I merge them into a single protocol which I will call the web driver by die. So the web driver by die works in such a way that our automation tool can talk to any browser and any driver. The commands are issued through the web driver by die protocol and the connection is made via web sockets. Now the web driver by die is still a work in progress and it was started in 2020 by the W3C browser testing and tools working group. This work is not being done by a single party. This work is a collaboration between many partners which include the browser vendors and open source browser automation projects and companies which offer browsing automation solutions. For example, for the browser vendors we have got Google Chrome, Mozilla Firefox, Microsoft Edge and Apple Safari. And automation projects include Selenium, Nightwatch, web driver IO and companies which are offering the browser automation solutions include browser stack and source labs. So all these stakeholders they work together in harmony to bring out a simple and unified web driver solution for the testers that is easy to implement in their respective tools. So the question time, what does it take to implement the new protocol? So to implement the new protocol, we have got three stages. The first is the specification stage. Second is the verification and third is implementation. So for verification, the W3C has a dedicated web page for web driver by die where it has given the definition for the modules, the commands, events and errors for anyone who wants for any tool or party which wants to check out or implement web driver by die in their project. For verification, we have got this GitHub repository of web platform tests. Now these tests are written in Python and anyone or any partners, any tool which wants to implement by die has to pass these tests in order to successfully say that they have implemented web driver by die and the implementation progress of web driver by die for the respective browsers can be checked on this dashboard. So to get an idea fair idea, for example, the browsing context module is passing 444 times out of 440 482 in the Chrome browser and the network module is able to pass only two tests out of 16 tests in edge in Windows OS. So this dashboard gives you an overview of the current progress of driver by dies implementation in the browsers. You can check it out using the link. So I can say in short that the journey from web driver classic to web driver by die is not a future but it is currently there as there are tools which have given initial supports for web driver by die. For example, Selenium web driver IO and puppy tier. You can check out the links how to use web driver by die in the respective tools. Okay. Best part. And for the demo. So in this demo, I will navigate to the page which I have created locally. I will click on a button to raise a JavaScript exception and then I will try to catch the console error that comes on. So manually doing this, let's see what happens. So when I click the button, I got a JavaScript exception and the test says error not working. Let's try to catch this console error using Selenium with web driver by die. So in the first step, I am initializing an inspector using the log inspector module. This log inspector module in Selenium helps us to monitor the console logs and error messages which are generated in real time. In the next step using the inspector, I am trying to listen to all the JavaScript exceptions that are being raised. And once the exception comes along, I will pass it in the callback function. And in the callback function, I am assaulting for equality. That is I'm trying to check the text and type of the event or the error which I got. So if you remember earlier, we got the text as error not working and the type of the error was JavaScript. In the third step, as we did before in web driver classic, I'm using driver.get to go to my page. Using the find element, I will find the button and using the click function, I will click the button. Let's run this test and see the results. Oh, our test passed. But there was an error which was generated, right? So what we did was we caught that error in real time and asserted for equality. Now this thing was not possible in web driver classic because if you did this test using web driver classic, the exception would have been raised and the test would have failed saying that there is an uncaught exception and you can't catch it in web driver classic because HTTP does not allow you to do that. Another important thing which we can do with web driver by die is network interception. So what is network interception? Let me tell you. For example, you want to know the status of your PISA order. Your automation tool will send a get request to the URL to know the status of your PISA order. But at the browser end, you can tell the browser, hey Firefox, listen, if you get an HTTP request with a certain body, for example, in this case, you get the HTTP request with method get and the URL as defined here, then don't wait to send the actual response, but instead send a mocked response. So in this case, you will define the mocked response, which will be sent. And I'm sorry, you are not getting any dinner tonight. So network interception is useful when your tests require a response which have many prerequisites or there are many background tasks which need to be done and which are irrelevant for your test. So instead you can send a mocked response and your test can resume. Now this is my personal favorite accessibility. Oh, by the way, it is to be noted that network interception is yet to be implemented in by die as of 15 September. Now we come to accessibility. I'll explain it with a simple example. Those you are a builder and you are constructing a building of 10 stories and being a good builder, you want that every individual, including those with disabilities also are able to access all the floors, all the 10 floors of your building easily. So instead of so along with providing staircase in the building, you will also provide it with elevators and ramps so that people with disabilities can use it to access all the floors. The same thing happens when a developer builds a website or a web app. He wants that anyone or any person who visits his website is able to go through it or interact with it easily, even if it includes people with certain weakness. For example, a week cited for a week cited person that text on the website should be able to increase or decrease in size based upon his preference or that some people prefer screen reader, a tool which converts the text to speech or the use of alternative texts for images to give more meaningful sentence to the images. For example, if you are enabling the screen reader and it comes and it comes to a picture which is without an alternative text. So the screen reader will blurt out something like IMG underscore 584792.png, which is like meaningless for the user, right? But instead, if you use alternative texts such as cute cat, it will be much more meaningful for the user. So these are some examples of accessibility in a building a website. So the question arises, how is web driver by die going to help in accessibility? Now to include accessibility in your website, the accessibility APIs such as the screen reader, they need access to something which is called the accessibility tree. This accessibility tree is defined from the DOM model itself, but it differs from it such that the DOM focuses more on the structure and layout of the elements while the accessibility tree focuses more on the semantic meaning. So knowing that how are you going to obtain this accessibility tree from the browser? Any guess that was easy one. Of course, your new friend web driver by die will help you with that. So the good news is that the talks have already started for implementing the accessibility module in by die. This issue was created on June 6 and you can visit the link to get more insights and please comment your thoughts on it. And also so that's how we saw how low level control can be performed with web driver by die. I showed you how we verified uncut exceptions, how we could perform network interception, how we can use accessibility in our test. And also there are other things such as mocking geo locations, which you can check out on the roadmap and a small but important point which I want to tell you is that the web driver interoperates with web driver classic. Now what this means is that in the earlier example where I have used the log inspector, if you will see that there wasn't much code change which I did, the driver was set up in the same way as in the web driver classic. The way we navigated to the web page was done in the same way and the way we clicked it was also using the click function, which was there in the web driver classic. So the only addition we did was using the log inspector module. So this is how easy it is for the developers in the present time to use web driver by die. There is no complex code change required. And you can start using it in your test from today. Another thing is the web driver classic is going to be reworked to sit on top of by die. What I mean by this is that earlier when I showed you the navigate examples like when we were navigating to the web page or when we were clicking using the click function. So these functions under the hood were using web driver classic. But now we will use by die under the hood. But one thing remains constant on the front and the code will not change for the user. He does not have to change his code for him for using web driver by die. That is on our part, we will change it under the hood. So that was web driver by die for you and open even driven cross browser and built for testing protocol for the latest progress. You can check out the link. And I like to say it's about improving the developer experience because that will improve the user experience, which will make the web a much better place for all humanity. Now if your situation is like that, please don't hesitate to ask any questions. No questions. You can ask later also. No problem. Okay. Thank you. Thank you. Thank you. Thank you. Thank you. Thank you. Thank you very much. Thank you.