Skip to content

Add Compare tab (build comparison feature)#9543

Open
oboking wants to merge 58 commits intoPathOfBuildingCommunity:devfrom
oboking:compare-tab-feature
Open

Add Compare tab (build comparison feature)#9543
oboking wants to merge 58 commits intoPathOfBuildingCommunity:devfrom
oboking:compare-tab-feature

Conversation

@oboking
Copy link
Copy Markdown

@oboking oboking commented Mar 6, 2026

A way to address mainly:
#4402
And perhaps also include this type of thing within this feature in the future:
#7816
#8817

Description of the problem being solved:

I myself always end up with one PoB application for my actual imported character from the game, and one application for the goal PoB I'm going for, and I think it's quite annoying having to juggle both windows while trying to figure out why your build might have differences in the numbers compared to the goal PoB. Figuring out what you are missing or why your aren't as strong as you thought you would be or why something isn't behaving as intended for a build can be quite tricky to spot, and maybe something like this could aid in that.

From the view of a build creator, it feels like pointing their users to compare their character with this might remove the need for a lot of personal diagnosing. The need for going to the comment section of a guide or chat of a content creator asking for help related to their guide could perhaps be alleviated a bit with something like this.

There are probably many ways the feature could be improved, but I think it serves most of my needs pretty good.

Video of feature:

build_comparison_feature_showcase.mp4

 


Feature screenshots:

Screenshot 2026-04-13 004326

Quick overview summary of two different PoBs.

 

 

Screenshot 2026-04-03 223232

Compare two builds in terms of a metric of your choice to easily understand differences.

 

 

Screenshot 2026-04-13 004505

Compare passive skill trees.

 

 

tree_leveling

Easily manage leveling trees, tracking, while keeping your real characters tree up to date with PoB using one button.

 

 

Screenshot 2026-04-13 004604

Compare two characters sets of skill gems.

 

 

Screenshot 2026-04-13 004733

Compare the items of two characters.

 

 

items_buy

Easily buy similar items to the build you are comparing.

 

 

Screenshot 2026-04-13 005009

Compare any value in the calculations tab between the builds, so its easy to spot why a certain value is the value it is.

 

 

Screenshot 2026-04-13 005055

Compare, edit and copy two PoBs sets of configs.

 

 

Screenshot 2026-04-13 005144

See the notes of the build you are following or comparing against.

 


"Buy similar" integration to core items tab This feature has been super useful, and while it has it's place in the "Compare" tab when using PoB with two builds, people who might just import their goal PoB as the "main"/"only" build could benefit from it as well, hence it could be worth investigating bringing this feature into the regular "Items" tab.

 

Please let me know what you guys think, I've kept a lot of the trade related logic separate both for the sake of readability but also this.


Possible future improvement to the solution to the problem the "Notes" partially aims to solve

This is just an idea of a possible improvement that could be built upon the "Compare" tab in order to better let users follow guides or understand why something is one way or the other.

One thing I have seen a lot when following build guides is the "Notes" section covering things like:

  • At which level specific gems can be equipped and from which act
  • Which gems to prioritize for 5/6 links
  • Which mods of certain items are highest priority when buying them
  • Explanations of "Why can we tick X in config"
  • How to craft a certain item

These are all notes that are connected to specific items or gems or the different "tabs as a whole", and one could entertain the idea to perhaps "bake" the information of what is usually in the "Notes" tab into the specific tabs and then show them in the "Compare" tab, by letting the users put notes on either items or gems, for example. Then when using the "Compare" feature, if there are any relevant notes on for example an item, a button like this could exist which would open the note text related to the item.

note

Just an idea but maybe something that could perhaps be useful.


 

I would love to hear your guys input on the features and if you have any suggestions or feedback! 😄

 

@Wires77
Copy link
Copy Markdown
Member

Wires77 commented Mar 6, 2026

I'll have to play with it once the league start work calms down. Just from the gif you need a ConfigSet dropdown too. You could use the Tree comparison feature in that tab to make direct comparison easier. Not sure how that ends up looking with different jewels and such, though.

We've previously been hesitant to add something like this because of performance concerns, but if this just compares the XML it might be okay.

@oboking
Copy link
Copy Markdown
Author

oboking commented Mar 17, 2026

Update: I have been using this during league start and I have at least found it really helpful. No more wondering why phox has more life regen than me, trying to figure out how captainlance got crit capped compared to my character, juggling two windows with the different trees/items/skills etc of your own character and the PoB you are aiming for.

I've done a few tweaks to the UI and code to make it more useful, and updated the showcase video with the updates. Nevertheless, there are definitely possibilities for further improvements within this feature and I would love to hear if you guys have any feedback.

@Riddle1001
Copy link
Copy Markdown

I have also used it during league. Thank you

@oboking oboking changed the title Add build comparison tab Add Compare tab Apr 4, 2026
@oboking oboking changed the title Add Compare tab Add Compare tab (build comparison feature) Apr 4, 2026
@mantis
Copy link
Copy Markdown

mantis commented Apr 5, 2026

@oboking - any chance you can rebase your branch on the latest from the main repo ?

I've imported my build from API - then imported latest snapshot from poe.ninja - the average damage does not match - as one side (the API) - "power charge on critical"

I've attached the xml file containing the two builds that I think should be identical... - test.xml

@oboking oboking force-pushed the compare-tab-feature branch from 193cb30 to c3e78fa Compare April 5, 2026 13:50
@oboking
Copy link
Copy Markdown
Author

oboking commented Apr 5, 2026

@mantis Would you mind sharing the character account name/poe.ninja/pathofexile.com character link? (You can add "boking" on discord)

Based on the XML it looks like one of them has 7 links for some reason while the other has 6 🤔

@mantis
Copy link
Copy Markdown

mantis commented Apr 6, 2026

@oboking - mini_mooo#5043 and https://poe.ninja/poe1/builds/mirage/character/mini_mooo-5043/LittleMooMo - ones not picking up the 'supported by lvl1 power charge on crit on the kinectic blast skill gem on the chest piece.

@oboking
Copy link
Copy Markdown
Author

oboking commented Apr 6, 2026

@mantis - I see now, yes, this is connected to the new imbued support gems that are not fully supported yet when importing your character. It should be fixed by this pull request. I'll be sure to merge the newest changes to this branch once that is in, until then you can always add the lvl 1 support manually which should resolve the ambiguity 😄

@mantis
Copy link
Copy Markdown

mantis commented Apr 6, 2026

I'm not sure how much feedback to give (as first step would probably be the main dev's giving some comment on what they think of what you've done so far) - and whether to give any bug reports against your repo, stay here or try to fix myself.

My quick observation is it seems really good :) I play with 2 friends this league and we all running same build so it's really easy to spot what is/isn't working as i'd expect.

Quality of life feature: would be nice to sort skills within skill group so they match even if order is different.

I think there's a bug in some of the compare functionality (but not all) - if I compare me against, https://poe.ninja/poe1/builds/mirage/character/Realfoz-1321 - MH Total Increased and attack speed comparision seems to be wrong:

image

However lots of the others seems to be completely fine - just seem to have some inconsistency going on in the calculation screen in terms of UI - some show just my friend, some hovers show both of us etc.

@oboking
Copy link
Copy Markdown
Author

oboking commented Apr 6, 2026

@mantis Thank you so much for the feedback! I was able to reproduce the calculation comparison issue you mentioned and have pushed a fix for it. Apart from aligning the data used in the calculations, that fix also aligns the way the tab works more with the "regular" Calcs tab (outside the compare feature). If you have any issues or feedback feel free to reach out and I will have a look!

@AEHousman
Copy link
Copy Markdown

How would I access this truly amazing feature if I am not a developer? I looked on this page, and couldn't figure it out.

@Nightblade
Copy link
Copy Markdown
Contributor

@AEHousman
image


image

Then unzip and run PathOfBuilding-compare-tab-feature\runtime\Path{space}of{space}Building.exe

Copy link
Copy Markdown
Member

@Wires77 Wires77 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Build code I'm working off of with these comments/images:

