navarre.ai

ClarisTalk AI · the FileMaker AI podcast

Vector Databases, Semantic search, and JSON

April 10, 2024 · 63 min · Matt Navarre and Cris Ippolite

Cris and Matt talk about Vector databases, lexical vs. semantic search (and relevance ranking), and upcoming FileMaker conferences in Europe. Matt waxes poetic about JSON and a technique for storing certain types of data in a single, flexible JSON field, rather than having individual fields for everything. Cris recommends a book called 'AI for Good' by Juan M. Lavista Ferres, William B. Weeks, and

Apple PodcastsSpotifyYouTubeAll episodes

Transcript

Transcribed by machine (whisper, large model), 14,434 words. Names and product terms are sometimes misheard; the audio is the record.

Claris Talk AI. It's another episode, Chris. Yeah, we're doing it. This is the third one together, which I'm very excited about. Getting some good feedback from everybody, hearing from all our friends in the Claris community about learning new things with AI. And we're happy to be here to chat with folks about that. Yep, I'm learning along with everybody. So vector databases, that's where we said where we're going to go to today. Yep, that's a big one. And I think this is a particularly important piece considering, and frankly, we've been progressing through the process of communicating with language models. Of course, we started off with prompt templates. That's really where the communication starts.

And part of prompt templates is including context. We spent a lot of time in our previous episode talking about context. And so if anybody missed that, it's probably a good one to talk about. And we're sort of still, in the land of context when we talk about vector databases, because one of the primary uses of vector databases, which we'll get into what these things are in a second, is to retrieve data. But also, it is the linchpin in the chatbots. So it's how we find answers to questions and present those to users in a conversational manner. So a lot, really, really. And I would say that Claris folks probably need to be coming back. I'm pretty familiar with semantic search pretty soon.

And that involves these vectors as well. Yeah, I want to talk about that. Anything that has the word search in it, and I broke up because search results. I've been dreaming about another version of it that uses something outside of FileMaker. Oh, Matt, I'm so glad you said that. So first of all, you want to tell everybody, I mean, it's world famous, but you want to tell everybody about your search, and then I will propose to you what I think you should do in the next generation of it. Yeah, well, I rewrote FM search results. You can get it for free at my website, navarra.training, or also FDIS, directimpactsolutions.com. Okay, it's all JSON. It's much more configurable.

It's much faster. I really pared it down a lot. And so basically what it is, it's a Google-style search you can add to your database. It's also free, by the way. You add it to your database. You configure it for any tables that you want to search. And when the user does a search in a single search bar, it shows results from every table where the database is. So if you put a date in, it only searches for tables where there's a date. If you put in a text string, it searches for that. If you put in something that looks like it's a phone number, it only searches in phone number fields. Now, would you describe... Oh, so first of all, if I remember correctly, did you not release this at the San Francisco DevCon?

This is actually... You did a session on it. It's been around for a long time. I've done sessions, right? I wrote this like over 10 years ago. But it's still... And it has a lot of really cool things in it in terms of like being really flexible. It works really hard to try to show results by ratcheting down. Well, the early version was like virtual list based. Yeah. Yep. It still is to show the results. Except the actual result thing is just JSON. So you could put it in whatever you want. So, and by the way, because I think this will tee up vectors a little bit too. This is really perfect. This, the searches that you're doing are the same type of searches that, we do in FileMaker all the time.

The fancy word for them is called lexical searches, which is really just keyword or index based searches. You enter in a term and it goes and finds a matching term. Now there is some sophistication in word indexing or the text field indexing in FileMaker where you can just put in a couple letters and then there's actually character indexes as well. But at the end of the day, you're getting back matches to your input. Is that a fair way to say it? Yes. And it's not... Fuzzy. So if you misspell a word, if you put in a date and it's one day off, if you, you know, there's something, there's some stuff I really, really want to have that's the way Google works that you cannot do in FileMaker that I can figure.

