So, last lecture I think what we were doing was a class network and that particular condition was for unicast condition, not for multicasting. So, in fact, after that I went back and then searched into the literature, I figured out it is still an unresolved issue, unresolved problem pending and still people have been investigating this thing, how to figure out the bounds. But I could actually sit down yesterday night and could actually figure out certain insights and from there I can actually build up a bound, but I think this can be further improved a lot and there is also classification which also has to further come in. So, my thing multicasting in multi stage interconnection switching networks is still an open area, open field which needs lot of investigation and I think the one of the best reference will be that one of the gentleman whose paper actually has been already uploaded from Taiwan, who actually has written a book only on multicast interconnection, multicast multi stage interconnection networks. So, whatever I actually have done yesterday night, so this is something new which is not there in my notes, this is a new addition and for last 8, 9 years I was actually teaching incorrectly this particular portion and no student has actually has ever told me that I am teaching it incorrect, they should have figured it out that is incorrect. So, but it just stuck to me while teaching in the previous class, this happens once in a while. So, and I always get excited when this happens. So, coming back to the same class configuration and remember it is all argumentative I am not doing any mathematics, but can be done through Paul's matrix, but Paul's matrix is not a good approach, which I also figured out while reading the paper by John Turner. There is also one paper which is also loaded inside from him, there is an alternative approach for doing this, I will just give an idea and leave it, I think you people have to do your own investigations because it is open ended research now. So, this is the situation and so far what we know is you have R 3, you have R 1, I am just keeping the same notations which I have been using, I am not using the notations which are used in the paper, they use a different notation. So, you have to be careful while you are reading the paper because you will I also got confused, you will chances are that you will also get confused, but I think some practice you will be able to appreciate that. So, N 3 outputs, M 1 inputs, R 3 switches. So, class theorem actually simply says that for a unicast connection because if you make only one connection, so M minus M 1 minus 1, in worst case these many are occupied, 1 is left out which has to be connected, this would have occupied all these lines. So, in fact, we call this thing as a unicast is a special case of multicast where fan out is 1. Now, what is the fan out f factor, this I have not introduced earlier. So, fan out actually says that what will be the total maximum size which is permitted for a multicast group, the output ports. So, because I am only permitting only one output port to be connected to input port f is equal to 1. I think I can take a case of f is equal to 2 also where only 2 output connections are permitted. Now, this f factor will actually play a role in figuring out what will be the hardware requirement. When f is equal to see all possible nodes can be connected, now you have to look at there is going to be somewhere an optimization. If I have to connect all the output ports to one port, any switch will work, any switch will work. So, far this R 3 will become equal to M 1 that is good enough. So, you have reduced this number of elements, but if you start making it 1, the extreme case on the other side is going to be M 1 plus N 3 minus 1. That is the one case when f is equal to 1. And if I take a fan out case of when f is equal to R 3 into N 3, then you require only R 2, here R 2 has to be greater than or equal to, this here R 2 will be greater than or equal to how much, any node you should be able to connect R 2 should be equal to M 1 N 3 maximum of this under this condition, which is obvious I think intuitively you can figure it out. The problem happens in between and I also do not know I am not going to do that, I am just going to give my estimate at least if you have whatever I am saying equal to or higher than that it will be strictly non blocking. Anything lower that I cannot say there is a possibility you can actually have strictly non blocking, but I do not know the proof, that again it has to be worked out. Now, I am also now going to add one more definition earlier I have only told you strictly non blocking. So, there is something called because this also term has been very extensively used and I also figured out that even for class network algorithms are available which will make it wide sense non blocking and it require less hardware, there has been again lot of proofs on that. So, I have defined strictly non blocking earlier and I think it is a good idea that if we separate out strictly non blocking for unicast and strictly non blocking for multicast, two definitions should be separate always same is true for wide sense non blocking. So, wide sense non blocking there will be certain connections which have to be done between input and output. If already some connections have been done and you want to do a new one you cannot be you may not be able to do the connection it is a blocking in that sense, but the strictly non blocking you can always make the connections without bothering about the earlier connections. But take a case when it is possible to know all I O maps and circuit is you know all connections. So, input I 1 to some output something. So, I 2 O map is known to you already and all connections are torn apart none of them are connected and you are able to invent an algorithm by which you can pick up connections in certain order and they are set up as per certain pattern. If this algorithm you can invent and if that algorithm is used you can always set up all possible I O map combinations. If that is possible that technically means you are avoiding certain switch states and switch will be always non blocking you can set up all possible permutation combinations of input to output only if you are following certain algorithm. For strictly non blocking you do not need any algorithm any kind of map which is there I O is free you can always set up the connection. But here you require an algorithm that is the only condition and rearrangeable non blocking even if you cannot build up an algorithm of this kind you might have to now decide on rearrangements that that that will not be used that will not be used. Random routing is for that that was only for finding out estimating the blocking probability here I am not I am trying to find out the characteristic of a interconnection network. So, that is why it is non blocking this I think is the good way of defining if you have an algorithm. So, I do one by one every connection and based on the connection I will choose an algorithm to set up and this algorithm will ensure it will be always non blocking. You cannot just simply pick up anything which is free and set up a connection. Rearrangeable non blocking is I think let me elaborate on this you have this some switch I am giving an example there only 4 by 4 how it is done inside do not worry about it. So, there is 1 2 3 and 4 I am giving you 4 scenarios. So, I have created some map say let me put primes 2 to 3 prime 4 to 1 prime these are the 2 connections which are already set up. Now, without bothering about without disturbing these if I can set up say any combination. So, now what is left is 1 and 3 and what is left on this side is 2 prime and 4 prime any possible combination I can take they are 2 into 2 total 4 combinations which are possible. So, it can be 1 4 if it is a unicast thing I can always set up this thing without disturbing this that is a strictly non blocking whatever way this connection has been set up this this connection also can be set up in this switch in multiple different ways with the multiple possibilities multiple switches states are there, but have I built up an algorithm when I am setting up these paths I follow that algorithm to avoid certain states of the switch. And now when this connection request comes in when I set up because I am avoiding certain switch states I will have to set up these that is a wide sense non blocking I have to follow an algorithm. Now rearing I am not doing any rearrangement when they were set up at that time I followed an algorithm which was permitting me to maintain this as strictly non blocking. Now, if I dismantle all these connections and then I can always find out a combination that all maps can be done that is a rearrangeably non blocking you can follow in less hardware wide sense non blocking requires slightly more always wide sense non blocking requires more amount of hardware than rearrangeably non blocking. But whereas as you are setting up connections you are following a certain algorithm that what we call a switch engineer's thumb rule rule of thumb is that try to push the connection towards the heavily loaded side as far as possible. If it is not possible then go to the least loaded side in the network and you will minimize on the blocking property now that is a rule which you are following. If you do not follow the rule you might end up in blocking this actually wide sense non blocking I will give an example then you will understand later on. What you are saying there is a if there is a blocking network if you look in terms of switches all switches by default set of all switches if you look in terms there will be a blocking switches within blocking there will be this is what we call blocking in the sense you cannot set up without disturbing or with disturbing it all depends on that now making event I know whether the block all blocking will get encompassed by by this no blocking is a separate set all together if there is a strictly non blocking thing with wide sense will be a small part of it ok right no not minimum I am talking about all these thing you need do not do any rearrangement you do not do any rearrangement or do a rearrangement is actually the rearrangement rearrangement of zero entities. So, this also rearrangement is not blocking in that sense you do not avoid certain states that as good as avoiding certain states. So, this also becomes subset of wide sense only thing addition thing which is coming here is avoiding certain states here you are not avoiding and here you further now you are able to do the rearrangements here you are not doing rearrangements not doing rearrangements plus doing rearrangements is equal to doing rearrangements is like this. So, in that sense I think this should be ok it has to figure out what is the current state and what new has to be set up and based on that usually the new connection when you want to set up can lead to more than one few many states. So, you have to choose one of those states which one you have to choose will be given by the algorithm. So, you have to avoid certain states. So, that you should not end up in blocking states like that is basically is the idea no it all depends on the switch design. So, once we will do it at some point for 5 states then you will appreciate that ok. So, that I will do later on once I finish up with the counter network after that it is not blocking in any switch here because this now these ports are more than this only blocking is because of interconnection. Not switches are all strictly non blocking they are cross bars or if you want to implement them we are assuming that you are recursively making them also by 3 stage network which is strictly non blocking. If you want to maintain them strictly non blocking switch and if it is a rearrangement on blocking each block should be further can be implemented by 3 stage rearrangement on blocking switch you have to ensure that. So, you can keep on doing it till you come to the fundamental element. So, it will not be 3 stages, but technically it will be more number large number of stages, but it is a cascade recursive construction we will come to that later on. So, that we can estimate the cross point complexity. So, this one is pretty simple what I did I am doing now for f fan out f is general switches this. So, I will assume this is the one input which has to go to f outputs. If all f outputs are one single switch life is very simple I have to just simply root only one and then this will do the fan out, fan out happens in third stage. Fan out also can happen in first stage because I can do a fan out here and then this can do the fan out that is also possible I am not taking that case as of now I am looking at worst case scenario. So, there m minus 1 m 1 minus 1 these are occupied only one is free which has to be rooted to somewhere. Now, these are occupied switches I require some free switch to connect to the f possibilities and f fan outs are going to happen at this point at this point at this point.  The moment f is greater than or equal to r 3 I will simply take r 3 as the fan out that is very important. So, this comes condition between minimum of the two kind of thing will come. Now, this particular switch I can assume that n 3 minus 1 are occupied and they are connecting to the middle stage switches and not overlapping with these. There is only one guy whom I have to do the fan out worst case scenario. I can keep on doing this n 3 minus 1 are occupied n 3 minus 1. So, I take only f inputs only those switches where I need to do the f fan outs f switches. So, how many these middle stage switches will be occupied f into n 3 minus 1 plus m 1 minus 1. I need one extra to whom I can just put this free connection and since only n 3 minus 1 are occupied each one of them can be connected to this free one. These are all independent remember I am taking this one this one is free not occupied any one of them. So, all the links from all of these fan out output is a switches is free to that. So, I can just root 1 here and this can do the fan out to all f's. So, only one extra will be required. So, you require plus 1. So, r 2 has to be greater than or equal to this for f multicast. So, the condition will turn out to be this that is what I am assuming in worst case scenario. Now, you can actually look into the your pulse matrix it will become far simpler. This is also I think known as this is actually theorem also comes from the graph theory from where this can be easily derived. This is fine. So, next is possibilities that my fan outs are more than r 3 worst case scenario.  So, this will be only smaller than this when f is larger than r 3. So, you do not require more than this that is upper bound I get for multicast. I think there are better bounds which are possible. As I told you when fan out f is equal to r 3 into n 3 you require actually r 2 has to be very small r 2 has to be equal to maximum of m 1 and n 3. When f is equal to 1 it is m 1 plus n 3 minus 1 and when I am looking at some other f's these are nothing but in these two ranges f is equal to 1 and f is equal to the maximum value of r 3 n 3.  So, all intermediate value will require larger hardware which is obvious and somewhere the optimum happens. This optimum will never be greater than this which is obvious this optimum will never be greater than this. So, I have given you a bound on that. So, coming to pulse matrix 2 actually derive the same thing. So, I can forget this and do the pulse matrix I think for some of you now by this time you can figure out what is pulse matrix. So, once I you know the middle stage cross overs the stuff. So, I am doing exactly same thing in pulse matrix. What it means you have a row you have a column you know how many columns are there r 3 columns 1 2 r 3 ok 1 2 set up a connection. So, you have only m 3 minus 1 symbols this guy is going to have one output free remaining are all occupied. So, it has m 3 minus 1 symbols. So, worst case scenario and I want to do f fan out. So, there are f columns only to whom I can connect at worst case not more than that. So, we will have 1 2 3 and some f in worst case scenario each one of them will have n 3 minus 1 symbols. So, n 3 minus 1 symbols here n 3 minus 1 here n 3 minus 1 here n 3 minus 1 here all symbols put together if they are all distinct which is a worst case scenario you make some total of them and if your r 2 is more than that at least one higher than that you can find out a free symbol which can be placed everywhere because that symbol also has not been used here has not been used anywhere. So, and a symbol can repeat in multicast scenario only one extra will be required and that is how you get f into n 3 minus 1 plus m 1. Now, there is an alternative approach which is known as ordering of conflict drafts rho maximum m 1 right right it is m 1 you are right it is m 1. Now, there is an alternative approach I will just give the idea of the approach I think and I will leave it to you to do the further investigation ok. And may be sometime later I will try to explain this stuff. So, again I will be doing it for first time. So, I will kick out something from the syllabus to do this this is known as colouring of conflict drafts. So, idea is very simple I am just going to give the idea here and then when we will move over to slap and do it theorem which is for rearrangeably non-blocking ok. Now, slap and do it theorem again is only for a unicast connections not for multicast ok. So, similar I think treatment is required for multicast scenario even in that case. So, in this case the way it is done I am just going to take a very simple example. So, these are 2 keep it 3. So, there are 4 outputs in this case and I think let me keep it 4 because all switches then these will be 4 by 4 switches ok. So, what will be the minimum number of required switches in the middle stage for a spin on blocking I am not bothered about it as of now I am looking at the conflict graphs ok. I am looking at a giving you the philosophy how it is going to work. So, pulse matrix also is nothing, but a graph theoretic approach because you can see in pulse matrix they are rows and columns and I am putting something. So, the middle stage switch is nothing, but a link that is what I am doing. So, when I am saying that one is connected to 2 I am now looking at an edge this edge which is defined is the middle stage switch. So, I can connect I can actually say this edge as a there is a vertical graph inversion which actually can be done. So, I can see this edge as a node and these as a the switches not the basically the input ports these are the switch numbers in the input stage ok. So, for this case for example, if I set up the connection this way only this much connection is there how to set up this graph. So, in this case these are the edges which are there. So, 1 to 1 this particular switch I am passing a route through 1. Similarly, when I am passing a route through 2 there will be another edge actually here. Now, since the edges nodes are common I cannot use same color here I cannot use same color. Number of edges which can emanate is actually equal to the number of input ports which are there and number of output ports which are there that is a degree of the nodes. You have to ensure when 2 nodes are sharing something they have to have. So, 1 to 1 there is nothing here right right it has to 1 to 2 this will be this will be 3. Now, there is I think is a problem here I am making some mistake somewhere in this case ok. So, I think let us because multicast will come back again anyways at that time I will take care of this we can skip this particular part. So, when doing multicast I will come back to this. So, let us move to the our regular stuff the slap and do the theorem the next one. So, I think because of the same conditions it is only true for unicast connections. So, in this case the statement is a 3 stage closed network is a rearrangeably known blocking if n only if r 2 is greater than maximum of m 1 and n 3 that is a condition in particular a symmetric network with m 1 is equal to n 3 is equal to n is a rearrangeably known blocking if n only if r 2 is greater than or equal to n which actually is nothing, but from here we just put m 1 is equal to n 3 is equal to n and this is what will be true written in different form that is the only thing. Now, we have to prove it actually this will also tell us how you do the rearrangements. So, we will start with the proof. So, first condition we have to prove is when establishing a connection between switch a input stage switch a and output switch b r 2 is greater than or equal to maximum of m 1 n 3 either then there are two conditions which are possible. The first one is a symbol is there not found in as well as column b what I actually implies these are rows and columns in the pulse matrix I want to set up a connection between them and I have to prove if this condition is satisfied either I will get when I will look into this look at all the elements here look at all the elements here at most there will be r 2 elements I will be able to find out an element which can be put here that is one possibility, but this may not be true. So, this is not true then what will happen. So, either is this or is the next condition or says there exist now this is important because once I am able to prove this I can do the rearrangements this gives that idea or and we have to prove this always happens this is always true there exist a symbol c in row in row a which is not found in column b and I think remaining stuff I can write here further it continues from here on that side and a symbol in column b which is not found in row a what actually means is either you will be able to find out the element which is not here as well as not here you can put that if that is not true it actually means all elements you take here all elements you take here you make a union of all these elements all elements are consumed there is no free element that is what if the free element would have been there after combining these that you would have put here that is the case 1 case 2 can only happen if you take all the elements here and all the elements here put all of them together in one basket all elements are consumed there is no free element which can be put here and if that happens you will always find out an element which is missing here but which is present in the column so that is what I am saying there exist a symbol c in the row a there is existing some symbol c here and this c is not present in column b and also correspondingly there will be another symbol d which will be existing which is there somewhere in the column but which is not present in the row you can always that actually means you can always find out a pair you can always find out a pair now proof for this is going to be very simple once if I am able to prove it I can then as a consequence prove that I can make the rearrangement and new connection can always be set up so this actually means so now let us go to the proof so for case 2 r 2 symbols must be found in fact it should be must must be found in row and column together if first is not true and since what is happening you are having a switch how many of the input ports are busy m 1 minus 1 so there is one which is available one port and how many symbols are there in total r 2 symbols ok and this actually means because of this condition that only m 1 minus 1 this actually means since r 2 is greater than m 1 minus 1 it has to be r 2 is either equal to m 1 when m 1 is equal to n 1 ok so it has to be always greater than m 1 minus 1 otherwise the switch itself will be become blocking ok so for rearrangement on blocking this has to be true so once this is true there are at most m 1 minus 1 symbols in row only m 1 minus 1 symbols are there and r 2 is greater than this where has to be some symbol which is not present in the row but when you are combining row and column you are consuming all r 2 symbols so that symbol should be present in the column ok so my first statement sorry this first statement this is about symbol d which exist in column b and not found in row is true look at from the output side there n 3 so n 3 minus 1 must be occupied so 1 is free which you want to connect same rationally that r 2 is using same principle I call it using symmetric argument so this actually in here you can write there must be a D in column B which is not present in row A and using symmetric argument there must be a C in row A which is not present in column B so one of the two conditions will always be true we have proven it a very simple argument gives it ok so once this is there I can now figure out a what we call rearrangement procedure if case 1 is true you can find out an element neither in row and nor in column place that here and you can set up the connection if there is some element of that kind exist I can set up the connection if that is not true I can always find out a C and a D pair second condition will always be true ok one of the two always has to happen so first case is straight forward second case you will find out a pair look into this row can a D repeat can a C be here actually now I can always find out a C in worst case if C is not there for example in this column there is no C very nice I can always replace this C here and D here C was not there in the column so I can always use that I can do the rearrangement but if I do the C that two C's cannot be there in a row so what we will do is we will not do the replacement first we will find out D we will search for C here we will search for C somewhere if C is there if C is not available my search stops if you can find out a C I can find out search in the whole column whether there is a D available there somewhere or not if now you look into this row now one of the important thing when you are going to search for this column you cannot find a C here C cannot repeat in a column the valid pulse matrix condition C cannot be here so you will never come to this column back again when you have search you have come here D you are searching we will be searching a new column this column will be excluded this column will be excluded when you search for a D you cannot search for this row because D was not present here ok and D is already here so D cannot be there you cannot come back to any other older searched row that is not possible actually ok so now once you come to D and you will again search for C this column is avoided this column is avoided you will find out somewhere here another C you will search now in this column for a D ok you will find out a D D cannot be here it is a unicast connection I am not looking at a multicast scenario I am looking at a unicast scenario ok so it means D can I will not be coming here I will be doing search somewhere here and I will keep on doing search and search will stop that is guaranteed every time I am visiting a row or column that is excluded from the search and maximum rows and columns are you forget this and this is R 1 plus R 3 minus 2 these are the new columns which will be there rows and columns first case only those many searches will be required in fact it will be even lesser than this I will tell you how that will be done ok so once this is there and at some point you will stop you cannot find well you have found D there is no C here so you stop at this point now what has to be done replace this by C this by D this by C this by D this by C and put the D here you can set up a connection this is a rearrangement this is a rearrangement which has been done now I think on graph it is fine but let me show you what on a switch that is the best way of doing it ok so are you able to appreciate this no not clear ok so conditions are ok the text thing which I have done that when R 2 is greater than or equal to maximum of m 1 and n 3 maximum of these two so first condition is I should be able to when this condition is satisfied I should be able to get an element which is not there in row A and column B if that is there I will just put that element and set up the connection if that is not true I can find out two element pair C and D for example here so if C is in the row it will not be in the column and corresponding D should be in the column and it will not be in the row. Now why that happens is because R 2 symbols must be there taking rows and column together and row cannot contain more than m 1 minus 1 symbols and my condition is it is maximum of m 1 and n 3 there is one additional symbol which is not present there which is D now if you look at the column similarly column will have n 3 minus 1 symbols but together I am already consuming all R 2 symbols and my R 2 is again greater than maximum of m 1 and n 3 so there has to be a symbol C which is not in the column but it is in the row so I can find out C and D pair so I found out this C and D pair ok so usually is if I what I can do is I can just use replace this C by D because C is not used here so I can use that C for this connection so whatever connection being done by this D can be now made through a C and I can put a D here to set up the connection between A and B that is a rearrangement but the problem is this row itself might be having somewhere another C so what will happen to that that C was already used for that connection ok so I will replace this by D because D was already used here so C certainly has become D has become free D has been freed up by assigning this connection to C ok so I can do this but then there can be a D here so I am now starting swapping the connections I am doing rearrangements I can keep on doing it till I stop and I have proven that every time when I am going I am trying to find out the corresponding element so if I am here C in the row I am searching for a D if there is a D I am in the column searching for a C I am always going to a new row or new column so in worst case I will require these many searches how we get this ok let me do it again so at least till this point you agree C and D pair ok so what we have to do is I have to just use this put a C here and put D here that would have made the rearrangement but I cannot do that all the time I can only use C here if it has already not been used in this corresponding row C can only be placed D can only be replaced by C if C has not been used there so I will search for the C if it has been used I have to take care of that C first because C cannot happen twice it has to only happen once if the C would not have been there in this row I just life would have been very simple C here and D here but that is not happening so the D is here so I will search for C I will first of all have to handle this C so what I can do is I can now search for the column find out if there is another D so what I will do is I will replace this C by a D this by C and I can then put a D here and this by a C because then in this case this row should not have another C so best is you actually now search for all these cross elements D you will search for a C you will never visit this particular column this is excluded C cannot happen twice in a column ok I am now visiting this particular column when I am now searching for a row I cannot visit this row because D was not present here I cannot visit this row because D is already there I will be visiting some other row say here I will search for a C I cannot come here I cannot come here this is already having a C so I might be getting somewhere here for example a C I will now search I will keep on doing it how many times every time I am ending up in either a new row or new column I cannot revisit the older rows or in older columns in fact somebody who is smart enough will figure out this is incorrect by this time no I will actually ok you will think what will be the correct value this is not the correct value you think you I will I will come back to this this value is not correct ok this value is not correct no no no ok I will write you think how this comes in fact this is also incorrect there is still better value but anyway at least you should be able to get from here to here I am only doing searching in the one I am actually searching a chain remember I am doing a chain search ok and chain will finish when either either I will complete all rows or all columns so whichever is the minimum I will do only those many so that is why 2 into one row one column one row one column that is how I am doing the search if number of rows are less I will finish first so I am taking minimum of those 2 and multiplied by 2 this will actually become equal to this when R 1 is equal to R 3 symmetric case but actually this should be modified to this but this also is the incorrect result no I got this so only one row has been done when I am coming here I am searching a column not the row so 2 elements have been done in one row then I am doing next row 2 elements even done in this row so when you look at the number of rows every time 2 has been searched 2 elements if the number of rows are less I will finish up the rows all the rows then I will stop this one is not included and there is a final one which also also will not be included actually somewhere you will stop so it will become minus 2 because of that so idea here is one row one column sorry number of rows number of columns minus 2 one is this and one is this but I think more exact value will be this ok but I let me come back to how you will do the rearrange search the chain chain will stop at some point replace all C's by D and all D's by C in the chain your D will get freed up and put that here to set up the connection ok now regarding how you will do number of searches which are required this is known as Paul's theorem I think becomes a theorem here and it is argument which is the proof or you can write it formally does not matter so I will use two colors here to actually identify now what we will do is we will do slightly something smarter so there is a D here what I will do is I will start with D and find out if there is a C I could find out a C now I would not search here I will search here find out a D I got a D alternatively I am extending the chains once this then this then this then this so next I will find out a D now I cannot visit this particular column row it has to be something else so it is here ok then this will find out a C can I visit this column no then I will search for a C I cannot visit this column I cannot visit this I will be visiting somewhere here ok so now I am trying to cover up when I will stop if R 1 is less R 1 R 3 so if R 1 is less I will stop at R 3 minus 1 searches ok so what I will require is minimum of R 1 R 3 minus 1 this is the exact value and that is what is simply the Paul's theorem Paul's theorem is says that if that condition is satisfied you will require only these many at post these many rearrangements to set up a connection so you have come from here to here and here to here but this comes from a double chain search alternative search so one of the chain will finish first in worst case scenario this will be doing only these many changes will be required rearrangements this is known as Paul's theorem in the text slip and duvet theorem that is a part of slip and duvet theorem double this chain is Paul's theorem that is his invention so I think this finishes up with the slip and duvet theorem and Paul's theorem and the next lecture we will now go to recursive construction of rearranging non-blocking switches clause network as well as structuring on blocking clause network both and we will try to estimate what is known as cross point complexity of recursively constructed switches which will be better than O and this power 3 by 2 so that is the best which we got for a clause thing if you remember earlier we will get something better than this actually by recursive construction so that is the part which I will be covering in the next lecture.