eNrsvWmTo8jSJvr5nF-RVmZjdq_dopt9OdY9Y0hCgEBIQggEX2Tsi9jEjsbmv99AysrKrFXVp9937js3-0O1BOEeHh4R_jyOPJI__seQpU-dX9Vxkf_5AfkN_vDk527hxXn454eDtoToD__jv__zj63dRJtg1sbpdOe___Mff9w-PzV2FfqN_kkeOwH50s6byC_ytZ0UFV94f36Q29yu4vrDk5vada3Ymf_nB83PytSuPjzZtevn3vzzHTG_tHEdNwW46UZ2ZbuNX8l-56ds2xTrwgNtAjut_Q9PmR3n-8I9-w1fFW0JBgD672K_v7cS19uNqr2yKM6fLVLHOgVDsj88OXbuxc2fH5QiBwrTqZs_PzD0BzDGf_yxTe3Rr_aN3Tx1dtoClSSM_UZiCP7hqQZX__zAAt_Zob-wM_Dvh99_TWrWVnXzE1H8N-KT1L70fe-7DeFPzbaVzwWB7zZx58-ruJlHdu76P5f71bbrNm3iMo396rvtEfhFQvipcpRCyN8wHME-iWhFY6eL7f7n5txbFs3juo24iWYp8OeP9BMk8xtNUi_TJoZ53Pg_ksBQmvwNhWnqdT8_F_umedsirov8V-z75IaHfDZv0xTs5Yfaqn7tV53dxD-256vRz4vMifMfOxn5jXzZFpVvb4L74lVtL27rtd9Ufv1zA9d2bs-Lunms5davQMxpfklg77sFCFO_2sdjki_zLseB_1gfU8tHxoFgnwPIs8yvDOVVN78oye0fbffLiv-aQSoIs4-13Bdt-uP5Il_23L75QfhjkM876PLDlujLElj4w_ebIcwrhT9siaEvUSv_wepAqFcKf9QS_mxfV0yB4PuIRRE09htMYjCGUBjxJjhxwvb7thAU_eKFbTTWsWuna3uIszYD6KHZZ__7nZIowpCfF20YNTkIbg9L4wRNf5JexpX_lwTnReo9KogTBPqyhgAwFvWjkhSMf44zcS4A_sK6bgto0viDacZo5PWW_j4SfV4QgG64_5oai7n7uOZDXt3A4gdM5SsZFeziiRE5qf8IlXjbzXMw-NGyAtj6trvQz5_7HB8LgbLvuxEP3K3ajf8YADwQZiYHT01_5OA3On_R8knkMctR7GXaudyvwnEfxX7q_Wr7T6bN7fL7sfPt-F-L_3ChTdOIkjTx7X5_yS-vRX9xZg278h6Dmsds-hzQuc6ufxRWv3DbvfVjK8cHRBcIeP6j9H5bFcmUQKQPiWEk-orCZUX7fZyjyDejuLf-0SBw8ktEuOdLqu-1bvOQv16SoVkKUsWfJSFfSQFD0_QR0ZcO2aax3fOi8MKHHX7r5BGJV-vljYH7tixBRJzWxE80UNRroAPMPv4B0UGJrxtvwIL-0QanqNeA-JMOPvODz41_2sHXQP-zXtDvSPy0K-INRv_MW8g3Wv-sC-Q3Bse_mtQ1CBsZgLVbzr8uHog5S5DPPZTM3Ro-mCRuix5YH01PeeqfZy-vWwM684AplZ9fx4f1v2n-ow5egYQHmBHYDj_r47sSn7vR4gwE0rpe2I395D2zYN2uYjtvEDCPH768iN4u1r5duZEMVsKfH15_W9pp6oA4cbt6e4a1jNPGrxbg3tT_5Kap4z9-vz1qmz7tz3Ga1qCbwG7ThvezXWuncTPePVpU06V6NoKZ_fNDU7U-uBgVveyHgBtOt16em9n3wDGp2_vN3UzQcgoidy3aWPqgOSvLH151J9-fjuVFlb0w87skmzbPtrzp541Nywlu3z4TuPn1kxlPsTdZMl17vviU2s7U4f1BH_vZ6JvFfj4RRu_TUOPcTVsPkNXnjfDmIeEr2bmduvV9yGkxIbpvl0X-hDzte7BLb73_4w9g9LN-Pi0cO0VftHX3uRVBv8_uugPS5tbvjVs_XT5NCwq_PFKcPuZ2NkVrFyRRN5kn0O8k9XQX-2JAz1qmnhb3KfjwFPrZ9H3tN7YHluHvYgO8-_vk4t8_T94N77-26vV4kE-duEWbPy-AyTk_Gtbvf8E3ANor3659b3q0Uzw_2nnloFf-QV7750XuaRJ8KoKnT6J_l5PeWLYJ3qp_2Enf1vJXPCX4Q2nX9bd989o1Lw3_Lk98ofDhsX-Su4_2j99vu-s_e_fOiqKpf2nXLlM7y2wnnpz1bW-_2alvm_-bPp9GAD59S-fP3f5G6q8sMQ6gS24DLjvxxDx8JE49izx9lvm7Vt1Xxvzi6vtS_pccwuahXz0Qhp7b_T2z_kbZz8d5b_4eSv7TicBf4QBTdrT1c7-pbj-SvN5a2PcCCxB5eiPzd83CV8b84mx8Kf9fdlbYPI_i9KsZ-bwbsLebPY8_N_-7JuNbWh-eidcD-EsRP70lkZ8emky_Kt4fTtSPrNAX6adnutoD-acXBX-Xh-4z_IWpv44H3x_qX_HctvKBxUX1iJ8-t_27XLLw7SbK7Or8y254seW_7KbdtmnnV3HtP-T6z43_Lt9_pfJx379I_pUVt47z6ef159X_86Hf2z-93S5_Q_L4xoxf9MAb4f-tKxCY3Pm_lhhM1UXZD8Dirftft_6b-OFXGh8giZ9l_sqa0yo7r4O2fgwg37T-u9bbN5Q-vNxey_7S8OdFVbVlA_KGJRhn9ch8fxZ5epb5e2b9K1Me9cGXgr__ahLsy3F-fmTot8ZP99Z_XwLsv1b4WPZ7F_nfGlcEP8385pcfOPgLu46-mZAhX3v63vZv9PRrhQ96-ibyX83T3-du8Dt1-49z-7zIu8L9AXIibwPpq9Z_Vwx9Uan4_a-E0M-m_Jdz-uimt5Lln67xl5Z_k7PfqnvAy88C_7Eerou2mn40myz-FwL_a1m0qVNU-ZMWTRE1dyfkXvhVF9fRxyfVtwFmPu37ovL-xmzmW_GdeHbFnRt_2cEXd768-OeHQx5fWp_NY0DzfO9uyps0wM7jwK-bL8foP5ahPzqJn7p57uVzJ_-Js0r9R0zqgz_7fWdm_385Dwj9r8n_ez8NQN9P-8gvI7_yPj5N5zem5_FP6u2J_k9mYGr0FzfVF6lYEKSx-zCgPJxbfVb7lXOfP-795vYL_f2H-ekjgJQgDp9_YL9_ef6F_Sb2cuX5x-6nJm5S_7Nx937EvGyb2wD__DDVN8eTEZscCNe-W01xYDrukoNF7hRF6tv58yh-_1o8ezmkofh25Yxc7mfxtCbzNnP8arLhASnVrvxNdQ9Fj2n48hDQVF5R3Q4VfToM9COh53M6n4Vezut8Q2oR19OEcsJ2KuPb5LdarQdc8-LZme_nQtyo_lRHmo4PiM5A4unVt-eLke9pxeST8ScecSM7z_3bmYtnRJxH_kOGfp6NKf8B_d0OXf1sBl6GN5W5gP_Z1c8sTO_aizv0fMewbWq7flSkHoi0X5p3c4Ngp2nRT2nplEd8o8uvNfiT3HNdX5Gmqp2HrwQp-CeSbysDPwuiKI48Yvb0rNgH5Hs_PS6eT4FgCm2vLCd-YsBz0eOLAIkwNPMTmelHll80-FbW8Vwd9AvWTWe1vuwJ-5lPX-rktn7-SuxRqV8bWR2HcboJbuVjYBLCb0aX743uc43hiwzx09FNMPK5PY3_rJNXxX-P-_DVgbrPpj2wLH7J5a-KOB8f_208X84RzZCP7Ja3-_u2Z4BrsqLzvdnIpun4-Nx9Wb75CwMAVx51k3vHXEAVmspOtTj0q9smf3xSpt5-bUXfxO7nNV_FsZ-N6lMJ-GcHwgj-g5GVL2XaX4cF_Aed7SOAkPvnn_EemKy9W1Ru9B2BP35_ITU3LnT_Nn3UKt_XY79_uhbFp9pB-lMJ5L6pJlI63TL__AAhGPMbjD6XIQLAWsRBAGIyGFL9iaJNTY9gYBjyG4wzDHqvjryxypsdbyAzrt2T0wbBdBD4M43glkturok692z6a5Eb7zvdB_f1IPf-jQneaNsz9UtvBWN169T3e39-mAZ7u7kA-XOcTgeeAZzZZT0R0jub_Vqb8Dk6v9Z10_Pq3gOaDODX6kbNXiviBr-anhJ_vvuAquks7dfm3G2ZDjRMtbAPKXreA69V3X-Wndt1czty8YiWKZK-VTJdeWwoYlba6RfO_XTtkQFMA5_KYadVWX_DKc1UKguCSxzE7nObx2b9EzS88c2nk1yP6LidX34r_3zpAeH76eK30p-uPeLV25nmL7z6fO2R9eW79vhW-vnSA8IvR3beKni5XExs_iFNXOqzcTrVDXwxs8rzr5hg33xu8IDCNYg79yLQLxRuJor5cucBTWCXVLHTNl9u59fXH_HVrfT3jZtuVx4Zy3SI7Y3o_cojfn19huxtNHpz57Gg9oWK-5UHRD-xitfC92sPTsEzrX_j_udrjzjhE5q_Gf-ni49sklu4Zbsi9r6OFF_d_HcVPqfN_7Zd0yGmf1_Nl4eaHtIIGGl9_mK_fLr2F8UPza3e9htaPifFP1Uybbl_T8O08_49DVqcu01b-Q8pUL-iI-qXJOQ7kp_O2bwF608X_6L8y5mcv6zhfnLoL4vfMtNHpKf4v_CDG2_9BgB8vvUglnxb17IAjA7Qjecf0f4tXfumzRdt9Xeoug3x2xHpr7nrGXq_6bXvaLwHlfsJ-m_Ey-cbD0en7ykCvEB4lIB-V9PLYT_Bt9Pp770U6b-n8Ms_IfBvKZuOLrelnXuf1G2-xft_eRqKpgY6b0faFtMJ6X_Xh7dHh18rerELJKTPGeIfSgFY06R6uvrpyx_zAiQDlf_yyP72Tcw9f3j11P52kcubavz0e0oNkkZnGsWXp-nE-4P9L34BeL56k5jf_jiVr1RNoDdXFI5beru96NTMbXw33dcSRK_MDtW3I2asKdpLNtZC7C57x2pW0a7klH1TGiXk0wHMIVIp9fLSqHML9fJyLCtlt4QVfMazUOKQJ4bh50c-d0d5w3UBtWKPRIFH8MjK-EnLri5FkfQ2p2rqdLp0GHSWDj0WqFQSbeh1e_I7Bq8CHA3Pu8Og18M5Y9CqPRZKJBBJzEs7yYmw9irvgxIRZt6QuYJwaHdY3Y1pVc6YMCw7VS82lmX7Mc1YQblfOpizGS65iJPyIB3ISiN8TSwEPp7BCS-W7kw6rq_Q3tNYJ1kn3XZ3CVvufI48fKQMharCcnuNMf-IXFteZsRebk61sFHjJac4arzaVJQcxuO4pbOBnjOoMMSqSK3RDQERrHw6DVAsqhyRBqktwvMuya8uzmZzvSVk3OwdZhcDMw7iUe5UP7t6qJeO7eDVHnEwSNHPD5WlxUsipnFjZxFnt11Iq9WM906rTutbBjfjhWHqmdv1SnFghNFLg1XHrVN6G5xGUVnwRzZl8vKQoDJJZvX6Gp1Y_SqvPVSHlDMRXLJATGTcwOdXZeyjcuMocyLl6CyiWGPgA5ceqiStpKpfa3LedNu5GZGI4M5RfVwGlsCrJbDlvGEKWsHxvTHDlSt_dDtlv0ykE4ceXaedjYOb8kE5opkHqUtTcePcV_UWkTnXSfB0NNr9kEmdHks-SezXuq_n6m6B7-nzIjerXEyieW1Z_KJVLkiyo8frZiU2e9mU3IsC6WwoG-etOWcuaR5ilJsv9KVBJH1zOhZc2w8MHFbUaoAjfsyXqWB1QtpDUcURK3xPYlSXj2a4h4_zYVbvHCmVtWHFE1LmscfZMlaHtAp6-axQ9QonxrPpCcvTWhaXwpFts51hacO49eEobTfzPN7NtRyPOT85uH2rj7KMrQzR4dwRIdt6ESzW4ZFqwqvjnYfKttZbHOlbNVDda-k6XazR23ofjWKZZso1Hq_Ctnc4YpZ5OceqibvisoW5oeCwgKP1UNe1GM11PIK4s60thMKtdBbeemXV2jJId651SHGtuVMTntRyOmn38kaS0u1u8E-7xsPERipHON0VTL2yo6ObWRpLs4UVxOkKzXqO5FnmvDZF1HDGPdHKWQVrVr05CBd36FZpsDDm5lXUV5mH8x1PmblTteGlxTHaamqTtzG-9KUz1raIeeSi7kqIW6lHkf21sPsNddbURqrkq73Nst7pyuS8P_FLds7rx9OJjq9XIolWyzpKHFFlMny9F2xPPvbKcbwucJJxUnnneka6WHsze7BsKo02BXn0ZmuZrXLUMs9L-YzuVLKRCG85N8QuHnP8gOValkvNWSwYFLqchEa2Ik4Xc2K3HhzF82fBQGOn2ZizJ5aCNwE6X9LICrNbkzXpY79MbCggIb1ykyjeXpLVUWu2V0QPvWIGDTE56uQiM5PZcm0DrHBXOLJq1sdrvsLw2WLenvEhC1e1ilPy4rBEFzQcmMklR9nePq4q5OAOkdwo3ZmmYAOae1ISibvTXDEX1zWCLpHBiIzDqHjDuO4vB2OQ4TJazi-YNwvz0r1iO38uxhjcz2OwoIWQV0033h_7fm4waHY54hI5uqTOcELRwqv5IlHxw2FOCTEyMvompE5tTaanuWEwtI3Js9YjjZ2BIvwpSA0dR-iAp1GW5rb6tr62tbOl1vvQcReb3WC13jpi5KMr6Ok1Ws1DHVllJ7a8jvsClWx7bMduvZ9ju7y4xstNnq9nQd-GRdgysbvD-0AKhlFajXjaLjWTS1YO364o1zyveQsNyHFkSwmaGSy-Q30lESUkNTrpUurIINZYDy9UBPYuDL_eiDvXmddSqq16l1-TJSGGZ1nVzP0WWcy28YUoja2f7RcyzF72-FWXFvwywDayligcgIJjIiFq7Cp5vDnJGhpQIz-rIa3Kpf1STq76MYBWa7XfY3pvXMzZPN4L-Vj7ZJoPuXFhmW6prV2pFHesRJb1jHKNLuoIWoR9MYgJmTNFo7v2Zehx3dmrOwtdqUmtJPCZQ7XkiFHUnq-yUaRaXT1357jQtxuFa1a7_nikRbvGXXiOFDPqfGjUUZ5bJl-NFlAnintVPZgKjKerPRR3ZirKK6uNnZUOAHd7MRaUG19WRZ1ZNiKetQMU6YFFzx2vcpDxpPNKNScVTKkrGa9hrzlDvBCrsRLNTkk62hQKGYCfkAdcotH-LKENzKOXTA5MMtyYKwtMZqKR0pgpNObrBLRGHW9jdL6Ix1Xj9xrdk1dNlLFZaukWQ7bzRSp14ixA61OFNmNOuPCwonYJTWo469MDvFC41ppX8nGTiC2_NPHVVoUaazUv6KIqZV6E5qccLBSPiamdVWxwaK_uJBbPSx3jzqZjWYezkR-hVrVOoV74q_nFrLQ11m6kkht3DX2dL9dxiTEqFSbzNFz1RFm7J71BTchQeFygSSJGhrlFbQ15wVUkvd8H-1zCD8n5iNhX8-AgDrK5QIvlhsp2_pKE8UsqmHHgKtDKoHNcYFwRphJEcUmb5q-Xa9U2Y7HFdrKQtrCe8-EiyBNlNi8wOo8j3Lm2MlMyQozaKxWld7SDi603sA6r5MfWHx2RRMazqu1aoqpcqSXPzogClKwMthsG1lv6aRsk6CDFZ05hnSEn0L2fAJ_NyOJUyL42E8kwGPr5WtvoVi6Q1gLn0-JQU7Oa1RP7qDqnIzMwGVjYsTsKsuzVR2-t0CEDH4ZgPZRH76LDQ0lu7ABhRv-is8fT1sx0u1CTwxR9lp1qZec8JldH-IJfO6fpGn1ZcuWp6gbHycllMVxFy9ExtTu77AlBfZKClpSxv7b7PTP28mBs1s5godl5ntMGlp081iq5LdbNB892VjS3t2x0u9HLg-qhCDWXIX04nQKOPlbBWje0RJi5TG1C3Sh1C2d1xQ0LtxF445qKyApWymTeaTk4s-7IFbMk9HdXgc2vR1dZGPUCBBpZEfEzVXtHyo5tUe9W0VBmXcWPqbmg3aOEDwtbvYZSWBGLQb9Kq4I98Yi-8BfZwWdCmC5xfuVAyr50qBPlKgnH6Sth0UtWdEkNdNkyvq_LysFudWoxJMxWTaIFy0MyV-5a3uXcRvaTIMTnOnB4O29xibEPerbTcL2ILVHVrOSC7q8YTljnLMGGaI5W9iLR8t0BJsTa95EMl85KW13JqAgT6uqv52zazjccfKhLCSAkt-M4n9_QwnAxUKdQG8Nur-Ia8UT0lKKdI9Ly5ehiJMIXcdYMMoIt9dPASvmlQRlz3-321eFM-LzlL0YccB51zpegSZhhJQXY3h5a5_4e0rCuhk_JxRjqHJLGTV8aNLUFVCWGC1s1qXDnhgROD9ejL63glbzHmQFjIfG6plZrBDIyCRmFgy9QO0_VNJ2t6Au9Tk86y8WLazsffN7W8tNsrbd6OSJGG7SbhFTObXAZelbq6lBL2E4_7X30YFv8Tgb7j61pJgzSQZSO-6ub9ifWbWNT9OTdhkvlbK8Ni6OUHF1dpHp9N2doJjfqIpmxhz6eoRyM56JQ6tFcXZSGkxvHsISjpiS2YUduXXm9IEgB5tOYqyOwzMUmsucVbhQMuS_mhrU5rfGY9gHEycnc0efh3J5TI8C9bJ0I0nleDPDWWRJOrqr8ES6BZeh1m-ijNiuEUL4YPnWs9sRa1A4H1pxZaG_z0XiEK4eGLH23RRDJgaB1lXhI6GPSbscgYC2G4p46HWZb-hTLiryrtuXR5yRz16NdjBzbbCHr5SVEipOqbM87DrJrFAlFfpuN_AanJN3iyWqWHNRsceHn67WZqMbhohuH_bmzezaRDWqhJYZ12jkgCyATfWYOs41b7XnWsbEqqXNfyCRj3YVWKK66RkABaMl9xFruwq0LljPnIGz21TZZ9FtZLCvfYHUAAaJI-6i_SShEbN14NpMwMRTX6KqhHNFGswOl-UjcedDiyGksk9C8qcesHtXHIk5YZFaSeRkxZW-xwMlIN9Rx1dtCsaPVZYxKrEAju7aGI-ywOM2HgDeQyhzJXqkYYSNs1qJZEeE4XMIZdxziZUjy6k5WNj0pocUSsoVKomj-4COCrCoW4rlQfbKpmjCsbs-rEVhcUFasXb8eEBvykARDDovhdHABjh52TFqIFq2HdGSuy2IDCxtrnnviIuxDu1XKQ0Y6cDZr-3HrFs2IyY0r72gEk90iOjc1SLZOy3JcIht-BbgNz29WpL7qR1bSxBbRnKMmcFcjl7Ks41NphnmWMLtAw7RRj0v4Ost9wMi7tSfYYVqKZyXzrnNE7Vc7sGS6BtcOcxAy_UbSLxBlR965OpJ4M1jcONZHrisJndXpuX7Ybuelqy5Wbn6W0T3SH5VO8iqqGd1Tdz0VoQqZCV5GeYEtsJgZQEayCxLKADhytdwdA8_60zqFeZcaAOx6vbuSrP24zqJ5sxQ5bEvHW-m4oCW2hvZKpSgrTF51C6ZoSuOy0psqNBFarXZIVqPlGu4OLEJxh_31ysYCqrdZJhpEZ-5CZp01GkCn7fJkzXcWvwyzYolYgSjwi_2F9TfwJRGXRb5mLqEWmbIlLg4Gbs8wWamVo1-KylVkeC1doyUHyy59hBNxse3ns0i3CtcCKdsqC8zAULGlz2dNRFknAChnc7ZG-PniyNtbbZBDCrfa7V7hjFHskwiXBCW6yNgAQ2mniCY-i-2THZKldcYZ1AeNjDAZCW-rkuw1yojQudoAKpCt2O96lU_NMiuCZhl1lEfu-5lrQ9vjPl_XJLMqrHNpew0CV7EcKds5zcUQzkvrdLfJltwOpskginoEbHQViaNxwHAy4VqZF6xFgYi4bIFpUihEtSp67ayP7dHtWQ0-bWVC7gbM1nt01Uvd1jBXtgm2n6_IxkgyzIWuLijUZDO-pU9JNjv74yUKFCDHLYSqT9EVfBltYX4urUQA-dsc7yOENYPQhk4VtrH5pV3qsbDCMaqwroYZJ8c9hIpDnMWwfJb1TW3jS404Y0ZSlpfmdMBhEJiS0_IYh7FP7CDCnvPQ0td7PI-JpVhRotmFJ1Gh4tNw4CWpLkziILfs_hrGK6PFCAqqQ-siM87JOctZGnpiAWvxzlrnPQ4z2yV7EOwcufYdxCbQzOEiIgvXB7w1xcBjuCQ5mIcd12WQNsoqrZ6PYrtpQSLRpyZBJJBKqsp8H5HHNONZa39QXPR0zOUWm5t9uFiCDNEs6qFFoWU-LPnrKiJr-0ya1zEhLJBZhBHSBtK8GlrroHn8cTyLCcdndqotZmxRSQTNHfllEh7CZaFoC3YGq8vqtO7IY3IOkXxxCo4Ir7bJJtOuAsR4tanb_g5fYJwHoJualRy0PlrZQTugq2BernkCznYZIDglVbWrK3FlG2K5nF2My1I5evR21wf1BiudpEbBLKTNzB0Sq0mMpUKt62COdrrjhGcuNMXUbh1uNkr85loSQ03oRoZWO4zraZhkiaspt0MhDF2qUlcTW6gzNYgLO-5EVyrMVAWYwRaJkqy1CA_PrGISmHRUO2mjeMEFNy9aT-vOjp9Jblyj6bjZrY6L01Vd2CNzVCqcScfVOQHojg2bDW8uFw7RhBG34h1XtER9b_MLlTzvXdopuJk57s8HP-SKnb7Z9ntjVaYYNfOppXIp10qFXlpkDy9Tu_QPtLAYivPa4YxjR5vLqDePuBt2aH_d6athW8azVRzB9rZeB0rXoPuZAYkjRS0dugEEBsm7RLrGEZXS9bKQ6aSj7OUCBA5xtRnpvLV5TDiTDAdVquVTqzkTZJ5CCLiP2wKtp4l8MEAqT0Ubod6NO7NdEXK8ycniYHDEwYz7KFYNkurQKmStbWuSmsdkwiG8XGbcbovS3mhEO5JtZz2Dt6mW0z3BXfwAWyCZHwp22cfUZsGZrjkX7SEU3Jqwho2y3EQlKfVz6zxo8VFXbZCduZKzBjsicjbGDOJ71lvws4MQLv0E8BoDZEsDsTbBjnTnoYAt7Bg2cpZdqBgnnnQRX--u7Hyz2jmRerFssjDCmVbSJCKVwqzjs3Kx1CvczyxKc2Sav2ywROGXMNRfl61PCzEfNEV8grBO1OrA3Pd2gily0fqLgtgwWD0_hrurjhU1GXYRIbBeEEcJZqV-O9snqKqJfu8mSnyRU3rRuWUs7dP4ODOprXtWQlVVqEN9kCPVFCq1oOByv2sZpFdhN4nWm4Eec9gRZHQ38-HBrAJ-z28gZRUA-CIqo9zamdVAw1Fdm7ZqUUbh4MKlCu0u4uUI3-hkFjpbxZidvMysOamo3KO1pXJ7SwOK5xRx0RzCTV4MxVqtRFfL5pccKtiNpPGXIJxjSC0bBVVCOG4dYn9nxfGcW2tKLwX5qvNNwbtsrofxyLWkFrOA8bAafarZUaRHbO-fBZpu0z22Z-WGm6EnRPPWi3hNJ9bYYf5mDsEkvraYgD7LR5bi-41ZVhDi-ayJAMLMt3P87DOiBidbxt6Is1hYl6STHFpOw0bfZ2ES5sDesZAtLh7EfcTy2vISCyDH8K3jqEtXTGM3RQ33i05SK7bNAPlmBhU7ayPF-V2LZbIOb6CkVehoheJpnvnEfhHsSuvSITvKqdw53I9Nv1WUMZadUE-8ghiIQy5rDb8rhINkNgLSbiiy30GigMgul67OLXtiLpCHi1YMySiZETKPB-VKX9C9QK5rjQ9PNLIuSsfd0eOAYBCHbw3hXG9JTUV3UGKWaeUMke41B5PfDfkiqihfnAts6OwubLSAd8w-wGyfqclxx7NjmW-LBlbmym7Ri1m3u4TC6irkJ9eIE4hiqLIWEsVZMnytk_t4zo49eST2PjNPRCNSThfsyG6DM2k1vjuO_cw204z1wwEEQNES5NDbhloLza7OzFtz3sAMIM4uAVUxxY04X16L0lPW3ZyA-T2-tdxYFcL8MF5dgwMsa9f55IigcLpSG0RddTo-jKHVcZ0Q-COJJ2QZGdSlDsekBRm_bl5mJA0Spq1i5q6IWU1A2AY2ro6JVXeAhC9gY4malRwwFNLPUPfEX-BLLqqdcfB2_cxoskW7kLaHHVghpdoKOkTm1QHusn1LUk6meN1yu9Ojca5odcLuEZFiM0dX5FHMMo53DuvT-QgAzl1jLO6QoihQsCaGR2OnRoQnijDftWguOKPfJIVhV37dKeteRraeLDtGAC_zFUkfq0URomjnORCa2sbVNndK720ITnMXeX9ZzXh8TuwlcSuZq6GnhnXO1VqYazVLFFcNtt2YDpf8Tq0W7rzuhZluVWkew0OCetimcbeu1Ll-RKpUbBpt6PVy2DmVPWsYf5SENgaQmZmzzIazMpXguYm1IgtWI7mUrV3FRPvOKjf4FVoJrDnPtgqFb6hhWNMRnoqtvdxgomz3xn7mjUWU781yM6NCk9OCxbiyN1xvtqXXq9lGTDUlnF3mYpqe3eWCTJejN8a0LLP91XHwQVkam0ahdDlWFnRrrZlyxmaL86EU9MYLw0zdesLlJJc5TM7lHPRmgJQcOyS5jbaNASBykMFe3_ki36mzDNdGZycepMVyPZ4w72BLAg5ZDicggsPs-XG2UWJ1R4Bt4PbI9uDyR2nXsFhUOnuR5nsqmYemCRNr6cSuzKsMB2vJUpwTZvddXGKQHJAYXtnHOIcresvVQ-MVAIcXgb3qTahMLIfVqUEdWuB26zoITqDApFIFDSAsBByiS6JPMy4Sx_nRWh4SL16tduvlGmT4q0U0k9VVuHZUURbdDTaLzEqht-N8Jgob6HJVNNmQt4eKDpIllsBJdClzysolwmpmR0JfpMbQBPWBR7aRWxyrwBVxUwj9yruwIpkGF_JsdBVrWSmJo1QnorbAqf3yANIwiT4c54dtmuO2TZIdcs5d0jxLzEx27fQocRJxHila6WCx73nqWPIL97Jau2nGnA3l3LchqWgDWp4KDxXAvh_HZUNUjCt654OURGBCElflpLO7mnMmd9JLDXaRqu9prJGocS7Afh6lJ4kEEHJATgjvscQxotrd7pRAm1V3oa8C2NzZXqJngDVQKnQU0UROaKNKXXdrnSAE0dz2iCrITk6wJcdz21SJG15p8i43zq1BbllYXkD71M4cL_KSIitn8CUkTyCQhCiAOBLHz-nOc8_1GLKGOz-dGEI9-xa9DlZM5R0OAYss0mG98eGuHq-BHVWbHU8lLo0Ox8CBhEE78Tnl7k6Cn8-vcwNfn7hUjbcFF7p8EPM0w3mMn0AQjBp6M16I8mTDSbldK6JXx6rsLWMelTmFNkSjcaLNtROdnRIayEJv6h18Nc_TGt0u4dZbtklsECDLXDbJ3iYrb8k1V8MmZYvnGFTqZTO6oKhoq_UeLaw-j9mjoLOMur_IksfmB3S2Let5oK2X5LrQFUvmnchaX5q8lXZLe1d4ddRT1iLKIAHwOW9dNuI-Y3Qfv-yW6SbUSIfNz-NsS2RzxthJGY7a1Xz0lRQ3OGm2Xblzf1-wp9RcIDoroxy6rumzSkNnjc52yYEi1ruz0pwVCYfQM9HgGc_l5mEv-W2QDcv-ohzO4YLGRHduXt14HW5JYr4TNrGPKfNNHPCD0GuKV3NL9qSMy9Bw1YpT2BMCX1S4O7OmBm8y8wK1adlvTUfPL5dTz2wvBza11opRq9TWZip2MSJF0sAbqgwTXT2U1drpjT62ksN-CdcCczbdK9R5wmpVrjerdIdlaK-rkY8QG7Tm9OygeLKlHhGLo4hkxa2IUscLKGYHVT8VEU4dykOCp1QR7yE3hplmMDwuGA7HflQZgdMopjPWB8sm_HVC49vF1WyvFAEyw8ulyGLnciTLNRRSuprDhllex7ZcVntF5Oq9q9dwdRE4sE2QDtnHx-xcDjkZFd6pxmfKmmw3kMwZ7nKFFoIbaAPNO81s76GO26YLnMVOoumMacUlJX5eZL5HpBB1WEmdjTGXRUbKTrSPYMb3_I0e1DG9PxR5ny-pUCiTelfr2uqCxcZs1ZAU2DrMOalS3TC8CMeVgz852GTLlUYY3r5dbMRisfAUleyOcjDHfESEMO_CR1iidzjUxnKdkFnAoV56NGK701d22FTtZdS6ImWvy9K8t9GUa-XMJGdp7CqXOmiluBIQb8c0RgZVczqKQM42ayOWnsHNIdfSmsOG4yLT_QBK5_bRWl3JrXogPAwvddKTumWZJJdVDGhiBmu6pcN41lWoFxuKUUKkkRyIc1ycY7JggnatGaqHpByHBG0qBybWrSIQMOPA5TGkG6ta4eJDq-uCNBBO3GVbbbQLuT4CAO16xJPyM5GehmqngbVStBxaSGkrVS10PYqWl-8tiI841z1ASchuO1vdtzigvY1nrPrNIXEgdSwB7-uJEbowmX0huzlFGwEWnnpM1eA9KQSJjfvrFqlPJy8tN1R4BCm2tqCZxLJ8XIQqg_ADtW0vghQgSsO2i2Wl9T3OX7S62QZKOyzURpeo5ZI4t3UZkD2zXoU602PKYXY8lCVUy12tqquNcxXrVi1nUkMl9iy1TwXB0cu9UYWpg_UVXM0zBqBvg9EEM864GSlfCK9ktjyx20qZbjfeOqSpKsUMDtqWzSzB9-fa2UOFR0qOB22WjreFx4uKClGECPGaKkZ5UEumyMgNbLJNtS_gSEzCY3NdlYcjgzq5BxF22eh5LsikemJAwhWvmAQ71j4nFMRe2-ZezZipvYqXzL5KGjFe5GWDYHNh25_htQXLMyWl2U5L4gFKrBwqPXmzYa4otaMh7lC4aBa03jWelysiOAC-2u2Imsq1GaJtTgxblv0qYBZ8yVK7enkiEYc9QaVNHZHhGHMGhF3Hq1y3fMIyaKikOyHfc4DptMky1dZbrysv0BAcp1-LXIFMltzRxte8uEQxjeSZSmTyXBuW1w3hLHKD3uauel5dDNVhOZMNMXmfDBmrn4zRxkIrEXhdnQvq2ia0-dXpOQdzqOVc4HTFTqTV3oQxwRSpo8Lz65kDDFm2QdwRZZ4eilmegPURlU17hFthU--vhbi3-0WdLletPeOj-XnnI4DcLbhzRcqRbOzinb9WzzCvN9mhuKz782U12vy1F3a7bL0pEv1A6Qtjz3C8G209PbswXQYCRDVnjci0rSqED-3O8_CruaPS2m3DVbA5srbK2krDYc5MO-O6Cc1WII_R-1pk5bXIRL65qHeEfoYJshBWu9nuQINEZ1kZM3l5bDywpB0rW_cUHVocAKYDN7tcWQWN3ZCTQq3kQnUZaCBZDBnVJAudbwN_R6A9KosqqbvJ4gxICuOFDcZrZ3GIMJqmMs7RPB1Cc5ddlLuNrxyPZNjMd8ryAhYEbV5aFFVYiRsr4GEujaXlslhdwlAlxQgX9qEn7uDlpcBgcy7NBNkLF4AwW7NkNxLjeC4iE6VnM2PRkWcZr31IxBnlvGY2jbncEytlxrkhjEmdoPB2MSwHtTkGzck3rK5DaGNlY4PdHmXo1FHIyY1zyVQDMdLavSzOWqZTDAxZIMfR1nJ7gfiLdnZqr0FXWfMzdsW95Qw6BXLCBFyFahc0oXkBJxksbMjTFmag_Qj24XbjYgotbEtaY9IZFajHYLMSim3aHqEMo51gi8RbVD12JwId4eaaCxg9ZFcBAgEImh68rrcB4BFXcVvUTnxycw6nof3ySjeKc8URCK3hU31pNVLyFspA-mUInTAdC06nK4qOdH5abxvYN7Bq9BcNBXkn67Ieg0UkUUFA0EAPs_VOAY9BjExkZivXQde6PNMznbDIDvl2FDZ-fF65-ZaAG6wj6M05C06UTPr7HIZqyivJFJhMXh0IpExQwh0PkGCd_KAqhxW-vcInTD21wepKnWg_2RFQ3muB3MkVRKBMf0quVDMy2x7aBmAg8XwThPpsYW0LygowBALNfMoajJMKe0HMbLZeaHmnDe_QDdVqo0z0TMZsZqQrhCR9AnF9AaPXnjniHW8NkKBcfQoD1JilNtuUdoMOEeVC2p7SDvOTRMyvazLYzE9UgzGbCuSxndPDEIYQWw0uiU1HTs_38u3JPckEfkK7nuoiF-oSAFsWwGJPKpVAnwWejtcpZWmMvDqVWgQV2W5T63GbhVtz7PkysqwLoZTuTL_U2wNebdyivJSGLp33Y3qZeVwZ7RnUxYiFStJDeoYSWLFqUoOOLmr5LU713tk0IWFceZgQMFBwkeSYOKTkinNGYk_3QrvARroZpMYwjsH8eIlrEBgYH9usrizGhz2U2dH6kub-jNFORi-l-GYfxcaGXx_jZqWquyySOSSV4qp128iLRVzeKSBCCDqyjpouWLdV018hWEu6eU3w8tkIlegSWEFAVjxv7WyOTKT5ZqOYXcl3Z1QzjrOEMxByQzDVKjPoY7xM_RkOzWqJd5cQbp0uC5ejFXy_5nRtC5WXTIG3fdIx5HJuXBWSWTCH6IBw6WomN4pM-SMjFt0lP5cCc3B6v9hf3FSNsmNs9DTSzPG0knTx7DsXn9L0A2loLbnc4ObWsbjYMU7MUSQxBdkLwaILKV-CIG6VRrg7dmv8AMU9piGOwezJ5aKQvOsJkAxyTfOk6yjqAeBxdHVlsu0jvpdlQjHL7JTuZWzFHJj1EnViy_eRoydeFnOmSy_4Dt1ijIqoM9o9ZhuVTqELdz1ewL4FWZypYq1GWbCNEV29yJTBMtyEl2iAQjqTFowTiR6c1_siL9Eew9fnoz7QZ6wXtX4WWoCSk_IVSaFUNK5CSSo7NYjNWN_nazw6Hkhptui52sIHjPSbNSxcinELiPBVMhp4YROe5Kl26p-VwhlDSnJJ-OrpanpCcPnodlwkiKZtbpx1jxmd7uZoMGd6ZwidcKkdmfXOKK5iJcVamxj79eCGyDFQFw3TV6pP4GvcZLELI2ukVcVXqrIo_3LwUyc5pP2p1erZRaNKTDifbIex17tlQ2V8IB3n2pE2sTWioe4aG6rNUVQxWlu1cJR2NmC-fQeW3gU9GvNiC0a4adP5eDBFxO9iTBUuRwFXFjhpkiQ2y_ZOXxIwNtcZ9exUOCmV0IgVIMzM8FYZO61z4bXUb7BtsUls0jCzej0g_eBn1JVabDNjJS4pX8lSiiMxeIY1hV5kfhXS9oFnU3pRoS1-Xa24XGcuzOUqQ2tN6AJud4kkk48GPMxpbe3vr4rXbwr0cmlOinFdViom1eGIb6NZUiC6NVPsMkUthCjsHqs9OewuEIWMZJ5cPOVKNv7JvzDBsZ4doD2xjw8LkJgF3anfrmdQ9VLqff9bNC9fp7-U81L3fT9Y_VJ__o9_GE3w5BV-_dREcf2U-Xb-P-5_YealzXSQ-nPV-XfL0PvCjt7L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0N_L0P8PK0N__nvo9zLy6bOYTS8ef0rtumHd2ytQBbuOQFMU9omARGyasD0MwVEMpkgaZcA3BobxwLFJG4VJ6sNNdHplAuhtejXcJOxgDO5iQM7GKQAmmIfSBOUhthsgOGUzDkoSsEdPL6GZhFXfTrM_P2znH5784fYadLuaXvb6-S_B_3G78rSPip71uunVAlpRpPXL-2E9v27i3H5-P0uagqGXpZ-_-Wvyt3eRfeGh-x-ZB1-eMmCHX43Pr-f588P_xGkCJj5iOIqj_-vj_yQRhkE_MjRFgi_Y9OK3jzhF3m6hBIwgH1EEJ-mpIY7D5EcKwajpFoViQAcJ0wj4hiM4Qnwkcez-jUZw_CNOwgQDviEoRqMfMRon8FtLjPmIITQ66ccxEqc-AlEc_19gXLULxjUHbqufC_ndT5-nt0z70ys_7Wpkv2iGf3hqplex-VV98xF2QukPT3nhTe9WA1OLUsAwggb_EiRDgb4ZEozpZj6CwDT9ESMIggR3KeAUlATGA9cgFPKRwigwCpwhKXAZSH28uwNnYBr-iGEoPZkORjPppT-iYPDYRxwGg77pIj8SFEoxH3F6aojCBIFMV0AbBIcJcIXBCPCZgHESKGNwDHSCUjCwCWD3RwLMCf2RwBAE2McwCAn0IDAD2lAI-hHHEAwDzmdwoP_Z9SgCjKJo-mYyTIN_ERK0pxCGAJ9RGEzBbW5JArvdxVEG6KcY7CMJbiIfEWAh0HNbDAiDwBiwFhhFwjgFRAnQH-gBB-MEkwcmnsJQcuob3JxGC-QxCsE_glEyMBCiQN8kQqDERwKmSaARZ8CoAE0EVhI4GAW4iwMfk-hkBwmTNJgBCgx2UgZUIghwKQEUAD8hYKgoPbkAI0kwSBS4FDiCQMF1GJvmAqxMYCIKboKLwGaEnlSDkDg5Ayj_SGJgvm-67__eFwPzkZ78CKYAnYaIgrXAAE4HZhglgEKMxMBSYKhpQCiMUB-fl-tt99zmgSTAAgLLAiwGYBBNkpO18OSXyQtgtoFesLYosBZoFAzuvhWAOJhnDGeQuxkk8D0MurrvLxKlgUPAgNGP932E0Qy4QhCg32n6gUtRappCDCxPsFwIsJqAAhIsZ2AOcCxOTo4F8wDWGA3WAlh7KDr1DWPPJ3UOqnw_pxM1TVn_6_ff-77_rbSbqAj8IU7939wi-70E-wuEE-j24kBo2mG_s-C_WXgg_GUOuEJDo0aZSMhcInhviI61e71AuQXoSU1BeBi6OwmhTzmAio4agwMIP_3VKd3LmRyK_dEq8QZuC_OKkQ4ld429jIvAmumFG5BwuaUrdKxjo6AqqWTogHYrE9uLwWopad0ocZdgmZ3qDYsphySyz5awKUIWOTe-QRkCXyXlvrlSGnRiA5rBmkVUQFSPH0S2icLF_JIIVGwRDVqxOB07_cENcKlKKBDlNDT2wvOlnmUhAjlOt5pdcojx1QI_pWrM8MnoOlJINBCPHq-Jncz8wbyI1t7tIMI0zwEgVrO5qXkxY_P6pRK36-0cLuMTuW1M96AZdKT1O67uC7bYzUtWEtlLOE9ZyWTLfl6x0pot2HZNA78emCGqsWHDzTsqsAWhjYAf9vaBjuN4L5WnyJUY3zLR9RJ38KA1aqilOfbPP-_nrD7N8B_7wj37zfOxrOdvt9h4i6rTZv3wFAMQnb5-ehXnV-1uO-FzO-R77W5R8nM74nvtbhH0czv0u-2mEPa5Hf79fsGu-NyO_PxC81ej_2N6wUsVe5_OqL18f_Km18G0uR9WdtA8FcFTE_lPKlj7FdDp3l-L1vyOLqZ_b-fPRHCx_rRB6t_ZBmDRhMD175MaflIT5-HUivitnF4V_-JwnMaZT9zljsfi9OaX1z0cxNul-ncx5-3M_10HHYLvN9XzZ9Xbe9cz_qb-Pp5_oPB_e3JvL118KvKnyrfdaHoFvVz0T9Mbup6aAlx0p9dbTh-XbZrert-F5TgD7vOmO8jTt51x99rvn9z27OI3XgUeB4TjM_N4-_r3p__rmZt5__eH_8NJSR6nP2IlX6HsPUS_QtlnxnID32fEvfGW17h7A687hXke-I3I3CH4TmTuEHzHszsu3BHkTlNuGHGHkRvXuUHtHWjugHfH7rvDnxH8FR264zi4AibnTofuvOmO7Hdgunn2TjPuBOkV1N9h7Bn1boB_5w13PL6zp6-B_w7Ld95wZ1V3sLxzqzshuDOsV4zgTrbu4PwMvBN-39nXHbmfMfuG068JxGtudkf6O0O7U4rXDO3OBu6sDAETijwzgDunuNG352V34xTP6-xG5VBiwvg70t-X7X253unendzdacOdGN6J3gTpz7zrDv13wnSjvHdK8UwFb1vru1TwRlCfCeGNrNxp2jOnmOjInRvdeeKdU9zZ4kS8_h5OMfNOYrEvacOBaW7hIvvNdpCpBcD249U6u2TMzpudnW0kQvENCxNYqzIEmzdcf1CVkO7da9hEqIyNO9duTWdNHm5cRNMgElLC0F_6gAsALN5JjBgdr6cbJ7AvVypt6Q3gDBzTQKdP3CBETldMnwnMVQ56zK6VNlt1M3VwL-lQF1HKJyE5ZMlYbJzE7nApWnlZnsmw7MkgKDFQBl0hfTXTVxAWRPH-0kJwfyybdqp4CgxjmXFoNFD9zl4mJFwbEhnF2okFCbQlQ8mwC41gncskU3fH9LIhx0sQCCdBHgPAgaxAdiHJrM2zmZv0We_E_ZlaJD07H2_c4AvuUN-4QZqY_fGyEi_56cYlblxBPM67Y0byOTZ8mzP8_g6b77D5Xwc2XyX6rwHzGe9ugHnHyk8Z7bex8gaqd8C8hb7nbOoGdXdgukHlHenu2HlHqjtW3tHzdbb7-tHBHVXvWHkD36-g8o6A34HKO_jeofJOBH6UId-n-DlpvwPlDTRfA-WXmfMdJ--A-hot70B5h7wb6tzR8hGcfP0k446ud1C7Y-Nr5HyFk69z7-fHHN_DyeecfFqlr3HyeaXecPKO9a9w8jlXvz8D-mtAeaM0d7i8A-WdUn0PKW-M5O-CyuANVFr0aZCNcgnS8SgFaXB12PR43GrHNPOGngdpqWMI8KnjmOi6iY7t4qpAp-FCmZ02pclEpvP8lT7z8xmAUnpG07LKVpSxDLYQvOET4lJJUE71pHqNduEc5dm1dFkHrUyBiI6DtP6KeaeFd-k3WzGjl8IS4JU7pcmipVU8tKm5mlxkp_DCpajtm93uOe2nEjuLTAy3HWpLHFbShaJMJchQcqfbEWOZhqkBqAKQSXPbaj-YBYDQLQ2gFzl35Nberi7m6HYVOjL-q8cE3QpqEk-M0GNfxsRAxV4yqiDtlrQaaGblVamN0nLrmo5CaxELDBSotGuYwvVvafUNGldTWk3eoPSWZjuFHQTcn-8w-f8RmPzj98kftyf8IOWv3_4WcAObOir6fWM3ixi4obq9Xvf5palPbe3vb_Bj-HZZ5DeJ-5P0Wx-Tlts7WZ__rI1qV3Ez_utJZVXun3xUtOnTvily_5_zwrEBOK_83k__ecjjS-s_iYt_Pbmk75AU7gYegfpoEFA27no4juEYQ9MIY3uE7zM47tAu4mBwAGCDxmHapkE8tx3HDf55s0D2Oz_91xON_VPMyjR246b-1xPyT-q_PcW5C7xfA2_ep3jyolLk0KcX9z49v1a4_uf_Q04Ot8FMsE1TxU7b-OAiPV1c-AOgEWBgT3buPYl546dpHE5-ettFdn_l7n0q13EOMLl-8nw7fULI1-3uL7AFPqmqtgQzfZu9deGpdh76z-58qqYvf36Af_v0YOhtC_SnLbCftsB_2oL4usUfv08ufzv76Ldmv4qzp30cRg1YCICHpeMTN_pfrwAEZXCPdGyAfEGA-77j01hATuEJRl3XBjCCMiBN8GHcZuzARTAULAkC9WDc8X2SYb5cAbdPqn_51xNOvl0O9Os54NNpRT7NgcWxa0_LtIrP_tP8tmlfJu__be_amts2rvBz-SswmUlflLR7X2zbdEZ25Etjt4pk19PHvZoYk4QLkFbUTv97zwFACaBAiRSZTOJk_CIBi8Viz3e-852zq_XUfoqZ6T_3GpwWAZOBd4HlBg3ljdMDaN7YFbQC739RLLOrYjlFXFn_oR4igxFszHRmQyhw2QquPSuquAbJsDG2FYO2r3CGF4jkzw5VfARV5-CBcV4uCnCzp6vl5BX-B-3Z09kKhf5dcIEC8h4Qw6ngnnqhtc1za0gCIeVwAx1wQnA-JK2kCM4xk3SiFHRXopYkPgSX7IFL6T64-OS_Hkk6hv-dhlADqLMuLmRNlKpv77MMWgCQhvcz_F-nm-FnXaQc9AjtL-fITRtPQWRYLP-UDbmGjHDNfxOuyq4gLfofHRtAVtTZM3gCIxrgD9KMenLPeyEClOuXnwhE5emQOHd9ln25Zt2zWeNX8AEXsS7qJfrRvf00LsflXY6fPFt_a4bm-0X5wUYL9WALvZsviRFfOlsspxVMLJr8-QwAeD9RExIh5_A8OcOEkjKXIRiXS6lphKyDe6UdC6CqKGSLOnrI_EyMhAWfPJF8SNS670tyg6iZ6BPp6aeyCJmLOMzLKTrHBu0OAb-FoFv-lNghVzuRLW0aM95vfD69rptw0T2A-H16M9InMxgdvne2bpAVKbsuV9lVvHkJfAroiCYqXETI52G-PyPOlkOcvf37y-_fnk1AA1bzelqVqzD5ZwEStbCLuwBzhsQkDADHJZJzCPCa2NxCAikhO03c2hyEdCRGusRwV6T3RkbFFdEpp5takAwxNTCtHGHIE9py0W1AveWhCUxFkYpY1dji6X3QxP0m4EF3SO1GZ_70th6zkxq10zMQ7K6sFtkbTDRwbmCO5hMQSfO6HLOYMkynYLkCo_GELq-lykPONJ4EaWLSPKoUIdd3NkrinQd7BRmkINQxvRleL2woVmCuJqpPbvMgNGDPmmTy3BYL1GWg5nv-m9k6O_thWVk0UVnfxL75CpIbiHxdAOnCZhvpqtizc1ZW22MRQCZrBzi5DWF94ump_8wuM0ma8cGIs092topHsveYNfXD1vwWvqFRibH6VNTTyUW0mH1eXpVVGLC8yqVPAouHAfg892jJEHVILJioXfAiJ45oK0MuNNw1XFhppdIsUZ8PnVCLyfcrO2sGxcikUzYQfr6--PoJ_LvILvphwAxdltK-m25SLxvI-VZbd5wv74kHb6ri_Xt05Oa9SPKv7QIsVi83pwgsXqLF5x-b0NC1aghjs10oautm8IMrQedfNalyVs9KcPcHnovZ1TTevCVrdNfrOIsRA0SdNdvwENbrBt81YnI9qBtkt6ITWUdr_bnkBHtrofzBFmY3f8pH_enCzuyHWE9_D-at_1xnAFa7LJoyABZl0MRPSrT5aTUvVxXAP-9-fAJIPI8VRvtiFpHAzhaxeo_7GIs4CwB23V1pL9xp_weqIOHouamkJAjnqNdMc2q9c4omIh1nNnCROxtIiJwbLZ2hkQUaiDEkBB8tyxVxm8w76qbgoOioPRflasjDJ1Q3QfNpOQv9eHnC6JddqAQe7t1g9_nmDUxRSZUh83axKJcQX-GRBC_FO-BYIKigaecYoAAR6OvSy2I1d0BrwLtni7CqGlLHLanvIZf4pWsrM4rK1-DgDqdr8gIo_Tp7EmfLPlKSY5Yo1EyUqkiIyXUuuOMmiOQZIzIoljsXggZ-R7GllbCOcSU9N5yEIVJEv74ihnx9Cp9QgUGAiQZlsVOwwzo1OxFkUFG7QdBGJL5F0Aay4HMLn70Fv8B63LOZrT_UPaC8hRfCENNyXgKj82y8OQhB6A0znU6tTWNRtXe7gTZCD4E20sFNk9vXVnEOUA6_BKJVu4GNkuNpisC1E8YZq0kCQa8IsFDgTFHBKWWRYM5okrFGSGAwTgNLQfsgQfRDXknoprAf1xStqsiGhDXUFOy2qDJQD2c_tE16kXOt-IFZ3i-K5SoAgSgyUkE89R7w7a8hRKOknHDymy4Z0SU5N3d1ya-tMvOwGtmcD7Kjt46tv3yLlPq6WDbWrpbXFUL2U7zVJ8ywbQLlD7kSbFOliPwBlZJzzgerO0kF8GcHuaDPTY47ClyQ1Mo82YRZopC5yxWu_iiHdX7iIO5AXsGohfeLyWWEDwK8nP1gKz9ty3lndtlG-HdlNQN4NRd3kTOYcwBH9NgBBNqAHV62MqMNRkAKZb2qYlfD_6qNFTiarykfjVnvpjAPmc26GYC5ml9jYbVoNEuVnVexRrn4VSYHSwUvYQLnRYDvap4pwAMTZKKi2_lRdyOA4NmWWhuTQeSUTYVqsOp0ovL-NfByOznhbDzEcrO94nGCSm1Mwf3KfTbf0SE3lsRenz5_-XRy6qKPAS7ZxTqJ-H5V-A91McPA2aoLQPb5bDUH1y3reqD5tVDMpihlBNEm80BVguSbaRmsST7Pk44uRpoLk9vEkhbgd44Jp0DrBe6HTqIGTtKLmGRLxNSDwBZbPXdzFysydbYo12o7A_XdeG7bjoPKq2JYeYw3EC-xnrqRDHQ9ivyB4u9Gz49A24-EpVEc8B1xcDqPy-k1RPsbEOBi_3f2A9wfrGhp4pwmgWkfSbA-gL056HpBhOEqKK04yRkVjuJpZDpQ0P5ekoQ1txid31wu3QICtgUEKv9JQCDFbcvbhfunq6pu1Q_W1H9RMBA70wFE6v8MQfACl2Z6ENB5cjoaG03uUmI-QEglOmfWUeeo0SCktffSKAa_2EB98DxKwIdOyTAu7pPTtxBgehsEzCEQ4LtCQG8Xyw-Znv-cVt7oliWRf6-Kao5f8SZWVVmBgeu4zC4whRhk79ITEqQ3jjCelIaM3TDBTYy4hS6GqCnlUTmhtLMqUOeZkxaukZyDxtq-O4Krbdk7I9uy99NFJ2rewbc0O5pAg82z-qO9AqND19V1xtaqZdLbBIX7IdoEp1vexkXdZp0MnBlzh6_aLRIWRKTsOoDUH3L_8moxeVXWETOiprL-EfpoB4HPQebUrgU0UufuzYMS8p-wtkPHF2S-jaloFyYSpGe4On89ObcrC-FiNYuDOo90JhIlDZcSyIBIyw2HGACIESkXIBaEdgZIgeQgybFC6CUwA1fWC2gW9D37aLbl0KezWelBtWIa-CkuylWdvYDUP074YLtTY5mL-D5C7tA4PKbKoDB1fle-4kapUam6rc6Yb5ewDTBwLRkm73VR13j77QI1ePUJhtWgyUVQ2rETGLgmi4uzHcp_2ziAnzy-tvSdLefrmPUCkrTlBHLLqkAInM_QuuscMzdya47J8zwfBDaV476CEEQikYdkmUqgZxUxiRKgQUWZIUJEK31OvBbOJsghDYGckSdILbdmgaa_cScflrBf2CZcrXfdnFB43x1cHruuNzrT46sOWGi7jLNU1FNQwPHjNFZh8nc7j7NY13fiRVAMcmevk05CecdspBYPWWDWJ8ON1SpgMNFSCKq9EJyx4FjgxnMG1vDbWWAzL5CDKHFnofsmuq8r9tj-AUk3eY5LqnU2a0pgjGSnqcnHUSMMGOWprdd1M2CGvrUGFQswphlPYj_XBbFRXJmtuLoJ43-zFTgC0PkVzO6La1dB0tVo0D62ILtQ3MeccWpkZCg6QGIkQUJSUevgc8aExoNbNOVWeYAio9IwKwKTjG4sDW9LPRQZ-ieacI2btabEML-q40T30oTTeVOTvGi3VYNlX7ZF_vWV6wkbEy8gW2pvP8ZGabeyu6l8rnAhYaMl7tHDA0aq8hpe2DTDsszPB0Kje3PJkcyfmMod5JZALjJpwZ2ARDQ3OgYBllaQYEZJrVEqJAZkLCiR3lHOYzCOCi43938dwfzsN_M_aH661fw3Fn9dLrC8Onlm4XvTagYRHTh8ebuOfU8MJ8bQzTqxEg-tZgul-tAyMQ_WGMsJpYFH4JXI8sRpiByApDUkMoICmiwgjvkktfI5BDbpnKfe0g3tqm-hRdVt-fdd9iS7yJ73y798A2uSDTKfrs7KxQObVIehsNGi651Cr4rFh_WGVQ_CcokIXnbrH7g2s967O_kXVoixORqk26y2tB8iuMqXWRPru0WTf7QZE-ISZDWCco7rmbH6Cn4HSIRyPuwne9_k5Lhuc7uPDQvMIHTWudpnsQPxEma2G_H9f7fyu79czsrlzREY5ItsAYLqmy_a9ZHs1F3XtV3vxM66QzrO3duLV998sR7beA9PynDdAWezG_ZwN3rdTTvqjGaXV_bjPq-Ps-Xme-Uez49PgDxwBGKP57svZ4-YvV2MIA6eDPaYj0EzPmIolK17akMT3-ERPnxE7j9c-iM5AH_MUMZmbr_xlMujA1odjCK6Rw9tND5kNsd72GEMpj8LR_DiwwfNjgUicSiI1LGI4EjUtmU8zc2XAS4Obnf9tX9y1B1FNTyZar8OmjOlhkdM7dNBd2jW8AytfTroTr8aHoa1VwftMVvDU7ceDy_5eGt0B40Nzx3bH5_iWJ6yS9Qxw6jDjhB1Dg_V_ECa50dgPHEslpAHU6c4cDqOxFPHUCT7DKU5A2CvgDvqTrt4Qb7uAcuye73yXgc8muRUxxrRDp9G9QgWDjUCO9gJ5BF8eodppGrdSbtSdwTM7zDnjAxpmB5MoeI4Pr8LXsRw7EcjTnqsjnZhgDtWPALcdjE8HaL-EW892LN28Qo6RNvDT-QDOjiCF-1iRDmg8X1mpnmA7x2c2BFQIh8L80M5mR4oK-gRrDr28W1x8DIum1_eVDZE3E7sp-8iVmjr9gD85kycv07-8sdzu5z-Iz1ZFbMARvzr5P_3VCpu