Like things like misspelling, like you said, fat fingering, or like the John versus Jonathan type searches. Actually, I have that. Oh, you do? I have a name substitution table that you can put in different languages. So yeah, Bob and Robert, you know, Peg, Margaret, it does. It's the hard ones, but also you can do them in any ethnicity of names. So what if... Okay, so here's what your... This is what your assignment is. I mean, how dare I give my fellow trainer an assignment? Your assignment is to introduce a new version of that that uses semantic search. And I can't wait to see it. And it's going to be great. So sometime this summer, let's say that. You'll have the tools at your disposal sometime this summer to make it really easy.

In the meantime, everyone listening and watching, just to remind people, we do have a YouTube version of this too, in case you like looking at a couple of handsome old men. I look forward to seeing it and hearing about it, and it's going to be a smash hit as a semantic search. But what are we talking about with semantic search? What are we talking about? Well, that is where we're doing a special type of search that is facilitated by vectors, non-lexical or keyword search, but instead a search where we find similar, similar meanings to what our search terms are. Kind of mind-blowing. Mind-blowing stuff. So it's not, well, there was this thing called the Levenstein distance that I played with a long time ago, which calculates the number of characters that are different in one word.

So if you spell it by one word letter off, it catches that, and it calculates the distance between two words. You're actually... This is old. I know, but you know what? That's a precursor to transformer technology. Yes. To transformers, to really just predictive, you know, what's the next character? What's the next word? And not to be reductive. That's, they're incredible. Like times 400 billion parameters is what they're able to do. But the keyword there is the distance, right? So what's implied in the approach that you just described and also in the modern day vector searches is the distance between words indicates their similarity. That's where we're going to end up in this discussion about vectors, but we're going to have to do a little journey to get there.

Yeah, and the Levenstein, you couldn't really use an environment because it's really, really processor intensive. And you have to sort of pre-calculate what... You could use it to compare two things, but you can't use it for a search because if you type in epilite and you put in one P, it doesn't know... Or one H. Yeah, exactly. Yeah, for Chris, right? Yeah. So it would have to like do... It can't start with like a word and make a bunch of different words that are one distance away. It can just... It can just compare the two things together. So basically you could say, oh, okay, well, I put in epilite with one P. I'm going to loop through my entire database and calculate the Levenstein distance of every single record versus what I did.

Yeah, no, that's not... Yeah, I mean, then you'd be back to doing a non-index-based search, right? You'd be doing a search like old school way, like check every single record against your search term. Now, you know what you need to make that happen is a model specifically trained on language with hundreds of billions of parameters in it to actually do that heavy lifting for you. So that is why today the discussion of vectors and vector databases is so important. It wasn't... It's not introduced as part of the language model. Boom. Certainly, you know, there are different types of distance calculations. The key part is what you said is distance. We want to zero in on that.

We'll eventually get to the point that the closer in distance two terms or phrases or sentences are, words or phrases are, I should say, the more similar they are. It's the same in your formula and it's the same in how language models are doing this. But to get there, first of all, we're entering in words, but what's actually happening behind the scenes is numbers being matched. So we should probably talk about how we get from words to numbers in the first place. Right. That process is described as embeddings. And actually, so for our friends who are... are watching us on YouTube, I'll have some visuals, but of course, we'll talk through the visuals because we don't want to leave anybody out who's in our ears.

So first of all, let's just take the use case of a chatbot where we're asking a question of some data and some answers are coming back. Okay. That's like we've talked in previous conversations about, like, let's say you go into a chatbot and you say, hey, what's our vacation policy? And we want it to... to go find out the answer to the what's our vacation policy. But here's the trick. We want it to be a really intelligent search results. We want it to find out if I... My question is what's our vacation policy? I want it to come back with answers that don't say vacation policy at all. They say stuff about paternal leave, planned time off, sick days. You know what I mean?

Like vacation, you know, stuff that even doesn't have the word vacation in it. That's really powerful stuff, right? That type of search is called a semantic search. So in order to be able to match words that do not have the same... or the phrases or questions and answers that don't have the same words or index in common, we have to convert the words into numbers. We're human. I mean, mostly I'm human. I know you're human for sure. We speak in words, right? Do you know what language computers use to talk to each other? Yeah, they speak in numbers, right? So we have to figure out a way to actually convert words to numbers. So that process is called embedding. So we actually take text data and turn it into numbers.

