diff --git a/Source/components/Button.lua b/Source/components/Button.lua index 84dda72..2d1717d 100644 --- a/Source/components/Button.lua +++ b/Source/components/Button.lua @@ -27,6 +27,7 @@ function Button:init(x, y, w, h, text) self.variant = 'default' self.state = 'base' + self.stateTimer = nil self.padLeft = 16 self.padRight = 16 @@ -54,19 +55,31 @@ function Button:init(x, y, w, h, text) end function Button:focus() + if self.stateTimer then + self.stateTimer:remove() + self.stateTimer = nil + end self.state = 'select' Button.super.focus(self) end function Button:unfocus() + if self.stateTimer then + self.stateTimer:remove() + self.stateTimer = nil + end self.state = 'base' Button.super.unfocus(self) end function Button:click() - local lastState = self.state + if self.stateTimer then + self.stateTimer:remove() + self.stateTimer = nil + end + local lastState = self.state ~= 'click' and self.state or 'base' self.state = 'click' - playdate.timer.performAfterDelay(300, function () + self.stateTimer = playdate.timer.performAfterDelay(300, function () self.state = lastState end) Button.super.click(self) diff --git a/Source/components/PageArrow.lua b/Source/components/PageArrow.lua new file mode 100644 index 0000000..3bb6272 --- /dev/null +++ b/Source/components/PageArrow.lua @@ -0,0 +1,18 @@ +local img = gfx.image.new('./gfx/icon_page_next') + +PageArrow = {} +class('PageArrow').extends(ComponentBase) + +PageArrow.kTypeNext = 1 +PageArrow.kTypePrev = 2 + +function PageArrow:init(x, y, type) + local w, h = img:getSize() + PageArrow.super.init(self, x, y, w, h) + self:setAnchor('center', 'center') + self:setZIndex(200) + self:setImage(img) + if type == PageArrow.kTypePrev then + self:setImageFlip(gfx.kImageFlippedX) + end +end \ No newline at end of file diff --git a/Source/data/cy_strings.json b/Source/data/cy_strings.json index d312207..a47ca40 100644 --- a/Source/data/cy_strings.json +++ b/Source/data/cy_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "Bydd gosodiadau’n cael eu dileu", "SETTINGS_RESET_DONE": "Mae gosodiadau wedi’u dileu", - "ABOUT_VERSION": "Fersiwn %d", + "ABOUT_VERSION": "Fersiwn %s", "ABOUT_BUILT_BY": "Gwnaed gan %s", "CREDITS_HEADER_JAMES": "Dylunio rhyngwyneb a rhaglennu", diff --git a/Source/data/de_strings.json b/Source/data/de_strings.json index 1efdcc3..f73a7d9 100644 --- a/Source/data/de_strings.json +++ b/Source/data/de_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "Alle Einstellungen werden gelöscht", "SETTINGS_RESET_DONE": "Einstellungen wurden gelöscht", - "ABOUT_VERSION": "Version %d", + "ABOUT_VERSION": "Version %s", "ABOUT_BUILT_BY": "Kreiert von %s", "CREDITS_HEADER_JAMES": "Programmierung und UI Design", diff --git a/Source/data/en_strings.json b/Source/data/en_strings.json index 0beb94b..88b0a5e 100644 --- a/Source/data/en_strings.json +++ b/Source/data/en_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "All settings will be cleared", "SETTINGS_RESET_DONE": "Settings cleared", - "ABOUT_VERSION": "Version %d", + "ABOUT_VERSION": "Version %s", "ABOUT_BUILT_BY": "Built by %s", "CREDITS_HEADER_JAMES": "Programming and UI Design", diff --git a/Source/data/es_strings.json b/Source/data/es_strings.json index 5f9a68f..b19ab6b 100644 --- a/Source/data/es_strings.json +++ b/Source/data/es_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "Cada ajuste se va a restablecer", "SETTINGS_RESET_DONE": "Se han restablecido los ajustes", - "ABOUT_VERSION": "Versión %d", + "ABOUT_VERSION": "Versión %s", "ABOUT_BUILT_BY": "Compilado por %s", "CREDITS_HEADER_JAMES": "Programación y Diseño de UI", diff --git a/Source/data/fr_strings.json b/Source/data/fr_strings.json index b8444c2..022f3fb 100644 --- a/Source/data/fr_strings.json +++ b/Source/data/fr_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "Toutes les options seront réinitialisées", "SETTINGS_RESET_DONE": "Les options ont été réinitialisées", - "ABOUT_VERSION": "Version %d", + "ABOUT_VERSION": "Version %s", "ABOUT_BUILT_BY": "Créé par %s", "CREDITS_HEADER_JAMES": "Programmation et design de l’interface", diff --git a/Source/data/it_strings.json b/Source/data/it_strings.json index 3711c8f..700c95f 100644 --- a/Source/data/it_strings.json +++ b/Source/data/it_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "Le impostazioni verranno ripristinate", "SETTINGS_RESET_DONE": "Impostazioni cancellate", - "ABOUT_VERSION": "La versione %d", + "ABOUT_VERSION": "La versione %s", "ABOUT_BUILT_BY": "Costruito da %s", "CREDITS_HEADER_JAMES": "Programmatore e UI Designer", diff --git a/Source/data/jp_strings.json b/Source/data/jp_strings.json index 2872ec3..e1cc8c6 100644 --- a/Source/data/jp_strings.json +++ b/Source/data/jp_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "すべての設定をリセットします", "SETTINGS_RESET_DONE": "設定のリセットが完了しました", - "ABOUT_VERSION": "Version %d", + "ABOUT_VERSION": "Version %s", "ABOUT_BUILT_BY": "開発者: %s", "CREDITS_HEADER_JAMES": "プログラム&UIデザイン", diff --git a/Source/data/nl_strings.json b/Source/data/nl_strings.json index 15ec974..5efd20d 100644 --- a/Source/data/nl_strings.json +++ b/Source/data/nl_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "Alle instellingen worden hersteld", "SETTINGS_RESET_DONE": "Instellingen zijn hersteld", - "ABOUT_VERSION": "Versie %d", + "ABOUT_VERSION": "Versie %s", "ABOUT_BUILT_BY": "Ontwikkeld door %s", "CREDITS_HEADER_JAMES": "Programmeren en UI Ontwerp", diff --git a/Source/data/pl_strings.json b/Source/data/pl_strings.json index b829674..dd883a3 100644 --- a/Source/data/pl_strings.json +++ b/Source/data/pl_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "Wszystkie ustawienia zostaną usunięte", "SETTINGS_RESET_DONE": "Ustawienia zostały usunięte", - "ABOUT_VERSION": "Wersja %d", + "ABOUT_VERSION": "Wersja %s", "ABOUT_BUILT_BY": "Autor: %s", "CREDITS_HEADER_JAMES": "Programowanie i Projekt UI", diff --git a/Source/data/ru_strings.json b/Source/data/ru_strings.json index 98817d2..9420af7 100644 --- a/Source/data/ru_strings.json +++ b/Source/data/ru_strings.json @@ -21,7 +21,7 @@ "SETTINGS_RESET_CONFIRM": "Все настройки будут сброшены", "SETTINGS_RESET_DONE": "Настройки сброшены", - "ABOUT_VERSION": "Версия %d", + "ABOUT_VERSION": "Версия %s", "ABOUT_BUILT_BY": "Создано %s", "CREDITS_HEADER_JAMES": "Программирование и UI-Дизайн", diff --git a/Source/fonts/WhalesharkSans.fnt b/Source/fonts/WhalesharkSans.fnt index cac6ddd..290a092 100644 --- a/Source/fonts/WhalesharkSans.fnt +++ b/Source/fonts/WhalesharkSans.fnt @@ -1,6 +1,6 @@ --metrics={"baseline":0,"xHeight":0,"capHeight":3} -datalen=39416 -data=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 +datalen=39412 +data=iVBORw0KGgoAAAANSUhEUgAAAMgAAAQkCAYAAAA4kVF0AAAAAXNSR0IArs4c6QAAIABJREFUeF7tfeu65Liq5Mz7P/TMl9XLa6soLgGEnHIm58/ZXSkjCCIAya7u//t/5v8GgUHAROD/DjaDwCBgIzACGXachMD/+3Gmw0uGjV9MOo54wDKdXG0x7b78Z9tm+6dhXN3jeu6yWc19df9IiKt/Vd/WnL7+d8fOH3/bBoyomSCySby6zLItycciocxRlURM/5i5vXCqxmWJjmbvWwViEaZCbKYtWQGlP1VyyueqdmTXjboC+nvHn0gkLY63HnaiZwbMqvJa57BCyOBi+VfFILJX6fyazYqdHQKhVXuRTIrdDBHQarADxMze6FqW8Fh2tHFj7SBVwUVdCcVr17pOXJFPbdsjkP/OYR0gtRGri6usfoxqyLAREbLyewf7aL+27W4it85/UfTF39lnBqtCV0cYLaxuoi0Rd+0WU/DXYzt9aNsegfyb4g4mJ3YTrxutIxyD7BUbbRLvPAt3yOCBsTPoShLkM+xzgzw/dMe21V/rgI2SW8uFFPIuHiC52smVtu1dwLQdQ5BtrGEKxLLFwMCq/hkBWn4w/Guk4PfRnX60be8SCAO4p9jYcabROpJ11olyqB3OTzqw7/KFYjcCt0rStnKrG7/pOUskHXytBFcSv1PEDMh38IVis5PAJ59BGEndcdtknT0Y/mrnDgqJCM5VRI/w77WmxfHWwwRgxsQgIMfJLqmpYhuBDEFPQoDR0Rg2fjEZgZxEj/HlOARGIMelZBw6CYERyEnZGF+OQ2AEclxKxqGTEBiBnJQN3RfqofP8cM/ycARyVj52vlvRXhZ28s8W7i7/VkzT8coH2EGfT7+zPWTd6Xtv0tOkWf7+TPedhfYORGak61/Lnvzozfrw7mwafa53jILF/GTlhbT2Rr6TgZ3+reIqFZtVIFaQFQV3AJtn/4cAUyBaHiv2dwmE7R/FnqUwdusckeVlX6p4yjaeCCoCkWPRrtyy4tfGONjnEUieuHc90SHv6uMTBcIUR6vj7R6xWEm+i5Qn7cPC7mkCYYqjfWayDumdqzHvxoQ1unWIbPkHt93O5uCzTJI8SSDMuCXUJds7rnlHIKAKnGWs7rFWUMqhdfGZ6aOs9J1iRS0IHUcQGrBBRPb8hDVM3KiE2SSQUnU3Ek2NdwRynpyYZPEqc3cfloi7fqCjVGmfEUhfICyi7Lw+9cbeKgdYcUcjeeXcSou3Ck6fVjkLrGTkdsVWs31j25PC61zAoNfHGHL/rdohEMtumu/pBzKRE9fuIg3RxTH1iQg8QSAjjk9k3kNiGoE8JFHj5nsQeIJA3oPM7DoIdP+lWoPgIPDpCEwH+fQMT3wtBEYgLfjm4U9HwBJI6a3jAlZ0t10RpmaTZUfmmWW3YmfXe4tP5/KW+LwP2K4NK0lmC4T2ZnTTiymmf9HLs0o+tpDnG4xaX/OusWcT0u0+EnfL3q59WPFW/bsr3m/gdztG73P36gu66nNWMGx72j5VMq/VnvU5OfVr1DZDvtyA9Vdu5V+kysC0a9xYfeqMf55Ast1DjkMeniiGbIHsKDA7bKL43LpOS+j1Z1UQ7jx/vMCqkHoFudM9vAN1VcTfLpBuPqgFWophJVxXIN75JkPq3TN5NU5EHBWR7I731gqc2OyOW8oM7/647nWLLnFYowy7olqXAGnwfgztIDS7Cyd4evtSGWs1D1sc1+Z6bSOW0xXR7RRIt53vOKRbnalzLtxCHpLRrxMIm9Bse9r5o1MAdvrH7nYkTm8xc/SIxRqHdt7qyAP57uqPsoA9YrHtoXGcsq6b1y2HdKZApEik7Uq1pga9OFQZ+TysWOMpM15WjKcI6FY/PLJ2gWW1TGsmlx2lAlw3Rm1cW/+sUgzY8TJjlL514qvk6/ZnPj7A2xH9jg13iO5I5EYgR6blaKe6Z4Sjg2OcBx4V4DhLR+BrugdjhqejPwYHgZMQmBHrpGyML8chMAI5LiXj0EkIjEBOysb4chwCOwXCfg/yAm+nzSoWzJd6O96rsP1jf0jJtkd9j1QlRaT0u5NSvXBgfCi3I8FM/Nj+nW7PKqQXZ1OcTy2OVPHz+45viXZ9EMgUiPX3X7IYs/GzsKu+z2Bf8+6yJ4tmKd5s8hCNsMks7WmBVkC2KmEWk4iALHtrZczY3J0PhBPemkruqvbSe2WAZgGRHYfWoKwzSDrw5Tzj/aUxJOY7BYL4I9eMQCqo/Twj/8LULsGU2psY2eRfGNKEk/Hf6kwZG9R5V4m3kdrfR3cJRPMti93x+Fl/o7ASqJXMjjjkWGGJIttBvDGt2uGs+LNYZmOJRDQC+ff2E86JdbAsnfiVTHXFsVsgjIN1NGJVBQcnMVDILoHc4V8kfu13LV45msO+3yUQ2CFHZFa3Wx9B97EO6JXC8GQCVrpV5ZnqoZolkMtO2vfdI1baoUAgcmaV5xIE0EgcWZHcKZAKnnf6h+Av11Riqgouvdddh/QKcOsz6cCcDSNb0e9ogqvjpfVc1543LaCdV4683bzutCdH2xJ+GWAqYGTJZu2BVH00lsin6HdLIJbvqF9aQdBsZu1F2J1iL+sH0kXa+DGdQg9MFaHJGVLayMQRCSD6PSOQjF+I3Yo9TyBse7JqI7nO4o3YlKN4dmz+3aMCEOrgrBsEHo/ACOTxKZwAdiIwAtmJ7th+PAIjkMencALYicAIZCe6Y/vxCIxAHp/CCWAnAiOQneiO7ccjEH2qUbmjrjxTAbK6j/Uc214lJnl/rxWw7Bth9qcmV1za+5VKwWW/p6H6NwL5D84s6VbyV4VlCSjyJfpd2vXWV31nkpr9pl/mU+KREvEIpCeONRkp4J32Igmz2vV+qwiuIpCnfCv2wsPCDs7VtwskW401ElZI5o1fOwVikQYmjPJXlbvdlD0CUu19s0DWxGYIYo0wHRsaya4/Y3YQabMibioBTxfcKhCvqmWSXwG9cqCt7lMZU5CKn8EIsScFXD0UrzhJzCoY3iWQanen+vftAmGQukIyRCCyu3tEz9q7Rq2K71QCGv+2zE53p/o3I9bfB7k7O1l0qN4hEHmpcLpAKgXs6wRiBVxJrnUFWEnERfCqH+8WSLVKUwkYnEEYBavaef/s/YQOsksgcrysiuQOgVjnEcRnzb/OOeypAikVhCcJZL2irB7g5IghOwpCuLtusazzYZQz1L8qhtZzXXsV7LUOo/lRLggR2JXqWHkmaqXaDc4qmOj59feoomYTZflWqljOvxJVKxCIr1EHruDoxYz4FOUjk89IJPL3lH9PEYh2dkgFuqAUESZrd7dAPAIgvrJHInn2qhaCXWc4z7+0rwjAXTXP84PAKQikx8ARyCmpGz+ORGAEcmRaxqlTEBiBnJKJ8eNIBEYgR6ZlnDoFgRHIKZkYP45EYARyZFrGqSYC6dsqa7/oa96OgLT3AxV7yHuGV3yobfZ7gejFaPS7zE1mPbJ213sfDW/EHytej6MZvZTfmmubRALJEG+1v+NNawTSCERH6FsFgvLB5ZX3Jr3aptjf6nQqrBb8rg6iFZMKhplPYZCKHX2blCXS7vy+cETisojdefYfm3d/asJwvmuDLRAvoRVf2QLR/Kv4pU0Iq7i6Ni/7laIS+RZNH+bvOwVSHc+iYLqJeIpAVvy6XcAaebPdwyJxl9RMgnf58Rf/doxYa8W6NqsmIjsiReKK2ncV3C6BvTFSI3dU2DzcWDlZsariZsXdKa4sX/74tuuQromkE/RdFaYDrnyWZcsiYsV+5Zlo1l9/7xZChn8MG78xRQLpBryjm3QB2DFised8RBRZHGQnYue2a481pmVxcacOq1WznNUqf7eTdAHYLRAJeIU4bIGwzyDWWQQZcaOOVMGLOWGkzyBZh3cRUCYl6xfyPEt83Tl/l0AuzLpxIlhmxMIsyKzY/jmDSMJVnbaeq9rzDrCZJERVj+Efa4zRKr41DkeFQouLHWvkQ5QnJqmZtrb8W02sA3q3qjKrljVydMc/7SwSkSMaOaRPWXJbhOkSqfu8VrA0LLLiY/kVdpBusq0qWCUMUyCWiLPJ0GJhJYjViUcgDcYxCNHYfh4dBOgIsMbc3w5C93AMDgJvRiA7hpruTgd5cyZn+7MRGIGcnZ/x7s0IjEDenIDZ/mwERiBn52e8ezMCla9CI5dpBySxEev6NPI/+/upfmXjmPUKArsF8tqS0aWoV3dkJpwukNP9s9JxhN/y8wUGma+AWQFab72ZvnY1w4q164f2/Mm+efEe4Tf747U1YFaA0g7LLpOMJ/rELlRMvBBbR2D6BIEgYH7iGtZYuRKNeT5k+SeFfI3lXYFQ/JMCYZ0ZXna6AX4i6dGYmGOlZauTa6Z/K1c0fCqjNM2/dXM2odn2UHJ9wjprrKyQWusanU7yVfZGIM+RU7XgWM+NPSD3mkAqVeqTbk8A2G5boo0K2ZHjLoFUQdnln+VPCj/rbxGmjBieVCtUFehPeo55bthFQAZHvLNqlT8eduniPwI5T1bW+aBLGFau7xIcO95Spll/D31GrBL86kMaMeZQjeNLLTBam6wqV4bAsoND8xkrqSPCct3OukL1rmWrYxdzpKReG49AzhSVJEznm7m1UHU6kVUArz+viuN6XvrWLbCMCw7Kh4S7gWNTmF2h2f6NvYMQ6KreO3ukbwxuwmUEchPQn7DNDoF8Ai4TwyDwB4ERyBBhEHAQGIEMPQaBEchwYBCoITAdpIbbPPUlCOx8k86CsHsfbl1D7ygODF8ZNtaY2fZYeX2EHetr3pMO8OwEs+2xycj2j23vEcRmObnz74OwfPy2BLPjZdtj5fURdnYKhPXpAPtTiZ2EYdi+62vZKkG1fHT+6jY7v1dc2uc66ZjXb3zkw50ZnfnxGdPWK0YGiS2gGbY1G51vqBg+aWMkQjaEQ+z8rjluc3qHQLRkMhK8nosY9pDkISTYfQbpxLqjIFiTwYWD5FSE89F82TFi3TUiVCtj9TlELAzb7JGD4VNUBLyuhwrkyL/QNQJBaI+vYZBRGzkiknkeMnwagRBn8+kgvW/cRiD/ybEqbCr/poPg3QFZWU2qVaG7548O0TIXETNiIez4WbPr0LV7Rk2EaC5lC0TeyFRGLYZPTxyxKJc6OzqId822Oo0SktoyG60b8ZdBxl3XvBXstZjRboFiwc6vx790gdklEK3yoYDJpLABrPoRCYQxDnkjUcfvzrNIPlDRoIJjjIbyLJcWB6uiZADctWdE3jt+Z5LwDn9nDwCBkqoCu9otzPXIjv2AMLcuoVSqrR6O8TICuwjLvqosB3jDg6zR6gZXZ4ssArsEkvVj1g8CRyIwAjkyLePUKQiMQE7JxPhxJAIjkCPTMk6dgsAIhJOJueLl4HiclREIJyUjEA6Ox1kZgXBSMgLh4HiclfVvf2X/JlgUjHw/UCXR+lzVhvSV+Z6Gaevl512f1lSxRJ9jrENtrPn1nknb8/7K7WvTaodhvk23bJ3g20roNUlV354qEMa3WJJv1RewWwVyJbbqnCTMDnvpKiDaRyeZVtfs+oRUwOoed3SkLqbWtFEp0tsEsvvvW7ATHI14EZkr4Ec2O53jsr2L0Gu8zAIoO3x1VGeNqlZspZjlGQSpZBExdyWYQT5Jwuufu7ar4tewZOOnjW1df9fnPYFkcS2RWAGx29F+TX6rQLSzQzaZjGIyAvkbAbZArq5ZtvvNAtG6SVUk3YqMiK2zh3y2Y8srLlo3iSYOq6t3R2Cty6Xza82LZcWJ/+ww85CeDs7IDK39Lva7hNMEwjoz7B4rGX4yD+lUwT3pmpctEE0/1T06ldMbs57gY/dyh3qoFoB1Cv0fU097UYi262gd68YkqvyRH97vVlWtilg7rDP8YwlEi6vbmbvP/yOQDmDRs21now3m90FAGXtbZxnvkM5GewTCRnTsIeNpp+NOBxmOfRwC7XPHikhLXR8H7QQ0CAgERiBDiUHAQWAEMvQYBN4skO7hvPu8DJ9t77If3ed/ajHSrswvTCoxs+21CkAlgMyGjAMTm9AMnyzRyfPdjr0y+L/WWvh1cfWILH1EeMa2l8VJXY84Xt2IRY5uIqOrwC4G3mcSlUrKjneHQJAvB5A1Wvd9/Zn30jCDaRvLLjk88bSd+zHOsrNr1NL86xQHdryaLx3/vK7kFSOPa5mYd601O0jU2qoiygRyh9B2CaTaYe98Tuaik5tIcLLCR2JEOvDaVSJ7VFyjjxWtdoc40UnCap9l5ykCYcfLLoCW2DROyK+5ke+tPH8Re1TuWN2hq9Lu89QgDTUzfUQKBrrmqQJZuZTpWMhaZE11vHPzEh2GKuMVm3hswmji63RKlPjoujvireRVHqgz1dyLid2RqMXV+lS5Q5gRCCoFfR1bIHeNWOwOItHx7Hvdo8Plv67TmMTeYatT9bYB2NOC+vRTBcI+g8gOpR3Udx0RfmPxnOjmnpVolp1vPaRTRw7gr1Rf+6Hcsm6xrI4RFd/o9xSv5S0Ws0qziM2yMwKx36qnSJP8T2kj+UPWWGegTF4z+/yxO9e89X+9apZU6Pp0ElHDSWJ7ZuW5Jrrsic4BTHtWByl1ljsEEoET5XcHYUpgRY6Sft8RL1p9MyFEh//VFjKZMO15thBf/jmDZIDJrGUQkU0Yhk8ZDLJr2fFm98+up5HxZ2OWPc1OShzdyo4C2U149/nMjIrGNOu+BIG0ot6AC1sgbwhhtnwqAiOQp2Zu/L4FgezbyY5TrE7AsvOKRdrq2Gbakofq65+fUNCqHOlg7+3ZsqsJZMfZhHUwRq4D0QSxDoPWDVErMeKFXPZGCMXgpHUsjqwxtW1a32KxK1WXLOxqL+21gdzAtB0daYObVJMMnmgCKfPZe8FTNiogOy7oh/i3SyDo+4Yo/5RrVKdTVsfKKL4orr/o4X3Nyxi1mCPRWvWr4Mlyd7J/VqJTCTaKAVL2vX2Y4ymV0GzBjUD+pkqHfE8SsPyQMBO3NY5Wx9SjJwzrkM44FLIr4Nj7LysZMlsdkyEQ1nj+OIF0wPMOSF0g2DP5t9pbRVbJSeUZb6Q72p73HqTr+LcS8CkFRrsZRM4mXV5E58Du9MI8H/22a21+rM6UchaXhKmMCePf/15qVvCzxFAZW79aIKz3IhaIVXDH3n91tYsf0iEiAVZ9sPY+2p5W3bVAsgfDo6/u2FeBX2bvaEI3iogq4BfxIzJn3zmMPb1WokWGjZ/XeSpk955h20M7nnc5VLHx+8wqECuB2aCj9dHv0dVk9vfs+k/1TxudsrFa50vvzyOCVny47VZsBPIv1NmEReuj398p4OqNT/U5jdhRx0Q772Wbam8EMgKxqnFETI2I0TOPFEjUAuf3QeC2keY0qCuKPy2G8ec9CMgO8pFc+sig3sOXr9tVe3n7cSCMQD4upRMQEwHWm/PoJiZ7kxPZY2DQ9UnemrC+wdpllxXvztwwu5KMtxS/97l7p7tQnPvJBBM06yrwlFiRq8qqr7txrPrlxVy1SbuGtqpeSW2Msq7YYPvCFO+mkP/65opJ7N1YVvGQMXZjXuNs2UI+NcmqmPqipoo48NzpZGH9haQdFfplk/Ue5Gj/niAQNpGtGR/QlLuE5adX8ap70EYOZeyVoGQLqiW2y+5b7SFv0rPEqSbR2odt79sEYgmuOnp8lb0RSO/veK+iZglZVnvtIiVTVT2/Kj5/lb0RyPkCeYmwc4X8VYQO/j5IuiBEZ5BMpdp1RZkOCpwJ2XZZ9rQbmBEImNQRCA5UtJJFaPaZxruirPg8HeR/TEjjNyPWuSOW1jXSCWZX1G+zNwJ5jkDWjpgZfaeDTAeJpin190o19jZi2dPseDdbUfAjkBFIxJHHC0S+TKt0kPU2bOyBlIlusSSoiFnvrW3HXoYUGT9Zdnd2kA6hj35T/ZOoY9/0j0DOP4OwXkZqJOwUh6+w1wEIqdKzZhB4NAIjkEenb5zfjcAIZDfCY//RCIxAHp2+cX43At43PoxbGYYNiQHTpvXpdgV37xuqir3rGWa8HT++8tm7BFK53tUSsoPQ6z6djrpDIMx4v5Lg3aA7hED3ZlZAli3vbfUdmLwDO3RPdB0rF3dMCOWcan8Zp1tRT/+0ASUAuu4J8bLfWbyw2dHdmDY7n+f85l6OWBopsuo7nTDf6h8jtzur/Sq6LOciv8rdTr5JtzpKxuFvJaCGUSUxVhWtVtenjJNox751XfS5eyfBbMJ8iz2rklZyodmqCs2q0tefZ4podAHDuNShjVhT8f+XrgoJ2fhp832H1NK/SoyROLoi0c5IHZHQ7E0H+Tv1FfLsEIis/BW/rsjWZzt2VqQs0VVJfay9Ecj5AmHeKlLGDuMQwBKfJmzGuaPk3wjkXIGwrlK96lyt+JLEXREfa28E8n0C0ciYPWBbM35VcMfaG4E8QyBZAnvnBfQ3a6yJrqGzvh5tb+d7EFlNqjcxEYDZqnW6PUaFR0TQzQfjnZm8jGDE7r33yXLln3+lpVY1shVBzs7S5tjDjpylQ6ViWrvF6pwZvHEoTUDjP6NwjH87vsU69sAlyKMluiLe3fF2fJIVmnWLpdnpCPpYe13wsVo4qwaBhyIwAnlo4sbtexAYgdyD8+zyUARGIA9N3Lh9DwIjkHtwnl0eisCTBMK6gXloqsbtdyCgXfNef9a5tmPHQvt8me3YRnu78GfaZdpiQknzS4pBc7LSZawP5Cq25F2+9s9McE+xVX3T7fnPtMns6Ey+MGNU/+OQjA2YAX+rQHYUAlZlPTm/rBj/FJpqRb+7yn7jiHU3xrOfgoD3qUlXPMwWvFbTK4yOf5Zvne55crxs/E62t6WDsCv0yfaij+3WOoKK8OR4NTJ3i8zJ8W4ViHZoR0myEsuaUatjHdOeZ+vyL9NJtLWZ52VjH3u9fyndFoFo8yd1o+A/H1yZf5n+abZQ+9Y69HlLILIwjT2MJVWcVOtWEipjhieyJ9mTcUQdlJqQ0/9+xIP8i/IGyW33exDNiYrj3rmBbW8E4lMnOsNl87HLXtYPs4NY83K1Mj7RXjVW711F1Wb1OYvWYw/qFfqil8q8+btyqH6aPVnBsp/a3HGo9oQYpf+JBYsR75YOwhiJdrVMiwhZICL/siPWndeolYLl+feJ9qgd0zqDWJ0lqlbX71pV7ji+056M1aq4UexWJ4qei0ajJ11wZIvVGptWuCr2Ojz7JxcVB6oJ/5bnqAn6FtBOjXMEwssMu4PwPBtLZQRGIGXo/nmwOprxPBhLdARGIHRIx+AnITAC+aRsTix0BEYgdEjH4CchoP19kK5o5C0O41bnDpusvDLildfl3Zy87O3AkIWZ5h/Ldisf3nuQqoPsRHgv9jrE2XGoZtpk3oqxMWTneBXI63938rrytp0P7YVgS3FVVTnPrf60Axb7sGNl2WMTkI0h278dHZPSlVhK3aCLMTkIvB+BHWcQdjVgVz/p3/XP3WLBHInkyMEYO071z+q61W5MtfckgWjlpEpqayYfe1jRZuJHJbTzN1dLgnuaQLRLhSyptXNM52wz9vb8HfISob9ZIFIIRwDITsjY+21hR+T3SR1kBPIfd6odc/Ar4DcC+d/MfUTFmg4yHQQ7BsbEHUJjSB59CD69IHxzB1nHlTmkY2Kz3nh/LH7fKBDtHUP3XQjz2nP8+1us2TOXh1/6DPetAvmmF3FPfDGqfQKF97j/VsquVhrJK+rMOjrrB4HHIjACeWzqxvE7EBiB3IHy7PFYBEYgj03dOH4HAiOQO1A+a4/SYfWsEO7zZgRyH9Yn7NR5X3GC/7f7wPo+53bHZ8MSAju6xw6bpeB2PKS9B7n26XSXXX8lc73f7vgn7TCTzLTFzLn2MpOF4cvPqi3rJSuDh2385N+vsP45u9EugTBHhNVHFqllsqukyeIdrfdI2PGRgdsjBBIBfMrvjITsjOVEgVhFhVlsOpgenVPvlX7V8bu+Hq2OW15c1ZhXXyRZqhWaJba74u3GWX3eEicFvxHI3/AyBMIYU62xo0KiTkwo+TrnhaP9G4GcLRAptsphmE1AbTTrjGvs8xHVvycJRJKjmpQdMzk1KUbZrhK9+lzUPVivCHYJhOLfEwRinTU6ideeZdurnpFWYmrkyY5Znbg0kTzFniXwFH5PE8jVRard4wJNPs+0pyUmlRTxdxm6h/6nEDqLUdThvkogshozkr7a6NjzRoQ1SSgBohEQtSOLgfZcJW7rmYotRpeVQqj6oQpq7SDrjN+pqLvmcca4wR5fkARnE+aNf51D+s4zHIMvWeEjHUT7UiS1j3ZL0m3pK2kY44ZF6lSgwcG3QjykQiMCsiogZUT4MbLrILybK9W80OLVFCbn/CoRrTm/aq9CNotkKLmj5xGfsh1EKzDeWRHx0SpajFxc+1dtRSMq027aVvoBNBsb1nXauOYO2563Rxfnisg2pOA2k8x4W7a6ibsDMVlhuj6z7XkYsPZi2bkjX4w9mPG2bHXJxgAjssGu9Gx7d/l/t99RXLt/Z8ZbtvUEgexOxNgfBEwEniiQ1kw5XPjnv3Z7CiRrXpk5btl6mkDKrfIUFrzZj5Px2yGQdrxPFQjT71aFeTPhs9uzY2Xby8YTrW/7137T6HjYdu7Htmenu0e7wizxy9sSL3lMgUckuX7X/Ov4wcKOnd8oD6mYnySQV6JlcCyBpEBTGBklRT7S3Q8VhSeO67eqL13spW+aH5U9olyk4v12gWSJpq23KmkluQx/pI3IP63w7PDDsnmHf+VcPE0gMpmVwLXDYIcklg8V31YSacSpjDXsEebl465xbQcfK5j95sFyqJtcDcRUawtm+8tWxU+vBVd83CGQaEzIjEctgiTHyQp+kisvG0yfKxxxBbJiUg14h0BW4FgCkXYqnSQSSPb8IckhxVIhkGajOkZp8bZI+OOI1tk7/NOEl45Z6yCZ6oTMlRXSaaOGRoxKYiJCZ5MS2asKJBo3srGzxiJmdbdGSgYHV4Fkc/pPB9lRYXYF2a00EaGzYN5hjzkWMnLNsKEVV6b4KLZ3Gv+7AAAgAElEQVRkVe5We+ZodQEoCdithHcQulO9vBFGI1VW0BLXas53iIRCamVkS49Wa3XfEWiHIDIYhDAZkjxZIJk4rQJjja9VEh1HauYhP5pzq6DtFkjnALZLILISZ88IVmW3Chhq3yJwldhewaoImNXR2ML/Y887pHfbeTUBSAc5SSDaWBkVlohI3plD2o5sRf4hz2vk6/IDzXOEpWXHei4V706BsLqIVynRKopUl4otlDhdUmvX0bLARUTqnt2iWFPEU5zt4q91oraIu0FFSZnfB4FHIzACeXT6xvndCIxAdiM89h+NwAjk0ekb53cjsFsgrIPXbhzkAW83LlE81svRd/sV+f1xv+8G/EkCYV1LM0gyAmGgSLChCeRJpCZA8GuCHTfbHjPWsQUiIAXCqKLRS65O19pBusjfC8qM3x0cI38yfmg06GLI9s+zV4mV6p8lkIpjW17UiAx3kysJE4G5rs9g0vEz8injRxRvxRbbv6PtVQACm9NfyzqEqeyHPnPirL8TK0nGSv7Z/ln2qvtUn1M58wKIrWCvanUSYpG+YtO6taqCaxGvMmpVfYiKgpXnLH5s/0YgP5nLJmL3yKaRt5L8qMBkx7SKD5E4Xr+zuiXbv+MF4h3kXr9Vib0mpWuH3ZU0wlh/FpHPIt56uM90Ek9wjFzIDx+zNtn+7bKXjcscsXaQzxphIrIhv2fI5tnTKtfOMQStvGzCWIWqimPUMbPE3GUv6wckkCpoO7vQapvlX5QUGQ8KNmI3soUKCSkmUaGq7BWNRNlp4S57Gbx+167JYpEvSkrJUeZfo9xwMYEIYx25sp2tipnMhWUnEq1WpFgvmT2RMgVcwlDOo1n1W5vuEhvbP8Z7IC3WSmLvKCweSVCR3EnoCo6VZ0xc5DUvClKkRqaTd4qt4rd8RnaT7KG44kOnI2X3u2skquY9G4/L5R3vQaJxIyvCXfa8EUEDzfI78i97nonsVfGL/Eft7vKPMf6tFxJoPCMQgQAyImQEsiblGgHXPbKVcBcB7xBIhZRevB17lWf/yTvFSDRvze+DwFMRGIE8NXPj9y0IjEBugXk2eSoCI5CnZm78vgWBEcgtMJc20Q76k68SlPWHBvA6druf1G53Jl+7URf2B/CbAU9ul70iTpqf5REC1rdY2fcA6/o77vG1dxnZN6isCo28V8kUorvsZfHSOMF4hxEVgeh36RcVvycJ5HoJ9/r/3ucdCBkZib0S88RPL7KkswotA8fIl+j32wXS/YCPUZmioC2BZMVhFQjEzlMFkiWcN4Xs6ORe0Ubysr2DnCyQq4swPuXwvsVCEuEJRFbWU+wxxaF1cuvPEJFda0Yg0cHI+N269mR1rCp5vHFPS3oU/i57674ZwSLk1kiN7uEVk0qheUwH6Rz0swfC9XwSETC6UEATa3UQS8ioX974WCkGFZJVfWV0EDklZIXtnYvSBQtRfjYpjINb9lCYJbUkdzYJmshePsgulMVOEoxpL00OQCXMM8iKn/e/I7ceI5AqabPiYCWeMWJ1Lg+0jsS01ykCUU6QQovYYIzRW0YsjxzZKphdH1WEiDjM/Sq2tIp1EeYke1qHQ7GPRt6vEQjjZqdCiihR3qiRrfzUCqP8CyA6ZFlHLK0zVrC1ulD13GadvaI/z3QQ2e0ycVPzi1S6jHOVQ1okDs1mZ/SwBJUVmnaO6V6RS4Ew7THe+eyIWRurjhIIcqjJzPmRvezZRCNutyp6PjL8q1bTuwQS7eMVraiQdAsqkm/EP8Y09OdfKxoROnu4i+xVCRiNLtXEZOOTyaG2dOUzmnW/bIxRR2fbi/bzzjIeLzJ+UvMhr9OQOREZiWbNIPARCIxAPiKNE8QuBLLjzi4/xu4gcCQCI5Aj0zJOnYLACOSUTIwfRyIwAjkyLePUKQiMQE7JxPhxJALW29XL2YqAovcgL9sZu8yXeto7hfXPMn5dzyHxZmKm3uMbrMu8V5AmrGerNtnxUu3JT000PLOkQQiTsRnZy9hCSJ21F/mXLTbUBI9A/kIgLWLvC8/okwKrJbITHFWsTHV+rbXiqsaLVlh0hNjlXyRktDB4n4Jkc7Hmg/JpCPtLhOhFYVpxbAcfYI8tEIs0lVwgHbMyYkpfGL6NQAKyv7sjoRU+Wtchi0Zor8tHvlgd0yI42gGsboR2Ie0sOAIhC6Q6EjEI7BGTZX+107GpPYv+GRJn9oyV6biVuD1epO09acSykpWtWmmQkDK9rGHZ16p0NtbMuFbxu/LMboHIrqmlD8bx6QKBA91A4MpImNSaeaGQsYN2iyzZpYArudhxSEfOXbCvTxIIHFTAniwRMmSMEl61hZ4NNPs7BHLyGQQZC2EujUD+hpMhHoYNWQXhhCrs8K5ltfdgyF4n32JtE4isUjsOwRXyVJ5BQGLFm5mpMx2kir/XRaL9M+JY8ev46uV3V+6ROP9gtfNN+h3XdlHCo3NC6wBnGGcllWUHmckzI5zlV9Vfa1yT8MKkdkiR9nHddOetSWdkSAcFqoYV7+4OwiAG08evFQjIq1n2AQjsKjo7oHmrrzuq0w6Qxub3IjAC+d7cT+SnIzAd5PQMjX9vRWAE8lb4Z/PTERiBnJ6h8e+tCIxA3gr/bH46AtanJuj3O1p86LPo7QT7fUV236iIoPayXGDF7eVj9SmK03qXosWVtZXFBl3fxnAEYkONEh9dhyb1tc57u5wln/SPYTt6+531MYMNspYR4599niCQFRAGGVEb7HVIYqU4rC8dMgRc41iJU7Vt2Vh9z/iH4pJZh+YutDkCOa+DeMmtJF4TSOc7ObZ/VwZk1a+KzBNwKAi5YARynkC8JH6qQKyRqCISq2NeE1NKJE8VSOdgiM6nKBlRe6nE/CxmEAc9qFbilQRGbVgHfu3r8qxIqOejTxIIWiFQANFko/Y+RSDRJQKahwgPFH9LbNKP0uj1VIFYlQtJjgW8BBBNEGovIgTyO+qTdbHBPD/s6Jxot6uOoWn8PkUgmRsUlCQomKg9RABRHKhPuwViVeOKf1FHqo5YnYuIX/xGIH/TVjvgRQn6ZoEwziC7xDYCWbidmS/RkQithqi9bAehzNDiX9YXkTEzomprUcysDnf9eSaft51B0ASiFRW1hyRFA06zH/kWtfPVFzTZOw7pzPlextG1vatjWnxBcuqJRP6WsreOWCihow0iwlSJHZE78gsRmfZ2ObLbJZyFO+PAap1pOrbZAtHyao3+KEctrkS5/Md++oGMh8BatEoDpmbJIMBHYATCx3QsfhAC7xbIB0E5oXwiAiOQT8zqxERDYARCg3IMfSICI5BPzOrERENgBEKDcgx9IgIjkE/M6j0xVT7Luccz4i4jECKYX2aq87LxMVCNQB6TqiMd7XwzdWRA0qnoU5OKgO789OKKh+FnxcZrf+1rAPTPPJJIHJn+XftWvmRgf2oSfezZjVvDGLYZCeRlHDb248kTBGL5mI11FciKlfeBILLHDv/kvtXqHxE6yxmvmGRtrWKg8ND7KKxSXayKyminjKocEbqaEEsQFykzWGrErZI56nCVDhwROotht5hY3KLw5ZsFYlVUpMLLpEgCazc8WeJYe2T98wjIEEj3sL4Dq6gwwBhGIxZsaMlmplpmOgulIgT/1sIOib2WXrHbJZ51ztAImcmz1y0ruWfFiRSUtH9PEYg1YqQD3igQOb6tCcsQUBKbZUfm2psevMLlVXxWPip4bRcIa+SogBR1kuhgmAF0h3+eOCpjjIZH1W+vQlds7rKnCTjiRXT+kJ07He9TziA7BNIGTxkrL5uduVrrllYHRQgkCb0WkzRhlA7MsicvNCpjqTVWRn9u4hiNWBUnK6BHib5jvq9Weo/Q1aRb8WY6pTaqMaYET6yV3Htnyw7/tGfT/kUC6SSk8qw3WkQiyu7HOhx6Ce5UV6/yR1isv3ukSBPGeDFartCOvYpv66ir8SFtM0uqTGJYa6Ogot9ZfoydL0RgBPKFSZ+QcQSeIBA8mlk5CJARGIGQAR1zn4XACOSz8jnRkBEYgZABHXOfhcAI5LPyOdGQERiBkAEdcxQEjrm6H4FQ8jlGyAiMQMiAjrnPQuAogUTORL/L1DA/LFxtsz+9sCiV7aqdDxM9Wj8hXjT3iHxZ39tRP62JPjGufEW6QyC7Pt7TElcVCMPWZeMJ8VK+dfoJOBLHhQuSG4uzFS7/+RcyWJWqWsHYAtECKwUrksH4svVlcpd/L9vVr4Gtip2dBjQ71Aod4FeNX+akzJcnCYRN6G+xp42pSCWORLYK2CoUmdEq+vI5K26tK6XjXgViiYXh2ApU1sldHelpAkHIFq3J5jISSUTqyJ9VWJGtiu/lzrHOdNYh86oQWceieXIE4tMmizdCQnm2yebAOoxLjsiugvimxYv+WWSfLhBN0dmETcX/L21Z3CISV+2xRyzNz45vqBiye2wZsU4WCOvQukvAbP9Y9nYLpDM+W2cXmaNsJ9hySLfablW5rBlfgshKCMs/b6SsjjKWzaq9qDtFo0p0FqmMVppwIz+Q+C0xZUX2xxd5SNccPEEgmkgQsDLxZOP0Ro0uYZjx7uognTHSy4slEjTfXh7TOUY3jZT9zb+nQf8QsEoVGYz9GExHIGDGnGXHJLMfCmRBjn87OHQMpjuCg1D+oEXHJPMmTHd2jl1npTI0I5AydPPgNyAwAvmGLE+MZQRGIGXo5sFvQGAE8g1ZnhjLCIxAytDNg9+AwAjkG7I8MZYRGIGUoZsHvwEB71OT6v0+9VX/hv8OOfvrUfaLswj36HfJ2+x6hPeUL2V/NvLycfmSLeS07+NGIP+lABWNRp5vEwiNfIZAuh9qev69tkyJbQTSF8glGlaljuxEv+/uIFHFTxFQFCftLX32zb2FTxa3PziOQEYgyEiFrCkR0BBI568iPEYgWjurgIiOP6httj3ZQTQyZapqNGKgcbL9sjqT/PNMrOt4u9phCETyL4vbtg5iBe0B4FUoNqHZ9hAiZmbfaMbPJpo6ky+JioSMdJ0dAon4lxLwjhELIUzGSTah2faiM0iV0CtGqw2GvZVEmVxkCxkiEiS2aszdbr7lDMIGkU1otr1vE8hTDun0Ecsj9jurTDQiZGfgrD10PIrsohiePmJF/iFdY10jBdcd3bYd0kcgNgIIuVnEiQjytnEjOH8gGGkIRx0JLVDsTv57SGePRNkKcvL6LBlPjmV8KyAQqf7bCfLt8Rco9VmPRAL5rGgnmkEgicAIJAnYLP8uBEYg35XviTaJwAgkCdgs34bAent3DC+PcWQb7M8zjLxZzkSlXRt7X1BkbLPWWj6y7JftXAKxXtZUBcS+/WHbKwN2w4NsgbxcftlcRbGGUc3xakMSPGtzR8yUVO0QyI5WOQLppXsVyCWU9f9Xre/8eiArsmoM7nM7nGCTeYfgtoBJMrqjmkqBXK5ef15x3eoa1W7yrjy7fNW+GL3Aqopnl0Cq/lSS/85ndgiEHQ9CZmQN26+svdBHOWLJDb6FlFlgd65/kkAifrCLJRP3UByvzeTBTRNMBALT6btsQeDc5YzY53SBZLDLrL0Tbtgv77rvZPV3wNQOlicVgacIBMXsNB7B4tA6iEY8FIgOae98dgTSQztL+Oz6nnf+f104JY4RyP9ScVIReEoHufjjETpNyK46nP/8dsmX096oEvCBTJTAgix/xyK0K6DrmKhpuS3n2zqkvxx+R3BMoO6yZVX8T8YPIRyyZleOtJwgHe8ff6Jr3pLRXVEfapctkNNHrCsN8ixncekd4yvtnOm9KBxxvEeRTxHIOmVYSL1DHJqAy36UH3wPd2bXQxGwusmh7uJujUBwrGblFyIwAvnCpE/IOAIjEByrWfmFCIxAvjDpEzKOwDcKhHYFiMM8K5+KwAjkv8x9Ew6f/AKTrsNvIoa8H//G2Nd3FyfFf6xoTwKJrn7D4LHJUPxl+KqNlBHWd/MiijP6XYuH8qkL+rFixcEoCe/6/QmxIKRGSYzYkrlAbbNyGOUk+j0SyPV7Oi7vY0U5knzKrF4Bm0UE1A5C6nSyfzbvxt99XmKAVHpkjYVt59nfw6llpGUcZcPN69gJ3uk+29dIeIjoPJ8q/qLPoOuo+bA+VkQ6C9WRG43tBppp3yI0QuQV0kgY69rI9pMEosUdxfcXFeXitsEbiV7diklgb/ZNJcI5oFtxZuyvMUf/OxqlI/yi360RK4oHtYsUg2ivXx+1hSeOVSf6FM28cBIAccjLFJQsL9MSO0sg61rP92jv6Pc7BWI1ADg3OzpIFqCoEzytq3Xjjyo8evMoL1muXH+6QKLCFXVIc8SyKk3KoFKxIgFEv3sJjZ59x+9MgSAkj2KU/siCo51D0Q6ixZqN/47poLyHrCpSDFXDWZC8JH9rB9EwqVyeaDlE/8w7Y2UO9hkR7+QOPFpdDiOAV0TCDFKboyPA3/k7I/ZulbfmfPnnMv/otFDhxDuKYNtPdJ5lJP2dpN299xO6nCW6NolI4J7ih3kGIcX5lWaeIJCvTEw36PRM1t1wnh8EnoTACORJ2Rpfb0dgBHI75LPhkxAYgTwpW+Pr7QhYHyui1323O7zhReQ7Yjh1zxNfyr7VJ08gaxJP6jSn3xg9+Uo8Q0Z2nJa9jE/0wmMR33tRRXeiaJB1b/6ORGdCvsu/jE+vtaf6ZcVR8ndnZ2AROJu47HoJXAVIravJDlzFw/On46v3JTfyLRaCM8KvCLtrH8RWJI700QH5mjdt9MdL5iiEgoj6atlDPr3RkhD5F33zJm2ebC/yLTuao/aqAqkWpj9xaN/iWCp8i4OO2Dp+egJZxwdUcKsvUVWPfpf7R3G+w14mXqTT7LLXEocmEK/tVsiSBSe7nnFWQg6HqF9eNewWGKsLZUlgjZQVPkS4IDGjHSTLvywuaixIAGtFy66Pql8EsPd7F4Coi2R9QxONYnjtrwm4c27q2kPjRAnNttedAP7KO5ospI1rbVIjGbonKo5rXcZulJSMLWskYrxjsopAVSBse7tGo0pRlgUFFahbCFEiZAUiN+0+b4lvPUNlY5EjBeOAHvmTxYE5/nmkq/rlkQvNh1VgpO2qvcxz/8SDPNwZZTrPauBr9qrJlTO99c/RqJWp5hlfPewydpDKmrEXdd9sR2fbQ+KNcvr7eySQKsHZ8703V2aSq1XRDME90SICy/gadY/sCMGyl4kBISLbnjdtIP78tcYSiCR4JCTLKTnGrOuqNuVzWRFr4rVuiBBA1wQjVR8htrSj7dHBr2MvwjtLeLY9a7xHcHdHLFbVRypVxtkIQG2Gjchj2cwm15qfNcFlRg+rq3ULTNcvbXyxikiUA6+oajYz9mgiYdy0IFW2swYlLSKkjh/es5HgMuLQxkBvxERi0jDs4uWdHSpkZtuzRJLyLbUYycSsGQQ+CYERyCdlc2KhIzACoUM6Bj8JgRHIJ2VzYqEjMAKhQzoGPwkBTyCdu/J3YHSqv6f6JW/L0NvCd+T2bXuOQPZD/2kCYQspem8Wfd+2NYM7RqwIwOj37P111t5WQMnG2bEx7DFsrDDdLZCU/5pAUgYUQkTPR7/fIRDvpdS1f6Z4sO1dPmSxivTJsMewgQgkisX6HcnF+qyb5+53TZqTEYDR76cI5OUHKhI0KYg91Bbq3y57SCwIybN8iGxm4g0xtD416QQvA44cjvZi24sAlodXZH20JkOCCC+4+v0s3GUvyluEya4uGe2byUX430mPNkM6SJSgCOh3CKQS985nUkkFHOnY6zyL8AVwH14iuZc+8K8PhO0GdCsCMPr9jhELDOWoZVncIuer9qrPRWeGqFBG8Vi8sZ6D9huBZGG/Z33UdbPFjGnvaQJpHSOuh1cAIWU5PIkAjH7/9g6CkDkjkF320HdoUUlB+ICsQXiT5nlLXUbkUTDR70ig65qsvdezlWe8RDPtMW29K9ZMDMhaZM22EUsjW6ZCZQidVnBA5o69ToxszLqCv0u8q+As/LI5idZHvyOxX2tKh3RPeZVxy1N7pxKwXmpWfECSUMFKsxsRIus/257XlaK9LBytmKr2on3g4mglteOYFqycgzNk2mUvmo3XqoMIhGVPVmnLbgVDz0emvYwtJN6svStO6/wF22MdtKIRYafg4GAXJy3gNAIh9tn2ItIgPmVmcqa9ii0v3qo9y2bKXmoxWiJn3SDwKQiMQD4lkxPHFgRGIFtgHaOfgsAI5FMyOXFsQWAEsgXWMfopCKACWa9as/fwd2F1qo+n+iWvQtMv0W5K7FvxG4Hsz/JbEwyEN/45ICECqXaM09+oA9w5YkkVf8v5b7PXSuLaVlFDiKjWlzR3fCJSSTrycg+NNXqxd2GbsaeNQGiOvHUVrJ5sr4XZCMSHL0NopuAiWxm/EPFm7EW+SUQj22x7LUFknY86geZMNuCXDeSTl0zgUVIivyvPS5uMz2usmLP+RTnJ2ItsZTnGtocUhIhzvzFIYLSPCrMtORtw5CzbnkfkyBdEpBqGyHOeaDMEvmscyvIiwoBpD+VMiOu6IDIaGhMInHpIj+I8oQJq5w/L70xetBurbLyyQmf2t0TS6baR8FqFRxOIJZosECMQPXUojpI0XYEw7bGEtqsQRKKBu9WdAtESjJJFOwt17a0gMscibQbOxKmRJko48jtMCsAY2oXRuNn2kDETGqfvHLG6JJQJ7tqTRIQAS5IHJUhrDAB80goM+Ji6LBqJot+l0Wh99DsaS9rOjkP6EyrgU8RxmmhRIrIF2bVXLqZRhUsrbkGw86xXUVmk6YK+s+pb3TLKl0Vgtj10hGHkqkxuBhejDnLt0U2MBWjWbjSrMu1lba2C0+LN2IvGSWk/ss22F8Va4U2UW4bYMh3wz1pEIBH40aZe4BXbd9mr+OYRJ2NPO1B34mbbiwSSiVUbd7MFIOJg+fdKIOXN5sFB4GkIjECelrHx91YERiC3wj2bPQ2BEcjTMjb+3orACORWuGezpyHwLoFo3/K8yxcrZ0/w8Wl8e5y/7yLlE8h3oo8n+vQ40mccfpdAMj4+aS3zg8D1XcOVp65AGP4xbKA57e7VfR7+zxyjAe1Yh7xhzbxYYttb924nRARyoj22T1fI3svMaiGPXpCGdjNf874CCQ0uCUaIiNhD7IxA7NIU4ffKwbomyknms5XIllVcLJ8z9rwOvO7r2pTgIB0gcjJKSIbMnj9yn8ivKDaGPXZ1ZdiL8qFxwMNyt0CiPEV51uLVigBUFDLVAzKYqEaoPQ2wzrM77bVbOjBiVWNHxMZaE5EcyYElxIpArI4RxhttJgMJDSaRqdqrPme5x7K32rEqWQYilj1PVNnYs+uReDX/vE6F8jaaCsJY0I28gxQCAJOY1Qoa+ZA9Y0VVEJ5zHQCt8YiZt5AkQFfrcGA9K0Tjd9VXK7ehPSbQFZBCBxWjlWeQs0wWC6u7MoRhkabiY1RQsnhm10e88LqkjDezdxT3irGJawZwZMMIjPX3qr0MSIg/DHvVWO7sauiNZcQJBl4aD7R3PdVC4Y1WqdE3AkOOVowxRAaN+nCiL91YojEti41nTxLQKx7oLRZDLNZZw7thRfzTOnl6ZI0SEB1ykAptdY2O2E7yi0ESr6JmMY7WI4RECIi+IshybOWF52vUfVf/ou6UHrFSbSjKiLj6vZZHwEVmT/HRqkqa/0jMbHvIWSlTrCzSWvmqxIx0u4zdsj1rk5Nnai/hCGgZ4aH2UFK/y14kEtSvdaTMPBNh7v0uuZjp2NralL27guwANM8OAm9DYATyNuhn4ycgMAJ5QpbGx7chMAJ5G/Sz8RMQGIE8IUvj49sQ+BSBaJ8rMGJj3+a9LdHAxqfG+tbcMkgEYL99yQ4Q2e9ZmCCw4/2mWNer6jUnqhZ2CMS7p87cYV/Ov8sem4RPEIj29pnp9ym24NxqAulWk3cRGgUf9Q/FwXpJWC0+77CHxhq9cAwrcpAk74VrBU8rLjjedVPkbTDipKZOD5fI5rvtXb4jXx1oBMl2zUggu+xVyH0HoSP8PW55QoDOXNE3KmvLRR19N6HvFlw0CkKJULJsCeEUe2jHfvQ6KRDrn9eDTYaAVkuObKzPoSMRmgi2PXnoi8ZWJPZIBNHv3ijE8E/DOtvZonwdYU92CEQgr8C8JLMJeLo9pHjIVh+JJCLHu+3JmKVgI/8jgR1jz7q1iNr7COR/KUaqeYbQp9vTOqbkCxKDNiVcxfcYe5pAvOCQynB6xb/Tv+h8ElVSawxB8pDZO2NP65gaZzI2EUG8xZ4nENkl0KrgBdu5KUEuFKK5Nkouw7/s/J89p6F5QAVStSdHbWssQkfyI+1JgXS7hzebauSNZvGn2at2BG3ciK6VEewy5yOGPas4skZypItkJoTQnnaNqyk+U2XWTZFuEiXmKfa6uMmKf7o9ZPoICbj8dewj7WljizfKRGRGK751ORBVYHnYvda/0548tFY7pXVoPdGeJubKeOqNo0fYQ1rfSkLGjO9dJUcC0cj4bntfQxYj+Zkbugx/sryzbLf8QzoCEtSsGQQ+EoERyEemdYJiITACYSE5dj4SgRHIR6Z1gmIhMAJhITl2PhKBEcg9afXe5XQ8yLyf6uzztc9+ikBOJ8oOgWjvhD4ln8cI8h2AssmSJYq2v5UQBJ932nv5nXlJKt/ZIPHdSVbkzXvHn7T9dwC0SyAoUd5JaATvjH+SLIj91zNpoiis9L5qyJDYslMVv1cE0nGzPoiLAEk7FhiMSIR8IaCtqfiZ+Tguwikir/dtW5RLZO+LlMjauwWS8U3iWH6b7pHkAgmtShaoZecMg5q9zBnknYTOEI8tYGTvLAlXm5XiIn2ybGTyKzuIF3fIbbmAVRUiJ0PHQHFURBx1n3VrxM/T7WlQMsgckTuzB1JEM/bWDhIVBjfH64+aSivK1cQhPyisVCqWf6cTepd/EVGyxYZ1dtDsIIXJi8ebMlJcRBZXROI98257M2L5UkHI6YlDWo/saQUheiYjjo2H444AACAASURBVKsYa3kPu9J68+NV9QypkbXIGq8TWe0d6UzfJhD2iOV1csknpCuhAgnJ/LNZ1IG1qckUJHo1Kme66i2RdqiLSJ0FJmuve+6S/p1mD5nHMxXbi1ebSCKR7BRIxNuQWxlgos3QGbciEtQ20pmiCvNph3TmOLRywJs+UNJb4u3c4EkOIOO+20FQ8smRJysua59QxUkHI3te8jQyRXE+yZ6WQxkzGq9VSJAi5Y3I2gSQtYnkEbIZgZHk5iOWIx2kMnpa87d3SIzOB964FhUC7Qwn90vN48vDrarssCTqdhm+emcleErIbPgI9gNORmcGOUdHGJ1uLzPGAPBtX9I9w3kOQl0DVs92KGaDQeBwBKLqeLj7494gsBeBEchefMf6wxEYgTw8geP+XgRGIHvxHesPR2AE8vAEjvt7EXiyQND3AHsRHOsfjYAUyKmk0/xK32nfnMlTsVzfizAKJPLWGnk30fm8RLNPeen4ZIGwE13VjyWEEQiGqIdTB0OaQCJDrzArlcb7RgmD7n+rKJ8NOJsyEuF9yXpt3cUxi5u1vhMvuzDtEoiMvTRxeN8PrRt0E9tNyJqUiCSRr+i3WNE+1++IvQ6WDOw8ssjfIvyeKJCSOLTOwEyG15mQJEgCaoTVPraLOh7SMSMbqy/WDO59o1WJP/NMJO5ubphnwt0dpCyOXQK5i4Dewcwjk/RPfrmbBVSzZ1XZSgGyBBiJwPu94odWFKIJBBH1LoFEPER8++vfyucBChn7MWARRhtJskmOEhv9Lkc168tdxI7W4bSOFv1ZhMHJAtHGsyj/1rjHusWKhJEad6MKcBmziJSpUlngvA7hdb9oPPLGA4kHUhgsMUX7INilkhkpbfk9UwCiPFh4o3uwOwgyASBr/sSdveZFg9YqNexUkGhvto/EIUef7ixu2ZNjm9W5EPIxRGLFiRSAyEfLBsqVqMAgOc0Um1Sx3ykQSZ5EgXOXegJBEv56PrqSRezIESvbja0gowKQJQwycmTiRfKYKYaRQDq+eYUBErAlkM4IswIIOYEgrowHWaIgVaaSDITQ196I/XZSRaDeqCcxQfxDcMzEW+1QCG2Q3Lgxewcjy4EMiDsEwu5MmWqHJCUzTkVdpEs06YsmCE2QaI4ZI6pWUBlxR7FDBTaaH1fnUdBQEnXWMYXHtKWNXZ04Wc8iIqgUCsRuJoaKD5H9lo8nkT4KdH4fBG5HYARyO+Sz4ZMQGIE8KVvj6+0IjEBuh3w2fBICI5AnZWt8vR2BEcjtkM+GBgLWDdZ6y7jjxtFNyAjkXL5Gb8CrubudZCDE1nXsUQJhgrcrwSDe0LK74q2QeRd+zJhXkFl2d7wLgcigLUK+xao6vCvB5WCVB5HPMFBys98qX+5W8deet7BDY7Se7/rIzCnVlvWBnffhXRVMBoiMKhW1cqSQoEmo+hsVl9f+aB6YtiKBoD5FduTvVbteAYRsZr5ArSb7FSxDHKsd6TcU7A/qGcIwYs74JrGKhJix3YnF86ObWyQfmYIQjX0pHKwR69pk/T1lePGyCyBKmgxZrPHDwwO13x21EJyzmFo+oTEhAqnaimKJfpe+IfgjGP+xmyEEbBSs1BlAvQRnAdQqjFeh0Lh3VEIvNtQvtMBUqrQ1rkadL/s7M9Z1+gg5qHUICyjUSZQo2YSwyKJ1Dw8oJO5M1ULjtsgn/zxKsoYbq6Ow7ESCQXJgdZILn4oN82/WaaCjGyAVHVljVXqv80VkQUeraI6NupCFFYrhWvW7FyZyT1bV94THGM0zOYjEIfGMBPn7u3eLhWwKb6QsRMmCJBS1ZY0blrAQIXsEzOBbmaWz+Mt4MrghfNDsdfaoEtvKCVpAVYFEs1k3UARgLeHrvl4CsqNLFC+aHM2/y5fOCOKJs5ILtOIjorN8i4oFYjvqzogNqkDQVhYRFXFcq+AZVVtkRMWRESnSPaKOVE2U1TWRbmrloSKqrC1Wh5JxVjki85Ox8yd26xbLO4OsoEUbWhX0shE97xGakfCoI6HCiyqqjAO5FPC6ENL9MiMbGidCuKqIO93WK/ItnmQEgoCDJiUrDLQ7ZddFAmH4ma2GO33yChYaK0I4tPsyxqlszlPrUVBSRmfxIPApCIxAPiWTE8cWBEYgW2Ado5+CwAjkUzI5cWxBYASyBdYx+ikI7BAI633J8Tccn0KCicNG4AkCqd6r3533HYVhvVrfkau7MXrcfk8AfRfx2Mna5Sfy3oEdy9j7QeBJAlmT9gS/GSSzxFF5EcfwZ4eN6GsLbc/b8m99snBa1WITgh0f295FCq0rScLcRpYd6hB/HRvd4raYnyIQFDh03S7BvfZnJs8SCHMPFDMpWu+5Xf51C1H6eSkQ1gdjWdDfsf50kaSTaYAYjTBZMkf22EVCE2bW5/WyI+XfNwukDJqjZqboThWIV8zYPq/8vPbNiiP7sehf8X3riLWCwCQ1U3RPOH9IQewUSFcYqc6xqlELihXoO0anzJ6niwOJJSJONBJFz6Mdg8mZji2tY5TtfXsHKQMXzPsd0skuZFU+VNxPEwgalyVcasH/doEgFfoda1Dhout2xbBj/6NsagLZ4eCuBH2iXXSu71baLnY79t9hc+3I6c4+AunShP+8JRBrp3TSCS7vIPIOm/KKOI1V+gECuGPCR8CboeWT78rfjiljh80RyKhtENiJwLsq0M6YxvYgQENgBEKDcgx9IgIjkE/M6sREQ2AEQoNyDH0iAiOQT8zqxERDYARCg3IMbUBA+2DzVs6im+28o67gepo/lRhOeIaBI8PGioUlis4+5WcRgex8w1klSTng6oYf+hwDR4YNSyAs2Ms+RgJhiKPs3A86qw8IYFFMiI3smif4qMXUzc3LJsPGIwXCEAcDwCeQ7w4fq0TM+IYUF9QeYmvlR1SUUHsZm6+1rl3tRwlAxjHUuYxNlBjoOsTHjH9WYjP+ROToFBqU0CFZCh0dwZHtH5LfFW9YIJqjSIAyuUjAGbso0dB1CIAZ/9gCQfBDyRyNVRnMMnF27GrPduxdfpdsrJ+7X4a0T+CRCoc4UnIS3Lxqu/pc5FbV7pMEYo3hjNjXIlW11z7bWGLoOGQ9yzrTeFWxUlk7sXoiYdhdbTDtXTh1bUa5znZihj20wEBjlhVAF7iotUfVN/t7x9/Os08VyJX3TuxewavYZdl7pEBO7R6dw68cKbOijqqrxKxCOm3EWLtsx6b3bMUu2x6lSN/RQXaJQ1aKiHBZQrPtyYRF2K9nwo6QPZwqRJaXHFo3ytrVOMIeL0sYRklCSbJ71LAqoSQRUsXRFsyIHfFHrrEKSpZ0uy5NIv+g2X5ZxLZH5eIdAqmQBAmyciBn+3KnvapAECwzxQAZhTK5YdujxpsB5k4yzF6DwBEIjECOSMM4cSoCI5BTMzN+HYHACOSINIwTpyIwAjk1M+PXEQiMQI5IwzgRILDjnQgEOiKQtzkHRfD3X9jZcRUKumEuOxm/k31bAX2bn8h7kI5zbMJq9jr+dcmPPH+yfyf7hmC7fQ0ikI4Tdwjkk/3rxLb7WSu31Zwz7dE+b9opEOSTDmTEuxLNtveyW02mRT6GPSTO1/4odmx7Mh/SjyoGuwRy+Yvi9Vdu5YdmSNVBNmInhW1vFcfdMUfkZsfKtvcEgWhFFeHtP1zYIRCkvWWqDNteVhwRoXfY80SbwQ4Rf9YeKrh1b4+cbHvUmBHHs8pDAEfWRJXKuuWIAIoEl/FNikPDKmsP9T+bF9ZYyCb0TnvtI8QOgaAJRipzZAshqLQRETb6fbe9KOasf7vsMc8Max67ZxpNcKvNqED+cwZhK3hXQlgVEBlf3iXeCDuPSMiz2pqq4E4ViJw8ZC5T8b6UdadAUuoFMr7L3rvGFyDkY27eTheIVwzgAhgRIaW2ILu7yAwH+3D/ZGWMcoeIjd2RTs5xybcIZIZAZIeK9owSy7ZXOcdkfMzGi3Z01C7bHjKior6hOFbtReeRaP/wZVNVIFZSmIEyOgdbbAx7bEKz7UWjy7vz4sWb5l/0AEsg0T6RkhnEixLb9XFHJ4pwOeX30vjiON+xR+UKgxSnJGn8GAToCIxA6JCOwU9CYATySdmcWOgIjEDokI7BT0JgBPJJ2ZxY6AiMQOiQPtLgeltZvbncGfjb/PsEgbwNPJARp/u3Xk+vnx6dxI23YYiA8DbnbiAgu1pq9k7HD4RZXXYHfh3/2s9eAvFezEyCcZgZhEFsIGsur5G1yBoNBeQtPVKEpa8e4hl7q53SZyeaQC6jTEe0gFH7SBJe9lF7GmgeDhnbkmiW756vCFmRNbsFws7LO+yFnJELOq/4M1WgQrqojofB/hhAE7HuhxA68q9iz9q3IhAP84y99czCsonwruMjiv0/OcySCl3vkSUbaES8rL1IIGuMiG22PXlo9kYbNB9RHNHv1qiCFI7IR0QcCCZsnvyxt95asKoBIo5MB9lpzyMGmjhvZKsQKyLDO/3SfNMwzPhojaVaoerwJlMEfvMmBXL9wHZOjl9RVYmqAcueBVomwYhAqvYY3SPCskScxajsoN2r4q69qKNreJh8RITQBZBFZhkYw69IIFkhs+1ZMXcqabWroUJb12Xxs3zTCrflzzaBeNWqmxCtKkSAo6NVxzeGyJAO0olVFphOvLvE8QQfS7lGDlndhFiKrlYXpr0SaA7b2faeQLwn+Fgecb1r3kxbi7rPKrKqs1YXqtp7+dR5Noq5WgC8MaNrk93JJYbdYrrbXho/65DeEYdW4TvvW9j2JLGjmTULKsMeEnNmbLvDXkcczKlA62hl3zSBZAnhEQ4Z4aL90CrfGW88Ukf+RZ1E/o7YQ2NGRbLTXpl8i/O7OxuCuYpl+UE0M7NuEHgyAiOQJ2dvfN+OwAhkO8SzwZMRGIE8OXvj+3YERiDbIZ4NnozACETP3noj1rkd28GNk33bEe9bbWYE8k2JOTnWk317K5l3bD4C2YHqWTbZHVCzxxYt2+dyRpAXeavxjKDKTokHJVgWeCiobHsvd6O359mXaUx7KC5ovr5WIMykoGAj69iEZtsbgSBZzK3pihrhMlS0rL8P8u6use4vP5OwPptAQWXby6X+/tUoLqhnbHvavt09tghEOlp10ptHGTbXiq0JHBkDkS5S9RUl2l3rNLIgGFn+3WHPw6bjexpz5AySdegdArG6SpTkKzZLMEgbRqsVYgsd1664kNx4/iHPW4VTw5Ztj7VHWhgrwJkEo4mxRLKrKrPtZuxl8EMItMueLAbVMdorJig/IsJm8I9stX7XPndHDEaJvlMg2e4Rxcewx05wx571bDVOtr0dZ5Aox/DvO0YsdKyBnXQWVpMc+YiOQ5GdqJCgGOwQCLq3NWKxYvNGuF17wLFbDpxKvDWwU308za+OuN5R3dn+wmJADzynJTg6JHarjJz5O/ZOxI5NOLY9dtHLnOHCScF7D9IhymtjJvE0e2FwQenQgKzGvDvWql8rbh0bGolZ9thcuUUgjOBPrKbsanXZOzlWdsVn25MCYXCvNVatDx/lDC2qMTQIkBAYgZCAHDOficAI5DPzOlGREBiBkIAcM5+JwAjkM/M6UZEQGIGQgBwzn4nAXQLZcTX4tIxY36d14mBfL3d8ke9c2Dl/S6wjkC4l8OfZAmG+6MSj8FeyY9TeM11/dgt3s1/zVp1iV5M1TTtts4izww5KRjY+77CHxkrHeYdAMq/6q4JjCkRLeIcEd9qThNDw7MSiEe4d9jLdkso/lKAZUKgOAiUh4xua8I7Ndwkk+jLbE88LFwYXKucED2uLS56vVP4xQAE4/NeSCojWHgxbdxIaxTvqkBkBy7UV0nn+nGYP4SOMH9KSGSTUDlsVssjg4UAd1L5FIBYE2TxEFfrd9m4TyNV2mSRk3kCwhOsJJDN6yCKwEqXja9e/zPyeIde6NisKrSOx7EUxpHIRza1dp71q0wH15RdbuNKfin0P/HfZq+zrkex0e6hAIP6hhx3I2I9nkShSCjaiZdiIRFYhgvfMu+xV9v1UgaR5s6ODaE54B8WM+FZSV8Yfq7Uzbngi8KPfrfOVFSdqbwTyH7IoXn/lwRor1rNCybDINuMgLDtTVlgZcXjnCa26ohihZGXaQ/eMRpMsJu+y5xWadFH1XhRqh8wqKTtJ2nnIjOJBiIqskeTyErXTnkfaCAsthhPteX6iMf7GpQkkbQQoFSyBMHzL+hKtj363Klo03qKxIvt758J1WgBS+c+4Yj2D+i/HH4a98kglN88EgYI36waBj0FgBPIxqZxAdiAwAtmB6tj8GARGIB+TyglkBwIjkB2ojs2PQWAE8jGpPDKQzJX1kQEgAlmvEZErxUygjwcwE+zBa3fkmP3+6i3wvVMgJwK4gyisO/ldxWl9Fyb/d4aU0r9dWGZ8aq9FBNLexDBwIoA7fGIVgp0CYeTYEshqO/rmDfED5SxlOvE+NdGcRZxD3tpaQCD2ERBPWsMS3dMEgnbOLF9Qjlh20ef/cOgkgaCOP40olQ7CJs3p9pCCVs17SyhPI6UMFvXfSsBd9rLt/nRCs/2LBJLFD8k3xB1oEelv761OV6pBqxIoiJ1uT7pcwcwj3un2OnxhCQr6V73QNvuJuGJPe6Zi5wL9dHvSzx03TYyzkWWjKj7tuUqeacUP6SDVYKM2h+wdHfS64EkfTrBnVU6NjNc5MhpRUMGdYk87H6N80fCT+MC2ooUVwiBtPZOISKBZH0+3Z3U56XcUhzWiSfJdHHi3PS3u688iniIFIsuT31usqNJnyMwWBxJ41GVQG1bleUdyvBFQEhrJz+n2IjFnclgSgrUB8uKmSxA5D3btPVXQaOKsdd587mF6uj12PmnnD1l5NMMdMrPtIVUkOyZENt9hz9qzKxDrvLX+ORIv2z9k6qjw0BIK0nF/fdLASRlwokMrZkTS+f0/BBDyZrA63V4mlmhteYqpKDNyZn4fBD4GgRHIx6RyAtmBwAhkB6pj82MQGIF8TConkB0IjEB2oDo2PwaBEcjHpHIC2YHACISPKvv6lO/hWIQRsASyO8lZ+95LnzXYEwSfjQ1O1iy8H4ERCB/zEUgOU7T4vayiBRC1Gdp7ikBWyE8n4Oof9bugHO8esxol8zECYX4ikvluB80oUyBMWy//0WSHlQsFA1yH+HW3T6Drf5ax8wTv7X3NywBME1tXgEywGLYy5GPsByd3WZjxMbLPtBXtdf2ewQ3xDz63Wl94ZtpZFKQURCbYTFW+/MgIOwITsSVtvJ7RYswUBs8vxKcoJ52RNcKswh3EJmoXtQXxBfkEOgO2tVZzGk00NeDEGIQmRIvZEwgS98kC8fiQLX6yQ0RcQ7CLbKS6UuZz92rwGgidQJl+WK2WtUcnTpnork+ekLPFICpazLh3nEHgbq4JZMfNVqeD7CaKJB6DiHAC0HK36aBajfVTBBIK+VqAJrQCqHUGyVatVGtsEK8SIzpmJdz6aynLp7uLTTXenX6iXP/jw3qgzAQTKk+Z9TPdaseci5yPkLhQnJik7tiKqr0WTxWHip8Z/7p+WSO1mdOqQLzqzxynormZldxKYiOhVG2ihEHJgtpDyYPYQ31bzxcRntmJg3LRkQkEHXFSLQxBRVlDCX6xWyXzjk6HEDBLliLM6mOIfxVesbGUfpZ8Kj3ERHtsDQInIzACOTk749vbERiBvD0F48DJCIxATs7O+PZ2BEYgb0/BOHAyAiOQk7Mzvr0dgRHI21MwDpyMwAjk5Ozs923H+5/9Xt+4w/omXRMLE8CqrepzN8L42K0G2yB1uwWyJqCajOpzVujIm+Dr2Xd02Dv962CL+Ingh9h5Wz5GIH4FYSUYsXN5soMwGZsvPxB/EZssOxmBUD91+maBeMnLVFYWUaRAWP697CI+rqUCIbZXWjL4IfNpxp4Wq4wHtvcJAoGD/ckEsh5ZgxA6Ywexl1mjEU/6U/Evskut4ImcSb88P+C4RyB6/YIBDP6mX8YOUkllN8hW+jsFgvqW6W6oTaS7QaOkJ5BuJZDPa2RBCOStqfjY3RMl8kpmRmK73UPzB8ECibdj510CgXKCCAQypKAYVSuU3Bb46PNW62XO+NHYgZAMWVON2RJXh9irvyw7u3FM42eRJG1IRKY9v4KYsW8J7doyK+A7KlYmPkQYndEqEy+CKdsebRwKgCzlxHs5CM1oTueQz2vAIuT2EoI87x3eInJ27Veej/zN2mQTmm3P6xqIYFGBlWytYMvAs4mIZuSq/aqwLOCQcQBZ07EfCVN2jFJygU06cQLm00sYuaYWVEsgVXGkEZkHTARKI0ESz5MFUuVgtRCr0FWdSOZhlh+KwGkCOQ6mEchxKRmHTkJgBHJSNsaX4xAYgRyXknHoJARGICdlY3w5DoERyHEpGYdOQgAViPYWHH32pHhRX9jxfps9FOfj10Wfmly/sxN8OjCseLU7ecbVKsu/Kw9se6fnF/YPFQhscBb+hQBDDAPpGxFYv+ZF3Xj6aJX9lqgTb0cgiJ+Ib4idK/eIPZQnH7Fut0A6BNEAZtjLEOblA0Kad9lk+4bY+wjio0GsAonAqZCz8oznO8MeagNd9/J3h0B247Daz8SKcuud62jx7BAIQpZIjF738IBH7KLgoes8olVsRJ1zxReJFyEqy09krzvW0DDKAIyCuEMgiE10HEIThMb7LoGguUOxq+JXwQnNQWcdxa8KyOgz6+ihXRejwVvVgAKA4US1AkmfWD527OwUiLSd4cYFfca/NV3IXh3c/uyFbKIRHSG3RrKKw9YzFVuI39V4WQUhGrHQGNB1HRxHIOIAigrKIlknGTLhTFvamIQWkEoF9HBk2/OEUu2U3liJCvOudS2eZBKFikOrKoxK0yExkoyqj2xCs+15Hen6Dc0tguNpa+gC0RKUAdAbrdCqbIFcJTFaRdmEaSVnA9O6ud3g0tkmNeIz2u6uqHcQbme8O/ztYLsz1o5fxz6b6QzHBnGwY6cJ5GCoznRtBHJmXsarQxAYgRySiHHjTARGIGfmZbw6BIERyCGJGDfORGAEcmZexqtDEHiCQCovztD3LezPWDR7jJus1UbWXgU/hBdZPxDKezYz+1ViVjmjfUSYcUQLGnUOScLLPmpP+oLYt4hXxeBTBIIUGITMSE6i/FY+dI1sWmL9hzNPEAhSeaSQMuK4yNCp0tb+UaI6fiIkXv2Se1W7JxKTtSZ6MY3m+lpn4YeIF8Ee/po367i3vlqdEZsoaTTiaAJBKuC1xusecMVSFkZ2o0RnhRDlJyMQtPrLPZFceLlGn1/hVnGMwGUKwyNSZ581YWg82jNR4pGErGukPdS3FQsvNjRutkCsPHodGKnoFnaVKYcukKhqdAgsn2XuhZLEIl0UF1IBNSF0xCYJmBUmindWOJHdrkCiEdCz7/kW8c39XRIgM6JE5LJ+jxxG7VbEsY5W3tjjtXwrGdefvzBFKpjXUbwOZxHJyl1WCGh+kLEoU2B2CyTiVThiocBEG0W/s/bp2mElOBods35awkfGFOYhOBoJWfh5xUAbu2QB0viGFCj5XCiQtbpG4EQi8H7PEmZXJ0ITjHaqqFJrcXiEXn9DffDIks1ZxAEUP4RXSMd+64gVVcEsuJ8okCxhtLMEVLUU8CLxIeNa5H+GA9EIiBB+DXO1t/65dQSIiuy2DoKovSuWKDjUftdOpgIiPnVIjBQU7YyBdJYsTsh6bY1X4TM217OcJdrI3ghEHIQRAss12SoX7bFDIAwBRGSKcIlmfI3EFWy1LmId8r2YMt0txAZtuxE5Mr+HToHGunbQJKL77BSIdR5BRjbUf3TEskSLVG2Lb9KmZatyK5a1/RemTxSIrDTVGCyBWPqM9mEKRKumSN1AD/2WrWrHskiYEfA6QiLjmjZyakeEqBC6BSRKOpKUu9cgSUR80oCxiIngdKdAoncG2gG4E0NkL9ulMvYigkcjYvT8xwkEIf+sGQQoCCBVhbLRGBkEnojACOSJWRufb0NgBHIb1LPRExEYgTwxa+PzbQho9+vonbt1zeZdtXmBZcXauTnR/GDYY18dR35mfPbWZuys+ZX+WbdrHleqfLFsWlfE3tWxycv1y0gt2Og+Pnrxo31LYzkT2apUDe+9wKn2Ir9KiQY/wY8If/3uXYdXrsqzheXyI3rvg4jFxRsVSObe3asIUUBexYyIo/1+ikCy3dGLNbrXjzD0co4KBPHPI7F8PhtT1PEikUa///qHjlhWJ4iqPrODZEjGHCc0wa8JjqrUaR2zUqQsQntTB5ovSdaugKOpxxP3Pz53BBKJY60gLMIiwaOJWYmfAk0sfqJAEBytGd/DLSI30tEjGyv8iL2oQIVv0pF5skM6NGBkDySxiJ1olo6SkO0gGZ+QUTIaMTT/tIIV7RUVQTkhRLmu2JO5QrCMRij4HIeeQSIVojNlp1JHyez+niFdViBZ/KJYKr6yurg2ckZdNCJ1dEhfeSr/t8c9xC+4g2SrAdKCI2AiImQqvTYPR/bhSuIYipKQLQpRl4wIYu2n+RnhE1V8DfMKpmvMWtE+QiBesFIMUQWrJAMRXJTQzGgkK6FHTE/oGYEgBePbBMI+pCMjmYaxmpvsiCXXRxUmmkm7VV9r9xkRoUK+UyDW+Kb9uVdUumMvGrPnV1RI1/ytsURF4tqzckiXk5Jn669/9agWjKduFEAEJJTUshV3BGK1daTKWyS2BJcZERCBVOK25nwZL5Ivaw26hydeLceZeCNxrfFae/36l+0g6AgTOWkJIiKnJ+LoWSspV+VCiBEJ2SMI3NaXTTyfsv5avmVz4ZGKKRCvqESxI35A+UAFgo5WsmVGhMqMWJnKggKo+ZcVmlfxrS7ljUZRcfEuU9CujuQJGZ+jsS/Kw/W81nkZArEKOjw9aO3GakEomarBWqSRhLFGgqx/snMgYo7EY41Ya2xRW88KJNvVNYGhY5036lS7u0dWFAtLqFoB1vA3hZwVSKaTIHOmrBIaWa00RAAAEwtJREFUSSNCWdWwUwGzY4dXCTXho5U1Ei2CjeabRXTEnuV7VyBeZ8zkI/Ij+v2vvaKKGCVofh8EPhqBEchHp3eC6yIwAukiOM9/NAIjkI9O7wTXRWAE0kVwnv9oBLJvUZFbDgsw1s1NNyHW1WEWC3k7lPUrW5w6+EXXpdp1KBpPdA0f2UHiQtZYt3Xa/rA970VhFNhdCc4mV7tWXWPxBBLtpcUcPZO5ovQwh5OqGMn6mMmtZxuxgwgsEzvVXkUgUdDZZFz5jN5bRIJdf6+8UUawiGLXhJh55vU8G7/VJvreK+uz1U1RO3IyQTBAcrwWy8imas96q7oqNqPeHQnO7I+slWusZxBb1TELTS67KKD2UGKj9rLrIjJHU4I3VqU6ekYgmmEEyAzRWvMi+B/V8QQSJYbV5RDcIvExbKTIkhjdKr5F2FpclW4hfEPW/LGLjBWe+hEgYGeMjTLPI2t3CoQ9wlQFi5BGwwrBDz3PSYFHAtBGbTl6WeOi55N3bgz5mxHIujY0vHgcJTlql5mkIWstf6IEMsciBD9rLpc5y9pCxh3EZjTGZPzUhJA5O1kFIdsE/olb/kFUVRACIhVGBsQkHyo4zYdIzJGIEPJF/lmVFz07RcRFfIwEouHkFdvInkfw7gSzCi2KXRVIRIq19VUFEhHrHQLRZtoIi0wcUbHxkoWMFlbVjUiAjj6ofxo/1mdRcax4RXnQxjFLZEgTMGPdPWJFgop+R2ZOrWMhgtME4lXfSBwoMaMOUhk3PJso2TJdXYrMG2UqAkG7KCLidf90UbEeXgHXlI0EjThzokCyo0yFgKiAI9vIuTCyYZEsynHU5ZD8R8Utm4usvbAAyyqqVZGuQFAyWIlCRJQZGyLQZWLR/a25PNNZZMIiciMC0UhTFYXVOaKKX+mangBZ9la8VZu7BIJWD4R8yJqKQLyRolsUugSsjHqRED3ho/mKCKXlCrHtPVc5Q0T2rMLjHtJlNZJG0GqVAeRKKtJlIgKsv1fsac9UYtHGU833aISRz2QKhdc1rLOXlm9UqNGznu/ZThHlJLLn8agsEPRAG850P95FQWbGAgb5OuNdRA5tLIlGBJSYSNGwsK5We883VlxRMUAE552vpZ+mvWwVQxIyawaBj0FgBPIxqZxAdiAwAtmB6tj8GARGIB+TyglkBwIjkB2ojs2PQcC6upWn+uifrStJCyjthiH7KUfGRvdW7HoeLSjWrUh0O7PeAmZIhvgV3Vp1bwOR2LyYUP+QWFcco9us1Sf3mnclQfelkvUiRjqDXPcithAhXmvY9iqkrryn8cjFtucVhCp+EbFRgbx8i2xRBSITrL3zWJ3PVgpLbK5yFTZYXSxLHCsWL8Yo5gxpouRGe2ndsCsQ+TzyniHT4TxSW9hp0w2CTcaeLJpqB8kGGq3XiCYB8jqUZl/rNFVCR2SuJsYjLpLYTofLiM7KT3fEinhh/Z4hNIJjxh4kEGtThEgRmbOtOjqHaL9H4pE+RnHJ9dY5rUPoLC4R+e4WSAXDKAaPS3KqQccsK/dwx1yTL5MWgYC29e46TQAaOSOSRELRkqCJJbKTIYIneCSeTkVd/YQJ8/NQxA0Et6jAWIUpihnpIFaOzBErU4WrDiLEiTqEF1jklzYCed2iMnJ4yUHif63Jki+qphV7XodD40DXMTBj5FbFEa3uGbJkZtzLqYjc1SRXBFc5g1T8i8ZJlGCRQDTyIN3Ss5uNF+mGlc6cteudW1W81w0kSSMQUOc08keCsMCS5K34iDxjYVERHNzOxfiC4IvgGMWrCSGyi9j0Rjik4iMFIpMPizsuzohAds+nCJCW8tMVQfzL5aJuJ89oSEIiYrPJF3WQLJmRfCDkRdcgZwaPp2jn8YqrmTNEINUKiAKEJCQSSGUEZPr3spUl4t0jlvRPih/FMBvnZTeKV459WnFa9+7Y0/ZyRyxt4wiIqFJeG75rxIoAPFUgEre1Q0Tdx4oJrdKI/YgX1YJqkVbbz+MeclTQzmCqTU9JFlgIiF6S12pbEVnUTSKbyPOZM4hXCDSyIPhZlRKpoN6e8rfK2IH4r50xooJ1l0BSRwZvxvYqf3butZzSEoYmeNeIIEmDCjpbWSPCWBh73SASpHfmQqtqNk50xIo6upZvDcPIP4+L/9jTyICMRhmBZIJASLMCngUDOSucIhBkjGCd3zJVNcK8OmJ5Aln9i7po5J/HR1UgkXLn90HgaxGI5vWvBWYCHwSiMWkQGgS+HoHpIF9PgQEAPfwMUoPAICAQ0G4HtOs+Dbio+0TXxBWb1pVr9m4+ug7NEiXaP/pd7hetj35f7SEvCau50PaJeIFga72rQp611mQw+7XREUh0hmEJJLq2swDJXpN2Oi0r1ssH5G2w9DdzRX7lzsM2ay8ib0Y4XYFkOWP65r1sk53EExNasSwCeOBmg11tsZIcJVe7m4/8RgXs5SgTq5ZPT9gs7C4fK/ai2Cs2U90ycsBKgNeudrd0JKmVdlp5xhsxLHvoPgjGkXDXkVTrOJUOQh1hgo88I35m4vcKvlmg0SomqwCaZGu2zoxFUSXOjkZVe1EysmNRxh7qs2bT8mslHzodyAkgGqui7oGILcs1FCtoRI1GLG0zC9gIPPbIFiWH1X67Sc4Ug4gwlZh3dPQsCdFikOlyt+Q3amErOdCDUzUh18ExIgF7xPIqbOSLNcJERSR75vLsRRW2mo+I1NZ0kH2uOgZW9kHy+dcaZMSSa7QDKbpxVHm8EQHdY10XVRmNeGgh8DpmpvAgYyhiD4kVwbAquMh2htDZHCAYZkfxP+ujEUszWgUwA9C6bySqSuBeAjrJ0Z6t+CfFJ8dTbRSJxjNUZNX8dgUSjfOa/agoRD6tE5K6FhVIBBpCaDRByPiBHEYjwsgCoZ2Rst0SFReKJ3Lwj8a5jGgjW1qeI5JGhdErgBFnWHubPnojxqouSRQvwd5MH3UDFEyGQCT4mkDW+TjyTa6NYr0EihaEqr3ozFY9gyH+ZGJc16KFBimCSBdpC8RKPkJUJFikoqIJiZIS+cMgTFT5wtYu3g/IQhbFYFX6CMNKB4kIiBQWawLJ+INMMZavLYFohOt2EOlQJJAosZn5VM73Mr7IF20va36OyJOpgCtmGR9PH7E8cWQ7uMxtJM4Qx+gMYiUeEYhMPlJVvY4UdYaI+GgikOqOVDxEHEi8meIQdXQ5KntjIUquKM7IzuqDhn1IYsWBDGYuryKBWM6/QyAI0GgF8eZyVIjeXmiCIkJrovcIGdlDzyMIBp0YZQyacNFcoh09i9uf9RnSRZVifh8EPg6BEcjHpXQCYiIwAmGiObY+DoERyMeldAJiInCnQKxDXdWHb7CHHoQlJ7Qr4SxvsnlhX3Vn/c1eaECHdvn2GHUqAx6aZNTmt9hD49RyxhBI5hLH8xXN62s/63Y0c9Xbwe3C8tfn3QKRzlovCP9xzFDqt9jzrj29IhZd46IFMLs/Y1+U2JHgMmKSePzzrBRI9LY2s3kGZGQtskZrsxagp9rL+BUm2KnKkVgyfqy8eP3v9f1aROi1c0Q+IYU0w9EQv10dpPLiB3lmbfvRzFu1ZxWNu+x1qjH6rFWtrQ4fkbwjkMiX6PeQ5EaRgLDaLZDsSGWp3wsGOaAiiZd7QAD+bI6sRdZYczhaFbN7oOeXKI9aZUeJLdchHd87H2UxcKemHSMWWmm1ILVnLXsZQludJ0q897tWXDywI5Fnc6GRm0qOoPKi4orWZYoCUiioGOzoIGgXYK1bE6BVH0RI2tnFqlLvsIcQo0u0DrHQswNaJKJYsh2k7N+nCcTrSl6FXgGMyPhJAomqeySaCCtJ9Mielgc5vkV7Rr97YvnnWe/wVd0o6gzemUGrHJE9xqizq4NYldATZIZEEkv02ez5ILrdLFdo4N1HVyAej8Nit17HoUFqB7KoAlsJ0WyFTv88lCUD0kGkn92R7XSBZIvLGg/afTLr0NuyzIi15lQT+mpL7SAReS3hILcNESktMWhOS1A8v73ER4Ahh2XEP9mVPLG5SQL+9ZzeXtVC4okb6UDIGgSjqPhmuigq1t9cWa1zBdX635lZLjsmZa5lvZEN3Rcd7TL2kORnyZtOcOcdQOIlo+TIOplEXUF2pUzh1fCIcrQ+E/Jst0C8VmgpX3vGqvqISJ9mr3r2syo+215Eytd+WYFoo5t1gRQJjhqvNYp47RF1IENqZC2yRlZtZFZFRIzsjaxB/EPxjYiKdDCvwHgjVmasiQitiSPya8flkhovMm/LapBJYHTojX73ukzUGbLEP8VeBl82URF7njCjEdAivncWXfOCYOOdTSPhXb+rZxD04ew61GGk0mSqzVPtoXh5ebBua7K5+4cwjgHNbzQHVb+yYkX3uVUg2lixOloFMXNLggBzir2nCgTB+HFrquR8XKDj8CBQQWAEUkFtnvkaBNYDeCfonTMve+ToxDnP/u+vxVaxsN49sOxV7ajPjUD+hgW5JaEm4M3GMlfT0VkSDeWxAqmMW+ibYBS8O+x5vpwskB2+Za/ZX9hV/bCeY9tbfUR591qn8r/yxnPd9A5CVwH0kplNVseHTJK0tczbNW9cRQtkFYss5hFukb3oee33fzDQBOIBYL3QsT5ZyTp5h+BkhYmIURlDvHEk2i87yjDtIbYy/IiKqVXEkKKACgR56375mRLI+pDVilFCM9dZhNX+PJPMTIyI8DvV2nsWqnxiUSTy6HeE6NH4FRFa++zJizWytz6riUTDGBKIrGDeGIYQv0toq2vJuTErEC3pMiFIRbXE4mFjzrzBp+2eMJFKeeVSdvzMqJ0pOoiwkKlEE18kEHkBZd20urFngPHmY2/EygCKCA6p3prIIyKvpM1U1Ggksm5tLEJnu4c5HiwBeznIYFXtEt5zkW/Zzh4V1FQhvUMgXUJHAHr2kSreqURZcUQEk7+vviH/G8VCkiSDcabgVTqI19mRs26Uc62gmDEh45M3y91R8TPJkwSJwELi91r1SmitA3mzb3Z8Y+BgjXaZjvkOgWRwjAqehkFaIF6bj1SMABglCt1Dq5jRs5aIqiOWlxBrvELGIkTsSHe2yP/6c28uj0ZSlsCrwo+EkPEvJRAPUJnYbAeJKhVqryNgLfGWPQTkSoIjHDwfEZ+Q0aa6B1IAGRU/GkffLhAkSJTQSKWzAKkQUJ4NEFJJkSDPyBELjdMbW++s3NkLhCppvefuFFwa2288pGfFgwjU62hWUlABav4iPsnnrLG2uq7jf7XDIc9VcmGOvN8qkGiMrMzmle6ReUZLPErSDGkimxlxZggd7Zs5k2XiNcVxVZSKMemsRagMAayxg+1fpd1XSVGNPxoFom6gPY/giJAUsePFHV1cZDFDfM7a/F0vrzCrhp4mkIiAW0GvgnzIc18nkENwHzcGgfMQmEp5Xk7Go4MQGIEclIxx5TwERiDn5WQ8OgiBEchByRhXzkPgEkh0M3GSkE65cj0vm+/ziJmT6hcNV/QZX8K1mWverkhCZ4D8dsFbt4heFlbeNcgkXf/Mwq7jExI7kIJ/ljBz8jLetWflVToOrUPepJ9E7C54FoEv4nXeVnu2u8Rmxc0goCW09c87BYERa0T+6PffWO4QiDW+ZUHcbcernhlfWX56Fa8qOAb5okLQ7ZosHykTwm6BsM42LDtaBUXGihME0q3+LOJlMMzgtmM8lSKBO8eq8miEin63CBaROlNpIluZRES2tHgi+14itPHNs5f1L/ItQ2gkJ2z/JL8sITN5iGD2B4tdHYQJImoLDRq1h87U1rllTWjmbHOHf1HXRAWsXfLIP4vywiwuSLGO/PnLxg6BVBLszdSovUzgqE1k1s/YQkRXsYcSOhJGpoNYrwjkn0d5ycYb2YvObkhOtx7SswFnkmIlmAFa1TY73qw9JPYdNplnBtQ/JNY1j9QzSFRdUOfYIwcyQ6O+WeBVxWH5JjtzZsTy8mDN51HuND8rmGn7dHzK5CPrrxSHJujQpjZDdsjiOeEdxkJHnX/jIPIsMpvKNRm7WjK68UajQsY/ZrXf4ZflHzJdRKLVcLLE848t65DFrji7qkyFJFGCUzOqoTxWvDuIfbJvDN6h5IfW7eogSOuskJud3FLbDeYZa56uxLvDP0nCjl8MQnsdoOKb7NzIyGruY91EdMYNRBzV1rkmpAJeBFbXZnTY7NoPtDk/sxGYhLERHXsfhcAI5KPSOcGwERiBsBEdex+FwAjko9I5wbARyNxiWXuPyNhZGXvHIDACOSYV48iJCIxATszK+HQMAiOQY1IxjpyIgCUQ61zB+ujuRCzGp0HgHwS8b7EsuHZ97jHpGQSOQ6DyseII5Lg0jkO7EEDOIHLcGoHsysbYPQ6BSCCROF4BzXuQ49I6DrEQQAXifaU6AmFlY+wch0AkEMThEQiC0qx5JAKRQJC/LzICeWTqx2kEgREIgtKs+VoEIoEgwEwHQVCaNY9EYATyyLSN03chMAK5C+nZ55EIjEAembZx+i4E5vxwF9KzzyMRGIE8Mm3j9F0I/H98o9B9xXBkdwAAAABJRU5ErkJggg== width=20 height=20 diff --git a/Source/gfx/gfx_dialog_top.png b/Source/gfx/gfx_dialog_top.png deleted file mode 100644 index 5c28299..0000000 Binary files a/Source/gfx/gfx_dialog_top.png and /dev/null differ diff --git a/Source/gfx/gfx_player_dpadhint_default.png b/Source/gfx/gfx_player_dpadhint_default.png deleted file mode 100644 index 3f94e86..0000000 Binary files a/Source/gfx/gfx_player_dpadhint_default.png and /dev/null differ diff --git a/Source/gfx/gfx_player_dpadhint_downpressed.png b/Source/gfx/gfx_player_dpadhint_downpressed.png deleted file mode 100644 index ef76562..0000000 Binary files a/Source/gfx/gfx_player_dpadhint_downpressed.png and /dev/null differ diff --git a/Source/gfx/gfx_player_dpadhint_leftpressed.png b/Source/gfx/gfx_player_dpadhint_leftpressed.png deleted file mode 100644 index ffb139a..0000000 Binary files a/Source/gfx/gfx_player_dpadhint_leftpressed.png and /dev/null differ diff --git a/Source/gfx/gfx_player_dpadhint_pause.png b/Source/gfx/gfx_player_dpadhint_pause.png deleted file mode 100644 index 3f89bfe..0000000 Binary files a/Source/gfx/gfx_player_dpadhint_pause.png and /dev/null differ diff --git a/Source/gfx/gfx_player_dpadhint_rightpressed.png b/Source/gfx/gfx_player_dpadhint_rightpressed.png deleted file mode 100644 index 6f23bb1..0000000 Binary files a/Source/gfx/gfx_player_dpadhint_rightpressed.png and /dev/null differ diff --git a/Source/gfx/icon_layer.png b/Source/gfx/icon_layer.png deleted file mode 100644 index 9d52a82..0000000 Binary files a/Source/gfx/icon_layer.png and /dev/null differ diff --git a/Source/gfx/icon_page_next.png b/Source/gfx/icon_page_next.png new file mode 100644 index 0000000..267ded1 Binary files /dev/null and b/Source/gfx/icon_page_next.png differ diff --git a/Source/gfx/qr_rickastley.png b/Source/gfx/qr_rickastley.png deleted file mode 100644 index 05bd22d..0000000 Binary files a/Source/gfx/qr_rickastley.png and /dev/null differ diff --git a/Source/gfx/shape_button_cap_left.png b/Source/gfx/shape_button_cap_left.png deleted file mode 100644 index e7e8a59..0000000 Binary files a/Source/gfx/shape_button_cap_left.png and /dev/null differ diff --git a/Source/gfx/shape_button_cap_right.png b/Source/gfx/shape_button_cap_right.png deleted file mode 100644 index ee63604..0000000 Binary files a/Source/gfx/shape_button_cap_right.png and /dev/null differ diff --git a/Source/gfx/shape_button_cap_topleft_selected.png b/Source/gfx/shape_button_cap_topleft_selected.png index 81b990b..b972834 100644 Binary files a/Source/gfx/shape_button_cap_topleft_selected.png and b/Source/gfx/shape_button_cap_topleft_selected.png differ diff --git a/Source/gfx/shape_button_default_selected.png b/Source/gfx/shape_button_default_selected.png index ae74085..025399d 100644 Binary files a/Source/gfx/shape_button_default_selected.png and b/Source/gfx/shape_button_default_selected.png differ diff --git a/Source/gfx/shape_button_folderselect_selected.png b/Source/gfx/shape_button_folderselect_selected.png index 1ea3592..e23f2f4 100644 Binary files a/Source/gfx/shape_button_folderselect_selected.png and b/Source/gfx/shape_button_folderselect_selected.png differ diff --git a/Source/main.lua b/Source/main.lua index 49d8f63..248c353 100644 --- a/Source/main.lua +++ b/Source/main.lua @@ -45,6 +45,7 @@ import './components/DitherSwatch' import './components/Scrollbar' import './components/KeyValList' import './components/TextView' +import './components/PageArrow' import './scenes/ScreenBase' diff --git a/Source/noteFs.lua b/Source/noteFs.lua index 083ee65..5e5d1ce 100644 --- a/Source/noteFs.lua +++ b/Source/noteFs.lua @@ -240,7 +240,7 @@ function noteFs:setWorkingFolder(folderPath) end end numNotes = #noteList - self.hasNotes = numNotes > 1 + self.hasNotes = numNotes > 0 self.numPages = math.ceil(numNotes / notesPerPage) end diff --git a/Source/pdxinfo b/Source/pdxinfo index ea5fe34..8e763bc 100644 --- a/Source/pdxinfo +++ b/Source/pdxinfo @@ -2,6 +2,6 @@ name=Playnote Studio author=James Daniel description=Flipnote Studio animation player for the Playdate bundleID=com.jaames.playnote -version=1.0.1 -buildNumber=2 +version=1.1 +buildNumber=3 imagePath=gfx/launcher \ No newline at end of file diff --git a/Source/samplememo/19_pekira4.ppm b/Source/samplememo/17_pekira4.ppm similarity index 100% rename from Source/samplememo/19_pekira4.ppm rename to Source/samplememo/17_pekira4.ppm diff --git a/Source/samplememo/20_pekira6.ppm b/Source/samplememo/19_pekira6.ppm similarity index 100% rename from Source/samplememo/20_pekira6.ppm rename to Source/samplememo/19_pekira6.ppm diff --git a/Source/samplememo/17_pekira2.ppm b/Source/samplememo/20_pekira2.ppm similarity index 100% rename from Source/samplememo/17_pekira2.ppm rename to Source/samplememo/20_pekira2.ppm diff --git a/Source/samplememo/22_scarecrow1.ppm b/Source/samplememo/22_scarecrow1.ppm deleted file mode 100644 index 0c0e5cc..0000000 Binary files a/Source/samplememo/22_scarecrow1.ppm and /dev/null differ diff --git a/Source/samplememo/22_scarecrow4.ppm b/Source/samplememo/22_scarecrow4.ppm new file mode 100644 index 0000000..6182588 Binary files /dev/null and b/Source/samplememo/22_scarecrow4.ppm differ diff --git a/Source/samplememo/playnote.json b/Source/samplememo/playnote.json index 7ed5235..f805384 100644 --- a/Source/samplememo/playnote.json +++ b/Source/samplememo/playnote.json @@ -86,29 +86,29 @@ "authorId": "pekira" }, { - "filename": "17_pekira2.ppm", + "filename": "17_pekira4.ppm", "authorId": "pekira", - "dithering": [[1, 3, 1], [1, 3, 1]] + "dithering": [[1, 4, 1], [1, 4, 1]] }, { "filename": "18_pekira3.ppm", "authorId": "pekira" }, { - "filename": "19_pekira4.ppm", - "authorId": "pekira", - "dithering": [[1, 4, 1], [1, 4, 1]] + "filename": "19_pekira6.ppm", + "authorId": "pekira" }, { - "filename": "20_pekira6.ppm", - "authorId": "pekira" + "filename": "20_pekira2.ppm", + "authorId": "pekira", + "dithering": [[1, 3, 1], [1, 3, 1]] }, { "filename": "21_pekira7.ppm", "authorId": "pekira" }, { - "filename": "22_scarecrow1.ppm", + "filename": "22_scarecrow4.ppm", "authorId": "scarecrow" }, { diff --git a/Source/scenes/Dithering.lua b/Source/scenes/Dithering.lua index 07ffe1f..289e084 100644 --- a/Source/scenes/Dithering.lua +++ b/Source/scenes/Dithering.lua @@ -91,6 +91,7 @@ function DitheringScreen:drawBg(x, y, w, h) gfx.fillRoundRect(RECT_LABELS, 6) gfx.setImageDrawMode(gfx.kDrawModeFillWhite) + gfx.setFontTracking(2) gfx.drawTextAligned(locales:getText('DITHER_COLOUR_BLACK'), COL_BLACK, ROW_LABELS, kTextAlignment.center) gfx.drawTextAligned(locales:getText('DITHER_COLOUR_RED'), COL_RED, ROW_LABELS, kTextAlignment.center) gfx.drawTextAligned(locales:getText('DITHER_COLOUR_BLUE'), COL_BLUE, ROW_LABELS, kTextAlignment.center) diff --git a/Source/scenes/Home.lua b/Source/scenes/Home.lua index 0985e00..181b224 100644 --- a/Source/scenes/Home.lua +++ b/Source/scenes/Home.lua @@ -9,7 +9,7 @@ function HomeScreen:init() end function HomeScreen:setupSprites() - local viewButton = Button(PLAYDATE_W / 2, PLAYDATE_H - 60, 196, 44, '%HOME_VIEW%') + local viewButton = Button(PLAYDATE_W / 2, PLAYDATE_H - 60, 196, 48, '%HOME_VIEW%') viewButton.autoWidth = true viewButton:setIcon('./gfx/icon_view') viewButton:setAnchor('center', 'top') @@ -18,7 +18,7 @@ function HomeScreen:setupSprites() end) self.viewButton = viewButton - local settingsButton = Button(PLAYDATE_W + 6, -6, 128, 42, '%HOME_SETTINGS%') + local settingsButton = Button(PLAYDATE_W + 6, -8, 128, 44, '%HOME_SETTINGS%') settingsButton.variant = 'settings' settingsButton.autoWidth = true settingsButton:setIcon('./gfx/icon_settings') diff --git a/Source/scenes/NoteList.lua b/Source/scenes/NoteList.lua index aec76d2..cd6f778 100644 --- a/Source/scenes/NoteList.lua +++ b/Source/scenes/NoteList.lua @@ -19,11 +19,11 @@ function NoteListScreen:init() self.notesOnCurrPage = 0 self.currThumbs = {} self.prevThumbs = {} - self.hasPrevPage = false + self.pageTransitionEnabled = false self.hasNoNotes = false self.transitionDir = 1 - self.isTransitionActive = false + self.isPageTransitionActive = false self.transitionTimer = nil self.xOffset = 0 @@ -70,8 +70,11 @@ function NoteListScreen:setupSprites() self.noNoteDialog = NoNoteDialog(20, 52, PLAYDATE_W - 38, PLAYDATE_H - 72) + self.arrowPrev = PageArrow(22, PLAYDATE_H / 2 + 16, PageArrow.kTypePrev) + self.arrowNext = PageArrow(PLAYDATE_W - 22, PLAYDATE_H / 2 + 16, PageArrow.kTypeNext) + self.focus:setFocus(folderSelect, true) - return { folderSelect, counter, self.noNoteDialog } + return { folderSelect, counter, self.noNoteDialog, self.arrowPrev, self.arrowNext } end function NoteListScreen:setupMenuItems(menu) @@ -85,6 +88,12 @@ function NoteListScreen:setupMenuItems(menu) end function NoteListScreen:beforeEnter() + -- set initial arrow position + self.arrowPrevVisible = false + self.arrowNextVisible = false + self.arrowNext:offsetByX(50) + self.arrowPrev:offsetByX(-50) + -- set page self:setCurrentPage(self.currPage) -- update folderselect local folderSelect = self.folderSelect @@ -96,12 +105,14 @@ function NoteListScreen:beforeEnter() folderSelect:setValue(noteFs.workingFolder) -- if there's no notes to display, force the folder button to be selected if self.notesOnCurrPage == 0 then + self.arrowPrevVisible = false + self.arrowNextVisible = false self.hasNoNotes = true self.noNoteDialog.show = true self.focus:setFocus(self.folderSelect) end if not folderSelect.isSelected then - self:selectThumbAt(self.selectedCol, self.selectedRow) + self:selectThumbAt(self.selectedCol, self.selectedRow, true) end -- update counter counter:setTotal(noteFs.numPages) @@ -113,7 +124,7 @@ end function NoteListScreen:leave() self.noNoteDialog.show = false - self.hasPrevPage = false -- prevent initial page transition when returning to this screen + self.pageTransitionEnabled = false -- prevent initial page transition when returning to this screen end function NoteListScreen:afterLeave() @@ -125,9 +136,10 @@ function NoteListScreen:setCurrentFolder(folder) noteFs:setWorkingFolder(folder) self:removeThumbComponents(self.currThumbs) self:removeThumbComponents(self.prevThumbs) + if noteFs.hasNotes then self.hasNoNotes = false - self.hasPrevPage = false + self.pageTransitionEnabled = false self:setCurrentPage(1) self.noNoteDialog.show = false else @@ -137,6 +149,7 @@ function NoteListScreen:setCurrentFolder(folder) self.notesOnCurrPage = 0 self.currPage = 0 self.noNoteDialog.show = true + self:transitionPageArrows(true) self.focus:setFocus(self.folderSelect) end self.counter:setVisible(not self.hasNoNotes) @@ -145,7 +158,7 @@ end function NoteListScreen:setCurrentPage(pageIndex) -- navigation guard - if self.isTransitionActive or pageIndex < 1 or pageIndex > noteFs.numPages then + if self.isPageTransitionActive or pageIndex < 1 or pageIndex > noteFs.numPages then return end -- swap page @@ -156,8 +169,8 @@ function NoteListScreen:setCurrentPage(pageIndex) self:addThumbComponents(page, self.currThumbs) self.notesOnCurrPage = #page -- transition time! - if self.hasPrevPage then - self.isTransitionActive = true + if self.pageTransitionEnabled then + self.isPageTransitionActive = true self.focus.allowNavigation = false -- self.focus:setFocus(nil) @@ -166,6 +179,8 @@ function NoteListScreen:setCurrentPage(pageIndex) if transitionDir == -1 then self:setThumbComponentsOffset(self.currThumbs, -PLAYDATE_W) + elseif transitionDir == 1 then + self:setThumbComponentsOffset(self.currThumbs, PLAYDATE_W) end transitionTimer.updateCallback = function (timer) @@ -187,13 +202,63 @@ function NoteListScreen:setCurrentPage(pageIndex) -- BUGFIX: prevent glitches when redrawing the background, because the thumbnails move quickly, -- sometimes patches of the background wouldn't be covered by the thumbnail dirtyrects and will be left undrawn spritelib.addDirtyRect(GRID_X - 6, GRID_Y - 6, (GRID_COLS * (THUMB_W + GRID_GAP)), (GRID_ROWS * (THUMB_H + GRID_GAP))) - self.isTransitionActive = false + self.isPageTransitionActive = false self.focus.allowNavigation = true end end self.currPage = pageIndex self.counter:setValue(pageIndex) - self.hasPrevPage = true + self.pageTransitionEnabled = true + -- setup page arrow transitions + self:transitionPageArrows() +end + +function NoteListScreen:transitionPageArrows(forceHide) + local hasPrevPage = self.currPage ~= 1 + local hasNextPage = self.currPage ~= noteFs.numPages + -- hide next arrow + if self.arrowNextVisible and (forceHide or (not hasNextPage)) then + utils:createTransition(PAGE_TRANSITION_DUR, 0, 60, playdate.easingFunctions.inQuad, + function (x) + self.arrowNext:offsetByX(x) + end, + function () + self.arrowNextVisible = false + end + ) + -- show next arrow + elseif (not forceHide) and (not self.arrowNextVisible) and hasNextPage then + utils:createTransition(PAGE_TRANSITION_DUR, 60, 0, playdate.easingFunctions.outQuad, + function (x) + self.arrowNext:offsetByX(x) + end, + function () + self.arrowNextVisible = true + end + ) + end + + -- hide prev arrow + if self.arrowPrevVisible and (forceHide or (not hasPrevPage)) then + utils:createTransition(PAGE_TRANSITION_DUR, 0, -60, playdate.easingFunctions.inQuad, + function (x) + self.arrowPrev:offsetByX(x) + end, + function () + self.arrowPrevVisible = false + end + ) + -- show prev arrow + elseif (not forceHide) and (not self.arrowPrevVisible) and hasPrevPage then + utils:createTransition(PAGE_TRANSITION_DUR, -60, 0, playdate.easingFunctions.outQuad, + function (x) + self.arrowPrev:offsetByX(x) + end, + function () + self.arrowPrevVisible = true + end + ) + end end function NoteListScreen:addThumbComponents(tmbs, list) @@ -227,11 +292,11 @@ function NoteListScreen:setThumbComponentsOffset(list, xOffset) end end -function NoteListScreen:selectThumbAt(column, row) +function NoteListScreen:selectThumbAt(column, row, muteSfx) column = utils:clamp(GRID_COLS - 1, 0, column) row = utils:clamp(GRID_ROWS - 1, 0, row) local index = math.min((row * 4 + column) + 1, self.notesOnCurrPage) - self.focus:setFocus(self.currThumbs[index]) + self.focus:setFocus(self.currThumbs[index], muteSfx) end function NoteListScreen:drawBg() @@ -249,6 +314,11 @@ function NoteListScreen:updateTransitionIn(t, fromScreen) end self.folderSelect:offsetByY(playdate.easingFunctions.outQuad(t, -40, 40, 1)) self.counter:offsetByX(playdate.easingFunctions.outQuad(t, 50, -50, 1)) + if self.arrowPrevVisible then + self.arrowPrev:offsetByX(playdate.easingFunctions.outQuad(t, -50, 50, 1)) + elseif self.arrowNextVisible then + self.arrowNext:offsetByX(playdate.easingFunctions.outQuad(t, 50, -50, 1)) + end end function NoteListScreen:updateTransitionOut(t, toScreen) @@ -265,6 +335,11 @@ function NoteListScreen:updateTransitionOut(t, toScreen) end self.folderSelect:offsetByY(playdate.easingFunctions.inQuad(t, 0, -40, 1)) self.counter:offsetByX(playdate.easingFunctions.inQuad(t, 0, 50, 1)) + if self.arrowPrevVisible then + self.arrowPrev:offsetByX(playdate.easingFunctions.inQuad(t, 0, -50, 1)) + elseif self.arrowNextVisible then + self.arrowNext:offsetByX(playdate.easingFunctions.inQuad(t, 0, 50, 1)) + end end return NoteListScreen \ No newline at end of file diff --git a/Source/scenes/Player.lua b/Source/scenes/Player.lua index 517b29b..3fcb5d1 100644 --- a/Source/scenes/Player.lua +++ b/Source/scenes/Player.lua @@ -103,8 +103,10 @@ function PlayerScreen:beforeEnter() end function PlayerScreen:beforeLeave() - self:pause() - self.removeTimers() + if self.ppm then + self:pause(true) + self.removeTimers() + end end function PlayerScreen:afterLeave() @@ -113,19 +115,31 @@ function PlayerScreen:afterLeave() end function PlayerScreen:loadPpm() - local ppm = PpmPlayer.new(noteFs.currentNote, NOTE_X, NOTE_Y) - local ditherSetttings = noteFs:getNoteDitherSettings(noteFs.currentNote) - for layer = 1,2 do - for colour = 1,3 do - ppm:setLayerDither(layer, colour, ditherSetttings[layer][colour]) + local ppm = PpmPlayer.new(NOTE_X, NOTE_Y) + local openedSuccessfully = ppm:open(noteFs.currentNote) + + if openedSuccessfully then + self.ppm = ppm + local this = self + local ditherSetttings = noteFs:getNoteDitherSettings(noteFs.currentNote) + for layer = 1,2 do + for colour = 1,3 do + ppm:setLayerDither(layer, colour, ditherSetttings[layer][colour]) + end end + self:refreshControls() + ppm:setStoppedCallback(utils:newCallbackFn(function (a, b) + this:pause() + end)) + else + local err = stringUtils:escape(ppm:getError()) + -- display parser error then push back to previous screen + dialog:sequence({ + {type = dialog.kTypeAlert, delay = 100, message = err, callback = function () + sceneManager:pop() + end} + }) end - self.ppm = ppm - self:refreshControls() - local this = self - ppm:setStoppedCallback(utils:newCallbackFn(function (a, b) - this:pause() - end)) end function PlayerScreen:unloadPpm() @@ -230,11 +244,13 @@ function PlayerScreen:play() end end -function PlayerScreen:pause() +function PlayerScreen:pause(muteSfx) if self.isPlayTransitionActive then return end if self.ppm.isPlaying then self:refreshControls() - sounds:playSfx('pause') + if not muteSfx then + sounds:playSfx('pause') + end self.ppm:pause() self:setControlsVisible(true) playdate.setAutoLockDisabled(false) @@ -282,7 +298,7 @@ end function PlayerScreen:drawBg(x, y, w, h) grid:draw(x, y, w, h) -- draw frame here only if the transition is active - if not self.isFrameTransitionActive then + if self.ppm and not self.isFrameTransitionActive then -- only draw frame if clip rect overlaps it local _, _, iw, ih = fast_intersection(NOTE_X - 4, NOTE_Y - 4, NOTE_W + 8, NOTE_H + 8, x, y, w, h) if iw > 0 and ih > 0 then @@ -299,18 +315,21 @@ function PlayerScreen:drawBg(x, y, w, h) end function PlayerScreen:update() - if not self.ppm.isPlaying then - local frameChange = playdate.getCrankTicks(24) - if frameChange ~= 0 then - self:setCurrentFrame(self.ppm.currentFrame + frameChange) - if frameChange < 0 then - sounds:playSfxWithCooldown('crankA', 60) - else - sounds:playSfxWithCooldown('crankB', 60) + if self.ppm then + if not self.ppm.isPlaying then + local frameChange = playdate.getCrankTicks(24) + if frameChange ~= 0 then + self:setCurrentFrame(self.ppm.currentFrame + frameChange) + if frameChange < 0 then + sounds:playSfxWithCooldown('crankA', 60) + else + sounds:playSfxWithCooldown('crankB', 60) + end end + else + self.ppm:update() end end - self.ppm:update() end function PlayerScreen:updateTransitionIn(t, fromScreen) diff --git a/Source/scenes/Settings.lua b/Source/scenes/Settings.lua index 54d7bbd..d7891f5 100644 --- a/Source/scenes/Settings.lua +++ b/Source/scenes/Settings.lua @@ -33,7 +33,7 @@ function SettingsScreen:setupSprites() .. '*Playnote Studio*\n' .. 'https://playnote.studio\n' .. '\n' - .. locales:getTextFormatted('ABOUT_VERSION', playdate.metadata.version) .. '\n' + .. locales:getTextFormatted('ABOUT_VERSION', tostring(playdate.metadata.version)) .. '\n' .. locales:getTextFormatted('ABOUT_BUILT_BY', 'James Daniel') ) end) diff --git a/Source/ui/dialog.lua b/Source/ui/dialog.lua index 6bfcb62..676aecb 100644 --- a/Source/ui/dialog.lua +++ b/Source/ui/dialog.lua @@ -200,7 +200,7 @@ function dialog:show(text, type) self.cancelButton:click() end }, true) - elseif self.type == dialog.kTypeError then + else playdate.inputHandlers.push({}, true) end end @@ -269,7 +269,14 @@ function dialog:sequence(seq, fn) end end self.wasAlreadyOpened = i > 1 - self:show(locales:replaceKeysInText(item.message), item.type) + local text = locales:replaceKeysInText(item.message) + if item.delay ~= nil then + playdate.timer.performAfterDelay(item.delay, function () + dialog:show(text, item.type) + end) + else + dialog:show(text, item.type) + end end doItem(seq[i]) end diff --git a/Source/utils/utils.lua b/Source/utils/utils.lua index 9ccec78..5a1a242 100644 --- a/Source/utils/utils.lua +++ b/Source/utils/utils.lua @@ -55,6 +55,26 @@ function utils:createRepeater(delayAfterInitialFiring, delayAfterSecondFiring, c return buttonDown, buttonUp, remove end +function utils:createTransition(duration, fromValue, toValue, easingFunction, updateCallback, doneCallback) + local timer = playdate.timer.new(duration, fromValue, toValue, easingFunction) + updateCallback(fromValue) + + timer.updateCallback = function () + updateCallback(timer.value) + end + + timer.timerEndedCallback = function () + updateCallback(toValue) + if type(doneCallback) == 'function' then + doneCallback(toValue) + end + end + -- return cancel function + return function () + timer:remove() + end +end + function utils:hookFn(origFn, hookFn) if type(origFn) == 'function' then return function (...) diff --git a/assets/playnote.sketch b/assets/playnote.sketch index 7cfb6af..b1aac04 100644 Binary files a/assets/playnote.sketch and b/assets/playnote.sketch differ diff --git a/ppmlib/player.c b/ppmlib/player.c index 275600d..472d063 100644 --- a/ppmlib/player.c +++ b/ppmlib/player.c @@ -19,11 +19,12 @@ static void doCallback(char* fnName, int numArgs) pd_log("Error calling Lua callback: %s", err); } -player_ctx* playerInit(u16 x, u16 y) +player_ctx* playerNew(u16 x, u16 y) { player_ctx* ctx = pd_malloc(sizeof(player_ctx)); ctx->ppm = NULL; ctx->masterAudio = NULL; + ctx->isPlaying = 0; playerMoveTo(ctx, x, y); return ctx; } @@ -34,15 +35,12 @@ void playerMoveTo(player_ctx* ctx, u16 x, u16 y) ctx->y = y; } -int playerLoadPpm(player_ctx* ctx, const char* filePath) +int playerOpenPpm(player_ctx* ctx, const char* filePath) { ctx->ppm = ppmNew(); - int err = ppmOpen(ctx->ppm, filePath); - if (err != -1) - { - pd_error("Error loading PPM: %d", err); - return 1; - } + int res = ppmOpen(ctx->ppm, filePath); + if (res == -1) + return -1; ctx->isPlaying = 0; ctx->startTime = 0; @@ -76,6 +74,15 @@ int playerLoadPpm(player_ctx* ctx, const char* filePath) pd->sound->sampleplayer->setSample(ctx->audioPlayer, ctx->masterAudioSample); } + // free ppm adpcm audio buffers now master track has been rendered + pd_free(ctx->ppm->bgmData); + ctx->ppm->bgmData = NULL; + for (u8 i = 0; i < PPM_SE_CHANNELS; i++) + { + pd_free(ctx->ppm->seData[i]); + ctx->ppm->seData[i] = NULL; + } + return 0; } @@ -83,12 +90,14 @@ void playerDone(player_ctx* ctx) { ppmDone(ctx->ppm); pd_free(ctx->ppm); + ctx->ppm = NULL; if (ctx->masterAudio != NULL) { pd->sound->sampleplayer->stop(ctx->audioPlayer); pd->sound->sampleplayer->freePlayer(ctx->audioPlayer); pd->sound->sample->freeSample(ctx->masterAudioSample); pd_free(ctx->masterAudio); + ctx->masterAudio = NULL; } pd_free(ctx); } diff --git a/ppmlib/player.h b/ppmlib/player.h index bbb6939..bc5f17a 100644 --- a/ppmlib/player.h +++ b/ppmlib/player.h @@ -32,11 +32,11 @@ typedef struct player_ctx char* stoppedCallback; } player_ctx; -player_ctx* playerInit(u16 x, u16 y); +player_ctx* playerNew(u16 x, u16 y); void playerMoveTo(player_ctx* ctx, u16 x, u16 y); -int playerLoadPpm(player_ctx* ctx, const char* filePath); +int playerOpenPpm(player_ctx* ctx, const char* filePath); void playerDone(player_ctx* ctx); diff --git a/ppmlib/ppm.c b/ppmlib/ppm.c index c48ced6..e2430f5 100644 --- a/ppmlib/ppm.c +++ b/ppmlib/ppm.c @@ -5,6 +5,8 @@ ppm_ctx_t* ppmNew() { ppm_ctx_t* ctx = pd_malloc(sizeof(ppm_ctx_t)); + ctx->prevFrame = -1; + ctx->videoOffsets = NULL; ctx->videoData = NULL; ctx->audioFrames = NULL; @@ -19,182 +21,148 @@ ppm_ctx_t* ppmNew() ctx->prevLayers[i] = pd_calloc(PPM_BUFFER_SIZE, 1); } - ctx->prevFrame = -1; + ctx->file = NULL; + ctx->filePath = NULL; + ctx->lastError = NULL; return ctx; } -int ppmOpen(ppm_ctx_t* ctx, const char* filePath) +static void closeWithError(ppm_ctx_t* ctx, const char* msg) +{ + if (ctx->lastError != NULL) + pd_free(ctx->lastError); + ctx->lastError = NULL; + pd->system->formatString(&ctx->lastError, "Flipnote load error\n%s\n%s", ctx->filePath, msg); + pd_log(ctx->lastError); + ppmDone(ctx); + pd->file->close(ctx->file); + ctx->file = NULL; + ctx->filePath = NULL; +} + +static int errorHandledFileRead(ppm_ctx_t* ctx, void* buf, unsigned int len, const char* errorMsg) +{ + int res = pd->file->read(ctx->file, buf, len); + if (res == -1) + { + const char* fileErr = pd->file->geterr(); + char* err = NULL; + pd->system->formatString(&err, "%s\n%s", errorMsg, fileErr); + closeWithError(ctx, err); + return -1; + } + else if (len > 0 && res != len) + { + closeWithError(ctx, errorMsg); + return -1; + } + return 0; +} + +char* ppmGetError(ppm_ctx_t* ctx) +{ + if (ctx->lastError != NULL) + return ctx->lastError; + else + return "No error"; +} + +int ppmOpen(ppm_ctx_t* ctx, char* filePath) { SDFile* file; int readResult; - ctx->file = file; - ctx->filePath = filePath; - file = pd->file->open(filePath, kFileRead | kFileReadData); if (file == NULL) { - const char* err = pd->file->geterr(); - pd_error("Error opening %s: %s", filePath, err); - pd->lua->pushNil(); - return 0; + const char* fileErr = pd->file->geterr(); + char* err = NULL; + pd->system->formatString(&err, "Couldn't open file (%s)", fileErr); + closeWithError(ctx, err); + return -1; } - readResult = pd->file->read(file, &ctx->hdr, sizeof(ppm_header_t)); + pd->file->seek(file, 0, SEEK_END); + int size = pd->file->tell(file); + pd->file->seek(file, 0, SEEK_SET); + + ctx->file = file; + ctx->filePath = filePath; + + readResult = errorHandledFileRead(ctx, &ctx->hdr, sizeof(ppm_header_t), "Couldn't read header"); ctx->hdr.numFrames++; - if (readResult < 1) - { - if (readResult == -1) { - const char* err = pd->file->geterr(); - pd_error("Error reading header %s: %s", filePath, err); - pd->lua->pushNil(); - return 1; - } - pd->lua->pushNil(); - return 2; - } + if (readResult == -1) + return -1; + if (strncmp(ctx->hdr.magic, "PARA", 4) != 0) { - pd_error("Invalid PPM magic"); - pd->lua->pushNil(); - return 3; + closeWithError(ctx, "Invalid format"); + return -1; } - readResult = pd->file->read(file, ctx->thumbnail, sizeof(ctx->thumbnail)); - if (readResult < 1) - { - if (readResult == -1) { - const char* err = pd->file->geterr(); - pd_error("Error reading thumbnail %s: %s", filePath, err); - pd->lua->pushNil(); - return 4; - } - pd->lua->pushNil(); - return 5; - } + readResult = errorHandledFileRead(ctx, ctx->thumbnail, sizeof(ctx->thumbnail), "Couldn't read thumbnail"); + if (readResult == -1) + return -1; - readResult = pd->file->read(file, &ctx->animHdr, sizeof(ppm_animation_header_t)); - if (readResult < 1) - { - if (readResult == -1) { - const char* err = pd->file->geterr(); - pd_error("Error reading animation header %s: %s", filePath, err); - pd->lua->pushNil(); - return 6; - } - pd->lua->pushNil(); - return 7; - } + readResult = errorHandledFileRead(ctx, &ctx->animHdr, sizeof(ppm_animation_header_t), "Couldn't read anim header"); + if (readResult == -1) + return -1; ctx->videoOffsets = pd_malloc(sizeof(u32) * ctx->hdr.numFrames); - readResult = pd->file->read(file, ctx->videoOffsets, sizeof(u32) * ctx->hdr.numFrames); - if (readResult < 1) - { - pd_free(ctx->videoOffsets); - if (readResult == -1) { - const char* err = pd->file->geterr(); - pd_error("Error reading animation frame offsets %s: %s", filePath, err); - pd->lua->pushNil(); - return 8; - } - pd->lua->pushNil(); - return 9; - } + readResult = errorHandledFileRead(ctx, ctx->videoOffsets, sizeof(u32) * ctx->hdr.numFrames, "Couldn't read frame offsets"); + if (readResult == -1) + return -1; ctx->videoData = pd_malloc(ctx->hdr.animationLength - sizeof(ppm_animation_header_t) - (sizeof(u32) * ctx->hdr.numFrames)); - readResult = pd->file->read(file, ctx->videoData, ctx->hdr.animationLength - sizeof(ppm_animation_header_t) - (sizeof(u32) * ctx->hdr.numFrames)); - if (readResult < 1) - { - ppmDone(ctx); - if (readResult == -1) { - const char* err = pd->file->geterr(); - pd_error("Error reading animation frame data %s: %s", filePath, err); - pd->lua->pushNil(); - return 10; - } - pd->lua->pushNil(); - return 11; - } + readResult = errorHandledFileRead(ctx, ctx->videoData, ctx->hdr.animationLength - sizeof(ppm_animation_header_t) - (sizeof(u32) * ctx->hdr.numFrames), "Couldn't read frame data"); + if (readResult == -1) + return -1; ctx->audioFrames = pd_malloc(ctx->hdr.numFrames); - readResult = pd->file->read(file, ctx->audioFrames, ctx->hdr.numFrames); - if (readResult < 1) - { - ppmDone(ctx); - if (readResult == -1) { - const char* err = pd->file->geterr(); - pd_error("Error reading sound effect flags %s: %s", filePath, err); - pd->lua->pushNil(); - return 12; - } - pd->lua->pushNil(); - return 13; - } + readResult = errorHandledFileRead(ctx, ctx->audioFrames, ctx->hdr.numFrames, "Couldn't read sfx flags"); + if (readResult == -1) + return -1; pd->file->seek(file, ROUND_UP_4(pd->file->tell(file)), SEEK_SET); - readResult = pd->file->read(file, &ctx->sndHdr, sizeof(ppm_sound_header_t)); - if (readResult < 1) - { - ppmDone(ctx); - if (readResult == -1) { - const char* err = pd->file->geterr(); - pd_error("Error reading sound headers %s: %s", filePath, err); - pd->lua->pushNil(); - return 14; - } - pd->lua->pushNil(); - return 15; - } + readResult = errorHandledFileRead(ctx, &ctx->sndHdr, sizeof(ppm_sound_header_t), "Couldn't read sound header"); + if (readResult == -1) + return -1; ctx->bgmData = pd_malloc(ctx->sndHdr.bgmLength); - readResult = pd->file->read(file, ctx->bgmData, ctx->sndHdr.bgmLength); - if (readResult < 0 || readResult != ctx->sndHdr.bgmLength) - { - ppmDone(ctx); - const char* err = pd->file->geterr(); - pd_error("Error reading bgm data %s: %s", filePath, err); - pd->lua->pushNil(); - return 16; - } + readResult = errorHandledFileRead(ctx, ctx->bgmData, ctx->sndHdr.bgmLength, "Couldn't read bgm data"); + if (readResult == -1) + return -1; for (u8 i = 0; i < PPM_SE_CHANNELS; i++) { ctx->seData[i] = pd_malloc(ctx->sndHdr.seLength[i]); - readResult = pd->file->read(file, ctx->seData[i], ctx->sndHdr.seLength[i]); - if (readResult < 0 || readResult != ctx->sndHdr.seLength[i]) break; + readResult = errorHandledFileRead(ctx, ctx->seData[i], ctx->sndHdr.seLength[i], "Couldn't read sfx data"); + if (readResult == -1) + return -1; } - if (readResult < 0) + + // last part of the ppm is a 128-byte signature followed by 16 null padding bytes + if (pd->file->tell(file) != size - 128 - 16) { - ppmDone(ctx); - const char* err = pd->file->geterr(); - pd_error("Error reading sound effect data %s: %s", filePath, err); - pd->lua->pushNil(); - return 17; + closeWithError(ctx, "Invalid PPM size"); + return -1; } ctx->frameRate = speedTable[8 - ctx->sndHdr.playbackSpeed]; ctx->bgmFrameRate = speedTable[8 - ctx->sndHdr.recordedSpeed]; + + // test error handling + // closeWithError(ctx, "Something dun goofed"); + // return -1; pd->file->close(file); ctx->file = NULL; ctx->filePath = NULL; - - return -1; + return 0; } -// char* ppmFormatId(u8 fsid[8]) -// { -// static char str[32]; -// memset(str, 0, 32); - -// for(int i = 7; i >= 0; i--) -// sprintf(str, "%s%02X", str, (fsid[i] & 0xFF)); - -// return str; -// } - void ppmDone(ppm_ctx_t* ctx) { if (ctx->videoOffsets != NULL) @@ -232,7 +200,15 @@ void ppmDone(ppm_ctx_t* ctx) for (u8 i = 0; i < PPM_LAYERS; i++) { - pd_free(ctx->layers[i]); - pd_free(ctx->prevLayers[i]); + if (ctx->layers[i] != NULL) + { + pd_free(ctx->layers[i]); + ctx->layers[i] = NULL; + } + if (ctx->prevLayers[i] != NULL) + { + pd_free(ctx->prevLayers[i]); + ctx->prevLayers[i] = NULL; + } } } \ No newline at end of file diff --git a/ppmlib/ppm.h b/ppmlib/ppm.h index 709c34e..ddc7d49 100644 --- a/ppmlib/ppm.h +++ b/ppmlib/ppm.h @@ -119,11 +119,13 @@ typedef struct ppm_ctx_t // open function state SDFile* file; char* filePath; + char* lastError; } ppm_ctx_t; #pragma pack(pop) ppm_ctx_t* ppmNew(); -int ppmOpen(ppm_ctx_t* ctx, const char* filePath); +char* ppmGetError(ppm_ctx_t* ctx); +int ppmOpen(ppm_ctx_t* ctx, char* filePath); void ppmDone(ppm_ctx_t* ctx); char* fsidFromStr(u8 fsid[8]); \ No newline at end of file diff --git a/ppmlib/ppmlib.c b/ppmlib/ppmlib.c index 9514f82..3201202 100644 --- a/ppmlib/ppmlib.c +++ b/ppmlib/ppmlib.c @@ -80,38 +80,11 @@ static void blitPpmFrame(player_ctx* ctx, u16 frameIndex, void* destBuffer, u16 static int ppmlib_new(lua_State* L) { - const char* filePath = pd->lua->getArgString(1); - int x = pd->lua->getArgInt(2); - int y = pd->lua->getArgInt(3); + int x = pd->lua->getArgInt(1); + int y = pd->lua->getArgInt(2); - // SDFile* f = pd->file->open(filePath, kFileRead | kFileReadData); - // if (f == NULL) - // { - // const char* err = pd->file->geterr(); - // pd_error("Error opening %s: %s", filePath, err); - // pd->lua->pushNil(); - // return 1; - // } - - // pd->file->seek(f, 0, SEEK_END); - // int fsize = pd->file->tell(f); - // pd->file->seek(f, 0, SEEK_SET); - - // u8* ppm = pd_malloc(fsize); - // pd->file->read(f, ppm, fsize); - // pd->file->close(f); - - player_ctx* ctx = playerInit((u16)x, (u16)y); - int err = playerLoadPpm(ctx, filePath); - - // pd_free(ppm); + player_ctx* ctx = playerNew((u16)x, (u16)y); - if (err == 1) - { - pd->lua->pushNil(); - return 1; - } - pd->lua->pushObject(ctx, "PpmPlayer", 0); return 1; } @@ -154,6 +127,39 @@ static int ppmlib_index(lua_State* L) return 1; } +// load a flipnote ppm from a given filepath +static int ppmlib_open(lua_State* L) +{ + player_ctx* ctx = getPlayerCtx(1); + const char* filePath = pd->lua->getArgString(2); + int res = playerOpenPpm(ctx, pd_strdup(filePath)); + + if (res == -1) + { + pd->lua->pushBool(0); + return 1; + } + + pd->lua->pushBool(1); + return 1; +} + +// get ppm parser error message +static int ppmlib_getPpmError(lua_State* L) +{ + player_ctx* ctx = getPlayerCtx(1); + if (ctx->ppm != NULL) + { + const char* err = ppmGetError(ctx->ppm); + pd->lua->pushString(err); + } + else + { + pd->lua->pushNil(); + } + return 1; +} + // set a layer's dither pattern from a list of presets static int ppmlib_setLayerDither(lua_State* L) { @@ -247,6 +253,8 @@ static const lua_reg libPpm[] = { "new", ppmlib_new }, { "__gc", ppmlib_gc }, { "__index", ppmlib_index }, + { "open", ppmlib_open }, + { "getError", ppmlib_getPpmError }, { "draw", ppmlib_draw }, { "drawFrameToBitmap", ppmlib_drawFrameToBitmap }, { "setLayerDither", ppmlib_setLayerDither }, diff --git a/ppmlib/tmb.c b/ppmlib/tmb.c index b5b0346..6410ab2 100644 --- a/ppmlib/tmb.c +++ b/ppmlib/tmb.c @@ -1,6 +1,85 @@ #include "tmb.h" #include "platform.h" +tmb_ctx_t* tmbNew() +{ + tmb_ctx_t* ctx = pd_malloc(sizeof(tmb_ctx_t)); + ctx->bitmap = NULL; + ctx->file = NULL; + ctx->filePath = NULL; + ctx->lastError = NULL; + return ctx; +} + +static void closeWithError(tmb_ctx_t* ctx, const char* msg) +{ + if (ctx->lastError != NULL) + pd_free(ctx->lastError); + ctx->lastError = NULL; + pd->system->formatString(&ctx->lastError, "Thumbnail load error\n%s\n%s", ctx->filePath, msg); + pd_log(ctx->lastError); + pd->file->close(ctx->file); + ctx->file = NULL; + ctx->filePath = NULL; +} + +static int errorHandledFileRead(tmb_ctx_t* ctx, void* buf, unsigned int len, const char* errorMsg) +{ + int res = pd->file->read(ctx->file, buf, len); + if (res == -1) + { + const char* fileErr = pd->file->geterr(); + char* err = NULL; + pd->system->formatString(&err, "%s\n%s", errorMsg, fileErr); + closeWithError(ctx, err); + return -1; + } + else if (len > 0 && res != len) + { + closeWithError(ctx, errorMsg); + return -1; + } + return 0; +} + +int tmbOpen(tmb_ctx_t* ctx, const char* filePath) +{ + SDFile* file; + int readResult; + + file = pd->file->open(filePath, kFileRead | kFileReadData); + if (file == NULL) + { + const char* fileErr = pd->file->geterr(); + char* err = NULL; + pd->system->formatString(&err, "Couldn't open file (%s)", fileErr); + closeWithError(ctx, err); + return -1; + } + + ctx->file = file; + ctx->filePath = filePath; + + readResult = errorHandledFileRead(ctx, &ctx->hdr, sizeof(ppm_header_t), "Couldn't read header"); + if (readResult == -1) + return -1; + + if (strncmp(ctx->hdr.magic, "PARA", 4) != 0) + { + closeWithError(ctx, "Invalid format"); + return -1; + } + + readResult = errorHandledFileRead(ctx, ctx->thumbnail, sizeof(ctx->thumbnail), "Couldn't read thumb bitmap"); + if (readResult == -1) + return -1; + + pd->file->close(file); + ctx->file = NULL; + // keep filePath + return 0; +} + // just parses enough of the ppm to get the tmb (thumbnail + meta) data int tmbInit(tmb_ctx_t* ctx, u8* ppm, int len) { @@ -42,4 +121,25 @@ void tmbGetThumbnail(tmb_ctx_t* ctx, u8* out) out[(y + l) * 64 + (x + p + 0)] = *rawData & 0xf; out[(y + l) * 64 + (x + p + 1)] = *rawData++ >> 4; } +} + +void tmbDone(tmb_ctx_t* ctx) +{ + if (ctx->filePath != NULL) + { + pd_free(ctx->filePath); + ctx->filePath = NULL; + } + + if (ctx->lastError != NULL) + { + pd_free(ctx->lastError); + ctx->lastError = NULL; + } + + if (ctx->bitmap != NULL) + { + pd->graphics->freeBitmap(ctx->bitmap); + ctx->bitmap = NULL; + } } \ No newline at end of file diff --git a/ppmlib/tmb.h b/ppmlib/tmb.h index 4823fd5..9c80239 100644 --- a/ppmlib/tmb.h +++ b/ppmlib/tmb.h @@ -7,8 +7,15 @@ typedef struct tmb_ctx_t { ppm_header_t hdr; u8 thumbnail[PPM_THUMBNAIL_LENGTH]; + LCDBitmap* bitmap; + // open function state + SDFile* file; + char* filePath; + char* lastError; } tmb_ctx_t; -int tmbInit(tmb_ctx_t* ctx, u8* ppm, int len); -void tmbGetThumbnail(tmb_ctx_t* ctx, u8* out); -void tmbDone(tmb_ctx_t* ctx); \ No newline at end of file +tmb_ctx_t* tmbNew(); +int tmbOpen(tmb_ctx_t* ctx, const char* filePath); +int tmbInit(tmb_ctx_t* ctx, u8* ppm, int len); +void tmbGetThumbnail(tmb_ctx_t* ctx, u8* out); +void tmbDone(tmb_ctx_t* ctx); \ No newline at end of file diff --git a/ppmlib/tmblib.c b/ppmlib/tmblib.c index c7b64b1..15c33dd 100644 --- a/ppmlib/tmblib.c +++ b/ppmlib/tmblib.c @@ -22,8 +22,7 @@ void registerTmblib() } } - -LCDBitmap* tmbGetPdBitmap(tmblib_ctx* ctx) +LCDBitmap* tmbGetPdBitmap(tmb_ctx_t* ctx) { u8* pixels = pd_malloc(PPM_THUMBNAIL_WIDTH * PPM_THUMBNAIL_HEIGHT); @@ -36,7 +35,7 @@ LCDBitmap* tmbGetPdBitmap(tmblib_ctx* ctx) LCDBitmap* bitmap = pd->graphics->newBitmap(PPM_THUMBNAIL_WIDTH, PPM_THUMBNAIL_HEIGHT, kColorBlack); pd->graphics->getBitmapData(bitmap, &width, &height, &rowBytes, &hasMask, &bitmapData); - tmbGetThumbnail(ctx->tmb, pixels); + tmbGetThumbnail(ctx, pixels); u8 chunk = 0; u8 patternOffset = 0; @@ -84,7 +83,7 @@ LCDBitmap* tmbGetPdBitmap(tmblib_ctx* ctx) return bitmap; } -static tmblib_ctx* getTmbCtx(int n) +static tmb_ctx_t* getTmbCtx(int n) { return pd->lua->getArgObject(n, "TmbParser", NULL); } @@ -93,34 +92,15 @@ static int tmb_new(lua_State* L) { const char* filePath = pd->lua->getArgString(1); - int fsize = 0x06A0; - u8* tmb = pd_malloc(fsize); - - SDFile* f = pd->file->open(filePath, kFileRead | kFileReadData); - if (f == NULL) - { - const char* err = pd->file->geterr(); - pd_error("Error opening %s: %s", filePath, err); - pd->lua->pushNil(); - return 1; - } - - pd->file->read(f, tmb, fsize); - pd->file->close(f); - - tmblib_ctx* ctx = pd_malloc(sizeof(tmblib_ctx)); - ctx->tmb = pd_malloc(sizeof(tmb_ctx_t)); - int err = tmbInit(ctx->tmb, tmb, fsize); - pd_free(tmb); + tmb_ctx_t* ctx = tmbNew(); + int result = tmbOpen(ctx, pd_strdup(filePath)); - if (err != -1) + if (result == -1) { - pd_error("tmbInit error %d when trying to read %s", err, filePath); pd->lua->pushNil(); return 1; } - ctx->ppmPath = pd_strdup(filePath); ctx->bitmap = tmbGetPdBitmap(ctx); pd->lua->pushObject(ctx, "TmbParser", 0); @@ -130,10 +110,8 @@ static int tmb_new(lua_State* L) // called when lua garbage-collects a class instance static int tmb_gc(lua_State* L) { - tmblib_ctx* ctx = getTmbCtx(1); - pd_free(ctx->tmb); - pd_free(ctx->ppmPath); - pd->graphics->freeBitmap(ctx->bitmap); + tmb_ctx_t* ctx = getTmbCtx(1); + tmbDone(ctx); // pd_log("tmb free at 0x%08x", ctx); pd_free(ctx); return 0; @@ -144,33 +122,33 @@ static int tmb_index(lua_State* L) if (pd->lua->indexMetatable() == 1) return 1; - tmblib_ctx* ctx = getTmbCtx(1); + tmb_ctx_t* ctx = getTmbCtx(1); const char* key = pd->lua->getArgString(2); if (strcmp(key, "bitmap") == 0) pd->lua->pushBitmap(ctx->bitmap); else if (strcmp(key, "path") == 0) - pd->lua->pushString(ctx->ppmPath); + pd->lua->pushString(ctx->filePath); else if (strcmp(key, "numFrames") == 0) - pd->lua->pushInt(ctx->tmb->hdr.numFrames); + pd->lua->pushInt(ctx->hdr.numFrames); else if (strcmp(key, "currentAuthor") == 0) - pd->lua->pushBytes((char*)ctx->tmb->hdr.currentAuthor, 22); + pd->lua->pushBytes((char*)ctx->hdr.currentAuthor, 22); else if (strcmp(key, "previousAuthor") == 0) - pd->lua->pushBytes((char*)ctx->tmb->hdr.previousAuthor, 22); + pd->lua->pushBytes((char*)ctx->hdr.previousAuthor, 22); else if (strcmp(key, "originalAuthor") == 0) - pd->lua->pushBytes((char*)ctx->tmb->hdr.originalAuthor, 22); + pd->lua->pushBytes((char*)ctx->hdr.originalAuthor, 22); else if (strcmp(key, "currentAuthorId") == 0) - pd->lua->pushBytes((char*)ctx->tmb->hdr.currentAuthorId, 8); + pd->lua->pushBytes((char*)ctx->hdr.currentAuthorId, 8); else if (strcmp(key, "previousAuthorId") == 0) - pd->lua->pushBytes((char*)ctx->tmb->hdr.previousAuthorId, 8); + pd->lua->pushBytes((char*)ctx->hdr.previousAuthorId, 8); else if (strcmp(key, "originalAuthorId") == 0) - pd->lua->pushBytes((char*)ctx->tmb->hdr.originalAuthorId, 8); + pd->lua->pushBytes((char*)ctx->hdr.originalAuthorId, 8); else if (strcmp(key, "timestamp") == 0) - pd->lua->pushInt(ctx->tmb->hdr.timeStamp); + pd->lua->pushInt(ctx->hdr.timeStamp); else if (strcmp(key, "ppmSize") == 0) { FileStat* stat = pd_malloc(sizeof(FileStat)); - int res = pd->file->stat(ctx->ppmPath, stat); + int res = pd->file->stat(ctx->filePath, stat); if (res == 0) pd->lua->pushInt(stat->size); else diff --git a/ppmlib/tmblib.h b/ppmlib/tmblib.h index d83145c..25ec573 100644 --- a/ppmlib/tmblib.h +++ b/ppmlib/tmblib.h @@ -3,11 +3,4 @@ #include "pd_api.h" #include "tmb.h" -typedef struct tmblib_ctx -{ - tmb_ctx_t* tmb; - LCDBitmap* bitmap; - char* ppmPath; -} tmblib_ctx; - extern void registerTmblib(void); \ No newline at end of file diff --git a/website/package.json b/website/package.json index 2e08be0..68f3103 100644 --- a/website/package.json +++ b/website/package.json @@ -14,6 +14,7 @@ "@types/three": "^0.139.0", "astro": "^0.25.4", "astro-icon": "^0.7.1", + "date-fns": "^2.28.0", "sass": "^1.49.9", "vite-plugin-glsl": "^0.1.2" }, diff --git a/website/src/components/Button.astro b/website/src/components/Button.astro index 07421e3..8eb03d4 100644 --- a/website/src/components/Button.astro +++ b/website/src/components/Button.astro @@ -37,7 +37,7 @@ const { href, type } = Astro.props font-weight: normal; color: $color-text; background: $color-bg; - border: 2px solid #B3B5C1; + border: 3px solid #B3B5C1; border-right-color: #777784; border-bottom-color: #777784; } diff --git a/website/src/pages/filehelp.astro b/website/src/pages/filehelp.astro index 9805bd9..0195b12 100644 --- a/website/src/pages/filehelp.astro +++ b/website/src/pages/filehelp.astro @@ -68,24 +68,14 @@ import BaseLayout from '../layouts/BaseLayout.astro'; margin-top: 5rem; } - .Header__top { - background: url('/assets/panel_head_light.svg'); - background-size: 100% 100%; - background-repeat: no-repeat; - width: 15ch; - margin: 0 auto; - margin-bottom: -0.1rem; - padding: .75em 2em .5em 2em; - border-top-left-radius: 20px; - border-top-right-radius: 20px; - } - .Header__main { background: $color-bg-alt; - padding: 20px; margin: 0 auto; + @include punchcard; @include panel; + padding-top: 40px; @include breakpoint-desktop { + padding-top: 40px; max-width: grid-span(8, 12); } } @@ -103,8 +93,8 @@ import BaseLayout from '../layouts/BaseLayout.astro'; } .Panel { - color: $color-text-invert; - background: $color-bg-invert; + // color: $color-text-invert; + background: $color-bg-alt; margin: 0 auto; margin-bottom: 2em; @include panel; diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index d690127..4d61063 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -35,14 +35,18 @@ import { Icon } from 'astro-icon';
-

Download

+
+ +

Latest Release

+ Past Releases & Changelog → +

playnote.pdx

-
Version 1.0.1
-
17.5 MB
+
Version 1.1
+
16.8 MB
@@ -68,6 +72,10 @@ import { Icon } from 'astro-icon';
+
+

By the way! You can add your own Flipnotes by dropping them onto your Playdate's storage

+ +
@@ -265,6 +273,8 @@ import { Icon } from 'astro-icon'; \ No newline at end of file diff --git a/website/src/styles/vars.scss b/website/src/styles/vars.scss index d370f32..4ff03cd 100644 --- a/website/src/styles/vars.scss +++ b/website/src/styles/vars.scss @@ -50,4 +50,9 @@ $text-size-title: 1.25rem; padding: $padding; border-radius: $border-radius; } +} + +@mixin punchcard { + -webkit-mask-image: radial-gradient(circle at center 22px, transparent 10px, white 10px); + mask-image: radial-gradient(circle at center 22px, transparent 10px, white 10px); } \ No newline at end of file