Probably only needs one label here:
Image

Bandits are highlighted as different when they aren't:
Image

Duplicate tooltip:
Image

Might as well disable this button instead of having an error pop up:
Image

Power report seems to not show stats and shows items that are the same between builds:

Image

In general this looks nice from just clicking through the UI.

Several concerns before looking through the code as well:

  • I worry the most about how much code we're re-implementing here and that we're going to have to implement any new features in two+ places and be a nightmare in general for maintainability
  • I don't think it's necessary to allow changes to the compared build (e.g. Tree, Config, Notes)
  • Saving compared builds seems problematic. Even compressed, you're easily adding 20% of the size with each comparison, and that's on a simple imported character vs. a complete streamer build with a bunch of loadouts and notes. On top of this, you can export/import a build with a comparison baked in and create a nested group of compared builds, ballooning the file size and making our 3rd party build site consumers pretty unhappy with us. I suggest leaving that feature out entirely with this PR and we can re-examine it in a later one.

This is a monster PR and will take some time to get through. We might be able to do it faster piecemeal, but I'll leave that up to you if you want to go through that trouble or not.

Copy link
Copy Markdown
Member

@Wires77 Wires77 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some of the UI elements could use a spacing pass, like "Copy+Use"

I think you could hide a lot of things that are the same between builds. My test build is a bit of an outlier because most of the build is the same in both cases, but I don't need to see all the skill groups, calcs, items, configs, etc that are identical for the most part