Now, the structure of the numbers is important, but the concept of embeddings, let's just focus on that first. So first of all, embeddings use very specifically trained language models that are called embeddings models. There used to just be like a couple out there, like a very popular one is OpenAI's ADA model. They've now updated OpenAI even has multiple different models. There's a ton of different models out there. And by the way, I should just mention, there are different embeddings models for different use cases. So what we're talking about is searching, but there's like pairing and clustering and classification and all sorts of stuff. So anyways, we won't get into the weeds on those.

So what we do is we take text and we feed it over to one of these embeddings models. And what it does is it actually turns it into numbers. So what's actually happening there, for those on YouTube, I'm actually showing some word embeddings with just two columns of numbers. And the first thing is, Matt, when we turn, so first of all, let's just talk about if we didn't use embedding models. So what we're really trying to do when we're coming up with these numbers is come up with features of a word. So let's do a little thought experiment right now. Let's pick one of these words. How about soccer? And I'm going to ask you as a human brain, give me as many features as you can about the word soccer.

Let's see. It's a sport. It's also a type of ball. It's associated with the hexagonal black and white ball. Let's see. It may be the ball made by different companies. You've got some famous players. It's the number one sport in the world outside of the US where they call it football, rightly, because you actually use your foot to play it. It makes sense. Yeah. Anyway, I shouldn't really. You're a huge lover of American football. So I'm not going to. But I get it. I get the irony. Let's see. I don't know. It rhymes with like the word sock, like what you wear on your feet. It's not the same word. So yeah, those are the type of things I could think of. So I don't know.

I think it'd be 4095 more if you want. So that's that's the whole idea. So you're a super smart dude. By the way, that was fun. That could be like a game show, by the way. You know, human human embeddings, whatever the big game show. So what so so if we left it to humans to come up with features, we would probably be in a really good case. We could come up with certainly a couple, certainly a dozen. Maybe if we really tried hard, like and spent a ton of time on it, we could come up with a hundred. But we'd get into a real long tail situation there. These models, these embedding models, these specified language models for this task have up to 4096, even more.

Really, the most common ones, like the ones we use the most at iSolutions are like 300 feature models. And I call that but for the sake of this discussion, we'll call it that, but 4096 ones are very sophisticated, too. So so what that means is these models can look at a word and extract hundreds and hundreds of features from it and stuff that is way beyond our level of comprehension. And the reason that they do that is because they will plot these. Now, you know, when we talk about plotting, everybody knows X, Y, right? X, Y is literally two. You know, it's a two dimensional graph and you can plot it in some quadrant and that's what tells us two things about the plot.

It tells us what whatever the Y descriptor is and whatever the X descriptor is, right? We all get it. We look at those every day. Imagine if you will. And for those that are on YouTube, they can see this fantastical 3D multidimensional graph. So I'll let you try to describe what we're looking at here. But it's basically just another dimension. X, Y, and Z. Yeah, many, many, many, many, so many, so many dimensions that we can actually plot all 4096 of these features. So we could with X, you could with X and Y, I mean, just be busy anyway, but you would have two features that you're plotting, right? That's, that's the important takeaway, right? If we wanted to plot all 4096, we need other dimensions.

We're no longer in a two dimensional space, right? Or three dimensional or three for that matter. It's really multidimensional, you can't, you can't really visualize that. No, it's not real. No, you can't. And that's why we use models for this task. So what, so who cares if we, if we plot these, well, here's what the fascinating thing is. Since the models are actually interpreting, extracting meaning from these words, using just in, you know, tons, huge set of parameter sets of, of language to do so, they're able to do things that as humans can't even comprehend and they're able to associate. So when I plot, like for example, for YouTube folks, we're looking at something here where we're plotting a couple of different words that have some similarity.

We see soccer plotted and rugby, and there's Chris's football down there, right? And we even see tennis down here, right? Now the, the, the location of the plot indicates that they have features in common. So for example, just to be really silly, if we took the word soccer and plotted it in a multidimensional graph, and we took the word soccer and plotted it again, they'd be at the exact same location. That means that they have the, the, the, the algorithms that are used to determine the distances. And by the way, there's many, but the, the, the algorithms, most common ones are like zero to one. Some, some of them could be like minus one. One to plus, uh, to plus one, that distance would be like one, right?

