diff --git "a/web/src/index.css" "b/web/src/index.css" --- "a/web/src/index.css" +++ "b/web/src/index.css" @@ -1,13349 +1,13444 @@ -/* AIOS web -- global reset. Full-bleed grid, no page chrome. */ -/* Inter, EMBEDDED (owner item 1, 2026-07-27): the grid runs inside a sandboxed iframe that - never inherits the host page's fonts, so 'font-family: Inter' silently fell back to Segoe UI - while the surrounding app rendered Inter -- the 'fonts aren't consistent' complaint. A data: - URI (latin variable 400-700, 48 KB) rather than a Google Fonts @import so the embed stays - self-contained: it renders identically on the Space, offline, and under headless QA -- and the - FITS label-width assertions measure the font users actually see. */ -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 400 700; - font-display: swap; - src: url(data:font/woff2;base64,d09GMgABAAAAALyAABUAAAAB4CAAALwFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoZeG4KyRBzVcD9IVkFSi2k/TVZBUl4GYD9TVEFUgU4nJgCFNi9sEQgKgbtAgaEUC4gOADCCnD4BNgIkA5AYBCAFhi4HoQQMB1tzzZFCvBvP7u3DbGpQpdsQgMqps1L7r3ADN3ekcLpSd3VjDvdRxlSwXT24HeDivrPV7P/////PTiZjjG6zbhuAgIaVWf//oFG6m0fKpZa1GtEM3hHeiRiGTOHDNEtW1uphm9xD8Yfsc845xSOllI6MZ0bgBa6OXQbsGPkQKYlQqD3X9YVVvH2KntB6YJwvZMXkp+C5yraOrUrG4lPZsKGIy79I0v3UzBZt9SM6yqcJLyKfWogpGCTMhFHtxxQ74e+iXfmlkqJiNbeKZ4KLcfByGbnFit+pfrn4okou/l1zuyzDbEtoImSSXDLgSfrNakEiSjNkyuNXIhj2Rtg8HXFaJ1HMmcuGV+Se8CUCw/bq3NAqMQ78EUkhmkVBNNkIe66aFY24EF5FxJKmvYhLeZu+817KeHDRANVOdSZTE0mx05wGy3iIsAUf0f92lq9M9/vv/v/fb8Oa8yVqT0nuI2nTGlyeDouviNs9inRBSSqDf7jIJKu0nX6r99J6jx/12cSUdscJp/KxG3QT7RY/9SEwOBbgQ6oeY7Wz9aQv/8DXVf25LyKzMVb1gPyyV/Vl7QRt6Yojsq2qemYjy5LWBREQDCugh4gIihyuKEEw4qrLEgyHmBCRJ4m6LkFU2IMVOZKIiIiYOEQeMxhxWTBhSKjoeZiRLHLKDI9u9i8BQgghYQQIEEKYUxQFUXDWDq/aau0aNzrutm2vd78V8cbevb39PbuWZ+c8x6yKiPAv2cH/SXIzsw/6FFq5J1BCrkRshmBunSgGwlBJAxEEpGLApFwUq2DBGCNGjNwYg41Bb8RokWEBgmRpAypG/w8j8yOHxzn7l6YGDJgwUT8nKWxnYvunm0dKKkBbSk3TVKjTFqliMpggPjnuPrMz5WTD46b9o6Xicz8RK9tuu7tvrowTla6+VY2ikiAhJBCHQEhQ+fE36//kJECQUp/ObldcunvvM5Mvk9KrX8/F1mREaYECwcJRbVYVmlQxSMieub9uWxgmi8RIlphMT53AF76nKsiZ0PP9fv+5+lz6NKMTYVIxFkhYYhkun/JxgkCrUW8HgAHfZv5wV/Vceo2IEwFWEZPFfBFfSpOnX/qnojXxvfbOns7sUMptOJJCQsyoiP+evOentnLVv/qvc+q3CjpUOcAOsAPo0KMDOG0kq58AOljNltFOGB3g1Wk39AQ+xS8O8/f2tb0KFOBgKOMZL1U4wNeMYxxsv9E/WGcJZSGtFOEB7fTCvnubsV0HO3elSVt20/zFnBLJeSx2SYRDOIxGqPU8RgJPuF85+HmvCAoloAW0qpnN1ZoqVyeaB86JTwag9vO2+U4T8Oqd45RC8P1TgDARxX5JhfAg1M6n8RC/Vvnq03CY1Bm5s2EdFWWiq64nQELabXh/W6ELYrD0KGN/dy8Pnu/Hfp2LS/+ZITNElUYJRCp+/sOmQ9KI727UZhKaaVN7/e7eDp/n+d+v37nET/Jmln+chL03c1EfaZBcszZCIc/qeKRSqXhopLsRZGxnVCgYOdkLjTA1U75J7ShGrq85AEUWC04hNRKJJLmkXTYEEomQ8r+0uDorErLq35tqlf7X/UE2WrcsAJTp9U2t+1gLaU0MqaVZ41x+cQMQBkADJJuQWQAUZ5qUa1DDuQ+InAHJZa0akKHIcZY6Z9YY8wFKdS1K2mqRMqDWUVqrUnbWcM6a7C6zNrq66C4zNr4ssjYyPojyi6Pjefzlp9RXxx159GynISsw0ICMHEp2x2Pw96b1UZBRSilwUsStMGYtS6mEg8D//99rmnf3+uukV5OABjjgrdyfaZX/GqqAo8FB7AajPvD/7zSjunpyTr4H5QwKTbZUzt32yPZI6ZV5thZAFtEQuADh/f911tvqzrOO7GXtnH/GIfAnLBpDCGY3XSO9J83T05VsztrWeHDh27OzhAFr7M2RvfsBePIrxNn5wHj6cAVUp0pR5vRY/roO9m3aOvn/177VnXUPkU5IYt5onA5zd7hriHv0O/Lfmgs9U/Obh31IYl9QSfDwdtNuh0l/yQPCLsqCk7aAsgDwYxiG8fBxpbpvArSA3xLRKu3+nj/HSTuhYmYplrUe1IK1ZgUs8T+3urfPITbBbEhpWMR1wRYNLUqgLqa70lw8win+AxOkGc4hlEASFBLH+49zadu+ZpCODzJQKCd86ya/PCUX6OUgf4wKWKid69xkIaJpe8B9qYqXCivJzm0ubT+U1oRC5aKSEw4lgX+3l0fPDZgfC5PyJkVCCRLKvuc7UfJ5cruT7hDMYYIwRgghjAhp8O20fw2wgOmSf4buq3WCi1asL3tb8RLoYXGaTkRUytALu8f1t7tllNFh3+45Z+eWItkgUkSCpEEkc96Gae8EDyDdH9wnQUTEfiJHkJK653clm/QYm6mDz3L/exsG6IGkubz2yz5bg5njsnzHHhc5yjCOQwi22FGChFCOu19raU01dtpuYNXfAVGAH//IzvUXirFP/zv0Q8D3EOZgGihbNVTjCfTMK6jNIPTLEIwgAYxGFmACFAAmRAPARuKCGssWlDdc2DyUMI2KsDy6sEKGsCLmsBN8YacEwy5JhdXJhGnZouoghXXxouoTRkEEOBywO8ROy8zCKiUMYc0hGE+IBuOEgNsD1wcOJoEIBF76FNWvW8a/lWR8cpnwualV31D+g2XPb5YWzMFgE7wQfBUMiAAtzk8QD+7nLDCA3lr4ji7Q0qn9RVPfxlPKpM8205pLNKVuzXBniJpTlqg1ZdfZU/aMPWcvOFOuBXdyD+4UPAq33uSd+lb9t8irUghIFrgw8DAwDcQDKXQVA6xiA76MZ3wdZ3wa3iH+iPoCy31ii6hEQwzkY+RO0pNIrpNMfZQeJVCdlEEt0/+7SXv0Ns2MY4CpgemcrGjJK78i7vGxxvmOODaaYWbamPJQnJtgIt/rscV78eCP0M1GjQYdDqZhIlT0WSxeGk/pWQTGRLq5+prRdZ7EK3o6H/HJP8evCCaCIlCCYqAMR8LTUXtpI4gcpSOKxiNzFIqiMRoXY18ci6sEKq5NYklxEk9K02jmy6JZLItnVXm2SAtSnC+F5TtDRXQUU8xxchFpgJhMk5PSKJJ8aL2HUzy/nXlm2SqXxJZqrCGVy6mfFiVVRSGVVMuyZ9nHwjaTLVjWQfh/hK6gxvV3VUAXZJKUlpW3vMpRFQwnG7V6g83hhLwIiocIima5KB8TEqnBcRiJNC8IzFTdMC27WqfUes5ktjndvmisUmmtDVyBVLUGRD7VFYArSUHATgtlo6/1tt4Ol3u2+Bzs78vHs7B/UKRagDk+YCkBDFQJthOPcYcHfsUXMHXRbL/LZVg/OJt/7eaAsMTJdXMrUCuaLVhf/OXV7+irnJ6SCbEZgvAh3KOsYL642IdjkXJko4KjRshppO/9pI0aLFZX/N3DQxmbYOrjAT/79NOaeBWf88J2dwlitElg8r0ECXjeIqwTKkUDwaLg1SoH/uKvY/3gQ1Jj/KofmAvXXbL1+8nCn5e5j892isPgkDd8ZkN5u5fmmZMfahGqutcXnayYN6Xlw7NN46XUvlhu/lkVUl4w6XzysiO8fH1cuNCuSZWVv9ZVTS+k+kVz5S7r51DS4q660uy2speX4DLhin0E4kVJOLZoghXZU45b4SfhYo16VZcnHEuoYBwSe8U/L7TkdFxRq3AynWlNrRJqQDY4PozgA4ujA+sl2EOsrGNGbbHa8ztEtUG3WmuF0y1o9gyHOWSHaaOsAYlirvCmQIek0+zdqluzo9oDXSOVJOIzZTZrtuAKki0Ey0Jyq6qC6W5ShKjhtLwfszlR1u3ymUIhKYygjxZqQ4jMGiI2CNcgAINtsTVYRD/aUY8KyD1kZiJYQNsZWkIoN7igBUYGO9Zou9rQk93ZNa1qSYs6qkkd1s6WZ6sKE2/c3KwZwlBgE8R4k8A00o6++ED2lLdfLdw8l8oR0FH2KW0rQ6JMDtnNrdmNj9qDjG5iirnc7F7sBrIQbhOS1MFtX25g2/amFoBFyeuvIjZPbtqe1M32bnRTf937nIaxN4kJ5TOiRLYrigtKw+H1am3avnke0G78iZN8myoQtVa5xM5H+Y3Ss2tTnuRoW1HluNqHxXKYBEt4KHvBRmA5ra0eV8rpJ7Ku1z4/dxP/WD84MxS8hdi6vlhiVlQ1SmM4NbDTp/Y+P0MDWzmXZsbp6MnxvBiixZJn8AVb1/yMN2qWBjceS2pDo+krl0JvY7aXv1IL3nzP7UIcPB0/pF3dBK/eaL/t9Fgl+MJOxLV8FidqeKb5sgUXi2Ot2sTGU2edj3EKowZ2/CXvfrUN7TX56J6+XVybPM3erX/zkdzIzXeU6Fbfrw+u/mgcvhq6kPeVjfTS/UssNRSqoytJDzOtCE0aQuuJWz+4D1UrijRM/6Rw1XK8lao/8nSKlKSaeCgTB60KK5/2W/0puNbqSX7BuypUrxpl008XHRNfAtSUojuQPnMTOGmMap1HB/82N59DGUNsnD38aynt8URUd5jmY9TUGKH8q79vOzz69ttFvtdEbrzpfgc5ISzXY1pc7RCRT2y9SpMIrprR4vbHskEuxmTEa9Pt+TkKl7f2V0+8ZXu2/YeS2z02tq9o1pcn9upFSdPGO0Atn+Ewl1J8+ZkWS8R7c9OH7c+evtcOvo0VCnUOd+VLBrVyEpIX+5ph8Oaz12NYUkcWaK0ylwpZS00NzpJtp8Yt0enZiE/YZ7eSGujCfomrOdrze0U1VNUNbSEg6sn18wtRzG8QqEpthNNA1/v8GxBqhJS6NbEkO6yu696019d8GTJlPVxLtf75fzk/C7g+t3XWw2xo868ziOzl09OJDeBpHJXQlViH8EnQ/LVoO7cLwUZNk3V/ik2xJooyeCyJyzjrbxct1CyXtGtbLfLaUaHo9JeGqR58x+eNhyeib2qFKF1lLIksUriemEI5rZ9lJJGe04GUa0G346ZLHWFfLLIax3C1/iSXCgBNDwWpF9RQZmK1k1orduRjd8YVu7tbYluu6376eFLW00N8dlUnT5Yac6uSqE752qObLFAqqSuJLEIfrk/Uw0mbnh+4XnPxZTOgz3/F4/hkVd5Ivx7gEiVatx2fVLvY4QvjfA5L3OXfL3lTcbkiHtVcy/qh/sgdXe6IulA5HYYzG21vsPCN+5NBEzlJnWLNb9sbKbCnfOwD91cOrYRlDqbqRCw5ikQ/f+06f47Hz2Y0f/q0rdS9edC0PQIddCYbMMVPtLoQzf96srbYp9LOs7a3QXQ9AZL11duq3PWE7pLCA8/06vfdjw5eRvhJrR8qASnBJXaJu4d3DfGLdmADD7i5AzfgYk6eDsVLbyDak1/S8EVIyZ3KPMue9MKnzxrxj3wlVDFvedMZfOd5nNQy5UUHfxIVZZWnU5iluWj4MsWfJSRC96du732sBlKbqpzkkjQSp4R/dkuFt6ELiA1UnyEyl+pX2uFxsgZSm6occkla8rje8FhIpKkdF2sDO+sXyKB9KoXU0i7Ir7F1VZwunWqzy4sB6fCjSMQPhGEh5vpwty1uYThoAXqeC0G4NIlRVnVCJX1db50yVyJcX4AiFK9XV9ehnx/1HI/VMsvSJI/xYf26hnnkXUuhZnhiqVArLcVqi3MhO3PMwPew1GNQ38blrmMJO7ElUR2F3APuZfyiF6niEsEaBMvLrBKofzlTkSa/SvrBPIXY4QGJGn2oN34J/aAUxJ/Hq0Gc9uF3/FvJEinZqrPY24VM9FXO61tdJiyRawzTfx4A5TJD2fjoiHkUWBfuHdBKhp4A0TSrwI9BG7imK2ZdQhPfWNOAH4JYh7a3EqkdfhaKYbwyDqVEE0z+grfBACEA9iYjNkyIhLM5xmuUwV8WjSTZcqTIUy1NjfFCKZe4SZO3jxH/MKn+7RME1ii9eEF/MZc+Inz9CUN8YGL+858LQrVemvSwxts8whDvuDvz30QIjCNfMBvs+plhgPF84nj7hGD8/P6Duj0ji0M/6Dq9t8LeRCMlKnwXNiSPbxNsk4tzvGycPaA4m31YBvc5jKOextkmH+doQRz0MXvI5kovrqX/pLhi/L5n5lbGvHy6uSQWf9YsLqg7lPnZxfEGQqlVfcvbhvPibczl4byyl6TURW9rMWy5oujdtXpaMkkgF83nwXtO17Z9uw7BpYVugztrH3TFcRgZaFSQ+K2zvey4ncSllPDIzbmQeAb7ONvzZJzIt/C7lLHjozQDPIPlJVFUC0kXh+9GYTGkFTVb8QsODq1sKZdtc6VU2md8xJxEbxP8OzJOh6XGdzAGHpYjOy215rT2s5E45nUrWoPgN5iuFtUfU3CvGmc2NnY+8b+v67tw6J8MYC+TQC6LNDgfOK6OyuubEglkg1TDwtvR5heOPe0HnjbpldAWCI6kPGGliT/KOuBFgBptoXqfhzPwhTV38B8KWXf/rTZfhuOobHTWj6N54UTtyV7+8a+bhR1shsosivZ4HkFbUl7IMGxxznXMP4H1Tz7iN87iKYfT3/ez4LET6FTAOP/NfbkQ29XmFZac6wtaUq0mnX0365eqUrs0Ky07Nd9vWpPylCSmNqaYEczVZK5FOV8r38b6pcdxd9AfJlDMSDXFt9P5T/Ij2439IaPu7E+t7+EEBl82Wb0mArDXy62Jjlk9zknVr29ymnQNNk65Hd5vlrGBiod6wM1GiRstvLGSZPsY0RTFkXkiZtosZNN190Y1F7ud5uH250KCxrVUcnatkZFTt5Ln0gaFudeCalbV5PnVYtKiWhkKaB9aVrvkHVBg3UmKBngLahiFNPWh0I5JtjwDbyt7imk1dGfzZdRWZs+oO+qq7l6ujAn/HBaWXmyXitFykyACjOMB8/hgQgIwMgSIQoFxImAX1mFMTQqU5QfnIhLUVMVvmqDcBDddUO7i5ymjymVWpYT5SNgcCfMTO5nG1yCqZRpVk7Ag0QULWy66FdJrZRKvVRLiF0YrYjXxm3DJcVsvPU4bZcUqSmGbJe4OmXanxN0l0zYkkRIowxIR3VZh20TaLkzVrOxIQmwpiC5V2M6WRRrRfQ9p+mUgOrWsekzsMmXYEz193ofhC7LsBf3Wi7LpJY3rZZn0ikb0mqx7XcN6s9k6Ng773lZvLNiVAYv7S+qEhD2DRuhcfo1hQ8gUxdawDmfW2FeGJdbzYJoJUGhRrleWC/O7Mgsm/qhlFdAZwoeNqoLNUBzvaRr8wjWjVwT5z+fj5hJuuezPx5XDewnjCH18evTx8cJ+IyO6TZQGI1gYwWLluoTl2/zeYbaE05VNBghrAiIGKCPZYxldswxnx5yEGWNWRqVSNemwir0DvHcHFcC+Vbz3co1y+te4D7SX4sre/pwyuaIs5cGRcRBSyEEu8nAJzqd/ZlVFRc8nIBKQvkXZ6zql4MaC232q6cD+gH02CcwVzBRcn88N5v002Q1LSi7jwGVDBgqsCjNmBYVaNmG4WhLqNgZl4w3tYKIbvAhbktftnKDjMP/c8EGS1Uw38xLBDb6VPbjhwYAN+QtbNqdv51BzcPujQdUHt9vAa/3wDa1aSz3rRgmjcjF39ZkJlMi6gz4U3Gj3Jek9WeMAnKdbSDEBuO13ascxQZ5o4PBep6Mk9J6z7xHyydttY4KG/DnDKEECnY4rQY1q3nGHy56D59JQQhZO1RRwbT2cIYmAQyTuUIZ6sVg2harDcwhlysnI2QU1MHjFQK+OLXGhN8MxMqZCOjixT9+DkGYMJ06H/MsomDkczIxOYMFl1PGKL9lypvcN9fToRNQbhGRsNVW3yV9azlfoeMw6Z4hBgMKUsL1efIVcGJPYo/P6XyzxKExW4NJ1zvWlO5H7YfV388YBN4BBFq/Z6/+T1U7o+aGi47HjMF/q0ssDuuqxcX1+PFbdDLn1KrxYvY3Fj+qJ8PbCasXgtbBuoETciI94trWeFn3bB9ov+O7TMbcj131VxT1Thgd8/SbkOkBC8bVLso1aWNbM4+q/42eexXayLcW7JYNQAWM/0WxL2ZNk5d7jvizh5Vm1uNavGZ1tHFcu4q9H/xHsv9373c48He9WxN6+q81XeHVdzi6faj05BekBdmYnHlfacjnwjM06bdiXVtxqz8u9vVIo9cLKAqwcKQ9gsY9oW5HQNsnpYDVrdKRqH8DW4NqijLmjLdYr+8UHlqZP5L4c9g/AfiwtrpRJ97GcR2pj66rv7ppbelejasQvprfl8T3IvnxjqmhUMsoEWueXGs3gU2mPsGtEdhruwya4VD113lVXWOd2MfY575o7AxVwnGq2OW9ZNUphWrABT7HIBel7cLuemC2461UD68/EX/QQ0+Le7Z/vV9cFr7Qvn3PUN7pz1mbHH01Xaq+X//evdcxWJxc29wVUq76mtCisUVSaAZZw4kvrjYO2N4XH9rUmDeyt7zzXINmz0TqDamwmShmz/noFCj2jy/b04TRARoMvN8sN143FM72G3hxTHC2FE9Kx110GZ+wWJ6wvUeek+2k6+WDSYLTeF9Ed8yqnaHJabcEWCch5+yZmLW81aK3/AP9m0eofK2aOYyexOHo8FpetDeUjYHa9d8yM1vtxFu237B69CZ2s6eino4899Fq4kZvXhY+H30ThjKZOfKwZQeekgMzwmCO3u6/JAE6rJfAxuzuZ99geWK9b6yvHqfeA6tEv0iR2kGQM6oanpTN/OsPJdj/pvYTjHL/P8EV6pb/5EN7pP4enOU1l+I7fR6s9TYBWPuyKFG5Bj5bB2u5Y07xj1gHNb4ljZyHVti6UUFIChVU9ZT62ABu9kUauB7R/KYZCmTxzd20z1FfYvhRosdvqpKuzd7YTNI2n035NzpwgurhwNQJAaqdiL0VnH5lWOnbcywyZN9n6jOhw3ID7CPMec9p12dNijrHbd62B7T597sW/oWLBY1m+gt0bxzgWokWBJbZ+uUBnDbAlLxH7zhWUY5xkQZemKknXL5E2znFYWxJ02LMpGKeXL8Fnr2ZawR48atBP6znhZ4XZPJ6H6deUoBMUKQDYMA4sPOIRxzgt7b11QcGQ5I0bps1fKAE92AojHt5OFHw9BqwHgNqlFtYHaXaE1SdaIXUiCtgPKYWnPOz9hhEyYplTyN8Dl6KtTd5HAe19MYPESDnqpuZOi66CaLG7Yf9cvPkhDauxC7k9Hv2QO1V+igGnCxgsysGOdiSFWEfBFU/3+60WH+DGBZj+ou5BQGyOJDDrNZtVzOU2LzmKPKQkH4zd5lB1HOaIF4KdUbJdnqHVGtUFIAUBVxu4XgGI/3YsKD9wFla7TBYt7aikZxLpxKoeU0c5pf7R7dLrO6rGQGZi1hPqTzExEFqctwBYAjQ+d2HGtcFasJ+Smbk6PSZKi/vyZUtEtBzX3XtF69BSEUcc5ekkm8Zyvo+pdQbWbeNiXWWcMBEJtTz6aOksndQtT6Mb2DrpvWRHYhvOHEu0gVpVtlVPLSuvqZVjTlvZ+9vCcP9IJ8gheY1P0ohuxhaQmidOuP2jMbtLryEgtvb+pKelZpHI7tn5TivyTZAvp3Qyz61ErFUurSif0uI5YEtGdYsTJvZiyu9WppgDtSB5OZUg5KW814eZfQTGN07bvAQ20bmj415h8GeLld2VgLwexfLF7xnZsfwBMwDMckKBQgIAgOggakRH10zM4Q6HAtqSEKWchT+f6RkoueEGNP/wcHaP/Y3y4aHX80sN4JIn3gQcD4prQhotLX6AQvZhu/7c/nF+ntxY7Z8ajOx8hR5sEzZJfj7jCyxxskXc4Oh/bqune+EaObNalUUToDfMPI5eYGbFvVu2XtapW2z2y3zu7LmFRPO/h8X8n9t1TNettsibDAxLDj7f+wQpYLWHVJ7i97KBEeBEMBKEDdTqIHxw9kDcgDoxmEz3UQWWGASt2e8zNBHKh98PYN64re7VCwZ86E3mq8WViqo9G7e4FhN6XHxsqls/H/rvUTvmnQBa0Vyirxb6PQIY8mIApGF2ETA5gwfY9y5ov8eOzoClzkzB0WmOw88+ECVYzHpA1gd63otmLSSZJvAOg9nh9/FaDWIu1WwrCo1SsL/CG0aADR77/wz5ESIFP1OQDUPpqIeAu1wxvTwc7eXjWK8AbTWk6p1IKDIXrRdtEG0U2YnsRQ4id5G3COp2e15FoBXvQ6a0h6vYiT7f7cs+oTQPXyevpglnxDuHbxnTuxXfjcudIhhc377ZuzHApT3C5NkaIm8GJ+eSLZsDhR4TXq7VCUbuuk7HgqfdDxziuNx70tb1+IEXbpBrD040ucqcRnJy3RG5PKdxEZG9B+dmyhbX7Y3e4CJXeO6GC13csyCHjlzvHuC1PR3sgOw1kuWYHD2x/8hjNzsLvFyZcZBHzulO4OUE2+3LSSNPNPR04fyeCQ60y9oZtuWCLfmQ+/9PDakIAyyGZCDGKHzDmEBGs+KTcILYc6N4eEEcBFCCQiCT5TELS0KeFqPJLIGWWoq2TCCkEMzIYqH0LReBZ6NNhrtNDEvN4hjbQElghyRirTJxZNkLZTuIKFFijLccRpQph46qYOCY46x84hQDlSpZ+dxpBqqdYeYbF6CLrqFcdwdx1z2U++4jWjxEeeQJPU89hZ55ga3VK1yvvebhtH9xtfuA76OvLPT6xly/7/gGDDI14T/op5+IX35xkzPELhgJTIyHFExJgCxwDUE2OIYiFyYmQh7MCEM+TM/E1EGXmk5DSrZjSVlbc9sRWUOSoAmSoM27qTJoYmpiamL6Su5rPqj04/g3/erdgp76PdWZJGiCNtSyhlqVQkxYWVtZkwRNkARJ0ARJGNP2crPPj9n2pMrG9aw9mHMvPdjvff187lUiCU8M97r/oalguxACLPoMcLKDPJr7qfCZMhIaZfVmSvU5UlqUzougXyygFFFESwIOiw1nPvbWIlxjjJqbxuqQod9WyzTOE3KgPAdhphjJAsEjwYvkSOGNWuKQ7R7MDu1/iWx589lgRWA5VlpBXIUAScoTZVbYWEaoaGGlTVFu7rpxTiLp5iSSzq3ustc+e+2z177uqMBps802O2B1N4F8i+VbbJdttttlmy3dWI3Thm7IDvnucKc75nfKt3ieP8+Xb/GF/HE/yLfHYogd9ttjZwh7dVkyBxRGgMA7BPIrcGqq3JSd29bUNDMlw648uBgCb180mFnxDiZ77nKRc2OcVsNW57527j3nIgC7kkCeP+iSO+ciuLWvP82eew7bGQ6EKJz+He66vfkLeOPp904X8ABij2cPOJ3WUDyhITmVbSwjKyLJJP+2t3IbJWsPzY0nek4uxxwSTn3nM5x97wKP/Kh4YmzRpq0ogPe4QB8my74pVGgOM2W/qpg1fwsYqpyFnVm3JyrNFzBCkVgilckVShVrYGhkamZlbWtn7+Do5Ozi6ubu4enlnyywcXDxNGjU5KAevWf6HlnyAPQbMmzEmHETnfboDDjksCOOOua4E06aNWfeKadd9wuDRTdUQp/6r1BgfnWIXXJCcfAGOGqT+EcJmO4UBWgsbBxcPHx6BPQJGdxMhCx6rGvJzaiNy+nBhkibHhu1OE5ud4c73fUEOHr3Rc/u9rWegxflpt6RHFnASaf8rcrpkpqkpeg0Kn1HQY+rAqdjvByfTgAnnWqlyd+qnD5h4HlV8FW+oxbl2ofgE1t96nNf+NJXvj7hr/2uTyrhCgOXe/J2jNMi9xZwwkmn/K3K6RMqhucVB/C6vo6DyfBdxCu0nfxnEzy0XCDxyNLC2tblMXPAYSV3WrcJ6yGjTqvtk+MCp9KvRQ1zx9OxAJG+/vi9ZOkGXO33/pcLMpep3DHG/MyRB+bPBzbBdvFsLRJ6WyTaapvtlBUPlSj5akkbBqW1D+x3q9s94wWHHHbEMTiCEEVkyDBde0bGgLMjY9tBRCCi6EEgKd7uIEXkGozVVAqXTzzR+ECvsrlt3+UnHZfpotY5M+fcaXntEoTPX/RfefNp+alN/MAxePxGWQa/IiPvEOFRWQfhgB8hR6DXdXC9qkOaFJ5L9ypusuxRX73d2j7c3tsEd+ayOtb6sUIXaDF+3e6LVzZUOZU4mo0FJiuCFJ+z65NZyspiSWwKRfQuC1Ufp3BOKVjxc26q89Q/kfluuGmBp15ZpM1X8tIOw5/3lCPboWi3higUNfHh5sIGo6c/Eotx5UolvkowobTAxKP3u8pxOgmkTJkyZcqUKafYjCHTyH9l0omMtiNOm0GhMVhKKmoaWjp6BkYmZhZWNs4IMC7BCu0KI4ITFROXkJSSlpGVizyjU1CM7/0x0ZqiHsPjnveCF73kZa941Wu7U2uvoYfuFHnGpKCopIxXUY0a41KPBiPT1NLW0dUjRJ+B3GiweGnyDKWgGDXGpx4NBtPU0tbR1SN8Pc1Je2kCFaQezesxPO55L3jRS172ile9lh5sR+QZTkGxGrGaaGnr6OoRdrMp6T4A0ClKDKWMV1GNBmPS1NLW0dUjxKM4j3ncE570lKc943kveNFLXvaKV5vXFpRwiqEqKJvKVyPBXhRoLGwcXDx8egT0CRmY/CYiCFu0g2qVVL8ccp3irUnsvvGASVvbrLvPi4FR+2zKrQf+U6OqgxeG8THSiqrqKzu6YGHaduQVsaOqnKLjFiGqk+UZyCn/5NTdfKVFVU2V01JfvgU8usVVSFahT5myj6cDHNM2jR/wO05Dp7tFUS9+5YozaUbt1tCzcyE38/v0233D+qhMfQW9fsNt/Kw6M6+MO/IXdMPNaF3YS6+81uaNt/7xzr/1qabLgB/NYAa+74msv7gWT5VpdPV1VeMYmIhXsfZ6SVXaFCLFGj3WBWHyszg0xAnqotsreP8Q0luS59BJp990ZbfqKaGBiIldhO0uoSxQHRC6zdC/n6y3BUGHfzPZUxMaA7rmNfs4DCxlAPqXjwFL5aApq3Tj1WvEvednuSri7hnNlxB5r0Ixj7X34SNR+D2oGM1h9kNqeR4eD/tbxdRHvUAnKdqD2BE2ULPtgYtPQMjw8mU2FZoWg8XVgeOOr6/ObBQzGzv3SSdHudU7U2mVXK2aXBv/z7Pz1Dxs7NyRwhax6oR7UAnpEAbuknHEst26Vv0fgrQkzcZHHu89qh/ff2ATIaabAXIIhIuIMDkc9VGIBmhIRk6BoqTDMODosYxMrGzMLOwcVNRoGlpOLm4eXj5+AUF5wvIViChUJCompFhcSTB+BPUAupbI+PmjZVgTbuIWEWTaGmmZdbOszGumzbKHlTax3RxN8kt/zjEHafNvaqjyUU8alSHz+UHDwIuEhUNEQkVDRsElcGdu511C6H3vBdQK1TipWMmlg943FipBKTWUyBUmQI+AcWO+MaUVqRpTFXRd/RhCsTJVXvhXKDQGixMRxYuJEyQiODp0xLEzIUwuOu6Fyj9iQbEK0y+dNHEHhDL1grELsGlm05WqZIaVkCDsbmPWedS1zne8Cfa1XDlF5dK8vCVnjgIxWjjPTlZRwUTSsiY3mYRSvdOraIiqyA9lhMfccPRr47lf8wpXe6QHuJtzzq+WgO0spukcJwTFQqHTc9dU0KCQHUX3ptA5ZM7JdwROxEPN2+4rJrvGs8lNM1tedS8xnXIaXHxaH8VAkcU+v3uGFlTnlgi5+jvfF6sWVU2Twh1jKLtDONnps6GVq4L5pAi0feDVHwKCOhAkCvUA2gOHJULhrK58/q6S4dwQaAyxV6XIFZbHVwyyVmnI5Tvi1VV6FYFcDiMuWiO8kuUSD0UxAcHmeQhMJYbEc2lzMCQUFuchMCQo8/M7MCSEZedmGBLn9iw43lwFhoS2b87ZYEi85sSBIbHcDgZDotqaDUNiDPhfATIGDcf3DmPnjx50J7FxitS3pZeSNsG1eeOMRGLF/dVrvB67bNjfcLP99RSybl8+hEAmzn68TmYtGa03XPxoRStf7JFao8x4zVlV7Xr6GvFJjWEoHw8Xn2bCLoXlRBU6gycSlDW2RfLOPEGmHb7ySYDKAbFu81Wnii1PjS9Gncu4snU86eqcxpT5QHQCdJquUD/M6vSAtvwO0XjdAHeNbss0Vgt1pQ4Cj3YBXjH8uZX6FmhA2dhuqCO1GXiE5rSjZnAgGMCqSSVUXkLu6SOBB0itB6NIpptogKidfRHGPMCwrt3m5kE2MQHE8NUnaMmqZvuQVyY6bVDwtb6IF7KHLwHCIXpEQIZ5YvDw95LAk8bZVX7VLlWh8gov1fHghfPGJaU0dOjJoX3kDB2vtZ/NEYfgbojdfMqn8Gpyg6xcKFfZkN2rdNZg3biSbZlKoAKYnQ8ErzzMZ7G9TY+v47MfyzyEHyWX4EdBOfzIymYqkDnENxgDEYlSllGA7k0mnVxPEu4o0TgBwoYSLMwQchRfnL2365O6gv6uRaMFUfzzogXsPmpqiW2dosGS8TpyIAoqWRIk+8aHEYXsEO9HAiVRZOQojjZ5QGKeqit2ArNA8Q/lhRTiJcfDF/0wwlMq0wts/HdbPYGUcXOHw1LzzebGcRh3FmD3OdKOxY3bkE/k3VpE15rJixdCeeUxHWNblcqXKVWiKOFCtZ+aNw8FfGzB0N9UVCrYSr5040uIxw+ce4rIF248QXz5Y7RolefQF7SBg80Li1filfie+I1iscXtv4f3ocueu0VvPbAV4sm9B1bEMVWAgwlDRRoStseBT4D/zrXHvL24Dz1nHpnVEbfYZ8MiJfrA6JRzTaxIqDKSDm8wuAvKrSSZph5bjMB+KrOFnHAIFDC4C49M97jBPgv5ycd6ZqQjD8G4UeUENUxpGbam3dNlsat3WADlfSB2W7L7vMLInsXPV8zos45nv3+Cj/OJA4vK/MRpruyIO3yFi513/pRP5ehC5zj2qMNMMKIJ2ySVT8U105QT7+Sqyyw85/SL+7ZMO+kQPW+60U6F9sZZfddfurrKKuzRlpqov9aqK2+4rnJVFdeRi5lS/mvoUiWIlkg8sUQVabB8kVy4uGMMk4MEYgsTedBsyxlKNrEQ8cUWTRYzmoPZk8Zoo44sKRGGFULgCYonptAhODR70ElzxgzZ5HVPe9CdbnWty5zvTCeab5qxc6R8YNaUMTYY/5cgSogcr5r+rIyrV/vUrCoVSS6JRIoSSUjB5JNFWkmF0D+ZZpQhemihmvMcZhfbWM8KqpjNJArIIJ4RDNNFjiriNKEGIIIBChcMWMXk7CjvrQU1KIEC6YgHFxTXhwhJmGTJPUcRF2kXb+7Nl/m3kXAoIrxoBkpShKN+vj7i5enhbm2sElHEcTuO61/w7muVOMqUU5kKizlXMzNTVVUVEREhSRIAEJ7/KF3atst5Zyos1vzMzExVVVVERIQkSQBAsZZiMzMzs9wVJ5qqqqqIiAhJkgCAGwquqqqqqqqqqqoKAAAAAAAAAAAgcwAAAAAAAAAAAOEAAAAAAAAAAAAAAAAAGPykWXyfiZLYSVUZYU56FCkfCy0p5FL15yZIrPdzvFcNSilxFC+D42Vn7P9FXv4//r9Fuqupp7s1lWVRBOvmfYCb3Xy6eVp4eLi5y70MSpIkCQAAMPigdcmHuf6pn/yFn+txT/VwiigUPeY0/A+aET1aVCkV8wtzcro1ynhgQJuMclEiyeIhw0Mjhp9V30TGpJyDzecn9hlFft+mxjIJD1swplezSo8M6ZCVEkMgEQIbQoGHQngcHfk4VXLE8GNH/YWypo06CSZavvVLq1Om0KOWTOjXqlq5YV1yqsQRiUDkoKMiQCOCBwsqpM/g38/B4cYIwxFhPFhgoMAJg/x19R5djNuevtBmq/M7flDGI/u0qFUqQnLSRJkAEize+KHRIUPIUUok8GNFjZwwLjhU4ARBuEclw3P3NKhTq1K5YrkypVGuOV/eb71+EK8iNF51iKrgUlRgyOP2WUFRgSHv18V9Fy/FEODjFXeF+AkRIkSIEMGCBQsWLJiCgoKCgkKgQIECBQokJycnJ09539miViBeci9Mi0CB5ORDnp2iIS71NEvZtbmKwldzJkfhYWurKTh7vu4XKbkCdnEG7LY1zHh8tg4gHvXqjFrAy+1UXeXpZ/zcL/FJj25HuF3evXgZIq7qkh0myp+Odix0t0uyQ6Yp46iDQrO7ZAetlceWD/ilS3bApHMCMYDaLtl+E8bxBQCWd0n2WW90R3EC7++S7YUPPwONN3W4RyLVE5JydTIqM3qjf26uv38hYdUiomLqxSUl1KlRG9BRchQFdqPsNLEdHbZV8sB/zObGjIgIsDdlfxkg9gEGGA4K3Vpp1SiloRJlFRlf7jygSw/sWCJZAhD0ABNQBsE0BRHaIJinJMIaIFi1IGD7CNYtiXB8RLa1JJnrI2V7C1J4PlJ2tCTgtyTY2TYRvZak7NaSaiXTkfUJBkAbY9AdyacWGlg8pZ2KphEYYeu9zDhb3BdmYWVjR3Nw8/Cq4sJwRtAhCSA/GBEEhWGu3QkUPa1yRAvi4uhUwScQwxJCBEQYNKTf5bRiDLPTN4zqYreutYVwru8s9gQfCEgaBPmCZ5sI0FeAndoS10Cqv0S2lN2r7OpTtuXjbE5lRqQixcmnu+c21V2PvlCTpEKowtgd4REco0LqnX7DL3iVl3uEKx6OfDuOg32wx1bzcODBZeZpjvTzwjXnKOWDS/oIDKrN/LgiLRxw5vDTgYgeVcd3tYl+r8/PRuj1Gun6KRN+E9F+8FvpLpN5fPja5kD9xPRDQz9LVksf8v7WTf3Xxov+Y+9VX+p4Om/rCy73nmze5MnUzONzWg+ffuD06Xv5p2/33WZ7l+l6wyBntya0cOt73bqWq6ORK6k/1+Ty/pIfF/bnN2r9v+yf9i0/yXhLRAh/e8nopuO4Yo8hw5OWE23sZF8VQMur+55ND0t/urTbHlRssUX2T80UDR359ly4Y7u1LjktLuwbZ3WPX98H9WlV01Rn3nJSueq0dP7pEnSTtEWiFmpSt4CqxNP57n5McTzJ5ZDNpcp6k8i/FggTTGau2TwUCu1M1xna0NWzMH9YacUb61Hp3od160YTU2sPXVnX4CgK759c7kNjbPDNPuiICHxa3tPTS7KAe/VF/gTzXim3wFrn1UJzMmvrarbj+oC3BZup+etRzLxDU+nJud7rT69b8vP8vUjNjHQ0NiMe55q476f3Ytp+6oaLKa9yuffTA1wsWDS5UCWTtr4c/Wfi1FSvbhoe8NqSzU97inXU9vZYYx1/Amt+KQtU7etGAaNmV5jEMP0FLBl/AotpLMiy/KlL1/WEXFBdoOYyxM/J77D4TCwLjI+LQ6xM9qH5W5mnNsH0GZJTUjOzcQqLiIor40VmGYUQy20UJVa8HZKpZcn2lzyHlDmqQo2zLqpzXYO7WjzyTKt2H3XoNHBXXIlBV6edVj3gB4UPIpSCBwcBcOBn807PDeavMV2RlvX/q0GQvkL6LruCqqZKObOILjsS8UC1SpUzr7tGwHxswP4AfeLAgYAs9R4ihgTxhzmpp/fW8iPeqaYsLm/d3OqIjxL4WU37QCRY9UbZiQWsn6mLPKTsBFWyLJKTSkTqiTVRAJe04kOtzUBmprYDPwHeSaHAV6HMS+3sNlojAjJ88WPNMK2cUsjKRJKreEF6sjwiea4iy4yh4JCkkEmf3DACeiiugmN3C+Gzk32uFoJMRYWgkTmwt1u5NvsSGYy1lgtGQj6ZYiXS7L73NZMQ2ciD3ZIC8MqGuzopO9dcJOirhwnvjS9Fr6EdImNhDhuFtExQvyF5EiLM6F1nBJwpzHgB1p+hWAkp5/A5ZdZinE8k50Cte5rnCN9WQ2oFSaykOMjZlylJtThMm5alTxYv55t37a8cWESm6+WP9gqXCJBlAgj6aBTwd+AxwP5U+5HntPVrstsdnbp95MjW4zRbT9mxjJVaxrVQ9373TG3uTI8+8/gv85c97QBylqUZv9LUWWbSsj7MbLZ+2e7M0mL6cqSMOabauGdN/5f//SfeeMpfT/X3Uw09TcNzLj9vZOd05hWevDL5TdRvc+gdit6j7H0aPnT240o/rehLcr4u7XsyfiLrp/J+KvlnKn+m/udyfyH9d1q3ZBVmB8xNmF/AG+CeAM8eoHpf+G0DFgID6ElbuK5J61T1pV1ZfUVf27tGv8gIgzO+/PBoKDAWnShMvhHJTGdmyEPqw+nDhSOKuP5o5xh3fChZPDmZmW4/vx38cva3p/786e9/8Ieb27/8x8/86eaOz/7tt/+AbI3din+BMxP/+e3/7jj4r5sPHf7erbd2XX/kjiP3HDtwfNfx60/sObH35N2n95zZc/bA+V88evaxW67e2P33Z3t7f/18foT9W/uPD/ztxb+/lIntsWIKE29qJABQTPCfnaXqGTNGZ+UfQ9myDsd2LM6tbRfiH30dsQLg0Q+JFSGmjz3ufsmqjbnjof3Q7kgqLvxNH94/PfCDz/NbL8YCq3P23YFXqQOMr6ceVg9r8r0LejO4L/AAF+/YLW5psOEK2Frywa0Btv98vRr0+oD5LochsAGHL6386O1PDJwKfuh3lbYEFnjsfVNVyRLA+/8UyUngEbnSKUVbZSk/HkJsVHgI0swAAUHQBVvbQ9/5G9d33vql79zVpJ5jGCYaSNI0u/SdxTN8Zh3Ye0arDglG0yLoMs1J3wPu/vXHx14uDPi2ryefv5nsWJZOlmozXo8HlcofpbVrkT7h/cE8Q5HNTmLsZHPWidW+0IVtMoqmxppHjV4A5iZwk7hZOC3HcibOxuVxUa7C+uRKk/Gplc+skueYhgQswJGbEpUxyer9YoD9gKIo7qdm5miOWXqIKwIDv1PYc+jBxn9DX+SHex2PX9hJI2kgzwE+/unjabbuxy4vpC8cH82dIz6a/9G8D9fI1vjqDVd//C7aDS3vdWyi0GseOJy9XtHF/fZ1/RIw+tXPFVrxQsWoGofd4noe60sheqcfyVuLRIgc5LkmCubRN5BZavfDBt+NU02sqeRDPreE4s7o7OY+/Ij0YGyRCl2jaCjAW8aYsUuz5yh8qlKZNi84Tk+nsde96pDzXlfhMyelZBR94einn8KlzwRNQ0vHw8vHVW8eqvjwNdusVHlZYaVV/pDgP0/tkiJVhp3Sqe1ToNB++U446ZRjfqp3i1ajm270rxq0eeOtl7rt1WWxOwPg3V089IywVELPhhdFMnsHe4MhERHuydwJYaAXBOdsY4UTA9sLDmcuvuTOsk7lbF7AOfzNnWvjdpzHx9z5Nm1wQXoK/e8WxjTAWAMw7w7QzYP9nk7gqCsBe14v2DkDYCcwlk8dsyr2WZa3k2bTRqviogUvCkFN9H/azrspHogU5ZqgBtiqXXdzPWyeee9ZuB+d0zpIstBraq0sKv0z6TZm5G/FWhKVgJAhEeAN7Ygsyqzlk6uDIS89UKLUTE8TtjeFNhAttCMJZIqRhLKB9i4hmtIoLGfEn3ZUxJuRrrE6XXmXOIlPSii4ulHlpdE2iTjCZSP1uRqBjEH14+SwkwMg5UBRgATFufWjPR8ieLwLdJ5I6aNhZmdgw3xhC2mG3v9AWtzuX3DGEFz7NMDpgujjYD9cZqjpFLoprWiSGMGHWMIGLGw8CUK8qBjMih2ng9plSQ1qkwemFNjMa1YmqLpcl+XTH3vvpanv2CayuSdSynkaUTCiWeaZuqV+oVRXHdzN+2DUDjw8ls4/GCyecVrnDivSxtKBFx1hEjyRF0Mzm5ok6VGAb72rbrf0leUtlEZPolCdmc+ai6IBSe+db5dnSZ6Yy0ouBA/JYga4HPPiijDdkYCRgdA05MFkaH0O4h0tmpXm832zsKNoQIZ7oMIAc8VEEbKx3GctL/S8Xq6Lfcj9IvS369Kk12Vsn6pQBp8Ua5jBdbbfsN3/z92KiqaBbEsd+AWy7bPXoFruYY5a+t3p9rzn9VdI+SdyJCyFbvnumCQENvDyDOaYLW7uIFFIsqNkPiFhR1nsECJDi2JbHOWRFjRwKOvsbPDGHmHdDrGSTuS2rFOftjXiuXuRowfT/SwOzCqUbj/xULgb7BdSdB/pyH6w7/aid58Fkse0/uyPMKvmUE2lHNNPLm+60FTzIJPXX52ktuvpukmzFN8666wv9slcooS3xbpZbjfPL3ZAulyVNUaz2E7UsBTpjdTTuHa5/tTOE4JFyJjS3hQtplp7sr8N4J9cxO5F+9KwwqGXYZhh3y4QhliZBWrAV0+ml61g/Wh0NPtRXz6FX3AjF03nknBnOEqN0QSjPLc9ueehLBYhbLLqlHyCc1DvyK2vbzLk7xHbz7njTME8ZR0YhPQMbAO1jLeAFA/r9YwzLeeiGt6VgFK5U/UBm0yUqXIp8nTClO4abyWvJ+7snll3PoaAhBP8dCW1jdFxoG1Ug+SzTVAHO0OfD6v7eDkbSHMO1D6K/NEc+GWkJ9A+p6sLJBZUW+WDCmTRjbY/fri67U0jcFztHPMusU+SIPJ2SHdmhzaOqxPrVV6w2TskRJ1QSLbLszxaaUkv9atEyG2HBnKDN2huCFZ3281Rq+9Tt1MmM/Ux+56tZqvVge+r9xuktVkv4AuD2R2yR7cmieco2VNDEI+7hXGERyla7e+A2wJQbIzZFlHkRxH1EkVFre9c1jb9l1fwwzVTbNMzxcwN1DqjAY+0MBYeqR+5sbGbFZjkhG/uL8kjFOe8L/kBvHGqpfMFaD50W979bQPklBfxrmEmVfVM9oPB73hI5cHA1d3mJW6q3ayrN7c8h/NkRnVD+fbwTyv8HI2O9soomMUChJCDFeckpT5BTZcVsx4G1uDxPNDiRf36K2RIX8rCzkxnmNtnl8fW0eJU5CrvLbQpSi9CHh3k0aKvmcqAe0hV9a4+7YTCQtdccmYCirAAovLWqRa7vLdk5S/UBuGrWqtg9c/ndEisT9M4xdhsufqBc9Bo7kKnIQdzuxk6nLpP0ZAv5L9zgMJAIRRgOm5H2XHgTDufZ6oFyJb4fUb2QkkY4CmMvOzysXC/qxh22QPcRfcWLKZ+OC2t3K2aNeEZ6Hj0wXRkacuMxx78ya6Zd5KxAJGJ81Wc59jqkIUB2W24EEdHIaL6O7cW8hYybFcpcWCHrKG41OuxShTqPlfs0/9fjKMx7WhLQLMrj39dLRDZgM0edR6vF0QcljoNpclDjvDjuyiLDcHtWNv+BoaPEbe9hndBj864Hm3bZgEDGiT60Wq7/33XFkPt8KumQecPe+N5vxkem/+FFOWLB+QYfGQh9JwOB11ncyM9AKLPJuQzHEIvLEze8YxTovFEsbPY2f43fxZH6jeWLCvXbBZGtqjClFqLYR7yLTxzUozV4SdUxiQkGazlgBPDHSUouRixE8giwdhwhOvSmUdXXpUnEqeSBuvOef5Tsw2enrGNWZ6ZrqLAyp6wxypIiOvjuGMNXXUk6dxYTnNqbbI5GvIoUT8WGtG74LyYYCW2rafrunolyYlgHqvqb/P1psB9M1bMd4WfRUs8i4VYAfLzw31ON3meylxqBjUzNWnrrxmmdK2uJv3l4OqvApy4yolrnEB3Tq/11013g9awziS97rInlVJxwlhzCuchylHX+RCoSu8fwQw3zTgz96XCfsATmSQnPL2hfJxjs+iBWKF1km6O1A8N+W1THlkGXkB42M0xafK7g2qaU1Gnwfb/MmMNWUmM0gz88kBvMN7CsGRSAXylXijsVg8lVgzOmfwOlL1nStnMNYjyL51d1/KgGn93W6g+CcD66Qw+9fiQP54tKUqSQivYeP//8pFF+uwZdBkX8K9hEyzcy49CTNRlvyWEIStjO8KgdQwhk2egLYnNKS9TPZgI6ks7hO8kjfJw6LIHtdhkoBJ4oPDQJKf25FLeU8c7wgQeZBTfbgV923dIAPexdcpEXNINP9jvAeQmnlCm504RvDPxs5QDwFdjv3rBYOfUtcZXJo7cV50iypfSgQ9T7jiV5MQk5mD9uE6PYkVFwHSaLUJ6PupwppOsYe6g9p/pfsClahYCFtQcmxhQB8AxcU106rNFhFdmf9rSarPffbXuXffa67rffsndy4HH6xS2trX6IVavO/b1E6ksjNHRgzOO+aGcyPm6ur9ABK4xfTPcNLMd3dicNeM2VqBo7PvM5XOPer5zBzSGxS72Tz+6MNb1ayfYlOolIpR1bzSNm/Dm2ceIM9tb3Y2EKCrCos50E1n8rB0bYn0yfs/pzQ4HlALVuriObG8q89OZRZccfW8VjnQKkD/w2LPIkfOUbBzN6h+XVl98zH00uHIx2tvvqEtrXXiqeYAFM7sEuYmEAftAZnrzj8hxsnefR1kdP+wd58ejVSyFVjwGoLTJ7o71pdbt7WlQLRrn2mMxfWpPppK2fA1nu2qzN22xHJtBF3YgN33J7tSzDcB/I/pzXFKU1ke1zP6ie4eDnvFEWxhw225f/iCQyshtj/+7YbjX25/8D0QKP9n4/8bG70il1Ze1VFY/sEwj90uvK1v4TUkeaYP2WC9dQfQVba/sdQ2nLtkP7fE6/B2pFMaeXYf/hx0bbNFuv1GdZ9Hcl10ur8m/n2DnKH+sJ1oEyDEdvf/2Aqjn2QPx/Vc+tPe3f7rdXweMOTHbXs7TdLSPtoNpYGxYs++SJH4yQ4RSZ0bC10IwS2s4ggO52UlT91PG4/uEo82aOCKxsIYoSunE00ojiDJynFbTRAG+X6g59yODUR8+Dka5H52TXkB0FEmmLWSz5iRSTiZVsy1Se7uycPncbNHy21pNpMY1k0KSmxNn10klUx3FF5BA806/4NCnmtylM1Ny8OqhEUV/+T3oxEHS67c9lPApe7EBGBtmgbFBwklq+6+92t+//8ftiv+mpv/8f2QtswL40SzPu4/2Rb3/qOdh29E5xRXMgVLJpEXagjWOKE2hl7tTy29qC5fPzxYZ362sLpqTSBa0Ncd7w7qP7jdf1yKmd7YCUjGbXq4X0gtsnNu02WJxdvTKY9osrUpXnyPj06lynXW9de0KBA5c9sckFqcqC048+fPYQOPmM07yI/xnRBgJgm5ofzbvdE2oEboZGLtPgv1iBLH+vnV+S7xTjoNs3v2hMdtJ7iA+Zd09bA6MDceZ3qDZqNRIA1ljifau96zYlrFouTinx2or0+As8SzzabTFr7MxKl1SsUTlx4yn9cT5+Y9yVA6lyZmxcSV7xb4l5d7NgKf7zOHMbAJBHTuILdy6LHPF8WU6VwbwA06CIW6InnM7Ohj18YOy3I7MjmluaYuWz84bNUoa7e1KaW62yLgU2Cx4jw1SHj0F2+vowpb+LY1365RGE6Mmc7e+cT4O3hk/0ftf8ElR+k2NJv324+LR1D6RooEGr+Vy4TWN1LwgIPAA+/ef67m7+/fIcwfu6k/uBhMV71WkX5/B5cey0V0DtYp6NKKIw0OUNeCjudqT3H4rox00LjzwIVlzbKX6zApmXHoblCPuRMTkUfE0nmY71WrKf/pqcP7XlqLKE6+TG3c+TS6bXJp9zDR9RqERNUZQ07EUkbACKmxxnWsMLhew6lNURWe+/g8sd3bvT+pfBMbus8DYHWTU48urGz7vvj17IU3YOxarUo3GxvSmXZi9vbvh87JqwB2OB5ySbyDS/g086hw4S40cX3J4eQBc0ogNpyFnmtfhHVrt95jRbSD0u761dc42t2i+A/mutMA7tjrsWUhtuP/KtRYPmWpeWK8xPFyzdNw22uuOss7VSuNmYFLNv4fBdqccRJ1jwuYHnaE+mLBY/+j/jS0UHSHywdwLvW1iWtc6WeDvL1Pu38714350uxfihvBnlysBN94Rlf3A5UmQRmp2zSK5Sskt3iTnJ8eaWceDMsqt+7EnUqz1R5CjjY8aCVb3m1a5Lb3ug5XUQdEdOvTVAdIPbmkkw1Tx7kwRMa8IvduBvCrBtNDslNtybIAoOYBCk/phCdbDMHdxk2zMJwpWv6GCGrWv/OlEm6kLk6EJ3tGeWE3GqdF7hyMtheZck2b4imwXFAEeEkpO3gb+1UhGxNqyi3WEvi0MFjPCLB0xUieWX0E3xZPbo8Vq9tBunhiV5kwh4Uc917MKSg7j5ap5ekGTZexmqBNdntcOT+QNhejKGDf3Eo9Tta4MJpxTxk1MrCJj1ehYjH9cEsAvXwi9Y5nEXuLYZwmhM3IiqreCd+dLSvEYgbflyCgwNkxvg3ih+MW4jNobunyjicm8pTfqejtTa7Oxs7lyzLHaDEmyLhl7RK3GnayVsH0yhFCnwQo5K9Gm7UVD8dLhseJl8c+mNnqDm4LCllnjh32P+eGw0OhNwdkNcszJ7EzMiYacbFiMHT7Ij3hiyNeKECXPYzS5g4SN7mZd3tLJiXyjmzpdRjEOzbeDbJsGxobREcvNWEEJntqZpJPgTqrV2CO65GRJbQbmmDwXO1uXDXJsut41FC0ZHi4wfrazjTccUlvGvLmXmNi2lBmciR6sFInFDfFE88vDe7hJSET+Kj3is55ZUHwIB9wThXua95gtCL/H8UubEHQ40xLmt/vGZRcmkUW/DOKPqqcj8pI9m2KKseT8oHjtcHHNk7U+aE4JMl17s6jg+9iI8r9bGbr0Eiwm2mvt1FhBY+mhB+zatCSdADeqysNO65KSJXXp2JnsHNxYXTyg729X6UvhdLm9/54TpcXSQYHwWP25mcOl2qZcWjEmUgPaX5oWglU3hDOjIDVS30TNcOp1oOC4TIBteuzwsPvxsnWWGQRgbJgGxgbzIcfionUHgJWzoRB69/yNgT+J6/jxiopQvKp1l5XS1oKZqmxF8OI6mMKBsm/TH5WVyXxiekRIBu7e9P8BkcYiZGGYPN48sEuEIwCyHvEDQdPlXKzvfpmIZWPDxUtffsM7pU05mBOZWZjZJrnU0W8/2G8Hy8Fo1DKQ2mp97QYFu/vUDujSrmkqxPXjpHnHG8lyanTzmcM+8ad7+0ujw6abWe1JiZZxX2akvzvRipA4OekEWG+TM4nMKbeIHXS1ia5gJ+bWJGBCaCTGuqMe+q07WxWitOZjjLycTnRivi2lyy1NEpeeWBGNjeAR4qz7t+m3NrXmxGe2neOA6ccLM6cXRCVF5wQ5Q/nqolGJE6TRbGJhjyLt6EJqRU9fj7ymOk26u6m8dDAan4KHyZHJlfWK7OYKCQ04Jwr3IPf0rZrGEsPQuLU4ppP+KHbV1qYDbdXA1ixKH6/TO1SiogNqY9tnhKPmtgH7Zov1OUfTrhR8uSqMSFKEo8tSeqfjgv8qttvrpKsuLhC7Z4XXi2iSLV5e6jCWFl6f5WoEnmqnhWc/tjonQa8wsUirjrolaZ44u+Ic7J4LFc5Vvt6YsOMftsPeri38XyZV83q+fDxUUtg/+n1b7PdE/MOkVL6eq3E01finFcmtY1ufZZSrBdu13+2AFWH4IgEQR8pAtS3RUHMnkElpckMJ3VHYpiBm3Z1rXema6dxfu/+C0km1rvBYVzimNpDe8xfQqbz2OmXwTHHEDVR7wYbpRGBLkgMu/7/JPrcubJ4xduAKZYVBVF+MGSjSbgtwWR3bh2twsbBbndsHTDSGeWBsmDeePlAMOsflslOKPNnp+zmdJb0lSbXhuBwGA5dXC08qAWG5lfyt3hm8rZYuZq0Pq/O/7mvP+3Jpl5ql3s5mqdZsiS7/9dG1ATZerQ77/uetZQr0/LTq/+OVzR0pujhcT5IQPlOTn51aI0GPJcfvGKqRANZdsEKbD1ZoQ+dW7rw9EBgUejP69MyoZ4D42WeaA2tAbCxXbd4KsymHGXQ7VWAm7yQEOFfhqqDSLdc/DkBGng+PJDYSWQ4tLUu/fjW/XnYoWtG7Jnt44zpJRWFabAFpe+kSmuXAEmQAnxUcu4m1an1e30rvKK+IAR+NukLr69je6tEKkM/PoBoPQRuhcVuRzTBoM85xBN9+ODFM6ghXndJmGZ+ay1p+SqNCZDvEbS8l7CPiLuOzp6yO7Iv68JHqszo6Jb1IApo5vW+nCljfv3XZb2d6et7NFLC/fWsnu6nengx9HdXk5CzVVF+XYch66urZk1STHHC9Oeuh4//s4WiSbHIF9QnskXyyZfAyKoNVGEqktDCMxlajUWrWoQrl+V8zNZormfLjufTtbU2nynUYvulYH1BZND9NqJhYljtvjGUl1QSxhY1wZi6ZTlPtxmQpe5SciohIKZkAz8gLo5MqglhiI/zhpfLyiTsJ5boLWWkzkqKKMamDqRCijcPuEqrK515mgjzvva4LaM4n8uYcI1NZX7F3DMB7zgBjA2BalF9PKphcJj1ijCAnq0OI/FomdadQxNQ3RgkxdR4TE1acp2v6sv0nV97U+ZKThiOLtdiZ9IaSx49LgGZOzFFUW0f02mv/J/jWGy6mFxeeTSicWCs/ZivSlcplBzWcf6ZMC7O41d7kksXCokeNuoJnT7X6Xn4Dj9kaE01rqePw0XIoR+CrQHDprQ0CcMEptjf9x31mwo3tADZa6F9JSo4rhcTO8jQGZGX6xuKjClnu5NUkTTnNiWJSpig5mrpxJQ1SnkbuFCrLjr+S7DqY0ACnyKlMZlETXiA0TplFTCpZ3gRPmKUqI7BSIhGVoQqjM4yOyqAvymhpQQRYYFF8NqFwaq3ihHW8rlwh69Zw/502VWdxq3wpJTeLih416ApfPNO2GUWDw8X6/dHm184R/OoMF9MzZtG5gRyBnwIZxWipFwj49VxmqyCa1qLjAL3f+CvZ37512G+8b2dU8RYisVlLWX1yTiNxvI7dcyffrlrw9M3dnZY/fWdu6ZpYVWyi4lWS606+sMUrTV8EhPLizdvtBHRUq9Nm5v60Fk++0HVn8ou8WHGVQ2WrMx1tFwPbVCzMLY6ZODR1CFy9T2nVUT1cY/vmohh5iT5tp1fETHqlECWqnJ9n1SUxfupNMLsYOrrVWRmrArFixYvktv4E2OlpH4CfAoeiABRZ7LyZLjuSE0+tq1VyEQ+6un/3JENxwmg6jO3lTQuC+Ys5GcEo9+eJu9AeqqioDb+Ll8DTH2RnZh+I4jTy0P453Lg9bg8WoghyTCQmszCcwevGl1YS5/JHWlAnozIuh+Ep98jg8klwZqgHFoeefg+jUILVA4ORUXAWzN+0lIhu9XCrhuDHDgp5QGQ1/cwJiuZXV0NbEqLQrohtPBUHC0/MCEaHpvviko0Zs8sKFWOnBIqy2cTUCZkydUgU8lst3jGZt5pzVfwketPqKuiuBDbaTYQfBi7ODEZ58cnLvGrF+N1L58Sp4zvCt5FxjilcLJJhUVBzB+4u6UYm5hAIqjHSvmxmKKFZAzXP9GZPjBXdKTsFYq25hzJ8/c1KmlfNLCZ531jNByInIMRdjytOqW+ApyogRNfvfgaWr3v2ElBZ/ybqV25e0OALD/U7f8KhCN1jjvLdu7yoBzeV9DcfyOob14Iqfn2WateWZnWrYrIqXQ5V2gsi61Z2aERSzWQ5/0mdVrJ4TJUnKsH0mLDad4YhefBIcoLd9XfUjDd9R//PPTtslnL8fNzmQ0fiNp9q3yg+Rmuzy3O66NIZGp0P2u7HxynIQfsU+aFaRRCHkcMKr2UJ/A5kxYPzpNigN8cYAp6+YrtLYLsrbO3eLFxwZNbdYavnW+vBU4X6dmzXYPRzjUardQ3cFqoL7gi7BwTeELzoHkylqgP5p4tki8WlxDitzs9bUMsXS4uNzUKRw3eyVnD+qrJgxUFVX5irvHwZW6Iu9MtKSTy8VCu4fBV4YG03L//DpcuADcGTYFXz/vcG5pQDQwMmre/6BvqA2ePaUr9ne3vrP2Nvg4wRAawjtazCAp1nuEcJPyVZQy8euCZL9+4NquEExRIn6NorJFG+1yrotLIWknA4YMOlezYAm2nQ7fxpgh9PNN5uPNeqb+cAteFVu5ZjgxFeUeiSBwtXWdGbeD5/GkQaVubU6Wus1E1pSCykweDprt6qXljp5FAPoCWcGzgXtLPjbAfATe4fHhgG8M7sgHJYTi4VhASUyHNyojoLbTjYNzgwaGAGk8nBQWRScDCJFKQZctDPLwIJBmSV47CFweBqRf94f6gROZxLD+efH/0EfbVLChi7tEgCQRlOw5J/ukRgeZyDS1TMXRokgVQAJyGFL1xCiHQgBMEToeZ7O9CjoFeYYJOGBiVCc295ys+39hOvfuQ//AMcKTUNWz2IK1zfNOm44qeaGY2rw0x6vjheSCo5ApX/mfwkUfGVXFV/OaTuOrUy50cixdv7uPyhzlQOCKm/TK5SfJUzwcCz+QZ+RwffkJ+valRTOl+ZBR7mldSqzisU51UqVrlLpbywUfEJ/zFS9m9Zxb9XzdY4kp2CCCGhMAbNzfnM/I71mb6+MuvMU+D/SH7OmYWcvJRRrkxvJhqHRFbEsvB5WFxeJB6nMPZ4llwIIYybitJ293JT8hbklay+yg4rxeKiwqqjQ1VS01gdWVb7SMGt6O7u6FsFBayyymMVbD4hIDDg2Hub+C5ttzburY2/baxttm2cbdObuDdGZ1g9LGCHCo9p40W3CWKid7fxYwR6Pn93yPDb9GXJrgCmnx8zAOp1pj/pLP9WhwbQVxCWH7hdy64KoUkZsUni/Z7MldSV8Sbv7JahOcQoThI6tNPFnigTNLqRAvNsJREoKd+rN2dVaSkDryEkQ4NYvpJjzLUxJmcoq1JhESGiMNDzQOHx9KRTpeVJp4+nFRYeS0s+XV5qVBxKXc+UUKBlVGpAeRqVyUiZcho1V+mLB4h7bXvAdtn3Ey5sp60sFyf0VhcUMP8x1NFhu7tk+X55JF1a31Rs3vGDzObicIJogGB7Ji1jddxXSm9UaqWG+6qOY6vPU7njf/Pz95IdiIyvsRJ1utnyUySZMVIaNdgvEhewbn33T5EYmhsWHpwtJmKWOiFhKCm1/vLB3u6JA+6telcHUXRSkiiVHRnoR8AHOK3vQbgIk/ylITtCMpNwCGOX78VkO46/MK56hGCme8qzRdORbpsxJy7YdX9jbgxnIFztsI//BvZBo54ju1feK2m7VgBWJJQVME1//vWwVVBMBAbHjQjqlR2qatRPV6Q4WCADieJoemhb5ooZHdjUnR/fsV2YsgQzbpPqH0mJD/fxk4QLSAUkckKYrxcbhsbGB23qAxh+aluoMK4xjJqMQIv5DJPlElNpHBkjSOsKA08ixoYBrQtU8tsOGC5f6rqp13fdunipc7FNSyI0VFYTmkj0L7nNVVWEerAxwdPzwMFV8y2dXWogSTd3wYewvH0IAT7+P4N7M9rVOapd5THO9jReXlRsqtwEWwnq+cxyb0oUoTuFZu8bQoV5Q3FoMquIFYyOgHpW+HlwnP33hNGjSwNIbNmO0MRgLD7moQl7FSOJkjBUDvjqUpRX6jzqQszqa9p/1N3uFL0naM0m5wdhYjz2+qHdPUKpxPAINgu1ZlpaZ79dea4Ss+HQigdYG2eSAoNWkikklQYH6vnemRsTaDv2lbby5lujeSRlKEVsAu94gfALIMaq1audxMFwbA4Kk0dVdB/Ule1gsXeEUdlwF7jTKDY1Kg4URe1ZXa+F1XI7QClfUBNCSkL6bWNitx9Z1Y5MDNuBi1MH02mFMFxcRDgqoWiVHrPdnemPpCTVhPDVaEI4FEZHh++goWHQyHBMKhQd4u+PgAXD4DB/f2QIWL+KrAwlp5ggOm/CA6D+pGCPLKYJOjk0ApuLxuRTmJSymkieUYlkfSIZua+ijXdqZzR7pyfCfRvKEc0SoeGMqIhwMhuQil1LXJm3lNuUoK2/wrkCaM4XQ4rNlpZASkCFkuNyvuKYB7J5h5a4JRe1SRfe65vWjM+l/AChlICssP4NVfBcwha4ttkDgTq27XxTLukHIQ+8F3l98j6UAPFm7EKPemFlxS24hr1lakdsGQNZzaAwUFWPAqGohIGomnmQ1SU/MMpI4SkoCjI0lUKEpyIpqIgUBOox6ZNayoBftGNNUoiyTSq+6Jwv/ukMlPIv84weOYP+lwfr3euBq8bBGWv7ZJrFhtJNRUY8Si5tG2J9Y+T69bsIBUYxDCmI0smPTXJyDL86lmWVpgTNtTHMGCvdjHqN3BgrGRD9XLogMoEhYIgNv5J1SztBr1Yg7Q6cR5pYvRZfvrQuGwDXl/raqczO3s7eftemgz1lNNBL0IVeyAdpQOLOFAsYCQxBZPpcJQPS5t2Neo3cfalZ1ZxLWUppln+jHniDdDqggAPCqCwViT+7dbYAeVDnqqcAumR5jtTpdnaZbUNTTOnSXtoT0OPElgp7U+5ZkPtkR7e3d2E6vWEJkWU0cNCZv6QjHzx2RSfjctoPSSVpEWePaPqmqQUCH1ktsPZjglRksxMy+Z3gpmU+JhN7dc1BhPIR7e9yjwB314TYJtpo2i2EwfrVsDWrNKUs/u8qs86P4W7Za+m+nZH/97k58OJRm1uB0FFOuKxjdllyacLfSgi4IbfHM2NU0wHGVn4YjJ8iNIe+LsytLAXMc60CInvTPxIdACXd3y85B2tzjSZWvTMZem+yaqpuFFhY9uDzUFgpVuLZMYOPVBBkC1KFXhjY56FQPD5QQ/zzn0hgmfilClvVfdpSp9BFULbAVhIHwB57qiJ42Nl5KJhh93Kpb1TcUj6Jzs2k5wOfl9/Xu9df1essLv5pAfKW/Qn0JmGwCa3pVZ34u8S95NVAMnve4uIjFi5u1HttUJ96V83ygbDOEe8up7A2jkiQYoxsBTJyx5ELoIjFxMViSuNwzPB6p6lxsKM86lMQb+2K5/ePIj3q6RXZcpIXGqqPPg4qt5by4C9vlPLAiS0SXuhBYSoPrGUzHY47hFE06KN5RsG9e4z3zLsIIoEA0LGLWGOK/k1c7t9oY/prral/TyP2+9Ve4PQ6nvGn/0GC/bq787f3E3nV11lAv64LLzS0cmVDCfJg/Nk/aGYEV1o3Aw9rgiqY+s94I0yruxPtcYd2cSQ6cjsIDXmz+N1Z5TNoXzGNJhJ5tMeqMTV0Zh0kCtmgWeIDe4Mdbd+qpQNbF2ljNVMtFrRn+TVtKoLqyqX6rNRk7Nk5LjSyc6do/utqxa484tmNUMpuveEI/x4JGPF7Vb9QjRZuAEPhiSkH0mR6WwjCNWAUEO1AtT6c9rSO6mwc/eEIZaCm4s/CUAeh0XYWvzv/eQvVN1jDxR2PuAuyJO2vaZaN55iAcZoVPAqEAsUcQijl5WEgRCwHLZZXZaBd2mkT/VRnxvSH7uJAcZD+9Lf6LxMTDTjp8qzOvY3DyJMfHIhqNPpiB6r1QdVVjlHHL47tDTGIr2vtCtEufKrjjmq04cYHrnO8Y5wU8ajmHerhz1RKkM7J/J0rQKpH5VPDrm+/KgX5abQRDe1rtNJtSr3Xv6xsWhLqhs4uuNTQ+knOssFBZM/3F2RhvSKS/2rC8pCHZIvz3OEy5wmqYYXqMa1teACVWuNrTE9YiDzZtB0fAsLDIXFykCjDOi4bmtg/rIDsHlzB/iuioE1jb6OxFjpBXkt7li/WdSVtmen7w2AxEztCYYyKbhFX9xvvQCTUvAKKmmhRBM6ubjAnv9WQbzKwaljKF/cPe9KL2VCHutiSHcbrfiXSSL2f4+tRO9sO02zTHg1CsJTGt0zyB8Oj1WPW7lBylLiOzQ6bfSkA/cX+sVcRrEBeX8J3DXAotKRpakbiSB9l5pQ+ypoSnmGWxhyF+fPBD61dJ9LW4Q43Pig/+xAdVI9D3eMoWrGeWztFQGhXHq51U7bAHx8HXasvVKNVmH3GAvERAeiQXd8JnRN+WzrFHMcq3faoRkqNEsK4kzAl7UzW5oEZzjzgO5r0Ahfp0S2HrOGLZKPkOEmupeTJJN/qUM+SnlfWlX+GwsSGn4aLUdR/1JewY9zrE06WcbttMziAf3pm4+xF4Se9pkvvDa58fgcOoROh5NASRFa2juAOVzyUH3a39jckh7Ez6DDu5UXG/yITfjZni0Rbbcv2D3VMJ0e6Ecssh0dc/Tri69tIqK/ntpxLPLc126LP9s/tw8aMAEJn+60XePPhmzkf5KAfgI/Cq3LeR2AUR2mC3rqUpBWu3lhlMoBZNlZYlOVWLpHmzjLXd11wYApumtbatfSUpCd0f6IAFi/6/NGEGqGUYbsigYLbC+ed14tEAZMxiCWnJbvwcT8+1O3vZst1VHdc0cXlcTaQdq7ik5Ar55ZyJsLWbMul2Z6rWuHq5fYrckCxg0ocUuqwMkeUO9orDsb1yvuSz+tpK4rHX9xeHH7Lazrvr3c9YzGmUZceTXR6n+wfaQFvsLGFEDzw0COPPfHUM8+90OplkehVXtYZdtiQCest4HL90nbnf+3aP4q6+thUMNw4/05j4ojxdVSY7/j9+KtU3981eXl5BpgZr4b/2H/q8pH75scQAPMvdwoFjgUEwCogF/W41bVuVdJdg9hHGNYJW0HXypaWdN9Yi1AmnRrc0tKJY3GuzXYEPqzh3Dm3twZoTlmZXHHYp2l4EpY+Ys1JrtOGhDWU9LHAHipSX1+X3B4M1+WVwxP01lm0VPfhuAsCGSRbXPrq+i9v26v5oAIVOWiy4CWwHC13XA/yOGdMqS0D81qahtlaW9zXQUmnUlhMvdbKehzBOslQalDuSTpCPl9qWCc/yRwER3gE0T3gGmggSnKl+6EH+ODF8IoTMVFUfnFX7WW2Zj/YUmq9ynHyupDP/GHdZ/IED0YBUkb8yPmP2Jxe6V/tuJqGjjStlO5HWbjBEi/lanxYC9z8LTTyEQHKNBqRtvTTVVPwKtqaGBLR0DgZikApH5RyUU9fvvVwNOmVeyt+CaTMFtaOUDloHWHe6AZrwZeWNe9G6DMQF/JBK3pLfRz0aV34GVv1ChSva5kH6nOAaF/P8f1ZfKOYLw7gno0wnZbFlwMsKYAFiGIkJlznIu4G7+pC1gMCEJmnHbeNIEtsFOygbRRar8ZQi4s0jci3p8vogaait1HOhjJp+zxLKLawCDQVFC0ZtMgR6MYRfgnM3rSqQ0jX5kwWFa8Mbg/EZEZDwhgZEqOW6/u12vJSkdIq4o+k7fvzR4rkg2w8QFvhERRVBAWH89hcW1drMNoFUPxhWTZ4Xo7o1dYYiH6ZlnB1F6A5X0QQMGf0oID2vzbXOLFmGjoqKkCCw1tLOULiE+SDkmlNUTtgnyIB8dVSEomvkN4+OtvJ3QVpltgSP1GbLVSLeCBPFGRQC1sgX+TJwIN/JGIURDb3aPaMFRumsOwjqvB9TdTa9sz4NVa134iSZHM8MyFMhj4AU0MpQwdsggGQ7nyBjYro0Prz3S6O+12knBnDjXoT5lu1ikyDWx7tQIzQovgfMWGxRfZcj645wg+0nKiKsMLytZx8voDX3leiDY1yQ4Bsoh7ZeibdHU0W1C1+1iCSfhh1CpZYNsGht+g211uOIkIKESa6VVd1n6OfPlGvdTYD9G2Cno8KGjCa0QOe79WW0TJYARjBW4iCrcADTWsH4Jl9IuxZ2pQoWk5YRRTgkwQw1DaAx0IlO1r6fh/N8RIeNlz8E0ZBqRDuVSuMYu4L97MhyZDKHeXFJXum+RlCskrZC26vTbqm6Uqh/V41/HlDFCNQUh4ReC0bdHeEJgu+wgGnb6NO6yXmOkabuklLy9HWkDYiTLRZV3Wf8dMn7mid5oDeNkHvRQXz7YBfyxf4W7kdtfgf6nCNEmEZ1KMgt+vMGNvvJxVphTrks94rwKkEdaoS+7Izcaktk8t683iomOm39cH9aGnTZ6tl/6Od42lj51O5A0n36Q/W9zkMsD+EhTUGV8w/Ks6JngctHgJ1KLf3TxaEr4zIBzvds6ujm+MY6eHqwfXf8e/s5/fWLeer7d8K2p853kXUtNyZRSdk3XV8Tgt2HFu6bP9HnVsQitljwAndcQPoixtIvouD20ZSiHBrpBZO4h5BsZRYFlVdKgJW932ooRL7w7m7YD76zyVcd3yf/mPGlRYItUGiPfIdVeumh3WgKavHGDl0mpi40Vd5tGu82E/6Bdf6Y3/n3RNQQsoiIvFOnI76aI1PMTDzaFNZlaekFihEG7RFu3Q5Ccs4TVmYlSnL99m3ptgrWmTb1tJbfuvbRnGMuqF7e6zX9GU9rEd3Vc/sRf14P9cb+qPtFe5EH6Nhf4gXii4a3YdiXCxJY9gcdj/pilfHjbyK1/E2CZZISZJqMr+F4osTXNq9lLNKHD18EX9FJbYpHoVW0io6UjIriZInR+5c0naICwQKQUJoECEkHaKCVEP0kB7zDPMC82rzbzOBNHXNZek96RtZ5FrO2kNrF2QG2RPZJ9k/cpN1tuuc16Wt+yj/W7HKgmIhsJBY5FvUWLRZ9FpMW5xW/KJ4pPig+I8ytQy0RFnmWWosd1oetJy2PE39osRasa0SrQasDludVS4qn6pg1lhrlnWCtdS62LrOeq/1gPVh6wuqW2q4DcVmzOaL+j9q6lCbVKVS62xdr+O1TE/ojO4xN5rOnBu+STV5RmPCpsGcsXfbYxtlE63Mztkzbp/zrrgjF+XETu7KXdil3elRz6htJm+meYbmmP02+132r7jlW2K3PDfaOJQ4mjv6OF40k7d2bb1gvml+Zv5s/seyysnaaauTr1O4E96J45TilO9U7lTn9N3Kc050znJWOWuc6531zl3OI87HnC9ab1mfW79YhfsPG6hhCVahg1PgQQoooAKUYIcQZKAX0Jd/4x3/ezwyvjz59uSu7/NlXuBz/ceVHwZoGAI58II4SENh0IUoLseMuyjATCzGOjRiAjsRxhDy1EQayjQQjUQkpwoyk4+SdJEkasRcNMUcD6Mgpkd17Is9kY2VdCRPekg16WzCUzwVc2Z5nsuUJZ9kQU7PO3PPat/q7asXCQT/CmH9jwYsD/ANSAwohuKgYuh44PpA18DEwNLAswUeQZygwWBIsHtwLwwCc4IFwrg5K/mlp7SVYOFLgZMVPM+JWz5jHidzLpdzBVs5wL1Mc6Eelau/lahCLUqIVEbiZUtORSgZ0i+1kpH2huzntLm2eWtCzcX23va9TbXfdge6z/6X/WQ/PdTDFxEkWEIiiP+JWIowQ9ggHBAeCCgiHIFD0BGxiOz252oLYhxxHfF/2RHIOGQJchr5FGWFwqF0qKvoILQKvR89hb6AfoD+C9P7XIKgEawBHIQABBIAgBNrUqWrPgs0jBqJbH9PrOVoQK0G+hIKSh6x4Puo0VCIhxyy3wbPvh35/DGUUSskM+BE+bFfmg4qezQkCG/xa8w2kxARJZJhhWhzNAr9AkWhClE+HP9HCMpVe6LQrUEIolot7RDQVwkGeYBkzJIKPrrSm3mEyyWJN+UI9zf6rYTbV4HEhOsKBwSUEzGOsxWyIILnUO3lZPiUyx4hQBAabh9EtA9CFgAIJgoUEs6uUAQsCmyX4ADBnzSy/hLD7ROvYzRWxT/YL5Zt1LiAZ2/6XQ1emkbm3Rgfbgf+c+3qdNxTJZ7aX7b9G9Akr5AFnvCRCE4f+wUSS6J69Bor9zzwwAu9MvD9JtZKfPTKyuNjQWdgDtxKO8PhYe9q/eUYssNtsTj0i2TD/3e+u0iaDNzQSN9ldlRpCecX/TkAJiVzpRqZhr8QS/cxdKo3n5pzP3L8hy5PFHXIbIeyvh1wPGerf1VgVtjPr90O14Zrag5rCBBx9i2BPCNNkryoAHHv7bT+VYF6Vg2X96edYEmKzCW7aqtWZHCdV1aQrC+IAajbCt0OONro1mLVWe2gQAZGdU25EPfOsxdBXy/JoQnWmea+gljb9uJYkkGuz/W9cEBzfR82Kaeu0Li0r8YfDv3Hm7gAfhRnCzmM/XJ4l71EM707FlIgsuXHygVwaEdAMGZmuGbgOhfdlisQIdt0yarAkLQ5zaRYRUimH8wK/Y9CFD6cc/MGKV2foPrUp8eChfgeMKdw9mgOcLHDGeXMczW6A3i8mJNJatYC9lWiRDi5LZxk80adLqifbsPlvK7vl4khmdWyGqrr3CcH/Yt3gdWQB1Uluis0nSMS4Q5UjooW49X+676iADnA7Al/ej37fgnHeJNzSXsmN7EhirJ2H1tzhd+556zYxc2M1t7wx0UGmGEtqLV2jS7NvtUPWBemBE3uP9Zel2VfEcjzdp/ZU7JayPs0Jbb6mw41AYno9UKk20xDPfTXQNfAWfz/8KZf7Lsfh7Y+pgl0f09UnmnpFO4HfjRWSe0LgRPNT4MFVj62KP6JxxTfwqjib3iBYjmev/plVrWIJ08seHOBtQoOuHZaU0wETYEEKdchAnVWVQ7tHjg98EsLa9PNn+3cheWoKL7/iAtuNsvMqXYOi+EW09lTxLWxl2Q5MslD1u9n4pqhYduHcliWjsS20kbnxiGPhbUBvtsgRBj//RDdGCuDlD1L7tFwBlw9Y62e31xu99fRTQZ89ooTLIDvUpqLqlWKA2ZphamzxkTLgTFq3LtGLg8bbx+qraLvxXNKpZQBsvHoU7KuCR3uRGYxEtG/UCyxepC6tclLy1E676d7hjsDgS/Z5pX8u5TE9TfvA7OsfFwRVA/kvkpU/ijw7n3v7nv7/f9Bs+COFPA/hWiPvvYcDSGvBTwkCJc+xQO9j+SzPN8UuN5dII8DAsYJOJcUmOSQLkUwTBBpdKKt21or+oZA135OgG1ypHJ8xS6sV/wSk4qn8TnFP/C4IosrFVdgXeNVq9LELV1NP28DB0QMhbBTHLRVGmmLrET/ZxfAJfHsMcrno9ZFsDKTSuhssY3tvKwjOpCYs2lhYsGcICI2ZbsRu1M4h3Lk53ONFCqT/tE4mYJcSrxABCqdIcds3hDFHSgTwzSorXvC7zLu2/PB63wMEWiIVHFu+b9DrzUqIQp1WN1r0ymo4m+PchcHbEex+l8K4hCmiq3+YpPQTrzOPv7+GymB4LdEEi2EL6bqysiKAfRJgkCSifonF7oi8hvtt4msjmyMg58VfoaRhugodFjoAOlm2GpBhyCaBAhejoNAxgE+bzg99P5EuQVQ1arSsLXdpje1jDJiWuEFXinI3BKMJVQiYeRJvOPNPgCBZ6RwHzxbBxQOJ8TEPl0Vo8VEA2Rfh6kEJF/+lLg7TpUMScjLTN6Q/xe7h/JFtc5RHa+JhkMBHICOIoqYZFG2I/Okc2TCL1keHsVpYWmTYmlqejhrbyQewUDtftBoY/rjufdpMhSeKCClLvgcovpOgk7ejBSLSXmrl/lqVbOjzM5QQRlDk0ZXrv/07CIxIZ7u6+/5tnyG8p0iVXLfekijp4RYmubUsvK6EkTUCcXludVbMN/JioTDGCh1xwq7suFQP1UVtUR9sLSS92i3ZbIIz/ZoTAnlNaABym6aHkPjMsfIkMpSkI8FvfuFYB3mxcO9Tad/DY0w7wiicLjl2Qu5ZILv0MAL2xhI9eC+Pl4ud7ZP+V2OpMHaY8kwokBHXdXq6X2rIGOCuV5UFkINMMlPcVuJhs/N2Ah1jhUzwncfsvrcHhtjruyhn9/89KGxLdbs4zUnUV6UJliZIu4thyRzfi0E4AjMgcDJk35UPb63ueqDpYoxhvD6jnChpOt7pPUZgLVZCYxWPs5X/BeXN35oVZL48Jmm71bCdbDYNPbmRNoQWChykIaAOHFb8SziSN5r/Ug+PWsXmBBnowaM/nI44wUQCSF5lrpM+K+BeXPOX+7GYYRQfTYmCVsRRB1ThacP2VZhC+8KRNmAMF3v9Nwz5nupfs8yUNl4/cQWDH+HkdGDiFsR2DYgNueVlnWAW5MQCW/S+kbA8eY9YJ6VjycUSZxV/B0bFN/GMsX9+ILil7g6aI5LkGrNx91eAV/7TYOluGr1663YEbcdX/DFPGsVrIdjFooNZ+mePV5x6k37/dFHASA0FiZZWQC0GkAQwTLC2vBtttpsBtNqxUGkX+xNVxyDcjlz5bzY45uMYASKjkuNs2AIi3qft7HZ8kycHqZw+5cCMxQjPltN6i9qbi+vTWdAqmIlxKFiam32j/rOkDDaGatiP3v7kiB2YrAvD6jQGY0PCO0NMOfGcbqxobhDgD+g/1EtGsuoh68BSos04XD3iuFNT9w4a/za0+7UFnXz7zIgU+Rscp3Nk7CAbidi3bZEvBVwkr/Vv8ORCNaS6Y2YcWEUE6ixYsN8YwoQTh5aQ+dnGcuExVpoVx91zjJDGlBZovApwW+Ld4M1sBQ2vKudN9x5gn/pp/qccb95QS93KiFu2Mi/5WLtOX0ZCobrfSQaNfjv8X0pqNFJgO7wGlaeAGX+EIWa0XrFCxQFHZzI7qHRl1ygXXK2ZLXJGUkE/ZEItZuKV7Y+6wASahoQCgoacIRzZxzsB6n7Q07sSpH5uTi04PaKbu/TXoGWKLk+24IkFV34MNi235NglwGJ3W1NP++CW+FBG9uJPO1wPacyJS6UaGsTAeOYHN1gI1nGzMNawzoHdst9WQsL0T7wmm4xpnkbO7oBtLoLxiSCINaLYqpbO0i+3RMrTkitSmSkmMrY3nudg5iUMQiu2zWztKOJiRXhNNuLX1hv7wf52Rbvup33IwlEqN8l4pqpPRWmZGUx9znvzTFfaZQIMfbYoPMRfRJWZWud1b1yEErBKG9OU4HC3TScvDMWX2rGxiHNmtce7AqkWtl9xkEXUcSf/AASLuom2oKlpbXMrJTcIAI0rTafENpX4Zy4qr1xG+BIvlbAJ43psTXv6ze2/x/ehKNAnf8loIrfnrgAjpQVBPHdpr1fhhCqoID6Qk1GBbURzn62aJuGfmKfOgN6ZMNIykLJ73W+h2FnPisq4ckGhAPOJf+an2jneLG+/IZLM0VKqNWndTUjahQckI2o1FqdggINDCrE2DxXRMN6CtbjVPUfelVg1xuI6DfQ52hzu8b9jI+PKz6OuxU/wYOK3bhEMYBHf9O8n+AexUs43ui3alRcu2vBY33WKpgK+gHcyP/FA0A00RMb67dSQA0vO6vWPILoNqAvQtDS0m3M1NpaAdUQ64P3QBh1/8zmHzKlVL7MEbito/zQTC6EqX/4uw6BFieu9enLeguS0BxOp/h9r8RmP2rwTLBRS2weWLHVW8uLNosV8Xsclr6xduF247FETaxVp1lLzibpurJ3zvN3/L7FunCMAuoiBLYwCbmnXG0mV+Ben3X9ndXR2JT0HdsaGndIWd8D+vaPF/9QKcOfNHJm0J7JHH+ulKbz0vFnq3h2e2o0VrqLpMez8XXHbQwyQBMoac3tEoGxFSTtEoLyiGQL+KN0viw+n0JjeKBHD1K7Y7RN/NePabNZoDOY+7GEqvKNgkdhgm+3bsFXVsGFd7vsHGgV+QsSrZ6BgTVpFkQQRN6tPVAAUA/LzjFPtBgvJkT76fRSbTrepjFpJ1e3KRSI5rb419N2o2WuLlrX3i+mG8ALg9pvSiEys0hjjUZtWlH6tWdB9l/xrPVhp/EgOsMWqp/AIzcGpJWSLPiIk52ZfibksYLQvjNoJirqcmXXPfHpPq5YpyGipvXLCpJBMaj2S3jWppabNJkoT6s9gL67/ynrfjFVpIIPHyUjKEoou68D4OCFwZhHAAJfBGCTieiJmZO/qjb5W0ZDHvQFpRJECgOvyOsDc8rpK7OSEryyyoJIehp/8RHVao7VOLl7z2n0MMigjkO1iAkw5FVGo/SaYWym/k9tFnylnSWnQaRCQGJxCHz1BP3aU1g1fqIS3K75lUJ7CoXGsHULvrjCTVAMC+dWQtPLPDK/hb2vauGs5Id6lIj00FzvtwgRCq+5GzwsLKtizzNaulhrhjGYID/5wlBSLqF4n4TQu8/6S7akPUGyvmXf9+KnoJWG2GBoaA01zvsYAJfJT3toGhhQfBIFZGv+LcVSSSC+mEZRcY/T3vCoWm1joGVmScoajE8Mh4Acl1KLuO0Q6m+gYBM8ZMZ6KjgV/26zp22g2rLNeDTaKX1lAf+6wcgEZ2UMniVTo0uUw5PfKcG6eRHjrpfKdWzNgNpaAaPMj/4414SGg0xqaG8ixEPWUuYFUdY0F4tkS3Iwb7p2VoTvrKjlTXc5rGajjpqAkvBEBVnwj8GB4G9ZqW2I++lp113pLVxHQko9u9bcfXubGEjJYIz1zo/xdNBRvWl4xWUNe0fN7S1tpmAG532LDve4EOVlmPdzQykT11US89aI1B8ZXW2WucDABficM3IwNQ9R3Sx6Y1IhEkuNZifkhpCsOtSQtEZ8PPiuGYJpVj7+V/EMvgS5igMU990jOfhQSlbFdcCaYnIlYl7EF32OSMh8xsZxfwbcE1QKP8M/udLuMhKqZ6NSb35zUq6AAuOAOK+53OaZabP+1UID3ghJis7p+JQMY2OWbPfB9y758Bm8ocI1J3Yhx2kBOjw3Ei2RFAwTLocxT835rXZIqcbMqZLGU11XyjqeP6bq1vGG682t4PZymA3/Hypjz76DuYBwXcXKHrHneullY+zpa0lkOfrbJyFB4RMA7SU3TMODrLOwG/FYXG62qVyUY0dJ+LCdzkeXmfr2R8wTFCpJ8Lbeory86Rcp/WCkxWJM9FIkXduCa1pSwXXh4vCqB2MlWmIdGwhoTsvJ2JNUMBgG/3cNyssoH1KVRSkf/zFF1k/LOuWzBbJo3F5OneHbXvsQ0bO7txStS7pRLHWa7VTVkEy2v2t2nWudtwX/zydKfxtZkqpo2gbjJp6IB1xIofygj6EO7nLk2E/aLxo8ng2Ot2kDc5aDzHOuEDVdQon2E+oxAV9lHCTGQKM4DO1emz1e8px6QAZjE2VAgsFj/1dN1I3zajiyDOfoiXLyYOR8ImgWntEvOkzn4KpuYVctSPXWhnQBcue6CxdFw5lvdlUxIFjgtPBWgWI5mBGmTPEA7pM6SYejYuCgZCSP+ICxdgqc2gmE0qEeBpvvJDbG3sxHXP2H8GVxRUn/0NF0EpbwNwhAPbqeAvYeGaWNPQUtl4YuzNjWevPsouXIcgXTTlxJtNtDXutb0ZH0GHxba1Fu21pR7SxFROfMBCWTgYpsCC+PqKt25LTmndppG4cOCnST4cwZhWu6kjVCO//VYBvTZVzEwCJeOLPcFk1gNzdHmXdvtlMykJTLZ8o4JSkddq9joIwSEUU61OCBI/gzolnAQD5vEvi6p1MPbCn5A3LyseBbQVwB9UnBt6PO8qEOVrY5gtJORDTF2Fj2Rd0C2qYbCnnYViYE/7bHPFKR9rTrks7BKjD0Ha1C/vOamixYm12B0BL6uq6pk10TOWyke8W3XT44C9onNZUOl8Vy/MEnTC67Ur9t6veDDG+u+5YzsEmzD8DalqJYLmYkGWRUrTBpDCUVW2x6uVN3zzuXwL/bS42XwOq1Fche7PzRdOoszIXFOeewXK80LQyq4ZQn1Rbrlyzy7woCdkFpTs3Rm9EUJYmfxPtEcF18jchWZZ0ILz0A5ala2sTbS5sFedt8LCF9RbJgbmxh2HuU25HGC3mx7/dWsKB42RTkpUQ25pzyvHBWPQsCJ7d/UVOFzFnaM/WdsPj436MwsX3uSxu2/AZco7xwYwZc9UUr7EhZ+IqfYJXiUXxV8Sc8s3GRVcHi7qsLftxhrYJNrvNW72uEG0RDMZRFJr6M5ff8OPSFaReFSozLh5SiKioECnYNESsMWpcb5BnJMlfWsde1a5RXc4KmxEzxOp0G3nC8u4MA1jeWYhUaMhEISPCeGKo+tFiPxK5egCbrnq5Uq0N1qaHFjoYN0FIrcqIiU+u/rx+O423+Uru+N5D26NFYUm1Sq59PPjbkoZrLXv6UxzjcITwdIFO4dEiqfiEryenuygzdZdfEJqq8sVSMbDi0rcZhgcUhmbsjfRjPZ6nZNetwnh12vY3odrYma108rYCB+NXtyqGhQYoNulJNbRtsPKW2Sa3K6bFaT0rkqeXc5oDRWPMsfXBZ7SxtCQ6KzyMONi776sqSqmuHMpfp6gkvRcu0qhUmjKGkzK4+0IBNc96xa9Cr3ej1TcNoXj2njTSfFvz2REZAVWo2P2gDhGBGij4T0DWuTKZRZw76vO3QMLZAg58EjyS+wcBHAmSPI8WN1Na3xK3HaC+ffQSmqbaHkQTDKyiU6PNAZVp8s3Yg4Ukl+FIwlFgDqf9eYA2ITSnoV7mvaz8NCQ5Z4sEB4czfKnhmuJ+eyBDY4OPAjludBB+FvjlJWK71oBvS0NHs6/moaE5c9xMZB7ek+vmKUUwp7saIYhYfVTyOixU3Y3kQAmJOnO2c3hk4WJNebn8yDD4aj0+yC1bvaPgtsGCfNuH/0OP2diZhOCju9YN94qzPusQL7CnT3iAJuvr0XZPzfNc8H+TQayRmNgvvY9nb8JMm9SaMJSth0WfLvVFtDQVbcKoZh65XcmdWKrJJdXLY7JsbVgrcRnKxHGsSHLKcvQ3y+jT1YHj9gMW7gzO6aQnt87j7YXB27524pjBBXG1AobEHD6zxhUehvNXabL5UspOhqBANkoVHh5SLmAibwwaggzDSk/uAJTwevupxW0RoLahoQma3asU6xUzRY239jvYTOoB58EDcfefgAxfDBOriyX44gHjcLsSlC3pE3kJi1wy6VaaH/bM0A3wrMWswncqcfDTFiMVYEnh5nwftuMMMt0/du/tuPatuqa8N6jB9CWJ2lbRMaG4MqzoOfgmNJLTSTnOhl5+vIcdKltFQ8IE+Tzlka6iGBsYFzEQiLWLmLhtdyJgffy04VoqTjDwHWL9TxJvSFTVFcFD+zdX67MvK9Hg/fFrQDZJxpW64uL8bdYO0AmEt+Mij6y2JwWr+/LgqxlQohFUGVu+wVcvcYHMCh62QYvmKMPbwByuQID/Y8HeohEXtRls349eshmhBEhl9xbobBke87PgUGBJfKjJZWkZt0hIT6/DY/84xuWdJjUkCS/xLF8vJ2UxufGvWmaKGoEMc+8ypNwXabITrLh2Yx8A40n0pY5uHPdZtjjVFQDtnyw4ci0eQ4ajghfB+36pfTJRVjG8YdD6RU2BPKsMP4hox6OuBYBx0HxQuV8AuzLq+tnosVTyLzyv+hasaV1mPQtzaueDPW617MBPU3Y4vd7W+/yTNgktIwzkyK6V8OiBY/C4YgDpojjtyrQ89J7Sobquk065F5Ci0tFOg2ir4yMnscTw8rlVOwV3B00ktRSg0PGONarvC4CvY1LhfeIVQEVNxsLLH8eIyVrdYzzP7pekXdYwGK5d9HTVzPXj+SSZ376csJxernvlUmkzH/Vo85+xiPc9cYaWPXIAfVaWB8rBq076GM9qXS0tlrWH7NEcjrcnLlHOZQICSEKPm5lxGvcnInQ/D9nOwVYmjYE7EkSX9VneAp1HJtTr4fDB5nb5iLgOF90DRjIdPX+8UgkgfmiL1wshRbuZeaDrzF1gEdzK9J8UOhnnD1nC5amsZ8+ttC1s6QGiHaWYhMRNeM/F7kasbjSN6dlUniBe+Yer11L8XFeRSN9r/z2rlgEkrRqI6qQiuyNdFDuVcFoPVE+ZybexS7XmjSYEK5W+tsA3vQ6azl33qXnfNVk31tiNYxim+6l0cXTdJrFWzIGkECrvytgjHLOCzTihhSNbbya5iHLJq13tQqd46Z4y0bK6WM3+tkW53JBJP7BnFbOC+cHHvELingtvJ/djU+S9YCZt0cbgI/Xg0MKvtFgmkXbZ2IkAKRe2GJ5o6za8gfFdWQxmdNihBtzf8zoG/MJbXgDk5SEMn9NK5NxuNF1oLHkCqn9pXi/4lYx2RlS3Zs97G3Tq8UxaoM0DvdOad5Ebz91xmdVFF/+4Kjp7JqW+b8W7oFidoi7YXNVAQZyeeSEyFsXqyWSeHF5NpnkzS4sN/Hy7chGhe563zf17o1mLqhPZ9gUi6UaUMXiCerHTipAIF6/HPi7nUkakchiIN0pjgUhM+nx6Ee954+JtyvzZgGp268j9ErLu+TdUNHzsUmBpBa3qCPmXKmSmZ113kKm+GAwgqR27rGarMT4TEFWUsEUxmPzVfOvYQjXJGNACqcrGL8B1nBA2orPEmJp0X8joavS2P1ZSx2c7+an5YI5slBQOyc3UcQpS87dNSaGMgTMJnyO/UgHPQYTaZOt3ZqHWHZmkYUlM4MjNb5zFXKA02iLPIek4JlZdpMMU8SaJ+Mc0iq7vbkMb9NC7koqQQflAZzIDbktamUjXjObLwuqC/ksEIRYkHZ7BYdt8ijFjTtMt1kiYJ/g+NY3IDvI2LOHv75UobgnvaukWqlKEOG60rP8KEcuHHo4VrjlTfB3fnOYSYbEOyGbcxgbZqaoA7KjS6aJ+GCog5TCKxFQFx9QzEjElNUdSPp8Dn/SinTozXeZakEnEQDmTC0cRSlnpSLvlch618zCjycf9KzvMivr4HCZXrSlHR3MAjGfhbyiEwiAA9uH+lTPp8Lw3ZXVA7VlHOfzMAxiV4DzHD8bh/QEJBPw71o+64wG7Wm7Ss4qQCcQMrSORFoNGT91tZtkhCRh/A9k2AYzBLUS5uO5boZQvZwE1ny4o009+xptXzphn/vq/uKrLoghZR+ZJ/3Df+jfAl6L8Mj9I/A74NugeM/rejUa0OR8Y43F80/G/NexrTPfrhtCWLylsSFN9TGatiNJQficC5P4E+qEdiPjaYGGnI7bZ390N8nKHSUIqgSXdQgUZ6a853yfUOX5XeFU0TUCQ4LIFEOtcns9lCD1r9Sbg74851qm73qhPEg5nNKWGiePhHWTz4JkH3E8mBjSk7X/EA1jRCVo2L+7qbuv4O5TD9/xR5E/k47onBW78Ffe4fYlLonvc9HnfhQS419vXaRG+/GGuALgzacXOK90ry/9nh6RUjDkX/VfKarROEvb6+dgJ3GoxwP1zHZQ6rYd7qs545g7CICP/x2EmPwznLorERoBMJURjU9BWcN0N1FlFXVusG0JdvPuV9m/pJJPJWawKPvi5AA7+BgEI050sBYDIhL10REwd9rww5YXeb0FR63zQ56sfSCA7H5AnfrRLJbbY/U7yH7L04bv9QgrMOcuUH+MdabMGIbtiM17NJE/sFkfwLZ9HEJS7RjbzXHWVBAm2BWeWoJCUiabdS5+It2SPrt6Mykr+dxUoqDK2A65lODeEZFLzWugWTvKp8kDpRiSg8QR1tSl+Nv1QJxAtB1KSgTemgkbNCanyLay4HBBMneLihQo6brt0teMUYnv4ZL+xOJ2gTgz88ebc1gJfeJBIJs1CghUgIIqGw92/SSrXOO+5MSAADt70R+SdRRW6j4B5KRhI/d3O/g8hoFfVvNv2zLbiClDH3yS/qNl15yDThilF9muYXsjh8gsejulYEyoqcu/NC2+jvE4wt9CmRvlz23VyRV9FzDBL3c+iA8dNiQ7I8HjDfup0c033NYJeWWx/rXGzAZsm5kcLCPE4cMaSBP4rGfLviW6uRNRqGG2FTKSnZU7ch7nJa6zL6i4pmZAlgX27MqOSNI5GwOlPJRGHo6roQ2quxTPuag84GaKe2+a+7/DsACS2OWhXnzazfv7XGZZZ8Z9cEAVdA3qGo/m5b6eoaTnyLwmvDChJc6RHDV5+YrxbO+3Bmd5KGMXcwqCmiQ8EJI66lfvqrKuHbM42ohwemfzbNYICfiZxIWyMKU8v+e6bpMICyFeh7H3fq3sJK1iM9N/rD9sLkrsuhgE5JCXVdJXXout7xxbra9K6FBChJYQM8+ZpxSSq/1kYUvtr3caeJI1GFHXw37+3IQo337r8uogthHqx59bil0g5TIO0qIdmrdYHT6XZfT7t6SAYBKJhOIpdvdpwgoPGyw2Ta7P6udo6iPDugQwy+fDW4LOR6H+e/H5mBf2vFpvZ4GklLRe3tgPvwQ1fJTlR8+b7uqZN/1IMOHtpPszbfCRDEs3BU3svfcTJ0dRq1WmEJapsL4GUYa2HYYlLBXjxg0ijYa/vJRaM1FO5vcgQpanhfaVC7HiyvdpkynHftkyKRv7dFiLm9TGmO1ntnGIvwH9y2RbsCiPT4+rRnhlTC4V22W9M552hEFDA4qbOX3kiCIB6/d7b6GhiUcju2A3O+lzj3MkU1nbWZOw0dZA6zx77JtUlYbYZml75usH5tArC7L6Wd09o4XTsTVacPRKvECSjqXUIWRbKDS8facNi8loK7rnR0yQrXwxqaPNkpH9Gn70dktlmU/ML92kQQ6/Zz52s8mdExkC7ClerrCcEYzlT2qdPUfesrjb/9ta5BA79hmqi7GvRcKooUjvsuNWShDltcgeHvDphOedEw3rHK50nnXbKu2mFrMmjlD2C0t2+02ZgZ/Anm3zLkrDrHbUvaPA4cEMxPcdXgwhuwvK0Yhz598BAO1c0bWERmYEPFlWwreywvVcQBeWngY2spQFBX8HYlcUo8RDY/VhVhbxiJdejzogXEcBGSsx0EHbIFGmT/OXMnq4AI4MG/3BfB6qaGM/BMgZOHYrJAARGCjBBKqD9Jv82Ybe+x2f5Nod4IdeueTf5iXH4nA5sRvH9WTPJgLKHMCAnovnF93xOIUIjP3bhR8aABTSaZOwenM58bB0IW8HkR0GaBgBGvDU01+qFrYJQzDCyWQNntUjLf9wrTYBGts1hkvnhh2TlxwRmmI7dFLfwgrJmms7YdCeXZ+08pUKewma/Vf92tNxUsalhHUJ6XpxM4WeKVnMHkDqREIuHcDlPLFes6hx8GC/IX8/xXPMkb25NtGirmL4rlB+X4FT0yVYL7xZDo58zxK7pZ6wnX8nCiWeJv2kSzrdzJmMe5EY0IomdkbCzcDI/ZFJzKSljzU2W2DqrCuBOIXbPfGNjN7ciz0w4FN2ijZa0JmfJvjrshtFJpudpsU30O1BW+EiJ59fqoCMI9GG/1lKIdPXgTE5JnzpzjPEpKR4BPyAkEZDLjJnKTd7G95A2LUwEn64ebTdvEvy4Z2FF349ZO6SX3SXBb/eVlEmq6tdOItLgr2zdY9W/muA4D1Z9mgmz1eFecrSyqNWYYyFgLmnqjcY86udFoVz9dr2NSWHQUTpBeWOLx3oQqZzBESE18tdJSE3QFrrUBYLsQJVf4HS9o443Dh2XOrVjWvSKgLcj/HY5GRra+qK3dDshDj3OOY8OPHnn7TH1xhwF9KJPn59BEr4BPhX58Zq9Oqz49kJf6KbjReb83jruzVgdSIKmHhWW+TqblHwvvOrSRqVtt/MDtUyoMdMihqYBkjwOfNicEkbk4IArhGslpy50shceUyt3Q+J3GheOcFtKDcXEXu1hxZK1RAaWy612WI67fS82sY5q+SACPvVMoPo7aF1eraTUkArxcHL3Q1LK2HB+Kc+T5tcZAi0JpQR/XSXWThoEeokQIEiy0JzP3Mw5hu/3UepNFLbS+4V54lsI7DGGwyLOQcS82VCtQZRLLz7KTG1U6lUqGEBxXmZVF+lQZfYgCnWg65xzMmxdcUkRnwiu8TUYgK5wrZ2WDupXxC+shpPTEJkj2jsepykCjjc6NCxXwwJ/WDrzIRbCxCm+YPxCKyJyqiQG/jRPBS2xwPoVyDMvY4asFaw23HRzcxcjMLyop4r7T4ssSambQU73SkXhDP3CcrC5MdVuJQ86AS6xzO2iUOOwLuqW4rogZSvhT8vdruYJlB3vSgBXgqNK3mzZkQ+tmR0aGwBzf9QRKqRxUwMxOZJ5lGGV/TpaBUTHWllZrgAR/cDufFA/5flI7NJjg9hQmkFSwur1eHpNwH7xlll6RqbQhDM5g0K0iyJz36zeIAE37a+NEwwBfsVcTy/A8PFxOhMb4hucXsTDJ+8fK5tY7KAMHxWfARXaYyGYEkzQwdLbyzAZBRTl0pewkgof+9o4KNVMMG9OkEBiVtOqYXi60sE413yZHTOlUs+JcD+exHI/nxe7YofjS/8SowkaWxsYmCxHbZAitOC+SUSc2M5zaH1/JwCTNaPq8Wma8hjs8Y4gvZiBhg7rEbSGOic8Q6FyVRZGGvsikszVXFl442wmporoCt8+GZCb4Xwtl099sii8rrwd0Q75lFcYAVWIowwTUDXfAQw6Z3aEG++JlWXUvnRsTsoonqayqtb/gukY/IRO0Qrtbz2WG/FG5QlIwdr1+dmePTOZof6J3QjD57/ePN5nasKmdt5JOZEGbml8AaIBJEvGqGbD9Hnpj5K/otqw/cmTFbppV7Dh9zg4pwDC+d6eMu6LTmTxuzUos08MIbottlsBA3/JKK2/rLVvMgGvNvvEe78zu5Ozh+xYLDsnNVlfEyukEDX9RUvZlxQV8InJ1wqNZIg9DTIkp2BcpZPPnRHRzk7zrnbFB/9SeSXQlIrYaVECTaZzcGYwX4acmOdMK0cHUSF85sUoWcctcT3cc/DnUrqgiD7dKcE+iI3N2Fp5gJAJ9VdsMe592Jht4Z4GQy4RxtMotnoGSXjwuyBaGCUwl1lQJBIYk9GH5cfMkOLklEBoZqotg1c0EaG0BC9ypSbTaryJq9SqTZaZeDsbEoMdl5Jm3JPdDz8G+Wv14cul0x5bIQcfahl9AAOmAB7ezQtaZUJbL65V28kGlX3mX0nY+X6mdlyqd4hVX2e+CTBBNg84npEUrIgB84L92QKSFwLnNQweUBRH2AENi3KD3tjdhQLilgLVizzrIG/mqPvB3j9gX2IZV3R6Vp0Enk1+wkhBXrka4vqEOYOBvbXuARX+HRbAy755tthvFn13KQFDYV4wkjhwouysf781uNo/3IHoYWuZ8vyi9uW89E40/OtCJCHlpOmJ/mQ1zUmNKcMaJew8xzNUKvYUlvmLT6Q58TB/Y2f2aWS1n/8xfJoaxFhUHZAcOmMbXs7j6RK5vawB0K7Oo54w0v+fLsdM8tC+PTaEq8JM8smOdEW9ZmX/OETn4Y8Dvn6PIMS7os/w12Nejf/r4sW+ScuS/uLzd4WJ/zucT/m81qvvDi8b99d4citOT4UBhaqjti07TJNclcWE2O5fLZCSQ3o3W/TSaydzEfJs/j7XoB0YFa9Z8u4MrTlXM8UzlV6z0ugzijzJMqK2c1zPcoqF/vTeXeN0KLpulz7/Y1vrhMa8n0czmBb5SSJGpFH81tOcetieJj+3gvTuM/3MxdYViayAYX3rJQYP3CR4/fqw9WMC3WzggbsyprOkG/i3cTGuANTgNSaW/7dl6Y+bAU0H9gLah3E5wM60nAlvTVXiDa5sl5UmlYV6ldJxX/1Y4kVzpk/u7BMnUinu6jGo4A4K4bXDVusVFrjDMI1YlXBtce7I+7z40otHa9kYldIE7Of4PW1phkY0/Wgk96B94Aj40lWcb6vshJ0IM3WPWy31ezftCukgPgQ++UC90/3enxRLqCN2wawirQTR8WT4XgRGpmbA7rk/smUvBNCyB+wqfl80NXUv16YZLHayhuoKjwL7F6rFRKTRK4m9Wy61aXMWmaTA6fWZq1goWhiYrmEqlqSyjxg8y2BZP24Jcqm+kdaO2uQw8rdznLF3VZFbLZQLqd47PjQgRiLLGF6t19w8E3UYaIjeo6mGLZk6DUcQ7UDm9j3b4jA+QKbDavGyVCLVEJJz1qWFosqxIMnHQTWtti92DKucdHdGH0z1Sex1WhJwO7UKsbnK3c1qHhR5ORadSSayvE5DMee/67FQ17e1FeWFfbvguJPXwAyVvBmYm/vHeBdAv66D8KUREBwCA+H7RZ0ivpbtS0wVLLb5kqLCXJJKGAr84YygX1gsW1Oty3l3ZiAoIX0mhdDrwiRX9s2pz9ipnth/Gbh/7lREGmu6W1FuxDC1zSXlpCTzSBIcKsV9Dzdjw9QXWuQ3j2S6ygjWQ0glnZA1eLylyYsoQi1JUE+ExoYsIYZ4LIdfTZhvj+aa1QEKmNK9M2QzSNWf8y5d9Fc1qWJV3XozpiV7No2HeyRe29NGGw4CtYO4bcv5/ZiquDhd6RXRAns4lWdJeJDjTkmdmmIKUV3hmclakNqWFRRNLum7/zIUEwVgLN/He8cBCBiV8EA7YvZe6ypY51DIpVrvqmsBO6/drNUxt+kijVYypQ5qj4xmRQ3ZsIzLDamjTBc8mgIn4Ef0XbXbGFrwlXKH4PNbmx7Mogax0DXqN58iCSKobLbu0zANT+JWfDGp8lorBI3Kp+Pe1SRPzyOMCbRhrc6HmcV62unNWkbocH95vNSxlVffHWzxw3ACTXGJCy0yBOXCv4NodSGvGB7+tNg1fi1zXkVzf8nQGlLSd1Fp0BDTwqY+S1YdEJSnfPxGoY4DhlC4bqw5jNHQ75UilrtfqKTxCpC6xaxmc4bKxW+wCCIDPhk8pecOYQszDB1EeTTLlc9bycR3MBa/UTLdtMiqDtE35bsUVujGlrk5z33c5na43L9PASArzsDkf/1KdGNiewlgCrvS5fIMDTyZPQcN5+gE7BE25Ty8lJFc4fV/6taLTMFcDY2F5p+g+T4EVRZyvOzwm8V38HeogRUmo0XIeEtJjNI+XquV7HJUrMSRAMdbnCLgKmZ9UBrJ26Wz0QmDLxSaf4Zl+nIZe/rGbCfnsqR0QR+NaC6ompfUMZDu5fyFunDieFHuN59n3ChOPDI0qgNueROk46uyHxfd1cFrxl40a3rf46GWY+LfvtxdkWn+OYbqXGFr3WZZXo0CBP7Xm8rzxkiQ06EQtKK10uUVtnM+3oCMoeluhjtE98rKUnFeN7S0vRhtdoXbuQuo1lEjosvdgCWwp8L432K43iL/SbM5apzy63bloyr/emx7970UnXVh9uvpeOu38W/egxTcISdV1+UWX3DISCwTCB1ezoJnBqDp917B/Lgh3Lleiitqcr91t9cipc9kQ6SEi5V6yBuF36KJKj7Y57NoEWB2yPsgdb7WbtXvKwztW81XvpCHoVBKo0SidN/Q7nYvlMK9WNAL01/Tlxm+u2eX0+P4LMCPeBy+Q9B5meg3COK6A/jZsO7YVcKl1U2LzCT1OBfkyAd7FcUqW+llLWOL11plJIouGUi5r/BjFj9RLRP3/cFKyZVKYyivzB8jpbB0vrpnsrIlLD86JyndlJ76JRE9dD5u55IrlopLMMSnHcBuTQpEd0VolynTxM9hvQ/7B6rIn1heErkVNLqidjPElGF8oHKaRAEr24c0+m8sAh8Of8PuiWWdxj0ZRLq/0UbDQEp4bSg5CxvAqX7bBQqwSkqqvaGVnqvBvrcXPSVlZ3swKsGvPnFhJjJYJgMZL03GCIKR2zh5gE2rbnfj6ZaRscPZC1DE5KHk+yVcV1g2XUzhs4YdQq/abXvbqy6umZUVe6iu+FFgQbwUCM8VYwme0fc3TaCGvC9xM60p7737KI9AURtMVFwIIeVRbMfLScBWsA79nYARjFVkkf5ete7LA8yO7fTzHAJQi4bzd9lsmu/yd1tvSs474f8w92dxw9K+FsUcbcz6C2Kb0493Dn8Z/rtafUyisgeUUe8iHkWwCSMzn8ThNWt3kfK+dMcaKi42DngWpQLk4tkNa23MC+1q2Zddlw49d/WLXRpIvewcNuAqHpsq3j3y0zD0O1jSWes6d0xcHjn1QS/15f4r5T/OM+cz+n9TA+yMklIQLC/D28Q4Iw5Fo3Lik5KQ4Lo2Ex6AhMHgSic45QTopk8BQMAiZCvgmF7zLJjgewCEpO3hJIMCiMPbcZS2iCFA20Ncn65O+6VvJOYQ1KgIR4E4Eb9oKKPBNidCUKesnQ+C9tcxci/t5pHQ6A/fd73k07B+Ael8p9W+/U8zzeFmrwX4A+aniXGJd8hJTFAnIMD4WqJXTJ0SzvG4B1Z3Qqw/uk5lbbOtIbd9R5MI8h07NeA5k7N9W5Kk5l7k1Tu231j9hHovg4ecPq57mIDUugmE7l4NIFTkcu9dCDrlV7xYPwK3tvyNEt+LNeSAIRlcx3FGl0I3He4j3divHz+qWXpmTOEA49vIPHGlVCgEIxhsfPpMNAC76/ASR38gsEFvEdlGAhCDfY0Ood7kf4ADY22Xw0ilaoC16V4iIBPie1kx1uSAjNXYIgcD9WC73Rhjczhl2+7LS+zLmrgMc+GzfdA/8yx8X+5AiWix5ovA6fhtUNAQ96anYss0SQcdHU4Mw6/xqaPC5Ht9GFejvQZVIWXS8WS/gZnF8Dx/yS7Qb1A8u0dk1EozAZLgJBNJS2HH6leFg4pMhi/mSwMxs6G4tcPmzwsyZeZlZnqNKNN2ReXxNzSJaoR0FkTUHgngjPWYD7QlKjos23KC5aEJGazYg0ofwuIiELUu7TpdGNsyC5RsUL8Fj36Hy7T339X3ygMDBcb31fpBTFIYmGMHHbbCEv1qjIiNLpUU8aRrxEcKPa7YF83WAIzZtg1h7TlQsCPqF6Dtoy5dWyGr/AUjF5PmTLCSKWrlZKPiiGxuuwJA64VkaKcfwF/N01ulsc8zDl2dSU2u1QsCIMxgOiBQhotmpC55vz6UoIBTB/n/MpF01pqKK/27EH8/6QBUxICo5vmQbhwkSQ0cDwnaJZ1VLDiXkk57t62zB7WJJ3oJUZP3H/5ElLZn8k0q7/7LtKBoGJdALu0cGWpQ/hToE3z67nlQf06IqsAaLkklH1ixaEOjxvtT5HrhdkOQ/acmchb/+LUWW4OmWs+CZm8MOh4dv++fwcwMq//2+/w6Rq9VfvLADFBZHEfYwmp3pyiNHFv+Uf7r2yBfA3vHX6a2RBOR94L7XgJ5ie5ts00erP/6j9Ne92+64rQ787omvk+c8dO8P/gZIkfh+we6mkj9ev+vvVJzq+hGCPtOXVH8aT+dLfgh65bkcB5Cru6Ar0yzB92+lt2zR95z7wROg8r6Yvnf9ix33vqlHCKOKNEkIjzQmfDqrU7S/X4AeK7z0hvZKe6iz3d4Z//O/K5JrPbXjhs8RfQstB0B/ffxO9Ch8IVKTsWR1Vm7kJW+zsdROAZIWNN3s+fpn7Kfj7SFHoovWj6bHt5RzV/0u11fQs+OqIWUfxcK6+uQ3B5tVH/S27j7/rQ2TKOAe/TEH/s9vSMn/nugH1pGjtU9QgkrmCOhpMw3lVdesdhPSHue3TLA3wMpMHjJELtOg18XBgXlXJG8/G55zzLIOJaxWu3KcXKllFO700u4oltglqZNF2r+BeL/i4cxLAbevuNbky+SAXmj8iR6eqxQKFfMo6GHFv0ka9VxkwniTapBAvQAh9Mpe5QcLksL8gr9WuZY9XgFfGPeHDMOuH0GEsOhCsuRezze9sqKOt3UweRt5OnjgK6gcRa/+N3CQD8uaiXXiegIz6IsF7eP+1l5RxMIsInFxJiUHSC4Wt6Bgjg03cx/rLCe5rDAuZ6bZnj/M1OD2E+QOy+YmmK9e/3uDXQlOiJ0Lhd90cVfVdReP+fcG91xevLrnmBP8J8aNuzrBlkNaJfdvz7WgsyPeBiX1BIStcbbxzoiZpBp6cs+sfmoJPZPTJ9Ijq7sz6CnwRMZT3LjtKGjV1gbFUPy1lYQTl3B8KLPhiqsEP21sG0dUlKYRfFa1vaME6ppfMeqpez62C//KALWamvSMz1BdTdYtsxXH+b3N0dDVTmzu+ijP/XdyI54AGcsjBPBZFLyxi/edv5c2j6wxnwx8ZU8fDOojDXeEjls+6qKdBgwL0BIKPPtKVxUKoTwLLl53MFNTd0WvxrdIL1YyiwRUQe8rekuk5BCFxO8MqsqNb9mTU2BR5WGBvb7omp0zXlKAIKy6ymZFGckk274DCwbLWZihphBCma2RIEjSn+GSQlwzVhZ1doJ5uk4ekDrGpHAVBWiOrvYULrDF/7YOqhap1dIM3ybIKoenZBF5lHtJOS8ILc2HJjRzq07LI5BEFgVhUnCeOoSdB92hb9JzxHdUqliefU7mWYKuEiABlgB7PUtX4ffn2m3v1MkhilLRdHJKCbVsSS9Qf8SIwNshzSFZsTrDJjoXJ7G3bf9Vc6p30Unvt8lROffsgruGrrFYmIlGTe/WL50ei+2rVDqb7a7V2DxY8HxpJA6TUwP5f9zx+HLie3EliUO77Up4rxMkiwCBf2GaBpYUWJOGKrME5HPBdE2epklQqO7z3VocQOX0AC6n8bEEKHwcnBOc0yhUoaoulRKoIUXKiLGdD6TtXJuK41S5/CyOR/K5A5WbOdtST005Q09vm+Uob5jD5fpHColQObQ8ClRK6C0qv5dQDN2MdlZgShJaTe7334RE1mArHa48Q7a/bTiLMplsMIU6N+aqjl4yGgM3duEd1sE6MzwuJ1v6XcZ7Jtt0Nt1uy6ClAPNQD+lZMBM4T6UVe35SpiVknE36rcFZA2hy12gh8l27IRDCKF7YGWiEMOwYREnRcGMN9oyx1Y7GF06d/MtZXJgfCtihoeM9cs9Z0rktwH0hzOtgm2i7rdryVNDB9fqn61kC7wribnhPJugibOJ2pb3R2RawpXbhloq01FsyokGR9rIJgokTqNR+4olYoVFumml3gljA6S0uIYpSUelKUBtUoSoKGHvBHFpCAbmYWUuYMbFsKiMmxkV6SWdTPwnGXX4tn8nEDwQ2vp/IPHp3pW+sRFf4YNJD4+hYJbmSkBIPIdUJgy+P8BkI17xIdIq9vvrovVtXAZNajnm4xtUj0zBM4wmOA1pcXlrztY3WxXS04ZguwVwi47hPfFMVrdIEB81U6wOJInPMFv4QO86ekFot6VknQw+yl/1HKFUJa2V2BqzYps6QFdKcdMsMWZDiwAvejOrTwJz4mqRYKBhAK5xOPWK/BJoEW9IslCsOhFT7HFd8EaYsPa9G81iiIFUsodKqLL03hIP5nul464+oz5MpF0JWyhy3jNvaXgfI0xLgaQ91oaEUsScWc7XZ8qRNzGE6/Ofgiw1+7JTZYA6Gz70IWv+sAF+hfWxAjvdppdj7HNdzdFMYSebNfug+W7akhQiUHRTmy1njEf9qZJk5R2tehaXwjihEKcXb78QgnepKla/LRwT5yxe32tKiny83aNwq+sOw1bt3NeKMeOF4mV24dMpZd/ZqvC9+vo2kxjo6IyWisUp/rjyuuKI3faLmoSL9v+V5w1K5/yqWRSQKYlYrwcIjqHegYjKlayTLjcIs7p8tIwupqf8tpN8+eUB6akgv4cpc8NgIJBKLLMhY9Ve3zJC2mpNTPcWQbntMZfCGSS9H6xLR3AfpXBvf0r1hdflTLasFxkqvVctSh2kujE1vrCx1c2jdd7sOGRF+WIKq01BCWayDHQMa2BVzD8gtnkNcgwI8+yk+q/2NaDyzrK6BjEKJY0g5uAVEVMwbfNQw/DoC1NqompTD48hpsUKcVvrPeIkcGmvEaWb2oJgjUA2Dw5fFu7BNXqNRP8aqFviNH77QZEdNg1v8MIezP0o03u8UKwIVNK3VTm43mpIRegGpnUHCMw9Je6q7KYVYGm29wwimXCL/6Vy8jdLYS5U5uXyUc1IS4y2DJ/xVLDY7vWCs2MGTJCxD55+pf5ipaxJBNoWdm/hN9ba93opilwyfWWQEIxbRKVOZIU1+MCRMz2Ao/bBK9bI0sAJWMP3H4y0q9Yu65GiJkxzytgn/m6TZI8g67VioQeYQw7gV2eXzmfQ2vi4Qqq1yuThPjv47hTQQb7WhLiktNiWJSZEuJa6ORIUvwKyahDGRNNLbbUahl3lhTGrGpiF3JC7g98YG2XVjuMn7QlJ2rHmzgsgmlSoYsbHugZVuHc5SncMRrkRaZPAI6dKY8a/nR0SxjPmquMxEBQUwaqIga3SGXcvIPlMOSkuEw9Uq3P0WASiAfENzoqyKNI6rP5EyFzIKaQg3DrI6QLzmT4lpLOiFgcdKUx8c7Y21uQlEF+xD5EIbuSz12kqXSjKbfFJq2GLXMfbBTPG5kmqThaEgLYjHObIg+ZQaaYynUcOp6n5By+ZrDbkG/FqgX7bTGT0Mq7KqVW+UhIHVgGkDLes7S2X0rCxQCjFKpVDw19qaJR0NqdVXOoQBskZnE8S5n3Z+mQB/iC34sW5MyKEOZdhPX/bYcsmeDMq8W1UlXHICl0EzsIpZlaJ22YJ5fYTBBXTvOaW0EBDvFZQyZCyIkCs8Xo0llRAMPHbdHrX2YBksYfqORSoi/GP61HhJLXkJakf/lVOzB7zzjDsXi0Lw5nQAzevBV2W3gWRtmRKRIV4cQuplKhS5Ta8hk0InkQ0GEa/HeYjnBSGa4Lh4birtMF65bXOf0CNSsEH6c71i7lKIzWcH25q9VohJjbddyDIYOy6mFKhT+EZh1+8vKkUK2RUZtE6ST73EEgzPl+XswXR4CoQS21ypEckBVrCec5mksusM2fFRldnMESB+3Ar8lWfaAcMPlG6z2Y4B0RkYfjTrPENf6xEejVQpBxyUP0SDZam8y4dZdr/7ZlwG001jVCTMhJlMyyEizxN81FgzIHXHwVzQsJHI5n/ZF6Jt4WjU66ApCrWD+loVXDGi6H/jSoOJLutQij+E4atde5236zgJRWOpDEmvcdOjnHBfUcDFimVtKXT78jPcedWwCXlGjY9YbfSHoDS1CsaaLRj0BJFMWtko68rqlUPspYhaze7kteo4vQLBiH9usXnAyYB5OhuwQ4YxtXwa7vEuBwNui8tN61VIsX62Oq2r1mW7qSrdC7y1eUo07BRbTnULk+P5jqDC0BpqZZkgNNH45EQ3npXBzBHOKR+5lRaGYgJnaUAa84vyz8bKGnONht2cGwnppEgmtdCdRpNC4y5OKOeBNYVvFLX1Okm7o8gsOx7alY3hsNDOMhs0BF4vLSbLXJLKKnKvOYGSU8bxEx8dqfSXlBH0iHH8LtdB+Lq2rEs2G8ft1eSBKVWcfkE4xHZrCNZDs1l0pUKomlBrGEZPEWLBo8Z1or6mJpFOyW0I3/BIgnnnoDTAyxzS1BOeUWf9oM/9U2KWXeYjUZ7luQiBeFmLUn9iRyJ8IjtRfnm6n80qZAyz8FSLls0hVhhIyGpVt+qUU89AFHJ5DgNEqXhgKZpGSGOxaJl204FFx+vV9WCNklQnySVD5y925AWRFL5XaBncsMyKUaeUGhaGhqLkWMU0dW2jRAOr1aASRjI0FWfVaBSCOMVmoVAaVbUtp3lHh6magv7UneqPFCayUqygVlMVyZ+Gw65JFTMxHoo3i6HviU83DrMHeAvfPC7FYpZPIJpySqVK7pBgeRyBPF7dyrmCTgPab8KJBvcCQywo3Y0jBW/IJ+4vtIvoUiCApfZp9GhCko+lMXt+ITPPLBf4HB0uSrh8MhZgtSRbrRjtdt8sCZtRFverHVISzahpjVY9gaSO5zeHrEqFdIBXqMr1obQ36Qdpp6PvACn/fd7/twJ+9zVDJ2n+psGrexLiL1tPNNF/EfbBvbB7ZUVB+tYfD9Rl+Wc3i5vUz9+q6p1PTR46BTZkYwAZYStJ7n1aJnPiMGt+AwT4qvJFdAYKBJg2EQz8rEkJYzDrAAR7vDvUDgyDkjr85QcW+Mt8gUoJIYAIuG0RAry0UIORS+wiJplf4wEmHU4DLR2OVUXi+WsajspF3KppXKAQdy+l2BM2u2YBJqQbqqICBAEsUEciBwQFN8roz7Vlmzrnx+TQtyu/AgCvWpaUtKsqJLBDQCitnNFC21sVY7NyRTmqaCCQdEZAoI20ewArBY+k/XDAHs68xbH7y4d37NPu8J2gOGxFD4w9ycdpxVX4D8U8nFScj/2Ky3C9YiH2Kq7FPYo3cd9Vul8c/kpxAb6guPCKXq6CI1fmr3SXsfDMwxcNO3r/MbI11X9B+KmZZI3wdKiicOkHPvqD2H6A0y2iT+Tt2LNTYOvXnb61O4GAF5hc26eBQNsLGtEJtiSuAo/hfOZxlISjVFSYW31HkAK+g3fz2q96CEr8wtZprZBsKdFF4t8PWIhUvaHBHvzrzASsJEhl41iKi0e4ELJmuQZdCqqQkGUb10YNnJdB/W41ioBqSIsrC/1+K2uCOYqEAmsDa/UfRfMmeN9MbdbhDdfQHgnNwem3hI8QWOCfUskP6gfA5QaX1YgbYOCyaPkV32rQ+KVH+JrG0aLJ8oHN2wf4snKZXD+Ua0vcddCEDjgllybOs2wzziJL9DWUVYFIXQ6ZzKF7MszKKE7Je8Pqb3Y4sEwrdwh7I9RjVnzzBX3R1vGaGxYLOIKGIxwu8yTUPdS9xyYTxHVvJouoarcnnJF4X2Cb94B9t3i8AH6+HnA4QM7PHjuyL/djw+8NSO6JkV2PghCe4v+zPnK9pvIh4ED+UOBRxmdDJKyYEpsdgiGB3JcJHttDj6n2uQt/zVOWnJdKzvaxwD5o8G3SDv+XBfbJ9nwI7b1qDWEI160eEHJg6gMyEwYwKsDUr3xuu0MXcUI1X6OxBIsj5zEMMu8JQybTQ1ElzaZjXCSj1JtD0ZeV56MlIcqUCYNuVXwe8x8jRArKrNXal+dxMYqX7wgGR4xhMFTCrUEhxA9zbmshB0DLE3eR4M8ccgtMzbyFBXW0Cvzc1PWuBgtHEz9mZCwxXvcdQzEh44R/baok+5yWcP1P4N8I8MRkd6lw/bur2RM+qy7o3i8qYbsRa4aXkBDTC2xIxHkwEl+TUMOolDbuqVPw+zFA6rkA0M/WWN9RQktGxyclYTJdT7ZBIv7Ixy+jEnW7IuWin89jBwyXYV6ZVv7VcBR8ymzWj6xu0BV8yotNrhYFWjBSvAzIHCFTotSJfLjxEchM/V57T+wbEgmRAggTTIvqHP8xhNCQYNMhLDUiAqwNHqaAn68wWoYFw3e54J/cfBLU/vqD/sbYB+7lr3xxola12HDXtz+B2O8H/QadHeDowULNG1d+EHlMvTBv1i2eGJMUQrvBJP+gJ8YIaWKAy96bywykWYcwxCwmwwH18PgaBgL36InfWbKtwNbbwz7enjNm9eHZy/MogYQ8sXa3JqMoYXCQgietJRIBG5eX6IBoPk4lJQe3CqgSR1vVPULjkpl3D1QyJQ9TGDauJITvoD2Xm5fkS/6eBMQP0OwL6LEWO3QW1P9mCyZP1ihNFwU0sIUQ8lQCk2r1WHCekId85/bY39rPvllB301zQR9VfRsiLQ+EkCMH6phPZDvZoElvdfRk2hVN5xFgUwPzhTE2pXOR74GHfoN2UVhMYBq9LiOcQXePqK+sdCfkbAwc8kXJe6wgmmfQRqCfMG2jF2DPSCtIS0PXqnbBu6nXTFvxl13Q2+eiCB6b1vTuEUHjlTIvrUUkNL5dvqdoYfmAv9KSYzbWDoIP5Jt2HvTdy2EHH9gVWnnt4m33QbD1EKXE2s1L/ec6cLCzTVmo5ncddikSou01uEdrNOh7S9SBnqzeD8HdP/eTINcnzzECSz9sMYWJtIU+uSRcX6CLL/vnULAaRyWK3vtNiZk+53c1N4BA2LTbZ1kdHsgXJb8tJa5m4LlcKkWOOq/Z07ovI5qdd1QRlb3q9cVYi+DXj3sw4hBCLbVdlILLcEa1ek1Mn7McZPL5WBDSVxO74plKCQWICpNcNag25cJ8GGSgRqp/ni8QjQ1cN7LSmEG69+yDd4NQkU0MpKqLXTqQiI8+8Ml7DFLeqRkuMC+ZPzAMsSHh/Ne/fIz2LLo8VnFuHNZu2Rrlm9LGekrqx3DBEICt6jEUE155InGN/h0IVv//6a73E2o3tAghLYH8Kwi7ZMmUMoN2NtE0rf9U0yuoetXOUEuVYhe1DDWbeX3vgmr5T+W5aqfskyKrT7+hUOaDATtgIP6AKOujH5XIkkbjsBrVnj95XmLI/RGIT+7vuz6Pbg+KgQYJQdjJu3D432P6LC8KXl4QFrBD8TKd4KQY6EkwOgZRtD7jgAODDG5UGHmbQrOPHRxZXvPwMm/aQ0vLytB6N6JCMTUeUxcmIO2k27f8/O6q/1KykyOPaA+fxz5eI4todCNKTne8vX/ZNDYLkEKk6WVrCAu3l8I6Lz40Px4/g5AEjJjboW7Noqbzbwe+PKQMiEMr1lCoLg+k4YW/UR8vg8LPDMZ8zzH/Ikfvoc+9pPAIN3AhlyDGwu95tqjCKKGXjgo/I9AgQMPrm/WazrJz/Gp//zX/sWIaExFKdgh/mg/t9ek0hRJq6thSJUGSnLC22kDJDTQ2GasGnEPBp7xrW+UnlZyT0HrQ5SFzFYqre2uCRCbltj3gzLuwQDxhO0fYriuVIj5zrBjP+EV7LuIv4p4QcEEJpThLOfwZA/9vDEVnY0alkfD0qrCZ/5foNDBWPUeDHz5dzfDuezwat9TNQB2K4M7adWBpSq2eUEqkT8a1kTRysTFCFCFbx1Ol/kHbpl7w5CPp/TDGK0Q/jc7bd2Ngn2yqJAP2HseHNjWioc1eFc97EL5OBmNdueBGgQ0SHBuRKIg2q4VcZrnnjcREN0rCgsK7RdtKBKJ44Q41hyfOeQgQ1z1g939l+D3WAsDAihxuMRZlG9C429q0d7AzTwu+vUP0KYToE7e2uhY2XiT287x9FkDjn0PLCj+pf1ZGApsCo7w4bMNnrafsjCn92Ftv1EabX+8QQ4zbjn0nfldPl2t2vFCOEvVvH4ZkIeh+p4grNdIvFrb+63I3rjybjQJRd1zxLrnr1HXRTzvBtCZNmwOxyCGdTjDnCbmN22GSLNK6vkKLHXfjxEa2/oy5w+JlpJajDse2Ao/XoOp1h8NjFjlxGjxoRlVcDBCfUEIZxVvRz8ePCj+DGp0U6XiDk65G5+ObY017EFlOKUC3lFPpHpEq95WQ0aCZ1pAdtvR548JLJ4WygnUqLRZqWFSzyK8aUZYXKGzIofwK9JZClsjrh1VoucAZQvQIkcROQHLtkaqwqnGw+sHFbU0vmcuGdaU0doouNrBAYBnx3YiM6ag1yrSuXnLUV6j516UzR9j7Mquew6XLFeWe0OyzbLUeNz+LX3ME334WafpqTPrM1YpZHNbKxLXquCmE0WTZfllcB2gxWzhVzATZFoNgri09g7Crqy10XSyHjle350cfKi6XR0IlFev6NPDNEqfv5X8BXJSMZ8KHb182ObeKNE97OsuiQNCC7BkkjJoxnCH30ZxJEI+ByHTnXBMsQdwqDqGEv37rVJ5tNDRoXJogpV9+rDvO9AAIL1gkIOnHFSPj+mexRf/9586yPEJEvKHaEHmGz4+e6VZDFf5bn5r4MgADQOD59/OPD00vd/+dS3EBgE9+O/U8NfLq/1ZGa9HH/Cdt0PACpOAfNOqzPurg/k8xBlx8D+JsltR8VQXkTpyvl2wbcsdVMTVLnpLoa6DmMTXuovN3nQNUi7tNi03iLh26ux49HVoSnaAhNxEPWTD2EpYriC0ZaSw5uPHIFuepakWisPDvkBbUqIQ2ksRwyShimu1Z9RTvNW3lYZyzcMdVM7c+6bewZzEKic92KHluybyMu0Y7xUuyWetqX83jlPWznC9bDBZepNivJqyTGrW7l0nwtaZ0WETMegw7FGsc3kVhWMJu6damIpgpnAkXwiMbFx63mbVjLdatZmFmdo69b61TUCzutT2mEXHfHdS0YkTpsscVA6halYuLd7DvGa4fxfuOEQoase8qLF7LSSrFVIxjFh5/EY7OdjjL5nNE5hL2rHBI9Jm8Em8oHF0KczwJUY9q9FPFLlZFD9VDdzqSecMbuAy5sAWqIQ9qtXyI5uNoDbZEuDUMRKUClGimXTJtTkerRTf1UAcPoabx+hpzIq9yASBFNDQJgMvlONbaPGy3H6YEtITbZ57DCnjbstXXoXilj80XSMRppRGjVrtIqCyPZzmMj3CJXX88fIdOn6WZAdgOzJuAvokc2Jui5a1apuXmxytpeamEPskXCp9qpEFJJVWyvq4qCqn3ht3TnFbRMnseKKxl4YpYJXyFt3A9uAXuXBXl9kO1TYPB9PkCZiOIXrlVzv2XC9tGq2L+uoCpp+TJ3qzpQfPblXwqaMVsKHKuLXFk9cdUXdTU1Jqqb6VYU+3Y2IzxNatuBmGTQwvHX8VMpm3wuXwmY5g/mVp+fXdPZhRu6P5utJMW97pSXe3h/sT6fP7rtKrbIBC27X7t47UqoHPnhIKt9uRgNoG3E9TD8cPsh7VXQBNACPje8r9JKnHAA2HW2aO6oLa9Kd3OZdYdEKPUKAACsEECHsKmrXsC+IpYtx6/3uN+w1dkormlGhen2f4BTwDuA5wMuBfwauB786SCuMJqyHagshnAb+whtI89TDlOtnneF3tuLKC0FO7fP9MvcgKBsQYFPgUWdJGc9NyBEXcjZh6AF6QgXGOIX1qMEJYQozg2LUYzzxdjcTEWYzN3Ugiz0IebIYJAEcQmhsqJOUZpiU0KExdwWmcOJ3+T18eck1oQmxIqIOaSXCLmGsYlNjUaK6Yhi2PSBPgw877ALfw42T5vn/N1fzta2m7H30o6YMaK8XHXL3XsIk/qW3I6il6VmClTKfGxMrynOryGSowmXtm0dcN9m4eVT81e236tgV5r/YDd8GQlmNXr9rrXWr7NdCCGnzCTRr9+btap948/uLcet1oz/CK8gfqub7imNev21VqCl9FHLVWDUhQ0hUpi+H3rHz6+vvf0at1+rdmFfskkqovPfdSdBgrZ6RtJSdTLsg2JdyPLNiFZOnbiMVVJFtuExr20RWF4MxZmyX5y5ZjY3/GVYoE33b+lUF28sK23UDupsQaQMVaodEqjW/5oRU8aNPRBwdhQkFjll3GJwNZOq2np6kS9Rvv0gB1Xs33SuekIeexpR3s1u93O5vrUyMuXhjZ/I37SBeSmgm5oyc/hjYXc6G97PXDP/Y415qe/lY2dA2r0hcl5CstfpiugeJrfYIU6PfTI2vxb9dNRkfuKi/4qpVSi6SVz95+LCaCgYWD7vWr4Zltng4giWx8BsUgblfQAcl5R6uBtkyE+UfP1P5tFiY6GjoHZHH6xsPMvCqe5noiPW6wYcQ1wyTQPlwjFtuDkC6RbSDu0SELiBoSd9wDbbHdIoi22liKVRFqnLS49mSVlyGxpWbLbY1lSsuSS+pS8HZRUNQEoXSBtSEFCQa+lYBd8aeJPuhA65b76hCNVrp1RmaAoqaj/u20X0wOnhaC9lDoVKv6s/3YVNc0/wh1f3wiA7QwnVzsAElXOQi3/2v9/ihq16tSLx0M7bJS36RHwkBBqhdH9JCklLaNBY2yXGVvqgxmkvnLGrppoaOmqdRYfS43/u+lGeoYMGPmEZf9k5W916h1z3EhGHMI3nc7ZZ+Up5fpToI2dg5OrMp5m0u9+6TKopTiguD5wu6U1wMvXpYYhAlBBGFxIGNEUIXbyvP4+J3l8gbFQJCbq1acf159myfTUM8+99KqSVCZXRDWkJED6myErqqYbpmU7rufzc3n6FM0XMEKRWCKNLqxcoVSpNVrWwNDI2MTUzNzC0sraRrLoBu/zsmctHFtq2SlRH7EJthxkyhJUkcjgyGsoWa6oJZD4MgSbYcifH4cydpJQbiZKyELZlf2fg4DnnO6qGj7/+6ouJSFCeL5jnR6BVz0rOT5CxHK3yBuz4VBouUeCbwdeQwibbpI2gBCZ71khND9JbpDIb4ddPjTNX8BzwQdvfww+lnwkBhPweYidn4+A6wk5cGJRCkKE8Hzihvz5QbINAV/XfX6oLWvw+8WvFa1XqI7xVwpDaRyJCeQg8D2vsZMzyJg8fQh+dFyOStjGGRyY7wXJO+rzRPaWSGFdiiMpx266NCGvhGzI3mAA6ER10vNBjkqxImzzYzeZo3KDs8C15Q06d3YV42DXN54eyi7gOqA9U+RIGztZm3J65pnMjvwSHuiXiMEgO2bp8SgA46CYiFixrxHtXdN0A+mmGMrE4zEtguOxJkfzyLqRdNN5OIMDzkdY9uRgiQhcftpHzh11YBfw67O44NeAi9o44kdfKSh0Xf4KqOdFzGN6SFsP9IQ+G2WPchplv25puxHW+UiCStT7ogvu7lhbqRDVLiacKeFsT6MrZUWZiAoXJQ8e62s9UgpNM6YSkWKo3W5r/me6N+XOtEJtr57V6oPltLYwA6EQNq81YFuEQ/4Wm3PXzIpptkYWUEuOSWOSeiFlTtDoo8Svu934LOxpa21kFbwX59qcBh+Zn+RImvyj5kNJLxXJvJ8d8VrfkJKFVrRJ05tK/aXanhx8bT7aVauoJ81roNL64KfMd8Sj0Rtfge+SohT0+ShTwFVwhK1KW45QTKfoZNrjU4poyxfT6QTmZlc+GpmMrLLWuHv26eonGfHyrlIqK1kXkTsd6eStxRnuKdSRqBapI1Ffpa5MEY1iOvVVugLU/LBXx6A1CuG6/RzGbhBarFJiuBQvbvkwWJIFSwAUwqV4kWPD5BEGsHNgl0kYMExsoHumATSWF28A8Zt8m6AE9w5Ar/3gsARAIUyvsQEQsFPAAABsAIDuAWgAbwDxK3AV1Mg9NsmPCvFmjM39+cmxXPF4EnoWKsaVX2nwQhAzQ84QJtFHLOZ9XyEdIPQUZJ7mEWV4FzjWEB2HUia6pvsjX/c196Wa/Kcqdtsqql2UbjmGZ4HCzYgVhidjl1XUbVlr3XLXgfYNROYdDBJHYa13NSw58stFXNu+N+t5WGAU1doYgvhRsJmWa/0f4Ys7r6o1nW1LF8pCcxJM0H9YbRjb5gVb1go9Y9/SxF08sf0p8GbuymWEe+zrfrqQc8Rnc8lptIpSPWmoLslM6sWzOZaLyLaco1nYjntDeIpj5e/663Cvs+oZM4Z+HNgvV5U0ktw/VU411pkVh8q/32PH77H8z9qVLwAAAA==) format("woff2"); -} - -* { - box-sizing: border-box; -} - -:root { - /* β›” THE OLD NAVY/GOLD PALETTE IS NOW AN ALIAS LAYER, NOT A SECOND PALETTE. - ⚠ AND A COLOUR AUDIT THAT GREPS ONLY HEX IS INCOMPLETE. Four rules carried the same palette - as DECIMAL rgba() β€” `rgba(31, 78, 120, .35)` IS #1F4E78 β€” and survived the hex sweep - untouched, then reappeared in the built bundle as `#1f4e7859` because the minifier folds - rgba into 8-digit hex. Search every notation a colour can be written in, and verify against - the BUILT artifact rather than the source. - These were hard-coded hex (#1f4e78 navy, #c8a24b gold) from before the Loopable - rebrand, and 55 rules still referenced them β€” so the shell painted TWO palettes at - once: pastel almost everywhere, navy and gold accents scattered through it. That - mixture is what "why is the web so ugly" was actually describing. - - Aliasing beats rewriting all 55 call sites: the semantic names (`--cg-line`, - `--cg-panel`) stay meaningful inside the grid, the mapping is legible in ONE place, - and no usage can be missed. Deleting the names would have been a bigger diff with - more ways to get it wrong. - - Per the brand rule, anything that reads as TEXT, a STROKE or a chart line takes the - `-deep` weight; flat surfaces take the pastel base. */ - --cg-navy: var(--lp-blue-solid); - --cg-gold: var(--lp-yellow-deep); - --cg-ink: var(--lp-ink); - --cg-text: var(--lp-ink); - --cg-muted: var(--lp-muted); - --cg-line: var(--lp-line); - --cg-soft: var(--lp-surface-2); - --cg-panel: var(--lp-wash); - --cg-white: var(--lp-surface); - --cg-danger: var(--lp-red-deep); - /* Hover must be DARKER than the base, and Loopable defines no darker blue, so it is - derived rather than invented β€” a new literal here would re-create the exact problem - this block just removed. */ - --cg-primary-hover: color-mix(in srgb, var(--lp-blue-solid) 82%, #000); - /* --cg-note-ink removed by wave-10 item 9: its only consumer was the .cg-view-note band, - which the item deleted. The rail's description line is muted grey (--lp-muted), not this - yellow-on-yellow ink, so there was nothing left to carry it. */ - --cg-z-editor: 40; - --cg-z-menu: 50; - --cg-z-column: 60; - /* ⭐ OWNER ITEM 11 (2026-08-23) β€” MAP-LOCAL FLOATING CHROME, its own step so it can be told - apart from a DIALOG. The route planner is an `absolute` panel inside the map frame; it needs - to beat the map's own contents and the selection bar (`--cg-z-menu`) and nothing else. It used - to borrow `--cg-z-overlay`, which is the PORTAL step, and that is how a map panel ended up - painting over the record detail. */ - --cg-z-mapchrome: 65; - --cg-z-drawer: 70; - /* ⭐⭐ OWNER ITEM 11 β€” A MODAL DIALOG PORTAL'D TO : the record detail and the - linked-record grid, which share `.cg-record-backdrop`. - Owner: *"the Detail records when clicked should ALWAYS be at the top of every other - navigation pop-up."* It was `--cg-z-drawer` (70) and the Map's route planner was 95, so - opening a record from a pin painted the record UNDER the panel it was opened from β€” the - dialog you just asked for, behind the thing you asked from. - ⚠ ABOVE the shell's own layers too (`.shell-newdb`'s scrim at 80, `.shell-nav-tip` at 90), - because "every other navigation pop-up" includes the ones outside the grid. */ - --cg-z-record: 100; - /* β›”β›” THE PORTAL'D OVERLAY STEP, AND IT IS ABOVE THE DIALOG STEP ON PURPOSE. - `AnchoredOverlay` renders through `BodyPortal` β€” a DIRECT CHILD OF , so it - resolves in the ROOT stacking context and its z-index competes with the app's - dialogs rather than with the surface it was opened from. `.cg-fsel-pop` carries - `.cg-pop` (50) and `.set-backdrop` is 70, so every field picker opened inside - Manage user PAINTED UNDERNEATH THE SETTINGS DIALOG: open, visible, 232x263px, - and behind. `document.elementFromPoint` at the popover's own centre returned - `.cg-cond-row` β€” an element of the dialog β€” so every click landed on the dialog. - MEASURED on the deployed build, not deduced. - ⚠ WHY THE OP DROPDOWN NEXT TO IT WORKED AND HID THIS FOR SO LONG: it is a native - ``. The - ::-webkit-color-swatch / ::-moz-color-swatch rules that used to strip the native chrome are - GONE with the input β€” a dead vendor pseudo-element is the kind of thing that reads as - load-bearing to the next person. Same 24px circle in the same slot; the fill arrives as an - inline style because it is DATA (the option's colour), not a token. */ -.cg-option-color { - width: 24px; - height: 24px; - padding: 0; - border: 1px solid var(--lp-line); - border-radius: 50%; - background: #fff; - cursor: pointer; -} -.cg-option-color:focus-visible { - outline: 2px solid var(--lp-blue-deep); - outline-offset: 1px; -} -.cg-option-color:disabled { - cursor: default; - opacity: 0.35; -} - -/* The ten brand swatches (R5): each hue's `-tint` on the top row, its `-pastel` beneath, so - the grid reads as five columns of one hue rather than ten unrelated dots. */ -.cg-swatch-pop { padding: 8px; } -.cg-swatch-grid { - display: grid; - grid-template-columns: repeat(5, 28px); - gap: 6px; -} -.cg-swatch { - display: inline-grid; - place-items: center; - width: 28px; - height: 28px; - padding: 0; - border: 1px solid rgba(20, 24, 40, 0.12); - border-radius: var(--lp-r-md); - cursor: pointer; -} -.cg-swatch:hover { border-color: rgba(20, 24, 40, 0.34); } -.cg-swatch.is-on { border-color: var(--lp-ink); } -.cg-swatch:focus-visible { - outline: 2px solid var(--lp-blue-deep); - outline-offset: 1px; -} -.cg-option-name { - min-width: 0; - height: 31px; -} -.cg-option-remove { - display: inline-grid; - place-items: center; - width: 28px; - height: 28px; - padding: 0; - border: 0; - border-radius: var(--lp-r-sm); - background: transparent; - color: var(--lp-muted); - cursor: pointer; -} -.cg-option-remove:hover { background: var(--lp-red-tint); color: var(--lp-red-deep); } -.cg-option-remove svg { - width: 14px; - height: 14px; - fill: none; - stroke: currentColor; - stroke-width: 1.6; - stroke-linecap: round; -} -.cg-option-add { - justify-self: start; - padding: 2px 0; - border: 0; - background: transparent; - color: var(--lp-blue-solid); - font: inherit; - font-size: var(--lp-fs-2xs); - font-weight: 600; - cursor: pointer; -} -.cg-option-add:hover { text-decoration: underline; } -.cg-field-hint { - display: block; - font-size: var(--lp-fs-3xs); - line-height: 1.45; - color: #8a8a96; - padding: 2px 0 4px; -} - -.cg-rollup-conditions { - display: grid; - gap: 8px; -} - -.cg-rollup-conditions__head { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; - color: var(--cg-text); - font-size: var(--lp-fs-2xs); - font-weight: 650; -} - -.cg-rollup-conditions__head .cg-btn { - min-height: 28px; - padding: 4px 9px; -} - -.cg-rollup-condition { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 30px; - align-items: center; - gap: 6px; -} - -.cg-rollup-condition > input { - grid-column: 1 / span 2; -} - -.cg-rollup-condition .cg-icon-btn { - width: 30px; - height: 30px; -} - -/* ── WAVE 28 Β· R4 / C1 (session C) β€” the set-statistic threshold's input ────────────────────── - A condition row is a 3-column grid (field, operator, remove) and the ordinary value input - already spans the first two on a second line. The sigma input needs the same span PLUS its - unit beside it: the number is meaningless alone, and the sign is load-bearing (negative reads - BELOW the mean), so a bare box would be a control that will not say what it sets - ([[wrong-parent-not-broken-control]]). - ⚠ `grid-column` on the LABEL, not on its input: the input is now a grandchild of the row, so - the `.cg-rollup-condition > input` rule above no longer reaches it β€” which is the trap that - turns an extra child into an extra column. */ -.cg-rollup-condition > .cg-cond-ref { - grid-column: 1 / span 2; - display: grid; - grid-template-columns: 84px minmax(0, 1fr); - align-items: center; - gap: 8px; -} - -.cg-rollup-condition > .cg-cond-ref > span { - color: var(--cg-muted); - font-size: var(--lp-fs-2xs); - line-height: 1.35; -} -/* why a control is unavailable, in the place the control would have been. An empty popover - reads as broken; a sentence reads as a decision (CG-3). */ -.cg-pop-note { - font-size: var(--lp-fs-2xs); - line-height: 1.45; - color: #6b6b76; - padding: 2px 8px 8px; - max-width: 260px; -} - -/* checkbox / radio rows */ -.cg-check-row, -.cg-radio-row { - display: flex; - align-items: center; - gap: 9px; - padding: 6px 8px; - border-radius: var(--lp-r-md); - cursor: pointer; -} -.cg-check-row:hover, -.cg-radio-row:hover { - background: var(--lp-surface-2); -} -.cg-check-row input, -.cg-radio-row input { - accent-color: var(--lp-blue-deep); - width: 15px; - height: 15px; - cursor: pointer; - flex: 0 0 auto; -} -.cg-check-row.is-locked { - cursor: default; -} -.cg-check-row.is-locked:hover { - background: transparent; -} -/* Item 12 (2026-08-02) β€” a HIDDEN field's row reads as hidden. The checkbox already carried - the state; at 15px it is the smallest thing in the row and you have to look for it, so a - list with four columns hidden looked identical to one with none. Muted ink only β€” never a - strike-through or a fill: the row is still a live control and both of those read as - "disabled", which the locked row genuinely is. */ -.cg-check-row.is-off .cg-check-label, -.cg-check-row.is-off .cg-type-icon { - color: var(--lp-muted); -} - -/* ---- owner item 23 β€” the six-dot reorder grip in the Hide-fields panel ------------------- - Quiet until the row is hovered: a column of grips down a 20-field list competes with the - checkboxes for the same glance, and the handle only matters once you have decided to move - something. It stays LAID OUT at all times (opacity, never display) so nothing shifts - sideways under the pointer as you move down the list. */ -.cg-field-grip { - flex: 0 0 auto; - display: inline-flex; - align-items: center; - justify-content: center; - width: 14px; - height: 18px; - padding: 0; - border: 0; - background: none; - /* ⚠ MEASURED, then corrected. This was `--lp-line` at rest β€” the hairline token β€” and the - first 3x shot showed six dots that were effectively invisible until hovered. "Quiet" was - the intent and "absent" was the result, and the owner asked for a SIX-DOT HANDLE, so an - affordance nobody can see is not a subtler version of the item, it is a missing one. - Muted ink at 55% keeps it recessive against the label while staying legible at rest. */ - color: var(--lp-muted); - opacity: 0.55; - cursor: grab; - transition: opacity 0.12s ease; -} -.cg-check-row:hover .cg-field-grip { - opacity: 1; -} -.cg-field-grip:active { - cursor: grabbing; -} -/* The locked row and the search-narrowed list both keep the handle in place but inert β€” the - aria-label and title say which of the two it is. Dimmer than the resting state, so "cannot - be dragged" is visible rather than only discoverable by trying. */ -.cg-check-row.is-locked .cg-field-grip, -.cg-field-grip:not([draggable="true"]) { - cursor: default; - opacity: 0.3; -} -.cg-check-row.is-locked:hover .cg-field-grip, -.cg-check-row:hover .cg-field-grip:not([draggable="true"]) { - opacity: 0.3; -} -.cg-field-grip:focus-visible { - outline: 2px solid var(--lp-blue-deep); - outline-offset: 1px; - border-radius: var(--lp-r-sm); - color: var(--lp-muted); -} -/* The row in flight, and the row it would land on. The drop marker is a LINE, not a fill: a - filled target reads as "this row is selected", which is the other thing this list does. */ -.cg-check-row.is-dragging { - opacity: 0.45; -} -.cg-check-row.is-drop-target { - box-shadow: inset 0 2px 0 -1px var(--lp-blue-deep); -} -/* Wave-8 I18/I20 β€” the field-type and display-mode marks (icons.tsx). Muted so - they read as a quiet TYPE cue beside the label rather than competing with it; - `flex: 0 0 auto` keeps a long field name from squashing the glyph, and the - gap is the row's own so the icon sits in the same rhythm as the checkbox. */ -.cg-type-icon, -.cg-mode-icon { - flex: 0 0 auto; - color: #6b7280; -} -.cg-radio-row input:checked ~ .cg-mode-icon, -.cg-check-row input:checked ~ .cg-type-icon { - color: #202433; -} -.cg-check-label { - flex: 1 1 auto; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -/* wave17 GRID β€” owner item 8. A radio row may carry a line of help under its name, which the - ellipsis rules above would clip to nothing. Scoped to `.cg-radio-row` so the checkbox lists - (fields, totals, comparisons β€” long labels in a narrow panel) keep their single-line - truncation, which is right for a NAME and wrong for a SENTENCE. */ -.cg-radio-row .cg-check-label { - white-space: normal; - overflow: visible; -} -.cg-radio-help { - display: block; - padding: 2px 0 0; - max-width: 220px; -} -/* R7 (2026-08-02) β€” the RADIO rows never got the treatment their checkbox twins have had - since wave 2, and they are the ones that list FIELD LABELS (the Group-by popover): a - two-line "Estimated missed revenue, last 12 months" pushed the row below it out of the - rhythm and made the radio look mis-aligned with its own text. - ⚠ `:not([class])` is load-bearing, not tidiness. It keeps this rule scoped to the simple - field-label rows; richer controls own their own layout. */ -.cg-radio-row > span:not([class]) { - flex: 1 1 auto; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.cg-lock-tag { - font-size: var(--lp-fs-3xs); - font-weight: 600; - letter-spacing: normal; - /* item 11: sentence case, and the 10px one-off gives way to the 3xs token. */ - color: var(--lp-yellow-deep); - background: var(--lp-yellow-tint); - border-radius: var(--lp-r-sm); - padding: 2px 6px; -} - -.cg-pop-footer { - display: flex; - gap: 4px; - margin-top: 4px; - padding-top: 6px; - border-top: 1px solid var(--lp-line); -} -.cg-link-btn { - flex: 1 1 auto; - height: 28px; - border: 1px solid transparent; - border-radius: var(--lp-r-md); - background: transparent; - color: var(--lp-ink); - font: inherit; - font-size: var(--lp-fs-xs); - /* R7 β€” a fixed 28px height with a label free to wrap is the worst of both: the second line - is CLIPPED rather than shown. Every label here is ours ("Show all", "+ Add condition - group", "Copy from another view"), so one line is always the right answer. */ - white-space: nowrap; - cursor: pointer; -} -.cg-link-btn:hover { - background: var(--lp-blue-tint); -} -/* Item 12 (2026-08-02) β€” the Hide-fields panel's bulk row, boxed. `--lp-surface-2` is the - app's one "quiet slot" fill (the record modal's read-only rows use it for the same reason), - so the pair reads as a tray under the list rather than as two more rows of it. The box - replaces the hairline: keeping both would draw two separators for one boundary. */ -.cg-fields-footer { - margin-top: 6px; - padding: 4px; - border-top: 0; - border-radius: var(--lp-r-md); - background: var(--lp-surface-2); -} -.cg-fields-footer .cg-link-btn:hover { - /* on the grey tray the blue-tint hover reads as a selection; white reads as "this is the - button", which is what a hover on a tray needs to say. */ - background: var(--lp-surface); -} -.cg-fields-section + .cg-fields-section { - margin-top: 10px; - padding-top: 8px; - border-top: 1px solid var(--lp-line); -} -.cg-fields-section-title { - padding: 0 10px 5px; - color: var(--lp-muted); - font-size: var(--lp-fs-3xs); - font-weight: 700; - letter-spacing: .04em; - text-transform: uppercase; -} - -/* search */ -.cg-search { - position: relative; - display: inline-flex; - align-items: center; - /* `min-width: auto` is a flex item's DEFAULT and it refuses to shrink below its content, - which is what pushed the record count out of the toolbar's visible box at the widths the - grid actually runs at. ⭐ W36-T54: that width was `984px with the outer nav open` and is now - **752px with both rails open at a 1440 window** (1440 - 344 - 344), so the pressure this rule - absorbs is 232px greater than when it was written. Same trap as `.cg-select`. The - search is the one control that degrades gracefully when narrowed, so it absorbs the - pressure instead of the count. */ - min-width: 0; - /* ⚠ item 14 (2026-08-02): was `flex: 1 1 auto` while this sat AFTER `.cg-tb-spacer`, where - growing was harmless β€” it and the spacer were the only two flexible items and the input's - own `max-width` capped the result. Now that it sits INSIDE the left cluster, growing would - split the slack with the spacer and strand the count mid-strip. It never grows and still - shrinks first, which is the sentence above, unchanged in intent. */ - flex: 0 1 auto; - margin-left: 4px; -} -.cg-search-icon { - position: absolute; - left: 9px; - display: inline-flex; - color: #8a8a96; - pointer-events: none; -} -.cg-search-input { - /* item 14: `width: 100%` measured the (previously growing) wrapper; now the INPUT carries - the size and the wrapper is content-sized around it, so the two cannot disagree about - where the control ends and leave a dead strip after the box. */ - width: 210px; - max-width: 100%; - min-width: 0; - height: 30px; - padding: 0 26px 0 30px; - border: 1px solid var(--lp-line); - border-radius: var(--lp-r-md); - background: #ffffff; - font: inherit; - font-size: var(--lp-fs-xs); - color: var(--lp-ink); - transition: border-color 0.12s ease, box-shadow 0.12s ease; -} -.cg-search-input::placeholder { - color: #a2a2ac; -} -.cg-search-input:focus { - outline: none; - border-color: var(--lp-blue-deep); - box-shadow: 0 0 0 3px rgba(157, 191, 242, 0.45); -} -.cg-search-clear { - position: absolute; - right: 6px; - width: 18px; - height: 18px; - display: inline-flex; - align-items: center; - justify-content: center; - border: none; - border-radius: 50%; - background: transparent; - color: #8a8a96; - font-size: var(--lp-fs-md); - line-height: 1; - cursor: pointer; -} -.cg-search-clear:hover { - background: #eceef1; - color: #5a5a66; -} - -/* record count */ -.cg-count { - margin-left: 12px; - color: #8a8a96; - font-size: var(--lp-fs-xs); - font-variant-numeric: tabular-nums; - white-space: nowrap; - /* The count states how much data is on screen out of how much exists. It is the one thing in - this strip that must never be the part that gets pushed out, so it never shrinks. */ - flex: 0 0 auto; -} - -/* A windowed count is long ("showing 200 of 5,728 records (filtered from 201,558)"). At the - width the grid runs at with the outer nav open there is not room for it beside all six - controls, so below a threshold the scope clause drops and the full text stays on hover. - A media query works here because the grid renders in its OWN iframe: the iframe width IS the - container width, so this needs no ResizeObserver. */ -.cg-count-compact { - display: none; -} - -/* W36-T54 β€” `@container`, not `@media`: the number is what the TOOLBAR needs, and the toolbar is - `window - both rails` wide, never the window. See the note on `.cg-toolbar`. */ -@container cgtoolbar (max-width: 1180px) { - .cg-count-full { - display: none; - } - .cg-count-compact { - display: inline; - } -} - -/* ------------------------------------------------------------------------- */ -/* Filter / Sort condition builders (Batch 2). Wide popover, one row per */ -/* condition: prefix + field-select + op-select + value(s) + remove. */ -/* ------------------------------------------------------------------------- */ -.cg-pop--wide { - /* 620px. Derived, not taste: the OPERATOR select must never clip its label - (see .cg-cond-op) which costs 136px at every level, so the deepest (level-3) - row needs 620 to still leave a ~104px value box β€” measured, and no worse - than the ~114px it had before the operator was widened. 560 left only 48px - there. Collision-clamped to the viewport by OverlaySurface. */ - width: 620px; - min-width: min(620px, calc(100vw - 16px)); -} -.cg-builder-empty { - padding: 4px 8px 10px; - color: #8a8a96; - font-size: var(--lp-fs-xs); -} -/* One line of a condition level = [prefix | leaf-row OR nested group]. - The prefix is "Where" (first), the and/or SELECT (second β€” one conjunction per - level, Airtable-style), or a muted echo of it (third onwards). */ -.cg-cond-line { - display: flex; - align-items: flex-start; /* keeps the prefix level with a group's first line */ - gap: 6px; - padding: 4px 8px; -} -.cg-cond-row { - flex: 1 1 auto; - min-width: 0; - display: flex; - align-items: center; - gap: 6px; -} -.cg-cond-prefix { - flex: 0 0 auto; - width: 52px; - color: #8a8a96; - font-size: var(--lp-fs-2xs); - text-align: right; - white-space: nowrap; - line-height: 30px; /* align with the 30px controls beside it */ -} -/* the and/or picker β€” sized so "and" + the native arrow both fit (a 44px box - clipped it to "c"), and aligned to the prefix column beside it */ -.cg-cond-conj { - flex: 0 0 58px; - padding: 0 2px 0 6px; -} -.cg-cond-conj-echo { - font-variant: none; -} - -/* --- nested CONDITION GROUP (Airtable's "Add condition group") ------------- */ -.cg-cond-group { - flex: 1 1 auto; - min-width: 0; - display: block; - border: 1px solid var(--lp-line); - border-radius: var(--lp-r-md); - background: rgba(20, 24, 40, 0.045); -} -.cg-cond-group-head { - display: flex; - align-items: center; - gap: 6px; - padding: 5px 6px 3px 10px; -} -.cg-cond-group-sum { - flex: 1 1 auto; - min-width: 0; - color: #8a8a96; - font-size: var(--lp-fs-2xs); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.cg-cond-group-body { - display: block; - padding-bottom: 2px; -} -/* inside a group the prefix column narrows β€” nesting already conveys grouping. - Widths tuned so a LEVEL-3 row still yields a usable value box (measured). */ -.cg-cond-group-body .cg-cond-line { - padding: 2px 6px; -} -.cg-cond-group-body .cg-cond-prefix { - width: 54px; - flex-basis: 54px; -} -.cg-cond-group-body .cg-cond-conj { - flex-basis: 54px; -} -/* field names are tenant content and MAY truncate, so nesting costs them width - first. The operator deliberately has NO nested override β€” see .cg-cond-op. */ -.cg-cond-group-body .cg-cond-field { - flex-basis: 96px; -} - -/* shared select + input control skin. - box-sizing + min-width:0 are load-bearing, not cosmetic: a flex item defaults - to min-width:auto, so a lays its picker arrow INSIDE - the content box, so the readable text width is - clientWidth - paddingLeft - paddingRight - ARROW - with ARROW measured at 20.1px in Chrome at this skin (probe: clone the control - into an auto-width slot; intrinsic - widestOptionText - padding - border). - Widest labels at 12.5px Inter: operator "does not contain" = 92.9px, field - "Days since order" = 91.0px. 92.9 + 20.1 + 16 padding + 2 border = 131 -> 136 - with slack for a fallback font. At 104px the operator rendered "is on or befo" - and "does not co" with the tail under the arrow. - NOTE: padding-right does NOT fix this β€” it shrinks the content box and clips - MORE. Width is the only lever short of appearance:none. */ -/* ⚠ EXPLICIT min-widths on every condition select (2026-07-27). A flex line breaks on each - item's hypothetical size = max(flex-basis, min-width), and `min-width:auto` on a `, which stretched to the flex - line on its own. A button is content-sized, so it needs telling: full width, and the - `.cg-fsel-label` ellipsis carries "Insert a field reference…" at the narrow end. */ -.cg-formula-insert .cg-fsel { flex: 1 1 auto; min-width: 0; } -.cg-formula-error { color: #8b1a14; } - -/* Item 11 β€” rating stars (picker buttons + static rows). */ -.cg-stars { display: inline-flex; gap: 2px; align-items: center; padding: 4px 2px; } -.cg-star-btn { - border: 0; - background: none; - padding: 2px; - cursor: pointer; - line-height: 0; - border-radius: 3px; -} -.cg-star-btn:hover { background: color-mix(in srgb, var(--lp-yellow) 30%, transparent); } -.cg-star-btn:focus-visible { outline: 2px solid var(--lp-blue-solid); outline-offset: 1px; } -.cg-stars--static { padding: 0; } -.cg-rating-max { width: 72px; } - -/* Items 1/2 β€” menu panes. */ -.cg-desc-default { - background: #f3f5f8; - border-radius: var(--lp-r-sm); - padding: 6px 8px; - white-space: pre-line; -} - -/* Item 11 β€” the drawer's actionable links + checkbox. */ -.cg-detail-action { - display: inline-block; - margin-top: 4px; - font-size: var(--lp-fs-2xs); - color: var(--lp-blue-solid); - text-decoration: none; -} -.cg-detail-action:hover { text-decoration: underline; } -.cg-detail-checkbox { justify-self: start; width: 15px; height: 15px; accent-color: var(--lp-blue-solid); } - -/* ===== Wave 6 (2026-07-28) β€” view modes, add-field "+", scope, retype ===== */ - -/* Item 10 β€” the toolbar's mode switcher. Wave-7 item W12: the segmented control is - gone β€” the switcher is the shared toolbar Popover (`.cg-tb-btn` family); only the - wrapper and the per-mode field select remain. */ -.cg-modes { display: inline-flex; align-items: center; gap: 6px; } -.cg-mode-field { max-width: 150px; } -/* (`.cg-mode-rename*` removed 2026-08-23 with `ViewRenameForm`, owner item 1.) */ -.cg-mode-empty { - padding: 28px 16px; - color: #6a6f78; - font-size: var(--lp-fs-xs); -} - -/* Item 10 β€” LIST view. */ -.cg-listview { height: 100%; overflow: auto; background: #fff; } -.cg-lv-group { - display: flex; - align-items: center; - gap: 8px; - width: 100%; - border: 0; - border-bottom: 1px solid #e4e7eb; - background: #eef0f3; - padding: 7px 12px; - font: inherit; - font-size: var(--lp-fs-xs); - font-weight: 600; - color: var(--lp-ink); - cursor: pointer; - text-align: left; -} -.cg-lv-chev { font-size: var(--lp-fs-4xs); color: #6a6f78; } -.cg-lv-count { color: #6a6f78; font-weight: 500; } -.cg-lv-row { - display: flex; - align-items: baseline; - gap: 14px; - width: 100%; - border: 0; - border-bottom: 1px solid #eef0f3; - background: #fff; - padding: 8px 12px; - font: inherit; - cursor: pointer; - text-align: left; -} -.cg-lv-row:hover { background: #f7f8fa; } -.cg-lv-title { - flex: 0 0 220px; - font-size: var(--lp-fs-xs); - font-weight: 600; - color: #1f2733; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.cg-lv-cells { - display: flex; - flex-wrap: wrap; - gap: 4px 16px; - min-width: 0; -} -.cg-lv-cell { display: inline-flex; gap: 5px; align-items: baseline; max-width: 260px; } -/* --------------------------------------------------------------------------- - Item 11 (2026-08-02) β€” the uppercase sweep. THE RULE, applied at all 13 sites: - - Every one of them was the same micro-kicker β€” 3xs + 600 + positive tracking + - `text-transform: uppercase` β€” and the owner wants sentence case. Deleting the - transform alone is not the fix: caps carry ~30% more optical weight than - lowercase at the same px, and the positive letter-spacing only exists BECAUSE - caps need opening up. Left as-is, an 11px muted label becomes genuinely hard to - read and the tracking reads as loose. So each site takes three changes together: - 3xs -> 2xs (one step up, buying back what the caps were carrying) - letter-spacing -> normal (tracking is a caps device) - font-weight: 600 STAYS (it is what still says "label, not value") - TWO SITES STAY AT 3xs, and both were decided by looking at the rendered page - rather than by applying the rule (A/B'd live on the Space, 2026-08-02): - `.cg-lock-tag` β€” a pill annotating 13px text; it must stay smaller than what - it annotates, and it sits inches from the sentence-case `Pre-set` chip, - which is now its typographic twin. - `.cg-lv-k` BELOW β€” the "caps were carrying legibility" argument does NOT - apply to it. Every other site is a LONE kicker with nothing beside it; this - one always sits immediately left of its value, so the pair itself carries - the legibility. Side by side, 3xs is the better of the two: the size step - reinforces the label/value split that colour already states (at 2xs the - distinction leans on colour alone), and it keeps the density the list view - exists for β€” a 2xs key wraps pairs onto a second line sooner. - - The source strings were ALREADY sentence case everywhere ("Filter", "Sort", - "Notes", "Locked"), so this file was the whole of the bug. - - Kanban is untouched by all of this: `.cg-kb-cell .cg-lv-k` (0,2,0) already - overrode both the size and the transform, so those cards were never uppercase. - --------------------------------------------------------------------------- */ -.cg-lv-k { - font-size: var(--lp-fs-3xs); - color: #8a8f98; - white-space: nowrap; -} -.cg-lv-v { - font-size: var(--lp-fs-xs); - color: var(--lp-ink); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* Item 10 β€” CALENDAR view. */ -.cg-calview { height: 100%; overflow: auto; background: #fff; padding: 10px 12px; } -.cg-cal-bar { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; } -.cg-cal-nav { padding: 2px 9px; } -.cg-cal-title { font-size: var(--lp-fs-sm); font-weight: 600; color: #1f2733; min-width: 130px; } -.cg-cal-note { font-size: var(--lp-fs-2xs); color: #6a6f78; } -.cg-cal-nodate { - margin-left: auto; - font-size: var(--lp-fs-2xs); - color: #8a5b14; - background: #fbeedb; - border-radius: var(--lp-r-lg); - padding: 2px 10px; -} -.cg-cal-grid { - display: grid; - grid-template-columns: repeat(7, 1fr); - border-left: 1px solid #e4e7eb; - border-top: 1px solid #e4e7eb; -} -.cg-cal-dow { - padding: 4px 6px; - font-size: var(--lp-fs-2xs); - color: #8a8f98; - border-right: 1px solid #e4e7eb; - border-bottom: 1px solid #e4e7eb; - background: #f7f8fa; -} -.cg-cal-cell { - min-height: 86px; - max-height: 150px; - overflow: auto; - padding: 3px 4px; - border-right: 1px solid #e4e7eb; - border-bottom: 1px solid #e4e7eb; -} -.cg-cal-cell.is-blank { background: var(--lp-wash); } -.cg-cal-cell.is-today { background: color-mix(in srgb, var(--lp-yellow) 20%, transparent); } -.cg-cal-day { font-size: var(--lp-fs-3xs); color: #6a6f78; margin: 0 0 3px 2px; } -.cg-cal-chip { - display: block; - width: 100%; - border: 0; - border-radius: 3px; - background: #e7f0fa; - color: var(--lp-blue-solid); - font: inherit; - font-size: var(--lp-fs-3xs); - text-align: left; - padding: 2px 6px; - margin-bottom: 2px; - cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.cg-cal-chip:hover { background: #d9e7f6; } - -/* Item 10 β€” KANBAN view. */ -.cg-kbview { height: 100%; overflow: hidden; display: flex; flex-direction: column; background: #f7f8fa; } -.cg-kb-note { - padding: 6px 12px; - font-family: inherit; - font-size: var(--lp-fs-2xs); - color: #6a6f78; - background: #fff; - border-bottom: 1px solid #e4e7eb; -} -.cg-kb-lanes { - flex: 1; - display: flex; - gap: 10px; - overflow-x: auto; - overflow-y: hidden; - padding: 10px 12px; -} -/* ⭐ Wave-18 item 1a β€” THE LANE IS 250px WIDE EVEN WHEN A VALUE ISN'T. - `flex: 0 0 250px` sets the BASIS, not the width: a flex item's `min-width` defaults to - `auto`, which in a row container resolves to the item's MIN-CONTENT width, and min-content - floors the basis. One 80-character unbroken string inside a card therefore made the lane - ~700px wide and pushed every other lane off the board β€” the board scrolled horizontally - because of CONTENT, which it must never do (only lanes x 250px may make it scroll). - `min-width: 0` is the whole fix at THIS level; it hands the overflow down to the card, where - the two rules below turn it into a wrap/ellipsis instead of a spill. */ -.cg-kb-lane { - flex: 0 0 250px; - min-width: 0; - display: flex; - flex-direction: column; - background: #eef0f3; - border-radius: var(--lp-r-md); - max-height: 100%; -} -/* ═══ W26-C ITEM 12 (R8) β€” the "Add option" lane ═══ - A lane-shaped slot at the end of the rail, deliberately QUIETER than a real lane: dashed and - unfilled, so the board still reads as "these are the stages" and the door does not look like - a stage with nothing in it. It borrows `.cg-kb-lane`'s 250px basis so the rail's rhythm holds, - and drops the filled background that would make it a fourth column of content. - `align-self: flex-start` keeps it the height of its button instead of stretching to the - tallest lane β€” a full-height dashed rectangle beside three lanes of cards reads as an empty - stage, which is the one thing it must not say. */ -.cg-kb-lane--add { - background: none; - border: 1px dashed #d4d8de; - align-self: flex-start; - padding: 6px; -} -.cg-kb-addopt { - width: 100%; - border: 0; - background: none; - padding: 6px 8px; - font: inherit; - font-size: var(--lp-fs-xs); - font-weight: 500; - color: var(--lp-muted); - text-align: left; - border-radius: var(--lp-r-sm); - cursor: pointer; -} -.cg-kb-addopt:hover { background: #eef0f3; color: var(--lp-ink); } -/* ═══ end W26-C ITEM 12 ═══ */ -.cg-kb-head { display: flex; align-items: center; gap: 8px; padding: 8px 10px 4px; } -/* Item 1a β€” the lane HEAD is the third place a long string reaches, and the only one whose - string is a field's OPTION rather than a record's value. Found by screenshot, not by reading: - with the lane pinned to 250px the pill stopped widening the board and started painting ACROSS - the two lanes to its right, which is the same bug wearing different clothes. The pill - ellipsizes; the count beside it does not shrink at all, because a truncated "1,534" would be - a wrong number rather than a shortened label. */ -.cg-kb-pill { - font-size: var(--lp-fs-3xs); - font-weight: 600; - border-radius: var(--lp-r-lg); - padding: 2px 9px; - background: #dfe3e8; - color: var(--lp-ink); - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.cg-kb-count { - font-family: inherit; - font-size: var(--lp-fs-2xs); - color: #6a6f78; - font-variant-numeric: tabular-nums; - flex: 0 0 auto; -} -.cg-kb-cards { flex: 1; overflow-y: auto; padding: 4px 8px 10px; } -.cg-kb-card { - background: #fff; - border: 1px solid #e0e3e8; - border-radius: var(--lp-r-md); - padding: 7px 9px; - margin-bottom: 6px; - box-shadow: 0 1px 1px rgba(16, 24, 32, 0.04); -} -.cg-kb-card.is-draggable { cursor: grab; } -/* Item 1a, the title. `anywhere` rather than `break-word`: the two break identically on the - PAINTED line, but only `anywhere` also shrinks the element's MIN-CONTENT size, and - min-content is what the lane above was being floored by. `break-word` here would wrap the - text and still report a 700px minimum to the ancestors β€” the lane would be fixed by its own - `min-width: 0` and the card would then overflow it instead. */ -.cg-kb-title { - display: block; - width: 100%; - border: 0; - background: none; - padding: 0 0 2px; - font: inherit; - font-size: var(--lp-fs-xs); - font-weight: 600; - color: #1f2733; - text-align: left; - cursor: pointer; - overflow-wrap: anywhere; -} -.cg-kb-title:hover { color: var(--lp-blue-solid); text-decoration: underline; } -.cg-kb-cell { - display: flex; - gap: 6px; - align-items: baseline; - font-family: inherit; - font-size: var(--lp-fs-xs); - /* Item 1a β€” the second floor. The row is itself a flex item of the card's column, and it is - a flex CONTAINER for the key/value pair below; without this the pair's min-content width - reaches the lane through it. */ - min-width: 0; -} -/* The `text-transform: none` / `letter-spacing: normal` this block used to carry came off - with item 11 β€” `.cg-lv-k` no longer uppercases anything, so overriding it here would be - a reset of a rule that no longer exists. The font-size override stays: kanban cards read - at card size, not list-row size. */ -/* Item 1a β€” the LAST floor, and the only one that can be lowered here rather than on the base - rule. `.cg-lv-k` `:3477` / `.cg-lv-v` `:3482` are SHARED with ListView, whose `.cg-lv-cell` - caps itself at 260px and therefore never had this bug; putting `min-width: 0` there would - change every list row to fix a kanban card. Scoped to `.cg-kb-cell`, the blast radius is the - board. - - What each mode does with the extra freedom, and why they differ: - UNCLAMPED β€” the base rule's `white-space: nowrap; overflow: hidden; text-overflow: ellipsis` - still applies, and it had been dead code: an ellipsis can only appear once the box is - ALLOWED to be narrower than its text, which `min-width: auto` forbade. So the fix here is - `min-width: 0` alone, and the value finally truncates on one line as it always claimed to. - CLAMPED β€” the C-DISP rule at the bottom of this file switches to `white-space: normal` for - its 2-line clamp, and an unbroken "aaaa..." is ONE word: normal wrapping has nowhere to - break it, so min-content stayed the full string even at `min-width: 0`. That is what - `overflow-wrap: anywhere` is for; without it the clamp shows one enormous line. */ -.cg-kb-cell .cg-lv-k, -.cg-kb-cell .cg-lv-v { - font-family: inherit; - font-size: var(--lp-fs-xs); - line-height: 1.35; - min-width: 0; - overflow-wrap: anywhere; -} -/* β›” W29-T80 β€” a CHOICE value on a card is a tinted chip, as it is on the canvas, in the record - panel and on the lane header. The colours are INLINE (they come from the field's stored - `optionColors` and are per-option, so they cannot live in a stylesheet); this rule is only the - chip's shape. Kept beside the pair above because it must inherit the same wrap behaviour β€” a - long option label has to break inside the chip rather than widen the card. */ -.cg-kb-cell .cg-kb-chip { - border: 1px solid transparent; - border-radius: 999px; - padding: 0 8px; - line-height: 1.5; - font-weight: 500; - /* `inline-block`, not `inline`: an inline box ignores the vertical padding above and the - tint would paint outside the row it belongs to. */ - display: inline-block; - max-width: 100%; -} -/* ⚠ WHICH OF THE TWO SHRINKS, and why `min-width: 0` alone was not the answer. - Both children default to `flex-shrink: 1`, and flexbox distributes shrinkage in proportion to - BASE SIZE β€” so once `min-width: 0` let them shrink at all, the 80-character value (base ~500px) - dragged the "Long value" label (base ~62px) down to about 24px with it, and a `nowrap` label in - a 24px box paints straight over the value it is labelling. The first screenshot showed exactly - that, and it is a regression the previous rule introduced rather than a pre-existing bug. - The label is not a candidate for shrinking: it is short by design and it is the only thing - saying WHAT the value is. So it keeps its width (`flex: 0 0 auto`) and the value absorbs all - of it β€” with a `max-width` for the one case that argument does not cover, a label that is - itself the long string, where the cap bites and the base rule's `nowrap` ellipsis finishes it. */ -.cg-kb-cell .cg-lv-k { - color: var(--lp-muted); - font-weight: 500; - flex: 0 0 auto; - max-width: 45%; - overflow: hidden; - text-overflow: ellipsis; -} -.cg-kb-cell .cg-lv-v { - flex: 1 1 auto; -} -/* ═══ W26-C ITEM 11 β€” a url/email/phone value on a card is a LINK ═══ - It carries `.cg-lv-v` as well, so every rule above still shapes it β€” the clamp, the flex - share, the wrap. This block is only the link's own affordance, and it deliberately does NOT - set a colour of its own: the card's values read as one column of text, and a blue line in the - middle of three grey ones announces itself louder than the record title above it. The - underline appears on hover/focus, which is where the reader is asking the question. The - `:focus-visible` half is not decoration β€” the card is a click target, so without a visible - focus ring the keyboard user cannot tell whether Enter will follow the link or open the - record. */ -.cg-kb-cell .cg-kb-link { - color: inherit; - text-decoration: none; - cursor: pointer; -} -.cg-kb-cell .cg-kb-link:hover, -.cg-kb-cell .cg-kb-link:focus-visible { - color: var(--lp-blue-solid); - text-decoration: underline; -} -/* ═══ end W26-C ITEM 11 ═══ */ -.cg-kb-more { display: block; margin: 2px 0 4px; } - -/* Item 4 β€” the header-row "+" (insert at end). */ -.cg-add-field-btn { - width: 34px; - height: 35px; - border: 0; - border-left: 1px solid #e4e7eb; - border-bottom: 1px solid #e4e7eb; - background: #fff; - color: #6a6f78; - font-size: var(--lp-fs-md); - line-height: 1; - cursor: pointer; -} -.cg-add-field-btn:hover { background: #f3f5f8; color: var(--lp-blue-solid); } - -/* Item 9c β€” the scope control + the Fields panel's cohort chip. */ -.cg-scope-tag { background: #e7f0fa; color: var(--lp-blue-solid); } - -/* Wave-6 INTEGRATION FIX (HOST, per the integration sequence's trivial-fix provision): - the leftmost mode switcher overflows the outer-nav-open width by ~200px, shoving - the record count out of the toolbar (QA: conditions count-fit + measures toolbar-984 - legs, measured overflow 203/183px). ⭐ W36-T54 β€” THE SAME DEFECT RECURRED AT THE SAME PLACE FOR - A NEW REASON and is worth the cross-reference: at 344px rails the strip is 752px, the labelled - controls wanted 864px, and the count sat 102px past the right edge. The wave-6 fix was a wrap; - the wave-15 fix was icon collapse; what neither could do was NOTICE, because both thresholds - were asking the window. They ask the strip now. At narrow widths the toolbar WRAPS β€” the count - stays visible inside it on a second row; the fixed 44px height becomes a minimum so - the flex column below simply yields the extra row's height. */ -/* ⭐ Wave-15 item 11 β€” the toolbar COLLAPSES TO ICONS instead of wrapping or scrolling. - This block used to say `flex-wrap: wrap; height: auto` β€” a second toolbar row, which pushed - the grid down and made the strip's height depend on the window. The owner asked for neither - that nor a scrollbar: the controls give up their WORDS first, because a filter funnel and a - sort glyph are recognisable and "Filter Β· 2" is not worth 60px of a 44px strip. - - β›”β›” W36-T54 β€” THE PARAGRAPH THAT STOOD HERE ARGUED FOR `@media` OVER `@container` AND ITS PREMISE - IS DEAD: *"the grid renders in its OWN iframe, so the iframe width IS the container width"*. It - was true in the Streamlit host and has not been true since that host was deleted β€” the React - shell mounts `CustomerGrid` directly beside the rails. The reasoning is kept rather than erased - because it is a live warning to the next reader: an argument can stay internally sound long after - the world it described stopped existing, and nothing in the battery re-checks a premise. The full - measurement and the containment safety check are on `.cg-toolbar` itself. - - The name survives in `title` + `aria-label` on every collapsed button (see Popover.tsx) β€” - `display: none` removes a label from the accessibility tree, so the aria half is what keeps - these from becoming unnamed buttons rather than a nicety. - - Arithmetic, so the steps are not taste: a labelled control is ~95-125px (18 padding + 14 - icon + 6 gap + label + 6 gap + 10 chevron); seven of them plus a 214px search plus the count - is ~1070-1170px, which is why 1080 is where the first step lands. Icon-only takes each to - 48px, so the same seven fit in ~336px and the strip is comfortable to ~600px. */ -@container cgtoolbar (max-width: 1080px) { - .cg-tb-label { - display: none; - } - /* Tighter without the words, or the icons sit in a lot of empty box. */ - .cg-tb-btn { - padding: 0 7px; - gap: 4px; - } - /* ⚠ Text-only toolbar buttons keep their words at every width β€” they have NO icon to fall - back to, so collapsing them would leave an empty, clickable box. They are what - `.cg-tb-label` exists to distinguish; this makes the exemption explicit rather than - relying on the label span's absence. */ - .cg-tb-addcust, - .cg-mode-field { - padding: 0 9px; - } -} - -/* The second step, for the genuinely cramped case (a narrow embed, or 50%/67% browser zoom, - which scales the LAYOUT viewport and therefore trips these queries exactly as a small window - does). The chevron is the least informative glyph in the button β€” it says "this opens", which - the icon plus a click already teaches β€” so it goes before anything that names a control. - ⭐ W36-T54 β€” 760 -> 480, AND BOTH THE UNIT AND THE NUMBER MOVED. As a WINDOW query, 760 named a - small laptop. As a CONTAINER query it names this strip, which is `window - both rails`: at a - 1440 window with two 344px rails that is 752px, INSIDE the old 760, so leaving it would have - stripped the chevrons off every control on an ordinary screen. - β›”β›” AND THE REPLACEMENT WAS MEASURED, AFTER AN ARITHMETIC ONE WAS WRONG β€” which is this ticket's - own lesson applied to itself. The first attempt was 660, from the sums three lines up (7 icon - controls x ~48 + a 214px search floor + a ~93px count ~= 650). A width sweep on the deployed - build then said two things the sums did not: - Β· β›” **A CONTAINER QUERY MEASURES THE CONTENT BOX, NOT `clientWidth`.** `.cg-toolbar` carries - `padding: 0 10px`, so a `660px` threshold fires at a 680px STRIP β€” every one of these - numbers is 20px tighter than it reads. Chevrons vanished at a 1368 window, i.e. on the - 1366-wide laptops that are the single most common screen this product runs on. - Β· the strip does not actually OVERFLOW until ~357px of content (measured: 392 -> over 0, - 312 -> over 45), because `.cg-search` shrinks first and absorbs the slack, so `scrollWidth - == clientWidth` all the way down. Add the chevrons back (~80px over seven buttons) and the - true floor with them is ~440. - 480 sits above that floor with room and far below any real laptop: chevrons survive to a 500px - strip, so a 1366 window keeps them and the W36-T05 agent-panel case (strip 483, content 463) - gives them up, which is exactly the "genuinely cramped" case this step was written for. */ -@container cgtoolbar (max-width: 480px) { - .cg-tb-btn > svg:last-child { - display: none; - } - .cg-tb-btn { - padding: 0 6px; - gap: 0; - } - /* The search keeps a usable floor instead of shrinking to its own icon. */ - .cg-search-input { - width: 120px; - } -} - -/* ===== Wave 7 (2026-07-28) β€” CLIENT items (customer-grid only) ============= */ - -/* Item W4 (contract C6) β€” column-menu action icons + thin-divider grouping. - Item 19 (2026-08-02) extends the same row shape to the VIEW menu: one icon column, one - line, no wraps. Two menus that do the same kind of thing now look like each other. */ -.cg-column-actions button, -.cg-view-menu button { - display: flex; - align-items: center; - gap: 8px; -} -/* R7 β€” a menu row is ONE LINE. `.cg-mi-text` may ellipsis (it never should at these widths; - it is the backstop that keeps a long label from growing the panel past its ceiling). */ -.cg-column-actions button, -.cg-view-menu button { - white-space: nowrap; -} -/* ⚠ The export pane's title is "Export " β€” TENANT CONTENT under the same nowrap, - which without this would run straight out of the panel's 260px ceiling. Caught by walking - my own item-19 change rather than by an assertion; the menu rows beside it are all closed - vocabulary and genuinely need nothing. */ -.cg-view-menu .cg-pop-title { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.cg-mi-text { - flex: 1 1 auto; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; -} -.cg-view-menu button:hover:not(:disabled) .cg-mi-ic, -.cg-view-menu button.is-danger .cg-mi-ic { - color: inherit; -} -.cg-mi-ic { - display: inline-flex; - align-items: center; - justify-content: center; - width: 16px; - height: 16px; - flex: 0 0 16px; - color: var(--cg-muted); -} -.cg-column-actions button:hover:not(:disabled) .cg-mi-ic, -.cg-column-actions button.is-danger .cg-mi-ic { - color: inherit; -} -.cg-menu-sep { - height: 1px; - margin: 4px 2px; - background: var(--cg-line); -} - -/* Item W9 β€” the Fields panel's permanent-delete affordance. Hidden until the row is - hovered/focused (the panel is a dense list; twenty always-on trash cans read as - danger, one on the row under the pointer reads as an action). */ -.cg-check-del { - display: inline-flex; - align-items: center; - margin-left: auto; - padding: 2px 4px; - border: 0; - border-radius: var(--lp-r-sm); - background: transparent; - color: var(--cg-muted); - font: inherit; - font-size: var(--lp-fs-3xs); - cursor: pointer; - opacity: 0; -} -.cg-check-row:hover .cg-check-del, -.cg-check-del:focus-visible, -.cg-check-del.is-armed { - opacity: 1; -} -.cg-check-del:hover, -.cg-check-del.is-armed { - color: var(--cg-danger); -} -.cg-check-del.is-armed { - font-weight: 600; - white-space: nowrap; -} -.cg-check-del:focus-visible { - outline: 2px solid color-mix(in srgb, var(--lp-blue-solid) 35%, transparent); - outline-offset: -1px; -} - -/* Item W14 β€” the whole kanban card opens the record (title is a span now; the card - itself is the button). */ -.cg-kb-card { - cursor: pointer; -} -.cg-kb-card.is-draggable { - cursor: grab; -} -.cg-kb-card:hover .cg-kb-title { - color: var(--lp-blue-solid); - text-decoration: underline; -} -.cg-kb-card:focus-visible { - outline: 2px solid color-mix(in srgb, var(--lp-blue-solid) 35%, transparent); - outline-offset: 1px; -} - -/* Item W11c (C3) β€” the MAP view: SVG scatter over a coarse US outline, pins in - brand navy, hover/focus in gold. */ -.cg-mapview { - position: relative; - height: 100%; - overflow: auto; - background: #fff; - padding: 10px 12px; - display: flex; - flex-direction: column; -} -.cg-map-bar { - display: flex; - align-items: center; - gap: 10px; - margin-bottom: 8px; - flex-wrap: wrap; - row-gap: 6px; -} -.cg-map-hint { - color: var(--lp-muted); - font-size: var(--lp-fs-3xs); - margin-left: auto; /* the gesture hint trails right; the counts lead left */ - flex: 0 0 auto; -} -.cg-map-count strong { font-weight: 600; color: var(--lp-ink); } - -/* Wave-9 I18 β€” the per-pin Google hand-off, shown when exactly one pin is - selected. Text links on purpose: they navigate away, and dressing a - navigation up as a button is how people end up not knowing they left. */ -.cg-map-go { - display: inline-flex; - align-items: center; - gap: 10px; - flex: 0 0 auto; - font-size: var(--lp-fs-3xs); - max-width: 46%; -} -.cg-map-go a { - color: var(--lp-blue-solid); - text-decoration: none; - border-bottom: 1px solid transparent; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - /* ⚠ A flex child defaults to min-width:auto, so it refuses to shrink below its - own content and blows past max-width instead of ellipsizing. Real customer - names are long; without this the link pushes the gesture hint out of the - row rather than truncating. */ - min-width: 0; -} -.cg-map-go a:hover { border-bottom-color: var(--lp-blue-deep); } -.cg-map-go a:focus-visible { - outline: 2px solid var(--lp-blue-deep); - outline-offset: 2px; - border-radius: 2px; -} -/* ⭐ OWNER ITEM 2 β€” the same box as the pickers it sits beside: 30px tall, `--lp-r-md`, white - ground, `--lp-fs-xs` through the row above. `.cg-select` is the shape being matched; this - cannot simply BE `.cg-select` because that class is a form control's look and this is a - disclosure toggle with an `is-open` state the selects have no equivalent of. */ -.cg-map-route-toggle { - flex: 0 0 auto; - box-sizing: border-box; - height: 30px; - padding: 0 10px; - border: 1px solid var(--lp-line); - border-radius: var(--lp-r-md); - background: #ffffff; - color: var(--lp-ink); - font: inherit; - cursor: pointer; -} -.cg-map-route-toggle:hover, -.cg-map-route-toggle.is-open { - background: var(--lp-blue-tint); - border-color: var(--lp-blue-deep); -} -.cg-map-route-toggle:focus-visible { - outline: 2px solid var(--lp-blue-deep); - outline-offset: 1px; -} -.cg-route-popover { - position: absolute; - /* β›” OWNER ITEM 11 β€” `--cg-z-mapchrome`, NOT `--cg-z-overlay`. This panel is `absolute` inside - the map frame, not portal'd to , so it never needed the portal step; borrowing it is - what put a map panel over the record detail. It still outranks the map's own contents and - the `.cg-selbar` (`--cg-z-menu`), which is everything it has to beat. */ - z-index: var(--cg-z-mapchrome); - top: 48px; - left: 12px; - width: min(360px, calc(100% - 24px)); - max-height: calc(100% - 60px); - overflow-y: auto; - padding: 10px; - border: 1px solid var(--lp-line); - border-radius: 7px; - background: var(--lp-surface); - color: var(--lp-ink); - font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; - font-size: var(--lp-fs-xs); - line-height: var(--lp-lh); - box-shadow: 0 8px 24px rgba(32, 36, 51, 0.16); -} -.cg-route-popover button, -.cg-route-popover input, -.cg-route-popover select, -.cg-route-popover a { - font-family: inherit; -} -.cg-route-popover-head { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - padding-bottom: 8px; - border-bottom: 1px solid var(--lp-line); -} -.cg-route-popover-count { - color: var(--lp-muted); - font-size: var(--lp-fs-3xs); - white-space: nowrap; -} -.cg-route-empty { - display: block; - padding: 10px 2px 2px; - color: var(--lp-muted); - font-size: var(--lp-fs-2xs); - line-height: 1.45; -} -.cg-map-frame { - position: relative; /* the legends float over the map, never in the flow */ - flex: 1; - min-height: 0; - border: 1px solid var(--lp-line); - border-radius: 6px; - background: var(--lp-wash); - overflow: hidden; -} -.cg-map-frame:focus-visible { - outline: 2px solid var(--lp-blue-deep); - outline-offset: -2px; -} - -/* Wave-9 I18 β€” the camera controls. The owner's note was that "Fit to data" - looked ugly, and it did: a `.cg-link-btn` (the full-width builder-footer link) - forced into shape by width/padding overrides, transparent and borderless, - adrift in a row of grey text. It is a proper control cluster now β€” the - affordance every map has, floated top-right, clear of where a marquee drag - naturally starts. - ⚠ It lives OUTSIDE the : a mousedown on a button inside it would start a - pan. And it sets pointer-events back to auto because `.cg-map-legends` β€” its - sibling over the same frame β€” deliberately has none. - Colours are `--lp-*` variables only, never literals, so HOST's C1 token pass - flows through here for free. */ -/* ⭐ OWNER ITEM 5 (2026-08-23) β€” THE CAMERA BAR MOVED FROM THE RIGHT EDGE TO THE TOP. - It was a vertical stack pinned `right: 10px`, which is the map convention and is also the - corner a reader reaches last on a left-to-right surface. The owner could not find it. - ⭐⭐ OWNER ITEM 1, SAME DAY, SECOND CORRECTION: *"it should not be at the top left of the Map. - it should be at the top MIDDLE of the map, and horizontal. Make the icon bigger so its easier - to see. Make it look like a proper navigation bar."* So: centred on the frame, 34px keys with - 20px glyphs (was 28 and 16), a deeper shadow so it reads as chrome floating over the map - rather than as a widget printed on it, and seven keys instead of five. - β›” THE VERTICAL BAND IS WHAT KEEPS IT OFF THE ROUTE PANEL, and that is why the arithmetic is - written down rather than eyeballed: the panel is `top: 48px`, and a 34px bar at `top: 10px` - ends at 44px. Four pixels of clearance, and `verify_map.py` pins the panel's own geometry, so - growing this bar past 38px is a change that has to come back here and argue. - ⚠ CENTRED WITH `left: 50%` PLUS A TRANSLATE rather than `inset: 0` plus `margin: auto`: the - bar must not become a full-width element, because the whole strip would then swallow pointer - events across the top of the map even where no key is painted. The legends stay bottom left - and the credit bottom right, so nothing else moved into a taken corner. */ -.cg-map-ctl { - position: absolute; - top: 10px; - left: 50%; - transform: translateX(-50%); - display: flex; - flex-direction: row; - background: #fff; - border: 1px solid var(--lp-line); - border-radius: var(--lp-r-md); - overflow: hidden; - box-shadow: 0 2px 8px rgba(32, 36, 51, 0.16); - pointer-events: auto; -} -.cg-map-ctl-b { - width: 34px; - height: 34px; - display: flex; - align-items: center; - justify-content: center; - padding: 0; - border: 0; - /* ⚠ THE SEPARATOR TURNED WITH THE BAR. A `border-bottom` under a ROW of buttons draws a rule - along the whole underside instead of between the keys, which is how a re-orientated toolbar - ends up looking underlined rather than segmented. */ - border-right: 1px solid var(--lp-line); - background: #fff; - color: var(--lp-ink); - cursor: pointer; -} -.cg-map-ctl-b:last-child { border-right: 0; } -.cg-map-ctl-b:hover:not(:disabled) { background: var(--lp-blue-tint); } -.cg-map-ctl-b:disabled { color: var(--lp-line); cursor: default; } -.cg-map-ctl-b:focus-visible { - outline: 2px solid var(--lp-blue-deep); - outline-offset: -2px; -} -/* The Google hand-off sits in the same cluster and must read as one of the - controls, not as a link β€” it is an only because it navigates. */ -a.cg-map-ctl-b { text-decoration: none; } -/* ⭐ ITEM 1 β€” 20px glyphs, up from 16. The zoom keys are a plus and a minus: at 16px inside a - 28px key they read as hairlines, which is the "make the icon bigger so its easier to see" the - owner asked for. The stroke thickens with them, or a 20px glyph drawn at 1.4 looks THINNER - than the 16px one it replaced. */ -.cg-map-ctl-b svg { width: 20px; height: 20px; display: block; } -.cg-map-ctl-b path { - fill: none; - stroke: currentColor; - stroke-width: 1.6; - stroke-linecap: round; - stroke-linejoin: round; -} -/* The rotate arrowheads are the one FILLED mark on this bar. A stroked chevron at the end of a - curve reads as a kink in the curve rather than as a direction, which on a pair of mirrored - buttons is the only thing telling them apart. */ -.cg-map-ctl-b path.cg-map-ctl-head { - fill: currentColor; - stroke: none; -} -.cg-map-frame svg.cg-map-svg { - width: 100%; - height: 100%; - display: block; - cursor: grab; - touch-action: none; /* pointer events own the gesture, not the browser's pan */ -} -.cg-map-svg:active { cursor: grabbing; } -.cg-map-svg.is-selecting { cursor: crosshair; } - -/* I6 β€” the basemap reads as a MAP: water wash, land fill, hairline graticule. */ -.cg-map-water { fill: #F2F6FB; } -/* ⚠ Wave-9 I18 β€” NO `vector-effect: non-scaling-stroke` HERE, on purpose. - MapView hands every in-group stroke `hairline(w, k)` (= w/k), which already - cancels the zoom. This rule ALSO carried non-scaling-stroke, so the zoom was - cancelled twice and the coastline got thinner the further you zoomed IN: - 0.89 CSS px fitted, 0.445 at 2x, 0.089 at 10x, 0.015 at the cap β€” the - "blurry when zoomed" bug. `hairline()` is the map's ONE stroke mechanism and - `scalingConflicts()` in mapProjection.ts gates this file so it cannot return. */ -.cg-map-land { - fill: #FFFFFF; - stroke: #C8D2E0; - stroke-linejoin: round; -} -.cg-map-lake { fill: #F2F6FB; stroke: #C8D2E0; } -.cg-map-grat { stroke: rgba(32, 36, 51, 0.07); fill: none; } - -.cg-map-pin { cursor: pointer; } -.cg-map-pin:focus-visible { outline: none; } -.cg-map-pin.is-hover, -.cg-map-pin.is-selected { paint-order: stroke; } -.cg-map-marquee { - fill: rgba(157, 191, 242, 0.22); - stroke: var(--lp-blue-deep); - stroke-width: 1; - stroke-dasharray: 4 3; - pointer-events: none; -} - -/* I3/I5 legends β€” floated bottom-left, scrollable, never covering the whole map. */ -.cg-map-legends { - position: absolute; - left: 10px; - bottom: 10px; - display: flex; - flex-direction: column; - gap: 6px; - max-height: calc(100% - 20px); - overflow: auto; - pointer-events: none; /* the map keeps the drag; the legend is a readout */ -} -.cg-map-legend { - background: rgba(255, 255, 255, 0.94); - border: 1px solid var(--lp-line); - border-radius: 6px; - padding: 7px 9px; - font-size: var(--lp-fs-3xs); - max-width: 260px; -} -.cg-map-legend-t { - font-weight: 600; - color: var(--lp-ink); - margin-bottom: 4px; -} -.cg-map-legend-row { - display: flex; - align-items: center; - gap: 6px; - padding: 1px 0; -} -.cg-map-swatch { - flex: 0 0 auto; - width: 10px; - height: 10px; - border-radius: 50%; - border: 1px solid; -} -.cg-map-legend-k { - flex: 1 1 auto; - color: var(--lp-ink); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.cg-map-legend-n { - flex: 0 0 auto; - color: var(--lp-muted); - font-variant-numeric: tabular-nums; -} -.cg-map-legend-note { - margin-top: 4px; - color: var(--lp-muted); - line-height: 1.35; -} -.cg-map-sizerow { - display: flex; - align-items: flex-end; - gap: 10px; -} -.cg-map-sizeitem { - display: flex; - flex-direction: column; - align-items: center; - gap: 2px; -} -.cg-map-sizeitem .cg-map-legend-k { flex: 0 0 auto; font-variant-numeric: tabular-nums; } -/* Wave-9 I18 β€” the hover card, replacing the bare floating label. Drawn inside - the SVG in screen space (the viewBox letterboxes, so an HTML overlay would - have to re-derive the rendered scale). pointer-events stay off: a hover - surface that can swallow the next click is a logged scar. */ -.cg-map-card { pointer-events: none; } -.cg-map-card rect { - fill: #fff; - stroke: var(--lp-line); - stroke-width: 1; -} -.cg-map-card-t { - font: 600 var(--lp-fs-3xs) Inter, sans-serif; - fill: var(--lp-ink); -} -.cg-map-card-l { - font: 400 var(--lp-fs-3xs) Inter, sans-serif; - fill: var(--lp-muted); -} - -/* Wave-9 I18-R β€” the route planner. Sequencing is ours (free arithmetic); the - roads are Google's, reached by the same key-less URL as the rest of the hand-off. */ -.cg-map-route { - display: flex; - flex-direction: column; - align-items: stretch; - gap: 8px; - flex: 0 0 auto; - width: 100%; - font-size: var(--lp-fs-3xs); - min-width: 0; - overflow: visible; -} -/* OWNER ITEM 8 (2026-08-23) β€” THE ROUTE PANEL BUTTONS. - β›” `.cg-map-route-go` IS DELETED, and the reason it looked amateur is that it was ONE flat - 22px chip doing four different jobs: it painted "Save visit order" (the committing action), - "Driving route" (a secondary re-ask), "Re-optimise" (a revert) and "Clear" (a destructive - reset) identically, so the panel offered a column of interchangeable grey slabs and no - hierarchy at all. Everything now uses `.cg-btn` / `--primary` / `--danger`, the SAME family - every popover and dialog in this tree already commits with. That is the whole fix and it is a - deletion, not a new button language (DESIGN.md Β§0 authorises no new one). - ⚠ ONE local override, and it is geometry rather than paint: inside a 360px panel these read - as full-width rows rather than inline chips. */ -.cg-route-popover .cg-btn.cg-route-cta { - width: 100%; - min-height: 28px; - text-align: center; - white-space: normal; -} -.cg-map-geo .cg-map-geo-cta { width: 100%; } -/* ⭐ OWNER ITEM 5 (2026-08-23) β€” THE NAME-THIS-ROUTE STEP, in the panel and not in a browser - `prompt()`. Stacked because a 360px panel cannot hold a label, a text box and two buttons on - one line without the buttons shrinking to unreadable stubs; the two actions then share a row, - Save first because it is the one being confirmed. */ -.cg-route-name { - display: flex; - flex-direction: column; - gap: 6px; - width: 100%; -} -.cg-route-name .cg-input { width: 100%; } -.cg-route-name-actions { - display: flex; - gap: 6px; -} -.cg-route-name-actions .cg-btn { flex: 1 1 0; justify-content: center; } -/* ⭐ OWNER ITEMS 8 AND 9 (2026-08-23) β€” SAVE AND CLEAR SHARE THE LAST ROW. Owner: *"the save - route button should still be at the bottom too beside clear route button."* The Google links sit - directly above it (item 8), so the panel ends: how to hand this route to Google, then the two - ways to finish with it. - β›” `.cg-route-cta`'s `width: 100%` is OVERRIDDEN here rather than simply not applied, because - `Clear route` still carries that class from every other position it has ever had. Two full-width - buttons cannot sit beside each other, which is the whole of item 9. */ -.cg-route-foot { - display: flex; - gap: 6px; - width: 100%; - margin-top: 2px; -} -.cg-route-foot .cg-btn { flex: 1 1 0; width: auto; justify-content: center; text-align: center; } -.cg-route-popover .cg-map-route-sum { white-space: normal; line-height: 1.45; } -.cg-route-popover .cg-map-route-opt { - align-items: stretch; - flex-direction: column; - gap: 4px; - white-space: normal; -} -.cg-route-popover .cg-map-route-opt.cg-route-check { - flex-direction: row; - align-items: center; -} -.cg-route-popover .cg-map-route a { white-space: normal; overflow-wrap: anywhere; line-height: 1.4; } - -/* -- ITEM 7: the travel-mode segmented control -------------------------------- - Two mutually exclusive choices, both visible, the active one marked. Deliberately NOT a - toggle whose label is its own state: a control that renames itself is a different button each - time you look for it, which is the argument `viewModes` already makes for the calendar's - Records/Summaries popover. */ -.cg-route-modes { - display: flex; - width: 100%; - border: 1px solid var(--lp-line); - border-radius: var(--lp-r-md); - overflow: hidden; -} -.cg-route-mode { - flex: 1 1 0; - min-height: 26px; - padding: 0 8px; - border: 0; - border-right: 1px solid var(--lp-line); - background: var(--cg-white); - color: var(--lp-muted); - font: inherit; - font-size: var(--lp-fs-3xs); - cursor: pointer; -} -.cg-route-mode:last-child { border-right: 0; } -.cg-route-mode:hover:not(:disabled):not(.is-on) { background: var(--cg-soft); } -.cg-route-mode.is-on { - background: var(--lp-primary); - /* ⚠ THE INK IS SET IN THE SAME RULE AS THE DARK FILL (/design Β§8, the two that ship broken - most). A rule that darkens a background without naming the foreground inherits the muted - grey above and lands as ink-on-ink. */ - color: var(--cg-white); - font-weight: 500; -} -.cg-route-mode:disabled { - /* Three channels, never opacity alone: the real `disabled` attribute is on the element. */ - opacity: 0.45; - cursor: not-allowed; -} -.cg-route-mode:focus-visible { outline: 2px solid var(--lp-blue-deep); outline-offset: -2px; } - -/* -- ITEM 9: the searchable record picker ------------------------------------- - Expands IN PLACE rather than floating: see `RecordPicker`'s own note for why a popup listbox - inside an absolutely positioned, scrolling `` plus a changed label while a save is in flight. - β›” WHY A BUTTON NEEDED ITS OWN MODIFIER RATHER THAN BARE `.lp-spin`: the shared mark is a fixed - **14px**, and its own comment says that size is "sized to sit BESIDE things". A fixed pixel ring - beside text that is `--lp-fs-xs` is a mark that stops agreeing with its label the next time the - type scale moves. `1em` ties it to the button's own type size instead, so the ring and the word - are the same height BY CONSTRUCTION and nothing shifts between idle and busy β€” which is the whole - point of a state whose job is to reassure. - ⚠ `currentColor` for the track: this rides both `.set-primary` (white ink on purple) and - `.set-secondary` (dark ink on white), and a fixed grey would vanish on one of them. The leading - arc keeps the brand purple from `.lp-spin` (wave 34 R2) except on the primary button, where - purple-on-purple is invisible β€” there it becomes the button's own ink. - ⚠ The buttons already CENTRE their content, so no flex change is needed here; the gap is the - only geometry this adds. */ -/* ⭐ WAVE 37 Β· T48 β€” the SUSPENSE fallback for a lazily-loaded surface. Distinct from the boot - skeleton in `index.html`, and the difference is WHEN each can exist: that one paints before any - CSS or JS has arrived and must therefore be inline; this one only ever renders after the app has - mounted, so it may use the tokens. Deliberately empty and calm β€” by this point the shell, the - rail and the toolbar are already on screen, and the only thing still arriving is the surface. */ -.lp-boot { - width: 100%; - height: 100%; - background: var(--lp-wash); -} - -.set-btn-spin { - width: 1em; - height: 1em; - margin-right: 6px; - vertical-align: -0.125em; - flex: none; -} -.set-primary .set-btn-spin { border-top-color: currentColor; } - -.set-primary, .set-secondary { - height: 32px; - padding: 0 14px; - border-radius: var(--lp-r-sm); - font: inherit; - font-size: var(--lp-fs-xs); - font-weight: 600; - cursor: pointer; -} -/* Wave-15 C-BOLD (R7): the primary action reads `--lp-primary`, and its hover - reads the published hover shade. ⚠ The hover was `--lp-ink` β€” near-black β€” - which was defensible under a blue base and is not under a purple one: it - stopped being a shade of the button and became a different button. */ -.set-primary { border: 1px solid var(--lp-primary); background: var(--lp-primary); color: var(--lp-surface); } -.set-primary:hover:enabled { background: var(--lp-primary-hover); border-color: var(--lp-primary-hover); } -.set-secondary { border: 1px solid var(--lp-line); background: var(--lp-surface); color: var(--lp-ink); } -.set-secondary:hover:enabled { border-color: var(--lp-blue-deep); } -.set-primary:disabled, .set-secondary:disabled { opacity: 0.5; cursor: default; } -/* ⭐⭐ WAVE 37 Β· T05 β€” AND THE IN-FLIGHT MARK IS EXEMPT FROM THAT FADE, WHICH I FOUND BY LOOKING - AT IT RATHER THAN BY MEASURING IT. A saving button is `disabled` for the whole flight, so the - 0.5 above was halving the one element whose entire job is to be seen. On `.set-primary` (white - ring on purple) it survived; on `.set-secondary` the ring went pale enough to read as an artifact. - β›” The BUTTON keeps its fade β€” it must still look unavailable β€” and only the ring is restored: - `opacity: 1` on a child cannot exceed a faded parent's alpha in CSS, so the fade is undone where - it is applied instead. The two states stay distinguishable AND the signal stays legible. - ⚠ The measurement said "nothing moves and the animation runs" and every number was right. It - could not say the mark was hard to SEE, which is why this ticket's `done-when` asks for a person - and not a count. */ -.set-primary:disabled:has(.set-btn-spin), -.set-secondary:disabled:has(.set-btn-spin) { opacity: 0.72; } -.set-secondary:disabled .set-btn-spin { border-top-color: var(--lp-primary); } -/* Split from `.set-secondary`'s ring on purpose β€” see `.login-submit:focus-visible` - for the one statement of the rule. A secondary button is not a primary and keeps - the file-wide blue. */ -.set-primary:focus-visible { outline: 2px solid var(--lp-primary); outline-offset: 1px; } -.set-secondary:focus-visible { outline: 2px solid var(--lp-blue-deep); outline-offset: 1px; } -.set-add { margin-top: 16px; } -/* The password block. The red hairline is the only signal that it revokes every - session the account has open β€” the sentence above the button says it in - words, and this says it before the words are read. */ -.set-danger { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--lp-red-deep); } - -/* --- R9: the permission editor (settings/PermsEditor) ----------------------- - A FULL-PANE TAKEOVER of the modal body, so the layout job here is small and - specific: give the page a head that keeps the way out visible, stack one card - per module, and let the grid's OWN panels sit inside those cards at their own - size. The panels bring their entire appearance with them (`.cg-pop` and the - `.cg-*` rules under it) β€” that is contract C-KIT working, and it is why there - is no condition-builder styling in this block. Nothing here restyles a `.cg-*` - rule; the two classes below only bound the box those panels sit in. */ -.set-perms { position: relative; } -.set-perm-head { - display: flex; - align-items: center; - gap: 14px; - margin-bottom: 16px; - /* wave17 R7 β€” the head carries the role and status chips now, so it wraps - rather than crushing the name on a narrow modal. `center` replaces - `flex-start`: chips beside a two-line name look dropped when top-aligned. */ - flex-wrap: wrap; -} -/* ⚠ The chips sit BESIDE the name, not at the far end. The first version pushed - them right with `margin-left: auto` and the screenshot settled it: on an - 880px modal "Member" ended up an inch from anything it described, reading as - a status of the dialog rather than of the person. Both other places a role is - shown (the identity header, the account cards) put the chip next to the name; - a third arrangement for the same fact is drift, not variety. */ -.set-perm-who { min-width: 0; } -/* The `.set-h` default carries 14px of bottom margin meant for a pane title - that starts a block; here the username sits directly under it. */ -.set-perm-title { margin: 0; } -.set-perm-banner { margin-bottom: 14px; } -.set-perm-intro { margin: 0 0 16px; max-width: 68ch; line-height: var(--lp-lh); } - -.set-perm-mod { margin-top: 14px; } -.set-perm-modhead { - display: flex; - align-items: baseline; - justify-content: space-between; - gap: 12px; -} -.set-perm-toggle { padding: 0; } -.set-perm-modname { font-size: var(--lp-fs-sm); font-weight: 620; } -/* The rule in one phrase, beside the switch that sets it. Muted because it is a - restatement of the controls below, never a control itself. */ -.set-perm-sum { - flex: none; - font-size: var(--lp-fs-2xs); - color: var(--lp-muted); - font-variant-numeric: tabular-nums; -} -.set-perm-panels { - display: flex; - flex-wrap: wrap; - align-items: flex-start; - gap: 14px; - margin-top: 14px; -} -/* The kit's panels are popover-sized by design. Given a real width here they - read as two cards of one section rather than two menus that failed to close; - `flex: 1 1 320px` lets them sit side by side on a wide modal and stack on a - narrow one without a media query. */ -.set-perm-pop { flex: 1 1 320px; max-width: 100%; } -.set-perm-actions { align-items: center; margin-top: 20px; } -.set-perm-dirty { margin: 0; } - -/* β›” `.set-user-door` IS GONE WITH THE TABLE (wave 17 R7). It existed to make a -