Comment thread src/Classes/CompareTab.lua Outdated
Comment on lines +2251 to +2256
if layoutRow(self.controls.primCalcsMainSkill, leftX, leftY, controlW) then
leftY = leftY + rowH
end
if layoutRow(self.controls.cmpCalcsMainSkill, rightX, rightY, controlW) then
rightY = rightY + rowH
end
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can probably just loop through the list of control names instead of having all these if statements

@Wires77 Wires77 added enhancement New feature, calculation, or mod pob2 Label for features that should be ported over to PoB-PoE2 labels Apr 14, 2026
@mantis
Copy link
Copy Markdown

mantis commented Apr 14, 2026

I don't think it's necessary to allow changes to the compared build (e.g. Tree, Config, Notes)

FWIW - When I first ran this - I found it confusing that the config didn't match - and that was causing differences in the numbers. I'd like something that lets me compare my gear/skill setup to someone else to see where I've missed or what I've forgotten to do.

In terms of the saved builds/comparision - wonder if it should just create a 'comparisions' folder - and in there save POB file - can calculate comparison each time, and the special comparisions folder would allow some organisation?

@oboking
Copy link
Copy Markdown
Author

oboking commented Apr 14, 2026

@Wires77 , thanks a lot for taking your time and all the input!

I have pushed a few commits for some of the things you mentioned, and I agree with the parts you bring up.

  • I have also considered what is preferable in terms modifying vs only reading parts of the compared build. I started exploring editing it when I had the scenario of a build that had chosen something clearly incorrectly in its config and it felt nice to be able to correct it quickly when comparing. But I agree, lets keep the compared builds read only and keep it consistent across all tabs.
  • You definitely have a point in regards to re-implementation/maintainability, I will explore a bit more to what extent some parts are possible to factor out, but it will most definitely be the case that its gonna be unavoidable to some degree unfortunately.
  • For saving the compared build, I very much see the issue you are presenting and I agree, probably best to keep that functionality out for now at least. A possibility for the future could be some kind of check, similar to the one that already exists when exporting for the "Export Support", and then we can keep any compared builds as "opt in" for the export.
  • I like the idea of having the possibility to only show the differences if that can make the UI more easy to read/understand. That is probably most useful for the config and skills and perhaps the items but I like the idea and will look into it.