Soccer and soccer have the same exact location. But like, if you look at this graph, soccer and rug rugby are close, but they're kind of, they're kind of far away. So their distance indicates their similarity. So by looking at this, would you indicate that rugby is, is more associated with soccer or football is more associated with soccer by looking at this visual here? They're pretty close. It's yeah, but rugby for whatever reason is a bigger dot. And there you go. It's actually a little bit further, but it's also three dimension. It's kind of hard to tell. It's technically closer. We can see tennis down here, for example, is not as close as football is right.

So I think if, if to help people wrap their head around it, what we're actually doing is turning, we're using language models to extract uncomprehensible levels of meaning from words. And then we're plotting those words for the simple purpose of determining the distance. The distance then equals a similarity. It's not just words either, right? Isn't it like parts of a word? It's like a word, not a syllable per se, but like some other. Like phrases, even paragraphs for that meant. So we just talked about bigger or smaller. Yeah. We just talked about, um, uh, words and then sentences. So this is really where we get into like what the linchpin is of a chat bot.

So for those on YouTube, I'm sharing just a simple graph of some vectors where I'm showing two different phrases, two different sentences. One is hello. How are you today? And the other is, how are you doing? Those have very similar meaning, but they're not the exact same thing. So you can just tell by the, the vectors that I selected here on screen and Matt, we can tell the listeners, um, they're very close, but they're not identical. So that indicates that the distance between these two is similar. However, if we, again, same kind of thing, just to drive it home. If we use the exact same sentence, hello, how are you today? And hello, how are you today?

Those are exactly the same as we plotted in the same spot. So the whole point is we use, we go through all the. This process to figure out what the distance is we plot. And then we use a separate algorithm. So, uh, like you've heard like cosine and a language thing there too. Cause I was just thinking like, oh, look, I'm West us, you know? Well, so, so it's, you know, what's super fascinating is that a lot of these embedding models, most of them, frankly, are multilingual. So what that means is what we're actually looking at on screen here is that the phrase, this is red. And the phrase you just said it perfectly, uh, oh, it's beautiful. Nice, nice rolling.

R's those two what's indicated on the screen is that they are point. They are 92% similar. That's not really what it it's 0.9, two in distance, which means they're essentially 92% similar. So, so for translation, you, okay. Here's what the problem is with doing translations with AI. First of all, you can do it. We've had customers come to us for this and they go, yeah. Can. Can you do it? We're like, yeah, you could use chat GPT for it, but here's the problem. You would have to go manually check every single one of your translations to make sure it makes sense. Like you've run into this where you do Google translations and the person who actually speaks the language is kind of like, but isn't it better than Google translate by a ton?

Yeah, it is. It's it definitely is mostly because of the multilingual support that's built in, but here's the, here's the key. If you combine AI translations with. If you vectorize the English version, this is read and you vectorize SOS Rojo, which means we run them through those embedding models and, and come up with the features, you can then plot them on a graph and determine what their distances. So let's say you want to do AI translations. You could do like a hundred translations, give them to like English to Spanish, give them to Spanish speaking individuals to, to rate them. This is what we call human in the loop or reinforcement learning. And then you look at all those hundred and you go, well, it looks like the ones that are all five-star ratings or three-star, whatever the top rating is are 0.85 and higher.

So then we consider that to be an acceptable threshold of similarity. So then you can now automate tens of thousands of translations without having to have necessarily have a human rate them because you've already gone through that process. Now I would recommend continue to go through that process to keep the quality up, but that is the principle. One of the ways we can actually use vectors. Now, how does this actually work? From a chat bot standpoint? Well, guess what? A question and an answer have similarity, which is crazy. One way to kind of think, frankly, I think that's kind of nutty. The fact that I can ask you a question and then the answer to the question has similarity to it, that by the way, is how we can say what's our vacation policy.

And it goes in similar concepts, like plan time off and parental leave and stuff like that. Right? This one that I'm showing on screen. To just YouTube folks, uh, we'll, we'll mention it. This was an experiment that I did that I thought was really kind of amazing. Was that, um, I went on, you know, like kaggle.com. It's, uh, like where you get a bunch of data for data science work, um, anything you're thinking about doing, you can find stuff on there. So I went on there and I actually found a data set of 10,000, um, customers making a statement about a product or service that they were interested in. And then in a separate experiment, I found. Uh, companies like taglines for their product or service that they're offering.

