["&4d1463concatenates stringsstring.Concat methodconcats 3 stringsconcats four stringsconcatenates 5 stringsconcats string list","aA9BfEEABDAeBACfACADAABa(C]CE| G74G745}`C 474}*C 8646}*B+CC 46868646868}XCCP884+CC 4666}XCEC.BXCCP84+C*CE.BC 684964}XCECE+3B","String.Concat."," With concat, strings are merged (combined). It is possible to concatenate 2 or more strings with several syntax forms.","Plus."," We use the plus operator and the string.Concat method. The plus compiles into string.Concat. Another option is string.Join. ","The main reason to use \"+\" instead of string.Concat is readability. Both expressions will compile into the same code.","An example."," We concatenate 2 strings with plus. We then use the string.Concat method. The C# compiler converts the plus operator into string.Concat. ","However: ","We concat a string literal (\"string1\") with a string variable (s1). The reference is stored in the s2 local.","String Literal ","string-literal","Two strings."," The performance of combining 2 strings with plus or string.Concat is excellent. Using other methods, such as StringBuilder, for 2 strings is slower. ","This example shows combines 2 strings with string.Concat. It is the same as using plus.","Three strings."," Here we use the same string.Concat or plus operator. My testing shows this has good performance and is simpler than other methods such as string.Format. ","You can use the + in any order, just like method arguments\u2014which essentially is what the operands become.","Add to start."," Adding to the start is called prepending. You can append strings by using + or string.Concat. But for many appends in a row, consider StringBuilder. ","StringBuilder ","stringbuilder","Four strings."," Here we start seeing performance changes. For four strings, it is fastest to add them all in a single statement, with string.Concat or the plus operator. ","The string.Format method also becomes more usable appending many strings here. But it has worse performance.","We start considering StringBuilder when multiple strings are encountered. It has much worse performance at this level.","Benchmark."," For fewer than four strings, using string.Concat or + is fast and also clearest to read. But there are more options for four strings. ","To prevent the compiler from solving the program before it is run, I built up one of the strings at runtime.","So: ","At four strings of short lengths, using string.Concat or the plus operator + on all the strings in one statement is fastest.","Five strings."," We can concat 5 strings. Here the performance radically changes. Looking into the intermediate language, we see a new overload of string.Concat is being used. ","Part A uses two statements to combine the strings. Part B uses a single statement. And part C uses StringBuilder.","I was surprised to find that part A is the fastest. Using string.Concat on all strings at once is suddenly not the best.","A question."," Why is concatenating 5 strings different? In the .NET Framework, there are Concat methods that accept between 2 and 4 parameters. And there is one that accepts an array. ","When you concat 5 strings, the array overload method is used. Looking into IL Disassembler, we see a list of many Concat methods.","IL Disassembler ","il-disassembler","However: ","There isn't one with 5 arguments. When 5 arguments are needed, the params version is used.","Internal implementation."," The internals use ConcatArray, which seems to have a different implementation. This overload doesn't perform as well as the ones with fewer parameters. ","Params ","params","Benchmark 2."," It is fastest to first concat four strings, then concat that with more strings. Instead of combining all strings at once, it is faster to combine four in a statement. ","This won't result in needing the ConcatArray internal method. Understanding exactly how strings are concatenated is extremely useful.","The performance difference between four concats at once and five concats at once is relevant.","Guidelines."," For fewer than 5 strings, use one statement. This statement should directly use string.Concat or plus. But for 5 or more strings, use multiple statements of 4 strings at once. ","This is appropriate for when you have a known number of strings, not an unknown or perhaps large number of strings.","Performance degradation."," If you have a loop or could have many more than 5 strings, use StringBuilder. This may perform worse, but it will prevent edge cases from causing problems. ","MSDN provides information on the string.Concat overloads. Look at the links to the methods that accept arrays and those that don't.","String.Concat Method: MSDN ","https://msdn.microsoft.com/en-us/library/system.string.concat.aspx","List."," We create a List instance and add 3 string literals to it. We can pass the List variable reference to the string.Concat method. It will concatenate all the strings with no separator. ","List ","list","The string.Concat method here is equivalent to the string.Join method invocation with an empty separator.","Notes, implementation."," Should we use string.Concat or string.Join? The implementations in .NET 4.0 are the same except string.Join repeatedly appends the separator. ","Appending an empty string is fast, but not doing so is even faster, so the string.Concat method would be superior here.","Join ","string-join","The string.Concat method in the .NET Framework 4.0 has an overload that receives an IEnumerable collection of type string.","IEnumerable ","ienumerable","A summary."," Strings are frequently combined (concatenated). The benchmarks here give some data data points about what statements are most efficient.","In many programs,"," you will append or concat strings. The string.Format method is an alternative. String interpolation can also be used. ","String Interpolation ","string-interpolation"]