Hello everyone, I'm Shael Morgh. Today we'll talk about debugging at scale in production, specifically about Kubernetes debugging. I'm assuming everyone here knows the basics of Kubernetes, so I will dive right into the basic problem description and then into the three tools I will show today. But first a few things about me. I was a consultant for over a decade, I worked at Sun, found a couple of companies, wrote a couple of books, I wrote a lot of open source code, and currently work as a developer advocate for Lightrun. My email and Twitter accounts are listed here, so feel free to write to me. I have a blog that talks about debugging and production issues that talk to the Duck.dev. It would be great if you check it out and let me know what you think. I also have a series of videos on my Twitter account called 140 Seconds Ducklings, where I teach complex things in 140 seconds. The current series is based on debugging and it covers a lot of the things most developers don't know and would find helpful. I really appreciate it if you check it out and let people know about it. I was talking at Observability Fest 2022 and after I was done, they generated this absolutely spectacular mind map of my presentation. This is essentially what I'll be talking about and I'll show this again when we're done. Containers and orchestration, revolutionized development and production, no doubt. But in a way, Kubernetes made debugging production issues harder than it previously was. In the past, we had physical servers we could just work with or even VPSs. Now we face much greater difficulty in this age due to three big challenges. The massive scale enabled by Kubernetes is a huge boon, but it also makes debugging remarkably difficult. We need new tools to deal with the scale. We now have multiple layers of abstraction to the deployment where failures can happen in the orchestration container or code layers. Each failure requires a different set of skills and solutions. Tracking the cause to the right layer isn't necessarily trivial. Finally, there's the bare bones or lean deployment problem where when debugging, this is the first problem I want to focus on. We'll get to the other two soon enough. It's a problem of the bare naked container. We can connect to a bare bone container, but we have nothing to do inside it. Nothing is installed. We can inspect logs, but that relies on luck.  CubeCityLDebug solves these problems and can work even with a crashed container or a bare bone image. The CubeCityLDebug command adds ephemeral containers to a running pod. An ephemeral container is a temporary element that will vanish once the pod is destroyed. With it, we can inspect everything that we need in the pod. Most changes we do in it don't matter. They won't impact the pod after we're gone. It works with bare bone container. The way it does this is with a separate image. So we can have an image that includes everything in it. The container spun from the image is ephemeral and can include a proper distro and set of tools we need. CubeCityLDebug was introduced in version 1.23. So if you're still in an older version, you will need to wait for that. If you use hosted Kubernetes, you need to check the version they use. Let's start with a simple demo. As you can see, we have here a few pods. We're experiencing an issue and would like to increment the logging level. So we can better see what's going on. I can use exec and login directly to the live pod. I login with a proper bash shell. I'm sure most of you did that in the past as it's pretty easy. Here I can just use standard commands like cat and grep to check the logging level. This is all good. We can see the current level is at info. Unfortunately, I don't even have vim if I want to edit this file. Now, when the container has apt or apk and when the pod isn't crashed, I could in theory just apt get install vim. That's got its own problems and is a painful process. We don't want people in production just installing packages left and right. Even if it's cleaned up, the risks are sometimes too high. Pods shouldn't be touched in production once deployed. All the information in state of the pod should be described in its manifest, unless it's a strictly state for pod like a database, etc. So installing like this is problematic. So let's exit for a moment and try connecting again with kubectl debug. I'll use the busybox image in this case and we'll see how that works. Notice this is the image referenced in the kubectl debug docs. So I'm connected to the pod again. Or so it seems. Technically, I'm connected to a new ephemeral container and not to the pod directly. This is an important distinction. But as you can see, again, I don't have vim or really any of the tools I would expect like visual VM, trace route, etc. I can fix that. I can create an image that represents everything I need and packages, all of the tools I need. Then pass that image to kubectl debug and just use those tools. But who's the thing? I'm not unique. We're all pretty much the same. We all expect the same things in our debugging sessions. And that image I can use it is probably the same image you would use too. So why not have one generic image? This is where Quarkits comes in. Quarkits was created by Tom Gronaut of Flytran. Quarkits is an open source project that includes a set of opinionated, curated, platform-specific tools for kubectl debug. So you can have everything you might need at your fingertips while debugging. So what does this mean? When you use kubectl debug to spin up an ephemeral container, it's built using a Quarkits image. Currently, there are four standard images. A Go image that includes tools such as Delve, Peeprof, GoCalvis, and many others. The JVM toolkit, Quarkit, which includes tools such as SDKman, jmxterm, honestprofiler, visualvm, and much more. The node version includes NVM, ndb, 0x, vtop, and again, much more. And finally, the Python version includes pyenv, ipdb, ipython, and much more, as predicted, of course. But this is just the tip of the iceberg. As all versions include the many tools you would expect in any proper debugging session, such as VIM, htop, and also have lots of networking tools like Traceroute, inMap, database clients for Postgres, MySQL, Redis, and again, so much more. So let's continue from where we left off in the demo. We can disconnect from the current session and then spin up a new session with the Quarkits image. Notice we can also use the shorthand kk command for many of the operations which I don't use here, but you can see the syntax in the Quarkits docs. Specifically, in this case, notice I used the JVM version of Quarkits, which I chose because I'm a Java guy. But if you're using a different environment, you can use what fits there. In Quarkits, pretty much every tool I want is really pre-installed as part of the image by default. This means we can just connect and everything is already there. Since we're all very similar in our needs, Quarkits includes the common things most of us need based on the platform or language. It has sensible defaults and comes with Ubuntu as the distro. This is important. You have a full distribution, like you would in a desktop or a regular server. This is very helpful for debugging. So you get everything you need, even when debugging a bare bone container. Notice that thanks to CubeStyleDebug, we have full access to the main application containers, file system, and the pod's process namespace. So we can do everything there while residing in a more convenient environment. It's having our cake and eating it. So to finish the story from before, I can just use VIM to edit the file, change the logging level to error, which I can then confirm using cat and grep. I can also do a lot of other things, such as profile using profiler, debugger, debug with gdb or jdb. I can use jmxterm to perform jmx operations, which lets you configure the way the jvm behaves in runtime, and pretty much anything I can do in a local machine. To give you a sense of what Quarkits installs, this is the list of packages for the jvm client. And this is bound to grow, as you can all submit pull requests with your favorite packages. This is just the jvm specific image. The other images contain similar tools at a similar scale, and you can get all of that thanks to kubectl, the bug, and Quarkits. What if what we're tracking seems to be an application bug? This is a common occurrence for sure. We might not know it at this stage, but that might be the place we want to investigate. We can try using logs and probably should start there. But more often than not, the issue we need solved aren't logged. We can try using various observability tools, they're great. But not for application level issues. They rule for big picture analysis and contain a level problems, not for application level problems. We can use one of the debuggers in Quarkits to track it. That would only work if we know the server with issue manifests, which we sometimes do. It is remarkably risky connecting a debugger to a production environment can lead to multiple problems, stopping on a breakpoint accidentally using conditional statements that grind the system to a halt, exposing a security vulnerability. JDWP is the Java debugging wire protocol. There are several such remote debugging protocols we can use. This seems like the ideal solution. We'll get to that soon enough. So here's the first problem we run into with the debugger. We can't just start using it. We need to relaunch the app with the debugging enabled. That means killing the existing process and running it over again. That might be something we can just do. But it's probably not. Furthermore, running this in this mode is a big security risk. Notice I limit access only to the local server, but still it's a big risk. Leaving a remote debugging port enabled in a deployed server code is considered a huge security vulnerability. If hackers can ride a different vulnerability, they might be in a position to leverage this from the local system. Still, if we do this for a short period of time, this might not be a big deal, right? In a different window, I need to find the process ID for the application. I just ran, so I can connect to it. I can now type it into the JDB command and now I'm connected with a debugger. I can add a breakpoint using stop at commit. Naturally, I need to know the name of the class and the line number. But I can set a breakpoint to stop at. Once I stopped, I can step over like I can with a regular debugger. However, this is a pretty problematic notion on multiple fronts. First off, I'm literally stopping the thread accessing this application. That's probably not okay for any container you have in the cloud. There are ways around that, but they aren't trivial. The second problem is different. I'm old, so people automatically assume I love the command line. And I do. I do love it, to some degree. But I love Greenmore. When I started programming, there was no option. We didn't have IDs on a Sinclair, on an Apple II, or on a PDP 11. But now that we have all of those things, well, I don't want to go back. I programmed Java since the first beta. And this was actually the first time I used JDB ever. I'll use command line tools when they give me power, but debugging via command, I just end. The obvious answer is JDWP. We have a remote debug protocol that's supposed to solve this exact problem, right? But this is a bit problematic if we open the server to remote access with JDWP. We might as well hand over the keys to the office, to hackers. A better approach is tunneling. During the age of VPSs, we could just use SSH tunneling like this. We'd connect to a remote host and forward the port where the debugger was running locally. Notice that in this sample, I used port 9000 to mislead hackers scanning for port 5005, although it wasn't, wouldn't matter because it says SSH anyway, so supposedly safe. We can do the exact same thing with Kubernetes using the port forward command to redirect a remote JDWP connection to a local host. Port forwarding opens a secure tunnel between your machine and the remote machine on the given port. So when I connect to local host on the forwarded port, it seamlessly and securely connects to the remote machine. Once we do that, I can just open IntelliJ IDEA and add a run configuration for remote debugging, which already exists and is pre-configured with the default, such as port 5005. I just give the new run configuration a name and we're ready to go with debugging the app. Notice I'm debugging on a local host, even though my pod is remote. That's because I'm port forwarding everything. I make sure the right run configuration is selected, which it is. We can now just press debug to instantly connect to the running process. Once that is done, this feels and acts like any debugger instance launched from within the IDE. I can set a breakpoint and step over and get this wonderful GUI I'm pretty much used to. This is perfect, right? Right? Not exactly. It's got quite a few drawbacks still. As we can see, there are so many problems in this process. First and foremost is the need to restart the process. We can possibly run with debugging turned on by default, but that is a huge risk. Then it's breakpoints. They break. I heard a story years ago about a guy who debugged a rail system and literally fell into the ocean. The rail system literally fell into the ocean while he was stopped at the breakpoint because it didn't get the stop command. I don't know if that's an urban legend, but it's totally plausible. All remote debugging protocols are insecure, but I can personally attest about JDWP, which I'm familiar with. It's very insecure. In fact, there were CVs already about products that lifted open. It isn't designed with security in mind, but it's also a stability risk. How many times did the debug process crash on you? Imagine adding a breakpoint condition that's too expensive or incorrect. It might destroy your app in production just by viewing something in the watch panel. Finally, there's the privacy nightmare. Imagine a hacker from within your organization and 60% of attacks come from within your organization. A disgruntled developer might place a breakpoint where user credentials are collected and then start farming passwords and credentials, or he can place a breakpoint and then change the value and elevate his own privileges and let himself essentially dominate the system and change whatever he wants. This literally violates laws and regulations in various territories, so leaving regular debugging on a production server might actually be a legal risk as well as a security risk. I didn't forget about this slide. This is an even more important aspect. Everything we discussed up until now assumes we know the exact container where the problem is happening. In real life, this is rarely the case. We can have thousands of containers in real world deployments. How do you debug something like that? The debugger can solve the depth issue. Well, it lets us dive into the code despite the problems, but it wasn't built for scale or for production. That's where developer observability comes in. We used to call this continuous observability, but developer observability makes more sense. It's a newer set of tools designed to solve this exact problem. Observability is designed as the ability to understand how your systems work on the inside without shipping new code. The without shipping new code portion is key, but what's developer observability? With developer observability, we don't ship new code either, but we can ask questions about the code. Normal observability works by instrumenting everything and receiving the information with developer observability. We flip that. We ask questions and then instrument based on the questions. So, how does that work in practice? In practice, we add an agent to every pod. This lets us debug the source code directly from the ID, almost like debugging a local project, but without the drawbacks that we discussed earlier. So, to start, we need to sign up for free Lytron account at Lytron.com slash free for this specific demo. You can use other tools. They're pretty similar to Lytron, although I have to say not as good looking, not as secure, not as scalable, but the basic concepts are very similar, although functionality might vary. I will mention that when I'm aware of something that's extreme. In this particular demo, I'll show what I know. You can check out the Lytron docs for more detailed instructions on setting Lytron and Docker, Minikube, etc. On Lytron, we need to install the agent before the problem occurs. So if we do run into a problem, we'll be able to jump right in. This isn't a problem because the agent doesn't have any serious overhead and you can just leave it running always. It doesn't have the security risks that something like remote debugging has. I'll skip ahead all the installation because that's all in the website and go right into showing you what this means in practice. This is the prime main app in Kotlin. It simply loops over numbers and checks if they are prime numbers. It sleeps for 10 milliseconds, so it won't completely demolish the CPU, but other than that, it's a pretty simple application. It just counts the number of primes it finds along the way and prints the result at the end. We use this code a lot when debugging since it's CPU intensive and yet very simple. In this case, we would like to observe the variable i, which is the value we're evaluating here, and print out cnt, which represents the number of primes we found so far. The simplest tool we have is the ability to inject a log into the application. We can also inject a snapshot or add a metric. I'll discuss all of those soon enough. Selecting log opens the UI to enter a new log. I can write more than just text. In the curly braces, I can include any expression I want, such as the value of the variables that are included in this expression. I can also invoke methods and do all sorts of things, but here's the thing. If I invoke a method that's too computationally intensive or if I invoke a method that changes the application state, the log won't be added. I'll get an error. After clicking OK, I see the log appearing above the line in the IDE. Notice that this behavior is specific to IntelliJ or JetRanes IDEs. In Visual Studio Code, it will show a marker on the side. Once the log is hit, we see the logs appear in batches. Notice I chose to type logs into the IDE for convenience, but there's a lot more I can do with them. For now, the thing I want to focus on is the last line. Notice that the log point is paused due to high call rate. This means additional logs won't show for a short amount of time, since logging exceeded the threshold of CPU usage. This can happen quickly or slowly, depending on how you're observing. Let's move on to a different demo. This is the Node.js project that implements the initial backend of a microservice architecture. This is the method that gets invoked when we click a movie we want to see and want to see the details. This time, I'll add a snapshot. Some other developer observability tools call this a capture or a non-rating breakpoint, which to me sounds weird, but okay, same thing as usual. Once I press OK, the camera button appears on the left, indicating the location of the snapshot, like you would see with the regular IDE breakpoint. Now, I just access the portion of the front end that triggers this code, and now we wait a second for the snapshot to hit. So what is the snapshot? It gives us a stack trace and variables, just like with a regular breakpoint we all know and love, but it doesn't stop at that point. So your server won't be stuck waiting for a step over. Now, obviously, you can't step over the code, so you need to step by individual snapshots. But this has huge benefits, especially in production scenarios. But it gets much better. This was a relatively simple demo in terms of observability. Let's up the ante a bit and talk about user-specific problems. So here I have a problem with the request. One specific user is complaining that the list on his machine doesn't match the list for his peers. The problem is that if I put a snapshot, I'll get a lot of noise because there are so many users reloading all the time. So a solution is to use conditional snapshot, just like you can with a regular debugger. Notice that you can define a condition for a log and for metrics as well. This is one of the key features of continuous observability. I add a new snapshot and in it I have the option to define quite a lot of things. I won't even discuss the advanced version of this dialog in this session. This is a really trivial condition. We already have a simple security utility class that I can use to query the current user ID. So I just make use of that and compare the response to the ID of the user that's experiencing a problem. Notice I use the fully qualified name of the class. I could have just written security and it's very possible it would have worked, but it isn't guaranteed. Names can clash on the agent and the agent side isn't aware of the things we have in the IDE. As such, it's often a good practice to be more specific and in this sense I want to be 100% clear. Lightning doesn't see your source code, so your privacy is maintained. It's running on the server against the binaries and is oblivious to the fact that you have an import statement in the file because that's a construct of Java, not a construct of the class file that's already compiled. So we have no way of knowing that you imported that specific class. After pressing OK, we see a special version of the snapshot icon with a question mark on it. This indicates that this action has a condition on it. Now it's just a waiting game for the user to hit that snapshot. This is the point where normally you can go make yourself a cup of coffee or even just go home and check this out the next day. That's the beauty of this sort of instrumentation. In this case, I won't make you wait long. The snapshot gets hit by the right user despite other users coming in. This specific request is from the right user ID. We can now review the stack information and fix a user specific bug. The next thing I want to talk about is metrics. APMs give us a large scale performance information, but they don't tell us fine-grained details. Here we can count the number of times a line of code was reached using a counter. We can even use a condition to qualify that. So we can do something like count the number of times a specific user reached that line of code. We also have a method duration, which tells us how long a method took to execute. We can even measure the time it takes to perform a code block using TikTok. This lets us narrow down the performance impact of a larger method to a specific problematic segment. In this case, I'll use the method duration. Measurements typically have a name under which we can pipe them or log them. So I'll just give this method duration a clear name. In this case, I'm just printing it out to the console, but all of these measurements can be piped to StatsD and Prometheus. I'm pretty awful at DevOps, so I really don't want to demo that in this case, but it does work if you know how to use these tools. As you can see, the duration information is now piped into the logs and provides us some information on the current performance of the method. The last thing I want to talk about brings this all together, and that's tags. We can define tags to group agents together, such as production, green, blue, Ubuntu, etc. Every pod can be part of multiple tags. Every action we discussed today can be applied to a tag, and as such can run on multiple machines simultaneously and asynchronously. This solves a scale problem when debugging. You can literally place a metric or an action on a set of tags, and it will happen on all of them. So for instance, if a specific user you don't know which pod he will hit in a request, you can still place an action on a tag and get it regardless of which container gets invoked. Let's go back to the list of drawbacks we had with debuggers and review it again. You can keep an observability agent running all the time since it's designed for this use case. Here we don't have breakpoints, snapshots, don't stop. They are secure by design and are read-only.  Some services like Clarkeland support PII reduction, which removes private information from your logs and blocklists which prevent users from debugging restricted classes or files. So it's very secure even when an internal user is, say, problematic. So in closing, I'd like to review some of the things we discussed today. CubeCTL Debug made debugging crashed pods possible. It also made it possible to debug a pod based on bare-bone images. CoolKits made CubeCTL Debug easier to use with pre-installed tools. Debugging an application in an existing container in production is difficult and risky process. Developable observability made deep, secure, read-only, real-time debugging, at scale, easy. Thank you all for watching and bearing with me. I hope you enjoyed the presentation. Please feel free to ask any questions and also feel free to write to me. Also, please check out TalkToDec.dev when I talk about debugging in-depth and check out Lytron.com, which I think you guys will like a lot. If you have any questions, my email is listed here and I'll be happy to help. Thank you.


