Files
2023-11-20 11:57:03 -08:00

362 lines
28 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" data-content_root="../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Basic query for Swift code &#8212; CodeQL</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=93459777" />
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
<script src="../_static/doctools.js?v=888ff710"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="icon" href="../_static/favicon.ico"/>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Analyzing data flow in Swift" href="analyzing-data-flow-in-swift.html" />
<link rel="prev" title="CodeQL for Swift" href="codeql-for-swift.html" />
<title>CodeQL docs</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<link rel="stylesheet" href="../_static/primer.css" type="text/css" />
</head><body>
<header class="Header">
<div class="Header-item--full">
<a href="https://codeql.github.com/docs" class="Header-link f2 d-flex flex-items-center">
<!-- <%= octicon "mark-github", class: "mr-2", height: 32 %> -->
<svg height="32" class="octicon octicon-mark-github mr-2" viewBox="0 0 16 16" version="1.1" width="32"
aria-hidden="true">
<path fill-rule="evenodd"
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z">
</path>
</svg>
<span class="hide-sm">CodeQL documentation</span>
</a>
</div>
<div class="Header-item hide-sm hide-md">
<script src="https://addsearch.com/js/?key=93b4d287e2fc079a4089412b669785d5&categories=!0xhelp.semmle.com,0xcodeql.github.com,1xdocs,1xcodeql-standard-libraries,1xcodeql-query-help"></script>
</div>
<div class="Header-item">
<details class="dropdown details-reset details-overlay d-inline-block">
<summary class="btn bg-gray-dark text-white border" aria-haspopup="true">
CodeQL resources
<div class="dropdown-caret"></div>
</summary>
<ul class="dropdown-menu dropdown-menu-se dropdown-menu-dark">
<li><a class="dropdown-item" href="https://codeql.github.com/docs/codeql-overview">CodeQL overview</a></li>
<li class="dropdown-divider" role="separator"></li>
<div class="dropdown-header">
CodeQL tools
</div>
<li><a class="dropdown-item" href="https://codeql.github.com/docs/codeql-for-visual-studio-code">CodeQL for VS Code</a>
<li><a class="dropdown-item" href="https://codeql.github.com/docs/codeql-cli">CodeQL CLI</a>
</li>
<li class="dropdown-divider" role="separator"></li>
<div class="dropdown-header">
CodeQL guides
</div>
<li><a class="dropdown-item" href="https://codeql.github.com/docs/writing-codeql-queries">Writing CodeQL queries</a></li>
<li><a class="dropdown-item" href="https://codeql.github.com/docs/codeql-language-guides">CodeQL language guides</a>
<li class="dropdown-divider" role="separator"></li>
<div class="dropdown-header">
Reference docs
</div>
<li><a class="dropdown-item" href="https://codeql.github.com/docs/ql-language-reference/">QL language
reference</a>
<li><a class="dropdown-item" href="https://codeql.github.com/codeql-standard-libraries">CodeQL
standard-libraries</a>
<li><a class="dropdown-item" href="https://codeql.github.com/codeql-query-help">CodeQL
query help</a>
<li class="dropdown-divider" role="separator"></li>
<div class="dropdown-header">
Source files
</div>
<li><a class="dropdown-item" href="https://github.com/github/codeql">CodeQL repository</a>
</ul>
</details>
</div>
</header>
<main class="bg-gray-light clearfix">
<nav class="SideNav position-sticky top-0 col-lg-3 col-md-3 float-left p-4 hide-sm hide-md overflow-y-auto">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../codeql-overview/index.html">CodeQL overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="../codeql-for-visual-studio-code/index.html">CodeQL for Visual Studio Code</a></li>
<li class="toctree-l1"><a class="reference internal" href="../codeql-cli/index.html">CodeQL CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../writing-codeql-queries/index.html">Writing CodeQL queries</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">CodeQL language guides</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="codeql-for-cpp.html">CodeQL for C and C++</a></li>
<li class="toctree-l2"><a class="reference internal" href="codeql-for-csharp.html">CodeQL for C#</a></li>
<li class="toctree-l2"><a class="reference internal" href="codeql-for-go.html">CodeQL for Go</a></li>
<li class="toctree-l2"><a class="reference internal" href="codeql-for-java.html">CodeQL for Java and Kotlin</a></li>
<li class="toctree-l2"><a class="reference internal" href="codeql-for-javascript.html">CodeQL for JavaScript and TypeScript</a></li>
<li class="toctree-l2"><a class="reference internal" href="codeql-for-python.html">CodeQL for Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="codeql-for-ruby.html">CodeQL for Ruby</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="codeql-for-swift.html">CodeQL for Swift</a><ul class="current">
<li class="toctree-l3 current"><a class="current reference internal" href="#">Basic query for Swift code</a></li>
<li class="toctree-l3"><a class="reference internal" href="analyzing-data-flow-in-swift.html">Analyzing data flow in Swift</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../ql-language-reference/index.html">QL language reference</a></li>
</ul>
</nav>
<div class="body col-sm-12 col-md-9 col-lg-9 float-left border-left">
<div class="hide-lg hide-xl px-4 pt-4">
<div class="related" role="navigation" aria-label="related navigation">
<ul>
<li class="nav-item nav-item-0"><a href="../contents.html">CodeQL</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="index.html"
>CodeQL language guides</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="codeql-for-swift.html"
accesskey="U">CodeQL for Swift</a> &#187;</li>
</ul>
</div>
</div>
<article class="p-4 col-lg-10 col-md-10 col-sm-12">
<section id="basic-query-for-swift-code">
<span id="id1"></span><h1>Basic query for Swift code<a class="headerlink" href="#basic-query-for-swift-code" title="Link to this heading"></a></h1>
<p>Learn to write and run a simple CodeQL query using Visual Studio Code with the CodeQL extension.</p>
<blockquote>
<div><blockquote class="pull-quote">
<div><p>Note</p>
<p>CodeQL analysis for Swift is currently in beta. During the beta, analysis of Swift code,
and the accompanying documentation, will not be as comprehensive as for other languages.</p>
</div></blockquote>
</div></blockquote>
<p>For information about installing the CodeQL extension for Visual Studio code, see “<a class="reference internal" href="../codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.html#setting-up-codeql-in-visual-studio-code"><span class="std std-ref">Setting up CodeQL in Visual Studio Code</span></a>.”</p>
<section id="about-the-query">
<h2>About the query<a class="headerlink" href="#about-the-query" title="Link to this heading"></a></h2>
<p>The query were going to run performs a basic search of the code for <code class="docutils literal notranslate"><span class="pre">if</span></code> expressions that are redundant, in the sense that they have an empty <code class="docutils literal notranslate"><span class="pre">then</span></code> branch. For example, code such as:</p>
<div class="highlight-swift notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="n">error</span> <span class="p">{</span>
<span class="c1">// we should handle the error</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="finding-a-codeql-database-to-experiment-with">
<h2>Finding a CodeQL database to experiment with<a class="headerlink" href="#finding-a-codeql-database-to-experiment-with" title="Link to this heading"></a></h2>
<p>Before you start writing queries for Swift code, you need a CodeQL database to run them against. The simplest way to do this is to download a database for a repository that uses Swift directly from GitHub.com.</p>
<ol class="arabic simple">
<li><p>In Visual Studio Code, click the <strong>QL</strong> icon <a class="reference internal" href="../_images/codeql-extension-icon.png"><img alt="Icon for the CodeQL extension." src="../_images/codeql-extension-icon.png" style="width: 20px;" /></a> in the left sidebar to display the CodeQL extension.</p></li>
<li><p>Click <strong>From GitHub</strong> or the GitHub logo <a class="reference internal" href="../_images/add-codeql-db-github.png"><img alt="Icon for the CodeQL extension option to download a CodeQL database from GitHub." src="../_images/add-codeql-db-github.png" style="width: 20px;" /></a> at the top of the CodeQL extension to open an entry field.</p></li>
<li><p>Copy the URL for the repository into the field and press the keyboard <strong>Enter</strong> key. For example, <a class="reference external" href="https://github.com/alamofire/alamofire">https://github.com/alamofire/alamofire</a>.</p></li>
<li><p>Optionally, if the repository has more than one CodeQL database available, select <code class="docutils literal notranslate"><span class="pre">swift</span></code> to download the database created from the Swift code.</p></li>
</ol>
<p>Information about the download progress for the database is shown in the bottom right corner of Visual Studio Code. When the download is complete, the database is shown with a check mark in the <strong>Databases</strong> section of the CodeQL extension (see screenshot below).</p>
</section>
<section id="running-a-quick-query">
<h2>Running a quick query<a class="headerlink" href="#running-a-quick-query" title="Link to this heading"></a></h2>
<p>The CodeQL extension for Visual Studio Code adds several <strong>CodeQL:</strong> commands to the command palette including <strong>Quick Query</strong>, which you can use to run a query without any set up.</p>
<ol class="arabic">
<li><p>From the command palette in Visual Studio Code, select <strong>CodeQL: Quick Query</strong>.</p></li>
<li><p>After a moment, a new tab <em>quick-query.ql</em> is opened, ready for you to write a query for your currently selected CodeQL database (here a <code class="docutils literal notranslate"><span class="pre">swift</span></code> database). If you are prompted to reload your workspace as a multi-folder workspace to allow Quick queries, accept or create a new workspace using the starter workflow.</p>
<p><img alt="image-quick-query" src="../_images/quick-query-tab-swift.png" /></p>
</li>
</ol>
<ol class="arabic">
<li><p>In the quick query tab, delete the content and paste in the following query.</p>
<div class="highlight-ql notranslate"><div class="highlight"><pre><span></span>import swift
from IfStmt ifStmt
where ifStmt.getThen().(BraceStmt).getNumberOfElements() = 0
select ifStmt, &quot;This &#39;if&#39; statement is redundant.&quot;
</pre></div>
</div>
</li>
</ol>
<ol class="arabic" start="4">
<li><p>Save the query in its default location (a temporary “Quick Queries” directory under the workspace for <code class="docutils literal notranslate"><span class="pre">GitHub.vscode-codeql/quick-queries</span></code>).</p></li>
<li><p>Right-click in the query tab and select <strong>CodeQL: Run Query on Selected Database</strong>. (Alternatively, run the command from the Command Palette.)</p>
<p>The query will take a few moments to return results. When the query completes, the results are displayed in a CodeQL Query Results view, next to the main editor view.</p>
<p>The query results are listed in two columns, corresponding to the expressions in the <code class="docutils literal notranslate"><span class="pre">select</span></code> clause of the query. The first column corresponds to the expression <code class="docutils literal notranslate"><span class="pre">ifStmt</span></code> and is linked to the location in the source code of the project where <code class="docutils literal notranslate"><span class="pre">ifStmt</span></code> occurs. The second column is the alert message.</p>
</li>
</ol>
<img alt="../_images/basic-swift-query-results-1.png" class="align-center" src="../_images/basic-swift-query-results-1.png" />
<p>If any matching code is found, click a link in the <code class="docutils literal notranslate"><span class="pre">ifStmt</span></code> column to open the file and highlight the matching <code class="docutils literal notranslate"><span class="pre">if</span></code> statement.</p>
<img alt="../_images/basic-swift-query-results-2.png" class="align-center" src="../_images/basic-swift-query-results-2.png" />
<blockquote class="pull-quote">
<div><p>Note</p>
<p>If you want to move your experimental query somewhere more permanent, you need to move the whole <code class="docutils literal notranslate"><span class="pre">Quick</span> <span class="pre">Queries</span></code> directory. The directory is a CodeQL pack with a <code class="docutils literal notranslate"><span class="pre">qlpack.yml</span></code> file that defines the content as queries for Swift CodeQL databases. For more information about CodeQL packs, see “<a class="reference internal" href="../codeql-for-visual-studio-code/working-with-codeql-packs-in-visual-studio-code.html#working-with-codeql-packs-in-visual-studio-code"><span class="std std-ref">Working with CodeQL packs in Visual Studio Code</span></a>.”</p>
</div></blockquote>
<section id="about-the-query-structure">
<h3>About the query structure<a class="headerlink" href="#about-the-query-structure" title="Link to this heading"></a></h3>
<p>After the initial <code class="docutils literal notranslate"><span class="pre">import</span></code> statement, this simple query comprises three parts that serve similar purposes to the FROM, WHERE, and SELECT parts of an SQL query.</p>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>Query part</p></th>
<th class="head"><p>Purpose</p></th>
<th class="head"><p>Details</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">swift</span></code></p></td>
<td><p>Imports the standard CodeQL AST libraries for Swift.</p></td>
<td><p>Every query begins with one or more <code class="docutils literal notranslate"><span class="pre">import</span></code> statements.</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">IfStmt</span> <span class="pre">ifStmt</span></code></p></td>
<td><p>Defines the variables for the query.
Declarations are of the form:
<code class="docutils literal notranslate"><span class="pre">&lt;type&gt;</span> <span class="pre">&lt;variable</span> <span class="pre">name&gt;</span></code></p></td>
<td><p>We use: an <code class="docutils literal notranslate"><span class="pre">IfStmt</span></code> variable for <code class="docutils literal notranslate"><span class="pre">if</span></code> statements.</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">where</span> <span class="pre">ifStmt.getThen().(BraceStmt).getNumberOfElements()</span> <span class="pre">=</span> <span class="pre">0</span></code></p></td>
<td><p>Defines a condition on the variables.</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">ifStmt.getThen()</span></code>: gets the <code class="docutils literal notranslate"><span class="pre">then</span></code> branch of the <code class="docutils literal notranslate"><span class="pre">if</span></code> expression.
<code class="docutils literal notranslate"><span class="pre">.(BraceStmt)</span></code>: requires that the <code class="docutils literal notranslate"><span class="pre">then</span></code> branch is a brace statement (<code class="docutils literal notranslate"><span class="pre">{</span> <span class="pre">}</span></code>).
<code class="docutils literal notranslate"><span class="pre">.getNumberOfElements()</span> <span class="pre">=</span> <span class="pre">0</span></code>: requires that the brace statement contains no child statements.</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">select</span> <span class="pre">ifStmt,</span> <span class="pre">&quot;This</span> <span class="pre">'if'</span> <span class="pre">statement</span> <span class="pre">is</span> <span class="pre">redundant.&quot;</span></code></p></td>
<td><p>Defines what to report for each match.</p>
<p><code class="docutils literal notranslate"><span class="pre">select</span></code> statements for queries that are used to find instances of poor coding practice are always in the form:
<code class="docutils literal notranslate"><span class="pre">select</span> <span class="pre">&lt;program</span> <span class="pre">element&gt;,</span> <span class="pre">&quot;&lt;alert</span> <span class="pre">message&gt;&quot;</span></code></p>
</td>
<td><p>Reports the resulting <code class="docutils literal notranslate"><span class="pre">if</span></code> statement with a string that explains the problem.</p></td>
</tr>
</tbody>
</table>
</section>
</section>
<section id="extend-the-query">
<h2>Extend the query<a class="headerlink" href="#extend-the-query" title="Link to this heading"></a></h2>
<p>Query writing is an inherently iterative process. You write a simple query and then, when you run it, you discover examples that you had not previously considered, or opportunities for improvement.</p>
<section id="remove-false-positive-results">
<h3>Remove false positive results<a class="headerlink" href="#remove-false-positive-results" title="Link to this heading"></a></h3>
<p>Browsing the results of our basic query shows that it could be improved. Among the results you are likely to find examples of <code class="docutils literal notranslate"><span class="pre">if</span></code> statements with an <code class="docutils literal notranslate"><span class="pre">else</span></code> branch, where an empty <code class="docutils literal notranslate"><span class="pre">then</span></code> branch does serve a purpose. For example:</p>
<div class="highlight-swift notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="p">(</span><span class="n">option</span> <span class="p">==</span> <span class="s">&quot;-verbose&quot;</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// nothing to do - handled earlier</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">handleError</span><span class="p">(</span><span class="s">&quot;unrecognized option&quot;</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
</div>
<p>In this case, identifying the <code class="docutils literal notranslate"><span class="pre">if</span></code> statement with the empty <code class="docutils literal notranslate"><span class="pre">then</span></code> branch as redundant is a false positive. One solution to this is to modify the query to select <code class="docutils literal notranslate"><span class="pre">if</span></code> statements where both the <code class="docutils literal notranslate"><span class="pre">then</span></code> and <code class="docutils literal notranslate"><span class="pre">else</span></code> branches are missing.</p>
<p>To exclude <code class="docutils literal notranslate"><span class="pre">if</span></code> statements that have an <code class="docutils literal notranslate"><span class="pre">else</span></code> branch:</p>
<ol class="arabic">
<li><p>Add the following to the where clause:</p>
<div class="highlight-ql notranslate"><div class="highlight"><pre><span></span>and not exists(ifStmt.getElse())
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">where</span></code> clause is now:</p>
<div class="highlight-ql notranslate"><div class="highlight"><pre><span></span>where
ifStmt.getThen().(BraceStmt).getNumberOfElements() = 0 and
not exists(ifStmt.getElse())
</pre></div>
</div>
</li>
<li><p>Re-run the query.</p>
<p>There are now fewer results because <code class="docutils literal notranslate"><span class="pre">if</span></code> expressions with an <code class="docutils literal notranslate"><span class="pre">else</span></code> branch are no longer included.</p>
</li>
</ol>
</section>
</section>
<section id="further-reading">
<h2>Further reading<a class="headerlink" href="#further-reading" title="Link to this heading"></a></h2>
<ul class="simple">
<li><p><a class="reference external" href="https://github.com/github/codeql/tree/main/swift/ql/src/queries">CodeQL queries for Swift</a></p></li>
<li><p><a class="reference external" href="https://github.com/github/codeql/tree/main/swift/ql/examples">Example queries for Swift</a></p></li>
<li><p><a class="reference external" href="https://codeql.github.com/codeql-standard-libraries/swift/">CodeQL library reference for Swift</a></p></li>
</ul>
<ul class="simple">
<li><p><a class="reference internal" href="../ql-language-reference/index.html#ql-language-reference"><span class="std std-ref">QL language reference</span></a></p></li>
<li><p><a class="reference internal" href="../codeql-overview/codeql-tools.html#codeql-tools"><span class="std std-ref">CodeQL tools</span></a></p></li>
</ul>
</section>
</section>
</article>
<!-- GitHub footer, with links to terms and privacy statement -->
<div class="px-3 px-md-6 f6 py-4 d-sm-flex flex-justify-between flex-row-reverse flex-items-center border-top">
<ul class="list-style-none d-flex flex-items-center mb-3 mb-sm-0 lh-condensed-ultra">
<li class="mr-3">
<a href="https://twitter.com/github" title="GitHub on Twitter" style="color: #959da5;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 273.5 222.3" class="d-block" height="18">
<path
d="M273.5 26.3a109.77 109.77 0 0 1-32.2 8.8 56.07 56.07 0 0 0 24.7-31 113.39 113.39 0 0 1-35.7 13.6 56.1 56.1 0 0 0-97 38.4 54 54 0 0 0 1.5 12.8A159.68 159.68 0 0 1 19.1 10.3a56.12 56.12 0 0 0 17.4 74.9 56.06 56.06 0 0 1-25.4-7v.7a56.11 56.11 0 0 0 45 55 55.65 55.65 0 0 1-14.8 2 62.39 62.39 0 0 1-10.6-1 56.24 56.24 0 0 0 52.4 39 112.87 112.87 0 0 1-69.7 24 119 119 0 0 1-13.4-.8 158.83 158.83 0 0 0 86 25.2c103.2 0 159.6-85.5 159.6-159.6 0-2.4-.1-4.9-.2-7.3a114.25 114.25 0 0 0 28.1-29.1"
fill="currentColor"></path>
</svg>
</a>
</li>
<li class="mr-3">
<a href="https://www.facebook.com/GitHub" title="GitHub on Facebook" style="color: #959da5;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.3 15.4" class="d-block" height="18">
<path
d="M14.5 0H.8a.88.88 0 0 0-.8.9v13.6a.88.88 0 0 0 .8.9h7.3v-6h-2V7.1h2V5.4a2.87 2.87 0 0 1 2.5-3.1h.5a10.87 10.87 0 0 1 1.8.1v2.1h-1.3c-1 0-1.1.5-1.1 1.1v1.5h2.3l-.3 2.3h-2v5.9h3.9a.88.88 0 0 0 .9-.8V.8a.86.86 0 0 0-.8-.8z"
fill="currentColor"></path>
</svg>
</a>
</li>
<li class="mr-3">
<a href="https://www.youtube.com/github" title="GitHub on YouTube" style="color: #959da5;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.17 13.6" class="d-block" height="16">
<path
d="M18.77 2.13A2.4 2.4 0 0 0 17.09.42C15.59 0 9.58 0 9.58 0a57.55 57.55 0 0 0-7.5.4A2.49 2.49 0 0 0 .39 2.13 26.27 26.27 0 0 0 0 6.8a26.15 26.15 0 0 0 .39 4.67 2.43 2.43 0 0 0 1.69 1.71c1.52.42 7.5.42 7.5.42a57.69 57.69 0 0 0 7.51-.4 2.4 2.4 0 0 0 1.68-1.71 25.63 25.63 0 0 0 .4-4.67 24 24 0 0 0-.4-4.69zM7.67 9.71V3.89l5 2.91z"
fill="currentColor"></path>
</svg>
</a>
</li>
<li class="mr-3 flex-self-start">
<a href="https://www.linkedin.com/company/github" title="GitHub on Linkedin" style="color: #959da5;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19 18" class="d-block" height="18">
<path
d="M3.94 2A2 2 0 1 1 2 0a2 2 0 0 1 1.94 2zM4 5.48H0V18h4zm6.32 0H6.34V18h3.94v-6.57c0-3.66 4.77-4 4.77 0V18H19v-7.93c0-6.17-7.06-5.94-8.72-2.91z"
fill="currentColor"></path>
</svg>
</a>
</li>
<li>
<a href="https://github.com/github" title="GitHub's organization" style="color: #959da5;">
<svg version="1.1" width="20" height="20" viewBox="0 0 16 16" class="octicon octicon-mark-github"
aria-hidden="true">
<path fill-rule="evenodd"
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z">
</path>
</svg>
</a>
</li>
</ul>
<ul class="list-style-none d-flex text-gray">
<li class="mr-3">&copy;
<script type="text/javascript">document.write(new Date().getFullYear());</script> GitHub, Inc.</li>
<li class="mr-3"><a
href="https://docs.github.com/github/site-policy/github-terms-of-service"
class="link-gray">Terms </a></li>
<li><a href="https://docs.github.com/github/site-policy/github-privacy-statement"
class="link-gray">Privacy </a></li>
</ul>
</div>
</div>
</main>
<script type="text/javascript">
$(document).ready(function () {
$(".toggle > *").hide();
$(".toggle .name").show();
$(".toggle .name").click(function () {
$(this).parent().children().not(".name").toggle(400);
$(this).parent().children(".name").toggleClass("open");
})
});
</script>
</body>
</html>