From 283eb458ef3029f6dce90f1c0ff5346d2897c461 Mon Sep 17 00:00:00 2001 From: Yann Stepienik Date: Thu, 20 Aug 2026 09:09:42 +0100 Subject: [PATCH] [release] v0.23.0-unstable005 --- api-docs/openapi.json | 2 +- api-docs/swagger.json | 2 +- api-docs/swagger.yaml | 2 +- go-sdk/client.gen.go | 634 +++++++++---------- go-sdk/version.go | 2 +- package.json | 2 +- src/configapi/routes.go | 2 +- src/configapi/routes_test.go | 4 +- src/constellation/tunnels.go | 7 +- src/constellation/tunnels_merge_unit_test.go | 26 + src/index.go | 2 +- src/proxy/tunnel_lb.go | 49 +- src/proxy/tunnel_lb_test.go | 52 +- src/utils/types.go | 7 +- 14 files changed, 459 insertions(+), 334 deletions(-) diff --git a/api-docs/openapi.json b/api-docs/openapi.json index e125f0ba..41d652ec 100644 --- a/api-docs/openapi.json +++ b/api-docs/openapi.json @@ -4,7 +4,7 @@ "description": "REST API for Cosmos Cloud server management", "title": "Cosmos Server API", "contact": {}, - "version": "0.23.0-unstable004" + "version": "0.23.0-unstable005" }, "paths": { "/_logs": { diff --git a/api-docs/swagger.json b/api-docs/swagger.json index 01538265..d1968e26 100644 --- a/api-docs/swagger.json +++ b/api-docs/swagger.json @@ -4,7 +4,7 @@ "description": "REST API for Cosmos Cloud server management", "title": "Cosmos Server API", "contact": {}, - "version": "0.23.0-unstable004" + "version": "0.23.0-unstable005" }, "basePath": "/cosmos", "paths": { diff --git a/api-docs/swagger.yaml b/api-docs/swagger.yaml index 0dd7904d..3199c9aa 100644 --- a/api-docs/swagger.yaml +++ b/api-docs/swagger.yaml @@ -2067,7 +2067,7 @@ info: contact: {} description: REST API for Cosmos Cloud server management title: Cosmos Server API - version: 0.23.0-unstable004 + version: 0.23.0-unstable005 paths: /_logs: get: diff --git a/go-sdk/client.gen.go b/go-sdk/client.gen.go index 26bdb67a..6a3916e3 100644 --- a/go-sdk/client.gen.go +++ b/go-sdk/client.gen.go @@ -36461,323 +36461,323 @@ func ParsePostRcloneVfsStatsResponse(rsp *http.Response) (*PostRcloneVfsStatsRes // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "7L3rcts41ij6KiidXdVOlSyn0z1f7UnV/uFYdrdnYsdHcjK19ziVDyKXJLRJgAOActSpVJ2HOE94nuQU", - "FkCKlACJlO3ETvPHTDsi7lg3rOuXXiTSTHDgWvVef+lJ+E8OSr8RMQP84Y2Il+a/keAauDZ/0ixLWEQ1", - "E/zoDyW4+U1Fc0ip+UsvM+i97onJHxDp3tevX/u9GFQkWWY69F733uEXcsf0nEwVmTJIYqIyiNh0yfiM", - "6DkQCanQ0OvjepiEuPdayxy+9nuRFHzwDzEZ2YX+Y/zustXy/oeEae917/86Wu37yH5VR76xPRv4h5gQ", - "FgPXbMpA+haZa5aowXECUj/Y4qpjehaFH0gk+JTNyMHVu/E1ETxZvujVl/PqW63nfRZTDTGh9XW931jW", - "yejd5Ql+fuClVQbesj7TqtnyXn3T9dXX5bnOMafZ6Ph8+Chntzb4lvMrWrZY66tvvtiti/zad7Mpt64p", - "m9GMDU4kUA3HV+fX4ha4owmmSSZFBlI7AlmbqSR/SkvGZ+YE4HPG5HJIl6rymXENM5DmO8v+NWcaEmYH", - "ZxpS5R3I/UClpEvzb05T8DbMQKZMKSa4qo24+ySvyp6+CSXQ+B1PlpVJJ0IkQLn9alYQ6WtxIrjSkCR0", - "7UzKxl+rJPPfdiMf++uco1+5i+Hl2N5u8BqiXGmRDi/Hp1xL91uLndfW7EZZ+g4h5uo4jplpRpM3iYhu", - "zc2pdlcXc4Vd3yTU9vcfaczVGU2SCY1uvcPGXF0JqT3fvm4/TarmE0FlPBK5hs2zPBFcU8ZBnkcBoC5b", - "jHLOzW/riLBqQRifCnIwFZKMT0cfjq+uiDTTqhe9vmfPwx3o9DuL4UyKtNyD/+h+F0p7+we3dCFiPzpd", - "hvDsiur5lYQp++z9fE3lDPyLeK9gbYGVpb9X4B25ij7bLhcSaEC2AtSjPWpaRnBvMrk3GXw8ateGnu08", - "IES18G3AXYmLDRYuxeclti9YXr9nRqPB00WMu2x05auBAve+OovBEBYsAiRla/J4fXsT0yJA43CIYmkp", - "/fwW+EzPe69/edXvpYyX/+xv7oqz6Jbv0XNtx5UlVMZsunsrJmzd/lU+SVhkMD7IsyOhUqEu6zSoIiXc", - "55gYXzDFJgn4b4BlfoRUp5+ZXltRtZt6y2ZzPRe5gk3yb8h9Un5HUctL7pl6K2j8hiaURyBDM40goQGx", - "owoDm0uwx6aK+dfObVNyCnLTILywrDGknMZMb4WTtkf+CMep6ayVLBMgfZb1D1Zvk/pGqZypUxXRDOLN", - "e7uWORA2JZFIU8pjwhShiZE9lwRsH3KQAuWoKzDIR6gitGyeMA4vyMG/GI/FnXKKBRa9GHjhj2pNo/lY", - "xyDl5lKO8StqJJSmPKYyJiClkNvHYrzZUIxnue6TlN6CIplQiKQkVyg0aZA0ws5b5xK5bjaZyHWWa+9g", - "URr7BDh7nloQmXNyNwduBpO60NGU12ywoLnoK1LKuB9jh6tvHuQEI5JngnHPhk/Lbw+9XuCLzeneMqWJ", - "mBLgCyYFT4FrsqCSUXN/WhAFmjB+n1k/Z0JBbKR7izBJ8m7ae/3v7dIBp3pguoxB975+7IcWbccmGQ7+", - "td+bA030PJqD5dHN5loh+e/YvZBENqb9fTU6sV8moMhc3JmDsj/Xzsngu10RnsS8wjXXBi6++FheSmee", - "LoZmmyMwE2ITQzqYJndUkYwqcyqTJX61UpCQ5AAGswGJRJ7EZAJELdOJSFj0wjdrQieQ2Psqn4hXNcK3", - "+YTzXpEdCMFIC6LnTNXgaIPipjQ6jmMJalPU7l3QiLiPxdZXd3fDb/gQMgkR1RC/tlNZjSxTJC6/EMV4", - "BOT46pwsfh78+uuAvFdATnmMODcGbbBMDS7KdRBm+B+NB75z4qDvhLwdMmUQxkN7zhVxbUhcNPIRLsHf", - "5CzxDPDu8s3787dDkoKmMdWU6DnV5A4kkBimjENMBK+AwVBEtyCnLIFWaCoy4AF6/y5D+mO++Vau5pAk", - "m73G5mdiJBdscDgVMjW3Nnp/2ScnF8M+Ob28Hv3vq3fnl9etVooreccjD1KcT4mWOfRJlAgFds2ETjVI", - "PKCfieU1EJMoYYbSxUxFgnOItPIzVaVFNmYzTn07xN+RSGqRId/eAOzVNkyba5aCl8u5D+SAcaIgEjxW", - "L7YPXBGotV4G+WbJM5WRL1JlBqVE62WfMB4leWxYij0nNjX0gynChbYHGPvPxHD1zQnfKzxlA5ssSZBx", - "WQRF3nugXhg8YjHU0bZPaKIEUXlmaDgKDK9nUuSZ7wgXIslTaEKVVvTET5XcSOQgFTnX6oWZOEZgXWd0", - "GwMaVGZ8NmSeMzjJpbRgJSHSQi7JwdW/hi9WDNTKIXhAEyAJzbmBxl6/odLLx6Y2RW8jby0swDZjgJql", - "MBjm7q28yff+D0hBjJyK4MP4HCTTA1L0UIRKMLzYUEuIkRFZ6CSccuHgeWA1EaVGsz7FyH4w4GdOiufp", - "BKS5KfP6gCjXbAFkSlmSSzAUFWJAec58ZjHIKpKYBeTcMd7BDa8sv1i7F49QxDp/8NO7NqTZjYropzWk", - "mSYVWUURqkmcy0K+w5WQDCQTcbmyK/vPB11XdaJN8Le3zTSjCfsTyASmQoIzatrrwv7KXkRuAF/ccbxo", - "7XRDa1OC0sUVmxamYwYSWUNFhKI6KEcNbvgxJ+b8lkQlLIINuMSuMUxpnujBDb9GCagE09c3/MtX8rps", - "XLmEG/7lpnf57vL0pmdaOG690eLkYnjT6xPz7hsMBqYlfIbI/Ds3wrNyyJ8si9aH499P3741fRz+mz6G", - "PK7IgZ4TtVQa0p9UsXTLNVsxRr3iLg8EIY4rFTfGUnwS3FGmC2Ao8K98mdgrFGROF0DmOZ8NAtTMb/z2", - "a3bbKYnM9uI8sUzqHso0J5GvhvNpR2IUtwaljaCmQyt/9Rh5aPaJxnE7BbHpFEuRtexl4SygrHMr/BTW", - "52X5JzWnEgJWvyjLq18s6S4+gP609r36YMiAx+qTVfSGOPo2AG52+EM7zztufun5gNHp1lpbvlp3+KSA", - "ymjesl9Nz7BDmeD5XD7s201rH9dt+2hJP5mHbsuzmbHYD11rL/r7Q0PlEb/+KA+/vT0qZZGEbRR7vJ43", - "YDJh/LblIaY0MjSleDxvtE8h/ZSwlGmf/KVELiNL0LWkjGvlE8HNEBKUEWaCu3fv3U9pyAzpGqhHQfsx", - "SNRp2zm8R5sVuqgWpjmh9CfGlab2rduip2QLlsAM4rCzAZU6bOtqbQv0mNQ2LII5N9zcO6kRtyXTy08i", - "a0kx8B35SWTA/Vs1r9lPM0kj+JSVwqxPDhfZJ1U+un0vaUlnUKxvfxRTSxXp++Kpe317nskhkla8n7e9", - "bxvdNz5eBxfm/33X4V6qn2Imd1uCLKnbX8KpM9lNcUdwe8B+OA/iwNe9F/R7nXGE38ibF1R5pQZeiVvh", - "t3j77CW5rw/X+gAKwrdpqUKNEA0aT2PJFgHABG66fWLZ4r8ChjhznnV8rZllaeoFCae/aATsTTZ9fnV8", - "ESZ6wQ162e8DsHC/st/8StJcmTcUyTn7Tw7NFEAtT2DjwGdUw13NWlqhqfmEw4Mg4Br/3QTDhFHVVtZm", - "2eLXraKNAc0tDVrv4gOSYo/vTxhJvjPE9HtWgvNPFHLganIwZ0J60PfDwzKr4Ctyr7cZ8MUHKtsCWVja", - "L0zYC8/t3AGava3BiRLGNVGisNKQiHLCZlxIIC+9WseHAJsU0reFXB+StoNOgUYafsN4zPhs5yUWZtkL", - "mlX49pVIWOSnKwFZZwvYWfuVoyI1nPT5mj3iQ2LbC0LZ5anHVVx4p25gBNl7Zkf1Nqfdcl+2z46L2kI2", - "7+m96VYR4fzuyq7oMhE0DolAJ+ig1loICjupUwncGg6mNECAt/HXNvtM2UxSDdfid6F0gdL1Tc619rvB", - "mQ9q9xKwf9Hat5QZ0/N88ikS6Sf6Z35Lqfxkff4ODVqA/KRk9Kn0RfeKIoWP7d5g7EJ23DAbMt9qsSOR", - "wD1nMUNsmYHGKeM1x9pwZAG2Lb2Dz69acig6A64vgk51NNfCuuj6v09odJtnzTb9Btuutm37vkPPqyHz", - "Y8gENLXzB7ALnWchPjFCwEZkQwM9duWMV5DVMiJitSU0WcllGblwrmp+2x7nMrm/qnozUMqH5FTTCVUN", - "faeHrvVqQGezKmjDv6gsIho8lM62fZcBPx8O0Wa1teF7BfKCcjqDQpXsaYpEqs3VDKs9jOCWUpa0GeC0", - "0gHVuSlkdAZthvi93sdRyqjNCNfXV6vejEfyTQN0SVgEPMAvEjGbMT57CwvwK8FSKm9Bt9nmRbWHGUFw", - "poUZDyMf70uKbfSkTzgt56l6SW0CT5rF/JN/r1mcfwrItnfnK6Wsx6sKofsEnX3a6lHfVfr6oypSoWFs", - "lZENOUm1y+omHPe9ODsO6E2RrVqqGXi+YwvkhdtUpg2DENfXp+eQtsKo60qHdfGiiuE1TPOJGvgkG1w4", - "17dNOSKhSl/T2TXzPZvfrj4WJmzDmwi6ApsfzQttzpx3sfWeu6OKmEGJprMZ+Hz+vCBOGR9clrDoN2bT", - "JBF3hlK8FRFNzq+Oo6iurKiHy53MaZIAn8GVFAsWB4TSmKuoaLi6of1fklvNYSgSnpjhpiyiGoJPylTw", - "mYgnwe/VSIeNjyJl6CCzDAjbSt0J6bdmK5UgPwjgAPjlYp3gpkLf/gnBp+2/WBJHVMaVM2kaVIUgMwad", - "Z35oGV6OTx7yYttAX5QArXDxdW9Qu4DXBJsVccjOH0SZHfk98/3SW2jwmsxGnJOmT+tlX37HRrAu6V9w", - "xdiWoBSOHsAae/iWW4hilyIuY5VCw4oFSMlicL5rIgYSmVcxJ4KTFLRkkSJS3KkBGVrvHmWdoYEU+Gad", - "/BHs+44oMUXu5lQTShTjswQOcWBngyR3lNd8VmskoRntgCCqbPFUv76+GvtmbUwbKlJP6DyvpCCuGbmF", - "Jfn//p//lxgOtnJ1rsRjOfijPL7hC5owG8u/YJSU5lAD6W/deM63DHhMxNSCq/cU10jYWnRHIafviORb", - "c8k1YOfrspWmZULpmQQ1rLwNgo2KUNzQybq4kjl6+cZ4GpSgc09MrtwYhb974WKfGIJBxv/3W3sH3g24", - "rldNNmIeEkHiv5WCfx9CjXrrN4zH9hiVx5KFZAVV2+t+ONXwPsFHEOVSOS3yZgszKp2VjhW7telXlQ6V", - "rAZnQkZQm2vd2cPXjkjKFChCuQ0MI8zeP05FIsq5QANESmMgsuiVLImZ9lDwZOl3Fy9Wdbm2f/+aqq1c", - "ONlqEVzwQ+/MfTLJNVGaJQlJgC5qvcoeN/wg5wkoRWqzsFV4CsbrIbv5I+cYsuYNtgvDyUmSKw2yAiqh", - "hoIrpjRwqzgHnqdGOo6Knw2vi6jzDo8hgZmha/g3cpCKuOwgvd/7fGiGOVxQxC9lxqtMc5ajP2nll5Ni", - "/Mpvw8pUtZ/drOUGhqWmtFE0vnmLlWeyrxgTPndrV9qM1q6j7W6MquI5SkLr17l7iDUQcKJP5a4bDFHp", - "sJatpI41zpdcrWB8hRMGf4tITH9sS2kvXItrsZ5gLty0kGoq8WZ2kcS6fDA+QzEHUc1M0kf+csNTujTk", - "grpgCzeCJBSFHpJRPe+bf8MCChNZPLjhbnYXh+ICQ4rgjDSbKnJQmEJp4Qm+oEkO3jg2Hc5cgYO1utnr", - "ao8SFhv1NC1L402rST/UumxBgas69ygoiswkW1DMQLb6S1qe3+v3yj+kSugC/Z3xv83IS2XO0VU5euVX", - "74+jcTFp5Uffb6OxW1O1nV1eue3rtWusE4DCB7GZQ7xQgzOWWNl10x3e/FyggIXEPDNvE8P9HQdW7E94", - "s9S+CJcx+xOfRxadTMPaWH3DdyamK0YyXhsRrYgTigRfACKBFgboXV4LPnNRA2VkuEWEGx5XMbN4ZgzI", - "mcG2zzTNEuibLwnj+ec+Ro16ZrrhRrym5Kfbn/rkp/Qng6s/zX4iask1/Twgb8ZDg+oin80RVe9YbHjy", - "CmPvmJ7fcKsT7pMcZQuCzqWzuca92vXihq9ARsA1nYENJ6ohvy9eJ4wI1w4tCwwwTKBX4F7PIX6v3+MZ", - "y8y/HZFvCPJm9Dd2RPPnh2JU849rN7L52zwa4ys7g/n3STFLuc4P68TAZzNtpnarseSH8kURJyIL2LFU", - "PjH0u6Flv/AacF4Gm1s1z5bzzB8XfX5VKO+QbZxfFSHA3leoULrII7U5lPlSGwxjDp2rSb/NTi5otu1w", - "G2mZ10/F5xcYmn8MW1xfMQR2s2+VuL3+0psKmVLde93LGde/vPL6pmRSuNxxv0mRZ20zMD1WRqOmNnOz", - "/CFkiVgWJqt1D8S0CHFo4DKxxTGl4h1QiTf6r193hipJwHyBllUxzlJDsX72ByeWGvw1vmI/EMzdRkYn", - "b99dnrqkoyhyKfvcj8tzIC7uhgg+ICdziG4hvuFcxHCI8bmMY0RbruE4y5JlodkrHEdw4+4UiMy5QvUM", - "JXhbfHbD3dyZFHEegSJjTXWuzihLUPM+TcSdWZNExoG6mM9MITebUpYcYqDy7Q3/T04l5ZpxQFFxQC6F", - "JpRkCY3QAkmmLNEgXxdbdnogpoij54dqySOztQWjpKZ97BMljNgplwQSNsNUJagOmVPHnY2o6vahQA9u", - "+P/44i5gcHl8cfrVPhIRemyOASOBK5Hgw1NU3p5m6YbVUnOUg5Zx7pJqmC19V26/EAUJRFo5heFVcTTl", - "d9xLEb5mObAN8jTy+QoiBuQUxWhDGvF6MYb3pidFzuNDKSaM3/Sw54RGt4dm41Q79v7PDwSsMZ/cSaY1", - "8FWcaJmAAW/YsvFSLF2N3ev3EqBKH05ytdzkwpVUPmvhiXSmHBSs7nEFH+ZG1YAcV0EfQy1Nv//175ve", - "LMtveh9vOAo/+GJKDIAKbruSu7m53no6RXRGHODMLnTOHBSONLjhF3miWZYAMQtGMeb4cvhT/JoUs/Vv", - "enyRwk3vI3EUTJGJMNBtb8AGs3Jxw92+ELf40oInU+U+24DSGrksqF6/CHAsiVCIhlqfjqfGAjad8hyG", - "niFnGzJ16zetxEz5k1AWLLGd2Wk9pZYZvRyr0vPjliVfgJyFvecmkvJo3tpdZi7ueMA8l3N9FYwYFJlW", - "waukPOD9sXYM5Zpr0209A9MsnBR1391wQFAIaFz9Qmy7rVYW4Eb0bbMebF0VwBjX//WrP7PHMgM1+E3S", - "bG5l+6HXCl78um+qHnF3mMACEuKuosw10zdcfMFiyxBuYXmEDzaSUSYr71TG7V6Y4JhrB5d6WDxK+8j2", - "V0KHy3CAMx3atjecccOebFM1L1IUlVk5KjPQhGS5NBTM5sLDZYzcdbxGFa4vbYffhlfNolRs3i5pEB50", - "2wPB3th5Smdwzs0JeED53JcmaFg8TFw26UMXzIA5CM6HZpGUWyeFysGXqdsxtZy3b8xmoDSJaBLlCfL2", - "qRSpmeqG43A/KSc7OdgkB87+iPlhnPrPjqJsRqclSGXvZrK84aXzxAtc2KURmlwOBwMMdvqYTaemVzE3", - "+e8RZGJoR/1vMoFE3DnD5w2fCyNQVaa0vhkp5WyKP+HwEqYg0aZXrsBryfvApM5pMmZ/egCg8rFMcyA0", - "TWoKGjv9Kl8OTZLiFDBjzg13PDUmYrojEZVIjZAUE2eAxhRU1npxC5kuhaw7KmNiBS02YQnTS5unyi50", - "IyFVhWZQGc2Zhkjn0meDrHwtn8JUxndGWDm5ek+q3VepOOwJoLQvuPeUaa7nwpd3EH8v87pU8M32cIES", - "tExvCLG1hUciNUflEks4WEWFca1t8ZC4OD6/vD4+vzwdkYNVsq8y9c4qK5Z39WYy8GXjO7EfEL24SyRC", - "E5Ia7Jq5A4oox3xqoDdWLgxpSzOxSt0XhtNmDocbGSmrSRy25q62N2BJyVqal+IKEKe1KPwkVut1ML1S", - "KmLSu5rXlO0T96vw7kwAqKRvjxd/a4YXgbN04Q0r15mWuQCDWQBP6mOvg4bdkRunkrCxQmDtBRiqsXED", - "6HvmAKjEBFQw1+AHNaYSFkzkiixAonhtxrVwTiY5S2L75IurB21TikmwDQgaGPs3HHOTlrm/GCc21omg", - "ApgvUyHh8a6v9OHxZe50z9E27nslIFqRwa7qho/OTsgvv/zyd8xJdeiSUpEDFMtGZyfm0yXl4kVQrMEX", - "Il1QliBfZVOSSVBIHCr599xpFuch9BzkHVN+lLc6lQ/2/nxJRCufizNwt1257A30tZf7sNjrW/5sJZi2", - "SDrklWk30azSgliBoHofdCJy7RHbyjOwYF5Hs58UAk8h9RhuYA0oAxtEt/IybbaVNe9Uj8WoyNm4JkhU", - "/GoQBYMwZ9s4jVJMIRXcysgGTzMq9drIWkEyHVhtr8cPaFwA0bvSgjS2FqTKGArhp8w+G+D3QgXB9p0K", - "g2zzyW+4nZ0cAHJ7miRLpCMuHfKLgd+VSnr5+BX+vskEM/f7Q+GJ9UMrqIURCfD5kqJda5W5Ezd55Aaz", - "t5wsB+S6HBTHsCOy6doasjxJCjG+eBMQCTOmtPQjqlzJ2j7Pm/KjfUUkLkli+DVh3wF21SuS6GS0dTm9", - "drul0G7XPyClymzVK6L8hmPDAvJRH1t9+4BaLcVIrrnKcS2bNLp+dMAMPXYneMPtEZZnh9Kl57jV3Jle", - "Ky0rPprA7SOo2IH5dQbcALl5OCNvVZvvsHbaYHOF11416Mh9qV+eXT8aAI5QG1mjOvYr0h68JHfe7jVl", - "6FB52OUF2T44lpF4AxdkyROOgUuxyHHDS1jmwo7heb6hDdwebEQV1CDnht/0cm698m966y2ZlcKtA9gE", - "qmA2WeLxnw9bnrcQ+mzclq2NbK9NTmA/rHTGfl5WcCbbupqiFRkZvjnJ+dDm0lTeB+39XrKk+pBdaTG3", - "6agwWbiP5H6wH4rFbDwuXUdy4MSoZEmORxfouvRi0EbbMiqvaj04xGysZSYW5zvQYPJcleawrUkMw27W", - "+xb9MNCZQCBbTM0yuq0CCK5/ZyGH8Oq3rME/1zlfsB1nZeDt2n8FD1YjZfehvBUzxrcnptz75qqGhErP", - "n1/9z1rX/9l4FzssDLihwi97BAoaXvd3KV9jZ+83uKIRMmKQ3/eW/u6VtezKnDd6pffffq5P/PM+d1yf", - "IHg+4zwWW8/moeBwN/C9VyBfnR2jp0HQvKMDoYtrs9lmu6aqgvl2qLgPpSgyEIxAZYIrX7Ig+5q0ScO0", - "zW/j/O/MM+mfzZicN9VBIAYhPta7DT6hyo6gAr0fvq6juOOBoKQnUAOtb8Hsd6r8tkH8Os6n/mp5W64w", - "jlFFeIamfRW6yeCh6RBjRKNcu6UU9XzXQlQjvcfB42DHkQ6cfC31X8PRTso+Zfa5QNQ4RgBLNpuBhLhl", - "3pb1HH7VeOoFSBYIQdVzKbQOrkhLGt0yPrvAwL97pHzZPN1NsrnFvb2FJOs7+I25ijoyobOMgmkh1uFz", - "u6i4mX5k0yECv94zY8EYoyrX85xs5uSwSQuahov5KkFveB3uTsft/yrN58mWFI0BkLxnjqVwFpWNzZ0x", - "CXc0seVkIfZlXtjJNS6Pr8ejimOkJ+V4dSnbixF+u1q69CFq6U6a1dKNt2bSiLma7ii2GygP2O/F4lLo", - "8ZJHlyIOpfHZCmssk5QH8ugVgdKXMMkTWlQI3J45S8+ZGtZKRm42yTl37u4Pmif5azNcKOFiAxtuAxGp", - "+3DyKqbehkR/X16gTQEjGNLeOJB9WxDwPQKVb9CB/6ZHhCT279cGUG96jxl0HL7l4Vo6o/UywBgSabZ7", - "FXIjU7csu5I5B/QICqBT2aiSM7U5qzmtZ0zy5Bw5xwo6Eq7fjvfA56kUaTBJgF/gEppNl6hECXndbb2x", - "AGXKVXgH+T7XW8na9PjpN6IIMn2cJMVleLhWNZNbi2wd2HaMdSVO+YzxcHK4uYvGCwXKYxMs8BtqEdEo", - "FIAf0Wz76I5nVUL5UCUQzoATVbJYFF3+RZkOlBWud2iWMmdknfalCvkDR4AZLyp5A0bAjYTjX3Vh9rmw", - "wRDHuZ6vZSyoNN6Za6dAhWpMyQ4NkkvEETVIxIEN95qiYBNFVgVb7DTgM2y4bJvcUVeVDqa/gUc1vxhe", - "jkPJsZLp9dtxMDGE+x6CytVng5HKhcS3K3tgh/hAExa/5zqUfkglsC2zRbQls0VQjsBPey9cJ2qxfdFa", - "5kpDbO6kdbrGXMGZkHdUxhCfCRkk3M1zc9SylK5KppaoUoXpj1vJ/qmUQo5A5Yk3LCyU1sp6/QWySxUa", - "vub8ZyNX4eYrd4ZxMiGdHeVxiG3fsXgG+t4FsO1KDRfCeGxP/roWkSBSaBGJJFzqZH/BXbm6rfcsCPJA", - "GdQ9CRc3jsnO1fbRYse0ORLa3GCtX/Mry2XSasu1nImbVTcCEh+KHKHqOPF6atJapRrZJKkyi7eQg4ra", - "eBUz/nP/Vf/nl/2ff+6/etl/9XP/l5f9X37u//qy//NL87+fP25YwstYcedKjBu+Oh1dfDoeXpxf9l73", - "nLOTyNRr4hKn94ma5zoWd7xPcgyy6hNt1sNp0utXun8anR4P0V0d7kgiZqr4evLu8uz8t/ej4+vzdzgJ", - "6KOM6mjuXE77xDBOX+PakFGRj9G2G50OTy+vz4/fjuutJGDAAU0UOQC+IAsqVZ8U4rzqE3sj6kUx0tt3", - "v+Hej/nSLHsG8aGN9JB9cnF2TMpbqrb/9K/T438GOnGB/WxZF9dpdDp+9350cjrGEtEcPVsKPZpZkyVX", - "feIqCfSJUx/2CSb0XR9l/WCaDtQvXsjFiO/Hp6Nx6cRquiVg/gsxs5VuVZ+8wkNQoGudakvAIvoJU/oo", - "Bk1ZgqlHHLBVns+YnKAKH+3hLTBdv/EO7nNke91cHXhDwN8eeBvA607o/OjPmLKG01Us98BADZT8kLqB", - "BWFs9xKNENLXUHgTPz+uKGhdxK/T/EcqYRZmQRt9N5PPl/LBNTL1lnLt2zfBJ9XbN2PNotvllhTtqAco", - "lQDmbXm9LlnU8sXXTIZtDXNeg6Mvr3ycsm1Z63M9P92mI0Kt9fHV+fEkV7ClyYlIU8HfCB1KPCqkEpLV", - "FUfNrdhF+nOgMcjfzcNjZ/rztzCj0dLcg+2ltrYObB+rXlb63yP9LovhTIp0SNV8IqiMw5oDv6U+ChxN", - "Sj+/oTy+YzVFZUV9Ei7WGLThL0DeSaZRlWV3Hwid1vMrCX5reSH9WcExqOGvNho5kfD96FwFq8k1NvWr", - "W5a9H709wX/7W6RU6vGcQRI3NCyuOrjKOGaUTIjpdqWfWXV25TutqnV5i8XX2aWvQF4wnmsIlKdbFZtr", - "URy6sLJsMcBA/HsILnMFv786CaoA1vrVP+46kbuynAafmMdyy6oa/qLP7pjDz4ZGT+FV2eQWVHvbY7sF", - "H6xULXmKyRqCNvhNG0auxViLrIy7U+HqHCHruPt2JoLIs6W6zxZjhYRMKKZFIC2/BG1ETsG3VMgK6hz8", - "gFmZMQycmxRo09FzGz9P6effEjGhyZileaIpB5EHTPEZyPcK5JulhvUSZJutnE/e7oaN571mKbzJ4/qt", - "rorHZbj7MbIDXreg1NJcFSV6MceJaueqMuY0Gx2fD4P+HuY18I6fhehX3DZ7w8Y69vH9wFAp5+HUQtUd", - "yXxysgXR1JJH4e9bDnEHIXVn3JYqrd1NC8p0Xa95seY8K1lK5fJEJAF3KBteuqVJeOL3ypdVd7t7Z9iw", - "kFCl1y2x9a+F+fxkTvksOEPC+G37Ug5rvtDbvp9+zrY2Ca6sbSiE6/HRl1y4KH09NkBkD/4NUAnyOLdy", - "sznH3tzKugVquRQH7E8rKa1ALGNm31+/YkmgqXA1bzVFbeZGFpbR6fgaY6enQhJboo6cJCKPiS3uQtJV", - "8SUjxGl0InYNx7bJ8dV5r99bFIGZvZeDV78MXh7mXGlDIV6+/LUoikMz1nvd+2XwcvDSJa3B3R59QuXR", - "6y89R1HXQ810LrnLkWanTMQMA2kJVTY7G+NEw2dNbK09t1yXsVTw87j3uvcbGJhUyM2s7zRO+erly+KM", - "CldC+KyPcEwkAojatdQ5E8apXHr8qDeO990/zdZ/fflzwymaFX2q2pE8k77n1MEGxHb6X77l9GdCTlgc", - "A/KBvzU+3QeZ+9xVhC5AE5vXkAxD6qro9e+PXz/2eypPDW3F8Pc7nggaV0ANHY8wCvLfPRu63ftoxjyi", - "GTv6lELqJLGt0GubkRwzeDglp8sy5NaMgZE2WHySY+IaHwwfZ+zCzrgTkGmG7oym99EfSrQ+8GqYQQvg", - "vu+0DwLi32ARNUD/9eXfvv0KLkDPRYw5Ko+TRNyZw2gD67+BXoGfA1BnUt4C8bQs3OYA3gejrrqbZYeg", - "9BsRB9PQr5ow2Kjsdi8Yb5GqNgzfL7/9xb6hMamkeX0K4P33b78CIwgnbE1K2gnUbzEWXRbphFaFAAkt", - "YLIA7QtnB/rofDY3gflKqA6aO2h+ZtBcp9RHX8yT4asVTRKwGto6mA/x9xLQL4vwT0lTsCagf2+kWDMt", - "iXvc4AsFk1CW75NSc1S8hiycrg51XXj+eD/setWh19NBr1+//QqMEHSGbmttRaCVV4KQztmA0A1MI5Ml", - "KdX0m+xjpyjU4VSHUx1OtcKpLPdJZHmHUx1OdTi1F06VgmHGDjGhgKpLheuqq1QsbG3GsmxtZfiQCJmx", - "azv0BqI8yElbLzuasYGb0uWoKEFr88zxu00DrIU7ug2c//pU9GlPATU7nd4zow9DRw/WKkw7ClDB94qw", - "6ldU0yQpMwdDvBpOkYM7pudF1jga6RyzhBrUmlM1B/Rh9QrANYrQqayfBHi3VkIYuFgBQxi4Mm+Q9W8u", - "RlERSjjcVRgKVsdB216ZXr3iEITmEFmxAEp65zoeqLm44zb7puARbIJfob37ZhzJuqw35khFEUeycnrv", - "eFLHk56w6tJn0f0GC3gAu65FzXXqEyJjm4JyRYvq3qVroIKyuS1kXpSWK6f5SZFK636VwPXJ+RUpvUlR", - "tq8lmiGFY7F18/A+hgv61uQ9vJKFH+09/MBE1Z5sA6J6ZmviaeEeSh057cjpDyTiWzxoJOIX5KuSsswv", - "llmqaIQy27QoaIn5wznTjCbsT5eZZ+UEjBm1AWKIB2RUVBTMJKQsT0nCIkywbQsG8MNVvZFUxFiRwiuk", - "vXFLfRxqEk6+5sOUykkUoQgPTUo6Jd6jeZg9Q3lk4ge5ArcL3NhA7MNV+abtb3qS0gyruSWJd7JKjTTn", - "91YEs97C0uazd92MfDAIPPTdOk+K0NinwWyf4Tvbe0UtAKIirO6AC4Uk0TthACQaXX4TSfTNCqAeUhTt", - "QO7ZWTZ2wOGmRSMM//XYqC1WeTfEaNX+KXD050uryoPHotxOp8ckSUR0u+lU2uQCHRE7Upxmai52upxu", - "3KghQuOyc3NqRA6Kel6uvHpF9H3xREjVDwBt359MPV/pscS+EjmwgOIGMi7JQQVHDfa92BcLNd0TA7Fj", - "h30d9v0w2GdElgqKGdRgSrNIkQPF/oS+jU2LRM51n4COBo2Q7ghiG6C81RXddT81bb+/rsTqpOLQA7bT", - "mTxBnUkbSDdgVjNp7KupaOOE7gZ5nm/IjjX8pVmD9Zlb16cXL9miLKeqvEqaos6RBCwv3JRDGPQZuS7f", - "B4v2Y007kcRtirgJ7GOzONHzuE9sGh1bE7SskG7LTwKxUecda+p8cn84ymPRAguMuzrNBRUqsKMNuWmp", - "dtlX2dKx7Q55nog+ZaVLmQpJaOGQGDksaoM8OU+ErYPUlFW/tz06xOkQ5zkhjgVbv+ZRWllYaZpgCfjb", - "ZsrHAoe+FPj49WgqkiLNaTtOdOY6fnO06m+USHcrIudD/xQVHn2PaYaYpdQcvxkdZWNXg78yPs7+nxzQ", - "6OWmd4vpCEVHKB6Pwzo8rtkq9pFNa6RBli4OzfVKK/qAvZ8UeSBakGmxrociFB32dth7D+y1eEIOLI69", - "qArHBTiuPTll1bFiH8RW+cSSi0On+DpU7E9oLwKMi3HcA3lsRvnLyAPl7jt5oKMoT8+GalVWBrHRilq+", - "vEuodQBLm4kJEeWHCnh8WOam3er+eDcHPQdZ9XGcU0WwMzHjMD4jEc3ohCXMwGclMDbgBXlC+Rh4jPVR", - "n4wH7BNKTbjyf55DdEvYdO20mSJFYuktKQgbuj2be53mSVJ3YC2MMQcKuGKaLYBMbeRQStUtxAiDGLlQ", - "Fu+xZYdC8c0P4+9Mk+TdFNGm5b33N2oEu9ze28aZMT3PJ58ikX6if+a3lMpPEWb1PbRn9UnJ6FNZdtpa", - "/zfo8senHmL9THNy+sC1gg4O+j/aMifRfBMBrkBOhUwVwUJIpARaRQ5oHPeNcJbQqFJbKxUL+JRn7o9Y", - "3PEXRHCCdVSJq6a0Ebhj5q6D/+OHAWKNpS0xgPjdxf+t9t1FAnaRgD+QyzxinsPtJkQi9/JIJAGWSRou", - "JyHAJh1XrHBDxy6pBJJJwF6xff6VfkJ2jBeBiOVHJRn7sLZN2MgraVDsQTiu92RJSYfGT4nnP2OTjmWe", - "TYWQukx+FNucYiHBxPwMigwvx4cSEvQdLaooOxcdQz0yIXWfTGmSTGh02ydYxy9hSivr1RPlShtqw7Vk", - "OyWT4bdIRXY5tpNtEU2Gl+P1ALsuYUEnpvwF6gw4irKBADvIySoJytGkkTtFrfLiG+dP8UiIv5poMMRC", - "wTifA9h/jN9dekkAtrTk7Cjn+F+S0WUiaPx0kb8L8d+PkSJEECFJcdOU1CDUVZiuY0GldGgIGTa0XwGl", - "1KpLF5H/QwDUb2BzL0a5lMA1uYRJntBtNLUZNHGIdDvieuI6NSWvnw+XNE28jt7h6llue//7+OLtI0cW", - "dZD9vbOhWHgies4U4SLGRL3VuKM64fxwdUk46Dshb9vDOyZeaQnuts8jBjXU91cmhnSyATmwrOKSptAn", - "TL1ls7mei1xBn8xdeec+YdmI8hnmweyeEV3CosdMWPRw6BhDlohlara1O11NkpBVexLDFHOU1dIX1UY/", - "rIxO/vmBHFxJQaZAdS5hizVvNcCwsrpOz/e8kxdHSa40SBLX7rSA1uqv4TTGq3x5Bgu8sEicf809ANHH", - "gtYh8eEftZkUg9Us/uerZ78dt3nySqtnU+2sxmM28TWIrjtZy9EcaGKrKW/lMDEoA8hkoQZFhnsJeFgE", - "zWUI+1ltUSRLcnXDzQnFeQKS/CenknLNuPVpgjqyD8gIaHwoeLJ8TRSdoqQb0SS54daBki9RAO4TLjT5", - "I1f2ybcaPsFC0IOW3Ot3u/+Oh5Vo8bfvwcOM+MUiIO85XVCW0EkCLTHEIYWFZ+suV5OK1D2QxJejIVAS", - "pooADyF7lU76IQBukg2iwp9+xKyCT4KXPL+SKG0YSb9hvky/5Hef50UH3x1875M4cxO4PfkyNx43TSsY", - "7APnpYvPU4Tz7/FsKpJk1ehP92Z62m+m51cX4GEfTGUig4kUtxCuILBdIiyfLT+p2rsINFHCtLjhHD5r", - "IiESPMKsecsoAUK1hjTT6BuDDy/CNKEzytaIz6Ct7sSmWrB76rht56Df3pnlJAEqa+Beg+3WKGfeg6qN", - "MX/ounQ2z+dtUEHFtM8hxEbBVQ39uQJJDtxbn00JjVPGX2yxtfRbGDer8PRtXKWsmq+Zr9S6KbSz/f+F", - "DIsWH9Dld+YKSGL+xAikZlOzNVB7WBwR3o++sPjrUWa4cnviex5fmY47JQhcvpERjkJh3ix+nuJDZ8rv", - "or/3x/krrFfux3YtSITBwRJoNLex18v2WM7bCVW8E6juY1u3ARn1+xxejishGg8iqvDHLRBXn+xyfMq1", - "XIZiOczWlgitVe+wTqfzREn18zSC+zFqL3J49OUWls0ysK8j3T9huVPWKTHiFht7RB37oSvn9UPHJpdW", - "twDkkkkBIWGG0IJpd5DZQeY+hebuAZ3OeLbb6PVdofO7i0iF1avKszoBqXvLPmgl7EB8yP5yEsRMH7q4", - "vFYhIqcx08Minu9bKVLNpM3UqGZfnQr1R1WhYpmmqsHAq1ipZAlrixZTISM4lDAVMg3bgn8/JoInywF5", - "k6eZzSwjssNEzAhkIpr3SSxFpkgiIpqQf4Aeawk0tV6yLsmD64Vp+VLK6QykQv2vBKWp1IpcHl+P+yQB", - "ujB4vwoYu5NM00kChHFilmm3nppPShQZr6w3YkQ5mQABLkWSQDwgQwEK/W21yCOsXEpOjrH2teoXJfGF", - "LM4xppo2MzyfmWMb2VPrmF0Xg/UAaXgj2HS1tcUyDw2YESoNP7V44RCoNbbPQB9y+KwPWdZGh/ob6Ev4", - "rM+zTpP6gwSao29O6alOzq8IjWMJShVBTnU+c3I+HBFJ+ax9ToNEzFrp69+a9h2YPX8wc0H+H64uMeOU", - "4a+Jvdt2AMSpVoeuzngoymcIUUIlFhfORCJmS3IgRQJ98vsxCgov+iRhC0ARw+W/OooSBlwfldLK0T8/", - "FAKLy5yAAdsiN4KFEVRuubjjpezSKE7nkmo1LkqkdyDdVuGoKUsgxls7qkuVuXWliWGSz2bWYN8SqkQM", - "+/hCokTaxAvSibagFWFa3fApJkM2O7h1HpLE6yDJFJlKgJV/5J2Qt0RwwvQN39tR8tJst4WLpGlf5CZ4", - "0XlJdl6SG16SBhHu4x/Z1j/HueV0RLTldRXZ2A3BQfZn+V6VxzFFqGGPrYlolk8SFh3u4ep6hT2fmsPr", - "kwhefcY+rxYeCOMrNQ2diNx6knDBD1ETBLHfObY1+CF7bQN1I+zQEZG2RATPzVKQlVB/v+RkTuvX8vaw", - "S3d/e9yfObn1GyyeZUZUNZO7l1Hru9Q555C0ov/Xrkt3l3t75tEIK5zUSakuz3XnFUq7q203JsskMBWb", - "l2/zqyYMSnvy6N2lTU/5qtdVYe+85dp6yyGgC+mcMIkBJ/KHmNT5ThXSEVx3u512QN0B9bMD6irV9mZz", - "Cfl7SsGbBOaXC3nUsPz2WNYhWedGtJdDYN9VXuhb837huurFN09ejZKX7BCPOtzqcKvDrT1xa5u/bYdb", - "HW51uLUvbhXiYkzVfCKojHfnxyxauupzVR3uHdNzM7OmjIOs2l/Hp6MPx1dXoUKSlk8Oy0U8uUKqTEOq", - "WhSDKnaCxSh7q7qpVEq6fJaFVLuyR3uWcl0hDALTloJHMVO3u5SjQ2zTFV5/5gYwzNjqrrKAh7EWks5g", - "HSCOLH0N+5yc4XfrNq0yiNiUQYyjW4Jsfp+xBXAyZQnYStrOP3qALJhJUCSjSt0JGVvO4Sj6gFhXGkUy", - "KWbo9idyneU66EyC8GlX9EhREMoe08BOYuYLBT7YFvYk3Er2CHzQ8FkfZQllvGXxGnt0EBMzgjs34oqc", - "48X8+93V6ej4+vzdJRm/Pzk5PR2eDj/6BbLQIr5N+r1HnX03q3nU6XfQlEed+2H8wQ2MUwvlQpKMSs3W", - "LK0eysLDPpJl6XCKUVSJELd5ViakspTk/eitc1xb1dmXoESygJicXy1+LdyEQ6Ie6i63vtjMFOjVjqMW", - "T7b/5IAxXe7Nlsvkm3qVPbxkub7CVpJhV+k2gD5Vi7YBH4RkTJVuQLeCGpYd1jHjEJPPBPHjA0jDYg3Q", - "U40DM0UiISVEOlmWLy+IN3EmjA3oftUQJWxuHLejJ4IYnbtlV0F6w5vQU++4EQqK6BbkofM62RmEO8Tm", - "rq7CIwmddkmD2lS1HIbbSj08QALD+wuh5SKsIPoUxMxOztsjJZAFwdIl6wDXpeAwYbfwwr4rXCE21ScL", - "keQpFCXTC8VcrUAIDldBPlisFWLzMazThaszspVdjdGXDAP1GSejs5Nffvnl7+7lSQ5evXz5X4cvfz58", - "+er657+9fvnr65d/+z8vAtxsKkXa28a++utzn/L4QWbWot28F4yzNE9JImYkgQUk5ABjT/qoKO0TlUcR", - "KNUnd1Ryxs3vaSakplz3CRi4CK0kEbO3ZsDaemKYUgN0r3tm+F5/9wLP8iQ5xBepAiqjOdGAocm+KW2L", - "dgdwxhINklDzfDAPc+LkWP8MxT9bTHBFZ4y7Ipm5VEKSA4RZwuLQ0WUU4xEf8VnQGWE6pR6xpNPS4Cmi", - "Aea45DHJSpitkN4L0JJF1cCXKV2wqOZtuXZUoKM52CDDiOKf5nnhum0+N/rufW6WwTTiJCcstdjgo+tn", - "bgG73yGHwCMRQ0wU00Dcw2Rq1lddTgjrWz1NNihAIVfRLLPZHaYJnQVJmFzQLHtA7BeRBn2IAXppHRgL", - "RW1vwji1mWd2iWdNXj3hCb/D6+eRF7PPK+iRl/RAUc5VJN35ArLJVqyX/aG184b1/9eSzWySFJJSntPE", - "KQhwpjJy3w7mjMYqpL7H9BJ2ozbFUhdy1RlB72kEtSlLVjC5AYlBNJiBPpzQ6DbPdrolGL5nm5JIqFSo", - "Q/cwskLolCUhnvcb6Dd2jnuC+iOR/w64O7VbG0bjsMBBfNDZYCZFnjUruO5Se0uRALHdbNYMcj4kN/nL", - "l7/A/yK/hKod/mbn6djI8y6dPiuusQAo90PTQukbMORUVTS1YYUZyJQphZX8G5VGr8DV41T0s+vHabbo", - "ePH7SrkaYyoS1SU6ffLV/bpYpP3S0SPy+uhAnbFgbZ1tdaRt5JEhDxukYUDODBIRNsWyV4pQCURpliSE", - "KsVmHPM3EaYHTUtKW2JxHu9SbFhsvl+hHsY1zEB2lXo6pH+C5YKeEdkp6wgESU6LMsbY5ydlBQ4h28gb", - "uf6+FORxxBt7SLvEmzMGSYw1WPOVOqgTbDoa19G4B6FxZeXmnWIVmm0qEd3bX+0kk7BgIlfJkuRZImgM", - "sbX8VGKBfM/1c9OmSUAdNkQtg6WpB4xHSY7OzfBZAzek9cV3yQX4KAaa72iAaEVmOmPRj2AsonwNa7dp", - "ybHBLo+dc9toVzZPlI5sDkDnaGSJhnlucZWFHTlYhW48Da9TM5ca4L7P3dK7aKYHh1Z3tCvHtHUmE3Q0", - "s2B7lOVJ0gh2r0zDe8BvZvt/S+C9v9emWXTNY7PzmWxRYtYc3hpgYkZmSiTMmKpXB9oGoIdseojPxZ2p", - "aFewej69cD06oO2A9l5AK3iyJGxKmCbMVqmhiQQaL42Yr4BrW1An2Q7OfMG2uZH85sqrFxYbhyLWrnEL", - "SzTTiMy6OSZLooDH1qEMB7axZy6GFBOuEkgpS0L2m3O7nEcqVKdADuwMO4pjXbLotjRCYfkUhPMnq+bo", - "VAxPRMXQ+Srck9CNDOWKC+qRMH5boV5o96kQrz/EZNcL5x+mSZcYYS/rflGeIiZ/2FMMpIkxX49WFr2t", - "YVnmPqwKf58smpEUfPAPMamR7+52ny+6l9acP8RkVRcF8xWFEoT7gM8RgJ2Q9xvoDux+KJb7nH3ynFsQ", - "CpmJmCnz3KNFspbIoMQOsJc5bwT2o5x3YN9R294FBgIkS6JtcICju1oQmfPdsMZ3KzoctPEHqLbzV5S6", - "XJneZEnccTeRvJQWWSMyMDYNOzrQ0QEDCIRWYSwMYglT+jBmcgfiG/AdMrk7+BtzDjnjsItTfm0VVaE4", - "XZfaq1088JBJiLSQS5JRPa9MdRQOB9bzpx8O3El8zzoY2JVo1hgSjOJeXADq1sxciIWpCw3ejYlFEHEH", - "sT9ARshVtKYFACw/j48GPQcmSUIn9Zo9myHkiZgxHlbymwUA1+ZMUNGfK5AuEqOqCC8U+X2CdUn/8a9r", - "Eglxy4AIXqSwCCn23+IKHlGvjxPsUOtjGxJJiM1u6VOOyOgSXj2LRHLvDaYkDrYL/DPHWEc+keugd95b", - "fPnnjjfYB4DFwMmSRAlQmy9ihaK2rrTBu1Aexbd2xqcCy08oOnnj4uw5BW4upfIWdLNwSNvW1lxWIpcR", - "VGl0ZcuqT7Ikd4l55+Iuoso5IBQhyonI41B98Au3pI6zP2/dn7l9zFRSAZvERiXUWDl+roIkNAp6z6RA", - "J9xqHn7nTLLSMVRoCsRIckJAB08v9/7ucQyKP8uk+h3bfQAEq3HSIg1agMyDnO22XF5gq8fNXo5zbAm8", - "we/3yFre5SvrGNM2+wCCV5onmmUJVAoDKJIrI4ViA3k23qqraKamWKkotldoEmlKDxWYRoZLJVgBcVp7", - "CmM+cC0ZBBOCp+VknXrvgewVGJAwm0mY4b24E16vZrKpikindFsA+AhSsXAZ7F6dHaOLoU2OtSpigST9", - "gMYp46QErS1x3hdT+piaByNnvDo7xirnW2h36VPo5DDchU1lDxr3alPjdQqJp+ti+Jy96koYcwq+TXmo", - "739XrLsAX7+7virxckNpsV7/IZNiwRQTaGkKJ7svcLQD9WcueVtYQUBx9NsHaH499AeaMBekb6FMi1vg", - "fjjTgpi9ovsYSiyHUxppA901TVlIH/1teAImvN/CE1ab7Aj/D4gNWBNkiXhQXHLoCcpmBm0O5w4vtr9E", - "bePfhdKPW9jArepamKkuROyFE3OUSPXNH2OSCak3fDe77BDdW/Wh36oWNskJKs0r9UW1IAaLinoHmAt6", - "WwRUKnLeAOew1SNrf8wc27Q/5nun/ekw6pEwCsGLVtQ+29U8pvlOLY9t1KlWfgA/FLxwiKtqwa0A4gjw", - "0Rf3x/lwLfVfQF1zaZtfFr12Rko7Qh9Kr8UrAz3D0mcd3N4ztMgFTRfywGRpISUoEBSFknaQtsuiWQco", - "PwiBqwOKtx5Wf7uUWIOJR3uWYV5hcHNduepxPo2zg/gHqDTXPcg6NGqTD7iOStup7V0RXrADte5axhc8", - "ZDjBFUXNY1yLKtg3kGCzOppIYnNaNMX0Lha/Q0XvsO23LW/cBS78lQMXaohdgt82uf/unCtNbQYvv6b/", - "d8rjBJTT3CsNWVEAhtmulmGtskfGVNMJVUAU6DzrO2VjTc9o61laszCaCAq+F7IBXK4W+jj8OqWMD1az", - "hNzSz6tbxrNwVvQnyqW7kjBP3zH9SooIlEKcZevwtbW8EheaTQtf5V1voFrbHbzZU6KzOhdhtjS644XV", - "kfcuANtxvmfuxVkDg9IQ7HVcLgC6DpMBuD6SQOM2wD0CGu/rq7YG5SqUui9Wz0+s615snWh5n4QU8nYN", - "x6ki0uLaLoQWGXAWN6tV5uREiMm7DPj5kJwIziHSJEqYedjVBMlQWNU7O+GTC4VgqIpvdK129ye46d4q", - "NIJKSZfPMlbiGaZVcxBoIa8qijmAblo8rQEkh14+FUh+BAcoD6R5oKh6Co/sMPI9oo/W9t8Ks7qqJV05", - "tn3LsfE6ffGRlzoD3VmTrXDJXw29jeSU9rWAddeSnt0lk+r04X6lk56eUbfDricgN+9jTW6AXv1dVXgU", - "47ME9uLfVUH0meLQc2PGHao+M1R1pXLqwL/u9VGVtXMvtmJMfr1c4F4Sd/40MPZ7yfm2lllMOnm/k/c7", - "MveAZK4oEthC4C8SeB1izGnYOju2RTy8lTuIFqvwVTZ1PzJV0bGFtA5XbjiMRnzM6KvaRG1KfdjNTDeK", - "lnTRWV3CknuZYx0QbuBUOCIsqydbXlMRzCG6xVLolLwfvTXoJ4FGc8wSWI3ApYQLfvi3z59JAa6BJ8VV", - "g5JU70dvD4FHIoaYKKYBp9aCZLavz6b1n1aCSn+TEMkFi1ymJBEDmSY0NJUCuaBZ1uve/x3afquqXJiZ", - "z0W1Bx0qZJQIDobnair1DqPzCBuPXNvOfaFllgNzamhkGZ2YcyQSUqGBOJ9PkhbhSGHvNVvgDGRYOjpx", - "YefKykC1img2TQ7dLJN2UKlo9CIkII2KuR9RNirm2CEWjaobKApVrNzxilNy8f2dcNRR2fsIRw6YrF3T", - "n5xkhZ8KmqbCRvm/y4X9o+SvwSBEl2cKX2sLTKO+M+XUJuddy8Jhq6EoLLhPI5jmSeGNLEtGHICvh2DT", - "nVXph/QO3kd0waTACHoViLaalU2APnQtG8C161HkHsMECSmN5owDeuFWkszfzYGXpUEYVywGQlf5FV5s", - "x4VxsfgOI7qsZfen+iVSVCF262NL5BpUW6fATIrPS+L6BuC7+Ph8nf+uzC5xHyeWonQOgN/FAXAN2gpY", - "dj80df+rjNLM6a8CwY9lDNyEMM/L0rvi528A9Oy9MwJ2Tn/fxOlvnSD4qEqdQx594TSFZn5/YVJDJssi", - "1Drg7meJzqVts9W6YOlCNXB7LY2L/dI5+3Wm9W/l7LcLpZp6+m3FH6aVH4eqcuezRKDnyIU7XH2O3n41", - "DFvxJJ9k3djZrz3Ts65+3xthv6dsXzj7yU7G72T8jsI9rKNfUwHfOcLsMo6Ni2Y7qNQF/czSPCU8Tycg", - "iZiudMFF6ZVc8oBTTsJSpn0uOYxrmGF9ri7R4g+WP28FHtvyfhVQevSlbH8efz1qCLQnqz67szIUmaHP", - "h0TILfw2qg3apQr9y0DwOVcZRHr1YFuH5N1JQwPgTHMtDnMk4EdflKY6V1/bg/hxroXlAmMc4vuDfN9T", - "QrrYKLH7JAdmEDP9lCYKXvgXoIoNdej2l0G3U46GZiFJzJR1Wa5Aj61QtI6Be+BeNIfo1o3aHufQxdoi", - "XcdhOpC/bw5FA03kbg56jn5uJSD8pAhL6QzInDrDHkiyAKmY4CunjD2gHz5nYqe3sQfuT22/DuQ7kL8n", - "lUdAqsL6mhoNAV65CI8YpowzpyhqC+uJmKn2kP5WzJ6iJLX53k7EjCSMw4M8tzeTD7NE21r4yoi5CqiM", - "5sStLxRqY9q0y3F8zVJQmqaZ2cQUdDS3U+ZcsyS0Har0CCJgCyhuq8WM1gxDBE+WROkYpN1kYC4wEP6O", - "J0vfJBMhEqC8I0s/glOZrRRsoe/BhM2UcjqDoy80Mkv9GnRAO8bv6jVRWmR9gg5u/cI9s09uWZL0MWpl", - "AX2S0VxBn+Tc/SHBpgbvk7wQTBvSugtcnp38SdI8s7wUuCa0WKNnvvJbeCrgeYqOgVpgKODKP9v9ZU4Y", - "fzBHjEeRY1CkO2T8VCZgd8f8sf90xZMuAeczjh8EORUyJZSk6whAjID0EIRpowpT3KwKk4eIrBVmip8g", - "IWlaC+qZvkU6ZH/O9ag0jeab9aimUqTVV9IeZYc6XO30Bj8MnhxrP55osQtLmnHCPTQFlbJenVasg+4H", - "MZYX0IiRrHoOlR8qGjObV4lDpCEmWuwB9biy+xgfxzjAkzU8FlzE7jP+yxgfO1Hw+RKBMWgDmjlXsKpT", - "zpRwJXoe6um3Mn22lR6flN3z0epolus/EzINBOW4DTrbdFdAs6MKj0YVSj/PddT/SREFWjM+2+FRp/Ms", - "nLbIKZsUChvANZNA0ORGE1tUjzC+8oCKaJK8LqvuuXp7/Up1vT4Rmc2HQk4EVxqKAmNOXrHV+Mo2tuPx", - "1TnR4hZ4WZtvQN7xZLmefmCVBsFIQIyTVRE9zAM3CMW4jvEMHrGaH04QSpqEHx/Z7b0jFT8wqShpwTsO", - "h2oudIEFmRQLppjg1igbTH+gUir1YWxWuV3ON+2GMO2yIrUONhpfHI+uCdVaskmuq54L1px4fH2MpO/y", - "wwWQWLIFbE84pzjNJGW7qtGNi2YbxM13IKsmDIpjMSOMjs+HNnTlVe9rVz+uo0L31mUIV2cXSAFfm8XU", - "NoF/l0K7A/YO2H8YYF+n9N7cCyEzrOvTJJ50bU2PG1m6HyJ2eNjh4YO8koUkcZGlwY+Lnjjw1vynw7oO", - "6zqsezCsCzBCn9fktieQwcpmroyPiJt9v2cnumjnD+C/uOQReiLLfNLr96bsc6/fA+6CQVzc1GM4Jnao", - "/hdMMTDKeRWjnQvigQHCPkEY7JMp+9wnFgL7ReDei+1obs2ru3Jx6jmQKJcSeKnuckbcVb75Go1Bf2mR", - "ywgI41NhNc1WFYY9g37RK3NvlxYsfnK5kmtathogbNV45rEIGz1GcGh2DFybTYFala66Y3pu/sUqtZ60", - "IDNJuSaQwAIT2RyY4V+QDGTKlPLWhi9ERrOOR6zbYMbfUbOhKHuFakizcLePJ22G6LDgR6iEc2oRxmAQ", - "Al4qYgjXcMg5FmLZ6Znw3rV7HLRyRWEGF2aOUnTwgQuugrg1PHwiq07i+os/rhyAUTJlCTgOt02wyrNE", - "0Koa0c/83mMzzGpnY8zN8EX9RsdgD1SeZUJqRf7IZn3yRwazPsn4rE9mbNonkzTrE7WY9ckdTLI+0Ww6", - "7RO6YNNgESM7axPNyRuqbPo7ZFjImbEvxLjSb5EUL80TzTIq9dFUyPSwyAS3Gq2eKQ6PcfOgz2unazdh", - "Hm1CplT3XvcmjFOMNd14RFb28W83+kcv1ndOBF1Cu2dR9eQ567gM3pbUctujw0jkDYpMkASNRlN0+MY+", - "9tlRekUV8fq+1+p7ZTOotUzOZ6d5Ann5vmupC3N4XXmLjq48qZCPXNVzItp/N633gVoLGkUoKiIZ8ZSZ", - "NIKUrTR5OKEKYiL4RFAZW7cxv7zmVvVomgu7jR26C7OK0im0KDjZaS062tCMNnznmh3PODFZtYLIWuXN", - "gj7VpJ6jL9xVzN9aPMQ6sBjaVaNbkyUpuodrhiBFulw1216U3AxfGdP3ZFx97aqHdKTmLyqGlEVNAli+", - "o5gJonFRCLrQ16gMIjZlEIexuvKYee4o/T0qDtiHTPdw6SjGt6cYtrQKIn6db3seMFRHc58GOqZlofyC", - "eKg8mhOqCKSUJWi7lyLxVFMxQz4p0vFI76PTmOkdr6MzBkmsrHLZReZ2D6OO9vzIBuWY6bCsUrxIFiLJ", - "Uzj6Yv972dir/gO2/1D22kVWTJuidrady+Cim8ZLZRbVsbv8Ln+hLF9OynZB3A5aNr1iN8K3bctd2Yk+", - "uFYdnPxYRXMW5b22Tf5WhYhHS5VhJ6lpcn0HY5ut9LhdvozObebbqC5raBQis4mYiUbuyCdCpUIVPjKm", - "m81Wf3X5W2kc3qDOb83oOwEbux9lfFY/1N2+IgEY/lvTGb5Z7gLzbHQHmNgj8drRZZQIDkfWs/vIpVze", - "6hE4wh42pOmkSNG8L9Hb6Vk3glSURSytwc2w8D4xPa3PeUVm7JwCO+r2eNRtdGIgH/PC12o/2t+9CFU1", - "zGx7DVWRalg8aB4Nqd7hlxU2mUeV3VXtQdXh0hPEpX2eQXwv0M3TbNszqAaypm2XxKbV3eRphlLONE+S", - "4n7Wk1Y1uKaEKW2vVTW9rbeVLt2ltX4v1nBJkQOkoJg/dpkBFrrpEy7M8ysGrhlN1ItmV6noooXsNaYL", - "6K6vXcZPugDEuf3RrZLNM/ddUl67o/dVO8FjyscuM+aKo3eCcScYf4s0mZzAZ6Y047OWMoYEjExuxLRs", - "4uuOWT13M/YsERNaCjtaUq6mLrxY7QCYEjbUEZ2IXDfhk+/KPsfYZY88LtiyI5YdsdyAfbOan79Paonz", - "NEuwShXE7XHQxduSXJn/Z3wqXPk9pwA40ELTpE9yBXGfTCXALul1MVUrUr4LJz9M1YqWd8j4l1BDGLD7", - "cDa2dN5BG8baQrxNWsApDMpZX4BcJr3XvaMIddq9rx+//v8BAAD//w==", + "7P3tcts41iiM3gpKZ1e1UyXL6XT3U/tJ1f7hWHa3Z2LHR3Iytfc4lQ2RSxLaJMABQDnqVKrORZwrfK/k", + "LSyAFCkBEinbiZ3mj5l2RHxjfWF9fulFIs0EB65V7/WXnoT/5KD0GxEzwB/eiHhp/hsJroFr8yfNsoRF", + "VDPBj/5UgpvfVDSHlJq/9DKD3uuemPwJke59/fq134tBRZJlpkPvde8dfiF3TM/JVJEpgyQmKoOITZeM", + "z4ieA5GQCg29Pq6HSYh7r7XM4Wu/F0nBB/8Qk5Fd6D/G7y5bLe9/SJj2Xvf+P0erfR/Zr+rIN7ZnA/8Q", + "E8Ji4JpNGUjfInPNEjU4TkDqB1tcdUzPovADiQSfshk5uHo3viaCJ8sXvfpyXn2r9bzPYqohJrS+rvcb", + "yzoZvbs8wc8PvLTKwFvWZ1o1W96rb7q++ro81znmNBsdnw8f5ezWBt9yfkXLFmt99c0Xu3WRX/tuNuXW", + "NWUzmrHBiQSq4fjq/FrcAnc0wTTJpMhAakcgazOV5E9pyfjMnAB8zphcDulSVT4zrmEG0nxn2b/mTEPC", + "7OBMQ6q8A7kfqJR0af7NaQrehhnIlCnFBFe1EXef5FXZ0zehBBq/48myMulEiAQot1/NCiJ9LU4EVxqS", + "hK6dSdn4a5Vk/ttu5GN/nXP0K3cxvBzb2w1eQ5QrLdLh5fiUa+l+a7Hz2prdKEvfIcRcHccxM81o8iYR", + "0a25OdXu6mKusOubhNr+/iONuTqjSTKh0a132JirKyG159vX7adJ1XwiqIxHIteweZYngmvKOMjzKADU", + "ZYtRzrn5bR0RVi0I41NBDqZCkvHp6MPx1RWRZlr1otf37Hm4A53+YDGcSZGWe/Af3R9CaW//4JYuROxH", + "p8sQnl1RPb+SMGWfvZ+vqZyBfxHvFawtsLL09wq8I1fRZ9vlQgINyFaAerRHTcsI7k0m9yaDj0ft2tCz", + "nQeEqBa+DbgrcbHBwqX4vMT2Bcvr98xoNHi6iHGXja58NVDg3ldnMRjCgkWApGxNHq9vb2JaBGgcDlEs", + "LaWf3wKf6Xnv9S+v+r2U8fKf/c1dcRbd8j16ru24soTKmE13b8WErdu/yicJiwzGB3l2JFQq1GWdBlWk", + "hPscE+MLptgkAf8NsMyPkOr0M9NrK6p2U2/ZbK7nIlewSf4NuU/K7yhqeck9U28Fjd/QhPIIZGimESQ0", + "IHZUYWBzCfbYVDH/2rltSk5BbhqEF5Y1hpTTmOmtcNL2yB/hODWdtZJlAqTPsv7B6m1S3yiVM3WqIppB", + "vHlv1zIHwqYkEmlKeUyYIjQxsueSgO1DDlKgHHUFBvkIVYSWzRPG4QU5+BfjsbhTTrHAohcDL/xRrWk0", + "H+sYpNxcyjF+RY2E0pTHVMYEpBRy+1iMNxuK8SzXfZLSW1AkEwqRlOQKhSYNkkbYeetcItfNJhO5znLt", + "HSxKY58AZ89TCyJzTu7mwM1gUhc6mvKaDRY0F31FShn3Y+xw9c2DnGBE8kww7tnwafntodcLfLE53Vum", + "NBFTAnzBpOApcE0WVDJq7k8LokATxu8z6+dMKIiNdG8RJkneTXuv/71dOuBUD0yXMeje14/90KLt2CTD", + "wb/2e3OgiZ5Hc7A8utlcKyT/A7sXksjGtH+sRif2ywQUmYs7c1D259o5GXy3K8KTmFe45trAxRcfy0vp", + "zNPF0GxzBGZCbGJIB9PkjiqSUWVOZbLEr1YKEpIcwGA2IJHIk5hMgKhlOhEJi174Zk3oBBJ7X+UT8apG", + "+DafcN4rsgMhGGlB9JypGhxtUNyURsdxLEFtitq9CxoR97HY+urubvgNH0ImIaIa4td2KquRZYrE5Rei", + "GI+AHF+dk8XPg19/HZD3CsgpjxHnxqANlqnBRbkOwgz/o/HAd04c9J2Qt0OmDMJ4aM+5Iq4NiYtGPsIl", + "+JucJZ4B3l2+eX/+dkhS0DSmmhI9p5rcgQQSw5RxiIngFTAYiugW5JQl0ApNRQY8QO/fZUh/zDffytUc", + "kmSz19j8TIzkgg0Op0Km5tZG7y/75ORi2Cenl9ej/3317vzyutVKcSXveORBivMp0TKHPokSocCumdCp", + "BokH9DOxvAZiEiXMULqYqUhwDpFWfqaqtMjGbMapb4f4OxJJLTLk2xuAvdqGaXPNUvByOfeBHDBOFESC", + "x+rF9oErArXWyyDfLHmmMvJFqsyglGi97BPGoySPDUux58Smhn4wRbjQ9gBj/5kYrr454XuFp2xgkyUJ", + "Mi6LoMh7D9QLg0cshjra9glNlCAqzwwNR4Hh9UyKPPMd4UIkeQpNqNKKnvipkhuJHKQi51q9MBPHCKzr", + "jG5jQIPKjM+GzHMGJ7mUFqwkRFrIJTm4+tfwxYqBWjkED2gCJKE5N9DY6zdUevnY1KbobeSthQXYZgxQ", + "sxQGw9y9lTf53v8BKYiRUxF8GJ+DZHpAih6KUAmGFxtqCTEyIgudhFMuHDwPrCai1GjWpxjZDwb8zEnx", + "PJ2ANDdlXh8Q5ZotgEwpS3IJhqJCDCjPmc8sBllFErOAnDvGO7jhleUXa/fiEYpY5w9+eteGNLtREf20", + "hjTTpCKrKEI1iXNZyHe4EpKBZCIuV3Zl//mg66pOtAn+9raZZjRhfwGZwFRIcEZNe13YX9mLyA3gizuO", + "F62dbmhtSlC6uGLTwnTMQCJrqIhQVAflqMENP+bEnN+SqIRFsAGX2DWGKc0TPbjh1ygBlWD6+oZ/+Upe", + "l40rl3DDv9z0Lt9dnt70TAvHrTdanFwMb3p9Yt59g8HAtITPEJl/50Z4Vg75k2XR+nD8x+nbt6aPw3/T", + "x5DHFTnQc6KWSkP6kyqWbrlmK8aoV9zlgSDEcaXixliKT4I7ynQBDAX+lS8Te4WCzOkCyDzns0GAmvmN", + "337NbjslkdlenCeWSd1DmeYk8tVwPu1IjOLWoLQR1HRo5a8eIw/NPtE4bqcgNp1iKbKWvSycBZR1boWf", + "wvq8LP+k5lRCwOoXZXn1iyXdxQfQn9a+Vx8MGfBYfbKK3hBH3wbAzQ5/aOd5x80vPR8wOt1aa8tX6w6f", + "FFAZzVv2q+kZdigTPJ/Lh327ae3jum0fLekn89BteTYzFvuha+1Ff39oqDzi1x/l4be3R6UskrCNYo/X", + "8wZMJozftjzElEaGphSP5432KaSfEpYy7ZO/lMhlZAm6lpRxrXwiuBlCgjLCTHD37r37KQ2ZIV0D9Sho", + "PwaJOm07h/dos0IX1cI0J5T+xLjS1L51W/SUbMESmEEcdjagUodtXa1tgR6T2oZFMOeGm3snNeK2ZHr5", + "SWQtKQa+Iz+JDLh/q+Y1+2kmaQSfslKY9cnhIvukyke37yUt6QyK9e2PYmqpIn1fPHWvb88zOUTSivfz", + "tvdto/vGx+vgwvy/7zrcS/VTzORuS5AldftLOHUmuynuCG4P2A/nQRz4uveC/qgzjvAbefOCKq/UwCtx", + "K/wWb5+9JPf14VofQEH4Ni1VqBGiQeNpLNkiAJjATbdPLFv8V8AQZ86zjq81syxNvSDh9BeNgL3Jps+v", + "ji/CRC+4QS/7fQAW7lf2m19JmivzhiI5Z//JoZkCqOUJbBz4jGq4q1lLKzQ1n3B4EARc47+bYJgwqtrK", + "2ixb/LpVtDGguaVB6118QFLs8f0JI8l3hph+z0pw/olCDlxNDuZMSA/6fnhYZhV8Re71NgO++EBlWyAL", + "S/uFCXvhuZ07QLO3NThRwrgmShRWGhJRTtiMCwnkpVfr+BBgk0L6tpDrQ9J20CnQSMNvGI8Zn+28xMIs", + "e0GzCt++EgmL/HQlIOtsATtrv3JUpIaTPl+zR3xIbHtBKLs89biKC+/UDYwge8/sqN7mtFvuy/bZcVFb", + "yOY9vTfdKiKc313ZFV0mgsYhEegEHdRaC0FhJ3UqgVvDwZQGCPA2/tpmnymbSarhWvwhlC5Qur7JudZ+", + "NzjzQe1eAvYvWvuWMmN6nk8+RSL9RP/KbymVn6zP36FBC5CflIw+lb7oXlGk8LHdG4xdyI4bZkPmWy12", + "JBK45yxmiC0z0DhlvOZYG44swLald/D5VUsORWfA9UXQqY7mWlgXXf/3CY1u86zZpt9g29W2bd936Hk1", + "ZH4MmYCmdv4AdqHzLMQnRgjYiGxooMeunPEKslpGRKy2hCYruSwjF85VzW/b41wm91dVbwZK+ZCcajqh", + "qqHv9NC1Xg3obFYFbfgXlUVEg4fS2bbvMuDnwyHarLY2fK9AXlBOZ1Cokj1NkUi1uZphtYcR3FLKkjYD", + "nFY6oDo3hYzOoM0Qf9T7OEoZtRnh+vpq1ZvxSL5pgC4Ji4AH+EUiZjPGZ29hAX4lWErlLeg227yo9jAj", + "CM60MONh5ON9SbGNnvQJp+U8VS+pTeBJs5h/8u81i/NPAdn27nyllPV4VSF0n6CzT1s96rtKX39URSo0", + "jK0ysiEnqXZZ3YTjvhdnxwG9KbJVSzUDz3dsgbxwm8q0YRDi+vr0HNJWGHVd6bAuXlQxvIZpPlEDn2SD", + "C+f6tilHJFTpazq7Zr5n89vVx8KEbXgTQVdg86N5oc2Z8y623nN3VBEzKNF0NgOfz58XxCnjg8sSFv3G", + "bJok4s5Qirciosn51XEU1ZUV9XC5kzlNEuAzuJJiweKAUBpzFRUNVze0/0tyqzkMRcITM9yURVRD8EmZ", + "Cj4T8ST4vRrpsPFRpAwdZJYBYVupOyH91mylEuQHARwAv1ysE9xU6Ns/Ifi0/RdL4ojKuHImTYOqEGTG", + "oPPMDy3Dy/HJQ15sG+iLEqAVLr7uDWoX8JpgsyIO2fmDKLMjv2e+X3oLDV6T2Yhz0vRpvezL79gI1iX9", + "C64Y2xKUwtEDWGMP33ILUexSxGWsUmhYsQApWQzOd03EQCLzKuZEcJKClixSRIo7NSBD692jrDM0kALf", + "rJM/gn3fESWmyN2cakKJYnyWwCEO7GyQ5I7yms9qjSQ0ox0QRJUtnurX11dj36yNaUNF6gmd55UUxDUj", + "t7Ak/8//7/9PDAdbuTpX4rEc/FEe3/AFTZiN5V8wSkpzqIH0t24851sGPCZiasHVe4prJGwtuqOQ03dE", + "8q255Bqw83XZStMyofRMghpW3gbBRkUobuhkXVzJHL18YzwNStC5JyZXbozC371wsU8MwSDj/+9bewfe", + "DbiuV002Yh4SQeK/lYJ/H0KNeus3jMf2GJXHkoVkBVXb63441fA+wUcQ5VI5LfJmCzMqnZWOFbu16VeV", + "DpWsBmdCRlCba93Zw9eOSMoUKEK5DQwjzN4/TkUiyrlAA0RKYyCy6JUsiZn2UPBk6XcXL1Z1ubZ//5qq", + "rVw42WoRXPBD78x9Msk1UZolCUmALmq9yh43/CDnCShFarOwVXgKxushu/kz5xiy5g22C8PJSZIrDbIC", + "KqGGgiumNHCrOAeep0Y6joqfDa+LqPMOjyGBmaFr+DdykIq47CC93/t8aIY5XFDEL2XGq0xzlqM/aeWX", + "k2L8ym/DylS1n92s5QaGpaa0UTS+eYuVZ7KvGBM+d2tX2ozWrqPtboyq4jlKQuvXuXuINRBwok/lrhsM", + "Uemwlq2kjjXOl1ytYHyFEwZ/i0hMf2xLaS9ci2uxnmAu3LSQairxZnaRxLp8MD5DMQdRzUzSR/5yw1O6", + "NOSCumALN4IkFIUeklE975t/wwIKE1k8uOFudheH4gJDiuCMNJsqclCYQmnhCb6gSQ7eODYdzlyBg7W6", + "2etqjxIWG/U0LUvjTatJP9S6bEGBqzr3KCiKzCRbUMxAtvpLWp7f6/fKP6RK6AL9nfG/zchLZc7RVTl6", + "5Vfvj6NxMWnlR99vo7FbU7WdXV657eu1a6wTgMIHsZlDvFCDM5ZY2XXTHd78XKCAhcQ8M28Tw/0dB1bs", + "L3iz1L4IlzH7C59HFp1Mw9pYfcN3JqYrRjJeGxGtiBOKBF8AIoEWBuhdXgs+c1EDZWS4RYQbHlcxs3hm", + "DMiZwbbPNM0S6JsvCeP55z5GjXpmuuFGvKbkp9uf+uSn9CeDqz/NfiJqyTX9PCBvxkOD6iKfzRFV71hs", + "ePIKY++Ynt9wqxPukxxlC4LOpbO5xr3a9eKGr0BGwDWdgQ0nqiG/L14njAjXDi0LDDBMoFfgXs8hfq/f", + "4xnLzL8dkW8I8mb0N3ZE8+eHYlTzj2s3svnbPBrjKzuD+fdJMUu5zg/rxMBnM22mdqux5IfyRREnIgvY", + "sVQ+MfS7oWW/8BpwXgabWzXPlvPMHxd9flUo75BtnF8VIcDeV6hQusgjtTmU+VIbDGMOnatJv81OLmi2", + "7XAbaZnXT8XnFxiafwxbXF8xBHazb5W4vf7SmwqZUt173csZ17+88vqmZFK43HG/S5FnbTMwPVZGo6Y2", + "c7P8IWSJWBYmq3UPxLQIcWjgMrHFMaXiHVCJN/qvX3eGKknAfIGWVTHOUkOxfvYHJ5Ya/DW+Yj8QzN1G", + "Ridv312euqSjKHIp+9yPy3MgLu6GCD4gJ3OIbiG+4VzEcIjxuYxjRFuu4TjLkmWh2SscR3Dj7hSIzLlC", + "9QwleFt8dsPd3JkUcR6BImNNda7OKEtQ8z5NxJ1Zk0TGgbqYz0whN5tSlhxioPLtDf9PTiXlmnFAUXFA", + "LoUmlGQJjdACSaYs0SBfF1t2eiCmiKPnh2rJI7O1BaOkpn3sEyWM2CmXBBI2w1QlqA6ZU8edjajq9qFA", + "D274//jiLmBweXxx+tU+EhF6bI4BI4ErkeDDU1TenmbphtVSc5SDlnHukmqYLX1Xbr8QBQlEWjmF4VVx", + "NOV33EsRvmY5sA3yNPL5CiIG5BTFaEMa8XoxhvemJ0XO40MpJozf9LDnhEa3h2bjVDv2/s8PBKwxn9xJ", + "pjXwVZxomYABb9iy8VIsXY3d6/cSoEofTnK13OTClVQ+a+GJdKYcFKzucQUf5kbVgBxXQR9DLU2///Xv", + "m94sy296H284Cj/4YkoMgApuu5K7ubneejpFdEYc4MwudM4cFI40uOEXeaJZlgAxC0Yx5vhy+FP8mhSz", + "9W96fJHCTe8jcRRMkYkw0G1vwAazcnHD3b4Qt/jSgidT5T7bgNIauSyoXr8IcCyJUIiGWp+Op8YCNp3y", + "HIaeIWcbMnXrN63ETPmTUBYssZ3ZaT2llhm9HKvS8+OWJV+AnIW95yaS8mje2l1mLu54wDyXc30VjBgU", + "mVbBq6Q84P2xdgzlmmvTbT0D0yycFHXf3XBAUAhoXP1CbLutVhbgRvRtsx5sXRXAGNf/9as/s8cyAzX4", + "XdJsbmX7odcKXvy6b6oecXeYwAIS4q6izDXTN1x8wWLLEG5heYQPNpJRJivvVMbtXpjgmGsHl3pYPEr7", + "yPZXQofLcIAzHdq2N5xxw55sUzUvUhSVWTkqM9CEZLk0FMzmwsNljNx1vEYVri9th9+GV82iVGzeLmkQ", + "HnTbA8He2HlKZ3DOzQl4QPnclyZoWDxMXDbpQxfMgDkIzodmkZRbJ4XKwZep2zG1nLdvzGagNIloEuUJ", + "8vapFKmZ6objcD8pJzs52CQHzv6I+WGc+s+OomxGpyVIZe9msrzhpfPEC1zYpRGaXA4HAwx2+phNp6ZX", + "MTf5vyPIxNCO+n/JBBJx5wyfN3wujEBVmdL6ZqSUsyn+hMNLmIJEm165Aq8l7wOTOqfJmP3lAYDKxzLN", + "gdA0qSlo7PSrfDk0SYpTwIw5N9zx1JiI6Y5EVCI1QlJMnAEaU1BZ68UtZLoUsu6ojIkVtNiEJUwvbZ4q", + "u9CNhFQVmkFlNGcaIp1Lnw2y8rV8ClMZ3xlh5eTqPal2X6XisCeA0r7g3lOmuZ4LX95B/L3M61LBN9vD", + "BUrQMr0hxNYWHonUHJVLLOFgFRXGtbbFQ+Li+Pzy+vj88nREDlbJvsrUO6usWN7Vm8nAl43vxH5A9OIu", + "kQhNSGqwa+YOKKIc86mB3li5MKQtzcQqdV8YTps5HG5kpKwmcdiau9regCUla2leiitAnNai8JNYrdfB", + "9EqpiEnval5Ttk/cr8K7MwGgkr49XvzWDC8CZ+nCG1auMy1zAQazAJ7Ux14HDbsjN04lYWOFwNoLMFRj", + "4wbQ98wBUIkJqGCuwQ9qTCUsmMgVWYBE8dqMa+GcTHKWxPbJF1cP2qYUk2AbEDQw9m845iYtc38xTmys", + "E0EFMF+mQsLjXV/pw+PL3Omeo23c90pAtCKDXdUNH52dkF9++eW/MSfVoUtKRQ5QLBudnZhPl5SLF0Gx", + "Bl+IdEFZgnyVTUkmQSFxqOTfc6dZnIfQc5B3TPlR3upUPtj78yURrXwuzsDdduWyN9DXXu7DYq9v+bOV", + "YNoi6ZBXpt1Es0oLYgWC6n3Qici1R2wrz8CCeR3NflIIPIXUY7iBNaAMbBDdysu02VbWvFM9FqMiZ+Oa", + "IFHxq0EUDMKcbeM0SjGFVHArIxs8zajUayNrBcl0YLW9Hj+gcQFE70oL0thakCpjKISfMvtsgN8LFQTb", + "dyoMss0nv+F2dnIAyO1pkiyRjrh0yC8Gflcq6eXjV/j7JhPM3O8PhSfWD62gFkYkwOdLinatVeZO3OSR", + "G8zecrIckOtyUBzDjsima2vI8iQpxPjiTUAkzJjS0o+ociVr+zxvyo/2FZG4JInh14R9B9hVr0iik9HW", + "5fTa7ZZCu13/gJQqs1WviPIbjg0LyEd9bPXtA2q1FCO55irHtWzS6PrRATP02J3gDbdHWJ4dSpee41Zz", + "Z3qttKz4aAK3j6BiB+bXGXAD5ObhjLxVbb7D2mmDzRVee9WgI/elfnl2/WgAOEJtZI3q2K9Ie/CS3Hm7", + "15ShQ+Vhlxdk++BYRuINXJAlTzgGLsUixw0vYZkLO4bn+YY2cHuwEVVQg5wbftPLufXKv+mtt2RWCrcO", + "YBOogtlkicd/Pmx53kLos3FbtjayvTY5gf2w0hn7eVnBmWzraopWZGT45iTnQ5tLU3kftPd7yZLqQ3al", + "xdymo8Jk4T6S+8F+KBaz8bh0HcmBE6OSJTkeXaDr0otBG23LqLyq9eAQs7GWmVic70CDyXNVmsO2JjEM", + "u1nvW/TDQGcCgWwxNcvotgoguP6dhRzCq9+yBv9c53zBdpyVgbdr/xU8WI2U3YfyVswY356Ycu+bqxoS", + "Kj1/fvU/a13/Z+Nd7LAw4IYKv+wRKGh43d+lfI2dvd/gikbIiEF+31v6b6+sZVfmvNErvX/7uT7xz/vc", + "cX2C4PmM81hsPZuHgsPdwPdegXx1doyeBkHzjg6ELq7NZpvtmqoK5tuh4j6UoshAMAKVCa58yYLsa9Im", + "DdM2v43zvzPPpH82Y3LeVAeBGIT4WO82+IQqO4IK9H74uo7ijgeCkp5ADbS+BbM/qPLbBvHrOJ/6q+Vt", + "ucI4RhXhGZr2Vegmg4emQ4wRjXLtllLU810LUY30HgePgx1HOnDytdR/DUc7KfuU2ecCUeMYASzZbAYS", + "4pZ5W9Zz+FXjqRcgWSAEVc+l0Dq4Ii1pdMv47AID/+6R8mXzdDfJ5hb39haSrO/gN+Yq6siEzjIKpoVY", + "h8/touJm+pFNhwj8es+MBWOMqlzPc7KZk8MmLWgaLuarBL3hdbg7Hbf/qzSfJ1tSNAZA8p45lsJZVDY2", + "d8Yk3NHElpOF2Jd5YSfXuDy+Ho8qjpGelOPVpWwvRvjtaunSh6ilO2lWSzfemkkj5mq6o9huoDxgvxeL", + "S6HHSx5dijiUxmcrrLFMUh7Io1cESl/CJE9oUSFwe+YsPWdqWCsZudkk59y5uz9onuSvzXChhIsNbLgN", + "RKTuw8mrmHobEv19eYE2BYxgSHvjQPZtQcD3CFS+QQf+mx4Rkti/XxtAvek9ZtBx+JaHa+mM1ssAY0ik", + "2e5VyI1M3bLsSuYc0CMogE5lo0rO1Oas5rSeMcmTc+QcK+hIuH473gOfp1KkwSQBfoFLaDZdohIl5HW3", + "9cYClClX4R3k+1xvJWvT46ffiCLI9HGSFJfh4VrVTG4tsnVg2zHWlTjlM8bDyeHmLhovFCiPTbDAb6hF", + "RKNQAH5Es+2jO55VCeVDlUA4A05UyWJRdPkXZTpQVrjeoVnKnJF12pcq5A8cAWa8qOQNGAE3Eo5/1YXZ", + "58IGQxzner6WsaDSeGeunQIVqjElOzRILhFH1CARBzbca4qCTRRZFWyx04DPsOGybXJHXVU6mP4GHtX8", + "Yng5DiXHSqbXb8fBxBDuewgqV58NRioXEt+u7IEd4gNNWPye61D6IZXAtswW0ZbMFkE5Aj/tvXCdqMX2", + "RWuZKw2xuZPW6RpzBWdC3lEZQ3wmZJBwN8/NUctSuiqZWqJKFaY/biX7p1IKOQKVJ96wsFBaK+v1F8gu", + "VWj4mvOfjVyFm6/cGcbJhHR2lMchtn3H4hnoexfAtis1XAjjsT3561pEgkihRSSScKmT/QV35eq23rMg", + "yANlUPckXNw4JjtX20eLHdPmSGhzg7V+za8sl0mrLddyJm5W3QhIfChyhKrjxOupSWuVamSTpMos3kIO", + "KmrjVcz4z/1X/Z9f9n/+uf/qZf/Vz/1fXvZ/+bn/68v+zy/N/37+uGEJL2PFnSsxbvjqdHTx6Xh4cX7Z", + "e91zzk4iU6+JS5zeJ2qe61jc8T7JMciqT7RZD6dJr1/p/ml0ejxEd3W4I4mYqeLrybvLs/Pf34+Or8/f", + "4SSgjzKqo7lzOe0Twzh9jWtDRkU+RttudDo8vbw+P347rreSgAEHNFHkAPiCLKhUfVKI86pP7I2oF8VI", + "b9/9jns/5kuz7BnEhzbSQ/bJxdkxKW+p2v7Tv06P/xnoxAX2s2VdXKfR6fjd+9HJ6RhLRHP0bCn0aGZN", + "llz1iask0CdOfdgnmNB3fZT1g2k6UL94IRcjvh+fjsalE6vploD5L8TMVrpVffIKD0GBrnWqLQGL6CdM", + "6aMYNGUJph5xwFZ5PmNygip8tIe3wHT9xju4z5HtdXN14A0Bf3vgbQCvO6Hzoz9jyhpOV7HcAwM1UPJD", + "6gYWhLHdSzRCSF9D4U38/LiioHURv07zH6mEWZgFbfTdTD5fygfXyNRbyrVv3wSfVG/fjDWLbpdbUrSj", + "HqBUApi35fW6ZFHLF18zGbY1zHkNjr688nHKtmWtz/X8dJuOCLXWx1fnx5NcwZYmJyJNBX8jdCjxqJBK", + "SFZXHDW3Yhfpz4HGIP8wD4+d6c/fwoxGS3MPtpfa2jqwfax6Wel/j/S7LIYzKdIhVfOJoDIOaw78lvoo", + "cDQp/fyG8viO1RSVFfVJuFhj0Ia/AHknmUZVlt19IHRaz68k+K3lhfRnBceghr/aaOREwvejcxWsJtfY", + "1K9uWfZ+9PYE/+1vkVKpx3MGSdzQsLjq4CrjmFEyIabblX5m1dmV77Sq1uUtFl9nl74CecF4riFQnm5V", + "bK5FcejCyrLFAAPxHyG4zBX88eokqAJY61f/uOtE7spyGnxiHsstq2r4iz67Yw4/Gxo9hVdlk1tQ7W2P", + "7RZ8sFK15Ckmawja4DdtGLkWYy2yMu5OhatzhKzj7tuZCCLPluo+W4wVEjKhmBaBtPwStBE5Bd9SISuo", + "c/ADZmXGMHBuUqBNR89t/Dyln39PxIQmY5bmiaYcRB4wxWcg3yuQb5Ya1kuQbbZyPnm7Gzae95ql8CaP", + "67e6Kh6X4e7HyA543YJSS3NVlOjFHCeqnavKmNNsdHw+DPp7mNfAO34Wol9x2+wNG+vYx/cDQ6Wch1ML", + "VXck88nJFkRTSx6Fv285xB2E1J1xW6q0djctKNN1vebFmvOsZCmVyxORBNyhbHjplibhid8rX1bd7e6d", + "YcNCQpVet8TWvxbm85M55bPgDAnjt+1LOaz5Qm/7fvo529okuLK2oRCux0dfcuGi9PXYAJE9+DdAJcjj", + "3MrN5hx7cyvrFqjlUhywv6yktAKxjJl9f/2KJYGmwtW81RS1mRtZWEan42uMnZ4KSWyJOnKSiDwmtrgL", + "SVfFl4wQp9GJ2DUc2ybHV+e9fm9RBGb2Xg5e/TJ4eZhzpQ2FePnyt6IoDs1Y73Xvl8HLwUuXtAZ3e/QJ", + "lUevv/QcRV0PNdO55C5Hmp0yETMMpCVU2exsjBMNnzWxtfbccl3GUsHP497r3u9gYFIhN7O+0zjlq5cv", + "izMqXAnhsz7CMZEIIGrXUudMGKdy6fGj3jjed/80W//15c8Np2hW9KlqR/JM+p5TBxsQ2+l/+ZbTnwk5", + "YXEMyAd+a3y6DzL3uasIXYAmNq8hGYbUVdHr3x+/fuz3VJ4a2orh73c8ETSugBo6HmEU5L97NnS799GM", + "eUQzdvQphdRJYluh1zYjOWbwcEpOl2XIrRkDI22w+CTHxDU+GD7O2IWdcScg0wzdGU3voz+VaH3g1TCD", + "FsB932kfBMS/wSJqgP7ry9++/QouQM9FjDkqj5NE3JnDaAPrv4NegZ8DUGdS3gLxtCzc5gDeB6Ouuptl", + "h6D0GxEH09CvmjDYqOx2Lxhvkao2DN8vv/3FvqExqaR5fQrg/d/ffgVGEE7YmpS0E6jfYiy6LNIJrQoB", + "ElrAZAHaF84O9NH5bG4C85VQHTR30PzMoLlOqY++mCfDVyuaJGA1tHUwH+LvJaBfFuGfkqZgTUD/3kix", + "ZloS97jBFwomoSzfJ6XmqHgNWThdHeq68Pzxftj1qkOvp4Nev377FRgh6Azd1tqKQCuvBCGdswGhG5hG", + "JktSquk32cdOUajDqQ6nOpxqhVNZ7pPI8g6nOpzqcGovnCoFw4wdYkIBVZcK11VXqVjY2oxl2drK8CER", + "MmPXdugNRHmQk7ZedjRjAzely1FRgtbmmeN3mwZYC3d0Gzj/9ano054CanY6vWdGH4aOHqxVmHYUoILv", + "FWHVr6imSVJmDoZ4NZwiB3dMz4uscTTSOWYJNag1p2oO6MPqFYBrFKFTWT8J8G6thDBwsQKGMHBl3iDr", + "312MoiKUcLirMBSsjoO2vTK9esUhCM0hsmIBlPTOdTxQc3HHbfZNwSPYBL9Ce/fNOJJ1WW/MkYoijmTl", + "9N7xpI4nPWHVpc+i+w0W8AB2XYua69QnRMY2BeWKFtW9S9dABWVzW8i8KC1XTvOTIpXW/SqB65PzK1J6", + "k6JsX0s0QwrHYuvm4X0MF/StyXt4JQs/2nv4gYmqPdkGRPXM1sTTwj2UOnLakdMfSMS3eNBIxC/IVyVl", + "mV8ss1TRCGW2aVHQEvOHc6YZTdhfLjPPygkYM2oDxBAPyKioKJhJSFmekoRFmGDbFgzgh6t6I6mIsSKF", + "V0h745b6ONQknHzNhymVkyhCER6alHRKvEfzMHuG8sjED3IFbhe4sYHYh6vyTdvf9CSlGVZzSxLvZJUa", + "ac7vrQhmvYWlzWfvuhn5YBB46Lt1nhShsU+D2T7Dd7b3iloAREVY3QEXCkmid8IASDS6/CaS6JsVQD2k", + "KNqB3LOzbOyAw02LRhj+67FRW6zybojRqv1T4OjPl1aVB49FuZ1Oj0mSiOh206m0yQU6InakOM3UXOx0", + "Od24UUOExmXn5tSIHBT1vFx59Yro++KJkKofANq+P5l6vtJjiX0lcmABxQ1kXJKDCo4a7HuxLxZquicG", + "YscO+zrs+2Gwz4gsFRQzqMGUZpEiB4r9BX0bmxaJnOs+AR0NGiHdEcQ2QHmrK7rrfmrafn9didVJxaEH", + "bKczeYI6kzaQbsCsZtLYV1PRxgndDfI835Ada/hbswbrM7euTy9eskVZTlV5lTRFnSMJWF64KYcw6DNy", + "Xb4PFu3HmnYiidsUcRPYx2Zxoudxn9g0OrYmaFkh3ZafBGKjzjvW1Pnk/nCUx6IFFhh3dZoLKlRgRxty", + "01Ltsq+ypWPbHfI8EX3KSpcyFZLQwiExcljUBnlynghbB6kpq35ve3SI0yHOc0IcC7Z+zaO0srDSNMES", + "8LfNlI8FDn0p8PHr0VQkRZrTdpzozHX85mjV3yiR7lZEzof+KSo8+h7TDDFLqTl+MzrKxq4Gf2V8nP0/", + "OaDRy03vFtMRio5QPB6HdXhcs1XsI5vWSIMsXRya65VW9AF7PynyQLQg02JdD0UoOuztsPce2GvxhBxY", + "HHtRFY4LcFx7csqqY8U+iK3yiSUXh07xdajYX9BeBBgX47gH8tiM8reRB8rdd/JAR1Geng3VqqwMYqMV", + "tXx5l1DrAJY2ExMiyg8V8PiwzE271f3xbg56DrLq4zinimBnYsZhfEYimtEJS5iBz0pgbMAL8oTyMfAY", + "66M+GQ/YJ5SacOX/PIfolrDp2mkzRYrE0ltSEDZ0ezb3Os2TpO7AWhhjDhRwxTRbAJnayKGUqluIEQYx", + "cqEs3mPLDoXimx/G35kmybspok3Le+9v1Ah2ub23jTNjep5PPkUi/UT/ym8plZ8izOp7aM/qk5LRp7Ls", + "tLX+b9Dlj089xPqZ5uT0gWsFHRz0f7RlTqL5JgJcgZwKmSqChZBICbSKHNA47hvhLKFRpbZWKhbwKc/c", + "H7G44y+I4ATrqBJXTWkjcMfMXQf/xw8DxBpLW2IA8buL/1vtu4sE7CIBfyCXecQ8h9tNiETu5ZFIAiyT", + "NFxOQoBNOq5Y4YaOXVIJJJOAvWL7/Cv9hOwYLwIRy49KMvZhbZuwkVfSoNiDcFzvyZKSDo2fEs9/xiYd", + "yzybCiF1mfwotjnFQoKJ+RkUGV6ODyUk6DtaVFF2LjqGemRC6j6Z0iSZ0Oi2T7COX8KUVtarJ8qVNtSG", + "a8l2SibDb5GK7HJsJ9simgwvx+sBdl3Cgk5M+RvUGXAUZQMBdpCTVRKUo0kjd4pa5cU3zp/ikRB/NdFg", + "iIWCcT4HsP8Yv7v0kgBsacnZUc7xvySjy0TQ+Okifxfivx8jRYggQpLipimpQairMF3Hgkrp0BAybGi/", + "AkqpVZcuIv+HAKjfweZejHIpgWtyCZM8odtoajNo4hDpdsT1xHVqSl4/Hy5pmngdvcPVs9z2/vfxxdtH", + "jizqIPt7Z0Ox8ET0nCnCRYyJeqtxR3XC+eHqknDQd0Letod3TLzSEtxtn0cMaqjvr0wM6WQDcmBZxSVN", + "oU+Yestmcz0XuYI+mbvyzn3CshHlM8yD2T0juoRFj5mw6OHQMYYsEcvUbGt3upokIav2JIYp5iirpS+q", + "jX5YGZ388wM5uJKCTIHqXMIWa95qgGFldZ2e73knL46SXGmQJK7daQGt1V/DaYxX+fIMFnhhkTj/mnsA", + "oo8FrUPiwz9qMykGq1n8z1fPfjtu8+SVVs+m2lmNx2ziaxBdd7KWoznQxFZT3sphYlAGkMlCDYoM9xLw", + "sAiayxD2s9qiSJbk6oabE4rzBCT5T04l5Zpx69MEdWQfkBHQ+FDwZPmaKDpFSTeiSXLDrQMlX6IA3Cdc", + "aPJnruyTbzV8goWgBy251x92/x0PK9Hit+/Bw4z4xSIg7zldUJbQSQItMcQhhYVn6y5Xk4rUPZDEl6Mh", + "UBKmigAPIXuVTvohAG6SDaLCn37ErIJPgpc8v5IobRhJv2G+TL/kd5/nRQffHXzvkzhzE7g9+TI3HjdN", + "KxjsA+eli89ThPPv8WwqkmTV6E/3Znrab6bnVxfgYR9MZSKDiRS3EK4gsF0iLJ8tP6nauwg0UcK0uOEc", + "PmsiIRI8wqx5yygBQrWGNNPoG4MPL8I0oTPK1ojPoK3uxKZasHvquG3noN/emeUkASpr4F6D7dYoZ96D", + "qo0xf+i6dDbP521QQcW0zyHERsFVDf25AkkO3FufTQmNU8ZfbLG19FsYN6vw9G1cpayar5mv1LoptLP9", + "/40MixYf0OV35gpIYv7ECKRmU7M1UHtYHBHej76w+OtRZrhye+J7Hl+ZjjslCFy+kRGOQmHeLH6e4kNn", + "yu+iv/fH+SusV+7Hdi1IhMHBEmg0t7HXy/ZYztsJVbwTqO5jW7cBGfX7HF6OKyEaDyKq8MctEFef7HJ8", + "yrVchmI5zNaWCK1V77BOp/NESfXzNIL7MWovcnj05RaWzTKwryPdP2G5U9YpMeIWG3tEHfuhK+f1Q8cm", + "l1a3AOSSSQEhYYbQgml3kNlB5j6F5u4Bnc54ttvo9V2h87uLSIXVq8qzOgGpe8s+aCXsQHzI/nISxEwf", + "uri8ViEipzHTwyKe71spUs2kzdSoZl+dCvVHVaFimaaqwcCrWKlkCWuLFlMhIziUMBUyDduC/zgmgifL", + "AXmTp5nNLCOyw0TMCGQimvdJLEWmSCIimpB/gB5rCTS1XrIuyYPrhWn5UsrpDKRC/a8EpanUilweX4/7", + "JAG6MHi/Chi7k0zTSQKEcWKWabeemk9KFBmvrDdiRDmZAAEuRZJAPCBDAQr9bbXII6xcSk6Osfa16hcl", + "8YUszjGmmjYzPJ+ZYxvZU+uYXReD9QBpeCPYdLW1xTIPDZgRKg0/tXjhEKg1ts9AH3L4rA9Z1kaH+jvo", + "S/isz7NOk/qDBJqjb07pqU7OrwiNYwlKFUFOdT5zcj4cEUn5rH1Og0TMWunr35r2HZg9fzBzQf4fri4x", + "45Thr4m923YAxKlWh67OeCjKZwhRQiUWF85EImZLciBFAn3yxzEKCi/6JGELQBHD5b86ihIGXB+V0srR", + "Pz8UAovLnIAB2yI3goURVG65uOOl7NIoTueSajUuSqR3IN1W4agpSyDGWzuqS5W5daWJYZLPZtZg3xKq", + "RAz7+EKiRNrEC9KJtqAVYVrd8CkmQzY7uHUeksTrIMkUmUqAlX/knZC3RHDC9A3f21Hy0my3hYukaV/k", + "JnjReUl2XpIbXpIGEe7jH9nWP8e55XREtOV1FdnYDcFB9mf5XpXHMUWoYY+tiWiWTxIWHe7h6nqFPZ+a", + "w+uTCF59xj6vFh4I4ys1DZ2I3HqScMEPURMEsd85tjX4IXttA3Uj7NARkbZEBM/NUpCVUH+/5GRO69fy", + "9rBLd3973J85ufUbLJ5lRlQ1k7uXUeu71DnnkLSi/9euS3eXe3vm0QgrnNRJqS7PdecVSrurbTcmyyQw", + "FZuXb/OrJgxKe/Lo3aVNT/mq11Vh77zl2nrLIaAL6ZwwiQEn8qeY1PlOFdIRXHe7nXZA3QH1swPqKtX2", + "ZnMJ+XtKwZsE5pcLedSw/PZY1iFZ50a0l0Ng31Ve6FvzfuG66sU3T16NkpfsEI863Opwq8OtPXFrm79t", + "h1sdbnW4tS9uFeJiTNV8IqiMd+fHLFq66nNVHe4d03Mzs6aMg6zaX8enow/HV1ehQpKWTw7LRTy5QqpM", + "Q6paFIMqdoLFKHuruqlUSrp8loVUu7JHe5ZyXSEMAtOWgkcxU7e7lKNDbNMVXn/mBjDM2OqusoCHsRaS", + "zmAdII4sfQ37nJzhd+s2rTKI2JRBjKNbgmx+n7EFcDJlCdhK2s4/eoAsmElQJKNK3QkZW87hKPqAWFca", + "RTIpZuj2J3Kd5TroTILwaVf0SFEQyh7TwE5i5gsFPtgW9iTcSvYIfNDwWR9lCWW8ZfEae3QQEzOCOzfi", + "ipzjxfz73dXp6Pj6/N0lGb8/OTk9HZ4OP/oFstAivk36vUedfTeredTpd9CUR537YfzBDYxTC+VCkoxK", + "zdYsrR7KwsM+kmXpcIpRVIkQt3lWJqSylOT96K1zXFvV2ZegRLKAmJxfLX4t3IRDoh7qLre+2MwU6NWO", + "oxZPtv/kgDFd7s2Wy+SbepU9vGS5vsJWkmFX6TaAPlWLtgEfhGRMlW5At4Ialh3WMeMQk88E8eMDSMNi", + "DdBTjQMzRSIhJUQ6WZYvL4g3cSaMDeh+1RAlbG4ct6Mnghidu2VXQXrDm9BT77gRCoroFuSh8zrZGYQ7", + "xOaursIjCZ12SYPaVLUchttKPTxAAsP7C6HlIqwg+hTEzE7O2yMlkAXB0iXrANel4DBht/DCvitcITbV", + "JwuR5CkUJdMLxVytQAgOV0E+WKwVYvMxrNOFqzOylV2N0ZcMA/UZJ6Ozk19++eW/3cuTHLx6+fK/Dl/+", + "fPjy1fXPv71++evrl7/9nxcBbjaVIu1tY1/99blPefwgM2vRbt4LxlmapyQRM5LAAhJygLEnfVSU9onK", + "owiU6pM7Kjnj5vc0E1JTrvsEDFyEVpKI2VszYG09MUypAbrXPTN8r797gWd5khzii1QBldGcaMDQZN+U", + "tkW7AzhjiQZJqHk+mIc5cXKsf4biny0muKIzxl2RzFwqIckBwixhcejoMorxiI/4LOiMMJ1Sj1jSaWnw", + "FNEAc1zymGQlzFZI7wVoyaJq4MuULlhU87ZcOyrQ0RxskGFE8U/zvHDdNp8bffc+N8tgGnGSE5ZabPDR", + "9TO3gN3vkEPgkYghJoppIO5hMjXrqy4nhPWtniYbFKCQq2iW2ewO04TOgiRMLmiWPSD2i0iDPsQAvbQO", + "jIWitjdhnNrMM7vEsyavnvCE3+H188iL2ecV9MhLeqAo5yqS7nwB2WQr1sv+0Np5w/r/a8lmNkkKSSnP", + "aeIUBDhTGblvB3NGYxVS32N6CbtRm2KpC7nqjKD3NILalCUrmNyAxCAazEAfTmh0m2c73RIM37NNSSRU", + "KtShexhZIXTKkhDP+x30GzvHPUH9kch/B9yd2q0No3FY4CA+6GwwkyLPmhVcd6m9pUiA2G42awY5H5Kb", + "/OXLX+B/kV9C1Q5/t/N0bOR5l06fFddYAJT7oWmh9A0YcqoqmtqwwgxkypTCSv6NSqNX4OpxKvrZ9eM0", + "W3S8+H2lXI0xFYnqEp0++ep+XSzSfunoEXl9dKDOWLC2zrY60jbyyJCHDdIwIGcGiQibYtkrRagEojRL", + "EkKVYjOO+ZsI04OmJaUtsTiPdyk2LDbfr1AP4xpmILtKPR3SP8FyQc+I7JR1BIIkp0UZY+zzk7ICh5Bt", + "5I1cf18K8jjijT2kXeLNGYMkxhqs+Uod1Ak2HY3raNyD0LiycvNOsQrNNpWI7u2vdpJJWDCRq2RJ8iwR", + "NIbYWn4qsUC+5/q5adMkoA4bopbB0tQDxqMkR+dm+KyBG9L64rvkAnwUA813NEC0IjOdsehHMBZRvoa1", + "27Tk2GCXx865bbQrmydKRzYHoHM0skTDPLe4ysKOHKxCN56G16mZSw1w3+du6V0004NDqzvalWPaOpMJ", + "OppZsD3K8iRpBLtXpuE94Dez/b8l8N7fa9Msuuax2flMtigxaw5vDTAxIzMlEmZM1asDbQPQQzY9xOfi", + "zlS0K1g9n164Hh3QdkB7L6AVPFkSNiVME2ar1NBEAo2XRsxXwLUtqJNsB2e+YNvcSH535dULi41DEWvX", + "uIUlmmlEZt0ckyVRwGPrUIYD29gzF0OKCVcJpJQlIfvNuV3OIxWqUyAHdoYdxbEuWXRbGqGwfArC+ZNV", + "c3QqhieiYuh8Fe5J6EaGcsUF9UgYv61QL7T7VIjXn2Ky64XzD9OkS4ywl3W/KE8Rkz/tKQbSxJivRyuL", + "3tawLHMfVoW/TxbNSAo++IeY1Mh3d7vPF91La86fYrKqi4L5ikIJwn3A5wjATsj7HXQHdj8Uy33OPnnO", + "LQiFzETMlHnu0SJZS2RQYgfYy5w3AvtRzjuw76ht7wIDAZIl0TY4wNFdLYjM+W5Y47sVHQ7a+ANU2/k7", + "Sl2uTG+yJO64m0heSousERkYm4YdHejogAEEQqswFgaxhCl9GDO5A/EN+A6Z3B38jTmHnHHYxSm/toqq", + "UJyuS+3VLh54yCREWsglyaieV6Y6CocD6/nTDwfuJL5nHQzsSjRrDAlGcS8uAHVrZi7EwtSFBu/GxCKI", + "uIPYHyAj5Cpa0wIAlp/HR4OeA5MkoZN6zZ7NEPJEzBgPK/nNAoBrcyao6M8VSBeJUVWEF4r8PsG6pP/4", + "1zWJhLhlQAQvUliEFPtvcQWPqNfHCXao9bENiSTEZrf0KUdkdAmvnkUiufcGUxIH2wX+mWOsI5/IddA7", + "7y2+/HPHG+wDwGLgZEmiBKjNF7FCUVtX2uBdKI/iWzvjU4HlJxSdvHFx9pwCN5dSeQu6WTikbWtrLiuR", + "ywiqNLqyZdUnWZK7xLxzcRdR5RwQihDlRORxqD74hVtSx9mft+7P3D5mKqmATWKjEmqsHD9XQRIaBb1n", + "UqATbjUPv3MmWekYKjQFYiQ5IaCDp5d7f/c4BsWfZVL9ju0+AILVOGmRBi1A5kHOdlsuL7DV42Yvxzm2", + "BN7g93tkLe/ylXWMaZt9AMErzRPNsgQqhQEUyZWRQrGBPBtv1VU0U1OsVBTbKzSJNKWHCkwjw6USrIA4", + "rT2FMR+4lgyCCcHTcrJOvfdA9goMSJjNJMzwXtwJr1cz2VRFpFO6LQB8BKlYuAx2r86O0cXQJsdaFbFA", + "kn5A45RxUoLWljjviyl9TM2DkTNenR1jlfMttLv0KXRyGO7CprIHjXu1qfE6hcTTdTF8zl51JYw5Bd+m", + "PNT3vyvWXYCv311flXi5obRYr/+QSbFgigm0NIWT3Rc42oH6M5e8LawgoDj67QM0vx76A02YC9K3UKbF", + "LXA/nGlBzF7RfQwllsMpjbSB7pqmLKSP/jY8ARPeb+EJq012hP8HxAasCbJEPCguOfQEZTODNodzhxfb", + "X6K28R9C6cctbOBWdS3MVBci9sKJOUqk+uaPMcmE1Bu+m112iO6t+tBvVQub5ASV5pX6oloQg0VFvQPM", + "Bb0tAioVOW+Ac9jqkbU/Zo5t2h/zvdP+dBj1SBiF4EUrap/tah7TfKeWxzbqVCs/gB8KXjjEVbXgVgBx", + "BPjoi/vjfLiW+i+grrm0zS+LXjsjpR2hD6XX4pWBnmHpsw5u7xla5IKmC3lgsrSQEhQIikJJO0jbZdGs", + "A5QfhMDVAcVbD6u/XUqswcSjPcswrzC4ua5c9TifxtlB/ANUmuseZB0atckHXEel7dT2rggv2IFady3j", + "Cx4ynOCKouYxrkUV7BtIsFkdTSSxOS2aYnoXi9+honfY9tuWN+4CF/7OgQs1xC7Bb5vcf3fOlaY2g5df", + "0/8H5XECymnulYasKADDbFfLsFbZI2Oq6YQqIAp0nvWdsrGmZ7T1LK1ZGE0EBd8L2QAuVwt9HH6dUsYH", + "q1lCbunn1S3jWTgr+hPl0l1JmKfvmH4lRQRKIc6ydfjaWl6JC82mha/yrjdQre0O3uwp0VmdizBbGt3x", + "wurIexeA7TjfM/firIFBaQj2Oi4XAF2HyQBcH0mgcRvgHgGN9/VVW4NyFUrdF6vnJ9Z1L7ZOtLxPQgp5", + "u4bjVBFpcW0XQosMOIub1SpzciLE5F0G/HxITgTnEGkSJcw87GqCZCis6p2d8MmFQjBUxTe6Vrv7E9x0", + "bxUaQaWky2cZK/EM06o5CLSQVxXFHEA3LZ7WAJJDL58KJD+CA5QH0jxQVD2FR3YY+R7RR2v7b4VZXdWS", + "rhzbvuXYeJ2++MhLnYHurMlWuOSvht5Gckr7WsC6a0nP7pJJdfpwv9JJT8+o22HXE5Cb97EmN0Cv/q4q", + "PIrxWQJ78e+qIPpMcei5MeMOVZ8ZqrpSOXXgX/f6qMrauRdbMSa/Xi5wL4k7fxoY+73kfFvLLCadvN/J", + "+x2Ze0AyVxQJbCHwFwm8DjHmNGydHdsiHt7KHUSLVfgqm7ofmaro2EJahys3HEYjPmb0VW2iNqU+7Gam", + "G0VLuuisLmHJvcyxDgg3cCocEZbVky2vqQjmEN1iKXRK3o/eGvSTQKM5ZgmsRuBSwgU//O3zZ1KAa+BJ", + "cdWgJNX70dtD4JGIISaKacCptSCZ7euzaf2nlaDS3yREcsEilylJxECmCQ1NpUAuaJb1uvd/h7bfqioX", + "ZuZzUe1BhwoZJYKD4bmaSr3D6DzCxiPXtnNfaJnlwJwaGllGJ+YciYRUaCDO55OkRThS2HvNFjgDGZaO", + "TlzYubIyUK0imk2TQzfLpB1UKhq9CAlIo2LuR5SNijl2iEWj6gaKQhUrd7zilFx8fyccdVT2PsKRAyZr", + "1/QnJ1nhp4KmqbBR/u9yYf8o+WswCNHlmcLX2gLTqO9MObXJedeycNhqKAoL7tMIpnlSeCPLkhEH4Osh", + "2HRnVfohvYP3EV0wKTCCXgWirWZlE6APXcsGcO16FLnHMEFCSqM544BeuJUk83dz4GVpEMYVi4HQVX6F", + "F9txYVwsvsOILmvZ/al+iRRViN362BK5BtXWKTCT4vOSuL4B+C4+Pl/nvyuzS9zHiaUonQPgd3EAXIO2", + "ApbdD03d/yqjNHP6q0DwYxkDNyHM87L0rvj5GwA9e++MgJ3T3zdx+lsnCD6qUueQR184TaGZ31+Y1JDJ", + "sgi1Drj7WaJzadtstS5YulAN3F5L42K/dM5+nWn9Wzn77UKppp5+W/GHaeXHoarc+SwR6Dly4Q5Xn6O3", + "Xw3DVjzJJ1k3dvZrz/Ssq9/3RtjvKdsXzn6yk/E7Gb+jcA/r6NdUwHeOMLuMY+Oi2Q4qdUE/szRPCc/T", + "CUgipitdcFF6JZc84JSTsJRpn0sO4xpmWJ+rS7T4g+XPW4HHtrxfBZQefSnbn8dfjxoC7cmqz+6sDEVm", + "6PMhEXILv41qg3apQv82EHzOVQaRXj3Y1iF5d9LQADjTXIvDHAn40Relqc7V1/YgfpxrYbnAGIf4/iDf", + "95SQLjZK7D7JgRnETD+liYIX/gWoYkMduv1t0O2Uo6FZSBIzZV2WK9BjKxStY+AeuBfNIbp1o7bHOXSx", + "tkjXcZgO5O+bQ9FAE7mbg56jn1sJCD8pwlI6AzKnzrAHkixAKib4yiljD+iHz5nY6W3sgftT268D+Q7k", + "70nlEZCqsL6mRkOAVy7CI4Yp48wpitrCeiJmqj2kvxWzpyhJbb63EzEjCePwIM/tzeTDLNG2Fr4yYq4C", + "KqM5cesLhdqYNu1yHF+zFJSmaWY2MQUdze2UOdcsCW2HKj2CCNgCittqMaM1wxDBkyVROgZpNxmYCwyE", + "v+PJ0jfJRIgEKO/I0o/gVGYrBVvoezBhM6WczuDoC43MUr8GHdCO8bt6TZQWWZ+gg1u/cM/sk1uWJH2M", + "WllAn2Q0V9AnOXd/SLCpwfskLwTThrTuApdnJ3+SNM8sLwWuCS3W6Jmv/BaeCnieomOgFhgKuPLPdn+Z", + "E8YfzBHjUeQYFOkOGT+VCdjdMX/sP13xpEvA+YzjB0FOhUwJJek6AhAjID0EYdqowhQ3q8LkISJrhZni", + "J0hImtaCeqZvkQ7Zn3M9Kk2j+WY9qqkUafWVtEfZoQ5XO73BD4Mnx9qPJ1rswpJmnHAPTUGlrFenFeug", + "+0GM5QU0YiSrnkPlh4rGzOZV4hBpiIkWe0A9ruw+xscxDvBkDY8FF7H7jP82xsdOFHy+RGAM2oBmzhWs", + "6pQzJVyJnod6+q1Mn22lxydl93y0Oprl+s+ETANBOW6DzjbdFdDsqMKjUYXSz3Md9X9SRIHWjM92eNTp", + "PAunLXLKJoXCBnDNJBA0udHEFtUjjK88oCKaJK/Lqnuu3l6/Ul2vT0Rm86GQE8GVhqLAmJNXbDW+so3t", + "eHx1TrS4BV7W5huQdzxZrqcfWKVBMBIQ42RVRA/zwA1CMa5jPINHrOaHE4SSJuHHR3Z770jFD0wqSlrw", + "jsOhmgtdYEEmxYIpJrg1ygbTH6iUSn0Ym1Vul/NNuyFMu6xIrYONxhfHo2tCtZZskuuq54I1Jx5fHyPp", + "u/xwASSWbAHbE84pTjNJ2a5qdOOi2QZx8x3IqgmD4ljMCKPj86ENXXnV+9rVj+uo0L11GcLV2QVSwNdm", + "MbVN4N+l0O6AvQP2HwbY1ym9N/dCyAzr+jSJJ11b0+NGlu6HiB0ednj4IK9kIUlcZGnw46InDrw1/+mw", + "rsO6DuseDOsCjNDnNbntCWSwspkr4yPiZt/v2Yku2vkD+C8ueYSeyDKf9Pq9Kfvc6/eAu2AQFzf1GI6J", + "Har/DVMMjHJexWjngnhggLBPEAb7ZMo+94mFwH4RuPdiO5pb8+quXJx6DiTKpQReqrucEXeVb75GY9Bf", + "WuQyAsL4VFhNs1WFYc+gX/TK3NulBYufXK7kmpatBghbNZ55LMJGjxEcmh0D12ZToFalq+6Ynpt/sUqt", + "Jy3ITFKuCSSwwEQ2B2b4FyQDmTKlvLXhC5HRrOMR6zaY8XfUbCjKXqEa0izc7eNJmyE6LPgRKuGcWoQx", + "GISAl4oYwjUcco6FWHZ6Jrx37R4HrVxRmMGFmaMUHXzggqsgbg0Pn8iqk7j+5o8rB2CUTFkCjsNtE6zy", + "LBG0qkb0M7/32Ayz2tkYczN8Ub/RMdgDlWeZkFqRP7NZn/yZwaxPMj7rkxmb9skkzfpELWZ9cgeTrE80", + "m077hC7YNFjEyM7aRHPyhiqb/g4ZFnJm7AsxrvRbJMVL80SzjEp9NBUyPSwywa1Gq2eKw2PcPOjz2una", + "TZhHm5Ap1b3XvQnjFGNNNx6RlX38243+0Yv1nRNBl9DuWVQ9ec46LoO3JbXc9ugwEnmDIhMkQaPRFB2+", + "sY99dpReUUW8vu+1+l7ZDGotk/PZaZ5AXr7vWurCHF5X3qKjK08q5CNX9ZyI9t9N632g1oJGEYqKSEY8", + "ZSaNIGUrTR5OqIKYCD4RVMbWbcwvr7lVPZrmwm5jh+7CrKJ0Ci0KTnZai442NKMN37lmxzNOTFatILJW", + "ebOgTzWp5+gLdxXztxYPsQ4shnbV6NZkSYru4ZohSJEuV822FyU3w1fG9D0ZV1+76iEdqfmbiiFlUZMA", + "lu8oZoJoXBSCLvQ1KoOITRnEYayuPGaeO0p/j4oD9iHTPVw6ivHtKYYtrYKIX+fbngcM1dHcp4GOaVko", + "vyAeKo/mhCoCKWUJ2u6lSDzVVMyQT4p0PNL76DRmesfr6IxBEiurXHaRud3DqKM9P7JBOWY6LKsUL5KF", + "SPIUjr7Y/1429qr/gO0/lL12kRXTpqidbecyuOim8VKZRXXsLr/L3yjLl5OyXRC3g5ZNr9iN8G3bcld2", + "og+uVQcnP1bRnEV5r22Tv1Uh4tFSZdhJappc38HYZis9bpcvo3Ob+TaqyxoahchsImaikTvyiVCpUIWP", + "jOlms9VfXf5eGoc3qPNbM/pOwMbuRxmf1Q91t69IAIZ/azrDN8tdYJ6N7gATeyReO7qMEsHhyHp2H7mU", + "y1s9AkfYw4Y0nRQpmvclejs960aQirKIpTW4GRbeJ6an9TmvyIydU2BH3R6Puo1ODORjXvha7Uf7uxeh", + "qoaZba+hKlINiwfNoyHVO/yywibzqLK7qj2oOlx6gri0zzOI7wW6eZptewbVQNa07ZLYtLqbPM1Qypnm", + "SVLcz3rSqgbXlDCl7bWqprf1ttKlu7TW78UaLilygBQU88cuM8BCN33ChXl+xcA1o4l60ewqFV20kL3G", + "dAHd9bXL+EkXgDi3P7pVsnnmvkvKa3f0vmoneEz52GXGXHH0TjDuBONvkSaTE/jMlGZ81lLGkICRyY2Y", + "lk183TGr527GniViQkthR0vK1dSFF6sdAFPChjqiE5HrJnzyXdnnGLvskccFW3bEsiOWG7BvVvPz90kt", + "cZ5mCVapgrg9Drp4W5Ir8/+MT4Urv+cUAAdaaJr0Sa4g7pOpBNglvS6makXKd+Hkh6la0fIOGf8WaggD", + "dh/OxpbOO2jDWFuIt0kLOIVBOesLkMuk97p3FKFOu/f149f/NwAA//8=", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/go-sdk/version.go b/go-sdk/version.go index 911e4932..00ccec3e 100644 --- a/go-sdk/version.go +++ b/go-sdk/version.go @@ -1,4 +1,4 @@ package cosmossdk // Version is the SDK version, synced with Cosmos Server at build time. -const Version = "0.23.0-unstable004" +const Version = "0.23.0-unstable005" diff --git a/package.json b/package.json index 50966b75..e644eb3b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cosmos-server", - "version": "0.23.0-unstable004", + "version": "0.23.0-unstable005", "description": "", "main": "test-server.js", "bugs": { diff --git a/src/configapi/routes.go b/src/configapi/routes.go index 53ec47e1..19cfbe80 100644 --- a/src/configapi/routes.go +++ b/src/configapi/routes.go @@ -12,7 +12,7 @@ import ( func validateRoute(route utils.ProxyRouteConfig) string { if !utils.IsValidLBMode(route.LBMode) { return "Unsupported load balancing mode \"" + route.LBMode + "\" on route \"" + route.Name + - "\". Supported modes are \"round_robin\" and \"first\" (an empty value means \"first\": always send traffic to the first/local target)" + "\". Supported modes are \"round_robin\", \"load_based\" and \"first\" (an empty value means \"first\": always send traffic to the first/local target)" } return "" } diff --git a/src/configapi/routes_test.go b/src/configapi/routes_test.go index e6f34c08..0d377cc8 100644 --- a/src/configapi/routes_test.go +++ b/src/configapi/routes_test.go @@ -8,7 +8,7 @@ import ( ) func TestValidateRouteLBMode(t *testing.T) { - valid := []string{"", "first", "FIRST", "round_robin", "ROUND_ROBIN", "Round_Robin"} + valid := []string{"", "first", "FIRST", "round_robin", "ROUND_ROBIN", "Round_Robin", "load_based", "LOAD_BASED"} for _, mode := range valid { route := utils.ProxyRouteConfig{Name: "r", LBMode: mode} if msg := validateRoute(route); msg != "" { @@ -16,7 +16,7 @@ func TestValidateRouteLBMode(t *testing.T) { } } - invalid := []string{"load_based", "least_conn", "weighted", "roundrobin", "round robin", " "} + invalid := []string{"load-based", "least_conn", "weighted", "roundrobin", "round robin", " "} for _, mode := range invalid { route := utils.ProxyRouteConfig{Name: "r", LBMode: mode} msg := validateRoute(route) diff --git a/src/constellation/tunnels.go b/src/constellation/tunnels.go index 1afd652c..9749160c 100644 --- a/src/constellation/tunnels.go +++ b/src/constellation/tunnels.go @@ -599,8 +599,11 @@ func mergeTunnelHeartbeats(heartbeats []NodeHeartbeat, currentDeviceName string) } target := utils.TunnelTarget{ - DeviceName: heartbeat.DeviceName, - TargetURL: tunnelRoute.Target, + DeviceName: heartbeat.DeviceName, + TargetURL: tunnelRoute.Target, + CPUPercent: heartbeat.CPUPercent, + RAMPercent: heartbeat.RAMPercent, + MonitoringOn: heartbeat.MonitoringOn, } tunnelRoute.Const_IsTunneled = true diff --git a/src/constellation/tunnels_merge_unit_test.go b/src/constellation/tunnels_merge_unit_test.go index 5502cfe4..1e94c5da 100644 --- a/src/constellation/tunnels_merge_unit_test.go +++ b/src/constellation/tunnels_merge_unit_test.go @@ -132,6 +132,32 @@ func TestUnitMergeTunnelHeartbeatsFiltersAndGroups(t *testing.T) { } } +// Each target must carry its own advertiser's resource sample — the +// load_based LB mode is blind without them. +func TestUnitMergeTunnelHeartbeatsCarriesLoadMetrics(t *testing.T) { + hbA := tunnelAdvertiser("node_a", "load_based", false, false, 10*time.Second) + hbA.CPUPercent, hbA.RAMPercent, hbA.MonitoringOn = 20, 70, true + hbB := tunnelAdvertiser("node_b", "load_based", false, false, 10*time.Second) + + tunnels := mergeTunnelHeartbeats([]NodeHeartbeat{hbA, hbB}, "node_c") + if len(tunnels) != 1 { + t.Fatalf("got %d tunnels, want 1", len(tunnels)) + } + + for _, target := range tunnels[0].Targets { + switch target.DeviceName { + case "node_a": + if target.CPUPercent != 20 || target.RAMPercent != 70 || !target.MonitoringOn { + t.Errorf("node_a target = %+v, want cpu 20 / ram 70 / monitored", target) + } + case "node_b": + if target.MonitoringOn { + t.Errorf("node_b target = %+v, want MonitoringOn false", target) + } + } + } +} + // A heartbeat with no device name must never govern, and must not stop a named // advertiser from governing either. func TestUnitMergeTunnelHeartbeatsIgnoresUnnamedAdvertiser(t *testing.T) { diff --git a/src/index.go b/src/index.go index cbf92819..3a5daf94 100644 --- a/src/index.go +++ b/src/index.go @@ -206,7 +206,7 @@ func main() { } // @title Cosmos Server API -// @version 0.23.0-unstable004 +// @version 0.23.0-unstable005 // @description REST API for Cosmos Cloud server management // @BasePath /cosmos // @securityDefinitions.apikey BearerAuth diff --git a/src/proxy/tunnel_lb.go b/src/proxy/tunnel_lb.go index e5900aaa..7551bcd5 100644 --- a/src/proxy/tunnel_lb.go +++ b/src/proxy/tunnel_lb.go @@ -26,9 +26,48 @@ func (lb *TunnelLoadBalancer) getCounter(routeName string) *routeCounter { return actual.(*routeCounter) } +// targetLoad carries a candidate's latest heartbeat resource sample. +type targetLoad struct { + cpu, ram float64 + monitored bool +} + +func (lb *TunnelLoadBalancer) roundRobin(keys []string, routeName string) string { + c := lb.getCounter(routeName) + idx := c.val.Add(1) - 1 + return keys[idx%uint64(len(keys))] +} + +// leastBusy picks the key with the lowest max(cpu, ram). Same all-or-nothing +// rule as pro's LeastBusyPlacement: if any candidate lacks trustworthy +// metrics, the whole decision falls back to round-robin. +func (lb *TunnelLoadBalancer) leastBusy(keys []string, routeName string, loads map[string]targetLoad) string { + best := "" + bestScore := 0.0 + for _, k := range keys { + l, ok := loads[k] + if !ok || !l.monitored { + return lb.roundRobin(keys, routeName) + } + score := l.cpu + if l.ram > score { + score = l.ram + } + if best == "" || score < bestScore { + best, bestScore = k, score + } + } + return best +} + // Select picks a key from the given list using the configured LB mode. // Keys can be numeric indices ("0","1") for regular routes or device names for constellation tunnels. +// "load_based" needs per-key metrics; without them (this path) it degrades to round-robin. func (lb *TunnelLoadBalancer) Select(keys []string, routeName string, mode string, sticky bool, stickyKey string) string { + return lb.selectKey(keys, routeName, mode, sticky, stickyKey, nil) +} + +func (lb *TunnelLoadBalancer) selectKey(keys []string, routeName string, mode string, sticky bool, stickyKey string, loads map[string]targetLoad) string { if len(keys) == 0 { return "" } @@ -50,9 +89,9 @@ func (lb *TunnelLoadBalancer) Select(keys []string, routeName string, mode strin var selected string switch strings.ToLower(mode) { case "round_robin": - c := lb.getCounter(routeName) - idx := c.val.Add(1) - 1 - selected = keys[idx%uint64(len(keys))] + selected = lb.roundRobin(keys, routeName) + case "load_based": + selected = lb.leastBusy(keys, routeName, loads) case "", "first": selected = keys[0] default: @@ -76,11 +115,13 @@ func (lb *TunnelLoadBalancer) SelectTarget(targets []utils.TunnelTarget, routeNa } keys := make([]string, len(targets)) + loads := make(map[string]targetLoad, len(targets)) for i, t := range targets { keys[i] = t.DeviceName + loads[t.DeviceName] = targetLoad{cpu: t.CPUPercent, ram: t.RAMPercent, monitored: t.MonitoringOn} } - key := lb.Select(keys, routeName, mode, sticky, stickyKey) + key := lb.selectKey(keys, routeName, mode, sticky, stickyKey, loads) if key == "" { return nil } diff --git a/src/proxy/tunnel_lb_test.go b/src/proxy/tunnel_lb_test.go index da21692e..db09b17a 100644 --- a/src/proxy/tunnel_lb_test.go +++ b/src/proxy/tunnel_lb_test.go @@ -30,7 +30,7 @@ func TestSelectModes(t *testing.T) { } // unknown modes still have to serve traffic, but only from the first target - for _, mode := range []string{"load_based", "least_conn"} { + for _, mode := range []string{"least_conn", "load-based"} { if utils.IsValidLBMode(mode) { t.Errorf("IsValidLBMode(%q) = true, want false", mode) } @@ -40,3 +40,53 @@ func TestSelectModes(t *testing.T) { } } } + +func TestSelectTargetLoadBased(t *testing.T) { + if !utils.IsValidLBMode("load_based") { + t.Fatal("IsValidLBMode(load_based) = false, want true") + } + + targets := []utils.TunnelTarget{ + {DeviceName: "a", CPUPercent: 20, RAMPercent: 90, MonitoringOn: true}, + {DeviceName: "b", CPUPercent: 50, RAMPercent: 40, MonitoringOn: true}, + {DeviceName: "c", CPUPercent: 80, RAMPercent: 10, MonitoringOn: true}, + } + + // b has the lowest max(cpu, ram) = 50 (a=90, c=80); repeat calls stay on b + lb := &TunnelLoadBalancer{} + for i := 0; i < 3; i++ { + got := lb.SelectTarget(targets, "route", "load_based", false, "") + if got == nil || got.DeviceName != "b" { + t.Fatalf("SelectTarget(load_based) call %d = %v, want b", i, got) + } + } + + // LOAD_BASED matches case-insensitively like the other modes + if got := lb.SelectTarget(targets, "route", "LOAD_BASED", false, ""); got == nil || got.DeviceName != "b" { + t.Errorf("SelectTarget(LOAD_BASED) = %v, want b", got) + } +} + +func TestSelectTargetLoadBasedFallsBackToRoundRobin(t *testing.T) { + // one unmonitored candidate poisons the metrics: all-or-nothing fallback + targets := []utils.TunnelTarget{ + {DeviceName: "a", CPUPercent: 20, RAMPercent: 20, MonitoringOn: true}, + {DeviceName: "b", MonitoringOn: false}, + } + + lb := &TunnelLoadBalancer{} + for i, want := range []string{"a", "b", "a", "b"} { + got := lb.SelectTarget(targets, "route", "load_based", false, "") + if got == nil || got.DeviceName != want { + t.Errorf("SelectTarget call %d = %v, want %s", i, got, want) + } + } + + // the keys-only path has no metrics at all: same fallback + lb2 := &TunnelLoadBalancer{} + for i, want := range []string{"x", "y", "x"} { + if got := lb2.Select([]string{"x", "y"}, "route", "load_based", false, ""); got != want { + t.Errorf("Select call %d = %q, want %q", i, got, want) + } + } +} diff --git a/src/utils/types.go b/src/utils/types.go index cae8557c..2b184597 100644 --- a/src/utils/types.go +++ b/src/utils/types.go @@ -370,7 +370,7 @@ type ProxyRouteConfig struct { } // LBModes are the load balancing modes implemented by TunnelLoadBalancer.Select(). -var LBModes = []string{"", "first", "round_robin"} +var LBModes = []string{"", "first", "round_robin", "load_based"} // IsValidLBMode reports whether mode is one of LBModes, case-insensitively. func IsValidLBMode(mode string) bool { @@ -431,6 +431,11 @@ type ConstellationConfig struct { type TunnelTarget struct { DeviceName string `json:"deviceName"` TargetURL string `json:"targetURL"` + // Latest resource sample from the advertiser's heartbeat, used by the + // "load_based" LB mode. Only trustworthy when MonitoringOn is true. + CPUPercent float64 `json:"cpuPercent,omitempty"` + RAMPercent float64 `json:"ramPercent,omitempty"` + MonitoringOn bool `json:"monitoringOn,omitempty"` } type ConstellationTunnel struct {