Hey Virgo, welcome back. Welcome back to the channel. It's Kelly from House of Virgo. If you're new, please do smash that like and subscribe button. Hi everyone in the chat. Please be mindful. These are general love messages. I'm here every day, Sunday through Thursday doing daily love messages for you, and then I am here on Thursday. I do the weekend reading. So definitely join the channel. And if you become a member of my channel here, you guys, you can get early access to my daily uploads. Okay. What else do I need to say? Do I need to like roll out the intros here? Yeah, if you want to get extra messages, go over to my other channel, Moon Pitero, where I do a daily collective read. All right, enough of this. Okay, let's get into your reading Virgo. What are the energies going into the month of August? For love, what does Virgo need to know? Virgo sun, moon, rising, or Venus? Messages for Virgo. Okay. Ooh, you're getting a love call. Someone's expressing their love. Expect your phone to ring. Virgo, a message of love, thinking of you, and letting you know. Okay. Well, so far so good. Excuse me, let's see what else is going on here. Yep. I know some of you are like, nobody's calling my number. I got them blocked. Well, it might be calling from an unknown number. It might be calling from a friend's number. They might be calling from a blocked number. Okay, it's, look, listen, Virgo, it's a phone call. Okay, look at that old 80s phone, right? The old the wall phone. Okay, maybe somebody has a wall phone. There's, yes, definitely a love call coming in. Okay, let's see. All right. Ooh, the grim reaper. The relationship is over.  Virgo. All right. So, let's see. I don't know what's going on there. That's too completely composing. Oh, I was composing. I was gonna say opposing. No, no. That, I get it. Okay. Somebody's calling to tell you that they love you and whoever they were with before, there's no more chances with that person. The relationship is over. This person is calling to tell you that they're in love with you. They've been thinking about you. They want you to know how much they care about you and whoever they were involved with was a grim reaper and that relationship is over. There's no more shots, no second chances with that other person and they're changing and transforming their life. Okay. Okay. Okay. Yeah, the person they were connecting with was like a girl with a snake. That was a very toxic relationship, girl or a guy with a snake. That was a very toxic relationship. Empath and narcissist paradigm, being charmed or used, enabling boundaries. Yeah. Okay, so you might know this person. You might not know this person. This could be somebody new coming in here. Virgo, but I can tell you right now this phone call that's coming in, if you knew they were with someone, what the heck? If you knew they were with someone, they're telling you that it's over. If you don't know, if you haven't met them yet, they're letting you know that Hala, they're single and free and they're interested in you and they want to get together with you. Okay, now the Page of Swords and I'm hearing um, will you choose me? Will you choose me? I'm choosing you, okay? Somebody's got their eye on you here, Virgo. Could be a Gemini. Could be an Aries. Somebody's watching you. Okay. So there's curiosity. There are questions. This person is going to ask you um, if you love them or if you or if you're interested to connect with them or be with them, okay? They're going to ask you. They're going to ask you if you're with anyone, if you're seeing anyone. Okay, um, there's a decision here. This person is curious like, well, they want an answer. They're going to ask you, not only express their love, but they want to answer. Oh, look. Okay. Well, there's the Virgo card. So either this person is a Virgo or they have Virgo in their chart somewhere. Um, I kind of feel like the it's phone call and then a text. There's going to be communication starting with this person. Look at you. You're going to be like looking down at your laptop, looking at your phone like, I don't know how to answer this. I don't know what to say. Or just looking at it for a minute before responding or before saying anything. Okay? This person is like, they're going to be waiting to hear from you or hear response to a question. Um, if you are either seeing somebody or if you're dating anyone or if you're interested in going out with them or, um, connecting or meeting somewhere, that two of ones makes me feel like, you know, like, uh, your choice wherever you want to go. I'll meet up with you. Okay. This person comes in though. Um, they're showing up like very, um, stable, very stable, financially independent, thoughtful, somebody who's very thought they think before they speak. Okay. Very patient, inspiring kind of an energy, male or female energy. Okay. Money, money all around this person. Success, financially independent, prosperous. Um, this person has high social status or is a social butterfly. I feel like that high social status means this person is possibly well known. Okay. They may not be popular, but they're well known. All right. Very mature. Okay. Let me see. What else is going on here? This is an interesting reading you guys. Seriously. Okay. What are the options? What are the options here, Virgo? Um, I feel like this person is probably going to say the grass wasn't greener on the other side. Now, this is somebody that you were connecting with before. Um, this person is coming in like very, I don't know if it's remorseful, but I feel like it's kind of like, well, I made a mistake, right? If you knew this person, I thought, I thought something was over. I thought we were done and, you know, I went with somebody else and that person was evil. The grim reaper was just going to try to kill me. You know, they were charming, but there, there was a very toxic connection between the two of us and I'm not going back to that person. That's over. Maybe they were married to them or in a long-term relationship with them and it's, or something and it's like, no, that's done. So whoever this person was connecting with, that's done. What other messages they're here for you, Virgo? I feel like this person's going to be waiting to hear from you. Look, four of wands. Are you kidding? There's a reunion. Okay. For some of you, this is somebody that you definitely know. We're coming up with Aries again. Um, doesn't have to be. I'm just calling out the signs here. Um, definitely reunion, holiday perhaps, connecting during the holidays, maybe a wedding, get an invitation to a wedding or a party. It's definitely, it could be, um, it could be a surprise party for some of you. This could be something to do around your birthday, but we'll have to see because you are showing up here. Okay. If you're an August, an August baby, doesn't mean it's just only for August birthdays. It could be, um, happy early birthday connection as well. If you're in September. Okay. Let me see here. This is, um, an invite possibly to somebody's home or an event. Um, it could be a reunion, a wedding, like I said, a community, family coming together, um, teamwork. This is marriage. This is like, um, I feel like some of you are going to get invited somewhere, or someone's going to try and throw a surprise party for you, but they're not going to tell you. That's like a little behind the scenes kind of thing. Okay. So now we have the queen of wands. Okay. So this could be a fire sign person showing up. They might be contacting your friend. Some of you might be on the cusp of Leo and Virgo. Okay. They could, or they could be contacting your friend or talking to someone about connecting with you. Okay. Or inviting, uh, being a plus one kind of thing. Uh, maybe they have a, for some that could be like a friend or someone they know that's hosting a party or there's some kind of an event and, um, they say to, oh yeah, there's a, there's a wedding. Um, you're getting invited to the, there's a couple getting married. Um, for some of you, you're getting invited to that. There's two people here. Now for some, you could be connecting with a Libra or, um, yeah, a Leo. Let me see here. What's going on with this? Um, double date as well. I'm hearing meeting somebody's parents or brothers, sisters, a couple, meeting a couple, connecting with another couple. There's planning. Definitely planning. It's not just a love call. It's not just, um, I mean, there's a lot behind this. Let me see. Getting to know each other perhaps. Oh, okay. So we have victory here. Okay. For somebody, I'm hearing September 7th, maybe somebody's birthday. Let's see. Overcoming obstacles. Somebody here is like, there's travel. Okay. I'll send a car.  You come to me. Um, there's definitely travel here. Let's see. Interesting. Somebody might be showing up in a brand new car or a rental. Okay. I'll pick you up and take you with me. Yeah.  It's not just love. It's like, would you be interested in going out with me? Would you be interested in connecting? Would you be interested in this reunion and getting together again and going somewhere together? Maybe traveling somewhere or would you be interested in coming to meet my family? Um, or are you, are you, and they're going to be waiting to hear back from you. I don't know that Virgo, I kind of feel like you're going to be like, what? I don't know how to answer this. Why? I see you being very grounded, but I, I don't know. I feel like it's kind of like maybe a surprise. Yeah. It's like a surprise. I feel like you're not going to expect this. Yeah. Look at you. Okay.  Oh Virgo. The hermit is okay. Seven of cups. So this is like dreaming. Um, this is like, is this, is this real life? Is this real life? Is the anesthesia going to wear off soon? What's going on? Is this for real? Is this really happening? Why is this a surprise for you? Maybe you knew this person. Maybe you knew them and knew that they got into a relationship and thought maybe something was over or something was done or found out they had another person and just gave up on it. But it seems like this is turning around. Okay. So here you are. Okay. Somebody might be born in 1979, but here you are. Like, is this a dream? It's all just a dream. I'm thinking of, um, they gave me that song from Nelly. It was all just a dream. So, oh my God, there's six of cups. So returning to one's roots, grounding yourself. Is this really happening? Are my memories or these dreams or, you know, is this like, is this nostalgia or is this really happening or a reunion or connecting with this person? Um, double Scorpio, Virgo here. Okay. Is this really happening September 9th for some, for some of you, um, it's a cancer, July 9th. Okay. Let me see. It's like, do you, you're, so that's kind of like, oh my God, I can't even believe this judgment September 20th. Listen, this is it. You're like, I gotta think about this. I don't know. You're like, is this for real or is this person going to ghost me? Is this person, like, could I trust this? Is this person coming in with this judgment card? You know, it's like this renewal reunion. So much of this. Okay. Getting back together with someone or meeting someone for the first time and just kind of like, or maybe I feel like some of you might have known this. Now, right now you might not know, and you may connect with them in August and then find out they have somebody else.  It's just not going to work out. I'm not, I'm not chasing after someone that's already committed to somebody else. And then it ends. And then this person comes back in. So remember, just if it's not happening right now, it could be happening further down throughout this month. Okay. August 20th, I'm hearing is going to be significant. And August 20th is going to be significant. There's going to be like a huge awakening like holy coming out of the woodwork, forgiveness, decisiveness and decision getting made. So I feel like you might be communicating with this person before that. But like the decision, it's like, okay, we're coming out here. We'll connect. We'll connect. I'll connect with you. We'll connect. Okay. So Virgo, what's going on with this seven of cups? Why are you having to think about this so much? All right, let's take a look. Am I just an option to this person? Do they have multiple? Are they duplicitous? Do they have other options? Or is this person just picking and choosing whoever's available? Are they going to procrastinate and say we're going to do something or we're going to connect and then they don't? Am I like fantasizing? My dreaming? Is this all an illusion? Wishful thinking? Is it all in my head?  Do you want to connect with somebody here? And rather than just be all super excited Virgo, you're like, wait, hold on and hang on. I gotta like, I gotta check my checkers. I gotta fact check my checkers and make sure that I'm not going to get ghosted or duped or this isn't some kind of a dream. Oh, there's a higher front. Oh, it's not a dream. You know, is this person, I feel like you're like, is this person coming in like serious?  If you have rules, September 5th, I'm hearing this person coming in like traditionally, do they really want to have like this traditional, you know, relationship and not be flaky and not be someone who's just in and out? Okay, what's going on with this person? What is going on? Because something is ended with whomever they're with. How's this energy going to play out? Okay. Oh, they are so free. Like a free bird here. Single is a Pringle. Ready for that new beginning. This person's like spontaneous. They're coming in very spontaneous, just they're going to travel to you or connect with you, go on this adventure. Yeah, freeing themselves up from some type of terror, terroristic terrorist that they were involved with, someone they felt like was a terrorist. It gave them a lot of mental anguish and grief and anxiety. They put in through a lot of stress, burden. Some of you, I know you know, you're like, I know who this is and good, they deserve it. Okay, um, deep, deeply unhappy. This person's freeing themselves from this. Yeah. Yes, burden. Oh boy. Oh boy.  And I didn't think I'd live to see the day that this would happen. Okay. And here they come. Yep. Page of cups. Apology. Yeah, you're getting an apology. Okay. Psychic messages. You might already be aware of this situation. You might already be getting psychic downloads.  They really admire you big time. They may not have been able to get with you or connect with you because there was somebody else in the picture or someone else they were trying to get away from or a relationship they were trying to end with. There might have been some like strings attached. Yeah, it looks to me like this person is like, no, this is it. It's done. Never going back. Yep. They're very positive about that. Definitely. They're getting out and they're coming to you. Okay.  But then it just kind of feels like this person, you know, if they're with someone else while they were talking to you, it pretty much is a sign that whoever they were with was like dead. Anyway, like it was done. Obviously, if they're talking to you, they just didn't have the courage or the, the, the Cajonas to do anything about it or say something to their person or find a way to end it. Okay. But it looks like it's happening here. Or this is someone that you already knew about who was involved with somebody else or a hunch. Okay. And yeah, so listen, Virgo, you're getting that call in August.  I'm really interested in you. I'm thinking about you. I'm going to connect with you. They may not, if some of you listen, they may not tell you that they were with someone else, but trust me when I tell you the grim reaper and the girl with the snake or guy with the snake is out the door. Okay. The grim reaper, no more. That's it. It's done. The girl with the snake, that narcissist or that manipulator. Okay. That person had no boundaries. Nope. Walked all over them, treated them like dog meat. So that's done. All right. So let's see what your romance angels messages are. Okay. Someone's coming in here to make the effort. Oh, they're going to make the effort. This year. Great love. You're worth it. And you're worth taking the steps that they're got it to take. Okay. September 19th birthday, picking up playfulness. Okay. There you go.  And then it brings out your youthful spirit. This person, you're going to experience this with this person. They get very playful and happy and excited about you. And they're kind of, they trip over the words or they can't talk.   So they're, they're, they're giddy and happy. They show very like happiness and joy to talk to you. And especially if you will give them an opportunity, another chance. Okay. Cause there's no second chances for another person that they were with. Okay. So yeah, this person is keeping a very open mind. Um, you guys, there's differences between the two of you. Your soul may differ from your usual type and expectations. And this is coming from them.  Or there isn't, hmm, you may not be their usual type. And that's something that maybe they're used to these toxic types of people, but there's something very different about you.  You have your moments, right? But, um, no, you're not, you're not cruel. You're not a manipulator.  And, and that's the difference. Okay. You, uh, that's how they see you. Now, if it's not that kind of difference, it could be, um, religious differences. You could have geographical distances. You guys could have cultural differences.  It could just be as simple as like one person has dark hair, dark eyes and dark skin. And the other has light hair, light, light eyes and light skin, right? It could just be anything. It could be like one person. Some of you might have one green eye and one blue eye. Okay. It's just, there's some difference, something unusual, but very unique and special about you and them. Okay. I just thrown some cards at me. Dragon, tiger, dragon again, snake. Okay. We have a pig. We have a monkey.  You're different. Hmm. We have a rooster. Double monkey. There's a horse. There's a rabbit. Did I say tiger? Cause we have a tiger. I don't know if I said tiger, tiger. There's a double rabbit and we have an ox. Okay. And then they just gave me a dog. Hold on. Now they're saying, okay, now we have a year of the rat. What the heck? They want me to keep going? That's like all of them. Seriously. Okay. Year of the goat. So let me see what other messages here. You know what? I want to see what you're like, what's your full on energy going to be here. I'm not going to go into an extended. I'll try to go into that tomorrow. Let's see what your full on energy is going to be in response to all of this. Okay. Cause this person's coming in like, they want it ready to go all the way. I mean, they may not be like super, super aggressive. I don't see aggression, but I do see they're going to ask you if you can connect or if you can like, or invite you somewhere. Now let's see you Virgo. What's going on with you? Okay. Hmm. Clean ones. Are you sure it's over with that fire sign or that other person? That's, that's what you're going to, that's your, that's going to be your mission here.   There might have been infidelity. So I feel like for you, um, yeah, is it done? That's what you're going to find out. Okay. Have you abandoned this person? Have you walked out? Are you done with it? Um, and if they don't tell you about this situation, you are going to inquire. You are going to ask where we're, you know, if you don't know about it and they're coming in, um, you're going to inquire and you should, you got to vet people. Like you got to ask, are you married? Are you single?  You know, if you meet somebody online, get to see them immediately. Don't stay online because you will get catfished. Even if you're, even if you're video calling each other, you still don't have enough information. You got to get all the information. Like you got to see this person in their day and in their day out. Yeah. Are you done or like, what's going on? Okay. All right. What do you end up in Virgo? I swear. You know what? You cracked me up. Okay. You coming in with like Mr. or Mrs. Luss and you're just trying to hit it and quit it. I see you asking questions. Yeah. Cause you're not coming in. I feel like Virgo.  If you're trying to have a, like Virgos don't play. If you're trying to have a relationship with me. Okay.  Like if you're rushing in to be this way with me, lusty, like too quickly, way too quickly.   So you're on guard. I feel like you're on guard a little bit. Okay. I feel like you're going to be. Okay. Yeah. Until you have all the information. There's judgment. Everything out in the open. Virgo's not playing. Virgo's not playing. Lay it all on the table. You give me your transparency and I'll give you mine. You tell me everything. You show me. You tell me. I want to see what's in that closet. I want to see what you're hiding under the desk. I want to know. I don't want you to show me that whoever you were with, that this is done. But I don't feel like you're being mean and I don't think you're putting somebody under the hot lamp and interrogating them like all the way until they're scared to death and running out the door of Virgo. You knew you can get that way. No, I just think you're going to ask questions this time. You're going to vet a little bit. You can be vetting. Yep. And I want to see what the what talk to me about your opportunities or these ideas or the plans, right? Like what do you want to do? Like what are you looking for? Where are you with things right now? Yeah. So you have that energy going on and that's cool. I like the way that's showing up for you. Okay.  You have your boundaries and that's good because you got to. All right. You got to. All right. Let me see what your mood messages are here. Okay. Don't let your past hold you back Virgo. Don't let your past hold you back. Whatever what did Will Smith say? Don't let the past person don't make the new person pay for what the past person did. And if this is your past person and you're going to start over, don't continuously punish them for the things they made if they're coming forward and they're trying to make amends and have this reunion and try to make something work with you and you want to give them a chance then you got to reconcile everything with the past if you're going to start fresh. But the energy is going to be gaining momentum here. It's time to take action. Okay. New moon and Aries. I feel like this don't let your past hold you back is specifically more specifically for those of you who have Aries in your self note. And if you don't know that, look it up. Okay. New moon and Sagittarius. Luck is on your side. Okay. This is beautiful. I feel like this thing is going to work out. I really do. I feel like this, I feel like somebody's coming in here and they are going to be honest, open and honest with you. Let me see. I just want to get a couple more messages. No, I don't. I want to do the charms. All right. Let's take a look and see. Give us more information who this might be. So we have Pisces. Sagittarius. We have Scorpio. We have Double Sag. All right. And then we get a couple of charms and then that's it. Okay. Summary's birthday is June 14th. Okay. Summary's 26, 25, 30, 26. All right. Let me see. Okay. They're giving me August 28th. Summary's birthday is August 28th. Summary's born in 1964. 1981. Somebody is 40 years old age or we'll be turning 40. Okay. All right. So we have Saturn. Okay. Maybe Capricorn. Capricorn energy. Oh, we have a star and this has a saying on it. Hold on. Just for you. The star, the stars and the planets. I just heard I would give you the moon and the stars and also there's an airplane here. So there's a flight. There's a trip. Somebody's taken a flight going on an airplane. Okay. Flying up there in space with the planets and the stars and the moons. Absolutely. There's a trip. So somebody's coming in on a plane, a rival or departure. Someone's going to Paris or is coming from France or Texas. What is this thing? Okay. This looks like, you guys, this looks like an elephant. So there's some, someone might be from South Africa or maybe India or they're African or Indian and then love. Oh my goodness. And this Eiffel Tower has really given me a sense of like, you know, Paris, France is so romantic. This feels like romance. This feels like maybe flying to France. Let's go on a trip together and take you on a trip or talking about that. This love was made for you. That's what I feel like is going on here.  Oh my goodness. Now, just remember, you guys, let me just tell you, these roles could be reversed. Some of you could be getting out of a toxic relationship and reaching out to someone in August and telling them, you know, I'm done with that. That's over. It's done.  And you know what?  And you know, whoever that's for, that's specific message. Let me just get a couple more little messages here to see what else Fargo needs to know. And then we're going to get done. Somebody might be a pilot. Okay. Somebody just bought a new Tesla. I just heard that. Somebody just bought a new Tesla. Okay. Yep. There's a double card. So there is a little, there might be some Capricorn here, but this message, I don't know who, if it's for you or this person or it's coming from, something's got to hold. Breaking this chain is what's happening right now. Healing, which doesn't happen overnight. Facing fears, praying for guidance and asking to be lifted out of something. This is a time of deep struggle, but you're not alone. Okay.  Very lovely. This person is deep love, deep emotions, very kind, gentle, very loving spirit. That's why we have love call. Okay. It's not just a business call. This is someone who is in that deeply loving energy, male or female energy, sharing, affection, expressing emotions and feelings towards you.  All right. And here you go. The chariot, cancer energy. This deeply loving person could be whatever sign they are coming forward, affectionate as in a water sign. Okay. So there could be a water sign. So time to go, get that GPS set and take off. You know where you're going and how to get there. Now it's time to go. Don't waste any more time. Just do it. Go after what you want. No hesitation. Blockages are now being removed for some of you highly logical male or female. This could be an air sign, Gemini Libre Aquarius, but the blockages are being removed, which means that there's no traffic. There's no stops. You're just free to go. So the time and this person as well, everything is lifting is what I feel like is happening here for love. Beautiful.  So it's lovely. I love it. Great, great, great reading. I can't wait to get this out to you guys. All right. So I'm going to leave that there for you and I will see you guys tomorrow. Also don't forget, go over to my other channel, Moon Pitero. There's a collective reading that I already posted up there. And yeah, then you get some double messages. All right, you guys see you tomorrow. Bye.