00:49 < bridge> is there currently any way to get the client to load a demo file from a server? im wondering if loading a evil demo file would be a attack surfires worth looking into 01:11 < bridge> no there is not 01:21 < bridge> mods often open demo files 01:21 < bridge> wdym? 01:21 < bridge> also how do i build the tools? 01:21 < bridge> wait nvm they automaticly build 01:21 < bridge> in # 01:21 < bridge> ? 01:22 < bridge> whats #? 01:23 < bridge> sorry my internet has died for some reason 01:23 < bridge> in #✉-create-a-ticket 01:23 < bridge> if someones blocking u might upload a demo to prove it 01:48 < bridge> why client doesnt keep the number of players but always loops max_clients instead? 01:52 < bridge> ah ok good to know 01:52 < bridge> The players are usually held in an array that uses client ids as indecies 01:53 < bridge> The highest used id does not always match the player count 01:53 < bridge> It would require new data structures 01:58 < bridge> counting players from m_apPlayerInfos? 02:00 < bridge> I don’t know client code to well I am more a server dev 02:00 < bridge> But I am pretty sure it has the same max clients arrays 02:01 < bridge> Not sure what you mean with this 02:02 < bridge> so if client receives all player infos every snap, why not count players and loop it instead of max clients 02:03 < bridge> Could you link the code? 02:04 < bridge> nvm i forgot its not sorted 02:04 < bridge> but these are 02:04 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347012010034069604/image.png?ex=67ca4631&is=67c8f4b1&hm=5a3437e9ca3a57f7c0401b2b6247343de7143cd90ef070827b6b113f93c68b5e& 02:05 < bridge> yea that’s what I mean with the data structures. It’s mostly arrays where the elements are spread across the array and do not fill up the beginning or the end 02:05 < bridge> Depending on how players reconnect 02:06 < bridge> Yea the sorted ones could exit the loop early I suppose 02:07 < bridge> There might be room for improvement not sure. I wouldn’t be surprised. We do other things that are way more expensive than 128 continue checks I assume 02:09 < bridge> Question is is keeping count even worth it. It’s a code complexity vs runtime trade off. 02:15 < bridge> i had to add it so it updates the player count for this 02:15 < bridge> it should be simple to implement elsewhere 02:21 < bridge> ummmmm lol 200% 02:21 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347016202723266600/image.png?ex=67ca4a19&is=67c8f899&hm=b73cc604f21acfa72e90486281aa2ec24a7c8baa316268d5c831a71f250ed3f5& 02:22 < bridge> 500% 02:22 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347016400111141027/image.png?ex=67ca4a48&is=67c8f8c8&hm=117fe4a6b9204a581364765a1d6d8631d03adc9f6baeb89688289fe0c3f2ece6& 02:22 < bridge> and counting 02:22 < bridge> ok it stoped 04:23 < bridge> i like it 07:01 < bridge> What's your plan with sending invites? 07:01 < bridge> 07:01 < bridge> Is that some new discord feature? 07:02 < bridge> it was a feature already in discord 07:02 < bridge> no one ever uses it tho 09:01 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347116953701187665/image-76.png?ex=67caa7ed&is=67c9566d&hm=32d77692b2b9e8f89870c95f8c2fd0f6345b74413a25e6d1eb134887c93ba9e7& 09:12 < bridge> C:\Program Files\JetBrains\CLion 2024.3.3\bin\mingw\bin/ld.exe: cannot find debug/libddnet_engine_shared.a: No such file or directory 09:12 < bridge> FAILED: DDNet.exe 09:12 < bridge> C:\Windows\system32\cmd.exe /C "cd . && C:\PROGRA~1\JETBRA~1\CLION2~1.3\bin\mingw\bin\G__~1.EXE -g -mwindows @CMakeFiles\game-client.rsp -o DDNet.exe -Wl,--out-implib,libDDNet.dll.a -Wl,--major-image-version,0,--minor-image-version,0 && cd ." 09:12 < bridge> C:\Program Files\JetBrains\CLion 2024.3.3\bin\mingw\bin/ld.exe: cannot find debug/libddnet_engine_shared.a: No such file or directory 09:13 < bridge> collect2.exe: error: ld returned 1 exit status 09:13 < bridge> ninja: build stopped: subcommand failed. 09:13 < bridge> im When I build the old version everything is fine and there are no errors 09:13 < bridge> When I build the old version everything is fine and there are no errors 09:20 < bridge> fixed 09:42 < bridge> Time to switch browsers again 09:42 < bridge> LibreWolf will surely keep their promise, right? 09:51 < bridge> As long they don't want money 😏 10:10 < bridge> 6 hours and counting and no crashes yet 10:10 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347134274159120394/image.png?ex=67cab80f&is=67c9668f&hm=2243c4611e6b2d9ecaf16f4357440437a613f9714ac2f60f767a768f6459feb7& 10:10 < bridge> ill tell you if it found any when i get back up 10:49 < bridge> @kebscs Thank you for the "Test map locally" feature, this is amazing! 10:50 < bridge> 😄 10:53 < bridge> 🙈 10:55 < bridge> I saw that Test map locally does not connect to the correct server if a local server on 8303 is already running xd 11:00 < bridge> well this makes sense, doesn't it? xD 11:02 < bridge> Well it cannot log into rcon then 11:02 < bridge> I guess the fact that we cannot start a server inside the client kinda limits our abilities 11:04 < bridge> It just calls connect localhost so it'll connect to the first port with local server 11:12 < bridge> I never was able to login into rcon with this feature, as see my ticket 11:12 < bridge> log into, login to, login into what is english 11:13 < bridge> ^this was a duplicate 11:27 < bridge> interesting, the local server doesn't log me in even with `Client()->RconAuth("", aRandomPass, g_Config.m_ClDummy);` called 11:31 < bridge> Maybe you've changed login 11:31 < bridge> Username 11:32 < bridge> that's not in my autoexec. If I start my local server normally, I can simply login with my password defined there. If I start it with the in-editor-option, the password is overwritten 11:32 < bridge> because it tries to autologin 11:39 < bridge> and it doesnt auto log you in? 11:39 < bridge> nope 11:41 < bridge> and If I press the button again, it even tells me i am not authorized or connected (while I am connected): 11:41 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347157105034920006/screenshot_2025-03-06_11-40-36.png?ex=67cacd52&is=67c97bd2&hm=3bcdf1f4ac68e7c2721229d53dad17d122d9d91f2b1b5f69bdc2e457a98f1af0& 11:41 < bridge> weird 11:55 < bridge> @kebscs we could use (pStorage->ReadFile)[] and simply check if an rcon exists already. There are parsing options in the console, but none of them seem to match our usecase 11:56 < bridge> better to do what roby's issue says than scan pc autoexec for password 11:56 < bridge> this doesnt sound like a secure idea 11:56 < bridge> server scans for autoexec anyways but okay 11:57 < bridge> client doesnt, the client needs to know the password to auth 12:01 < bridge> how does auth_add work? It takes an ident, a level and a password, but what are ident and level options? 12:01 < bridge> havent looked into it yet 12:04 < bridge> ` "level can be one of {\"admin\", \"mod(erator)\", \"helper\"}"` 12:06 < bridge> ident = identificator/key 12:06 < bridge> so to summarize: 12:06 < bridge> `auth_add editor-local-server admin password` or 12:06 < bridge> so to summarize: 12:06 < bridge> `auth_add editor-local-server admin password` 12:06 < bridge> yea i guess 12:08 < bridge> and use RconAuth("editor-local-server", ...) are you fine if I do the PR or do you want to do it? 12:08 < bridge> you can do the pr, im doing the discord rp thing rn 12:15 < bridge> Does anyone know what's total width and height of CUIRect? 12:15 < bridge> CUIRect has w and h values 12:16 < bridge> I mean, if the rect is as big as your screen 12:17 < bridge> There is a Screen() function that returns a rect of your screen 12:17 < bridge> ok, thx 12:20 < bridge> @kebs this also doesn't log me in. The normal rcon now works for me, but I have a 1/30 wrong passwords 12:21 < bridge> debug it 12:21 < bridge> maybe the ident isnt username 12:21 < bridge> how do I login with user password in rcon? 12:22 < bridge> I can only enter a password there 12:22 < bridge> yea then theres no user 12:22 < bridge> just RconAuth("", pass) 12:23 < bridge> I used "add_user" instead of "auth_user" 🤦 12:23 < bridge> i need more coffee 12:32 < bridge> `2025-03-06 12:32:04 I chatresp: No such command: auth_user. ` 12:32 < bridge> huh? 12:33 < bridge> its fucking `auth_add` ..... 12:37 < bridge> `2025-03-06 12:36:30 I server: ClientId=0 authed with key=editor-local-server (admin) ` 12:37 < bridge> Now I am authed, but rcon still asks for username password? 12:38 < bridge> also I auth before I join the server 12:39 < bridge> I auth before I join the server, because the server asks for password, there are multiple issues on top of each other 12:42 < bridge> Are you using persistent mode and tmpfs already? The exec speed still looks rather slow 12:42 < bridge> how does it connect you when theres a password 12:42 < bridge> it asks for the password 12:42 < bridge> the server password in autoexec 12:43 < bridge> I added a fourth command now witch sets password "" 12:43 < bridge> because with sv_register 0 this is useless anyway 12:45 < bridge> Can you use the rcon auth to pass the server password or does that only work for reserved slots? 12:46 < bridge> The server respons with a successful auth, but the client doesn't know (is my guess) 12:46 < bridge> So I should be able to pass the password through this, but we don't know the password at this stage 12:47 < bridge> You don't need the password if you can use the existing rcon auth instead 12:47 < bridge> You can join reserved slots with password "username:password" but I don't know if that works without a reserved slot 12:48 < bridge> do you see any benefit in letting the password in for your local server? I mean technically another person from your network could join 12:50 < bridge> yea chillerdragon plays on public networks 12:51 < bridge> If it works with that feature I mentioned then using the rcon auth to bypass the server password would be cleaner 12:51 < bridge> Two questions: 12:51 < bridge> - How do we add a reserved slot 12:51 < bridge> - How do we join it out of the client? 12:51 < bridge> Is the reserved slot even necessary or does rcon auth work for server password in general? 12:53 < bridge> yes, you can login with rcon even with a server password enabled 12:53 < bridge> yes, you can login with rcon even with a server password enabled, also for other users 12:53 < bridge> I see, easy fix: we can generate a server password and simply connect with Connect(IP, Password) 12:54 < bridge> Then setting `password username:password` on the client side before joining should work regardless of the server password using the editor auth 12:54 < bridge> I mean do you need the server password still? 12:55 < bridge> I like my global autoexec. If I test multiple clients or servers I don't want to reconfigure them individually 12:55 < bridge> In this case I don't need a persistent server password, so no ig? 12:56 < bridge> whats the benefit of doing `password username:password` instead of `password something_generated` ? 12:57 < bridge> Then you don't need to change the existing password 12:57 < bridge> dont set random password, itll be same issue as preset rcon password 13:02 < bridge> Doesn't look like rcon auth works for server password without reserved slot. Maybe we should just add that as a feature as well. 13:05 < bridge> For us mods were just leaking the generated password to some of their friends 13:06 < bridge> So we moved to their personal rcon password 13:06 < bridge> if you are logged in, just type "password" into the console and leak whatever the password is 13:07 < bridge> checkout #9815 if this is what you want 13:07 < bridge> https://github.com/ddnet/ddnet/pull/9815 13:12 < bridge> Maybe we should rename it to "local server security hardening" xD 13:33 < ws-client> @teero777 firefox L time to switch to Ladybird 13:33 < bridge> sadge 13:33 < bridge> Been using firefox since birth 13:36 < ws-client> I still feel new to firefox im not attached. I used a lot of safari and chrome in the past 13:46 < bridge> Can't you just disable ads and then it's ok? xd 14:09 < ws-client> i guess its the mindset to me firefox sometimes feels a bit more sluggish than chromium i just use it because it feels more free 14:09 < ws-client> OOP enjoyers can i somehow make this print fng twice? https://paste.zillyhuhn.com/OQ 14:18 < bridge> Isn't it already printing twice? 14:19 < ws-client> in the comments you can see what it prints 14:20 < ws-client> but i think i am good now. Got bigger problems than that one i might scrap the idea fully 14:21 < bridge> ohh 14:21 < bridge> I didn't understand your msg 14:21 < bridge> Move the set config from the parent class to the child class? xd 15:07 < bridge> ChillerDragon: https://stackoverflow.com/questions/962132/why-is-a-call-to-a-virtual-member-function-in-the-constructor-a-non-virtual-call 15:09 < bridge> I guess don't use a constructor but a separate `Init` function 16:04 < ws-client> thanks 16:19 < bridge> @learath2 should we print the rcon/password in the console when the local server is started? After you disconnect from it you have no way back in 16:20 < bridge> @learath2 should we print the rcon/password in the client console when the local server is started? After you disconnect from it you have no way back in 16:21 < bridge> why do you want to set password on a local server 16:22 < bridge> someone can do it in autoexec if they want to 16:22 < bridge> if then auto rcon doesnt work edit code so it works when connected 16:22 < bridge> 2 reasons: 16:22 < bridge> - to prevent others in my local network from joining 16:22 < bridge> - to overwrite the existing password from my autoexec which is automatically loaded 16:22 < bridge> idk how you gonna do it 16:23 < bridge> if you just print passwd into console, what if i dont check console 16:23 < bridge> or exit game? the server will still run 16:23 < bridge> We should just add the feature to auth with rcon username and password to join a server 16:23 < bridge> doesn't help you to join back, because you are never informed about your credentials 16:24 < bridge> Not sure I created an issue for that already, but basically the automatic auth should also extend to the normal start server button and not only the editor 16:24 < bridge> So whenever you start a local server via the client it should be able to auth and join automatically 16:25 < bridge> yea you have it in your sv_rcon_password issue 16:25 < bridge> but hes saying to lock local server entirely by password, not just rcon 16:25 < bridge> The client should remember the credentials so you can join transparently I guess 16:27 < bridge> i dont like the idea of it being password locked when i dont want to 16:27 < bridge> im restarting the client so many times during testing 16:28 < bridge> There's no need to set the password on the server, but the client should always use the automatic username:password to join the local server so it works in any case 16:30 < bridge> If you restart the client that also quits the local server though 16:30 < bridge> not with the restart button in vs 16:31 < bridge> I assume because it just kills the client? 16:31 < bridge> yes 16:31 < bridge> Then your config also isn't saved 16:31 < bridge> how do I configure this? It currently doesn't 16:32 < bridge> also if you kill the client @kebscs the server also closes 16:32 < bridge> We would have to first add the feature to allow authing with rcon credentials instead of general server password 16:32 < bridge> Only with a clean exit, the server doesn't detect if the client stopped running (except on Android) 16:33 < bridge> doesn't the OS kill all the child processes if the parent dies? 16:34 < bridge> at least on windows I can't do that easily, not even if I kill the client over task manager 16:34 < bridge> From a quick search this would require admin permission on Windows 16:35 < bridge> So far I didn't find a way to kill the client without killing the local server 16:35 < bridge> I assume if you crash it it does not close the server 16:38 < bridge> there is a subissue in this ticket: 16:38 < bridge> If I rcon into a server, and then connect into it afterwards, the rcon console doesn't unlock 16:38 < bridge> there is a subissue in this ticket: 16:38 < bridge> If I rcon into a server, and then connect into it afterwards, the rcon console isn't unlocked 16:39 < bridge> this is only issue that you need to fix i think 16:39 < bridge> I literally can't login into rcon without setting and joining with server password automatically or preventing a server password to be set in the first place 16:39 < bridge> this will also fix if someone has password set up in autoexec 16:40 < bridge> I also asked if we need a password for the local server. I would be fine to overwrite ith with `""`, empty 16:41 < bridge> but "testing a map locally" shouldn't mean "Test your map with friends" 16:42 < bridge> just add rcon auth on local server join if it was set by the test map locally 16:42 < bridge> maybe in client.cpp ProcessServerPacket 17:18 < bridge> @milkeeycat got some enums + generic enums + impl with enums working 17:18 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347241892726833172/image.png?ex=67cb1c49&is=67c9cac9&hm=9b9611f3d3a386340e3f2f10c20449fe0bb4d16e92a34a8f47a9381765cd2ee6& 17:19 < bridge> epyc 17:23 < bridge> is # a special syntax to access enum members? 17:24 < bridge> i suppose it is used to avoid name collisions with methods 17:24 < bridge> or is it just temporary 17:27 < bridge> its to name the variant to use 17:28 < bridge> because we using context free grammars 17:28 < bridge> otherwise its ambiguous, but maybe there is a way, but i dont know yet 17:28 < bridge> rust grammar is not context free 18:01 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347252751951724564/20250306_175119.jpg?ex=67cb2666&is=67c9d4e6&hm=1a46d4bafc6971e5747693542f1f20feb98b5aaa57b86bed6f470baa9a70040f& 18:11 < bridge> how people who never wrote rust see rust code 18:17 < bridge> problem with all of this is how stateless this is: You start the server 18:17 < bridge> - send a connect message, hope for the best 18:17 < bridge> - send an rcon message, hope for the best 18:17 < bridge> 18:17 < bridge> There is no verification in any of this steps and I don't see how to add them 18:19 < bridge> test map>save rcon to gameclient>when joined server and ip is local rcon auth 18:20 < bridge> test map>save rcon to gameclient>when joined server check if local server is runnning and ip is local>rcon auth 18:21 < bridge> - can still be the wrong server, as an other issue suggested 18:21 < bridge> - you don't know if you can successfully connect or successfully auth 18:21 < bridge> I bet there is some obscure ubuntu local network setup where this fails 18:21 < bridge> you dont need to check if sucessfully connected 18:21 < bridge> just run when connected 18:22 < bridge> just run auth when connected 18:22 < bridge> but you don't do that 18:22 < bridge> you send a connect message and immediately an auth message 18:22 < bridge> yea bcs the feature was already complicated to do from ground up 18:22 < bridge> it will be ambiguous but it will look the same as rust! 18:22 < bridge> :owo: 18:22 < bridge> if your connection takes any longer for whatever reason your rcon will be too early 18:22 < bridge> if i was to improve it rn i would do that 18:23 < bridge> yes, I don't want to kill your feature, as I said, it's amazing and I'm glad to have it! :owo: 18:24 < bridge> you can just add the auth_add for now i think 18:24 < bridge> doing the rcon auth with checks would be more complicated 18:24 < bridge> and password thing especially 18:25 < bridge> the auth add part is not the issue, this is working perfectly ^^ 18:26 < bridge> the auth feature just breaks with server password. That's my issue 18:26 < bridge> at least with auth_add i can still login with my usual rcon 18:27 < bridge> what does the f2 rcon expect for a username for the root user? root or nothing? 18:33 < bridge> why do you run a password on local 18:33 < bridge> unless you're opening it to the public? 18:33 < bridge> local servers are still findable in the LAN network 18:34 < bridge> ah like within apartment networks etc.? 18:34 < bridge> also this way I only put sv_register ipv4 into the console to make it public for testing 18:34 < bridge> yes or if you life in teeworlds households 19:02 < bridge> def faster in merging, then I can review 19:03 < bridge> def faster in merging, than I can review 19:07 < bridge> same 19:07 < bridge> bcs its a gramebreaking bug 19:08 < bridge> and its copy paste from other part of code 19:08 < bridge> can't we skip merge queue for these things then? 19:09 < bridge> tho ngl, just make a follow up PR tbh, if you push it now it gets removed out of the merge queue 19:09 < bridge> oh the check fails °-° 19:15 < bridge> i guess reviews blocked merge? 19:15 < bridge> idk what happened 19:16 < bridge> Reviews shouldn't cancel the jobs, maybe a github issue 19:16 < bridge> ._. 19:16 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347271706896765032/image.png?ex=67cb380e&is=67c9e68e&hm=76428d6c4032266b367b73716d5cae7b9732f83ca1a813a5613a05d422f30b96& 19:16 < bridge> `Internal server error. Correlation ID` 19:24 < bridge> will push random fix to rerun jobs 19:33 < bridge> sorry, maybe I caused it then. I thought def- stopped the jobs 19:35 < bridge> i changed to your printing function 19:35 < bridge> but theyre exactly the same it doesnt matter 19:35 < bridge> when pr is fixing bug thats used for cheating ranks 20:07 < ws-client> I spent one day refactoring code and the result looks way worse than before. I regret my life decisions. 20:07 < ws-client> https://zillyhuhn.com/cs/.1741287993.png 20:09 < ws-client> i feel like i need the struct as parameter robyte keeps talking about 20:09 < bridge> passing half-initialized structs is so C-coded 😩 I love it 21:00 < bridge> Thanks for reading my mind :justatest:, looks like you already refreshed while I was typing 21:01 < bridge> 😆 21:38 < bridge> God GitHub is really annoying today isn't it 21:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347307447315988611/Screenshot_20250306-213831.png?ex=67cb5957&is=67ca07d7&hm=857909185311f51d6a403665e735e909856ef747174637698e031ad0fcf868b1& 21:39 < bridge> cc @kebscs :monkalaugh: :monkalaugh: 21:42 < bridge> its in mergeq 21:42 < bridge> pr checks passed 21:42 < bridge> @robyt3 21:43 < bridge> `[ FAILED ] Net.Ipv4AndIpv6Work` 21:43 < bridge> did the runner somehow lose internet? 22:08 < bridge> @ryozuki just look at dis GEP 22:08 < bridge> ```rust 22:08 < bridge> instructions = vec![ 22:08 < bridge> Instruction::Alloca { 22:08 < bridge> ty: Ty::Struct(vec![Ty::I8, Ty::Struct(vec![Ty::I8, Ty::I32])]), 22:08 < bridge> out: 0, 22:08 < bridge> }, 22:08 < bridge> Instruction::Store { 22:08 < bridge> value: Operand::Const(ValueTree::Branch(vec![ 22:08 < bridge> ValueTree::Leaf(Const::I8(1)), 22:09 < bridge> ValueTree::Branch(vec![ 22:09 < bridge> ValueTree::Leaf(Const::I8(2)), 22:09 < bridge> ValueTree::Leaf(Const::I32(3)), 22:09 < bridge> ]), 22:09 < bridge> ])), 22:09 < bridge> place: Place::Register(0), 22:09 < bridge> }, 22:09 < bridge> Instruction::GetElementPtr { 22:09 < bridge> ty: Ty::Struct(vec![Ty::I8, Ty::Struct(vec![Ty::I8, Ty::I32])]), 22:09 < bridge> base: Place::Register(0), 22:09 < bridge> indices: vec![ 22:09 < bridge> Operand::Const(ValueTree::Leaf(Const::I8(0))), 22:09 < bridge> Operand::Const(ValueTree::Leaf(Const::I8(1))), 22:09 < bridge> Operand::Const(ValueTree::Leaf(Const::I8(1))), 22:09 < bridge> ], 22:09 < bridge> out: 1, 22:09 < bridge> }, 22:09 < bridge> ] 22:09 < bridge> ``` 22:09 < bridge> gives 22:09 < bridge> ```x86asm 22:12 < bridge> @milkeeycat is this good or bad news? 22:12 < bridge> good 22:12 < bridge> cool 22:36 < bridge> why is a place a register 22:36 < bridge> i think a place should have no notion of register, stack or otherwise 22:36 < bridge> a place is like a pointer to place in memory 22:36 < bridge> btw its handy if a place has a projection 22:36 < bridge> so there is a local, that the place points to and the projection (store in the place struct) 22:37 < bridge> the projection for example can be a field access, a dereference, a index 22:37 < bridge> projection is a vec 22:38 < bridge> a local is like the base pointer to the alloca 22:38 < bridge> i guess it depends on how low level u want ur ir to be 22:39 < bridge> ok yep still no crashes 22:39 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1347322747784527922/image.png?ex=67cb6797&is=67ca1617&hm=e9b7ff2da1bf7ebdccc962922f9c3da19915992b6ffb338db4b7a6b52ab709e6& 22:40 < bridge> not in this case but i am using asan so that slows it down some 22:40 < bridge> because I wrote so xd 22:41 < bridge> im gonna keep it running for now though because its still getting new finds 22:41 < bridge> witch is surprising