Wojbie

bigfont.lua

Dec 14th, 2015
3,348
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -------------------------------------------------------------------------------------
  2. -- Wojbies API 4.1 - Bigfont - functions to write bigger font using drawing sybols --
  3. -------------------------------------------------------------------------------------
  4. --LICENCE: ZLIB/libpng Licence (Zlib)
  5. --   Copyright (c) 2015-2020 Wojbie (wojbie@wojbie.net)
  6. --   This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
  7. --   Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
  8. --   1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
  9. --   2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  10. --   3. This notice may not be removed or altered from any source distribution.
  11.  
  12. --### Initializing
  13. local b = shell and {} or (_ENV or getfenv())
  14. b.versionName = "Bigfont By Wojbie"
  15. b.versionNum = 4.1 --2020-01-28
  16.  
  17. --### Font database
  18. local rawFont = {{"\32\32\32\137\156\148\158\159\148\135\135\144\159\139\32\136\157\32\159\139\32\32\143\32\32\143\32\32\32\32\32\32\32\32\147\148\150\131\148\32\32\32\151\140\148\151\140\147", "\32\32\32\149\132\149\136\156\149\144\32\133\139\159\129\143\159\133\143\159\133\138\32\133\138\32\133\32\32\32\32\32\32\150\150\129\137\156\129\32\32\32\133\131\129\133\131\132", "\32\32\32\130\131\32\130\131\32\32\129\32\32\32\32\130\131\32\130\131\32\32\32\32\143\143\143\32\32\32\32\32\32\130\129\32\130\135\32\32\32\32\131\32\32\131\32\131", "\139\144\32\32\143\148\135\130\144\149\32\149\150\151\149\158\140\129\32\32\32\135\130\144\135\130\144\32\149\32\32\139\32\159\148\32\32\32\32\159\32\144\32\148\32\147\131\132", "\159\135\129\131\143\149\143\138\144\138\32\133\130\149\149\137\155\149\159\143\144\147\130\132\32\149\32\147\130\132\131\159\129\139\151\129\148\32\32\139\131\135\133\32\144\130\151\32", "\32\32\32\32\32\32\130\135\32\130\32\129\32\129\129\131\131\32\130\131\129\140\141\132\32\129\32\32\129\32\32\32\32\32\32\32\131\131\129\32\32\32\32\32\32\32\32\32", "\32\32\32\32\149\32\159\154\133\133\133\144\152\141\132\133\151\129\136\153\32\32\154\32\159\134\129\130\137\144\159\32\144\32\148\32\32\32\32\32\32\32\32\32\32\32\151\129", "\32\32\32\32\133\32\32\32\32\145\145\132\141\140\132\151\129\144\150\146\129\32\32\32\138\144\32\32\159\133\136\131\132\131\151\129\32\144\32\131\131\129\32\144\32\151\129\32", "\32\32\32\32\129\32\32\32\32\130\130\32\32\129\32\129\32\129\130\129\129\32\32\32\32\130\129\130\129\32\32\32\32\32\32\32\32\133\32\32\32\32\32\129\32\129\32\32", "\150\156\148\136\149\32\134\131\148\134\131\148\159\134\149\136\140\129\152\131\32\135\131\149\150\131\148\150\131\148\32\148\32\32\148\32\32\152\129\143\143\144\130\155\32\134\131\148", "\157\129\149\32\149\32\152\131\144\144\131\148\141\140\149\144\32\149\151\131\148\32\150\32\150\131\148\130\156\133\32\144\32\32\144\32\130\155\32\143\143\144\32\152\129\32\134\32", "\130\131\32\131\131\129\131\131\129\130\131\32\32\32\129\130\131\32\130\131\32\32\129\32\130\131\32\130\129\32\32\129\32\32\133\32\32\32\129\32\32\32\130\32\32\32\129\32", "\150\140\150\137\140\148\136\140\132\150\131\132\151\131\148\136\147\129\136\147\129\150\156\145\138\143\149\130\151\32\32\32\149\138\152\129\149\32\32\157\152\149\157\144\149\150\131\148", "\149\143\142\149\32\149\149\32\149\149\32\144\149\32\149\149\32\32\149\32\32\149\32\149\149\32\149\32\149\32\144\32\149\149\130\148\149\32\32\149\32\149\149\130\149\149\32\149", "\130\131\129\129\32\129\131\131\32\130\131\32\131\131\32\131\131\129\129\32\32\130\131\32\129\32\129\130\131\32\130\131\32\129\32\129\131\131\129\129\32\129\129\32\129\130\131\32", "\136\140\132\150\131\148\136\140\132\153\140\129\131\151\129\149\32\149\149\32\149\149\32\149\137\152\129\137\152\129\131\156\133\149\131\32\150\32\32\130\148\32\152\137\144\32\32\32", "\149\32\32\149\159\133\149\32\149\144\32\149\32\149\32\149\32\149\150\151\129\138\155\149\150\130\148\32\149\32\152\129\32\149\32\32\32\150\32\32\149\32\32\32\32\32\32\32", "\129\32\32\130\129\129\129\32\129\130\131\32\32\129\32\130\131\32\32\129\32\129\32\129\129\32\129\32\129\32\131\131\129\130\131\32\32\32\129\130\131\32\32\32\32\140\140\132", "\32\154\32\159\143\32\149\143\32\159\143\32\159\144\149\159\143\32\159\137\145\159\143\144\149\143\32\32\145\32\32\32\145\149\32\144\32\149\32\143\159\32\143\143\32\159\143\32", "\32\32\32\152\140\149\151\32\149\149\32\145\149\130\149\157\140\133\32\149\32\154\143\149\151\32\149\32\149\32\144\32\149\149\153\32\32\149\32\149\133\149\149\32\149\149\32\149", "\32\32\32\130\131\129\131\131\32\130\131\32\130\131\129\130\131\129\32\129\32\140\140\129\129\32\129\32\129\32\137\140\129\130\32\129\32\130\32\129\32\129\129\32\129\130\131\32", "\144\143\32\159\144\144\144\143\32\159\143\144\159\138\32\144\32\144\144\32\144\144\32\144\144\32\144\144\32\144\143\143\144\32\150\129\32\149\32\130\150\32\134\137\134\134\131\148", "\136\143\133\154\141\149\151\32\129\137\140\144\32\149\32\149\32\149\154\159\133\149\148\149\157\153\32\154\143\149\159\134\32\130\148\32\32\149\32\32\151\129\32\32\32\32\134\32", "\133\32\32\32\32\133\129\32\32\131\131\32\32\130\32\130\131\129\32\129\32\130\131\129\129\32\129\140\140\129\131\131\129\32\130\129\32\129\32\130\129\32\32\32\32\32\129\32", "\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32", "\32\32\32\32\32\32\32\32\32\32\32\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\32\32\32\32\32\32\32\32\32\32\32", "\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32", "\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32", "\32\32\32\32\32\32\32\32\32\32\32\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\32\32\32\32\32\32\32\32\32\32\32", "\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32", "\32\32\32\32\145\32\159\139\32\151\131\132\155\143\132\134\135\145\32\149\32\158\140\129\130\130\32\152\147\155\157\134\32\32\144\144\32\32\32\32\32\32\152\131\155\131\131\129", "\32\32\32\32\149\32\149\32\145\148\131\32\149\32\149\140\157\132\32\148\32\137\155\149\32\32\32\149\154\149\137\142\32\153\153\32\131\131\149\131\131\129\149\135\145\32\32\32", "\32\32\32\32\129\32\130\135\32\131\131\129\134\131\132\32\129\32\32\129\32\131\131\32\32\32\32\130\131\129\32\32\32\32\129\129\32\32\32\32\32\32\130\131\129\32\32\32", "\150\150\32\32\148\32\134\32\32\132\32\32\134\32\32\144\32\144\150\151\149\32\32\32\32\32\32\145\32\32\152\140\144\144\144\32\133\151\129\133\151\129\132\151\129\32\145\32", "\130\129\32\131\151\129\141\32\32\142\32\32\32\32\32\149\32\149\130\149\149\32\143\32\32\32\32\142\132\32\154\143\133\157\153\132\151\150\148\151\158\132\151\150\148\144\130\148", "\32\32\32\140\140\132\32\32\32\32\32\32\32\32\32\151\131\32\32\129\129\32\32\32\32\134\32\32\32\32\32\32\32\129\129\32\129\32\129\129\130\129\129\32\129\130\131\32", "\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\159\142\32\150\151\129\150\131\132\140\143\144\143\141\145\137\140\148\141\141\144\157\142\32\159\140\32\151\134\32\157\141\32", "\157\140\149\157\140\149\157\140\149\157\140\149\157\140\149\157\140\149\151\151\32\154\143\132\157\140\32\157\140\32\157\140\32\157\140\32\32\149\32\32\149\32\32\149\32\32\149\32", "\129\32\129\129\32\129\129\32\129\129\32\129\129\32\129\129\32\129\129\131\129\32\134\32\131\131\129\131\131\129\131\131\129\131\131\129\130\131\32\130\131\32\130\131\32\130\131\32", "\151\131\148\152\137\145\155\140\144\152\142\145\153\140\132\153\137\32\154\142\144\155\159\132\150\156\148\147\32\144\144\130\145\136\137\32\146\130\144\144\130\145\130\136\32\151\140\132", "\151\32\149\151\155\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\152\137\144\157\129\149\149\32\149\149\32\149\149\32\149\149\32\149\130\150\32\32\157\129\149\32\149", "\131\131\32\129\32\129\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\32\32\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\129\32\130\131\32\133\131\32", "\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\159\142\32\159\159\144\152\140\144\156\143\32\159\141\129\153\140\132\157\141\32\130\145\32\32\147\32\136\153\32\130\146\32", "\152\140\149\152\140\149\152\140\149\152\140\149\152\140\149\152\140\149\149\157\134\154\143\132\157\140\133\157\140\133\157\140\133\157\140\133\32\149\32\32\149\32\32\149\32\32\149\32", "\130\131\129\130\131\129\130\131\129\130\131\129\130\131\129\130\131\129\130\130\131\32\134\32\130\131\129\130\131\129\130\131\129\130\131\129\32\129\32\32\129\32\32\129\32\32\129\32", "\159\134\144\137\137\32\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\32\132\32\159\143\32\147\32\144\144\130\145\136\137\32\146\130\144\144\130\145\130\138\32\146\130\144", "\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\131\147\129\138\134\149\149\32\149\149\32\149\149\32\149\149\32\149\154\143\149\32\157\129\154\143\149", "\130\131\32\129\32\129\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\32\32\130\131\32\130\131\129\130\131\129\130\131\129\130\131\129\140\140\129\130\131\32\140\140\129" }, {[[000110000110110000110010101000000010000000100101]], [[000000110110000000000010101000000010000000100101]], [[000000000000000000000000000000000000000000000000]], [[100010110100000010000110110000010100000100000110]], [[000000110000000010110110000110000000000000110000]], [[000000000000000000000000000000000000000000000000]], [[000000110110000010000000100000100000000000000010]], [[000000000110110100010000000010000000000000000100]], [[000000000000000000000000000000000000000000000000]], [[010000000000100110000000000000000000000110010000]], [[000000000000000000000000000010000000010110000000]], [[000000000000000000000000000000000000000000000000]], [[011110110000000100100010110000000100000000000000]], [[000000000000000000000000000000000000000000000000]], [[000000000000000000000000000000000000000000000000]], [[110000110110000000000000000000010100100010000000]], [[000010000000000000110110000000000100010010000000]], [[000000000000000000000000000000000000000000000000]], [[010110010110100110110110010000000100000110110110]], [[000000000000000000000110000000000110000000000000]], [[000000000000000000000000000000000000000000000000]], [[010100010110110000000000000000110000000010000000]], [[110110000000000000110000110110100000000010000000]], [[000000000000000000000000000000000000000000000000]], [[000100011111000100011111000100011111000100011111]], [[000000000000100100100100011011011011111111111111]], [[000000000000000000000000000000000000000000000000]], [[000100011111000100011111000100011111000100011111]], [[000000000000100100100100011011011011111111111111]], [[100100100100100100100100100100100100100100100100]], [[000000110100110110000010000011110000000000011000]], [[000000000100000000000010000011000110000000001000]], [[000000000000000000000000000000000000000000000000]], [[010000100100000000000000000100000000010010110000]], [[000000000000000000000000000000110110110110110000]], [[000000000000000000000000000000000000000000000000]], [[110110110110110110000000110110110110110110110110]], [[000000000000000000000110000000000000000000000000]], [[000000000000000000000000000000000000000000000000]], [[000000000000110110000110010000000000000000010010]], [[000010000000000000000000000000000000000000000000]], [[000000000000000000000000000000000000000000000000]], [[110110110110110110110000110110110110000000000000]], [[000000000000000000000110000000000000000000000000]], [[000000000000000000000000000000000000000000000000]], [[110110110110110110110000110000000000000000010000]], [[000000000000000000000000100000000000000110000110]], [[000000000000000000000000000000000000000000000000]] }}
  19.  
  20. --### Genarate fonts using 3x3 chars per a character. (1 character is 6x9 pixels)
  21. local fonts = {}
  22. local firstFont = {}
  23. do
  24.     local char = 0
  25.     local height = #rawFont[1]
  26.     local lenght = #rawFont[1][1]
  27.     for i = 1, height, 3 do
  28.         for j = 1, lenght, 3 do
  29.             local thisChar = string.char(char)
  30.  
  31.             local temp = {}
  32.             temp[1] = rawFont[1][i]:sub(j, j + 2)
  33.             temp[2] = rawFont[1][i + 1]:sub(j, j + 2)
  34.             temp[3] = rawFont[1][i + 2]:sub(j, j + 2)
  35.  
  36.             local temp2 = {}
  37.             temp2[1] = rawFont[2][i]:sub(j, j + 2)
  38.             temp2[2] = rawFont[2][i + 1]:sub(j, j + 2)
  39.             temp2[3] = rawFont[2][i + 2]:sub(j, j + 2)
  40.  
  41.             firstFont[thisChar] = {temp, temp2}
  42.             char = char + 1
  43.         end
  44.     end
  45.     fonts[1] = firstFont
  46. end
  47.  
  48. local function generateFontSize(size,yeld)
  49.     local inverter = {["0"] = "1", ["1"] = "0"} --:gsub("[01]",inverter)
  50.     if size<= #fonts then return true end
  51.     for f = #fonts+1, size do
  52.         --automagicly make bigger fonts using firstFont and fonts[f-1].
  53.         local nextFont = {}
  54.         local lastFont = fonts[f - 1]
  55.         for char = 0, 255 do
  56.             local thisChar = string.char(char)
  57.             --sleep(0) print(f,thisChar)
  58.  
  59.             local temp = {}
  60.             local temp2 = {}
  61.  
  62.             local templateChar = lastFont[thisChar][1]
  63.             local templateBack = lastFont[thisChar][2]
  64.             for i = 1, #templateChar do
  65.                 local line1, line2, line3, back1, back2, back3 = {}, {}, {}, {}, {}, {}
  66.                 for j = 1, #templateChar[1] do
  67.                     local currentChar = firstFont[templateChar[i]:sub(j, j)][1]
  68.                     table.insert(line1, currentChar[1])
  69.                     table.insert(line2, currentChar[2])
  70.                     table.insert(line3, currentChar[3])
  71.  
  72.                     local currentBack = firstFont[templateChar[i]:sub(j, j)][2]
  73.                     if templateBack[i]:sub(j, j) == "1" then
  74.                         table.insert(back1, (currentBack[1]:gsub("[01]", inverter)))
  75.                         table.insert(back2, (currentBack[2]:gsub("[01]", inverter)))
  76.                         table.insert(back3, (currentBack[3]:gsub("[01]", inverter)))
  77.                     else
  78.                         table.insert(back1, currentBack[1])
  79.                         table.insert(back2, currentBack[2])
  80.                         table.insert(back3, currentBack[3])
  81.                     end
  82.                 end
  83.                 table.insert(temp, table.concat(line1))
  84.                 table.insert(temp, table.concat(line2))
  85.                 table.insert(temp, table.concat(line3))
  86.                 table.insert(temp2, table.concat(back1))
  87.                 table.insert(temp2, table.concat(back2))
  88.                 table.insert(temp2, table.concat(back3))
  89.             end
  90.  
  91.             nextFont[thisChar] = {temp, temp2}
  92.             if yeld then yeld = "Font"..f.."Yeld"..char os.queueEvent(yeld) os.pullEvent(yeld) end
  93.         end
  94.         fonts[f] = nextFont
  95.     end
  96.     return true
  97. end
  98.  
  99. generateFontSize(3,false)
  100.  
  101. --## Use pre-generated fonts instead of old code above.
  102.  
  103. --local fonts = {}
  104.  
  105. local tHex = {[ colors.white ] = "0", [ colors.orange ] = "1", [ colors.magenta ] = "2", [ colors.lightBlue ] = "3", [ colors.yellow ] = "4", [ colors.lime ] = "5", [ colors.pink ] = "6", [ colors.gray ] = "7", [ colors.lightGray ] = "8", [ colors.cyan ] = "9", [ colors.purple ] = "a", [ colors.blue ] = "b", [ colors.brown ] = "c", [ colors.green ] = "d", [ colors.red ] = "e", [ colors.black ] = "f"}
  106.  
  107. --# Write data on terminal in specified location.
  108. local function stamp(tTerminal, tData, nX, nY)
  109.  
  110.     local oX, oY = tTerminal.getSize()
  111.     local cX, cY = #tData[1][1], #tData[1]
  112.     nX = nX or math.floor((oX - cX) / 2) + 1
  113.     nY = nY or math.floor((oY - cY) / 2) + 1
  114.  
  115.     for i = 1, cY do
  116.         if i > 1 and nY + i - 1 > oY then term.scroll(1) nY = nY - 1 end
  117.         tTerminal.setCursorPos(nX, nY + i - 1)
  118.         tTerminal.blit(tData[1][i], tData[2][i], tData[3][i])
  119.     end
  120. end
  121.  
  122. --# Generate data from strings for data and colors.
  123. local function makeText(nSize, sString, nFC, nBC, bBlit)
  124.     if not type(sString) == "string" then error("Not a String") end
  125.     local cFC = type(nFC) == "string" and nFC:sub(1, 1) or tHex[nFC] or error("Wrong Front Color")
  126.     local cBC = type(nBC) == "string" and nBC:sub(1, 1) or tHex[nBC] or error("Wrong Back Color")
  127.     local font = fonts[nSize] or error("Wrong font size selected")
  128.  
  129.     local input = {}
  130.     for i in sString:gmatch('.') do table.insert(input, i) end
  131.  
  132.     local tText = {}
  133.     local height = #font[input[1]][1]
  134.  
  135.  
  136.     for nLine = 1, height do
  137.         local outLine = {}
  138.         for i = 1, #input do
  139.             outLine[i] = font[input[i]] and font[input[i]][1][nLine] or ""
  140.         end
  141.         tText[nLine] = table.concat(outLine)
  142.     end
  143.  
  144.     local tFront = {}
  145.     local tBack = {}
  146.     local tFrontSub = {["0"] = cFC, ["1"] = cBC}
  147.     local tBackSub = {["0"] = cBC, ["1"] = cFC}
  148.  
  149.     for nLine = 1, height do
  150.         local front = {}
  151.         local back = {}
  152.         for i = 1, #input do
  153.             local template = font[input[i]] and font[input[i]][2][nLine] or ""
  154.             front[i] = template:gsub("[01]", bBlit and {["0"] = nFC:sub(i, i), ["1"] = nBC:sub(i, i)} or tFrontSub)
  155.             back[i] = template:gsub("[01]", bBlit and {["0"] = nBC:sub(i, i), ["1"] = nFC:sub(i, i)} or tBackSub)
  156.         end
  157.         tFront[nLine] = table.concat(front)
  158.         tBack[nLine] = table.concat(back)
  159.     end
  160.  
  161.     return {tText, tFront, tBack}
  162. end
  163.  
  164. --# Writing in big font using current terminal settings.
  165. b.bigWrite = function(sString)
  166.     stamp(term, makeText(1, sString, term.getTextColor(), term.getBackgroundColor()), term.getCursorPos())
  167.     local x, y = term.getCursorPos()
  168.     term.setCursorPos(x, y - 2)
  169. end
  170.  
  171. b.bigBlit = function(sString, sFront, sBack)
  172.     stamp(term, makeText(1, sString, sFront, sBack, true), term.getCursorPos())
  173.     local x, y = term.getCursorPos()
  174.     term.setCursorPos(x, y - 2)
  175. end
  176.  
  177. b.bigPrint = function(sString)
  178.     stamp(term, makeText(1, sString, term.getTextColor(), term.getBackgroundColor()), term.getCursorPos())
  179.     print()
  180. end
  181.  
  182. --# Writing in huge font using current terminal settings.
  183. b.hugeWrite = function(sString)
  184.     stamp(term, makeText(2, sString, term.getTextColor(), term.getBackgroundColor()), term.getCursorPos())
  185.     local x, y = term.getCursorPos()
  186.     term.setCursorPos(x, y - 8)
  187. end
  188.  
  189. b.hugeBlit = function(sString, sFront, sBack)
  190.     stamp(term, makeText(2, sString, sFront, sBack, true), term.getCursorPos())
  191.     local x, y = term.getCursorPos()
  192.     term.setCursorPos(x, y - 8)
  193. end
  194.  
  195. b.hugePrint = function(sString)
  196.     stamp(term, makeText(2, sString, term.getTextColor(), term.getBackgroundColor()), term.getCursorPos())
  197.     print()
  198. end
  199.  
  200. --# Write/blit string on terminal in specified location
  201. b.writeOn = function(tTerminal, nSize, sString, nX, nY)
  202.     stamp(tTerminal, makeText(nSize, sString, tTerminal.getTextColor(), tTerminal.getBackgroundColor()), nX, nY)
  203. end
  204.  
  205. b.blitOn = function(tTerminal, nSize, sString, sFront, sBack, nX, nY)
  206.     stamp(tTerminal, makeText(nSize, sString, sFront, sBack, true), nX, nY)
  207. end
  208.  
  209. --# Generate blittle object in blittle format for printing with that api.
  210. b.makeBlittleText = function(nSize, sString, nFC, nBC)
  211.     local out = makeText(nSize, sString, nFC, nBC)
  212.     out.height = #out[1]
  213.     out.width = #out[1][1]
  214.     return out
  215. end
  216.  
  217. --# Calculate higher size fonts
  218. b.generateFontSize = function(size)
  219.     if type(size) ~= "number" then error("Size need to be a number") end
  220.     if size > 6 then return false end
  221.     return generateFontSize(math.floor(size),true)
  222. end
  223.  
  224. --### Finalizing
  225. return b
RAW Paste Data