ONHUYHHNDNQNbNJNAH{HON%O{YHOON9CN_ a NqNP reference.HOON{OIt poNzsNjthe literal.HOOYNPY s1NyYUNP2UY;YHHOON9Add another NPNjthe start.HOOYNPY s2NyYUNP1UY Y+Y s1;HOON's2);HO}H}HHYHHNP1NP2YHHNDNQNbNJNAH{HON%O{HHOONP s1NyYUNP2UY;HOONP s2NyYNP.ConcatY(YUNP1UY, s1);HOON's2);HO}H}HHYHHNP1NP2YHHNDNQNbNJNAH{HON%O{HOONP s1NyYUNP1UY;HOONP s2NyYUNP2UY;YHHOON{Combine 3 NPs.HOOYNP s3Nys1N}s2N}YUNP3UY;YHHOON{Na the NMNjthe screen.HOOYN's3);HO}H}HHYHHNP1NP2NP3YHHNDNQ;HNDNQ.TextNbNJNAH{HON%O{HOONP s1NyYUNP1UY;YHOON{A.HOON{Concat 4 NPs, eachNpa separate statement.HOOY{HOOONP s2NyYUNP1UYN}s1;HOOOs2 += YUNP2UY;HOOOs2 += s1;HOOON's2);HOO}YHOON{B.HOON{Concat 4 NPs,Npone statement.HOOY{HOOONP s2NyNP.Concat(YUNP1UY,HOOOOs1,HOOOOYUNP2UY,HOOOOs1);HOOON's2);HOO}YHOON{C.HOON{Concat 4 NPs NDa N|mat NP.HOOY{HOOONP s2NyNP.Format(YUNP1{0}NP2{0}UY,HOOOOs1);HOOON's2);HOO}YHOON{D.HOON{Concat 4 NPs, three at a time then one.HOOY{HOOONP s2NyYUNP1UYN}s1N}YUNP2UY;HOOOs2 += s1;HOOON's2);HOO}YHOON{E.HOON{Concat 4 NPs, one at a time with NON6.HOOY{HOOONP s2NyNqNON6(YUNP1UY).ANe(HOOOOs1).ANe(YUNP2UY).ANe(s1).ToNO();HOOON's2);HOO}HOON5.NuLine();HO}H}HHYHHNP1NP1NP2NP1HNP1NP1NP2NP1HNP1NP1NP2NP1HNP1NP1NP2NP1HNP1NP1NP2NP1YNO Concat perN|mance, 4 NPsYHHA: Y 557 msY (Concat 4 NPs, 1 at a time)HB: Y 281 msY (Concat 4 NPs, all at once)HC: Y1342 msY (Concat 4 NPs with a N|mat NP)HD: Y 421 msY (Concat 4 NPs, 3 at a timeNVthen 1)HE: Y 812 msY (Concat 4 NPs, 1 at a time with NON6)YHHNDNQ;HNDNQ.TextNbNJNAH{HON%O{HOONP s1NyYUNP1UY;YHOON{A.HOON{Concat 5 NPsNptwo statements.HOOY{HOOONP s2 =HOOOOs1 +HOOOOUNP1U +HOOOOs1 +HOOOOUNP2U;HOOOs2 += s1;HOOON's2);HOO}YHOON{B.HOON{Concat 5 NPsNpone statement.HOOY{HOOONP s2 =HOOOOs1 +HOOOOUNP1U +HOOOOs1 +HOOOOUNP2U +HOOOOs1;HOOON's2);HOO}YHOON{C.HOON{Concat 5 NPsNpNON6.HOOY{HOOONP s2NyNqNON6(s1).ANe(HOOOOUNP1U).ANe(s1).ANe(HOOOOUNP2U).ANe(s1).ToNO();HOOON's2);HOO}HOON5.NuLine();HO}H}HHYHHNP1NP1NP1NP2NP1HNP1NP1NP1NP2NP1HNP1NP1NP1NP2NP1YNO Concat perN|mance, 5 NPsYHHA: Y484 msY (Concat 5 NPsNptwo statements)HB: Y686 msY (Concat 5 NPsNpone statement)HC: Y889 msY (Concat 5 NPsNpNON6)YHHNDNQ;HN HNJNAH{HON%O{YHOON{CN_ Nn of three NPs.HOOYvar NnNyNqNo<NP>();HOONn.NvYUcatUY);HOONn.NvYUdogUY);HOONn.NvYUperlsUY);YHHOON{Concat the Nn.HOOYNP concatNyYNP.ConcatY(Nn);HOON'concat);YHHOON{Join the Nn.HOOYNP joinNyNP.Join(YUUY, Nn);HOON'join);HO}H}HHYHHcatdogperlsHcatdogperlsY

$/9j/2wCE?gGBgYGBggGBggMCAcIDA4KCAgKDhANDQ4NDRARDA4NDQ4MEQ8SExQTEg8YGBoaGBgjIiIiIycnJycnJycnJycB.gI.oJCw@Cw4LDQsOEQ4ODg4REw0NDg0NExgRDw8PDxEYFhcUFBQXFhoaGBgaGiEhICEhJycnJycnJycnJ:BABEIAG0A+QMAIgABEQECEQH/xABR?ADAQEBAQE)))?QIDBAUGBx?AgEDAgQEBAQFAwU)?AECAxESBCEiMUFRBRNhcRQyUoEjQpGxBjOhwdEVU6JicoPh8f/a?wD?AB?I?D8A/fw)))))AQg?EFxDFcQCuK47gIAuFygEAxlAIBhcYC?G?Aw)))))))EACABAIVxDFcVxXFcm47iuIBCuO4XJuO40FyrjuRcLlpCyLuMi4XHYMi7hci47hYakWAhgUmM?RQ)))))CABCAQCEACYyWSSDEAgEwEADsQ2FwuIBiuO4XJApE3KuFyRliuVcaZFykBSZdykQihM0iyhiGSaI?AG)ACABDEFxXALjAQBYVyalRU4uT+xyvU1L7PbsjTVp+Wmvyu7OSFTGSl26GsILE4dTXmqqhk4xst1+51R1ErNdejLp1JTkZyrUq0bfLLpcunTweWW1iJJW5G@Tco2nnFc2v7o0k+F2M85GkuTJjFxuQkayyclZ2ROTC7BFtDsSrsXQiTdyyZCsEuRDlInzGUmjOXMDGTaV0/sak1JOMGC5IdxJ7lPddm0c3xNT0N6M5Ti8u5w1HxS92ehH5V7HRKyS25nJp5TlOV5NqPT3Ir1JU4KUOdzn+Mq+n6HXP+XL2f7HkKRpSipL2M9bVqUpxxm0pLkvQ9ilWVSk5/mS/qc/xlXrb9Dm02o8movp5SL1cl8RPe62s/sgVNKTTV01dBLWSlRjUjNxlF4yS633Uv6HpaapOrByn3Nm1FOT5Ew+X7I59bUcVCH1f2OdLKVltc9Vz8qjlJ5OK5vq2W9Q78JUarObTrzJr9WdkqcbcK9ipKKdrGdGVWpFzuKM3dGhnCMrrY0IfodEL2379RCAQAwEBw6jxPS6fULSzzlWxzxhCU8Y/VLFA2lu3YzlK27djtFkc+m1VLWUIamg35c747b7Nxe3uaFKzSa5MzdTqia+p8nHhyyv17GEFRr328uXa9xaqE6mOC7/2PN1mroaBL4nLKznwxcko3Ud3HlvKxrwRhlKWPqefWrVXVawzguSa9PqPQqQdKWN0zbTVHlj0PN0lV6tT8qE+B4yzi4tNpS5S9GelQpOHFIG4uHNSuFBzdRSjFxV+v+TqAm5jqKqpRUnfnbYxa9T0HOyuWma3OSnU83LBPh+bo19mdEMrcQ2lbYmnN8rMpkTKMazlFSnZ4xVxWXXaw5yduVx25kNsKUnUSnFPHu9gnTlfhWxO3fZmTycU0mWpLbu1cZFOnK+UvYx1upp6aCzbjntGS5c+5Dsnu7LuVk1BzkrW6HNVfHL3Z6UflXseVHOrXnp4wl5kFlLbaz5cXLc9HSwqwpvzb5X732sjok4uKakn0OPSZqrJOEkpdbbKxrU/lz/7X+x5WitLUwjzXEv+LPQ1kK1Sko0L5Zd+ln7Hmz0+p00Jaia8qFNOUqmS2Vud7mtJxUJXkl7sjW+Z8RSlGlOUaTUm1FtPe9i9TRenquP5OcPYyyKo+M+G+Jw0+khKp8RWX4GdOUcnCLyllJWa4Wa/Aaz/AG/+Uf8AJVKtCcfmV1tzOavpZqeVCEpwlusU5Yv6Xbse1D5I+yOTxCLtTn2un9zsiuFeiQqlONSDhNHLGWMkfQVqTqUXT5NpW91ucGkqKFRZcrWudtVLaV+X9Tkejqwf1RNqdCduJGk8W8kzm0/mxg6Uqb58/wD2VE1w9SIwldbGxm2ddOO3EhCsUIk0sS7Hzvi2j8Q1Oqr1dPpllCMYabUUq3lVeXFl0klL2PoKvJEySvHEiosli+S32MakFJYva2+xz6GnqqejpQ1jjLUW/Ex9/T0NmbWJxNY7JIl07JLsYWPL/iDS6nV+GVdPo6PnVqrhHnGNlGSnzm19Nj2cQxHK0o4/YydG+xzaZT8iEqlPyqmKzhdNp+rjdM3sJXv9y6fykRm9l6FxppbCOTxKnXqUIw09N1JZrlJRaS35yaO8ByWScWU6d0/U87RUtVRrVoVYfhSeUKuScn/0vrt6ncXYzq9PcS4I2W/uCp4oZlqo1JaarGlHKcoSjGN0t2joGD3TXcrC6scmhhVhpacK8MKkV8t0/wBrm9jQRKVkl9hqFkl2M3Y8/wAR089VPT0/LdSlk/NeUVZNY35p+p3ztmu/YVJbP3IklLhfL/BE4qXC+T/seX4To9bpa+o+K4oWhCjUuuKMMunNfc9YoC4RUViv6hCmoRxV7LuFjh8a0MvEfC9TooVPLqVo8Em7LKLUld77N7P0PQQSgpWKluinC8Wu6t+p8fpNJ/EPxfg/m6aOn0+hiqFWcalCreMIr8SGUc4eZyai2/br9mYUYKUcutzciEbIdGninu3e3MBgBZsArruD5MhchXE2a?DG)JxUvUShG/IoAsLYQrFCADCvOUPLjGSjm+qb/YNNUlVp5Stza9HbqjaUIT+eKl22uNRUUsVb0RWSxtbfuYqnPzXPLht8v6EeXHfbmZ6h+RQnUh+Wz39zcUoxmnGSUo9nuiVZNbci5wbhJRdm00n2b6nJpNRVr1J5pYYqVPu0292dYlTpxk5xisvqSV2vcoqTTd0rLsTRpzhDGpLOV3xd7sRzaWT1FJyq2k85R7bJ+/odR8/4dqasf4l8Q8OjJ/CwpqtCnaKUZWpQ4cIx2673d297WShzili1dyasKpdVKbvwvKLXdu1n9rM99JW9iK8/Ko1Kl0sYt3lyul1LksouN3yttzXseb4Hql4r4TR1daH89z/Dm80sZuHOy+m4KSUkmvX7Iud7OEdpOLs+ia/+m+h1FTUOpm/lx6WfFHLudZ5Pj9eXh+geo0ijTrVK1Clna38yrGnd97KXc9DQ13qtFptV8rr0oVXG97ZxUrXsglOMqjSXRMzoKUF5VSWco3bl3Tbtz7FSpq0sVxWfPlc59K6sqlTeOMJOErXvdWa/dhPUy/1ejovyVNNVrc/oqUoLb/yHVGlTg+CEY5byxSV/ewRceIJU3KcZRdlBvLfnsAzxv4b1uo1+lnV1E3N/hyh3SqUo1sX0dnO3Ll67vt8Y1E9J4ZqtVTfFQpur6tQ4pRT6XW1+hKmnDP0b/QqM04eZbazf6E0NVVqaiMMoyp3lHK2N+2O93+h3uKt6HD4S4anRUdVKnHzJ5Syssr5OPOy3segaSnGaUoraxGlhONO9SWeTyXs1y3IjTjD5UWACsdFg?AYCxXYY)AB:9k=%iVBORw0KG;)NSUhEUg?AIE?AB1BAM?ACbjZ9s)MFBMVEX:/+Q8Njf:e19+bg+vPt:qb8tzv/fnH+Ouv9OLW/fPz/frj:j7:6g8t3v:uqRW+6)iklEQVR42u3VsQ1AQBiG4VvhotKJxhYSG1hBcyswguiMoFXpFBoDKCygVVqB+Ks7uUpF8r71l6f9lL9MWwWxlPunCAgICAgICAgICAifENLjbjduhbYz3hZpVq1+WyxFCAgICAg/ECZpLN06exr2UvLYbNLK8yIgICAgICAgICB8WKhqq+aUBv/0AqZkjLrkiMRY)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?AMs?ADhCAM?ABRErFR)MFBMVEX::8+fr:P304+325/D69Pj26vH57/SjD2a7VY7Ogqz74OzYpsDjzNbivM/y2OTrIiD8?ADWUlEQVR4XuzczWrDMBBFYS3v/Eh+/7ctpQ3BGQo4RIpTn1ndnflWPpDgJskiwiT9ORURXucWkb+zR4zfmRHbbbaHk2S9d5O0n9pPr3P0nnVm77fnemuSfA/wOveWvFtGtYxnLFYAhy35bYl5Vy193rVmNk0iPVrMpkmk1iIWWnq/oAWL+UKL+VSLtNAivd+CJXOhxf0/vStPa8Fi0ySmYqFh3mTBQsPQMFjSL9swNAwNQ8PQMFjcF1qchsHy0nMa5tnDQsPMtRgNs8CCxfNjG4aGweK20OJGw2ChYWiYM1mwJA1Dw9AwNMwVLFjMFlrMaBgsNAwNcxYLDWM0zCELFhpm2xY2zBg0zAUtORZaMmkYLK88u27D0DBYaBgaBsugYWgYGoaGuYIFi69umNFXvl9oGBrmFUfDYKFhaBgsNMzy9wsNcznLR3cyDYPFVlpMNAwWGubIf+BzasPQMFjO+3slDSNlROjnfD+tTNtPL1P3WS2Ssvd+e8Juls/DH/xofLXU+fwX/KulAuq02zz4Bf8vdukgBYIYhILo33QoG03uf9sRIX2CARLwAX9tgfqf1lprrbXWWluxKY1IQzl6cpaKhrvHo9MZm5KTfAERgKk4ZZ3fYgYYKIWBxQR8GMwvxUjj+BYPMIGSJpheyDVMSQN4FYDrbNOjWty/w2Ukge88QjIwHa9aNoNFIiC+F1vVwmUtLzhY7fO1xJUtTnpr7UtlStz3Y4vkUavyADYccJ3OSWgjrdpQ0aRgz20tBtSiLYz0Vsr9RoRu0VprrbXWWvu1W3crCEJBFIXb8/v+bxxKJGphDXQYbc/VRjjAd+XS+UxEcjfjxdw+BJBHM6YxwGLzhYj4MvPdVN0+BJAfzCEW+erCnhZ8dWHtLCJFCzDAYlG0WLSzqBUtaie3ZBYtme0spkWL6QUstNCSWbREtrOIFC1AC0v/hmHDRBYtwYbpY3EvWpwN08tCCy1Rbpj4u4ahhQ2T5YbJCzQMG8ZbWdgwtNBiUbQYG+YXRwtQtMAHWNKLDZNsmD4W4CINw4ahhZZoa2HDsGHa/V+83DDeqGHYMN0sbBhaaKEFYMOc3+J+yYZxNsxPLWoGEdh08/T9lGWuHwKP78dziEV1Aqjq+ynLXD8Eng+P5u0OPSdCoM89JxE)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AP)BDCAM?ACV1Xh7)GFBMVEX::r+vixvbyJk5Lc3NzF9vGv19NhYWHPSHDN?ADzklEQVR4XuXa25KjMAwEUFoX8/9/vElmoEsIORTl3SWkHxnF9ilzsWGmq8QM0/cEMj+i9jVgnX/yLWKZf6NXBcAweIKvPMUmOnhk8xpxXEwrGqZiPPhq4nn+q+Dm7tcFY/hNa/ZHcE0wBg4Nygm+IphDG7zwaH53MIPWmvv9wQx8yXRrMOP/fIJh8ooZhoJfzdrROcahYRreUOzpsHcLCkZVAkCXsIBhbSh+GW1tVzJFtxHsDo2dYB2nSqmlJQzTwk0yJ01snQ2YR6GprNuq7gGEf7NQDApqC0MwZ2Ew2Iq6s+CtBWVxDWbNeLAVfZ4EZ4wW3j7YCoW7AwfB/ggSWHMl3oDZTgZrNgiLe5Z4n1UCVB5RXcHuZ8F1p3gH9gyus6lWSlprugs2DtvXNNEIliVskZHWA4s0oWipi63qETB7DohQSdsrC/nJX9atQu9O0tKATYaUYIU/Ey6U1KjLYbCAkEck1GsaHNv9DXgW+HAwvS5hw3seLCAkX/SBFxpuHTBeGQFm1/F3OAHmhNY/sG0VAB4iOJSBPmADBo?RgjB2QtlLxGMZ/rg7PVGsDs24OakEOe/g9TQHAZsHghuvDIIJok5BlZOk/XBPBq6zVdIm0aChSd7BOMcmN53YPJyt9jc820EOJ9afIKdBiu9EewEB106VDzXxcaCiy3vWTCmAsyOqdM8XO5oGBWMA0/DwPQmcK5EvhowUZwio8AYDJ5qMC9PbQ7C8hNI5hzFeDCWDAdniKoS4wTXu2YdDM4ZD5602ieloXiTbbF8HthKb27YPZkdnwOu70Zave+Gv8zxTPgssFRcVmWyazgVPgmMta6JPiPUFgMBtptNFBi5IFiqjX1/HJCA+iCwstuON0d6KF00FwSzbhNgYkQ2JKym1gPLRcE8M4EfbBaoWPZyAVrvxrF86zkFhq1ZTe0RewYnT+n4ijE0FKtU+f6QogzGzKwfm86Bbe5Ezt60clQQwUXUCe7UXwiMujUcALd9sF0V3G/R3oG1VesT2QUDGAsGcBy8BB1xHyyd55ftVw8Gs8VTa+mcRSJZrOJrii/OlwTTK/qT4jqGiSwlwvUnvSloItt6nPmXDXgn2CvsHOMXKqb4rOVFDg30KmBJ3vqzVtVhHVwODMJChGD+GiW3Di4Gti0YP6pWrf7xzFJKbSdLPVj/35LP6OIxfp9InOH0aJbbgnX/0dzuBgYfQLLATHjQbwTOa8a87vD7gUFdZyt0pxh99bvpWwWyzxWn92bBm63QDeNt/WdCvoq/7QT3F6sEfAUZBHwBGZjuHYBoBO0fPVuHt+o3PUI)ASUVORK5CYII=$/9j/2wBD?cHBw@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.n/wQARCABSAJgDACI?RE?hEA/8QAUw?AQUBAQE)))?AECAwUGBAcIE?CAgECAgUKBAUF))AgEDEQQSBRMGISIxQjIzQVFSYWJxcpIUI7LSc4GCorORocHh4v/a?wD?AB?I?D8A+k?QUUjstSpZex0rWPEzYj/AHKW3pDpYdaqc2s04z5CeVj09r+wy/SHiv4m3lVN+VXuhZjxz4n/AGFJouu+v61/UXum4Us1cy7dmV3bO77i/wBNwhZq5t27Mru2d33HsQDWnrCCiKDA8BBRB)?B?UB?Dl1utq0lTW2/0rHe8+qDzvW8b1upZtrvXX7CM0R/P2jd8T4emtqhJna6ddbejr8qJIZp0XDtI6stcLsaGllWXunb/cWektorWJ5TXXs23b7MfCWuiuopWJ5TXXs+3b7MfCZfo9xS+NUlL2O9dk7drM07Z8M/cehHnvRrTLbq2tloiKu1C7utpnqXC/CeghxWE5+EjHYXft9YcXhPxGEjE7F37fWKAgFYVQkmT6S62+pEorjalsZZ473+A1cnNqNLVqOXzU38t9y+puz3SdOmtSu1Xdd0L4f0nVpbUrtWx13Qva2+/wnkt2mtqhHtSViyNyTPijdjI7Refr+tf1Gp6XRHMoxGIirq+5jLaLz9f1r+o1VF03afmTGNyt2VNbRfN+m5sxjcrdlT112xIisMvkhRzJQuVMhC5U7sjjnVyaJGTBFMDgEyGRo3AomRstAxnHRA6IJJYZLELORS46EHwh07zIcS4PqdXfbbDoq96QzNlsL6Mbi312vTTV7265mcKvtFLqekaTW0Uo+9oxltvZz8ix0lWoWd9K9/Z3N3FloqdQs8yle/sbm7ig4VY9Wtq2TMTzFiflLYaD1Xcee8B0DWXxqXjCVzlc+J/D9pvUkdxZla2IjvVNrN7x/GGVrViOuVTaze8nAQCoKUUbgeJgMhkw3S7zlH8Nv8jGW0Xn6/rX9Rqel3naP4bf5GMhVZNbq8d6ysx/I1vD4zo64j0qxseHRnRVxHpVv1HsN6nBnrKjg/FtRr9Q8WzEKtbTCKuIzuX+oubFxJn2paluW+3MLu7PvM81L0NyrNuYVW7PvJEc6Fcr4kkVyNkI2TJ37ys4nxRNFVme1Y3m0/5+k6IcoOI8KnU3pbzJlZlYeJ8ER6iTT1VzZHNnCR2vq+Ek01NU2Rzpwkdpvi+Ey2r4lq9S0u7vt9Cx1IvyUuuj2vtl2odpZZhpWJ8Mx6jt4r+G0+japa0WX2rXG1c9TZ37vKKzo9p53vdMYWI2x85Llnrs0tk8pa4jsp+4uWeqzSWTFS1xDbU/ca+XmRmZCIHwkyU3VBTdUFXr+HRq4jLyjLGI9MHFpuj1STE2PNnwwuINNsJIQkjV2qmxbGiCWNbaqbFsaI+EhrrhIhVWFVeqIjuU6kgFQm2nGzZOF3yKAoERAOKfjept0+jayp5Rt6rujvxO4uDm1ekr1VcVW52b1acdW7HoJKWVbK2eMpDKzL7iShlWytnjKQysy9/UeSO1+pfLS9jt6Z3TLFzpOjWruxLryln02dU/Z5R6DptFp9NGKakr+KFy/wB89o6S1u4w2NtNa1x7Td/2lvdxp8baK1rjws3XP2lJw7g1WhmXV3ssZNsz3RifUp2WKdswRMpWzc7tLvO6Z8RWTe7vL2NumfEVzKN64Ot0IGQlhokmhokj3SQ33rUjWPOFWM/9E8qZDj2rmbIoWezX5X1/+Tq01POshfR5TfI69NRzrISO7ym+RBEXcT1OfDH+iJBoq9XpaJr01U7myq4j1y2MyxQ6TitWlohKa99rdbu3dn1bY8KkPDtPffq67YreVixWaYVsLG7JY3U7obf+VTUv5S7sbp9pizup3Q2/8qmpfyl3Y3T7THoCITqg5UJdpnWYzTOMhB+0dgXAzJFLDRwCjRuRAFAQQ))QbMDxBRckMqRsh04E2joYfDHHKGTu6P3anU22NMV1tY/X3y0bvQsG32jdp006p6ZmUnEyu3cdVGrspmZScTK7dxQ6XgOkpxlOa3x932F4lcLEQqwqx3RC4gkhR2CO297Jy7M31ENuossnLszfUIOAUgIMiCgAgg)))))gCgAo0BwCgIAo)CC)))H/9k=%iVBORw0KG;)NSUhEUg?AJg?ABZCAM?AD1qB0C)GFBMVEX:/+vr6/Nzc1kZGSNjY3k5OQxMTE?ABgpITo?ADeUlEQVR4Xu1Z23YcIQxbX/n/P273lMYJRSilM4d5qB5DwAIJe7y8NqEi+noeIttPpD6S1xvyMGLZOvKGACqyu19pHTccmfwyyR41L2JGJuwunbEz224jVlv2bWJ4/j4USHGlx454JO66la3g/3Ytr82w0ZAU0hGUWc2+x2ItpolTuZpu5pT/vndzfpSvM3BkMakbcQSGlPTDpTmBksRi9wMoedxiAZQ8bjFFSnqd4xFIKTm3mBwnFnPvxek0ZnOJ83U6jcmOxRTUUj5JKbFBMu34Tdi18JVBSJ8LG7cQz7cW8ir0SfVnhEFJbQv4JABMwlEUmkU1Fx20Ex2UlIZR4SsAcqJWCa5th8Gt4jQWpSxEjLNg42azcUEiYGJ1J62jdaQV/EuOMTMcoI2wfp1cVFWMtwkyH4/1PJEYhLdBBxsJhH2OolkDa2KAL0uvNicWU0ktZh2MLVd21AKzukG8IlDtsqmuiAk4Cf8uMVlZGIfAMfogTCKXERM8tCDmaBIpHNSLupB6qaXOhwRuBnqR98K4SkNiiebYdxsGZ8TIdw2Y6JsW4140EhsO+lTJwALggsZPFLsf6JxcAKJUsk5Htog5UB9YjKY7fqKcWAlGBCAWo5d2h1hyAbjF+IlyYuOY86zJLcZPFBNLsLL+lQC8YeEFhKcLGcNzAXhPzG83/zLxCr+RXoNITgqIL+LYoOReBc+9gmWLOLUqEGDfYryAkGzhWIB7LRYL74eZ6WUW4+mVe5/Hu99izvZ1v8UE0y4lOfwKi/GCpZA2FeAmi/FRLsC+xfjt5mF4+8AtRkLvbAtflssspmA2HlQNLEBuZxV+u2vQkRSmSADjku9X8E;Z?llBLjkvM8ZVjIJA81VEojJxYV?opQIiZZgLX47888BcXbjBrBbIeI2b0fVYJL/QbqaKjlLcIoeK+INYvUKgL8ErLoO+znJi2AezMCzJYrJA1pInfLLCUtVMcsgQZEYsNprxHVSZXFS7rLGA63lvBZGox08lOU8ltLwNAZulokcjP3AO3gFLUypMYVrwGhH8cuC/X6BHNg1Rw+Vgxnb/ViZUrR0R/a2OI+i/2kahvvI6j+oHD4N/n53H+pX+/BTxvsfbfYhst4KPQznufpddnwU97n/bgT81i9lQl83nZ9XnpItSH78x4ACnLNoPJcQ0B9HiWALhAzR98s0wlubKPew)BJRU5Er@ggg==%iVBORw0KG;)NSUhEUg?AIw?ABpCAM?ADflzs9)VFBMVEX::2+fju9PHy9/X0+Pbx9vTo8Ozj7ejZ5uDP4tmwz8Dd6uTL3dTV49x8sJe208Wuzr/P39drpoq61chopIecw7CSvahgn4F1rJFjoYOAsppyqo9IgRfD?ACtElEQVR4Xu3XyVKEMBSF4cxh7Hn2/d9TrtE+VUhTaJrcLPIvLGXjJyegiq/0ZfPIoIBRt2sOBYzLCePzwZiA+bgwtvnBaNES5iylYUlrLbffGGnlF+YiteJKNyPMWUjNkh0wu18YprTNCCM1PwZpZfLBmJwwumAKpmAKpmCSVzAFUzAF47oQvlgCcEMrYtxfMBboVTBtTpguG4wfDCoXjCXQNMb3g6/3Iwo1Bvlq3/Wti8aIfdfVwFCghtw8BnP3Jhbj.EMLMjNYhSAdSyGFO43Zk+KvuoJs39iTLhQDT0xNSm86wM7DiPCww0MoA6fvD7A6ueOtKSPxVSkGGPa502vCTuD8T9YQ8xYDDHUGENr+Oc362cw9LNYQRHGRmJoJz/GYBwoxxgcLmepeEwYov4/pkPxmDCEeRNGxGIsTTJ/ZtJhaPbqH08T2AqAaAzt5Be+ZwxhzOjR7u3bMEG16A2MWSqBlx6qojHYff53E2YhJy68GVMBA820RVjAoXkTBqz5v2eQaseXXRU2da7831QwBbNmUjapMPK4na1pds0lFcadrgtKhTlkhPH5YIxoCXM/ve5wSIXRAbNTbjLvvFKXK3VOgJEVYRqpJ7PWmPPTsjJG2m+MsFMpZRUsqTBbIScyRmhYEmJeBEsSTAvMjCUl5jhv4cfAwo+BhR8DSzKMUMBMWh4yIeblTE2wWJEQo19gtsGihGC+M7A4wYyBZaPA4JsJG/HfGVj4McfReeF66cGygYURc8RG3BicF34Mzgs/BueFGwOLEvwYbMSPgYUbsx2dF14MLPyYY4eNuDH3xwGW5BhkFDmw0SLMppls20S0o84nWJZhEgQLP+bmxTLMx/qWUy8WYjbX+7pdb5VYlFau7uq12g8NH71YilHGGLlKhpJieUZbtWbWavGH5MqJuEqfDRAN8iKPPjs)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AMg?ABJCAM?ABPapnR)MFBMVEX::9amn+z879o6Lx:rj:T/MTH95OP/9PT8ubj/?Dj0cTR/+3b6drx9O/W9ORYTpHN?AEfklEQVR4XtWa23KzOgyF0cFHkvT933Y3wa4QQYPr/RPqdUenhnwjLUUSmYYRs6tinqaQiACAvoVhIAp3q3KOHwmyFsQhMITi5pgf5PNWfoho3ETMHARDBGNxOGZOeU+kAqgOMLyFD4jC3+TIuAZRAWT2u+iewkUcjr8vJa+Alg+PSAQ52iCPbIniBT53yyVUjHDALiCYTflwFQcpSyiZFqH8F0g0R/TCcQjinOOV16HKX0HiKocKCDTB18sC/yVOCwk+XberZ/Vnwt+AxGIHd1vfLIDUuw+IdUBQAtJxSNstVhL6oNVZZ1bqSUcqkSqhkkLuPwhSL4ttYzu9HEKpZpowf84iTmc7TD1ej9IjsMq5HKTDdq5Uu+fTEgG8qh2lWAF4Ub0MiPM832/O8XL9OuLLiSOL0K9AgiSQAYI7cwJv5gTAdbSdThFauqdJnaF4nO19XrdB3hs69HkrCG8pwuwrCDMjGF2Dne19XhcQjZjf5p0AeUc+bUCYudzb7fYPEA+yferyugnij8MhoZN7O2YuaTszP4RDRKd43W4TCkd9VFJjCxHIdeQfEHeTdhT5sR/DeIrXBUTHitSYIBwwF+ZINURUQJ4cTkCkkgPGZ7mrIU1lU+LcnVYq1EAbpQ6vC2K+qz9XDj+r707d5jxju/JF5YC707cmSdfcIGrxup1ZBVzTwdf+V04J3eKmAgA1VYx7C/KBsMXrZvFNe2MCGN3qvC4L9ebelxAKSNq.AtIaPG6NdnAbpTibu3TIOWvRf6+sbOA6LWBLd/mdVcDonvfec82YToGkTgJogkScoPgf/Xwu3XsfabxqjDUI8JB+4/ll9zta/4WFtWn4Eahxes3xZF8Vk7X1D5ajbLXHCFXgfHYg2y3ZaeEcEiZz/BlPJ61oZLEbw2I0laZg5M9sTbOxsyq2ixCTFTQhGP7hBzZ6c9bj/iwCaz0Im7RDwi8FHrHXL2bOzIZPKw0lAobkMTRSQDVZOa7utj2veTBFypJAXDrFbGHH3njAOtlYersYv/Jbo5CiZ6E76DKp7cSAMcB6e/hNQjYGPptxWE7BGGzLZTqSyfM6y17eA8pKmjVDpmLe3swizZDfw+vsz5ssl5eN7aDeCDsWHueM68frYgdiwlpLcTYuWU7a15vX8eG9i3bwYET5vWmJ6h1XfsB/8ndXBdIf96et5vrAGl37RVe7wexvY7Xet12YejYqF/odfu/U6NrJx3uxlPhBK8b8YMO117rdVmr6OkpjeR14RaSKFv0Tte2nwr/lt7pgY9WrzbYKQikYLn2Qq+L9JYqeOl25zsv5sTy3gqNbvyDXu/9vY4WfsLr/fTtIwn2e91umPvp+0nwb3pdxBoFwQL5q163UchvIYBSOMHrZ/8Q97XMInhKZkRLnV4fTLbXB5M9HI8lu/kbTHYdHU66vY5+zMyyB57BZM87Y8j+oe+YAZF+geWt10gOcYvqUpleAul6aCxfGO/XB+CwRrUBODrmG4/TmCDTBGsMiqM1V1J1vVDgNJSYy0yzCJGIEH8H8R86J7+C+8H8W)ABJRU5Er@ggg==!G%iVBORw0KG;)NSUhEUg?AL8)+CAM?ABN2DpJ)pVBMVEX:/+xptbq8/SGc8PQyuXo8vP0+Pn5+/zl4vHv9vf9/v75+PyTgsfw9vecjszr9PXs6vXf2u3y9/jp8vPr8/TBud7Y0+r4+/vs9PWnmtHt9PXIweL5/Pz+:/8/f36/Pz3+/vx9/j2+vvu9fbq8vT1+vry+Pjz8fjv9/ft9fb3+vv2+/u5r9n4/Pz1+frz+fnx9vf4+/zu9Pbz+Pn+:7p8fP6+/xQ2OjO?ACsUlEQVR4Xu2Yx47cMBAFH0nlrMk5bQ7O4f8/zcJ650FtEPBRbUN1rwIFbs+qBQmSYG6Mc5Ux2yAB9ofdx0ltV2l6H8XwoyfRvjpBMW+R7aJyZadhhz0vQfQlFpUjpFogez4/deob9QVEV6JZOz9Vgt3kZvauhnUMoigRCEGyRTz5aq9qeA+iJjGn4GPeqZtbqmcQFQkp+tUPn1c29KgqEgsnMaZykmD/8jibUo1AF.eiv5Dtjk6kGyLvtpknzY2JEeQ4RPGkXUDHOLdLj5myLc902B/6j16CjJ4IumJOZBNyo5JtDyIG02AL7chiUGGThiKVQ5gsqpns1n9VEZHBP3hAe5Cz/AMnXgQT4fs9y/U1M5uDv1qgY6UpgUZOBFQNOi4u873tATQOtIAWHrGb+jEK80WHSXzS3Q4skBHSC4gwyYKcTew8noNzUBeXQQyaOJBzAYOcrwwl+bZc/5hE4msx7KOQJqR5/zDJvLkSo6OLL6S/e3JiY6EHyMnJ/UMn+ZE/sfPsu+/p+ZE4Ij8wwtBFCfyguIrgMxSLEEUJ9aOtABuQrIE0ZuYO7IG8G1KcQOiNEGRcxNZ39yoTeRGLP/7iIuDWP61JvK1ExvFXW9x22QgShNNX6zy76fU8sFrIapMNEVPLBo8lzXXNnsEUZmgyGs7lSv7w3NtOhNSNG8i7y0VosqE/BKD/QtFuXRrTRgn9rXTY03xAqI2sXCk6MSf6ewqWiFqTVT9kQfKqydGXm+ilW9L8e3U87akM+Hb1SYUIxDNCV5ckaNjdRVtBqI0IXe1LcSudg+iOZHQbOSXjCOI5kRLExDfGkFUJ7grVxC7cg2iOkHTSDMFUZD4f8+fBO8s0IE4eucCoiChj5GRkRFDFuhIyeXfSDj54h2SCGTgxHj+8fzj+cfzj+cfz/8LH8OOJIxbjtQ)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AL4?ABBCAM?ABYbu5j)MFBMVEX:/+1wv+jqv9siv/p6:W3f8zZv9gb:19v9NK/8zAP999:S:8z:8zzP+z6P/0gInF?ABg0lEQVR4XtXXy1ICURAD0H7c96D+/9/KQqkhlEKD0iTrWZzKYtJXbou2s+jvn1Q55f2mfAMOb6Ec5D6+c/ObcvOdm98qN9+5+a1w842b3wo33/6Dv2H22g3zCL+PKF/uSKDsGL8pN9+5+U25+c7Nb5Wb74R8h+ki41eYLja+Qf1k/AL1k/HF4XIg4ytMFxl/X7/z8aF+Ov6A6bqR:FTnswXa2B96LmyPZtfoH4yvsDlwMaHy4GLj/Xz8RXqJ+PD5UDGh+ni448O08XEh+lSrtUVnC6qm+ey/krGx+li4+N0sfHh7Cfj43Sx8bF+Mj5OFxkf67c8frF+jJUovzRIBr/4+kovMb5YPr/OdcrUGL9k8FG/Tw3xxbP55/o1R4hfk/m6IBbii+fyJ/JnjK+5/HWRGuJLfzG+xvh6lX89f8m3GH90ar7Ya/FrkF8y+XNhRpAvlsi3+H8fUxP5A+svYb54Hl8Uy4/zNZEvCvo4XzyRLzrhXg7zNZMvw/o6ptsQpvDnE+wJyVGQ5SG7)AElFTkSuQmCC!H%iVBORw0KG;)NSUhEUg?AIw?AB4BAM?ADS7QcC)GFBMVEX::0qHKhmbLDvs74yKT4xaH4yqr2tYUVUWgb)fUlEQVR42u3XsQmAMBgF4V9x?OCfVxAdAEdQtwg1il0fsHS8IpIsLob4OvPnKy1V7WXWb+J9pQZZpG3zkRNyowmmmBgYGBgYGBgYGBgYGA+Mn0QHTl3V+o1iYieKifLYq4gilnMYqIVBgYGBgYGBgYGBgYG5gfm3ESx0GvePshxrr29cII)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AK)AxCAM?ABqK1L5)MFBMVEX:/+zzvd8rvO/1fj1+P4xiu5tpfFbnfDg6/xIk++ZvvWLtvSmxvbV5Pvr8v3K3PnaFXRJ)1ElEQVR4Xu3W7QbEMBBG4Xcm3/3a+7/bVZRlqEI5Vs7vhIcwE+3lQbrP4/kHN2LNfbW06zcAMDTWlFnA2LDMAsbGBwaMJTqwJDqw7HRgpQNLogOdDiwHHZjowEXqflXj7r56H2hmW43AevttMIVeA+qsRyILqE4HKrxyhwG3sO1gQPt34AQ6HJgHfMxsBQ081uBrGKC7txJbAcDbjA7scOAQHGhw4DjgQBMbWMUGtswG1iw0cMsiA5dDwgLbkrJEA/rZYpb2gGMAdRMZOIETOIETOIFfGWpGTAdlDEM)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?ALs?ABECAM?ADuirSU)MFBMVEX::V7/mWn6Gi3/N6enrg4eG75/a3uLjy+v3Iycnp9vuc0eOYxtaQtMD4+Pj5/f5J+Z7p?AC2UlEQVR4XtXZ646rIBSAUfaF60Xf/22PR+xkpBurHW3x+9mIWaGkhKJOadBaq1vmkf9n78cfkB/ZG9K/hfeN9gKQf+c/audGOwGa1w03stvK7m9kx8pub2TnKrwMqq2+eN6RjLsEzsz64vWeiQjOdQ8z/AK7ruyRzsUPvsAP2aF0cOKR5uDMpXLcTqVj+yrT0niOHXnT7qe4Kk9Jdhlv+RFGWoJr7ELSnIt2OY1Fnom6tssNKSX6nbnOHsCdaleG6CP2AEQUzrVDZYcmJ2g9vGsHIjrNrn9KpUglJz9uFwz6UL1gEN+9tuc0F8+xc2nf77tfSWxY7WxamnO5fKndjOKPUZW/0g5T79iNE+gCwip/mb0AjtoNKIku5fuyh9aBXAy7sisxz636t/Mt7GHOba92RHyyh9K4ww5hzp1tpzmzuWQSTUWsPiuFHXYqwd/siHjcjlSKuGm3zy8vnWEv4Vv2ErbtJfm7+aKdIy3FG9h1Y8US9m8fuA6LI+VHsVe7sswSv6pPu2axnEz/dmW5kQ3Qu31AbuvNQbspvbKvXEfsB/DszU579cyn7Gqw3Aw7tpc0tvF927f1CEuuV7syMeOLs0e39kBTSfLbXu0WHyUqPfNdR3aZYA0txUofwV1kl13H7ax/8IlrGKg6u23XU1yVSlrr0+2soWknM27+v5BrO+9LdrFU2rQzLtso1nYB75/XQ8z5S/YSTnFV3HHg4ozM/E27nLivaq7r0Z7FC5NwC3vjsgI7sheLOEa8MbEd2ZOMz63DR+jIToQiXbbLE5/hSntByHbK0gDZLp+38rwLOIDP2pGo1mOmVe7lMT2TAWN+XcjRnmr75uCwcYMcMyIzYs7x9duDRf4Jc6LSt+ztQEmF1e1tr/Zx886/C7shuaDkoCN7gNaKkXMd2cf2TMpBP3ZJY4JqN5pe7GbmwEoOajsQ7N/MzZuMMQBu18NUmocEda/G1fXtP47JaK+yvhpR)AElFTkSuQmCC!J%iVBORw0KG;)NSUhEUg?AIw?AB4BAM?ADS7QcC)GFBMVEX::0ctuZsLL4pOe8y8z4oej4qunCz9FAYxXH)f0lEQVR42u3XwQ1AQBQG4YcGvAgFbCSudCCiAQcFuGhB+xJHm/+wsnGaKeC7j7mstldl@nvoi1m+lUUrDFRFTOziRYYGBgYGBgYGBgYGBiYj4yfoiNmhksUcr0mEdFT4bIkpjtFacxoogkGBgYGBgYGBgYGBgbmB6bdRZ7pNW8Oq3ex+r2t+Q)BJRU5Er@ggg==#!