I will make some more changes based on the input so far after work tomorrow, but again thanks a bunch for taking the time to even start reviewing this huge PR!

Copy link
Copy Markdown
Member

@Wires77 Wires77 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

eNrsvVeT6ziSKPw89SsUJ2K-lz7qJkHQzdd9b4jy3lD-RQGSoJHoRCOJmtj_fgFKVZLqlOqUm53p3d7e6VYRyEQikRb29_978NzCDkexE_h_fGN_Zb4VsK8HhuNbf3ybjGtF6dv__T8Pvw9QYvdNJXVcWvJ_Hv72e_67oLsojnvIw39866IIpQaOvhVQrGPfKF-KyraDzQQ5_rdCgiILJ9PHBrkVaTBEfmLjwO-idRDVA-OPb2MbK5Hj4zZp7Krc8c_l9ShN7E3qfit4BKsa6Buc1KMgDf_4xn8ruHiHXdIZhuDWkG84yR_fqhHyHEKbbhMy9QRHHVqplCZBNzAIiSZyY_ytsHPw_vSh2R30R-NvpKt_-33gogxHaoKSQkz-9ce3EuEYsnDDSQgIclNSn_n226t1lTSKkwryyM-fw6ghxsbPq5UjJ-mmbuKErkMZf67P_srfgyAUl23k6xcaKJfuVB4HCXIrA_XnhJxqBhdusAIPRZkHv4oCz_PsPbiZk9gE7LqNd0AqLuHSm-ijtZuW7yT4zdUHgRMH_rt6_4FulFPXJTL-pmZGOMbRDiXOG8kqB55GdMj4CFlB4BrB3r808ivH3RXwCKO-WTVNrCcjZDhp3MVJhOMnYO5X4R5sF_moHMRvUCNac4AjYlmSdwGoWA-IMXpvG--E7DgmfnvNd_XjDPBeaj7Wj6r61nrvRvwxgkbEXr6tphqk7htrJhdbCQC8r2_bN9as4MNFw1juFYS3Ne_qX9O_MaWvILypycv3KdwF1HC80ZhVG4MLVo7hIfiVY2XICuBu5wZ2Fjs6crvo4HipRxzNGG3wpUEgiLxwX2AtO_GJIbwHTRuX7vKh5kT4Y5BlYuc-CGmjIL4HKgLm_qhR7bw0InEMfCUM0P9Bqzd9_UoeuNcwT_wo9xNX8QMrSpzwGsyIKCSNUjQXvx3o0tBZs59AZfFXCDlWOv0DXm_Zwv65-ewJgSAB8Vf5NbgOxrpdJ7HfCCX4bYb9qRbPMq8ynFa-Zrj0GtYX2C2ybwN4zjaW-1UGLC9IAhAh_yqSl9nGCr--Sus7mVb1cWRlKond3UvnOJYX3wLwSFwZhW-CzTl_jeBG5MHbmnyJKW_q3js5M0OR8TbX9U6acuObZ1YVCniljED4leN5-CpgDyejGzCeZaVfOQjv6jGBeNLCa_0gGcTrUE9C-CbhIwA_DNQbBmiH4muXdd_3nITnVP1abri7_OpikjsQCAM_S4fuUjOIgjUJcB33fWClyAvSSxAhMAx4tRen-jfCf98_PPrcU1o5wkaq3zh5_i7HTtG6s8OKS5LnZ50B_E_BCK2u-xLsfVUtJQnSN5XAsN7MvLyVd0HcEqimYUisLRWL52TKr8USJNNyrgJJmfl55T5R8Gtbx0rSazHHm1u4VP6hBSD-NJx6czPPIJ63JcqvhkHPmhH5N9R-3gSQfzqmXWJFPeIx89mRbnAxweDX-7yokQz7TelyXvE2ib9vDII9od6mc1nx-2qTiPFinu6SEmH_mL0Z_031NzVQ9Y00ogrxvA34VojrZh6Bxo5HzGocV1CCCsY545iiyEF-whKB_fb8I8g_xvn0Xc1xExxViGTQVmhvCzFGkW53yKc_vl3_VUOuqxFbQr7Shn__LfeY9Nc4wriAHg2ATtHnlNE_Cn5g4JhIJydJ3zlZgux3lpGA_J0VRJH_DhhZEr8DjgHid04QOPhdAJL8XeCABL6zLJTJZ8iKLPkCofid5SWBoIGQYb4DgZWF74BnWPY7lBmJ-c4RKPG7wIsC8x2yHEHDQlb-TmoQNDwDAfgOJVoFMDxPUAJICJA5niOfBZFUFCBHPogsrQcB-U1iQoaQwTM8qc1RXLIMpO88R1z8dyjw5AvJsEh9lgEcIUyQoUyahiz_nZcAqcPLrEB-QvKZBBIMR6gjoeZ3SJI6UhECBnznSIpLmEKiBtI_hvTkO-QEkVJAugRk8uU7LxLCoEySg-886TD4LkMmZ4NEPoss4SNFQnjKiSz8TvpGkPCkY9-BxHGkAyJHGgAsoPVkDhBekGj3O2BlXvpOeEyqQEFmSUWZhZCwERJmsDwkveYEhrBdYAnx5N-sTAhgeUCYwZCRIjmURPrPE05xDEcHQCDg5E-OdIQn7QDKQNJlhowroY_9zrECIZmwksnbFehgEQ4Dkm1TMglFBIckkbHhBTK4EktQcZxAyOd4QASIZwg_KPckilAkvwFHElzSOY7Ki0CEinZLhJQthArSc0qVQBnH8HQsJZnJRx5QIRMJ5fnwAV6ibTAiaY_EexLpLOk3EQPSOzpOAkNIhYCwSOBkUfguQtpRXiA_OU6EpAcSpNIMOToipFOEL0QeCAoiZ6JM5FEmYkVlhXj5QkL05WouHkh0Qj0mepidjC5Rl3-e5JqkcwD81_d_nkSQMoIjf50EjJMgD8lfJ_kBLBQkWjPnBBFkic1rEi2AIiE9L8olAJLO_xdVbDodhKKsdFk3aBpEd-G30_pC_sfNsgL9wuWq_bffJ6NO_uNvdpKE8T9--22_3_8aosQOTHwg4dqveuD9FhIgYhSK8cZx3SLt9m8l8n-KVRXNw1H3hOp2PKk3JmayJNKO6q0G13WOoT3fceyRk2xP8ab1-nEnOmXlUIrE4q5a08dg15KHo4Pt6luv2DosOoZSllsA4c6gcdSKweLICWwC7EVrJQynqNGAIJg3-qORsy3GDsq2plkVK-paqA6L8qJR42veqlSPmVmrW67HHMf3lp25a-s7bRvU95lsWO1xPXLn9b7b5gabqGnFutRZHAeisNtV7KFVrxyBWseasd33B8ro0FZHi8UKtstaIu4P9qzv2pPNplfZKPXKHPqLQ-LEXu3Y7dbgqsXOZ1VvkzCBXD8swhZrDoxiP0b9-tjHJW6xw3sYbvvpYBepRWwZtZ4rWdJh12elVWI2S2LkjBsHy5OA7SqlilUql0qCVbYU7tBfaH2hbpeitbGJpeUCBLox5hrcwdabu7mZyKT9P_LB_O1xNH8_LerEp6E9_1VwEuzlY09Eg5rzXDKogp880I8VAbhUpKbqbj3xUi-3_vcqclcIcwN9tyJ_VZFYnLstX9XLjdLdivKlYm5Y71VkpUvF3DPcxXhVMbded_vCXVWk9uUuRvaqIvWKdysKVzRSl3m34lXTuVm-SyNzqZh727sVr4Y69353m2auOyOCu71mr0aGepS7LV9xJ_cldytecYfa7LsNX0st9cF3u3KlL3mEca74-2_XavY7jckjh0RJZyyPfxcM4h7GKEmCoBCYhcTGhZ5Fck47LdAMaI_cDV1-dHTqRkpR8huo0H-r1Ng2ycf40f7Gv10yph6h59eQru-eAraTx2nSTPYayaSZf4p_a_p15BGzTaLDOImQOyYhpPvb4ISYBn4nAuPfzqSRcg2fi5X6qaWL_ghQPvmPv_3tF-HvhSTIe1I4kUYj0BMHfntkwf90jtCA6S-GWDf6xDB_ceSKI3l8_hdHrjgi0EnSvxhy5SYBkPgv5sgo8K1gk0bIKdQD1yGB_ds4EiepTzr0L2HFhaZXFYYmro_cYJm_FxxfjzCKsVFQCXGFCkFAZ0MK5P-rPvYcHL-bOw3Hx5sgQgRjEGUJdt23SkyeChlnEv4lXHqk7TUe5Rn0k8RwucTks4TvE5lR6mMrQmbyyBclSH3jbYwoJSSlpHSTcSVo6hSN41u0FvcBvkxJC-TvHFf5jOtu54EsPXYeEAGJ6BQ-EQ8t8NMYxwUL0Q08BTMKvEJ1mzphSP5SgiCJLzAXoXoVqu4Gu7N8_a3jeCQyNCiv2cLLrPvfZsnpNN-_yJTPUOQRe_FWhpikWSNf0Pn3MUME3CMz-L_TPZMELWXJaQ_d_zLZgIzAc3-5-ev0CXB_MeSGIZwofzVH_uyePV9H-Lxn_x_lZQAn_CUmz50NhP8yMfnzuV66HvSVrvfPLh75Qu1Xi8efPmnihL9U5sn30oXwv6LVJ3bQ1eW_grPrSSm6seL9HLn8mS-H_P4b3USSbzeh7dMfeZfjQmwHe7rTLIiSOvbGWUh3mZQ6nW95SclNhilynSQjhfHTQbPzJhWKQcXJeXOMiVKX4jgDnDbBnNDGSlYZqH98S6IUnxB3sIX0W6Q3dWt0q-WzU0CXJjqnM3J-EHlPe_bPe2XONBUc43H_zPljftiudCG8jFw9Pm3hcQPSh3xi4hudkHBTwnr_vPXqiTzs0x3mxmMnnmF7auxvvxP6zpXrbqAhl30EsU7LWV2cIAMl6LdmQnr7G-3ySf7Ir1oUxInmOv7mW2F7xcfzbwpeOXHhW0EPUv_E-6cjg3RTU743iVa8xvWM-GvywNOw5DrwDNAngnzajHT19bev6OmTdpWIQ_pAb-lq7VVvB2lEQPomxfvO_t6CXnp8-k7NSF7ytOhI4f50guXi2C75BokZfPwRbj-TrVt07xOvW9grCaMFBeTTCWZa9BVilu_8c3yrTDewf7bXN8je1ecbyEuPHz8X6PePytcMozDwC-y_W8RO-7ip26FbKb9Gq7uIfA9cnO9-fhfHbyAvHL_-_Gdn-IA4TOReMZll3-opbk3nGc_7jOYZ6Mpcnr58SmufApEyipO-X8H5gtn7peimf2esNyjf1deXEFz6TT_TRbBTwUeFqoFdDyf_bpEa0Z30OEjjky98Yjz4oMV8hu9dXH8Ge2H4U8G1X_6swNGTRAnd0f-BPrMvidsTwo-I2hPwpdePn76mu1U3P4yA3Fqgp_HX9fo53o90_jmOK3_5WFI4FX0NL0YodIwK1lH2BRJ_RqvuHTMpmabrnA81fYQRPyC5cCIvKlyVfZFYmKajk8TsI9nHi-LwhO9DgvAEfSUCj98-6b3Bv83UvmJyPsXr_0iDc_Yrp6OTp9M3X6FkN-je198b0CuFyr8XzgVfo021_DTC6ejg15mWa6wftLDPUFylYHlB4bHkozp22q7x7w5mpk6SM_nzid8F07u4fQG7cPjp29eImOIGgdFFlqN_vpdnrKUoCiz0_ozrR_BLry8fv8KaDFLfiW0vv37gs52-xvXOWaML4PWc0dPXz6aXBXVPDfK_OcfM58C-gs2nObZzBBd_cIruAv7SNN1T6ftZ7yKNUt33C21arxv4uSGsHkI3OJ3jf-s4xEEa0SOgOajx3oHxHfeW2WfG5t8v3j9nzABFJ5a_zsoc9GomCnvZE20XLv7Is_NPFSf5usFpvYD-zMWkkMb4dBXSSV7zdYDHmXy6ppCgpOKYJo7oXEv8SNtp5YBiOC8c5C3Rv69n7EeIDuk_CqPSqPpQiZBF9GEUIOOhg3d0Dy3yC_UII7ol8HTlwD8KUGbOvxUUP94f5bj4HwXmV5nlhIeJ72xTXGhW_lEAGiNxPANlXoeGACQDMBxksamJUBIETRMNgQcSz0IIOc4QWEFjAANEiQOcrBkMfsjpzRch_lGQpIfzigdBzDycj6T8ozAr0n9GD3m1Ed6SmvCh6YUkYHdoOXi43VRLw61CfrkEPm-sJf_BD7-AfMnHOy1y_LD080-TXgiYRtj4r19YIF9XpQgffuHFfDHRp-vEjkXH4gGwb2mXAy8vzXI3VD-eai_kx9pJl5jrNczSLnCMgobzKU6byA-p8k-dbtck9L5StxYFR-zn8tgNjBHyLUyo8q38Ljf-21lUzhJ7twb4aQ3upzXgT2vwP60h_LSG-NMa0k9rPN5AkFvxW60Ct1o16TWHk-pDD2up68QPU8p3VcdhEuFrLeE4qOmcjjUoYIYoBoQyp8uQ403T5IEmCBLAEjYlDTGaZCKT0xloiAJnAB4IGnimJeLLWqIUR8X6lY4I0rWO8BdpOUMXjADHBT9InmSw8HiPSOE0AX0BqRMWJXHhRtrpdX-5q8iXcAshsfHw74Uz8gcoXdc94xP464-5Ap5LeHBdctKUcxHLytdlj30i-mI4pkNaJbV8JyEOJX64rZpPJz5q03XBZfLj1EZOPOkcpeh7gV618b0QRIWnyzCulLaANKKnBZH_-1869YNOvaQx3At-KA-1C-UIx8lDncY1cX7NROE0c_vkiCTxniNir7VLRMSvQB6L5Ics8pop8ETXOF0gvyHRPE6EBoM4U2RljhMl0UCIF4CsmxKnm0g0HlQbUQGgJD9UXePx543S8Rel435wTbO7rumxKt14T109IiJ_ju7pRv3shL8AeOJXXlasNyNQ0iiX1bPavBWsHPiUrdRTGS83aWCiKNRXeQHB8lx3Hn4hzv0HZ8ndaPoz0lj-vh15AD8WnsF6GEWE8vMJmUKCNrggv6bWf2noF3k9-KLXqwWpqwURiSdJHBk6iU3Plmj4YUzyct8hkqCGDgEonOaDHk43f53_IiossQ_Xl4H9GGsyxEPeeFFDlBgg8yR8xBIrQ0bXiJMkLhRIUDI5Q9c1ZOrINBlD1AwosxDrLOYRAkCSBdm8VWjuZS86etWLMg8scVTlp0grv_mqkN8x9STc4MaV3fT6mRu60RgV6RHxZwQvrUT0ISN27xRS7m3s0z8LE-KjiV8aR45lESuFzi3n-cTDjd5ck3TybgxTOF3mU-heN_tPL02o6v9XhWo5_6PTLtBl6AJdh34Vz3-Aqr1ZkV4Scf5FEW8jF_lGhP4_kpfF_39cGAepbj-MiC27FkwTGLqmMZymS0DkRIx4zdCgjBmO4QwT6SySOEljdRLcsbrJIJFjIMewUGAYhhUM9lYwmVuBG2HTpTewFAJivWMnIRkGbf7lXgh3ehF4jz1oECNKnK4bRA5d9iNDSTKUR4fLEorvpn4iI0vXvZYN3WBF4koRNDVWkiXTMEWMdUTyPhHrooCJPxZEoPEyJhwQDE0CvKYJhsgDmRP0u_6VqON9_WsgGrMWzvpKnA8AzA_epxxEURoSqf4isXyJ1eILcQ09Qldo-6m-cfFDlxhBk4SShefiohuQlzgZiqIhmYKoSyxjirwp8zJPcmdNYKAAdV6CPAeI62VNwkBTlllNMwEQBcA9Z9wVs25iD0i4UxhE2HQOl2AZuW6wJ4wpAhIPmNdF8VPZDyF2TEJpn2YKCs6Nn0Uq8Tem7HkzVzH5L0DM09-zOQmezMnlxvqHIns9hrc28xcO8j-McJGM-_VHeg_lJV2BL9ixv4KBLwoGpBcEf4Acv9AgpvJ6WgmlfuJSJX2aWCLyec-68Cy4cfZIwqImIchigRMYFumQB1BGIs-Igg4gy4qSIfMk6Ec6URBeF3SeZ4mNZQVd0AQNvmZdrqL3UXFWKL0yscS94BAf3aBKsnzfSuyH0_7yOHfRjp-vIxfikADlJ2uDxKbTn-eodU_iJMIr9leh4OW34z-bd_rRmFGLxxZKWhbHxEOfaH_rxBP_8sQTK7wSgLPivQD8Sb_AC8l94bz_DvlZoeaiePOI75N6979Eq-QXPXeFWNU81iTDUyHZsuNnRNdSVCh5KVGta4URAMlseRJn0MPkOsamASXiahkOGazJQllgDF0mPyVWg7qoA1PkTB6KLK8bmsZJ4Hl0fKMGTyNfIi5CR1TYTzl8hYz5hhjwW4mg1vhWHke5PErSj7OqVJJf2Ij_C3fyGuXcg159Z2H-_aW5mQd6c3MBwDx87jpxTIsv92yf1ETDJk1jT7OjDeLkSEqJTvcuZP_rfMRLksgyL4pil-i4Rsf8gYSQu4yEAu6N_MlYMGR6Z6OgMQJrkNBWZ1mWw5CVGYhkACCUeSRgTjNNQaIpGc8zjCQzEjJZoLP3o5qbCJB9-AXmnv_J-p7n5Sv4kGBKMREp7mWRAvyLIpWv-RYmxBPRWdHcdsUF_RTwaJgmXdStmYkXxEkBFl6uTle5EPF3RJjCkPybGH0nujGEMW2buIiX2nuqcmk2wh4JlYw_h0i-klix7IvipAZE_c7HilQyUH78UHNiO1doImM3hg3KJBAGGjIEhqRMJIciSYeBAIeAwAucKPKCJvECIPkFkjQdcIbEmaIhQk1mBVG4FSx4iQSuAoE6CQSUovJs5o6SVZgFkVdQkJM8QOFyMQdBQkKXxyMNsU0C5JQYpGfz2Kc-P6-zIGECGWfyv0S3C9VDkBBxoBW-aCRfHIVnCxfdUr1ZfihpmHQmX1p-zA-HqaNvYselUfpJNB-v3yG2VQv2NzEayWOwLEMkGDrWeDIsnMgBVpNNSDIbjcRtAm9wMskANUAyQGCYvCRjwPOGwTIkUbwZGRJR3UsB4R1nJN6kIPgUblzWLAjBea54vqn4MUA5hyU0NnoczccLeJ5NPp4x0stVkGE4tAaJwC6zjBcb8hz5JwcS_mvnOljuJWGoIE1zcfQoCCUSntoZsXhPUtD0H7dIXguBhJAgCaYENRYyPIPJmIuMyAiSRH7pSIAaQKLOyRonCiQIAYgHLBBZbEg6yWc5-W6gfi0CvPgvEQHwVhHg4PX6ai3C-Ii_kwSVzv7RUzanDODPJQTwjRZhlGrZRQiUwCJZfhzfzH_J0OSQjkTBRDrmTWxoQGB5Q6TTPDLQTYggEAwsMibPI4OHPBZMRkOMySAk82-dCeL_JTLAvVUGeP7eGnsuB6TiO4af-7dHefwbbAAZiCg5XgY_v8bqZioL8VTzdQMzPOBZCckShKxOojyTRH8cYnWJSIVMo0BdNlmEWJZneZP4aZknUMKblB9K_4qBB_JbB_4J41NGgwtcnmPkCQWdDjhdXf3nEoCX54rLjm_gKN7nc4GFSeSTMOgSDFyPvSYwGIjANKEg8lhCxLELvCYiTeQwEnhZMESWMQAZd5GTTZ3jORLoC4ws6wyrM1h4m9YD8Tb6fxoMGpafVkYex5eMGomnzNR16bQwVdLHFYpzjYcR1s91-Seop8WVMgnhUw_TZPBkzg0S1UdhjB8e524ePxN7SAFuRrtgox0u0DNxxtlHvgkqX8R8aavE-a2ga0F7ojTfV_eYs_65hE58yeqoGX3XlcRSpPtTZ0fsapluuEsKLbzHLu3_EiM3SGMf3zoegyOpJGsKGiS_WEMApiayrMkRRyNwHOZ1GTKyDgSdRBwixxDfQzwTS_JQk1grXZdenfN4dZH6KnI4jyQ1j2lEr90L8lF6-EW6ZKGvzX2Ld5cEv3oZ4yuSwBdHVbqzPhxpjmEQoSW2wyPdiRwvJszJR_XGi-i8TBwEj02WM4mBQOQvMobks4BkgDDErKyJECFeQ6ygkbHjoQ51QzQ1VhdF5nYYBaI725RwPS7kbwQUHh8kvs3uLjNZpTh8HEAU-XScnHz19aTSNPfxaKZGlcx7XN8g3bjuHibJ2_tG60U-vjwJOPF9lBAP5ZIInE4BEvmbOpFjkBjtR15KdKLc5ABHfDDEUJMQZ0oyqyESpIkYcjqgG2VEUzegCem7YJgXIV2GoktOgmQ8t8qnh1z_UVA94hFuTfFrCvLIXeMEWDhfyVE4X5Xh0BlBirhg0Z1ldBca5e_DeZ8ZhXi8xJLgnPjojej-DSrz4i5B5vUNE9QmEE2w7quERBIpVuahiABnIAg1DksaCwxDMDQkCUjTkcxBMrYs4DCHGF7WSXQlQGAKAOiG-YplYy5r_r-w3Nts1BMEhDd78U5pz537a_9FC6-AfcmHnP3GNT9fcRw8h1ks6Bq9r4_XJNGU6EuLpgwgMDjISZKoiySUEUnOCkmUY-rE3IhQEDQJmwLUbyfLRf4Ze68WdP7jfMCLHH15V-uYWL6SQeSVNH5XUDHLIyADCRDeaIwGiKvVIeJlBAVOEBjJ1E2WZTHHkUyAYUVBIBabJZWADkSTSPatoIJnm22Y222bT572NL7nxw2eGQMSidMn5vON0o_MO0_a5mDxF1hqwL0xjnmjPDIsAqxgSDpnyDzWGUEDIn1l16BcRYYpGAaPMd06IdO7A1lTE6ApEinGJMLhXlV39nG-8TyvnAcpRr4OWSChfb6N_c8Yqrw4LPBrh8WUGZLD8pxJshrT0AWW2FmB0QGmxxwkTmSRxglAEjRRlHSDwyKAksjprAQNTHIi5u3x5eM26Fdc6v-eeBLw9y38beTzythBescm0hjGMBHPkxSUpAaAYQ2Dk0mkqUnEEiHGEDgRC4C4U0MmCaygIUHmeBJgYu11D_qnM_HCBzWDhr8DO8C-c7hxoKJpiiaAhszIiEQgNKLkJY1nsSywRBmAjomysNgwJJKFkVBG4jRSBFnJAAZjiq9qxi_CD8vErynGfc7-5MTPn0YfxHdEPHcGTEOaLLEkeyKjQxIqw5QEYtw0QxMZkhubJF9mREwfeCdOhvxjQpaRTbqmQ7IHxpRuTZko31WH_5jBeJGRP09UT5ncZfbh5rAbIqmSLOkMQwSbhIMkYIR0uUswGEnjREC-8ggRj6HR4z0yXX8kyZbJA5qtkuD9-TGe__48NU_DPx_9vJynTgNHJ5F_h86rkS6l-bHPH5gITUbnddHAEk-CQhHTc06Q8I5FsmSwGjEqJLnXsaybIoQmkVDRZA2StcoCyWpFxD9fzr1llmHEBe618PBUhX0pjyzsbUe3Txlp_JSS_nfIJcd8PqURDJLbyyxJD1nIMFLu6bAuYF3nZF4HkBFoAiljXWR4HmKTQ4Kg65qOSXhpSM_5-mf3d9zLuw6e9j1PkU-3ijy-VPvCnBR9ohQb-X5mWdSRzkLMsSRRRKLA8KLOmDoWMMOIIqOLMvFr2MScwBginb5in69pwad5lFw7bpmrIKK7Bp3EoDqc77Gh48wxABbix1MBT-X0nHG-HSyIMtKJh7MI55Mg0WlOhR72KQc-6Up0mnemcFOE3IcGsbaEA_q_NUrnwNtikTeHejqQCOtlxoAmCyAJMxAjCToJ_FiBI6E6lhmsQ8yQgEQwZGqJBZLVc4zGEuMMOEZ_NRi5PbJxOgpOlTLJD0qqSeRs8PlEyF_h-wmY-7w1I0mXIEmmoWkk85VkYtQQGSqJKB2J5RGv64IGiWsAkBcxCfJZQdZZgQGSSH0vBvDVhJjuEPxx9v60mn-evP-PNngfVLuXT3GN0HlfSyXQiTD7-G74QzQIYMAiAemMZGLIirrGm7yGJETyYUaTRGiSwSFJsSEBYhixpskace485Ilh5Pnn4c_VmHAkOrzdxHczz_jsXPJ58iLJby14IVlYPMZEdEkP66ejjfWIPmdEbGP-Hxo2EXfv4gf6rDllQJTRcOpxV2HBiU8HsGzHIlYpoff4RI6WJjhfI77sA6AkJiTijgIT-fixFSJFjybi4WwiHPPm6oBXGnjcC0gDvR87QCk_N9px6P3sBTOICvC8BB1fQz8j6meQf6bNry8KOP-JsNSkexU0UWCxQGJNXtCI4xehAXVDMiWJFaEuCgYSJFHXWZNnZIOlC1WCjKDGkRABf0lYyr28vHEVl_73hqXCJxiKAF1ZMpFMMiIZyhBinqHLULxJgn4TAZYEoiYAQGBFTUecZvI6xxuiKEucCaCs_4-M8792-RvKJDlHsibSx0J4jVhaTWdEhEzWNDVTlDQNGDSnkiVRkjjMMpxpGhBIhs6QukD4a_n7a-Kdl05E0bW-83nouo1iujG8muEf1YQBgsywEo9IVGoAusaNBXrcD_CGxAITGCRGlTkem4KOIMYMiYtMMp4MBDoDEPNDoHN_v9x5EAbYx_lp__w6jxePUVyWTU6HPC6LB-fTTdh4GmUW_nApzi9cfszjdNLr4Rf445GmruMTlxufnDR7c3eNjtIYk3YxNihVuac_36H3HykQ_4LtmfTNhVeuhLp5jiE3fU1jMurkieEf30424_Q4e_7s90AjhX98e_nh9vsI8ift7yC4eu7-LoLTE_YvI7h-3v4-gvxh9DsIrh5N_111iWyeIPMnOwtnumlF5hbBz5rMn06_0-TVs-r3EQgk3L2HIC_7kearK9AfH2l_F9Gnp-tfbvP6WfvrNp9uyH58Z_7lFi8A9AjzNYni-0gUePYuiXnZnRa5n47kBeDxbYhzffZ9FEqCeJfCvOxnCGRGYu4hyMt-goAnbLiH4FT2EwQCC-8y-VT2I89OG3vB411yjzfLPfHwp3JxQsDdRQB_huDmhsZnh1yvBY55GyXwLiXgU5SAd1DyKiLuqxDBr0LEfxUi4SOIPjHi93C8Z6xOhvBLRvsTA_0yFV_Biw9LyZXmsB9t_AOSBb5EOj8vmODT9ugUirBf1fSHYxrAibxwL5DLy95JCfdhSgRWvktJXvZOSuC73QN_1z3wnxod_quGWfgClWG_AAf4AhzcF-CAX4BD-LQl_rwtf08_6MH6K8n8YIvvEcnTHfOvyBEnfQwF-DQR3KcxwE9j-DwrhffmMZ_R6RcRgM8i4D6LAH4WAf9ZBMI7lfBTg_ACPPgkPPdJePhJeP6T8O_TAiM7zyB-XQAC5XsTSnnRu6j4YGcuUMK7aBcAd292IC-6Z4ku7UmfYPmHo09RFu6RnRe9iwr2o1TIkJHuUJEXvdWnCh8lgGV47t5s6qnsfjhzaRO-r00R3J0POpXdi5LZu1Gy8K7g9mvUnf8aNPDjaYsI7k6l52V3Ji-vRu6n2cXpOq8LgPwCwGmV4PSGxN9-H0fIwCpGkW7PMF3EiX_L35bIX5Sgv8qBbzrWeSRPf1y_E_H0pZA4iYuv3h-5Xl9o-mH6xNwI-Uacr8XY2BgH-eljwovU03B0tepyDUNXMPJ7U-huiBGm9_25BEYLAhcj_yxfL8BpiMJ9K8R0R4r1x7dqhDwneqmm97SSeLoe-nz-7Cd0pTHOH4ylq07ng-BvoCpEdKE28LuOH0T1wLjQV4_SxN6k7qs8oCfWZ2TAouw9nEhN8-lFsZ_Wvmnr8QaXXKvf0eQTknyEH5fi3g14Pvf-HjgFY7_xLkF5AlWftvH8ZOgrTkzfdKk2BvSCiL6fX-H87s6dn-B4A9xzAR2hCPej0wrw24T1SezQ-pnYjW2s0C1bbTo-Z8iBi3RsB_k19id4TAl-3EJ1WgW-tAgAZH8C-rRGfFoivsDyzE8gH2OeRwCBlSX5JzDVHTq9EvTEE4aF3H2gC39nDr1pExsqXS0u08d-VOyaV4j4-1hUPSCWVH18xe35cNzjDF1sv1SX4E_q05vnPjAA-f2dz5nP_Yz5dOfF-xoLo2CNdXoja-W8FeACCX_W3KmpUeC6-Vr3BVL8GST1Dc8Jfa13dMv2CxS-NryxYzlu3xwEexyRQbbwOwaZ8vHdkp-_OnLNA-atSva-IbtIf26WGvm1LQRLftTj7X3MJex5y9JlSvZHMP0UP9ATKRFyx46Fo1zlrnj0hmE_7Zt-O8wTlwb4ykJwb1C7d48gBXprK_nW4XcYj8uo3Q7YCcXodPOjkpVcN3ufnL5E8O-_PcV6eYR4-isPEembbadtJ1fuJn_fbHVCcmW6z8huXJsT6ysaoHTzF9CegrVarVoeN6fVM4iK8wtxCnGqxaef9O1GvM8341VIZOO4MX2dzXVRGNO31642upzfTaM34L-CLa_VuFiRl3FdKtzHVD3gKCG9yOO03DW_jOup_CdEnRqkG9_ovrd72CrBa707bX-ijxnRW3Tvciq3OPexUHW72x1a-Aps0wuRe7flc-lPOJFkIaYH2OhpFhqsvT7kY1L7VOsVvug6ieDpm8Z3x_tsX-7jyKPbewhOhfeBB4ET00jlZehz6StczQPku1w9ld4HPz-zfUei8sL7wB2MdZsGwAENuO9hear1CqZe4OdCTpSm5LjnJyVfRld18VOV-wj7NIo772K_h6lLLM9jlVcV57Sl_i6eqxqv8IqkX3c5RMvug9KLsO_2gZa9Yomu3sa5y9DrOvdREWNlvGLIXgM9uc27_Dt71VeG4JwB3GH_qfQVJjwmA3f6fy5-RUly-5tf1niKNO6oy7NqrxmMPF38LJpKYFhfQE3-zA991yvC8WuMejvG033W9_CcS--Dn2-1fgHLeSrxLUioUn0OA9Wtz2EY03u20gh_GMHoeSRygR29HoM8TUi9CPxY-prlOM9sfRhDLcL-MfsweJ5mfRg6t_8VbOaP3b7mAJ7qvNKRgERzJODI54Y-iUtNUv_xpqtPosq7-LJRunDqXbhObvVFrr0b48lYjNEG_8SenKr8BBGJCxqvRJ5vw3Ty9c4ONzByE3sQBO7nEJ5vBiWUfUE_6V2daYh84xFd_6V4_zIOb-RekMQEp5I6rlGhN89-lof5LM2PiO7TRXLFc4b4O30gOysY-RMk6OzaXTIGKAyxf6GGJML7krGjUj0mYxQ_FuTYegGJsyh5FPPjH7-T7IEoaQEf6H_yZm6AxhHGNFksxPlah5pEdAHmGATe_I9vImB-FUXw6jPZtGrn9Nq3cPprQW8Y4n5lTynt7-WA5C8Rflopyf9q-gY-XC2W5B-rfhJl53qnp74vz52fukGP29PxevY693lDOro8XX75mNcvkwSapPE9wgEjyQCDsmOxNg9qKstLs8zWfIv3BruaP2MXsau2Kl5fKjZRqdQd1az1sFR2luMUrPwiXG5Kw8Cymm7bw8eU8abjuiJgTxM4f1DxOFlqZFo90rNOv7oztbA258OFzWSlDlyNBdHQGlupPxeTxWqV8KKeie391GP6EI47A1cUBZ0TIjzKauly1-MyrgzWtYHHdhpFI_BaZqk3bYb9aWmZemGxFbkj1odGmmz8ZiB1okV3LozseUc0-vG61u0K3LpcGo3MmlLpz7VIjflGeVLmgo2zqXuwl0n8OCr2YNZMu8J-X-1smmromQtlJcBjUzxO2iVnMlKzMrtu9ztM10rSZcObLIuDEciAsDSOdWkDK_Mpozd6qlATjKmcQW80bFVq03h_aK2wXzac5m7QmYSjemm-wtpupkzSFtoFSWdYRmp3VsoSbjnbp0JfEjp6jRnA4rxsZHx9AodZdxe1wnpxhBtEB6CgdkfMJpagfhjyJqc4zR4fMtbS2e2nU9ReDlaS5NWZ-roTDZv8QB_7i_FMgb5ZcuRBja2HOOuubL5mG8vURbv-vrFbL7vVZQeOxeYkXjZglEX2erRCWTAq-o2Zrx6FCXT2gqOWNNcertf6vLrN2P2sN3dtbT4djNQIxNtmxT9UsnmfqHZ_imoq726a9TRKdnVvPR3AjQWaNQDKvppY0-HU9dVGNdWnyTFmkv4yqDiCuN-CXrFRNVKrFLFDLuvasd9QG5107jo1T577M5lV--1RL7bl4pzpj5JN2y6xTRhNlcbWcCtqzbC0kqIuj6CR8B4qdYXZtl0xivpR7cMRy4UuiDNvnZiYNwdK2LQqm2XWFle1_aA0jkxnmvKdg7JY-7NyUJcb4TAEHRWAaLmebVljEByOYBqN9KNLxHLZKnacdomvTrXxjD8YSRR40azeXcZx3DkqW2m0qlg9wd-uyrtBo1czwS5F2VREiqHypfqxupeUwXJntKVgsk3So33gjC07bsdei5vbi3YxnprTflja10cHRZkvbNWIBr6_aGuwMiuzG0-qpmYmbotx7GmDCttezhkpVcQaCUqr81jclcbHFLSYpbHdRjZb3M0zvdLVHADisCdGyaR2WEZMUR1ncWunzVq9uSJiZ1vbNQ237wtIU4he9-1KadwORlkTt5JoXsdLVrK3ze1YRhErgSqI1hvOE3hvF6DdWqofGsfOvu_34aZfhajhTGRfqSpwfYiMQ6854MJ-uFx2sB1unCwCaTAvgklohTu50zmm44o_zWoB6-2A2GjK9YXSGrUUdKx7xSkHO3DQFmudKmzASn_IC6gerVo7f5QuSpkE9j2nYvrpoaYZ6_U86XlqYohe8zi1zAAXh06F6zC16rFebWVI9aE9WK6OUjgnNigYNFUuciuLcN8UeM53gSIzJqwe6vEIMnbZOMbRErSWZrhmXH9V4vZji9FD0r8Rxy607mA72w7wsTNWp-N9dcMGk6LQnIzcdS2Jiu2BsgzVRa03Yxb2aAS746CysrNWy6yUGppobrVVLQzUjuIE69VxISA1bpkHqTdyQ1xfNcWV30wlv5r5-kG1sNWDzrrVny5gL3GMVhIcO8O5Nq8A-VCrGUvXVo99tUQI3zBavwyz7YQ59FRV6Vmt3mQpdZvIaXdrItI31V5D3rPHdqLpizBcrfRV3PX8DeYGxB_BRW2UxRtggINx6LihdkyrfVMpdZb9oTbZQhG3x8ODb8VVMN8rXd-vrbWeZwqZOtM1bqAllQO0vHE9NHZde6nMhuPWzjvU501f7Gt9Ph6y8_5K9ha1Y9yvDQdqpeuUD7G3qXhlbj6wI7CElXJlrxW3HWHYXIdpsuvGzl5TnUadExZALlWITuwXzkZPhNKO00omHorTZDAUUw8J_HFks_FwMGwx41hzu4tSsvNa_shoan2uMzRU1-PSplNiO4udVYclm-uMrbWux8U6WHKl5abhmcNyY97VjNg2eonHdGuJc6iWV2ZXWlhdtPCDkrWd6dWhZrmpXh5Oj1JfmDgto3Q8cNPpjmG52arf6cfqEZYY1lpu2-Pxgi2bQzz3_aGTdg9mdUDGL232prENx6pd3vPMsYL40nGSaC110egSRS-VZv3giEBlOIHButWLyppUZxbbobmOS9bw6CxmibZIGHGiNFd4Udb3tUMvnoXCdlIS6opjKC0gjow6ow8Ehambmm4PuRnXmZRKSbkJ59sSv-4BsFhkkwCoi0plo8QWMoJVBQXbSOw4Zbaz7B1YlW2sZrP2eKIoG7bFefuSGFS9NizqwIhba6YTVRod3lCXnA_L5VImhL1qBQ2rlukqg129PBRGOmiuY6bejZu7km6F61J3UVlND5vedjosc1ZJ6Vf2QNBK7Th1u9VxvC5xRldxmSnetLulLRxnRPsqdS0YjYR9uefhQ1YrDyZloRTsgqbcLLUMy5ymra5R6rRxWUBbu9RhLOxqyjBsJ2sMbFHvLSt8a1C0tuK-g7rVOlvWQmGZ9sy0yy8XmXIsEr9iHwJflHrldWdi1oRl0UzFVJyqLbXSaXXM5lSRajNiqUa1SWkzyOLIaW2KQzdIuHDPFUX2UCReabja2dmks2OY4m6LxQ7g1nFnZ8lyWhTlFeb9ou_uu-VUd3ci7Ju-O-DKqzCVdwEbutWG1NhzA24_kupcfZWIxs7XxKybHmNhxa-LC3Ec-wnxyevOIGAEswKHVcMcFNW5zEuecRRa0lCdS2Yt4UeyAYr9bLuyJb0sF2dctkoVzaispUl4ZMECD-Z70-F3BreUXdaXs4mUkLism4xW_pSZmfw-cvmiMDF9LBz1BhjuDppuJqu0MhdETqg34p0pg3rArkLfI4yqreRjvVkcpFHKyvUlu-rvV62jPuglUn8Qy70KWBmJJTkkQPSJ2Frasj4chxtzcpAaqz7XaABv3lhJgN2PFnLR3BnTQ7eRqFK8WrelnclmY1fCq5VIQsQim66Kgym_GoyFFVdst4R9drR0TuFXdWfcD-GAW5k6kdviSuzOZZl1V3I3wZwvmXKnL-7wrliUJH8uSYMdx3i8VPNXsCf28NrvHPyhtSoCY7XTmAos93d7KQ230mq1OdqmWHOLcmMOebzz--qqkjXkBG75lO-mZlKPDqWJl8ynm2Pba5eSdkAELW2NKvLUqXV3uuIOZ4vSoc1VpkoLWxyxIL2JEq1nSW9T37YPxAQMxuVg3Z7t-3HT7VqjkKlrR6WYgd6-Zc9mgtYdWVteX9d6vL9Ig16n02yXTDUtVUJ7Pwwq4XB3jGMjDeRVh62a67Tmdqez0WJrmFawteWMBdUuMwqCRqnWrsdTYcBgL-mPMZ8JbRcwSTBvgK46ra9sKNaEKd7rIWM47YZRtIeaPUMNvCWWTBCW3PowEgZLwdwONtycGO9Jt9GcOP1507ZK20Zd5UYbKM3qk7p2mKjqsXjo2aOdgafjYtNmyqtq1WvGLYg8EAsTTZm16uyw5mz6-0BtmmHJLBZb5WlqHcyxvcLtSnM2shoK06rqtSgeO_XqoLtwzVnFCpoDyG8M3fHKlcVgEI0mQ-ikS9VdJ4PttsenrukuFl5p5szrZZGTlk42rgfdNN4duRHiDqFryX4VCsJkcqz0uijKSIy7XoktRxXDFpjVoh50GzN32hh3HF0J5am6mnouu-LSWN4M1ZrgY12JN4uw3E-I7QjGy6OlOvN-AOdjazRq2W53NgmyUqKrcNftSstSw4-6nsltKoO2dWioGHXsqniYNlMUNMb1xECzCeu1q-2O6c96Qx80GwdxeGyIGdJ75VYx9LcENZoMZ8KsUyzvhsX1oGu0nbo89j2F21o4jtsrPpYni1K46S8W1Ww4XvaToboJyowg9aa9YKR1w8bB6x_gpoLdppd2mZLCRMuabe5qYd2zllbP6ulhVersPIndG8xmPdN6dcPCbT-aLjyjbKDxuC_Z_L62TwIpi1GrOothx6_vAElIvPW-xMfzmszFwj723d6gOuKk_uZY1cskUuz646DRPy6qmsunOz_w62t3yfZmwqKi1o3xBh8c2RbWa5HZzXdGqRbP40ZcPs6Qum3NBjO2rXUn6kRZmSOk8bMFgxShe0gy2Tzox54WrPa95CD1KyIOh-xgvPMdq1xVeTbWuewwq3IqL0diO5gu5KgrsdEAaeNjuB8K_XJS7Li9Je-1hXqn1lxxseVkGVSOJa4FjkTJpkShw94KJ0fLn26IZvcgU9eTRlPJUrPmHA5BrUK0dCYzOu73x6OB2KxVO4pMPP12nkZDr1yX5gxOJmogWm058TZGDwWT4XxjyOW4O2O5ht6UZwd9B0HCZEXiLQZ7caYNjvqwFeLpPnaXCYKovWCbW7zG42NvjdL-1jg4STyeHWfeTIOwWNfCGLJmj-2Hh0q30zDH6dReruzEK2abKRr1-85hFnCOrbe4zJZ628TQwNSPVxsSE5cwtzMWsmEe-50jkHYbie1ko8pQZjvS7igN136ztHLFSaetIznupbbY0iUg-W7H9vjtctUPk3XWYvhExHONTcLaZlosYk1Tt5VJlyUuPl5WFqukIqcV6A5i9tjPitKSrWqhLkw2oBkcUHHJi3gjesODWxyNRDUKO0CDgbLD7rgjJ2pIrDB_PPariq31e6avbXuzXkPaEsaYPJqIs3mojRbBztxY4mHZLZJ0dqEvI41fjeyurBXVuDlXjPYYNjcqHx8EfDT8znHckyR3n3TrvZSJtn6v6oIJ5rJ9b6fopZrN1Ya7-rEylbgFO06isquphNSwHI8GSbMzzRoNEoX5xYXSjVZ-tAeZXqx5uO7qlaSthFaX22WrPehYmnYIJpNUsUW8NO1xOmJjZhmnLTDYumn7uI7MWa-sthf9pL7u9UejsFHdrJjtnJ9xy3HNHO_boyXbQZxSNdDR26GkXhO8I9M_atFCDld1Ji6CTVdHTLc3BdiH042eHeKZOE72XZNNB_N43XDB1k93G8OZdwPPGuJe1qzqFW9hakooTA7DyQQy7YR19m7vsJCnrrwd-QBHzHRE4jpuKK8bExHVpRF0t3xxHruq1h4MQdnMQtTeWMT2jtLaOOA82INZB8KguC43V8Xh1lTifsPmg0FlD_vyttgzK0JoRLvJFnmKyewaw8Px0F0dd2ZpLoVTHXcX6X5eTE0tmsprjHQhtuR-swrbjRpWnVqVSHUyYBeosU3NlqbU-PZ4UZNVAfujBK-9uM80xRB2iOU1GmJr0LTWJInfAc2tcKN2D67FBafMiQEHA6Whrzf2QEuFVpCojUktCEKdLyekpCqXk73UKNfms4Gd9UdJZ6m7Y77kjNrcrlmOD25Vh01ty6rHRmXcRMiaGpZVypJ6ObOS1RQtDNDob5vGKC7PDRvPRkVbIzrnIsHarrd7bhJO50aIzalUD_x5nEZlWUoP-oRHW2bld2I9s6ZeRZhU2Z2VdBi4H_u8G_OYrzTrE0vcR1210uizobjvMZm_2Jb9phrPWwtO1pNtcqjMmrXIIH7PXrSP2kLpILAdr7bsutToTF3HObh1sRZ0ZgsjHAnTXhgtlvF0OpXV7WxqJrORe5jE2y4vJUvFdAVo7XfjxUzawW2xOVW3nVgjUZvD9GRx69bmI600tb1up2PzfTtkvf4uRMpyYBwZA4Kq44TJzHSxKxqTleuF0dFuxn0_Cu2SOhW8zWLSwdhOq20rTjK_SyyraC_W1bFnqMQsZuXjnrE7bUbuTAlmITiqwbERbFh1EG1hH6-BkESd1aZldOrdWls5liuzcX1YaTf5csXZCmjiQy2ID0VX4ndua9sbDt1D6vbRfLbfzg3BbW-jBTuqw90WBMpU3qiVQbPUhEGLa2edgRbann1YmeqyYXHj6VJaq1VZ4Bu4FGQkIJEJJYzfboqzg7Y7rvzhZh4uZ0OlbxjhrsEUOwN-Vt-ODn3XUbaijDV_5tW3XagsYn7WmLalTqPXjRvyBpjlY-YeD6zkxsbUSIzADMyxVN-l0za31ZJmXyHZRV_X5HF3Ls6PDX9FomyBax6s-cRdjYLUKE2bHDJ8vzpJpK2ZVa1k6Um9NV_sD0QXMrUdqx860VE8MEnvOJS0w8rbVZIaEzkVC5ul2PDFrdKUmcCtwgVjlMdrmyQklanMHGozodFsqGuubquTGAjVUdnIgvC4dbPBAOkNZwfSaAW2ihcdw56UbCFu-AfdNos2J4vl3ahs-kkyq8EB4ySEWf1qc8yWV4E2biSTVCh6oQwie8eYBt76_foeTOsDFOPYZ8qN2tQI5w1W1rMON5wTuV6Koy6blhrF4aZSVyS2Fwwra1Oz9h2_goN1RYqU_cLgonJ5a4ydwNyquJc26zipV5qk7hbXx5Xhpm-1qtXupAsrXL-1Gnmctl0X6_DQ8yRzpVXiSqnZWPOHRhcvGhhgZhsitjm3ITi20GiJHUUd8qY15wf9aTKdtSbjmclYodKAI6vCdPZKVo-VrEH_p5PfHl9cTd3GYewXbdXUgmF56XQWuxIJW0TH3McVft9p15UZsIuGuOlOiYEIB_YqsFaeSIZN38TaFrcmcNOuuYPlsV8n2lECLRYPtCKvrIpt0FmOp2y_45UbnDlqQrZeqyodnnhyhzGry1rWWUeOXOq2Zn28WG3wZjzcBNjll7ZVn7iVeW8H6l4UzfT1dFrehVkiIOfYFqJtzxWHy2wVGGOb5DL1cVgZZisDT0isCov-Cls1I1zGx-54YkmSXW4elNALZ_WOUG97u3al6pZjdbyoM9XgoKTNmTIHgTndsw3B6C-Y_XoodNv7Fa_GkdxtJ666He9riolH8wqdPob-Yct3s2hL4i44DVN2aW7UZmfCjfUDmHd5mW8upLK6YaKEBKlF0AisBjP3G1sSaE4H3oypHes9D7SGk7ndrSfAS9khD2BJXzS3hu0F1R5reAvOStLAXcdZsegeao2uUrWTrMZ4w1JaVlC_VxIG7V0pM7zeeMOXu0y5ArqZV60rIbPMpPqx1qlPs-FoV1qQJKc2r6eqkPTd0AKZ7askGBv2NZK8NZsb-1hkcRaTYDQyG93RSLd0n0uLrcP-WN0K-7GmKE3UBXCxH7Y3XKqnrZq_K0PFRJ3NUqkHo37V3cTr-l4d9krzodaUgo47qsZGjCZGBTf2VZxZoxVYWEYl4qNNKzKVVktpW7N1ycTLQzqByqBne6tpG6eNstcVO1YwqG_NIe6uJM1Vs5bqHj1uIbdXXs-pIiPqdNrthofE2A17S40L5ocjIyd1y4-Ru_CXeOy3KiKYGYpqTgLAjTJ1N-f94WHUb6SlrN7ODk4kcMwQqPUgLsr1ZaoInQTuYaDPqsuF5qg2s9W7CcuZSbMUJEAwJ5ZgVf0S3NSWwyZqyVzZraaiNxmtk92kOOsafc8alIQtruGe3iBjPDFEkhYqruRMbfXAjcJ9tXs8KPXeuDydKeGhhLbdldNoiJN9zQ4qmu3Ne-tAqvhe38qOpf5wKE_80Zppx2FmsZgbH0bTilRa69Z47pcUDtV82C-xPjvws5q41ExoHk2Nma9JdulJh7FYNNusX96yu3YgdooobVlcp9Y9YsEd7AZ7sN517ckubPO-N7P2wSR2h5HYZfbHUtjtisPy8aiHTqYY4XbZ6Jv9zaGZZC0S1NgVJSzKB2DW641DqRhoexcuxaArt2dhBR1TvheVu_UtsGcNOVE6m_GxNDF0XwmzvUky_SbXntUsIym29shQve3OcKRyubpyt1aWWIGyaIBNRZ8sdnGbG2xLzl5hUa1Ub8Jyv52l4ojb2BPVXKbCeFat9htDP1ZEOKwdxO5x73I7vdM7LJeDeb8rOtl0M2eWBzPEznAtdXr8qIc9wxGr-2LcOzTtnd1PRxETDZM1680EzfFaaqnZOlQrGNdHmQyGetfkOpXyrGPb8_FgWHb2Qztm5qWSemBq6XSDzeN4fOjoTXU9so1Vu6fE88M6bgKgDsCCCZS5Z2tecYIdoj2HbN-EvMgx1iiVJlYymzW1KLUn21apaBSH8y0-9HdKdCxLAmt21tmejNcuVstSXa2vharET_WVpC-T-swRynB6MHWnzkC_W1bsYzfGh9KUXyutve8oRxJ8KwLrJdKwdpxrekq8WwJCzbVDRfXCdm2DFNAqzw5jVXJaoSV7bGXA1_btNlfp7fv1otOtrHCmQXxYKrNeZStEAPnawOCTY6V_VA5oqi2DYbNa7W3FFo-0Y-zMqkaoqant9kVFWA_ZxVodt0K7ApSquBkRrM36bE70fg-EpuNU9vV02TWCVN53ukKrylX67RIr19fN3UJRSTquiso-2whrrYR8p1YcNSrIdV3Dbln9pF8mWkIC8miY-cCapkJPYtp-07KPSk8t76pKstq3uYV04NBggmRrzMnT4bIiO7V-1EV7Vdszboy3g0wce8O0mqXNYm-3EUKmVOSAz8TWxM1swd63JW096lc6zBofYSWdtFtjXVo7TL14HBWRXVTBfGloY3FrS5W9gsdByzOH_EZWe82mNz8OZjxkKpt9QNLObodrjMKq63UbncABvBkr5eFoqdfM_nzQbw2Gq2wgbKyVYGG-0_c6ammm6UNhOh73UqW5DmrLHtM3nWl5T5xvq2bv-OLQkgbKyJ_2JrHSVzS5suxuDWkmgaQkIrjDS2lfqSr7ZZBIitxkmEbJ4VxtOS_j4nIdNoaLRU2r4bJsr61paz5oDtlStveOi0O9p1tZvzov9Rh0DNaB0W3GjfFY6Ge77ajVUea8XccpY3KqxBZ3YnWTDYBdXcnTdLXuD6wwWB_q9T3bGuozYbxfVmDVn02rzN7xGoAdVZmovalNWqA-aooL9zA87NuH9bAzX4-OoSUkWYpx26ku-jYJbEM543bLckPr1lMQMJtEQWUvYw9u0h92BG8tsn64wa3U27D-tsnu14NkELJVYbThx9kxZTMrHgvKtC4mi7XRmS_m1rTu7nuTgBhQ6TBwYWfTaxSJnnLM3lh0W2lLXVb7ioGKq1plOZ7bi5JA9MPsCqN-s8sOlXJj78m-ypc1ziMmeG2xrZoz1-29jdSyvglTpuba7pK4EVfuSzx7WNhBmS0vOsnKsZUFccSNlaGrJVlbNqqlRVHohkp_VUrXC2daMbMG3rQEzS3WetVS4GzKxdFkOtjVZLj2sNTaW1Yna--DbrOJJm2vMyoNwn3w_7o4jxzYdSOKzr0MzwUrB8D-gFo5x1aaCMo5p5ZWb70_8MAbKJBEse49RLHIpm2XO6kTQvDBO2SQXucq8evRSU41Y5dDqxkTlMOTempFT9SSqSkVhIbiOsI9pDgo9quBP_gLw8knZ7p2bL6zu5AX9w0yltFTo0PDQ7ZvG2CbjyC--EIrM-nei0HXu1NHsIZY8znAh83ohfh6QG9QtN_aWmeSDXMK1_DUnOV002N7hQR46QH44Dnfk4_DS-FOt4rl5AwCJesMtNJeMhgdRsaLu2IHV1boCe9S4-PgmO6MUhiWYluAApvSDMD2-LWG_zxM0Tgx3h-mobfmsKZKacwX79FrmhUhGz7Mwm1Rh5sDp-GnXA6bSyhlHJUAS6hFsApZxrqylN6EqmrfDfzkcvKaXwJ2HV8UrtknCZHPvoti2xhdFbVMrxmQYOrJcRu_46O5H5Z4vTkGgYGP49f4DQGaixs-1cZIGNIIIaCLioBRwSkYSKxfQfFxCBJYex4HQGWffUWukIvVWpMYrj34hHA-s64r4W8eel5hhI8UwhnQvKrrZzOAQT2hxe0UCDJg91LV1BdRYpV0ACqtcAULQ6Uvo2JU44wODPdtptnNejNHt8fr1F0cFDf5uexPaNsdPah1k4iqxsKnGWG8gCJYxudbvWg2en7F1qOsPbVsRB6QP0YZ7lEFSz4CyuhYYq1VEjHrr4PWiV-aKvI0mP1qXyv81dV4sRskQbvs2FoYBh1L7VSHUbWzBUrQ6F8MVxhOfnXAzre0J0B311MhaFVhNW8g50WVuSRLsFJDcujPMwDoerLay3X0tDb-BwprStKubLjVmsDMM2tkRhG5Nqyut6qgDzQ-UohIXe4N-P5NjNZfBPxYhbDHDPdL02su6tvioV6ZjyRsQq3YLBtorbnOrP6R_ZB91xVYPzI3iT9iTUGBiKou4EQRRPO5xOKCcHbZ4NWb5K3W2jVKqp8Ys6IZ_CJXcJzOB4hQr5BdQysOoC_jM5wUgItxgKrvDnPooOjUVdEELcG9Xe-QWXPzqisouz023qvqXz_sETuLGtXXlfGgeuZuVoVkdya3reOPjiZVDAirRdjavkOAQcpqh5jAGQv3Cbwk0k7VXeqqHt7ej0H1wTTR83JpJzHIQpPD6auJ-aFMvqdsawzIklxgSLZH0sIneM8YtMWLjblGsfToek9SuAXQIllc1UNGNUFlYTUiUgxQ6mAAkXZIhSOh5eCg7Azg4bV5emtHT5I5XKZ8pVkaCOk18bFTSRIDgy8D4d1382mQeRTP0pF-VltDUq39CHSjfHZkzkPSy4L0O2e58HKTqppYHDm_0UNz9vOxJbFh3wPxLVBV5f69uBTeOXXIRlf79SdKwvqDqGJHXWw8G6UwV4xZ6LFzZnyhrD4a86KNO7iAbke50uPUiUOT-3uhLnaF63n1QdYjhCthUkS0uvSS3fxeIIhsnndMo2LAMwn1a6OrQowYam0u_GwN7LH8qpUwtQmxhbGqKhdk4ZKEogIehzLiWuAHijg8myNUO9YKRfnnOWGTv3OU46KyepjYFwIcjpgIXnPv6-bqJnY8iXPKIQcRbh7uVLNvQiVVQjnlSzV3pemJeJU5TWNURXaNNG4sTUiIpnygTKlbdtok6BC2YImyH8cUyucwpU27x75KUXqM3jIlfc71A93uIsoX5SQoMiVtnhlVm-fak_2WdqyLlYxEy746qExkaWsKY9JCimzomKKJcr5aO1uhbOmLBWcbDp-OctOVKTejCMBXb1d68auIQOA8a-bZoY0H0Lr-sE9R_Mhtg0Pa9K_03aZ5y1rfunSpVB2UlQQ0q1hvh1_hZIPGayC31PFG9gHyiapbgX9mcro59sbZbXnzcKndF7oTJfTnJObedaaORCT-Ugpxt16yABefBUM-i0AeukPhH-kCh3q1jVCJd499Lq3l9xGrtVMX92Q-f5ICJhqJfPozcR8HSqE49RoDpKDuvNxALODqGUeQEF7cLoIMYil31I9xmEpfeCakD6GX43GbTT1eec5xmI1oGfUS6oyYefVt_mFyHGTrwRuj9aRGklqlPrEQ21L-vH9zgEr9VSV4A3Up2k8gvXnadSnLwIbBsDNK0iDWxcZ0ww2IZYYTsW_YdJAMtAVnQwW22TtZSKxN2UGi53EKWSsU4YQgMUDwJvVVDWwWYKX5LPb4sl7M5dHBMOrRYQu8PR-xaAsMSZlLbmp8_9BBqlwiJPmVv_tPbwAEnzs6pau1wA2Lf4x5TBOTp8UZPD1nQhmkPqYN7tN6pvrGtmc-eb1jX-xS8YjafB9I4ExmHVcfnFlNUthRuMDGzjnZuTiggIcgvMDptCYepOh_-vZAQAs5ittb2iuKebaZ5MoApY_LwCskovBbdQUwVx0gDTSLgNMEj0m5DoL6ycc3U7qdIH_qyerNMeth5NVrKwoCxlz84UBdZxjJ5QlFm5sX90bvsBFPDQtHbFjSZW-50gS_R-yU9KJdf0r1QyFYrj-_o3lLJKY1XOHRpn7fZzPADnwAl7hABgY9WniPI6FjGYZLFo3fsmxjH4e0zxQLCy4Cfo9VLgrrt8qSWn7pwZwBRc3BgeCRRVQufUG0SFqhDMovscAJBEGC2syl1wPr0XheKsTswHkIW6e86PGGmsdaog6AON6bVk6cqYPwMr3UVpnMFfiw5E3ZT21VA99uNCN-Ykqm57oGfjpQsAz8Np9J65XeqV5NJzZVUchpyQ8HjnEVex_yWLFsh255NNfbPVe6lCriOy25vW_2GGzUsbaluikUqgzMFfFsRjCmhZvy4Z5gj60BGQBzUiHfLnacJB9ELoqMiblOH_Qoc5S6zdmdKNPhzITke7B0TenoggjGI5dW3OgIXQpCThnT20fcKcLp-vwIj2wHkheQe6YE9Fg8afsm561REAzCeI4cj0Z3FCXgNg6M5_lkKFYoyes6IZ0pH7IA4pg2gaH9dv_55_9PjpH-N1n_zxfiv_uh__rHv_9lJnttlH83qTdj9dc__gtihtQM
  • Scrollbar is missing from Calcs comparison tab
  • The above build shows 0 DPS for Dancing Dervish, I believe because there is no "Show Minion Stats" checkbox in the compare tab