And I thought it would be really cool to vectorize both sides of those and find matches. So what we're looking at on screen here, Matt, the, the need, this is a customer saying as a busy professional, I need a quick and healthy food option to fit my schedule. The solution or the company they were matched with was a local restaurant train chain. That offers a dedicated express menu with pre-proportioned nutritious meals for the time constrained customers. There aren't any, if we did a lexical system. Search these wouldn't match. I mean, you could also say food bars, Chris. You got me. It's convenient. It's quick. It's healthy ish. Yeah, true. So, but the idea is like, wow, humans maybe couldn't put these associations together, but we can use AI to do so.

The last one I'll, I'll share with you is a question before you continue. You say you vectorized it and we're talking about words to numbers, where does, where are the numbers stored? Are those in FileMaker? Yes. Be, well, no, great question. Thank you for that. They are stored in a very special kind of database called a vector database. So, um, if you are going to have semantic search capabilities in your database, you would have to store your vector somewhere. So in the examples I showed you, I actually have a separate database. There's some popular ones out there, um, that, um, like pine cone is probably in industry. Leader in that we use, uh, some local ones that are like some Postgres databases with, um, you know, the, uh, vector modules sort of bolted onto them, but that's a separate database.

So you would have like all your vectors stored over here because it's a different type of storage. It's a, it's a different kind of index, frankly, but if you wanted to do it in FileMaker, what you might need, it would be something like, like how are like Matt, how are container fields different than. Other fields in FileMaker, for example. Well, they can store any type of thing, uh, binary, they can store things that are encrypted. They can actually store text or they can store a PDF or a file that actually has text in it. So if you were to store 4,096, uh, vectors for an associated, like, let's say here, we're looking at job description is tech to store the vectors that represent that that's a ton of data.

And if you put it into a text field and you wanted to search it in. Index search or even numeric search, you didn't with a huge index in your, in your file. So the standard text field type storage probably wouldn't work in FileMaker, but I bet you, if you had sort of a flavor of a container field that could store that information and allow you to search in a more sophisticated manner, you could then do, you could then store your vectors inside the same database as your data. And then you'd be able to do things like semantic search search on a container field. Of course. So there has to be some connection to the, anyway, I'm cutting you off. No, no, you're, you are exactly where the brain should go.

So these would be problems, not problems. These would be things that the FileMaker platform would need to have to be able to do native semantic search. In the meantime, you can incorporate, you can, as of today, you can incorporate a semantic search into your FileMaker databases, just using your vectors stored elsewhere, but maybe someday, Matt, maybe someday really soon. Yeah. You'd have that native functionality in your platform and then guess what, someone like you could do your search. You could, that's why you're going to, well, maybe if you have that. Yeah. Well, what I've been visualizing for the next version of it for years, um, is that you'd have some sort of a trigger that when you load a record and, uh, and one time when you start your database, you would load all your data.

So your actual FileMaker data would go up to a database like Pinecone. And then anytime you make a change that would get updated and then you do a search. It actually searches in Pinecone, which knows all of your primary keys. It's doing a really, really smart search. And then it sends back a Jason blob, uh, with, uh, the results with the primary keys and the table of the, of everything. So basically it's, it would be entirely compatible with the current version of search results. It would just do the search elsewhere. So what you're saying is this might be possible to do, but have the data still be in my database. So I don't have any security concerns.

Yeah, potentially. Okay. Yeah. And, and, and I think it's fair to say that security, you should pay attention to security. Like, you know, if you, if you're using open source models, you can use an open source embedding model and you can use a local, uh, open source embedding model and a local, uh, vector store vector database. That's all inside your same box. Like all those things can happen locally. Now, what you just described though, is, is your homework assignment is to do a semantic search. I have one more wrinkle in there that I think you're going to think is pretty fascinating. It's this concept. It's called re-ranking. So re-ranking is where you, I think in the, in the context of FileMaker, it would be, you do a found set, find all the, uh, customers in Greece, right?

