And now let’s see how they relate to web applications. We all have to deal with customers. I personally believe that the customer is not a person, the client is a state of mind. This is a man who came to graduation nude. Whether you’re designing web sites, or simply carrying out penetration tests, very often the client wants tangible evidence that we were able to correctly perform a process. Often, this is after our work is found in disbelief by a customer or our opinion is undermined by someone from outside. How can I prevent this? Well, this article is an attempt to answer these questions. And again, we will learn a few new tools that make our lives easier. Automated web application testing primarily facilitates the creation of documentation, both in penetration testing and web application writing. They allow you to run any browser and allow it to automatically come quietly on the page, add a comment, just log in, or anything else. There are much better ways of penetration test documentation than the standard methods, such as writing a report on the tests. They simply demonstrate the tangible result of our actions. The customer can see that the page contains errors and that it can be actually very easy to manipulate because the scripts are full of holes. XPath, the XML manipulation using a web browser When using the syntax of web pages we have two choices. We can refer directly to HTML or XHTML, and we can also use XPath. It’s hard to determine which solution is better, all in all I think both are just as good, but if there is a tree of DOM elements, it is much better to use XPath. A full description of the XPath can be found at http://www.w3.org/TR/xpath/, but we are at the beginning with only the basics. Indicate the XPath node or set of nodes using the path location. This path is in turn made up of one or more location steps separated from each other with / or / /. If the path begins with a /, we call it an absolute path as it gives the full path to the root node. Otherwise, call it a relative path, it starts from the current context node named node. For Firefox, I found a few extras perfectly suited to the demonstration of XPath. I liked most FirePath features. You can download it from the https://addons.mozilla.org/en-US/firefox/addon/firepath/. In addition, the FireBug installed. It is a tool for analyzing and editing the application source code. FireBug is located at https://addons.mozilla.org/pl/firefox/addon/firebug/. After the installation of these two supplements, an additional button appears:

Running FireBug, the window looks like this:

If we take the tree DOM elements for a site we know, the situation looks like this: FireBug can also show you what was taken and where. Here is a screen demonstrating our favorite site:

FireBug is a great tool for manual analysis of web pages. However, it does not allow automatic analysis. But thanks to FireBug when developing applications, we know what we have to look for and where. FireBug also is a very intuitive and very transparent tool. Introduction to Automation – Selenium IDE Selenium is a tool for automated testing. It lets you record and read tests, and import them into a variety of formats, such as C # or Java, so that later they could fire on a single mouse click. Selenium for Firefox can be downloaded here: http://seleniumhq.org/projects/ide/. It is available as a separate server or library in addition to Firefox. After running Selenium IDE, it looks as follows:

Why are we so caught up in Selenium IDE? Because in reality it is really a very simple tool to take full control of the web pages. it allows you to automate many operations and test the correctness of their use. If we have to deal with some event whose effects are predictable, and it is fully reproducible, and we do it every day, why not allow Selenium to do it for us? Selenium also allows easy recording and playback functions, so you automate almost everything. Thanks to automated steps in the code, this includes even Ruby on Rails, without knowing the language. All you have to write is the appropriate test and Selenium will do it all for us, in such a way that it will look like we are doing it with the mouse. Best of all, Selenium allows you to record your activities on the Web page, and then recreate it by clicking only one button. With Selenium you can even test Web applications, while having no idea about programming. I let each one test record. Here are the steps that I made: First I typed the page address https://www.infosecinstitute.com/?utm_source=resources&utm_medium=infosec%20network&utm_campaign=fallback&utm_content=hyperlink. Second I walked by clicking on the link to the http://resources.infosecintitute.com Third, I chose your article on cryptographic libraries. The Selenium looks like this:

When you click on the button “Play entire test suite” Selenium can do it automatically for you. Here’s what happened:

And it looks like our test source code, written in HTML: [plain] <! DOCTYPE html PUBLIC “- / / W3C / / DTD XHTML 1.0 Strict / / EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

New Test </ title> </ Head> <body> <table border="1"> cellpadding="1" cellspacing="1" <thead> <td <tr> rowspan="1" colspan="3"> New Test </ td> </ tr> </ Thead> <tbody> <tr> <td> open </ td> <td> / </ td> <td> </ td> </ Tr> <tr> <td> clickAndWait </ td> <td> link = InfoSec Resources </ td> <td> </ td> </ Tr> <tr> <td> click </ td> <td> css = a [title = "A Review of Selected Cryptographic Libraries"]> img.attachment-archive-image.wp-post-image </ td> <td> </ td> </ Tr> </ Tbody> </ table> </ Body> </ Html>[/plain] Selenium is a really cool toy in experienced hands. The set of tests which it offers is huge. I do not know how it happened that the tool itself does not have any gigantic proportions, and so can perform a lot of action at the beginning. I did not think it can even be said that testing of applications using Selenium proves that simple. Selenium stores all the information as a Web Object Model. Basic tests using Selenium in Java I am not an advocate of Java or C # only. As in the previous article, we focused on testing using C #, now let’s go for a change in Java. Only first I will introduce the new concept, which is WebDriver. I do not mind using WebDriver with NUnit with Visual Studio or Eclipse with JUnit. WebDriver is really another tool for automated testing of web applications and to check whether they really act in accordance with our expectations. The main objective of WebDriver is really to provide users of this API, which would have been easy for them to understand. In this way, we can make our tests very clear and very simple to maintain. First, get our working environment to work with WebDriver. For this purpose, we need to download both the selenium-server and selenium-client. We can do this by http://seleniumhq.org/download/. Then create a new project in Eclipse with any name. Now you need to join the library. To do this, right click on the project, then select Properties, Java Build Path, Libraries and Add external JARs and add the selenium-java and selenium-server-standalone. The window of Libraries should look then like this: <p>Now we can easily begin to create the first WebDriver. On the “File” menu, select “New class” and fill it with the following wording. This class shows how to add a new comment to the selected article on InfoSec: import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.htmlunit.HtmlUnitDriver; public class MyExample { public static void main(String[] args) { // Create a new instance of the html unit driver WebDriver driver = new HtmlUnitDriver(); // And now use this to visit example article // in InfoSec Institute driver.get(“http:///cryptographic-libraries/”); WebElement element = driver.findElement(By.name(“author”)); element.sendKeys(“Adrian”); WebElement element2 = driver.findElement(By.name(“author”)); element2.sendKeys(“adrian.stolarski@gmail.com”); WebElement element3 = driver.findElement(By.name(“comment”)); element2.sendKeys(“This is a webdriver tests in my article for InfoSec!”); // Now submit the form. WebDriver will find the form for us from the element element.submit(); // Check the title of the page System.out.println(“Page title is: “ + driver.getTitle()); } } See for yourself what it is simple and intuitive. Now think, why, for instance, if we find a MySQL error injection, do not test for it in the form of WebDriver? Or find some XSS and again we can do code documentation using WebDriver. WebDriver also allows you to download the title, keywords, description page, as well as thousands of different things. Now you can go to the Web Object Model. Web Object Model Selenium tests not only allow a single Web application functionality. It also allows you to perform tests using the Web Object Model, which allows testing the use case. In the case of Eclipse, you need to do this is to install TestNG, which is a framework for developing this type of testing. In the case of Eclipse TestNG, installation looks like this: First, start Eclipse by clicking the Eclipse icon in the Eclipse folder that’s mentioned earlier. Second, click on Help-> Install New Softwares. Enter “http://beust.com/eclipse/” in the “Work With” and press Enter. Third, you should see TestNG. Fourth, select it and then press Next till you reach Finish. Fifth, restart Eclipse. Then proceed as in the previous paragraph for Selenium. Add Selenium and we start writing our use case. Here is mine:</p> <p>I want to go to <a href="https://www.infosecinstitute.com/?utm_source=resources&utm_medium=infosec%20network&utm_campaign=fallback&utm_content=hyperlink/">https://www.infosecinstitute.com/?utm_source=resources&utm_medium=infosec%20network&utm_campaign=fallback&utm_content=hyperlink/</a> I want to go to the page / Then I want to go to /cryptographic-libraries/ I want to add a sample comment</p> <p>This time we create a new JUnit Test Case and fill it with the following content: import static org.junit.Assert.<em>; import org.junit.Test; import com.thoughtworks.selenium.</em>; import org.testng.annotations.<em>; import static org.testng.Assert.</em>; import java.util.regex.Pattern; public class SeleniumTest extends SeleneseTestNgHelper {     @Test public void testMyTest() throws Exception {         selenium.open(“/”);         selenium.click(“link=InfoSec Resources”);         selenium.waitForPageToLoad(“30000”);         selenium.click(“css=a[title=”A Review of Selected Cryptographic Libraries”] > img.attachment-archive-image.wp-post-image”);         selenium.type(“id=comment”, “Hi, it’s a example comments use in my article for Selenium and automative web testing. It’s a simple Web Object model test.”);         selenium.click(“id=submit”);         selenium.waitForPageToLoad(“30000”);     } } And so just enjoy all the benefits of a Web Object Model. This is of course not everything, and just a quick introduction. The whole Web Object Model, you can write a whole book. This is really very addictive and offers many possibilities. Look for more on the network on testing web applications using the Web Object Model. And finally, I will show how the same test looks in C #: using System; using System.Text; using System.Text.RegularExpressions; using System.Threading; using NUnit.Framework; using Selenium; namespace SeleniumTests { [TestFixture] public class my { private ISelenium selenium; private StringBuilder verificationErrors; [SetUp] public void SetupTest() { selenium = new DefaultSelenium(“localhost”, 4444, “*chrome”, “https://www.infosecinstitute.com/”); selenium.Start(); verificationErrors = new StringBuilder(); } [TearDown] public void TeardownTest() { try { selenium.Stop(); } catch (Exception) { // Ignore errors if unable to close the browser } Assert.AreEqual(“”, verificationErrors.ToString()); } [Test] public void TheMyTest() {             selenium.Open(“/”);             selenium.Click(“link=InfoSec Resources”);             selenium.WaitForPageToLoad(“30000”);             selenium.Click(“css=a[title=”A Review of Selected Cryptographic Libraries”] > img.attachment-archive-image.wp-post-image”);             selenium.Type(“id=comment”, “Hi, it’s a example comments use in my article for Selenium and automative web testing. It’s a simple Web Object model test.”);             selenium.Click(“id=submit”);             selenium.WaitForPageToLoad(“30000”); } } } Note that both tests are very similar, almost look the same. This is just one of the advantages of using Selenium. It simply does not matter whether we write a test for Java and C #, both tests will look the same. I hope you have fun with writing the test. Summary The main purpose of this article was to show everyone how to use some tools to help you create Web application tests. Thanks to them, we have learned to do a lot better documentation to our own tests, than by the written word. Also I showed how to run selected tests and show them to the client. I bet you that after reading the documentation, there is reliable evidence that the tests were really performed, and the results are not fabricated. Thanks to being written by Selenium and remote control tools such documentation, it will be 100% reproducible for the customer. The test will be able to be fired by any employee thereof, using both Selenium, as well as any Web browser. In addition, I want to note one more thing. A lot of companies recognize that every programmer should be able to design tests using Selenium, and knowledge of the environment is really a huge advantage. In this article, you have an excellent introduction to Selenium and I am sure it will always be useful. This gave me the idea for the next two articles in this series. The first article will be back to the unit tests. I’ll show you a few techniques to create good unit tests that actually assist the software development process. In the second I will show, if I can, how to perform automated testing desktop applications. In the meantime, thank you for your attention and I wish you a nice day!</p> </div> <footer class="post-footer"> <ul class="post-tags"> </ul> <nav class="paginav"> <a class="prev" href="https://pigeonsupernova.pages.dev/posts/cyberpunk-2077-mobile-can-i-play-on-android-or-ios-1600629/"> <span class="title">« Prev</span> <br> <span>Cyberpunk 2077 Mobile Can I Play On Android Or Ios </span> </a> <a class="next" href="https://pigeonsupernova.pages.dev/posts/cyberpunk-2077-improves-on-witcher-3-romance-options1998751/"> <span class="title">Next »</span> <br> <span>Cyberpunk 2077 Improves On Witcher 3 Romance Options</span> </a> </nav> <div class="share-buttons"> <a target="_blank" rel="noopener noreferrer" aria-label="share Creating A Professional Application How To Create Tests Part 5 on twitter" href="https://twitter.com/intent/tweet/?text=Creating%20A%20Professional%20Application%20%20%20How%20To%20Create%20Tests%20%20Part%205%20&url=https%3a%2f%2fpigeonsupernova.pages.dev%2fposts%2fcreating-a-professional-application-how-to-create-tests-part-5-1468805%2f&hashtags="> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-253.927,424.544c135.939,0 210.268,-112.643 210.268,-210.268c0,-3.218 0,-6.437 -0.153,-9.502c14.406,-10.421 26.973,-23.448 36.935,-38.314c-13.18,5.824 -27.433,9.809 -42.452,11.648c15.326,-9.196 26.973,-23.602 32.49,-40.92c-14.252,8.429 -30.038,14.56 -46.896,17.931c-13.487,-14.406 -32.644,-23.295 -53.946,-23.295c-40.767,0 -73.87,33.104 -73.87,73.87c0,5.824 0.613,11.494 1.992,16.858c-61.456,-3.065 -115.862,-32.49 -152.337,-77.241c-6.284,10.881 -9.962,23.601 -9.962,37.088c0,25.594 13.027,48.276 32.95,61.456c-12.107,-0.307 -23.448,-3.678 -33.41,-9.196l0,0.92c0,35.862 25.441,65.594 59.311,72.49c-6.13,1.686 -12.72,2.606 -19.464,2.606c-4.751,0 -9.348,-0.46 -13.946,-1.38c9.349,29.426 36.628,50.728 68.965,51.341c-25.287,19.771 -57.164,31.571 -91.8,31.571c-5.977,0 -11.801,-0.306 -17.625,-1.073c32.337,21.15 71.264,33.41 112.95,33.41Z" /> </svg> </a> <a target="_blank" rel="noopener noreferrer" aria-label="share Creating A Professional Application How To Create Tests Part 5 on linkedin" href="https://www.linkedin.com/shareArticle?mini=true&url=https%3a%2f%2fpigeonsupernova.pages.dev%2fposts%2fcreating-a-professional-application-how-to-create-tests-part-5-1468805%2f&title=Creating%20A%20Professional%20Application%20%20%20How%20To%20Create%20Tests%20%20Part%205%20&summary=Creating%20A%20Professional%20Application%20%20%20How%20To%20Create%20Tests%20%20Part%205%20&source=https%3a%2f%2fpigeonsupernova.pages.dev%2fposts%2fcreating-a-professional-application-how-to-create-tests-part-5-1468805%2f"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-288.985,423.278l0,-225.717l-75.04,0l0,225.717l75.04,0Zm270.539,0l0,-129.439c0,-69.333 -37.018,-101.586 -86.381,-101.586c-39.804,0 -57.634,21.891 -67.617,37.266l0,-31.958l-75.021,0c0.995,21.181 0,225.717 0,225.717l75.02,0l0,-126.056c0,-6.748 0.486,-13.492 2.474,-18.315c5.414,-13.475 17.767,-27.434 38.494,-27.434c27.135,0 38.007,20.707 38.007,51.037l0,120.768l75.024,0Zm-307.552,-334.556c-25.674,0 -42.448,16.879 -42.448,39.002c0,21.658 16.264,39.002 41.455,39.002l0.484,0c26.165,0 42.452,-17.344 42.452,-39.002c-0.485,-22.092 -16.241,-38.954 -41.943,-39.002Z" /> </svg> </a> <a target="_blank" rel="noopener noreferrer" aria-label="share Creating A Professional Application How To Create Tests Part 5 on reddit" href="https://reddit.com/submit?url=https%3a%2f%2fpigeonsupernova.pages.dev%2fposts%2fcreating-a-professional-application-how-to-create-tests-part-5-1468805%2f&title=Creating%20A%20Professional%20Application%20%20%20How%20To%20Create%20Tests%20%20Part%205%20"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-3.446,265.638c0,-22.964 -18.616,-41.58 -41.58,-41.58c-11.211,0 -21.361,4.457 -28.841,11.666c-28.424,-20.508 -67.586,-33.757 -111.204,-35.278l18.941,-89.121l61.884,13.157c0.756,15.734 13.642,28.29 29.56,28.29c16.407,0 29.706,-13.299 29.706,-29.701c0,-16.403 -13.299,-29.702 -29.706,-29.702c-11.666,0 -21.657,6.792 -26.515,16.578l-69.105,-14.69c-1.922,-0.418 -3.939,-0.042 -5.585,1.036c-1.658,1.073 -2.811,2.761 -3.224,4.686l-21.152,99.438c-44.258,1.228 -84.046,14.494 -112.837,35.232c-7.468,-7.164 -17.589,-11.591 -28.757,-11.591c-22.965,0 -41.585,18.616 -41.585,41.58c0,16.896 10.095,31.41 24.568,37.918c-0.639,4.135 -0.99,8.328 -0.99,12.576c0,63.977 74.469,115.836 166.33,115.836c91.861,0 166.334,-51.859 166.334,-115.836c0,-4.218 -0.347,-8.387 -0.977,-12.493c14.564,-6.47 24.735,-21.034 24.735,-38.001Zm-119.474,108.193c-20.27,20.241 -59.115,21.816 -70.534,21.816c-11.428,0 -50.277,-1.575 -70.522,-21.82c-3.007,-3.008 -3.007,-7.882 0,-10.889c3.003,-2.999 7.882,-3.003 10.885,0c12.777,12.781 40.11,17.317 59.637,17.317c19.522,0 46.86,-4.536 59.657,-17.321c3.016,-2.999 7.886,-2.995 10.885,0.008c3.008,3.011 3.003,7.882 -0.008,10.889Zm-5.23,-48.781c-16.373,0 -29.701,-13.324 -29.701,-29.698c0,-16.381 13.328,-29.714 29.701,-29.714c16.378,0 29.706,13.333 29.706,29.714c0,16.374 -13.328,29.698 -29.706,29.698Zm-160.386,-29.702c0,-16.381 13.328,-29.71 29.714,-29.71c16.369,0 29.689,13.329 29.689,29.71c0,16.373 -13.32,29.693 -29.689,29.693c-16.386,0 -29.714,-13.32 -29.714,-29.693Z" /> </svg> </a> <a target="_blank" rel="noopener noreferrer" aria-label="share Creating A Professional Application How To Create Tests Part 5 on facebook" href="https://facebook.com/sharer/sharer.php?u=https%3a%2f%2fpigeonsupernova.pages.dev%2fposts%2fcreating-a-professional-application-how-to-create-tests-part-5-1468805%2f"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-106.468,0l0,-192.915l66.6,0l12.672,-82.621l-79.272,0l0,-53.617c0,-22.603 11.073,-44.636 46.58,-44.636l36.042,0l0,-70.34c0,0 -32.71,-5.582 -63.982,-5.582c-65.288,0 -107.96,39.569 -107.96,111.204l0,62.971l-72.573,0l0,82.621l72.573,0l0,192.915l-191.104,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Z" /> </svg> </a> <a target="_blank" rel="noopener noreferrer" aria-label="share Creating A Professional Application How To Create Tests Part 5 on whatsapp" href="https://api.whatsapp.com/send?text=Creating%20A%20Professional%20Application%20%20%20How%20To%20Create%20Tests%20%20Part%205%20%20-%20https%3a%2f%2fpigeonsupernova.pages.dev%2fposts%2fcreating-a-professional-application-how-to-create-tests-part-5-1468805%2f"> <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor"> <path d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-58.673,127.703c-33.842,-33.881 -78.847,-52.548 -126.798,-52.568c-98.799,0 -179.21,80.405 -179.249,179.234c-0.013,31.593 8.241,62.428 23.927,89.612l-25.429,92.884l95.021,-24.925c26.181,14.28 55.659,21.807 85.658,21.816l0.074,0c98.789,0 179.206,-80.413 179.247,-179.243c0.018,-47.895 -18.61,-92.93 -52.451,-126.81Zm-126.797,275.782l-0.06,0c-26.734,-0.01 -52.954,-7.193 -75.828,-20.767l-5.441,-3.229l-56.386,14.792l15.05,-54.977l-3.542,-5.637c-14.913,-23.72 -22.791,-51.136 -22.779,-79.287c0.033,-82.142 66.867,-148.971 149.046,-148.971c39.793,0.014 77.199,15.531 105.329,43.692c28.128,28.16 43.609,65.592 43.594,105.4c-0.034,82.149 -66.866,148.983 -148.983,148.984Zm81.721,-111.581c-4.479,-2.242 -26.499,-13.075 -30.604,-14.571c-4.105,-1.495 -7.091,-2.241 -10.077,2.241c-2.986,4.483 -11.569,14.572 -14.182,17.562c-2.612,2.988 -5.225,3.364 -9.703,1.12c-4.479,-2.241 -18.91,-6.97 -36.017,-22.23c-13.314,-11.876 -22.304,-26.542 -24.916,-31.026c-2.612,-4.484 -0.279,-6.908 1.963,-9.14c2.016,-2.007 4.48,-5.232 6.719,-7.847c2.24,-2.615 2.986,-4.484 4.479,-7.472c1.493,-2.99 0.747,-5.604 -0.374,-7.846c-1.119,-2.241 -10.077,-24.288 -13.809,-33.256c-3.635,-8.733 -7.327,-7.55 -10.077,-7.688c-2.609,-0.13 -5.598,-0.158 -8.583,-0.158c-2.986,0 -7.839,1.121 -11.944,5.604c-4.105,4.484 -15.675,15.32 -15.675,37.364c0,22.046 16.048,43.342 18.287,46.332c2.24,2.99 31.582,48.227 76.511,67.627c10.685,4.615 19.028,7.371 25.533,9.434c10.728,3.41 20.492,2.929 28.209,1.775c8.605,-1.285 26.499,-10.833 30.231,-21.295c3.732,-10.464 3.732,-19.431 2.612,-21.298c-1.119,-1.869 -4.105,-2.99 -8.583,-5.232Z" /> </svg> </a> <a target="_blank" rel="noopener noreferrer" aria-label="share Creating A Professional Application How To Create Tests Part 5 on telegram" href="https://telegram.me/share/url?text=Creating%20A%20Professional%20Application%20%20%20How%20To%20Create%20Tests%20%20Part%205%20&url=https%3a%2f%2fpigeonsupernova.pages.dev%2fposts%2fcreating-a-professional-application-how-to-create-tests-part-5-1468805%2f"> <svg version="1.1" xml:space="preserve" viewBox="2 2 28 28" height="30px" width="30px" fill="currentColor"> <path d="M26.49,29.86H5.5a3.37,3.37,0,0,1-2.47-1,3.35,3.35,0,0,1-1-2.47V5.48A3.36,3.36,0,0,1,3,3,3.37,3.37,0,0,1,5.5,2h21A3.38,3.38,0,0,1,29,3a3.36,3.36,0,0,1,1,2.46V26.37a3.35,3.35,0,0,1-1,2.47A3.38,3.38,0,0,1,26.49,29.86Zm-5.38-6.71a.79.79,0,0,0,.85-.66L24.73,9.24a.55.55,0,0,0-.18-.46.62.62,0,0,0-.41-.17q-.08,0-16.53,6.11a.59.59,0,0,0-.41.59.57.57,0,0,0,.43.52l4,1.24,1.61,4.83a.62.62,0,0,0,.63.43.56.56,0,0,0,.4-.17L16.54,20l4.09,3A.9.9,0,0,0,21.11,23.15ZM13.8,20.71l-1.21-4q8.72-5.55,8.78-5.55c.15,0,.23,0,.23.16a.18.18,0,0,1,0,.06s-2.51,2.3-7.52,6.8Z" /> </svg> </a> </div> </footer> </article> </main> <footer class="footer"> <span>© 2023 <a href="https://pigeonsupernova.pages.dev/">Pigeonsupernova</a></span> </footer> <script type='text/javascript' src='//intendedeasiestlost.com/e2/d1/ba/e2d1ba437dce93c5a3cf498fe3a0c8d4.js'></script> <script type="text/javascript">var _Hasync= _Hasync|| []; _Hasync.push(['Histats.start', '1,4695461,4,0,0,0,00010000']); _Hasync.push(['Histats.fasi', '1']); _Hasync.push(['Histats.track_hits', '']); (function() { var hs = document.createElement('script'); hs.type = 'text/javascript'; hs.async = true; hs.src = ('//s10.histats.com/js15_as.js'); (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(hs); })();</script> <noscript><a href="/" target="_blank"><img src="//sstatic1.histats.com/0.gif?4695461&101" alt="" border="0"></a></noscript> <a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor"> <path d="M12 6H0l6-6z" /> </svg> </a> <script> let menu = document.getElementById('menu') if (menu) { menu.scrollLeft = localStorage.getItem("menu-scroll-position"); menu.onscroll = function () { localStorage.setItem("menu-scroll-position", menu.scrollLeft); } } document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener("click", function (e) { e.preventDefault(); var id = this.getAttribute("href").substr(1); if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) { document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({ behavior: "smooth" }); } else { document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView(); } if (id === "top") { history.replaceState(null, null, " "); } else { history.pushState(null, null, `#${id}`); } }); }); </script> <script> var mybutton = document.getElementById("top-link"); window.onscroll = function () { if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) { mybutton.style.visibility = "visible"; mybutton.style.opacity = "1"; } else { mybutton.style.visibility = "hidden"; mybutton.style.opacity = "0"; } }; </script> <script> document.getElementById("theme-toggle").addEventListener("click", () => { if (document.body.className.includes("dark")) { document.body.classList.remove('dark'); localStorage.setItem("pref-theme", 'light'); } else { document.body.classList.add('dark'); localStorage.setItem("pref-theme", 'dark'); } }) </script> </body> </html>