I found some easy wins to deduplicate, but I do see what you mean about not being able to widely apply that idea. Mostly it looks like we could benefit from a CalcsTabUtil file that these implementations can share (maybe more generally *TabUtil files). One idea would be to modify the drawing of each tab to take in one or two data sets and then they could draw the second column and the compare tooltip. That definitely sounds easier writing it out here than actually doing it though 😄

After messing with it some more, I do see the value in editing the compared build. For the one I posted above, for example, it incorrectly chooses Flammability as the main skill vs. Dancing Dervish, which you'd obviously want to change. Calcs definitely seems editable, maybe Config if you've found many use cases for editing that, but the treeTab probably doesn't need to be editable. Maybe that's a side effect of PassiveTreeView itself though, in which case you might as well leave it.

Comment thread src/Classes/CompareTab.lua Outdated
Comment on lines +1011 to +1017
function CompareTabClass:FormatVal(val, p)
return formatNumSep(tostring(round(val, p)))
end

-- Resolve format strings against an actor's output/modDB
-- Handles: {output:Key}, {p:output:Key}, {p:mod:indices}
function CompareTabClass:FormatStr(str, actor, colData)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aren't these functions the same as the ones in CalcSectionControl?

Comment thread src/Classes/CompareTab.lua Outdated
function CompareTabClass:CalculatePowerStat(selection, output, calcBase)
local withChange = output
local baseline = calcBase
if baseline.Minion and not selection.stat == "FullDPS" then
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We fixed a bug in this line in CalcsTab.lua, so you'll want to fix it here (or just call that function instead of duplicating it here)

Comment thread src/Classes/CompareTab.lua Outdated
end

-- Check visibility flags for a section/row against an actor
function CompareTabClass:CheckCalcFlag(obj, actor)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate of CalcsTab:CheckFlag

Comment thread src/Classes/CompareTradeHelpers.lua Outdated
Comment on lines +157 to +161
function M.getTradeCategory(slotName, item)
if not item or not item.base then return nil end
local itemType = item.type or (item.base and item.base.type)
if slotName:find("^Weapon %d") then
if itemType == "Shield" then return "armour.shield"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function can also be shared with the section in TradeQueryGenerator since they're virtually identical.

oboking added 27 commits April 17, 2026 14:12
@oboking oboking force-pushed the compare-tab-feature branch from 55870ff to 7f182d6 Compare April 17, 2026 12:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature, calculation, or mod pob2 Label for features that should be ported over to PoB-PoE2

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants