Pinkishu

Untitled

Aug 8th, 2012
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 17.14 KB | None | 0 0
  1. --  -------- Mozilla Firefox
  2. --  -------- Created by 1lann
  3. --  -------- Edited by GravityScore
  4.  
  5. function firefoxVersion()
  6.     return "1.3.2"
  7. end
  8.  
  9. --  -------- Variables
  10.  
  11. autoUpdate = true
  12. firefoxTitle = "Mozilla Firefox " .. firefoxVersion()
  13. firefoxServerTitle = "Firefox Server " .. firefoxVersion()
  14.  
  15. local x, y = term.getSize()
  16. local bDatabase = {}
  17. local bvIDs = {}
  18. local bvAddresses = {}
  19. local bType = nil
  20. exitFirefox = false
  21. local firsttime = true
  22. local title = firefoxTitle
  23.  
  24. local root = "/.FirefoxData"
  25. local blacklistLoc = root .. "/firefox_blacklist"
  26. local whitelistLoc = root .. "/firefox_whitelist"
  27.  
  28. function securityError(sec)
  29.     print("SECURITY ERROR: "..sec)
  30.     shell.exit()
  31.     print("SECURITY ERROR: "..sec)
  32. end
  33.  
  34. local secureEnv = {}
  35. secureEnv.fs = {}
  36. secureEnv.fs.open = function() securityError("fs.open") end
  37. secureEnv.io = {}
  38. secureEnv.io.open = function() securityError("io.open") end
  39. setmetatable(secureEnv.fs,{__index=fs})
  40. setmetatable(secureEnv.io,{__index=io})
  41. setmetatable(secureEnv,{__index=_G})
  42.  
  43. --Open Rednet
  44. rednet.open("top")
  45. rednet.open("left")
  46. rednet.open("right")
  47. rednet.open("back")
  48. rednet.open("front")
  49. rednet.open("bottom")
  50.  
  51. --  -------- Functions
  52.  
  53. local function prompt(list, dir)
  54.     --Variables
  55.     local curSel = 1
  56.     local c1 = 200
  57.     local c2 = 208
  58.     if dir == "horizontal" then c1 = 203 c2 = 205 end
  59.    
  60.     --Draw words
  61.     for i = 1, #list do
  62.         if list[i][2] == 1 then list[i][2] = 2
  63.         elseif list[i][2] + string.len(list[i][1]) >= 50 then
  64.             list[i][2] = 49 - string.len(list[i][1])
  65.         end
  66.        
  67.         term.setCursorPos(list[i][2], list[i][3])
  68.         write(list[i][1])
  69.     end
  70.    
  71.     --Functions
  72.     local function drawArrows(word, x, y)
  73.         --Draw arrows
  74.         term.setCursorPos(x, y)
  75.         write("[")
  76.         term.setCursorPos(x + 1 + string.len(word), y)
  77.         write("]")
  78.     end
  79.    
  80.     local function removeArrows(word, x, y)
  81.         --Remove current arrows
  82.         term.setCursorPos(x, y)
  83.         write(" ")
  84.         term.setCursorPos(x + 1 + string.len(word), y)
  85.         write(" ")
  86.     end
  87.    
  88.     --Draw arrows
  89.     drawArrows(list[curSel][1], list[curSel][2] - 1, list[curSel][3])
  90.    
  91.     --Start loop
  92.     while true do
  93.         --Get the key
  94.         local event, key = os.pullEvent("key")
  95.        
  96.         --Remove arrows
  97.         removeArrows(list[curSel][1], list[curSel][2] - 1, list[curSel][3])
  98.        
  99.         if key == c1 then
  100.             --Subtract
  101.             if curSel ~= 1 then
  102.                 curSel = curSel - 1
  103.             end
  104.         elseif key == c2 then
  105.             --Add
  106.             if curSel ~= #list then
  107.                 curSel = curSel + 1
  108.             end
  109.         elseif key == 28 then
  110.             --Enter
  111.             return list[curSel][1]
  112.         end
  113.        
  114.         --Draw Arrows
  115.         drawArrows(list[curSel][1], list[curSel][2] - 1, list[curSel][3])
  116.     end
  117. end
  118.  
  119. function getPastebin(pCode, pLocation)
  120.     -- Get from pastebin
  121.     local response = http.get("http://pastebin.com/raw.php?i=" .. textutils.urlEncode(pCode))
  122.  
  123.     if response then
  124.         local sResponse = response.readAll()
  125.         response.close()
  126.        
  127.         local file = fs.open(pLocation, "w")
  128.         file.write(sResponse)
  129.         file.close()
  130.     end
  131. end
  132.  
  133. function debug(debugmsg)
  134.     -- Print a debug message
  135.     term.setCursorPos(1,1)
  136.     term.clearLine()
  137.     write(debugmsg)
  138.     sleep(0.1)
  139. end
  140.  
  141. function isVerified(vWebsite, vID)
  142.     -- Verify an ID
  143.     for i = 1, #bvAddresses do
  144.         if vWebsite == string.lower(bvAddresses[i]) then
  145.             if tostring(vID) == bvIDs[i] then
  146.                 return "good"
  147.             else
  148.                 return "bad"
  149.             end
  150.         end
  151.     end
  152.  
  153.     return "unknown"
  154. end
  155.  
  156. function getDatabase()
  157.     -- Get database from pastebin
  158.     getPastebin("KL3WwmER", root .. "/fireDatabase")
  159.     getPastebin("GC4HK1We", root .. "/fireVerified")
  160.  
  161.     local f = io.open(root .. "/fireDatabase", "r")
  162.     bDatabase = {}
  163.     for readData in f:lines() do
  164.         table.insert(bDatabase, readData)
  165.     end
  166.     f:close()
  167.  
  168.     f = io.open(root .. "/fireVerified", "r")
  169.     bvIDs = {}
  170.     bvAddresses = {}
  171.     bType = "url"
  172.     for readData in f:lines() do
  173.         if bType == "url" then
  174.             table.insert(bvAddresses, readData)
  175.             bType = "id"
  176.         else
  177.             table.insert(bvIDs, readData)
  178.             bType = "url"
  179.         end
  180.     end
  181.     f:close()
  182.  
  183.     if not(fs.exists(blacklistLoc)) then
  184.         f = io.open(blacklistLoc, "w") f:write("\n") f:close()
  185.     else
  186.         f = io.open(blacklistLoc, "r")
  187.         for readData in f:lines() do
  188.             table.insert(bDatabase, readData)
  189.         end
  190.         f:close()
  191.     end
  192.  
  193.     if not fs.exists(whitelistLoc) then
  194.         f = io.open(whitelistLoc, "w") f:write("\n") f:close()
  195.     else
  196.         bType = "url"
  197.         f = io.open(whitelistLoc, "r")
  198.         local x = 1
  199.         local bnLines = 0
  200.         for readData in f:lines() do
  201.             bnLines = bnLines+1
  202.             if bType == "url" then
  203.                 table.insert(bvAddresses, readData)
  204.                 bType = "id"
  205.             else
  206.                 table.insert(bvIDs, readData)
  207.                 bType = "url"
  208.             end
  209.         end
  210.         f:close()
  211.         if #bvAddresses > #bvIDs then table.remove(bvAddresses, #bvAddresses)
  212.         elseif #bvAddresses < #bvIDs then table.remove(bvIDs, #bvIDs) end
  213.     end
  214.  
  215.     return (bDatabase)
  216. end
  217.  
  218. function isBad(number)
  219.     for i = 1, #bDatabase do
  220.         if tostring(number) == bDatabase[i] then
  221.             return true
  222.         end
  223.     end
  224.  
  225.     return false
  226. end
  227.  
  228. function dbContains(object, dbase)
  229.     for i = 1, #dbase do
  230.         if tostring(object) == dbase[i] then
  231.             return true, i
  232.         end
  233.     end
  234.  
  235.     return false
  236. end
  237.  
  238. function checkMalicious()
  239.     local suspected = {}
  240.     local times = {}
  241.     for i = 1, 5 do
  242.         rednet.broadcast(tostring(math.random(1, 9001)))
  243.         startClock = os.clock()
  244.         while os.clock() - startClock < 0.05 do
  245.             local a = rednet.receive(0.01)
  246.             if a ~= nil then
  247.                 dbState, dbPos = dbContains(a, suspected)
  248.                 if isBad(a) then
  249.                 elseif not dbState then
  250.                     table.insert(suspected, tostring(a))
  251.                     table.insert(times, 1)
  252.                     break
  253.                 else
  254.                     local newTimes = times[dbPos] + 1
  255.                     times[dbPos] = newTimes
  256.                 end
  257.             end
  258.         end
  259.     end
  260.  
  261.     for i =1, #suspected do
  262.         if times[i] > 2 then
  263.             f = io.open(blacklistLoc, "a")
  264.             f:write(suspected[i] .. "\n")
  265.             f:close()
  266.             table.insert(bDatabase, suspected[i])
  267.         end
  268.     end
  269. end
  270.  
  271. if not fs.exists(root) then
  272.     fs.makeDir(root)
  273.     fs.makeDir(root .. "/cache")
  274. elseif not fs.isDir(root) then
  275.     fs.delete(root)
  276.     fs.makeDir(root)
  277.     fs.makeDir(root .. "/cache")
  278. end
  279.  
  280. if fs.exists("/fireverify") then fs.move("/fireverify", whitelistLoc) end
  281. if fs.exists("/firelist") then fs.move("/firelist", blacklistLoc) end
  282. if fs.exists("/firefox_whitelist") then fs.move("/firefox_whitelist", whitelistLoc) end
  283. if fs.exists("/firefox_blacklist") then fs.move("/firefox_blacklist", blacklistLoc) end
  284. if fs.exists("/.fireServerPref") then fs.move("/.fireServerPref", root .. "/fireServerPref") end
  285.  
  286. local website = "home"
  287. fs.delete("/.fireDatabase")
  288. fs.delete("/.fireVerify")
  289.  
  290. function centerPrint(text)
  291.     local x2, y2 = term.getCursorPos()
  292.     term.setCursorPos(math.ceil((x / 2) - (text:len() / 2)), y2)
  293.     print(text)
  294. end
  295.  
  296. function reDirect(url)
  297.     website = url
  298.     loadWebpage()
  299. end
  300.  
  301. function setTitle(tToSet)
  302.     title = tToSet
  303.     if title == nil then
  304.         title = firefoxTitle
  305.     end
  306.  
  307.     term.setCursorPos(1,1)
  308.     term.clearLine()
  309.     centerPrint(title)
  310.     term.setCursorPos(1,2)
  311.     term.clearLine()
  312.     centerPrint("rdnt://" .. website .. "\n")
  313. end
  314.  
  315. local function createSite(websitename)
  316.     term.clear()
  317.     term.setCursorPos(1, 2)
  318.     print("Creating Site: " .. websitename)
  319.     print("Please Wait...")
  320.     f = io.open(root .. "/fireServerPref", "w")
  321.     f:write(websitename)
  322.     f:close()
  323.     getPastebin("wEmK4D4U", root .. "/firefoxServerUpdater")
  324.     shell.run(root .. "/firefoxServerUpdater")
  325.     exitFirefox = true
  326.     error()
  327. end
  328.  
  329. function loadWebpage()
  330.     if exitFirefox then error() end
  331.     term.clear()
  332.     term.setCursorPos(1,1)
  333.     title = firefoxTitle
  334.     centerPrint(title)
  335.     website = string.lower(website)
  336.     centerPrint("rdnt://" ..website.. "\n")
  337.  
  338.     if website == "home" then
  339.         if firsttime then
  340.             term.clear()
  341.             term.setCursorPos(1, 4)
  342.             print("                _____  _   ______   _____ ")
  343.             print("       ~~~~~~~ / ___/ / / / _   /  / ___/ ")
  344.             print("       ------ / /__  / / / /_/ /  / /_    ")
  345.             print("       ~~~~~ / ___/ / / / _  _/  / __/    ")
  346.             print("       ---- / /    / / / / \\ \\  / /___  ")
  347.             print("       ~~~ / /    /_/ /_/   \\_\\/_____/  ")
  348.             print("       -- / /  _,-=._              /|_/|  ")
  349.             print("       ~ /_/  `-.}   `=._,.-=-._.,  @ @._,")
  350.             print("                 `. _ _,-.   )      _,.-' ")
  351.             print("                          G.m-\"^m`m'     ")
  352.             print(" ")
  353.             print("        Mozilla Firefox is Now Loading... ")
  354.             sleep(0.1)
  355.  
  356.             if autoUpdate then
  357.                 getPastebin("ppnsSi26", root .. "/firefoxClientUpdate")
  358.                 local f = io.open(root .. "/firefoxClientUpdate", "r")
  359.                 clientUpdate = f:read("*a")
  360.                 f:close()
  361.  
  362.                 local ff = io.open("/firefox")
  363.                 currentClient = ff:read("*a")
  364.                 ff:close()
  365.  
  366.                 if not(currentClient == clientUpdate) then
  367.                     fs.delete("/firefox")
  368.                     fs.move(root .. "/firefoxClientUpdate", "/firefox")
  369.                     shell.run("/firefox")
  370.                     error()
  371.                 end
  372.             end
  373.  
  374.             firsttime = false
  375.         end
  376.  
  377.         term.clear()
  378.         term.setCursorPos(1, 1)
  379.         centerPrint(title)
  380.         centerPrint("rdnt://" ..website.. "\n")
  381.         centerPrint("Welcome to Mozilla Firefox " .. firefoxVersion())
  382.         print(" ")
  383.  
  384.         if autoUpdate then
  385.             print(" Auto Updating is On")
  386.         else
  387.             print(" Auto Updating is Off")
  388.         end
  389.  
  390.         print(" ")
  391.         print(" Useful Websites:")
  392.         print(" - rdnt://exit To Exit")
  393.         print(" - rdnt://help For Help on Black/Whitelisting")
  394.         print(" - rdnt://update to Force Update Firefox")
  395.         print(" - rdnt://newsite to Make a New Website")
  396.         print(" - rdnt://credits to View Credits")
  397.     elseif website == "exit" then
  398.         term.clear()
  399.         term.setCursorPos(1,1)
  400.         print("Thank you for using Firefox!")
  401.         sleep(0.3)
  402.  
  403.         exitFirefox = true
  404.         return
  405.     elseif website == "update" then
  406.         centerPrint("Force Update Firefox?")
  407.         print(" ")
  408.         local o = prompt({{"Yes", 11, 8}, {"No", 36, 8}},  "horizontal")
  409.         if o == "Yes" then
  410.             term.setCursorPos(1,1)
  411.             term.clear()
  412.             centerPrint(title)
  413.             centerPrint("rdnt://" ..website.. "\n")
  414.             centerPrint("Updating...")
  415.             getPastebin("ppnsSi26", "/firefox")
  416.             term.clear()
  417.             term.setCursorPos(1,1)
  418.             centerPrint(title)
  419.             centerPrint("rdnt://" ..website.. "\n")
  420.             centerPrint("Firefox Has Been Updated")
  421.             centerPrint("Press Any Key to Restart Firefox")
  422.             os.pullEvent("key")
  423.             shell.run("/firefox")
  424.             error()
  425.         else
  426.             term.clear()
  427.             term.setCursorPos(1,1)
  428.             centerPrint(title)
  429.             centerPrint("rdnt://" ..website.. "\n")
  430.             centerPrint("Cancelled")
  431.         end
  432.     elseif website == "help" then
  433.         term.setCursorPos(1, 4)
  434.         print(" Help for Black and Whitelists:")
  435.         print(" - Lists are stored in /.FirefoxData")
  436.         print(" - To Add a Server to the Blacklist:")
  437.         print("   - Enter the ID of the server you wish to block")
  438.         print("   - Example:")
  439.         print("   135")
  440.         print(" - To Add a Server to the Whitelist:")
  441.         print("   - Enter the server's URL on the first line")
  442.         print("   - Enter the server's ID on the next line")
  443.         print("   - Example:")
  444.         print("   mozilla")
  445.         print("   175")
  446.     elseif website == "clear" then
  447.         reDirect("home")
  448.     elseif website == "credits" then
  449.         term.setCursorPos(1, 4)
  450.         print(" Firefox Credits:")
  451.         print(" - Programmed by 1lann")
  452.         print(" - Designed and Edited by GravityScore")
  453.         print(" ")
  454.         print(" - Based off Rednet Explorer v2.4.1,")
  455.         print(" - Which is made by xXm0dzXx and CCFan11")
  456.     elseif website == "newsite" then
  457.         term.setCursorPos(1, 4)
  458.         centerPrint("Use This Computer as a Website Server?")
  459.         local k = prompt({{"Yes", 11, 6}, {"No", 36, 6}}, "horizontal")
  460.        
  461.         if k == "Yes" then
  462.             term.clear()
  463.             term.setCursorPos(1, 1)
  464.             title = firefoxServerTitle
  465.             centerPrint(title)
  466.             print(" ")
  467.  
  468.             if fs.exists(root .. "/fireServerPref") then
  469.                 f = io.open(root .. "/fireServerPref", "r")
  470.                 websitename = f:read("*l")
  471.                 f:close()
  472.  
  473.                 if fs.isDir("/" .. websitename) then
  474.                     centerPrint("A Previous Server Setup has Been Detected")
  475.                     centerPrint("For: " .. websitename)
  476.                     centerPrint("Use This Setup?")
  477.                     local opt = prompt({{"Yes", 11, 9}, {"No", 36, 9}}, "horizontal")
  478.  
  479.                     if opt == "Yes" then
  480.                         createSite(websitename)
  481.                     end
  482.                 end
  483.             end
  484.  
  485.             term.clear()
  486.             term.setCursorPos(1, 1)
  487.             centerPrint(title)
  488.             term.setCursorPos(2, 4)
  489.             write("Website Name: ")
  490.             websitename = read()
  491.             f = io.open(root .. "/fireServerPref", "w")
  492.             f:write(websitename)
  493.             f:close()
  494.  
  495.             term.clear()
  496.             term.setCursorPos(1, 1)
  497.             centerPrint(title .. "\n")
  498.                
  499.             if fs.exists("/" .. websitename) then
  500.                 if not(fs.isDir("/" .. websitename)) then
  501.                     fs.move("/" .. websitename, root .. "/firefoxtemphome")
  502.                     fs.makeDir("/" .. websitename)
  503.                     fs.move(root .. "/firefoxtemphome", "/" .. websitename .. "/home")
  504.                     print(" An Old Website Has Been Detected")
  505.                     print(" It Has Been Moved To: ")
  506.                     print(" /" .. websitename .. "/home")
  507.                     print(" ")
  508.                 end
  509.             else
  510.                 fs.makeDir("/" .. websitename)
  511.             end
  512.  
  513.             rednet.broadcast(string.lower(websitename))
  514.             local i, me = rednet.receive(0.5)
  515.             if i ~= nil then
  516.                 print(" WARNING: This Domain Name May Already Be In Use")
  517.                 print(" ")
  518.             end
  519.  
  520.             print(" The Website Files can be Found In:")
  521.             print(" /" .. websitename)
  522.             print(" The Homepage is Located At:")
  523.             print(" /" .. websitename .. "/home")
  524.             print(" ")
  525.  
  526.             print(" Edit the Homepage of the Website?")
  527.             local o = prompt({{"Yes", 11, 14}, {"No", 36, 14}}, "horizontal")
  528.             if o == "Yes" then
  529.                 shell.run("/rom/programs/edit", "/" .. websitename .. "/" .. "home")
  530.             elseif o == "No" then
  531.                 if not fs.exists("/" .. websitename .. "/" .. "home") then
  532.                     local f = io.open("/" .. websitename .. "/" .. "home", "w")
  533.                     f:write("print(\" \")\nprint(\"Welcome to " .. websitename .. "\")")
  534.                 end
  535.                 f:close()
  536.             end
  537.            
  538.             term.clear()
  539.             term.setCursorPos(1, 1)
  540.             createSite(websitename)
  541.         end
  542.     else
  543.         title = firefoxTitle
  544.         term.clear()
  545.         term.setCursorPos(1, 1)
  546.         centerPrint(title)
  547.         centerPrint("rdnt://" ..website.. "\n")
  548.         print(" Connecting to Website...")
  549.         checkMalicious()
  550.         rednet.broadcast(website)
  551.         if string.find(website, "/") then
  552.             fWebsite = string.gsub(website, "/", "$slazh$")
  553.         else
  554.         fWebsite = website
  555.         end
  556.  
  557.         local website1 = root .. "/cache/" .. fWebsite
  558.         local startClock = os.clock()
  559.         while os.clock() - startClock < 0.05 do
  560.             id, message = rednet.receive(0.01)
  561.             vResult = isVerified(website, id)
  562.             if vResult == "bad" then message = nil
  563.             elseif vResult == "good" then break
  564.             elseif vResult == "unknown" and isBad(id) == false then break
  565.             else message = nil
  566.             end
  567.         end
  568.  
  569.         if message == nil then
  570.             if fs.exists(website1) then
  571.                 term.clear()
  572.                 term.setCursorPos(1, 1)
  573.                 centerPrint(title)
  574.                 centerPrint("rdnt://" ..website.. "\n")
  575.                 centerPrint("Unable to Connect to Website")
  576.                 centerPrint("Resort to Cached Version?")
  577.                 local o = prompt({{"Yes", 11, 8}, {"No", 36, 8}}, "horizontal")
  578.                 if o == "Yes" then
  579.                     term.clear()
  580.                     term.setCursorPos(1, 1)
  581.                     centerPrint(title)
  582.                     centerPrint("rdnt://" ..website.. "\n")
  583.                     shell.run(website1)
  584.  
  585.                     if exitFirefox then
  586.                         error()
  587.                     end
  588.                 elseif o == "No" then
  589.                     term.clear()
  590.                     term.setCursorPos(1, 1)
  591.                     centerPrint(title)
  592.                     centerPrint("rdnt://" ..website.. "\n")
  593.                     centerPrint(" _____                         _ ")
  594.                     centerPrint("|  ___|                       | |")
  595.                     centerPrint("| |__  _ __  _ __  ___   _ __ | |")
  596.                     centerPrint("|  __|| '__|| '__|/ _ \\ | '__|| |")
  597.                     centerPrint("| |___| |   | |  | (_) || |   |_|")
  598.                     centerPrint("\\____/|_|   |_|   \\___/ |_|   (_)")
  599.                     print(" ")
  600.                     centerPrint("Unable to Connect to Website")
  601.                     centerPrint("The Website May Be Down or Blocked")
  602.                 end
  603.             else
  604.                 term.clear()
  605.                 term.setCursorPos(1, 1)
  606.                 centerPrint(title)
  607.                 centerPrint("rdnt://" ..website.. "\n")
  608.                
  609.                 centerPrint(" _____                         _ ")
  610.                 centerPrint("|  ___|                       | |")
  611.                 centerPrint("| |__  _ __  _ __  ___   _ __ | |")
  612.                 centerPrint("|  __|| '__|| '__|/ _ \\ | '__|| |")
  613.                 centerPrint("| |___| |   | |  | (_) || |   |_|")
  614.                 centerPrint("\\____/|_|   |_|   \\___/ |_|   (_)")
  615.                 print(" ")
  616.                 centerPrint("Unable to Connect to Website")
  617.                 centerPrint("The Website May Be Down or Blocked")
  618.             end
  619.         else
  620.             if fs.exists(website1) then fs.delete(website1) end
  621.             local webpage = io.open(website1, "w")
  622.             webpage:write(message)
  623.             webpage:close()
  624.  
  625.             term.clear()
  626.             term.setCursorPos(1, 1)
  627.             centerPrint(title)
  628.             centerPrint("rdnt://" ..website.. "\n")
  629.             local function runSecure = function(website1) shell.run(website1)  end
  630.             setfenv(runSecure,secureEnv)
  631.             runSecure(website1)
  632.             --shell.run(website1)
  633.  
  634.             if exitFirefox then
  635.                 error()
  636.             end
  637.         end
  638.     end
  639.    
  640.     if exitFirefox then error() end
  641.     os.queueEvent("firefoxDoneLoading")
  642.     term.setCursorPos(1, y)
  643.    
  644.     local name = "F5 to Refresh"
  645.     write("Control to Surf the Web")
  646.     term.setCursorPos(x - name:len(), y)
  647.     write(name)
  648.    
  649.     while true do
  650.         local e, k = os.pullEvent("key")
  651.         if k == 63 then
  652.             loadWebpage()
  653.             break
  654.         elseif k == 29 then
  655.             term.setCursorPos(1,2)
  656.             term.clearLine()
  657.             write("rdnt://")
  658.             website = read()
  659.             loadWebpage()
  660.             break
  661.         end
  662.     end
  663. end
  664.  
  665. function autoDatabase()
  666.     while true do
  667.         local aDE = os.pullEvent()
  668.         if aDE == "firefoxDoneLoading" then
  669.             getDatabase()
  670.         end
  671.     end
  672. end
  673.  
  674. parallel.waitForAny(autoDatabase, loadWebpage)
Advertisement
Add Comment
Please, Sign In to add comment