Skip to content

Working with IR

Wake IR (intermediate representation) model builds on top of the AST (abstract syntax tree) produced by the Solidity compiler. It is a tree representation of the source code holding additional information.

The IR tree nodes can be divided into a few categories:

  • Declarations - nodes that represent declarations of variables, functions, structs, etc.,
  • Statements - nodes that control the execution flow (if, for, while, etc.) and nodes that represent a single operation ending with a semicolon (assignment, function call, etc.),
  • Expressions - nodes that typically have a value (literals, identifiers, function calls, etc.),
  • Type names - nodes that represent a name of a type (uint, address, etc.), usually used in a VariableDeclaration,
  • Meta - nodes typically used as helpers that do not belong to any of the above categories.

All expressions, type names and a VariableDeclaration have a type information attached to them. See wake.ir.types API reference for more information.

Nodes structure#

The IR tree can have a very complex structure. However, there are a few rules that make it easier to understand:

The following example shows the whole IR tree for a simple Solidity code snippet:

pragma solidity ^0.8;

library Math{
    function fib(uint n) public pure returns (uint) {
        if (n < 2)
            return n;
        return fib(n - 1) + fib(n - 2);
    }
}

Nodes of the same category are colored the same. Both nodes and labels of edges are clickable and lead to the corresponding API documentation. Dash edges represent a reference to another node.

eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO19aVNcItuy9vfzKzr2/XqpvebhfsNcdTAwMDFcdTAwMTVFQFGEN25cdTAwMTDMXCKTMqo3zn9/M7G3XHUwMDE01CosbbSxT9XZp0NcdTAwMTnKqlWZ+TyZK4f/+9ePXHUwMDFmf02e7pt//c+Pv5qP9Wqv01x1MDAxOFXnf/03vj5rjsad4Vx1MDAwMN5ii9/Hw+movvjk7WRyP/6fv/9efsOrXHUwMDBm+y/favaa/eZgMobP/T/4/ceP/1v8XHUwMDBi73RcdTAwMWH43buL0fNcdTAwMWTtJVx1MDAwZmX+unJQSM6MfDaLry4+9M/FjJr1SXXQ7jWXbz3C64bK19+f8MpcdTAwMDR7/X3eaUxu4TXKzOtrt81O+3ZcdTAwMDIvSv762stp/+dcdTAwMDd5fWU8XHUwMDE5XHK7zf1hbzjCv/1ftIn/W/7lWrXebY+G00Fj+ZlWq1m3dvmZVqfXu5w8Lc5cZktcdTAwMDXL8tfa+Ys/r4+tvVx1MDAxZfYt+IPt20FzjEtJX19cdTAwMWTeV+udXHTeOyXLO8Cruz9pLFb9f5fXNKr2mye47INpr+c/8aDx88T/PJ3l0vOfr/x7eZnNJp6DXHUwMDFhrS0jjOjXd3xcImLF+qvnw8FCXFy45dpcdTAwMWEmlvfQXHUwMDE5XHUwMDFmgJhMXHUwMDE2Z21Ve+PmcqXx0lx1MDAwZddFyC9GK1IyaT5OXlx1MDAxN8wnZMlWsvFoXHUwMDFlXHUwMDA3e2dcdTAwMTf7yVx1MDAxM5qenFx1MDAxY1xyXHUwMDFif71+7t//7T7ty5fF3vRcIpG7bmYnLN+tNcfNqWGD1b/yz9+vjkbDedTzjkslKvdnpVIvVapcdTAwMWSlkrzKuyfRzvvzp+WTnd43qi/rRzUhnGluXHUwMDE49a1wrzPorj/23rDeXS75v3xcdTAwMTe8pqLu1Vx1MDAwYqjoyuK/aCfTXHUwMDFlk4ZzSSmXTIpVXZUqqKuEe1x1MDAwMr7ArNYgQpaxoOoyuV3VnYyqg/F9dVx1MDAwNFwi9u3Vd+WNf/RUUyOZYdw69JRKXHUwMDEzpqdUSU1cdTAwMTkzin9AUVcu5NelcylsKGSwuJdcdTAwMGLwuVx1MDAxYXT8z2w4mFxcdp7x2lx1MDAxOVl5NVXtd3pPK1x1MDAwYo8nSvY6bVxchL/qcNXN0V/+lZh0XHUwMDAwy14/0O80XHUwMDFhvVx1MDAxNTFcdTAwMWE34apcdTAwMTfLtFxcwDr8qSq8OjqJXHUwMDAybcNRp91cdTAwMTlUe4VccreEf+P4XHUwMDFmwaegTFx1MDAxYtS0f5mtXHUwMDE0SsV64WrWy9SSsnLczJxFRlIphGe0tUJcdTAwMWJDtLLLu8J1g1x1MDAxNzxquFx1MDAxNpwqXHUwMDBivyxF6Vx1MDAxZs1lhHjWfyxR4VVz1fKpbFx1MDAwN3SrsmFarW+vte9cdTAwMDBdrbmgmlx0ly5cdTAwMWJK1l991WWiraRW04/o8lx1MDAwN0G3UalcdTAwMGVcdTAwMDf6udZJXHUwMDFh2birJsVF5WRcdTAwMTBcdTAwMTVcdTAwMWNHXHUwMDBmxdThwaw5Lp5cdTAwMWb37puHqYPKLd9cdTAwMDLo6oPbfbGXzl3PL1NV0nssPT2cXHUwMDE3d1x1MDAxMXTdq1x1MDAxN1x1MDAwMXSlJJ5cIsJcbsWlMJbYVUU2ylNcdTAwMWJcdTAwMTWZXHUwMDFh68E54IaIpFpqXHUwMDA3eY5cdTAwMTH4vVxirFxmM1ZcdFx1MDAxN1NcdTAwMDaFXHUwMDBl01pDJFx1MDAxN1qSXVx1MDAwNODr6qhTrfWaXHUwMDA3zXqvOqpO8GZ2XHUwMDE2id+AxnUk3nhv74FknqvKWcaS28ZtUpdcdTAwMDYyI/ab48iQrHVcZsnfXHUwMDAwklx1MDAwNZHEgkJJv9D+XHUwMDAzyb54xDokU1x1MDAwM5pIXHUwMDE5XT6VT4fk20Kl2j147Ndrs6ubxs3RY6szKEWFzsmQ5Eg+czdJ6pPSfH90fDo5fthcdTAwMDIkz6dFm0yWXHUwMDA3V2eJZPaItY+O9q+qu1xiye7Vi1x1MDAwMMnaxJC8a5AshFx1MDAxNJRK7tJaeFxiYVrLrTKEaGo/oLQxJPsg+VxyaPw0SLZcdTAwMTdnLb5XnOjmXHUwMDE5n19cdTAwMWRdSV67SkeGZEoonN/A81ffXGKTa6zFarVvr8fviU1TLjmzlPql9qd2W1x1MDAxYYrJUlx1MDAxMVx1MDAwM3SbfyEk31x1MDAxZujTfLp5fjtcdTAwMTHy4nB+cXB3XetHhc78Q6crW1x1MDAxN73LPqF79YPJcXXeIVuA5Jw9vFx1MDAxYdOL8XltfjW43L+eXlx1MDAxZl3Wt3BeebvfK81p86qbq5+KZKl5N2O9XYR691OJXHUwMDAw9Vx1MDAxNGDeM0JKTlx1MDAxOVx1MDAwNyGUa1x1MDAwNuJtrGfcM4Zz+L414DXSOFx1MDAwMv7LYM8oVVx1MDAxY1Sbc4c5MGJDXHUwMDA0nGlwv1x1MDAxNd9FtD9pXU7gnP3Vh7ZjKP9cdTAwMDbarqO8857eg+6zSm6QXHUwMDE5ntynXHUwMDFivfvrs1l/r65Tl9HRnYHHbbUmSirKOfHtbOLKXHUwMDE5XHLKa+HxWWngP7OUplx1MDAxON2/XHUwMDE23S08XHUwMDA1QkE3XHUwMDFk+lxmXHUwMDE2ONznJtQuNG/5xU9cdTAwMDf4+WRwPnnknaScXHUwMDBlzdFe8rGfoV9cdTAwMDGYXHUwMDFiz5suiVx1MDAwN0Myqj191N3iSbY8rnafd1x1MDAxMYjdq1x1MDAxN1x1MDAwNYi5YJ5loMuKa8VcdTAwMDRhq7pshUc36rKSXHUwMDFlQVx1MDAxNTZCXHUwMDBiynxMMobhj8KwXHUwMDExijE/u/aRclx1MDAxM1x1MDAxYVx1MDAwNaecMGWF0lx1MDAxZklcdTAwMTj5bFx1MDAxNL5oTqajXHUwMDFkdrPfXHUwMDAwxHVcdTAwMDBev533YO/eYVGN2cNl4eCp227dVi4qR7byjmD3KlNcdTAwMTY6mMlcdTAwMTVcdTAwMDe0v1x1MDAwNl45MUpcdTAwMTM/SvroMlx1MDAwYvjUr4pqidRKafmFm8yFbKfA5ml2Os+Z5Pih3chcXDxXoqIg0zfsUZVKJtlpNIuZXHUwMDE5r1x0k9pcdTAwMDK6XHUwMDFlnoyKZp6SpdNytt7Sp6fNdPpiXHUwMDBi501cdTAwMWXfXHUwMDFjn2cy45K8nt7oWz3an9D2XHUwMDE2zvs0TN3djKfTZDdTouNCt55cdTAwMTSVvV1kXHUwMDAz7qdcdTAwMWSBXHJohHuqlDIg19RcdTAwMWa+XdhcdTAwMWGMr1x1MDAwN6xcclXGXHUwMDAzcVaKSXDVpfLBfUxcdTAwMDE+SFx1MDAwMVx1MDAwNNdSW82cXHUwMDFi4TLcskigYkTA09tBXG6Qmlx1MDAwZepcdTAwMTiPPmi2OoPObkfd38DodTqw6dbeQ1xyntXNsNjLXHUwMDFlXGaub/vdcb52NN/vpFwiU1x1MDAwMym0Z6Smgr38u6q8ilx1MDAwYs/3pk9Efitt+Fx1MDAwZsxcdTAwMDe3xFx1MDAxMHC3tDPoXHUwMDFlzFx1MDAxMl9uhCv8nyZf6JTT9vA4z47IXHUwMDAzf6LXp4Vxo3rZuY5cbpf11MNjPVXe66fu55RmXHUwMDFm96Yn7Z3MIXPfZVx1MDAwNLiUWnuKw4VcYm7A+6Kr1FxcSeaRjVx1MDAxYVx1MDAwN3fgXHRcdTAwMDGaXHUwMDA2fpthXCLO4t7ChjWlnFx1MDAxMUFdyGmUXG5VLkWopdpcdTAwMWYq21x1MDAxZOTMVXEtXHUwMDAw5s4641x1MDAxZFx1MDAwZWK/gV7roFx1MDAxOXJX78HLYqc+bDeGXHUwMDAz3qWl56lcdTAwMTnuV4f32Xe40iTGy2+Al5xcYi5Aj1xccGnDN6U0s4xw8Fm+XHUwMDBlLnX+QFx1MDAwZlx1MDAwYq3yZa2Tejg+OyeFbLX+XHUwMDA13vDXwqX7LiPAJdCeXHUwMDE4LndcZi4tXHUwMDA1yYBcdTAwMDV1xbCsXGbHS2s0NcBFY7z8MF6+gV6fgJeV+vCucGrH/Xy12mfX/c7sTJPIeFx0Qsg8yVxiXHUwMDAz7fs+gPmft+3LXHUwMDAw9LhccuZm/vWSTFx1MDAxZKrSRoJJVeorXHUwMDAxs9uqdFx1MDAwYrf7if6eaTT2r0+GudTp/Vx1MDAxN4R5v1x1MDAxNjDdd1x1MDAxOVx1MDAwMTApQVx1MDAwN9NK0DhiXHUwMDA1sFx1MDAxOb6qcW9cIibWOGFCNJVMXHUwMDFhbSxRQY2LIfOdkFx0sKeNpMRFSClcdTAwMTWhXG4mXHUwMDAwLflKUHd3IHNcdTAwMGbf312ofFx1MDAwM7jWoXLtbt5cdTAwMDORpzp1nJw+nJUzj1x1MDAxN0+n2fRz4uIkXHUwMDExPVx1MDAwNMvphlIkY+hbac+Ufj1CNpu1Zqv67XX1PdXBxHCDNtWhwYZcdTAwMDSo8CtCMspB94X8wrxnlVx1MDAxMX2Zzd6yh8pNu5yc1vOFvchcdTAwMTHYb1PF677LXGJcYim59lx1MDAxOKOKSlwiXHUwMDE1UWxN4ax5I42YXHUwMDEx6nHc8JRKWFx1MDAwMcY7XHUwMDA2yC3kL3HChXaXXGbJXHUwMDAwai7zlzRlUmq5i1nEP/9UdfRUXHUwMDAwWTyHddldsHxcdTAwMDPC1sFy0629a/Ny+nTAyjVaIVx1MDAxN7R4fVtrXff65+9cbsZqTSV1XHUwMDE2XGbFyLkjyEnBhzDgkFx1MDAxMNfmpTGh9YCYS6yF8Hswn1x1MDAwZZ2zXppcdTAwMWV08925PZO3Z7WTcTGfv/njqm3dd1x1MDAxOVx1MDAwMTq1Vlx1MDAxZaWcXHUwMDFhXHUwMDExQ+euQKclQktw6527l0FAXUZjmeKWsJ2Mxn4n6HxcdTAwMDPDPlx1MDAwYjrLuT4zZjpcdTAwMWU+0vv6s7pJ3c87o8jQ6Su2lcJcdTAwMTJlVvvHvWInU4ZcdTAwMTFiXHUwMDFj+cK/XHUwMDAzO1utuq3/Z21kSlh9olx1MDAxOXXutehQ7JRWXHUwMDAwLSZf6XXa4/ORuZvUs3ud8mD8mNjvXHUwMDE178q/vSp28CDnl4XrSsVcdTAwMTYrh41Rd1ivbiNccvk6XUo/pmZi/tBcdTAwMTmePVxyT6fH5drVLkK9+6lEgHpKXHUwMDA08VxmmFx1MDAxOMB5zVx1MDAxNOFrXHUwMDA1e/9gfaiFoJJ5lmLOmpbMMpeBiKH+nWFkXCJcdTAwMTix1jiNQXhcdTAwMTDZWMaYkjuZp7RcdTAwMDfYOHrK3jd3vanGXHUwMDFieFx1MDAxYlxiJ4fd13swnsmMllVyd9XIyba6S2dbWkbP7Vx1MDAwNcdcdTAwMTh0XHUwMDE02Lg1Lv9cdTAwMTgg26NEMsqsZVLzXHUwMDFk8Y//XHUwMDAzMZ4yqoRwM3hKwndfjVx1MDAxMUJQar4wubc9vEpz02+dJC7Ojsb9ZDJ/f9mJXG6aXHUwMDBmucF9tVfv16aPpfPi4PHsNj252Vx1MDAwMlx1MDAxOOfGnfunMyOHs7bOXHSePa1lXHUwMDFh91s47/lZWVx1MDAxZFxcnuSnrGmLx6mLJ11sZXdcdTAwMTHk3U8lXG7IS2E8kD6iOCGCk9WO7+AkXGJPbTRcdTAwMTExyP/YNshLsFx1MDAwNMxcbuGKllHCQ9OrjJFg8I2NUf5cdTAwMTdQ/lxyxP1cdTAwMTSUf6RcdTAwMDfZXFyjPpHqKtso66vh6ez0KHpcdTAwMTBcXDGPWyWwXHUwMDA1i8aa/FVcdTAwMTVmmnogUFx1MDAwNiSDSuDxMcj/vsJfwzRz9qlFXHUwMDAyXHUwMDEwptaUK0Mk2Wrl739cdTAwMWNcdTAwMWOHnPcttnNZqndN8mBwYcr9Yucoafv32YvIy5At5U9cdTAwMGJTXU5cdTAwMWTeN9PHrfHkblbewjJ0+qlecy877jVcdTAwMGK0P1MkWehUz3eRlbhXL1x1MDAwMivRXHUwMDE2TFx1MDAxMsewl1BAf9f6fFFwwzy7yaTFpOTHtklcdCy0kdZcbmcnXkqDhVx1MDAxNq+beETCM2JkJyddfFx1MDAxYlryXHUwMDA2RfhcdTAwMTRaspdcdTAwMWM8n2ZcdTAwMWXSV42bQbpcXJ6ZvcbeQ2RaQpmyXHUwMDFlyFxmsYpoYk0oLeGYV1x1MDAxNfOS38VLLFPgaihn+z7Kg13AXr1cclx1MDAwZaZVsW0mfsesZPXjYazk+amrb1x1MDAwNz1KXHUwMDA3U6Hqd7OjgWpMol7ucbp8UbnR8/JzvmO7z6OLYeYuv4vswX2XXHUwMDEx2Fx1MDAwM1x1MDAwNis8zpTG8lxcsDHL61ljXHUwMDBmYZYnplx1MDAwZj+2Tlx1MDAxZohcdTAwMTJcdTAwMTKYnHVcdTAwMDY1OFx1MDAwZi8wkYYqLelONlx1MDAwNf829OFccij/XHUwMDE0+tCSVM1cdTAwMWZrXHUwMDA3SfpUus+Peo/5wakjJlx1MDAxOb53oT3JmORGWdDDtd3H12bgzHDKmc9D+K304T+vblxmXHUwMDFik1x1MDAxOFxyf9VdOVx1MDAxNpyLt1xma1x1MDAxOCqMkF85Nevm1k6L6dqDXHUwMDFkKXr+nKC1xkUvsjv/WbykY++fpv2neqmTKpayJF996Gcqu1xiyO7Vi1x1MDAwMsjSXHUwMDEyz2rQZYBjoexqQdpr2+5QVY67hW5cdTAwMWaOOT5cdTAwMTRcdTAwMWRSjrahmsVqLPbkO1mPtuv9Qt9AxG32XHUwMDBirWYu92wzcZipXFzXjtvDq9zD0fP+O7ZcdTAwMTSAQPsq0laxdz1vIHbdf9uWgrRaW+VcdTAwMWNYuVmLmVx1MDAwMGPM2Vx1MDAxN1Zt34qjweBycNdJylZmry/b5u4kctX2L2TxfS1Guu8yXHUwMDAyRlx1MDAxYWY9IZTC2SpcdTAwMDSY7VrIe30jPqhzlnpGLZtwmniO1S+jpIGFXikt8+/Dh0fGqFx1MDAwMCrD6G5i5ElcdTAwMDP+UKfV8aPbruHkXHUwMDFi4Fx1MDAxNVx1MDAxOGzhuKV3Jdmlr2q5h8azLlx1MDAxZT+Ou9XbXFzuvmgjYyXoJNBXSVxmXHUwMDA16iqsWCW34OVcdTAwMTCPcWGllaCehsRg+ZvAUkkjhXVUmy00NrxcYlxynqBcIkZ/KVamak836f2jXHUwMDBlb89LJ5XH68fE/eXsj9tcdTAwMWV232VcdTAwMDSslIZ6WlJccq4k0ZaYdZVcdTAwMDN+qjeqXFyMlT+2jZXUoJJcYsacXHUwMDFlpZChY2NcZiOWXHUwMDAxnO7iXHUwMDAwiu9cdTAwMDCWb6DXtsGyR09cdTAwMGKj8/PLfGlQT5+VL/ePj/KO0enhm8LKk7jbSFx1MDAwNVx1MDAwMN16uulcdTAwMTIslWJkWZFcdTAwMTZD5ZdCJZhMJaVw9pqmakN/P45DviT/ylx0UOXyXlxuRO04s5dcdTAwMDJAOOtcdTAwMWOMz65bUaHy6mAvc97PTWdnLZa8LOh8htzaXYRK911GgErwQkDhwLm0XHUwMDFhNI5Su7ZcdTAwMTm6xEq3xsVI+WPbSFx0y4xtTFx1MDAxZE1NXHUwMDE26sXC1UtzguHznex18lx1MDAxZKDyXHLs2jZUXlx1MDAxNlx1MDAxZtqJhKwm9tK5oy4565xcdTAwMWVfOSovNzXONExcdEVB+ySlq1x1MDAwNdq+XHUwMDA0KsWt9SfqxGj5pWgpXHUwMDA15t1b5URLqUJ7TTPwSLn40nnI/cHz9HqSu9k7mFdcdTAwMTh95Oliqp2MXG6W6mEqSD2fzmd6qpKajtJHT/2d3Kd032VcdTAwMTSwJFxuVM5cIovhXFxZf2eMtcyhMJWL4fLHtuFcdTAwMTKHilxuokVwxslCv3ioflx1MDAxOS0wvyCOwn5cdTAwMTAt34CvbaMlPZnreXdIiolxs389OHuiV6N3OJaSSk9Trlx1MDAxNFx1MDAwN1x1MDAxZWuJWFfdV7SUTFjQ7Vx1MDAxOC1/V76QUIYywZ1wqX2SXHUwMDFmnFQqcCzxV8ZhSe+yWinMzisknb19YJ2RbLPIXHUwMDAzXHUwMDEw9/Kz6em+6pBcdTAwMWOtT++veSGdylx1MDAxNbaQL/RtXHUwMDA2XG66Vy9cblx1MDAwZUtccsps4HpwxjCngdqBV1x1MDAxY1x1MDAwZVPmXHUwMDE4h39sXHUwMDFih5U12Ew8OKFcdTAwMTT/qDLhI1W4UFx1MDAxModBx1x1MDAwMd6P4fBcdTAwMWLAuG1cdTAwMWNcdTAwMWX0T+tPdyd9dvV8flxc6t2RXFzm4J1VP0JroqTm2lK2OXXIMe4hhuEvqkaWxFx1MDAxYcBTlzpTXHUwMDExPjBcdTAwMWOeXHUwMDFkZ0Z/pdtaSmVV4YzP705v6o3DnKxOXHUwMDFln/tR4TJdXHUwMDEyXHUwMDBmhmRUe/qou8WTbHlcXO0+71wiXFy67zJcblxcXHUwMDAyTnpScM0px41qtapzgdyhoNLFcPlj23BJrVx1MDAwMp6ijXErXHUwMDE43dDR2tJFyWzst35cZi/fXHUwMDAwsG3jZe0kV0hlj2/64qCZSFx1MDAxY42HldGMvyPK+9qGXHUwMDEzU21jtPxHuXZcbi1cdTAwMTlcdTAwMTFAfDVcdCl+XHUwMDBmj0GBaVx1MDAwNlx1MDAxZoZvs3XHmzUuV0+3XCIxe8i1LjPtOZs+XFydlrJ/XFxXS/ddRlx1MDAwMUtihMdR4SSXwqzvh76NlUp6hsBcdTAwMDFcdTAwMDSKaqlNXFyN8uuupdCSMlx1MDAxMmxm+1x1MDAwMpVcdTAwMWJcdTAwMTJtqWRG0Z3cXHUwMDEwPetcdTAwMDC2VXu7i5NvXHUwMDAw1zpOXHUwMDA27uc9INkot2/Hh6KTPO1cdTAwMWRcdTAwMWU89Fx1MDAxZlx1MDAxYolcdTAwMDJVkUFSK+1cdTAwMTlKQNcso8bqtZ3QZdaQYMT4y7VjmPxip1x1MDAxMlx1MDAxY0ezkv/jj1x1MDAxMW1oRVx1MDAwZmrMNbFfWVx1MDAwYlq4LdxV985ujnI3o8v0Zbf73EnnouJkdjpcdTAwMTml95vNTvcxdzLf77ZcdTAwMDZ3T1x1MDAxMWO7X4uT7ruMgJNGXHUwMDEwz6LOXHUwMDExblx1MDAxNfG3XHUwMDE4XctcdTAwMWJcbtO5XHUwMDE4J39sXHUwMDFiJ6lcdTAwMDVcbsqEcvuU4G+G01BuiTW7XHUwMDE5g915oHxcdTAwMDO8tlxulDeNbH92e508rlx1MDAxNDqTXHUwMDBinuV0f3r3nl1Q4yGplUJYYYhcci1GWWT7kXhcdTAwMTf0dyHlYrgqXHR2R3hRrFCg5OCHXG60x1+Hk0/5x5p6MHfXjaPu5W2vPZu1hYiKk3x/0kmWa7X8TX1fqVx1MDAxYVx1MDAxZFx1MDAxY1TOM7uIk+67jOJPSks9iSrHLFx1MDAxNsaTdXK6mmDrULlcdTAwMTgof2xcdTAwMWQopVx1MDAxNlx1MDAxYSilO8PWXHUwMDA0tjBfcZIqSYWUMsbJXHUwMDBm4ORcdTAwMWLYtVWcPOjXjyaNk95TsTs9nlx1MDAxNGvF6n798lx1MDAxZFx1MDAwZeXPlslaXHUwMDE5riRfyy9cdTAwMDAvxlt0U+bUXHUwMDFh8FviQpTfNvxIXHUwMDEznC7jTlx1MDAxNuJcdTAwMWI2UYSgXHUwMDE4UvpCnGyby9P5TbVBR73SdFooXGZcdTAwMGUnj3df0Jvwa3HSfZdR/ElKPKM40cJcdTAwMDBaXG61rnJcblF0k8pRKj2i4smBW8VJXHUwMDAxosGkdueuM1x1MDAxYrqvgVx1MDAwM1x1MDAwN4G97iROpqaDOnat26/2dlx1MDAxOCzfXHUwMDAwsHWwdN/Ue1x1MDAxMFOM23uTXFyzPW7lctmb8nH7op2M3lx1MDAxMWiZXyuYlMSwpWy/6C/XnrA42ZNIyYlPoGLI/FLIXHUwMDE0nFLCQ9p0i2CnoGVeXHUwMDBmeFx1MDAxZThcYuZcdTAwMGIhM1vLNfrnXHJ+9nS3nz+apFVfn3d/X9vdX07b/Voodq9eJJdVXHSPXHUwMDFhgkXYnHAt13VZXG7Q1E26XHUwMDFjY/Hi1e1ugoIvoi2RbsXl4Vx0eTghVFx1MDAxYqF3cVx1MDAxM/R7YPFcdTAwMWLQuH0sTraPb6+L9/lh62xef749K1lSc4zfXHUwMDBlnXpvPC0toUCUiZVyNcjLJfU4aiVcdTAwMGX0MlY6mLQlXHUwMDFl8Vx1MDAxZstcdTAwMTN8XHUwMDFlXHUwMDEyV2XDtFrfXnPfNdXPXHUwMDAyv9YkOFx1MDAxYVx1MDAwM9dXhY/x4qDMkqsvXHUwMDA04sFNopc5OEmdTFx1MDAxZSrDxK3pNa50MypgjkslKvdnpVIvVapcdTAwMWSlkrzKuye7XGKY7ruMXHUwMDAwmGBdPUWIMpJzxcRavyGujGc2K1x1MDAxYyhsPPR+u3DJlVx1MDAxNFx1MDAwMlx1MDAxNty1XHUwMDE1qmhohFdQa7iyOzlcdHdcdTAwMWZQaVStT1x1MDAwZZqtzqCz21xy5d9AsHXI3HRr71x1MDAwMc5xKnU1zKRaRbp/2lx1MDAxZVx1MDAxZCVcdTAwMGKPR2eJyMApJfOoYEbqn/9cdTAwMDaAU/vf3lxy4Gy1mnX7XHUwMDFm5cJiS1vFjbOjvFLhXHUwMDFlrNBAk4n4wvrQajrJh6fq9vj+VFxcp9t76XJj3Ppt+Oa+mlxi+CZcdTAwMDHBXHUwMDE4irxUXHUwMDE0bKNZ9Vx1MDAwN8FcXHpss15IvbqFXHUwMDE5w9uvwlx1MDAxYvp0lrtcdTAwMTNcdTAwMDRUcDvktadcYrhcdTAwMDTWkF0sXHUwMDFkyY2q7X71oIO2uTNr7i60vYEx69BcdTAwMTZ6X+/Btc2zJdb484rugu5xjzKqXHUwMDE1XHUwMDAzSiSpXFwtITGcvDEnhXhSMaLAV9FwXHUwMDAyK5RcdTAwMDPUqOKeXHUwMDE0cHpurOaW2iWBjbX5TaBjYUBHwWAqsjK/fanljk2Z5UhFS1x1MDAxOJH+mW3vgLptotHry/fDzjqSLn/6sZSOxS+vP//vfzs/nVxil0k8gtK4PGFcdTAwMDBxe9XxZH/Y73cmcKc5vMqAxZ1UR5O9zqDRXHUwMDE5tFefX/Nl1V7MwubhXHJcdTAwMGKLVZ+OXHUwMDE3XG5cdTAwMDVEhGDxXHUwMDFm+PDwoKzwfahdvcflXHUwMDBlSERz0Hj7XHUwMDEyNs+m9l1cdTAwMDIsoLCMYS6LwVx1MDAxZbjct9/6elx1MDAxMdxcdTAwMDOzYLHhXHUwMDFjN1JcdTAwMTFJVFBOcWmSaHRum9WA1MM1+9/ze/duK7d5l3uzlVx1MDAxM1x1MDAxNJxsrlxygFx1MDAxZjXrXHUwMDA1rtKs1MlcdTAwMDWNXHUwMDFjXHUwMDEwXHUwMDFiXHUwMDBmPHPBqDRcdTAwMDJcdTAwMTbFsfdEifLAQDJjsf5SML60KrGN+7iN04bgeEnXXHUwMDA2s1xmxrqXPFx1MDAwNifGKvZJbvpyMX+biVx1MDAwYpVIPIKy+Fx1MDAxNVx1MDAxNu495oVcdTAwMTMjubVSabDUhinp+9gv2bjN++IrZpaBM2LB33uZMOtrbfp6XHJcdTAwMTLNoJWagOWQWslPt3CbNyU3WziuPFxyMiqskYxcdTAwMDfqXHUwMDEywcRJhd1cdTAwMDJcdTAwMDU1XHUwMDE4WHbwOIazmaxcdTAwMDDUgf/jjlDQyGnlMU40rFx1MDAxNyiXNjrmcduwceKlw1xydcVcIo0vILRm5CzRXGYsI/1IoP9bXHUwMDE4uVxyXCKJR0BcdTAwMTh3yshcdTAwMTFcdTAwMGZ8J2GUXHUwMDEwRCyMnMPEeUJaysCIgzXXwEw+ZvI2bz+u2l2c9oSsXHUwMDEyXHUwMDFijlpjgtSSeVx1MDAxOFx1MDAwMIC11sRwaY34dJtXTz081lPlvX7qfk5p9nFvetIuRrJ5wFxyPCmBLDMgblxc+Tq7oVx1MDAxNlx1MDAwM/x5QO5cdTAwMDWwfOxcXO3bRnuNO3HhXHUwMDExJcGvpUDOKfH1pvLROsRZyVx1MDAwMKgk55juXHUwMDEwm7xtuK5SKc1cdTAwMTl3uq6bpn6ix8aV+nOJXbhQ4lx1MDAxMVx1MDAxNMdtXHUwMDFhvXVFftv2PKubYbGXPVx1MDAxOFxc3/a743ztaL7fXHTlfFx1MDAwYi3VXHUwMDFhm5fD8/fZ8lePUlmlkblcdTAwMWKwQdbYzzY91fHsrnLEqpVCrXgoXHUwMDA24/P9+omjZ6gj4m25p1x0zmuiXHUwMDAy7PZqcSs8XHUwMDE5T1xiTTH3XFxcdTAwMTLhsDtUe7idq1x1MDAwNMXeXHUwMDFl8JiDdoctXHUwMDE5WmxnfrxcdTAwMWTwXHUwMDE2jGmqmDNvMZxCXHUwMDE5ZlxmXHUwMDBlN9g+hVLYbzRcdTAwMTBcbvvL8/6G/6r3ncSo2WrC06g3/+6M/m40673qy7Ds8d+tn/lBicbrbuff/zWvdpteZ+T5P+n988nK8pPeP9lFy61SXHUwMDBmXHUwMDFlO6zpXHUwMDA0bt1cdTAwMTdd3lx1MDAxY213fSVCoJ2vnOg1jt5rtnxSXHUwMDE3XGKzT4b3ftl9jbH7/spqjH1l6ddcdTAwMDPqzrtdi6VvsFx0yeOb4/NMZlxcktfTXHUwMDFifatH+1x1MDAxM9qOREfAZq1cdTAwMTFcdTAwMTDkW8ziqJpFYZiDgFx1MDAxOOwqrMCUWJxcdTAwMTLmQ8MlXHUwMDAxoczjXHUwMDE4gMO2pZipXHUwMDE374RthYAgy2XaMbhccsVYhFx1MDAwZtHAeVxunPhcdTAwMWJcdTAwMWb+YVxmJFxcKFx1MDAxN+9cdTAwMDbEcZtcdTAwMDQkjGbsXHUwMDFkXHUwMDE21Zg9XFxcdTAwMTZcdTAwMGWeuu3WbeWicmQrITRcdTAwMDOYXHUwMDA1o1x1MDAxNKBcdTAwMTdugFC+tchSpT68K5zacT9frfbZdb8zO9PE7flxK6g0imtNNLXWQXXA9Vx1MDAwM8dEguNcdTAwMDKOXHUwMDFmfFo7XHUwMDA0dbtcXKcyPVx1MDAxZObOhzVxmL9szp/koHG0d1x1MDAxZYXr4Gw1XHUwMDBmvHCQUWU052vTnKVC2sZcdTAwMTU3XHUwMDFjXHUwMDA3XHUwMDFi2GDwXFyol+6QwoA3rIVyeFkx23lv4Vx1MDAxNcftXHUwMDE55VxmXHUwMDE5idA+XHUwMDFlXHUwMDFhPH6hP6PsSmlcdTAwMTDngO36PXSnNmw8RSY6q1x1MDAxZv4mXHUwMDE0Z+1cdTAwMGWjk1x1MDAxYrE3vUjkrpvZXHTLd2vNcXNqmMPhcZBcdTAwMWJDwS0lXHUwMDEyXHUwMDFjUkVcdTAwMDGn6GqsXHUwMDA1xyMoXHUwMDFjVmM47lx1MDAxOTJcdTAwMTacmUk194yUXHUwMDE23pNcdTAwMTZcdTAwMTTDYVx1MDAwNbC7iIBTS6K54P5+brFR+Fx1MDAwNaaj0J9cdTAwMTbKPVx1MDAwMMWG+kaMXGLDpZJcdTAwMWaaxvctmE5cIlQm8VxiSONXXHUwMDEwnbuL0fNcdTAwMWTtJVx1MDAwZmX+unJQSM6MfDZhWVx1MDAwMlYv0lx1MDAwNDCtXFzQd2dcdFx1MDAwNC9ve2SDJU6vJ5c2/VBp3Fx1MDAxYz/og/n0LGeikFxyhUm0glx1MDAxMHDMXHUwMDE32YCrY+xcdTAwMDFnPFx1MDAwYlx1MDAxZlx1MDAwMVpHrdA6mEpomEeoUtjnXG7pnzOVMOZcdTAwMWHv4lx1MDAxYdpwwiRxT/NcZlxy1Fxu4Iv6g9PJ3jBcdTAwMWXglfg2XHUwMDFl36BcdTAwMWH95qT693g4XHUwMDFk1ZuJKVx1MDAxMIQltcB3vJd3KviOd7n4+Vxuf7xfJOW9I1xcsv75b0IkgvdcdTAwMTmdS2yu29nIJUCNwUFcdTAwMTJcZmTEKGlW96qZNVx1MDAxZVx1MDAwN9dcdTAwMWPj21x1MDAxNnzQYMej5a2+KrWwXHUwMDFluCfMSDCHjGifsMY6/nHqIDBcdFxy1tWZRbyhXHUwMDFiJ5VEXHUwMDEw+6FJS9+COKx8OiB6O8ZcdTAwMTPgUYBvblx1MDAxOZBcdTAwMWSrqda+XFzIZSafX9+YXGbIQ6RcdTAwMDDJ5pqe1Wti2irGXHUwMDAwxFx1MDAwNfAr5ksk8V1cdTAwMTS8wzXHjX1mXHUwMDA0SFRQSre8XHUwMDFiVExcdTAwMWOlpszOXHUwMDFmJlx1MDAwNXZSTLL5cWNcdTAwMWOFtFx1MDAxOIv9hTkxXHUwMDE0boVxu9qbhlx1MDAxM1x1MDAxMFx1MDAxMHCOtOVcdTAwMDL8b2tcdTAwMWRcdTAwMWJCRHqwXHUwMDEy1iorXGZcdTAwMTPMXHUwMDA3qzFt+XBcdTAwMDWElNRcdTAwMWbqWJouXHUwMDE22veJXHUwMDAx9+TcXHUwMDE3NNya5Vx1MDAxMmyln9ynsJb6zyq56LzF8Y1vwlxcXFz3XHUwMDFhnbswfcNcdTAwMWVVqWSSnUazmJnxmjCpLXBcdTAwMTdBiYc5eExcdEGNYkFVZ57SXHUwMDAyx1tcdTAwMTEmhPY3qnrVdIn1wFxcgs8pOdhcdTAwMGJcdTAwMTYn2W0p41x1MDAwNPxcdTAwMDZcZlA5LEJwjNWrRaBESCn+5FTiUJHEIyCM22Q37883ec9GXHUwMDEwgC7GsIBpwELzZcepXHUwMDFmy1xcN4FtyFxicFx1MDAwYmbwLj+bYZy2r/L5YSplXHUwMDA2VTvsX1x1MDAxY5G72qVj1k+QYVx1MDAwMC/zXGbXjMBTkHKtgVx1MDAwMFxcvCc5NuShTFx1MDAxOKFigvE1XHJ34GFo6e9cdTAwMTHpY1x1MDAxOKFRVVx0XHUwMDBmkVx1MDAwMqHdvm9cdTAwMDT+h3+47Xu2YP5cdTAwMDHTt7dg/vmkf1x1MDAwYiZYnP+6U1x1MDAxM52JOL7xTZiI616jM5HDk1HRzFOydFrO1lv69LSZTl9EY1wiRHtaXHUwMDAxMsFzt1StTTWRXHUwMDFjrJsxIFx1MDAxMcBDlNCOKIqHXadxy0ZQMOyUOqiIlVx1MDAxZTiNwHOYXHUwMDA0t0b7wqmxifg4XHUwMDE1XHUwMDAxP1BwXHUwMDE2XGag4KXYTZMzlVlJKvvDiEi4QOJcdTAwMTFcdTAwMTDFbVx1MDAxMpFfplx1MDAxYkj7gUNxQ1x1MDAxOFx1MDAwMcZhSLCY6INpJ8VOfdhuXGZcdTAwMDe8S0vPUzPcr1x1MDAwZe+zIYxHUVx1MDAwM4jEXHKVVitDg6kvylNG4PpisIIrXHUwMDFklNDtXHUwMDEynpLNmptki4xm7Ta7S2aql1x0WopcdTAwMTRSYdSjcCNA4SxcdTAwMTVEroZUpGJcdTAwMWWutLJSYD5x0LhRa7FunXNgdURcdTAwMWFpXHUwMDFkxi0mPO8jPDhhzYJwc9dGslxm3Vx00spayej2/ScwXHUwMDA1jEVcdTAwMGWpfG7Oyag5mY5cdTAwMDaVXHUwMDBmZNpu+OY3IUCb7j06XHUwMDExXHUwMDFhPVx1MDAxNFOHXHUwMDA3s+a4eH7cu29cdTAwMWWmXHUwMDBlKrdcdTAwMGXfyEGEXHUwMDE01Vx1MDAxZVx1MDAwMXRcXOSW4YCjXHUwMDE1W1x1MDAwMVx1MDAxZY8n0DlcdTAwMDI7wrHBRZBcYlx1MDAwNU2DpuBuXHUwMDE5i9NSNCXGxJko2+A9XHUwMDA2XGZcdTAwMDEl1j3ejYU2XHUwMDBiR69XWfNcdTAwMDeHYFY+XHUwMDFkkL1tXHUwMDEynfdHXFz6l9lKoVSsXHUwMDE3rma9TC0pK8fNzFlcYv/AsnuF2Vx1MDAxN8hvpVx1MDAxNsFdXHUwMDFk5lmmsGRcdTAwMTNcXFx1MDAxNpBcdTAwMDTz6dWFj+knboyUrXaaq/lcdTAwMDW7vC/lXHUwMDBmI2WicOBTQlx1MDAwMouSmGq55l7Bk/GU5lx1MDAxMlxcK1x1MDAwMU6YL55cdTAwMTJcdTAwMTf5fGLTRlx1MDAwNv6uUc7ObuE1g4oqqSlcdTAwMTPbT0VZVMi+b1PnXHUwMDE1JVx1MDAxM73OeH1f5/XNXG6+6eX++fVcZn+Lq3jeXHUwMDEzVlx1MDAxOVx1MDAxZV3mTlx1MDAwN7XTTN6k1ek1uSql91wiOVx1MDAxZZx5XHUwMDA0N3hcYuNcdTAwMTT8zNVcdTAwMDQ0TcCt4Fx1MDAwMFx1MDAxYlKD/8FYrPZf4nhYhnlcdTAwMDDOUlx1MDAxZErDS3WkXHUwMDA1w82s2OJU2Fx1MDAxN+maXGZJjuQzd5OkPinN90fHp5PjXHUwMDA3XHUwMDFmJlx1MDAwNvjq6ztcdTAwMTFaOlx1MDAxYcGsJH6hj43KP6L/e43K5se+OXveeMZKTjCYYSRfLaFZd1GCyfPMU4xcdTAwMWGQZ8EkONO+nLily8I8rjinklipmNaxjdnKrjGCgMTxNFx1MDAwZduzIVx1MDAwNVx1MDAwZfdcdTAwMTMpKPOf6rGEXG4kXHUwMDFlXHUwMDAxUdymXHUwMDA3XHUwMDEz5qdsRnyfn0I9ao3FUiiutMBAfMBLocLT1GKVI1x1MDAwN2+GMlx1MDAxZHRTXCL5TjxXlbOMJbeN26QuXHJkRuw3xyG+k6RGgZtcdTAwMGLOXG74T4o4d6uBk1x1MDAxOJxcdTAwMTEqLabGf7rv9JTPzvbFdO+60Mjf3uVcdTAwMTInXe3K4l+Y5Fx1MDAxNXNHwWX3KLh4mlx1MDAwYmL9Y9lcdTAwMTfmzmhPY/hOKKwppMGKQSqUJ1x1MDAxNYg6tqzSTDnMXHUwMDFkg0eEm1x1MDAwMZZzZVx1MDAxNrNkYnu3XHUwMDA1e8eA+3IppHCOPrXhfVmMXHUwMDA2kSTkj035XHJcdTAwMTVJPILCuE2LXHUwMDE3XHUwMDFls/l4XHRcdTAwMGa+t0Hz81x1MDAwZp2ubF30LvuE7tVcdTAwMGYmx9V5h0RiOpRcdTAwMGKBaTVAYilhilx1MDAwNOIm3JNcdTAwMTaRXHUwMDAz51x1MDAwNjLXsFx1MDAwYq49TjV2XCLmOElXO3pcIkjhXHUwMDAx79eLZFqQOkPinlxiW0n315wwI5mzUHBcdTAwMDPZXHUwMDAxn9da+1x1MDAxOVx1MDAwMZZcdTAwMWRR/kS4UOJcdTAwMTFcdTAwMTTHryA8+dJ5Roz3S+Obk1S32mtcdTAwMTZ7fHpcdTAwMWJCLjhn2L5bYG83KWiwXHUwMDA0gFx1MDAxMk9gXHUwMDE3X0U4lvFcdTAwMTNcdTAwMTHMto/EeOzFWYvvXHUwMDE1J7p5xudXR1eS167SITVcdTAwMDBGK62VXHUwMDEwimpYV+a4KE9o4JBAdlxiTs4x0lx1MDAwNCV3u4ynY++fpv2neqmTKpayJF996Gcq0e2ehFtcdTAwMTJYnYZJXG5rdo9cdTAwMDHDXHUwMDAzJ49brqkyrvpo5Vx0JizgKFx1MDAwN05tXHUwMDFkXHUwMDE5elJ5XGZ7RVx1MDAxMCpcciZrxkNcdTAwMTG24+NcdTAwMTlFkXdcdTAwMDfnui+MW2hqMEivXHUwMDA0XHUwMDAxtn+s2Vx1MDAwYlx1MDAxNUk8gsK4U0aPeDhcdTAwMDeaKiuxwbuU2nfxP82LXHUwMDA1h1xuh2RcdTAwMTjsdkOB0n3M5EVu7I4pyVx1MDAxY3w8cIkttu+Aa4pStL1lXHUwMDEzt3lcdTAwMDU39YFcdTAwMDFcdTAwMDRcdTAwMDEgkYuJ6oZrvZqTo7T1KFFsXHUwMDEx5LLE1W4zXHUwMDBljf/4XHUwMDE1k+ZuXHUwMDA0XHUwMDAzeGNxLpzDdoVnIXNrNXz1Y1x1MDAwMyBeRdZcdTAwMTFcdTAwMTnf7DisSNi7pupuXHUwMDA25o3nXHJcdTAwMTijgLm1QHts5Ig76OPkZTH+rqFcdTAwMTVehtuX73iLd7y9xb/LlyPH2F1f+SYxdufdRo+x64PbfbGXzl3PL1NV0nssPT2cR+tcdTAwMDYsccpcIrVcZrgkdjmWq1x1MDAxZGpwkFxyvqvB2FvlyFx1MDAxOHRcdTAwMTWVa1x1MDAwZlx1MDAwME5cdTAwMTNcdTAwMDPfXHUwMDAwbq9kbJy2klx1MDAwNiSNXHUwMDExjDrdTFx1MDAxM5pcdTAwMDVEpeBcdTAwMTR4xodcdTAwMDaMf1x1MDAwYrq1WlVcdTAwMWWQva+gV5GTfUCZiFx1MDAwMI1cdTAwMDMgIUCzpFx00ivw3sBXxmJai4+bfpRfnerUcXL6cFbOPF48nWbTz4mLk0RcYr9CXCIqrcYoXHUwMDFjJ1JcdTAwMDWD6NyjXHUwMDAy84+4XHUwMDAwJmZcdTAwMTgw2M/mW/Np0SaT5cHVWVwimT1i7aOj/atqxE1D6lx1MDAxMWIk8mu4arXKt9CgWYXjP3BcdTAwMTODyiDfXCJcdTAwMWWlXHUwMDA0nlx1MDAxMJaMac2wL6LDxlx1MDAxOY8wXHUwMDAy1Fxmu9RLXHUwMDEyXHUwMDE3eGwnilx1MDAwZfxKrGQn+5uLhlx1MDAwZeZcdTAwMDJcdTAwMWTBvuj6XHUwMDEz+lx1MDAxMe+IjUtsXHUwMDEwSjzWxfErjF7kXTowetxyIbHKXHUwMDAyeITmLqOntVx1MDAxMVx1MDAxNKdcdTAwMTLgLspcdTAwMDdN3vP06YCVa7RCLmjx+rbWuu71z0NMXHUwMDFlmFx1MDAwMC0oZWD6KLjqrolcdTAwMGVcZs2HXHUwMDA2j81cdTAwMTKuzad3XHUwMDFh7aamlcmzvTtU1yeNTP/koTkx+1E8TFx1MDAwMFxuXHUwMDBmhYJcdTAwMTBsXCLIfeK6MHiCeeA2XHUwMDEygEVcdTAwMDPOJneE0OIq11x1MDAxZlt3MIlcdTAwMTZWXG7rZGs8lK1cdE2pJFx1MDAxZnEvN5sxXHUwMDBipsM3fe09NVx1MDAxZrPqqFOt9ZpcdN+rIUVcdTAwMWb/fLTie9W7/vnige81lOXKXHUwMDAwXHUwMDE2NrJn5/jGN3HsXFz3XHUwMDFh3a87vcjx+cEsMT/IVFMk3Zf51P1dtIRM6mH9lrKWMkrMmlsnqMdxXHUwMDFhXHUwMDA2plx1MDAwNVx1MDAxM+XYToxtwo+t21x1MDAwNFx1MDAwM9pcclx1MDAxOFx1MDAxZOya8deiNXGYUVx1MDAwMFx1MDAxNcZm2Fx1MDAxZmo/vDHqtJljr1xi2Fx1MDAwN6JDXHUwMDEyM1wiYpPz7UxOzlx1MDAxZV6N6cX4vDa/XHUwMDFhXFzuX0+vjy7r0TbziFx1MDAwNKNDuFJcdTAwMDa4XHUwMDA2YWszkZld9ENcdTAwMDepXHUwMDAww2JYsKJcZihcdTAwMTfQLVx1MDAwZaKO+WWcXHUwMDEx1Uz4kqD8XVx1MDAwYrGbMlBzTZjhsVx1MDAxZNpOeb3CgV86WJGKXHUwMDE0M7y8nlx1MDAwM39cdTAwMTaC/blVZonNYolHQCCX51xmXHUwMDE4yq35X+/IXHUwMDE5kFZcdTAwMTlJXHSTZlHcvbXZXHUwMDBl5Vxcn1x1MDAxOTNcdTAwMWRcdTAwMGZcdTAwMWbpff1Z3aTu551RmMNFcdOXMmtcdTAwMDTBzU+HXHUwMDBmaKxcdTAwMTLgkMEnXHUwMDA1XHUwMDEz/NNDTInjbunu8up03t/vtGZqUlx1MDAxYT3tO6a/O0c7SHAgXHUwMDE5UCNYWWrXSmeRXFxcdTAwMDFpQt4lNfW7XHUwMDAwMbv6RHbFiCCYXHUwMDE44/S4wtu1a1xmxZJPaCyEnE1HJkC+7bFOK/H6m3OXrNOqvP7mnbQuX39cdTAwMDaO0FhcdTAwMTTWRyY5jm98XHUwMDEzkuO61+gkR97u90pz2rzq5uqnXCJZat7NWC9cdTAwMWHJXHUwMDAxUPKwSMFyMKdKkNVSNyxZgdeFwIhcZlMkXHUwMDE4btHWM0py+CZcdTAwMDNEIcaxnS8lxsPAUqKpNJrJOGNpK1x1MDAxOUtcdTAwMTS8XHUwMDEyq5hzpEP4VHRBMNuF/Lk7aKFcdTAwMTKJR1BcdTAwMTZ3itzg7lx1MDAxNdAus0hcdTAwMGVcdTAwMDIu6lx1MDAxYmf7Y1x1MDAxOcqloIlgjlx0QVx1MDAxN9xo/jG6M6vkXHUwMDA2meHJfbrRu78+m/X36jrlXHUwMDFjko41/YJzQTigP1x1MDAxMELpjC+DXHSBq1x1MDAxMlRTQVx1MDAwNP/0+LJq5fnd3XRcXDjoqafjh0HqZnbUj0R34JlcdTAwMDN9XHUwMDAzXHUwMDAyjI2kgN2u0Vx1MDAxZMxNx1x1MDAxNKZFa1dnXHUwMDA2U0x3fmyb7mjJwVljzlx1MDAwNCa+IedcXGn4XHUwMDE2t1unO4ZQ5W/h/Vx1MDAxNXRnMpo2K+9cdTAwMWFb5fjGN6E7rnuNTnfSJfFgSEa1p4+6WzzJlsfV7nPEXHUwMDA0bcYx4Vx1MDAxM2wrOLaSqtWgjuXaXHUwMDAzUFx1MDAxMDhbRoNn7Fxu6lx1MDAxMCo0WDolXGZcdTAwMTZcdTAwMTC6OjdrjylcdTAwMGVvS1x0n1x1MDAxNL5IaGxcbn6F7SiL4+qtazddhW+mM3Dp8XH9sVx1MDAwMZ1QicQjIItfwXZcIlx1MDAxM1x1MDAwYiQ7XFwyXHUwMDA112Y0XHUwMDBlfHJVf1DDuCbwXHUwMDExjEk5wiiRuM6gf1p/ujvps6vn8+NS747kMlx1MDAwN1x1MDAwZiFcXEfgzFAhwFx1MDAwMeeY4ewoXGb2QFx1MDAwZTnlXHUwMDFje//i6K1PJzvXo6f708vbXqnfuUhcdTAwMWXnRlbdZSaRyFx1MDAwZVx1MDAxN9QzVEtcdTAwMDXrh/2YVs2dXHUwMDE0njVKIIxcbmDMjtBOnK39Y9tcXFx1MDAwN3vJoz9cdTAwMWRSXVx1MDAxYmbJQP5x7OL2R1x1MDAwZVx1MDAxYlx1MDAwMuLBP8J1Xnr+vcF3fjZcdTAwMDZcXHKei8VcdTAwMGJe8/F+XHUwMDA0i/Se8I7rK9+E8DjvNjrjyd5cdTAwMWRnXHUwMDA3qbvUaXV/sD8uXefTV3flSFx1MDAwNkBcdTAwMWHrXHTM/SFgPZm/LfzC27HYr01oTsGhZNZViVx1MDAxYluAXHUwMDFm27ZcdTAwMDBAMHFcdTAwMDaQy9dcdJ3aS1x1MDAwMZVcdTAwMDR4m3rrcVx1MDAxYkNcZnBh41x1MDAxN8tY/3dM/y9nXHUwMDBmZZV+bp3z+zmpPJXOk8OSjlx1MDAxNu0g3Fx1MDAwM2g3XG5cdTAwMDe56/X4LqVMeVx1MDAxY+veXHUwMDE09mpUxGFcdTAwMDC09Fxc5fex0r+7SMtSoYRzVETQq3kt0jKA+pqwrWfRXHUwMDE5Kri2kbPollx1MDAwMjz+u1x1MDAwNpI9ekpcZu+b69ksvk95L5+qvH7K21u8kH39XHUwMDFkXHUwMDE1sPJcdTAwMDEzXHUwMDEw+r1vYlx1MDAwYsLvO7pByHTO9lPnw+nRsVx1MDAxY5/dlvnxfZZFXHUwMDBif1x1MDAwMtfzsCO6XCKWW8P0KiGgRHNcdTAwMGZlQ1JcIpWxjsGb1GhcdTAwMGZcdTAwMGJcdTAwMTEk0Fx1MDAwNblcYqXHxuGXXHUwMDE5XHUwMDAxIVx1MDAxYSiWXHSZI7NpMJXFTHq29Wy687OyOrg8yU9Z01x1MDAxNo9TXHUwMDE3T7rY8k9cdTAwMWP4sVx1MDAxZWd7feftbDpDwen0hXW/3vSMUE4/YnvCv/hNjM+GO49ufY7T5YvKjZ6Xn/NcdTAwMWTbfVx1MDAxZV1cZjN3+WhcdTAwMDFYXHT+hMJuylahM7FcdTAwMTSCXHUwMDE3OmKZZ60hTDJh0WtcdFhcdTAwMWawXlx1MDAxNFxcXHUwMDE1bYxijFx1MDAwYqtcdTAwMWT+iEZOI+Agmlx1MDAwMfHx1XnGxujHx+uZqII/Kd2N28P3m1x1MDAxNeaQaf5cdTAwMDdXM4WLJFx1MDAxZVx1MDAwMWFcXJ4vYCi/YnZecvB8mnlIXzVuXHUwMDA26XJ5ZvZcdTAwMWF7zkgo8YBcdTAwMWXwReNDI7SQxFx1MDAwNqOzzCOWYHhcdTAwMTk3Uik8k09cdTAwMWael+1272utnr5Oneebt8mzXirRSUaLhCrhMUmAhcOT4HJ141x1MDAwN9wk8HKIopSDbVwiNk5y+5LpvCBdVPs34ZZcdTAwMTYlaGZeIyFcdTAwMDTTXHUwMDEwQZO2XHUwMDFmXHRl4Fx1MDAwMavIkVx1MDAxMD8veZ0lXHUwMDAzyN1zk5LXITL4kdfxMfv4S3XUnr6vN4TjXHUwMDFi34SAuO41OvPYy8+mp/uqQ3K0Pr2/5oV0KleIyDwkWGLwpjlcdTAwMTadXHUwMDAycqxWUlNcdTAwMWNcdTAwMTbFJY6TXHUwMDEyWENcdTAwMTRs6s7AbVKSSmZccjZcdTAwMTR3hEQ08Sw1aEsoXHUwMDBlhFCxOdjOzF5sLVx1MDAwNXbC2ZkrfORcdTAwMTT4RWBfXGL9c5lHmETiXHUwMDExkMVt0o4wciHG7b1JrtlcdTAwMWW3crnsTfm4fdFO7rvJhWLweFx1MDAxOFeUXHUwMDEzXHUwMDA2XHUwMDFh5yqiNtJcdTAwMDC74EJywSzjwb5/kVxiXHUwMDBmPZnreXdIiolxs389OHuiV6OB65ow905boDFcdTAwMDSgRVx1MDAwYuyR6LgoaphCXHUwMDFlZ3FUMFx1MDAxMZ/ejHCYp+ThQFx1MDAxY9T2m7J21Js9zFLJ68g7P1x1MDAwYvFQwoC9W1x1MDAwZvRcdTAwMDCd9zAkXGaIp4C5xjs/XzMu2HL0b117Pya0KsngV7DBytZcdFx1MDAwZrZcdTAwMDT1XcyXXHUwMDExnnjz5z0ljNlS/rQw1eXU4X0zfdxcdTAwMWFP7maOzV9cdTAwMDfn0ZYvUmxwtDk4cqvZXHUwMDFmgFxyzMOUXVx1MDAwMsbOYHuZoFx08DR4d2BJXHUwMDE2TemtP/ng1Vx1MDAwNCg0I4xjfYAh3Lc9XHUwMDE5XHUwMDFihF/hPJJcdO5cdTAwMWWySWn4JjE4RlJcdTAwMTC1/d2iXaE8iXCRxGNdXHUwMDE4t0l63lx1MDAxZmt5pFx1MDAwN9lcXKM+keoq2yjrq+Hp7PQohHpohlx1MDAwMzSsXHUwMDAxMiQodVBcdTAwMGbmMVx0zlx1MDAwYlAlYzhOef/0WIt6mFxuUs+n85meqqSmo/TRUz9aXHUwMDFmZKuBKCktMVx1MDAxZlx1MDAxMchcdTAwMDNcdTAwMGZcdTAwMDRbsImOlNhcdTAwMTFMYFx1MDAwM66A4Vx1MDAxMVx1MDAxY3vOUty95sZyw1x1MDAxZHtMynjEKlx1MDAwYvRRMSZ8U7hiw/NcdTAwMGKGx1x1MDAxMKHhXGJm1G5kKMCKLahcdTAwMWO1f6zhXHSXSDzWZfH32p3L4kM7kZDVxF46d9QlZ53T46tymMtjXHUwMDE0eFhESku0lsv8I5/d0XjPVChcdTAwMGV3L+inXHUwMDBmnCk+lbrDW3WUtI1aq3p7IHpcdTAwMTfP00hcdTAwMWVcdTAwMGb4+kB3XHUwMDE0U4vew1av81x1MDAxZCo9XHUwMDAwVSbBelLpXHUwMDFmSFx1MDAxM7s8n5j3XHUwMDAynqeF/5jLomzogqetsPBcdTAwMDD49vPdOFx1MDAxMzZ6vmvs9PxcdTAwMTanJ90t317nes+jh3H2nGX2XHUwMDBi/V7WscXsaFx1MDAxNVx1MDAwNUaAXHUwMDFh7GthwFx1MDAxNlx1MDAxMLGW8MZcdTAwMTjxcHYnNoXXTDl2mOOdnsWrW25ngI1cdJR2bvWEN5B7aen1XHRcdTAwMTFcXMNcdTAwMTRuSn+9XHKId3qiXHUwMDFhgE4/1WvuZce9ZoH2Z4okXHUwMDBinep5JO9cdTAwMDP8XHUwMDBlXHUwMDBmW8RcdTAwMTCjmJBKr3lcdTAwMWacXHUwMDAyWdOGYPMmLlx1MDAxOVx1MDAwYk6eM9JcdTAwMDOp48B2OFHgT7uK/IzHmMZ5X1x1MDAxNrfAadwydyveh8DRXHUwMDExhlhnjkmw++RrgJRhQc1cdTAwMWZb4pdcYlx1MDAxNUg8XHUwMDAyorhN5+OXQ1x1MDAxYuBhSCM5JsBgSEZcdFdkQzBtcFx1MDAxOFx1MDAwNdPgQTHxwYZcdTAwMDYsfVXLPTSedfH4cdyt3uZy90VcdTAwMWLi9mBcdTAwMGb5xZBcdTAwMDCpuCW++T6vV8U9i9PrOHp0Uij46Gc7Pro6nz3avr1cdTAwMTD9SZ3eXHUwMDE1+62b8klcdTAwMTTKXHUwMDAzK+wpjqusXHUwMDA0LN/apE1cbjLjgTtDXHUwMDE5uK3a+lO14lx1MDAxY/9t+zqWg9A4WY5cZo3aXG5cbiDFPzSg/I1cZn+mXHUwMDA1/dDuTpzh/9sz/LPTySi932x2uo+5k/l+tzW4e4qW6aJccvdcdTAwMDAlXpRd+1tTvphcdTAwMDOcXHUwMDE5QLRlgFx1MDAxNYopXHUwMDExjL7i2CxlKTjfXHUwMDFhPlxydtlhXHUwMDFhXHUwMDA0JtNcYiPASZLMSlx1MDAxOefYbmX45qLmXHUwMDAy3FeHXHUwMDAx0aFcdTAwMDbEXG5O/+hEl0S4ROJcdTAwMTGQxW0yoPeHX1x1MDAxYuX27fhQdJKnvcODh/5jI1GgKoSHXHUwMDE4rL0zmKiEOWky2GyAeVx1MDAxNkNcdTAwMTDwnlx1MDAwNXZEiKPb05ZpyOGdXHUwMDE5XHUwMDBm95tHrctcIjktdi5cdTAwMGX7rH5cdTAwMTaFhlx1MDAxOFwiPK6t5FxmXHUwMDFmgpXrdkdcYk8zXHUwMDAxjvdcIu3HOsKvcWXRj61TXHUwMDEycHK1NNplUUT4RjLXXG6+KT9UV/RcdTAwMDYpscb6bjau/flmtT9y8CDnl4XrSsVcdTAwMTYrh41Rd1ivpqJl4Fx1MDAxMmKBmICpQylcdTAwMTC+aZw/my9hr0lcdTAwMWMsXHTePJiIoJtcIqlcdTAwMDcwXHUwMDA3QIdcdTAwMWI02JY7aFx1MDAxZaT0uJWKSFxu3pCVNqYlWyn9XHUwMDAxm62Eck4y2tB7yVx1MDAxOEYkp9tvz7YzvCRUXCLxXGLI4jZpyS83scZcdTAwMWXW0uJoXFxAa4BtXHUwMDEyXGaBUE9xQlx1MDAwNNc4LJFcYsU/XHUwMDE4mKlmLvdsM3GYqVxc147bw6vcw9FzSFow0Fx1MDAwMvhTyIhcdTAwMTjDelxmV1xchjJjXHUwMDE5XHUwMDEwXGbgfJTyz9+Qrlx1MDAwZY5zR9n8bdJcdTAwMWXkXHUwMDFmXHUwMDA3vFkq85JjhECQXHUwMDEwaWU97CDFhLW4v1x1MDAxZey+tFx1MDAxOFx1MDAxZFx1MDAwMMRcdTAwMWQwWjj4UFx1MDAxY5bZXHUwMDBlXHUwMDA3XHUwMDEyWlONJNthv3w7wYGWK1x1MDAxMjue6k9ouYRtW+nvLICOIzO/XHUwMDEwmbktlbtEmFx1MDAwMzq7vn5O8lx1MDAxYlx1MDAwNVpcdTAwMWMtMlx1MDAwM1x1MDAxZZLGuWboqVx1MDAxMuWDzlx1MDAxN/lcdTAwMDd7gTF8XHUwMDFjbMB8kXKfg2SwXHUwMDE1L/j7ilx1MDAxYXCknOkp0iNcdTAwMDZ8RsmNUdrfkHunbUWjOr5t7jBcdTAwMDVcdTAwMDJvXGJcdTAwMWJoXHUwMDEx7ZyxLcM78iM/UNLwP5dcdTAwMDRRTT2JJcJcdTAwMDJcdTAwMWNNXGZSrFx1MDAwNGdcdTAwMTLYbpkwbinItcXiWvH2XHUwMDE5w+T89V3DpcDW51xmnFQj3z6hVFx1MDAxZWhcdTAwMWTHTvdwupWhIThcdTAwMTMloDTbpGrhXHUwMDExpOC3tsdacqdGl1x1MDAxZlx1MDAwN9djbY5cbons3tXgIOGwUlx1MDAwYmv6XHUwMDBl1oI80Fx1MDAxM9pi30hcXDBcdTAwMTPcPsd6ePBcdTAwMTVcdTAwMDSgLnh7nLjNlKc0XHUwMDBlXbfwPIQx36RJ7s5bKU20oowyZ3O5cE+Ng9xr4m9cdTAwMDb0p1x1MDAxOalwocQjII67rv/43lx1MDAwNuU/6er2XHSdXHUwMDFlXU+S8+ZcdTAwMTPnyXKu3Y6i/JRh6j5cYlx1MDAwM8cwrJVyvT2UZJ5YMFx1MDAxOFx1MDAwZVx1MDAwZlix4EBcdTAwMTCpXHUwMDAwXHIkw2g2s8yfXHUwMDExvlR+QFx1MDAwNGlB3qSSwmBaQKz9W9k9XHUwMDAyh5iATXZWXHKRUIqCpTSgo3+u7nPlSYpKj9OapU9o8VxiXG7jm+dcdTAwMGJcdTAwMTVxPKj2NHB3oDlcbuNcdTAwMTPku5uS871cdTAwMDdzdDx/aKZcdTAwMWJPl3elq/a88OzouOIyJUp72EtcdTAwMWbza6igdj1cdTAwMGZPXHUwMDEz3LbjRmJxqz/N9tWUSFxy1FHi8GGMXHUwMDBiu3hcdTAwMDQnmMtDcb/CYJXzd+m5sOumXHUwMDA0ebXCgW+ukC9cdTAwMGJvV0klPC4p/mgmQXCWOnZcdTAwMDBQXHUwMDEyu1KsjK5PUG6w9E0xS63Bglx1MDAxYf3mXHTBYHvoIGKclVpFzcpcdFx1MDAxOfw9KVx1MDAwNNBcdTAwMTMsw1H87fNJSj348KJcdTAwMDRcdTAwMTJcdTAwMWNcdTAwMWG9dj6DlYRwOoMnXHUwMDA03/Tt84Wp4eLdoFx1MDAwNn5zg3d1sJc57+ems7NcdTAwMTZLXlx1MDAxNnQ+Q25tpPBcdTAwMGVcdTAwMTVa4Vx1MDAwNjZcdTAwMDe9MVx1MDAxY9vur1k8Tjxcclx1MDAxNIpra4BjOppMcc/4hUc7yJMwXHUwMDFluLzYXHUwMDEyllrs21x1MDAxZdc9bsVxgqfGweA5M29kaIHCXHUwMDAytyz3j2n808xduEziXHUwMDExkMavUf6wnaab/EXp7u6u1ty/vynu5apH7GroTEtcdTAwMDYnR2iLq0y0xW5ijimyoKx421aAMlNl1acnXHUwMDAwb776jV2+wfBQxnGGK7hmTK7FbLiQwIBcdTAwMDWjXGZcdTAwMTNrhHI09Y23mt5tXpyNfLG2XHUwMDE0NMHZ0i7cXHUwMDAzXHUwMDEzdJFcdTAwMTjzkVxuho1dfDdj2YpUfaCLL3aRjjxcdTAwMTI23sRaqsVcdTAwMGVsYvH9SSdZrtXyN/V9pWp0cFA5z0RkOYZ4guK4Js2xTHqtkVx1MDAxZWdcZlx1MDAxMEMyIYylXHUwMDFhOHLA2IRTXHUwMDE4f1x1MDAxZVx1MDAwZriPXHUwMDA0J7RZSaiIWc52WI7A3Vx1MDAwZuFcdTAwMWNcdTAwMTm7IUJEXHQnL9UwfyrNXHRcdTAwMTVJPFx1MDAwMsL4e0nO7Z3K1HRheFdcdTAwMWXNJ9m0afOKajnzizE7iVx1MDAxYjDUinEuXHUwMDA18XO3nyxHelx1MDAxNnthWrNwXHUwMDE3XHUwMDE1oUHZ2S7J2Xz1XHUwMDFiXHUwMDFi2nHhKWBjgmstNFvbPOfwXGJcdTAwMDW4qLhcdTAwMTGpmTDx4IIvSa3hcGqs2nRVbIZPbtWGXHUwMDEz9sGSzY2EZzOsrUjY+1x0XHUwMDBmI8o/aSFOXf5mqctPw9TdzXg6TXYzJToudOtJUdmLxnk001x1MDAxZcawKSdcdTAwMTQ8KLre0UpcdE9cdTAwMWGwPCDXWHZcdTAwMWU0PtpgNqUgVGFcdTAwMTd965vD5Fx1MDAxYlvA0YJcdTAwMTlcdTAwMDHWS2Gb0e9hinY9lG21xlx1MDAxOajO5D9mw0sgXGJSpT+2pGrjnlhcdTAwMDLE3GOaYUhcZiTWUP32plx1MDAxOLcgvErgJppcdTAwMDQqRVenICSUNFx1MDAxZSpcdTAwMDYxQKFcdTAwMTSc+81cdTAwMTOCNnmUXHUwMDFhbLaL9UJi9XxcdTAwMDFl2SYn++VewsQzXHUwMDFjr51cdTAwMTBqXHUwMDA0XHUwMDA3T4j6PvRCvFx1MDAxNCxcdTAwMDf4ToThXHUwMDE2XHUwMDE5iIZcdTAwMGX284s20OGwqMbs4bJw8NRtt24rXHUwMDE3lSNbcbJB4i1cIpxSSWJhQVxyXHUwMDBiXFxcdTAwMTP3XGLj2D9LW03052dWz2dlTvcy5Pxcbp7h6VP3+i6V6EbZW5SceoRIsLWGWGF9XHUwMDFkOn5uLSpgvjjXcjEy2lx1MDAwNl1QarhcdTAwMDdcdTAwMGIhXHUwMDE15mFarEhcdNpjTjj2XHUwMDEx0SBjXFxcdTAwMDNbWZKV2Fx1MDAxZf/4uD2WUoMpZMHWX4vHXHUwMDEy2mJQK7PoXCLxx+ZRWs9f4rpq7Vx1MDAxOGZcdTAwMWNw3J4wglxiq8Wb9jhcXMBcdTAwMTcnXGbI9jbN52/YtEufqXrrcp+p4uyU8XZm+lRJJVwi9c5QgFtcdTAwMTaD5tjig4q1LTuwLp5cdTAwMTDcWIbZq8oxXHUwMDE1QmK+XHUwMDA3XHUwMDFjTFqtMPb+fZ3K32I5XFxeJVx1MDAwZVx1MDAxNbJMK1dcdTAwMTYj3VCwoTA6wyn/hMkwXHUwMDFjO8F9xPXrNOBcdTAwMGZ0Wp3myO30Ld/3TpY/vp6uUWk0673qi1x1MDAwM1x1MDAxON3fe+Pr38Xre2tcdTAwMTWi+36lg4m4Tzxnh91296ZcXKpcdTAwMTRcdTAwMWVcdTAwMGV0pFwiLjDG1OMokUoyiUlNK1x1MDAxNlx1MDAwMsdpXHUwMDAyXHShVlpcdTAwMGVm1NFcXCe2XHUwMDEwL69uN+6EOUY4+tLJXCJI+ChcdTAwMDWNimy3X9KlkdKIXHUwMDBmdVx1MDAxNY0txE5YiLtCgfaeupe1+rWtnFx1MDAxN2S3Xs2xSImOwFx1MDAxYTxcdTAwMDNOXHUwMDE1RoCwaGV9930t7SfojSiqPFx1MDAwYsZBXHUwMDFinMXiXHUwMDBmSvgshMHSMVx1MDAxMF+56FpcdTAwMTY7I1vqOGg4wXE+LjNcdTAwMTI+1JLCg2aGiD83PqSkpzAugU35JFx1MDAxMXI1x1x1MDAxOSBcdTAwMTHQjFx0rXF7Sb6ZkyiV8Vxm9tHDSSOgXHUwMDAybNPZ7JvOTai+4JHALt5cdTAwMDLjQsJQY1x1MDAwNZE7X831hnNznS6lXHUwMDFmUzMxf+hcZs+ehqfT43LtKmLLXHKmPUlxdlx1MDAxMFXMrm3Vg9vjcTBMXHUwMDE2PE5GJVx0VqAzjOlcdTAwMDFnMfB4XHUwMDE4yryrXHUwMDEzmPEw74hcdTAwMTgtheWMkW9imnZ9r1x1MDAxZcyLXHUwMDAwwulcIjjhvVx1MDAwNDWQXHUwMDFiru32+/bsil1cbpdIPIKyuE3V30LPXHIjKUF1XHUwMDEzmmC/Vl9Q5mdcYlZ42Fx1MDAxMFxmXGYlurKMklx1MDAwZkaFaye5Qip7fNNcdTAwMTdcdTAwMDfNROJoPKyMZjwkKqwthutxZ9xcYmzPXHUwMDE1uCa+6FNBkMNcYktd/Vm3XHUwMDFjXHUwMDE3XHUwMDE294/7N3VhylmSKtdcdTAwMGb5tHJ6XHUwMDExbcovsCxcdTAwMGbHilNGwfyz1eo1K5XHiMbqtlx1MDAwNarFKVx1MDAwMl/T+91IhV19nVx1MDAxYnDhOUdCwpPQfPtD76iWVsXb+N9hXHUwMDFi/18/7fVf1fv7y1x0PMZXk/fXrNOc71x1MDAwNbXpv1qLXHUwMDAzrcvCtqAmNVx1MDAxN9D773/9+/9cdTAwMDNcdTAwMTY1R1oifQ== SourceUnitVariableDeclarationVariableDeclarationIfStatementReturnFunctionDefinitionParameterListParameterListBlockElementaryTypeNameElementaryTypeNameBinaryOperationBinaryOperationBinaryOperationBinaryOperationReturnIdentifierIdentifierIdentifierIdentifierIdentifierIdentifierLiteralLiteralLiteralFunctionCallFunctionCallContractDefinitionPragmaDirectiveparametersbodypragmascontractsfunctionsreturn_parametersparametersparametersstatementstype_nametype_nameconditiontrue_bodyexpressionexpressionleft_expressionright_expressionargumentsexpressionexpressionargumentsleft_expressionright_expressionleft_expressionleft_expressionright_expressionreferenced_declarationreferenced_declarationright_expression

Tip

Since all IR nodes are iterable, it is very easy to create a simple printer to explore what parts of the source code correspond to which nodes.

from __future__ import annotations

import networkx as nx
import rich_click as click
import wake.ir as ir
import wake.ir.types as types
from rich import print
from wake.printers import Printer, printer


class StructurePrinter(Printer):
    def print(self) -> None:
        pass

    def visit_source_unit(self, node: ir.SourceUnit):
        for n in node:
            print(f"{n}\n{n.source}\n====================")

    @printer.command(name="structure")
    def cli(self) -> None:
        pass