And we go in and we do other index. So what we do to re-rank in FileMaker is we sort, and we can get really sophisticated with up to what, like nine different sort options until finally we're in such a long tail that there's nothing that can sort in those secondary sorts. Every one of them slows it down by twice or so. Yes. Imagine though, if you could do your search in FileMaker with your lexical index keyword search, then re-rank your results semantically, not sort, but re-rank them using these semantic distances. That'd be kind of fascinating. Right? Absolutely. Again, like what you get with Google, right? You get relevance ranking. That's the key. We don't know what they're.

Great. That's a great point. It, we're, we're talking about relevance and you could try to recreate it. Yeah. And you could try to recreate relevance, but, or you could use 4,096 parameter index, you know, vectors to be able to do that for you. So that's when like the Levenstein function I talked about earlier could come in, right? It's like, okay, I found 36 results in a name table. I know your original search. I can actually loop through 36 results and do a Levenstein calculation and then rank them in order by, by the probability of the match. But. And it, and if you had like internal support in FileMaker for like some sort of like code, you could. Yeah. If you had, if you had like some sort of like cosine calculation that gave you that distance calculation, it would make it even easier.

If. Okay. So we, we did it in front of me, you and both of our listeners. You have to do it now, now, now this summer, we're going to come out with the semantic search and we're going to hold all three of us are going to hold you to it. You're going to help me because I need, I'm going to need help. Okay. I have one more question about the vector database. Why could it, maybe it's a stupid one, but I'm going to ask it. Why couldn't the vector database be stored in FileMaker since FileMaker is, you know, a database. Is it a totally fundamentally different kind or. Well, I mean, the search is different. Like we, cause our in, well, our indexing is different in FileMaker.

It's indexing. Yeah. I mean like, like literally the index is based on taking an inventory of words or phrases or characters or words in FileMaker. That's a completely different type of search instruction that we're giving the database in order to. To match and records. So it's not at all like a regular traditional relational database. Yeah. Okay. Okay. It's just, we're storing different things in searching with different indexes. Probably the shortest answer to that. So it's, it's clicking more. I like this good. So that's, that is, so what we just talked about here, we used a lot of terms just to kind of wrap it up, but we, what we were talking about are vector databases, turning words into vectors through a process called embedding.

Mm-hmm. And what you use to do the words into vectors is you use embedding models. There are a bunch of different embedding models out there. And the one pro tip I want to give folks is it's not all about, there's not just one embeddings. Like it's, you have to use the right embedding for the right job. Like that customer needs and business solutions one that I gave, that requires a very specific type of embeddings model called a pairing model. And then there's these clustering models that will help you take like sort of classify things in a different, more sophisticated manner. So just do some research folks on the different types of embedding models out there.

And I think it'll be really eye-opening as to what's possible. And then it might get you ready for, you know, well, at least Matt's, you know, FileMaker based search tool that's coming to theaters this summer. You're just going to release it locally in Greece first? No, this goes public. It's been silly. It's always been the labor of love. Yeah. By the way, when is Rome FileMaker? I believe October. I don't have the exact dates. Oh, so what do you think about showing this at Rome FileMaker week? Oh, that'd be good. So I, I, you've heard it here first, uh, two listeners Rome FileMaker week, Matt, you're planning on Rome FileMaker week.com, October 7th to 13th.

And are you planning on presenting or intending to present? I've spoken at it twice and I submitted another session all about Jason. Cause I love Jason. Um, and I've been using it more and more and finding other really cool uses. So I want to share some of the things that I've, uh, been using it for that I never even would have thought of a year ago or whatever. Talk a little bit about your love for Jason. And in case people are wondering, there is a school, there is a, a, an argument about what the correct, uh, pronunciation is. No, there's not. You are pronouncing it correctly. Yeah. Although I have Jason ingrained in my brain. I just can't stop doing it.

So the guy who invented it, he calls it Jason based on, because it was actually named after, I think his son or somebody named Jason anyway, um, even though it stands for JavaScript object notation, it was old. It's like, it's very old, but not only is it, but it's old, but at the same time, it is the absolute most important part of APIs, uh, integrating APIs and FileMaker. Why is that Matt? Um, because all API is pretty much the same. It's just, it's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.

It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex. It's a little bit more complex.