diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-07 23:06:23 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-07 23:06:23 +0900 |
| commit | 9d5ec5e3bc01c6174dea048e118edee579c36565 (patch) | |
| tree | 8bdb98836728e14f61bad56043f67bb352590963 /services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html | |
| parent | 479747454273abdbe9b5cc3f5c3dd18bbda7741a (diff) | |
| download | nsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.tar.gz nsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.tar.zst nsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.zip | |
fix(style): fix codeblock style for rouge
Diffstat (limited to 'services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html')
| -rw-r--r-- | services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html | 256 |
1 files changed, 124 insertions, 132 deletions
diff --git a/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html b/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html index 510f3062..25859d88 100644 --- a/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html +++ b/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>PHPerKaigi 2023 トークン問題解説 (1/5)|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9"> + <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23"> </head> <body class="single"> <header class="header"> @@ -167,8 +167,7 @@ まずはトークンを得る方法を解説抜きで説明する。次のように実行する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ echo "#iwillblog" | php Q1.png >/dev/null -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ echo "#iwillblog" | php Q1.png >/dev/null</div></code></pre> </div> <p> 無事に実行できていれば「#ModernPHPisStaticallyTypedLanguage」というトークンが得られる。 @@ -182,8 +181,7 @@ まずは素直に画像として見てみよう。全体は QR コードになっている。適当な QR コードリーダで読み込むと、次のようなテキストが表示されるはずだ。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>Guess password. $ echo "password" | php Q1.png >/dev/null -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">Guess password. $ echo "password" | php Q1.png >/dev/null</div></code></pre> </div> <p> メッセージは、この画像の実行方法とこの問題でやるべきこと (パスワードの推測) を示している。 @@ -198,9 +196,8 @@ 不正なパスワードを使って実行してみると、次のようなエラーメッセージが表示される。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>$ echo "foo" | php Q1.png >/dev/null -401 Unauthorized -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ echo "foo" | php Q1.png >/dev/null +</div><div class="codeblock-line">401 Unauthorized</div></code></pre> </div> <p> すでに <a href="#section--how-to-solve">「解き方」の節</a> で示したように、パスワードである PHPer トークンは「#iwillblog」である。これを与えて実行すると正解のトークンが得られる。 @@ -270,25 +267,23 @@ <code>strings</code> コマンドを使うと、隠されたデータを簡単に閲覧できる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>IHDR --HHc -<PLTE -IDATx -IEND -<?php -error_reporting(-1); -$b = unpack('C*', file_get_contents(__FILE__)); -$w = $b[20]+2; -$h = $b[24]+2; -// (以下略) -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">IHDR +</div><div class="codeblock-line">-HHc +</div><div class="codeblock-line"><PLTE +</div><div class="codeblock-line">IDATx +</div><div class="codeblock-line">IEND +</div><div class="codeblock-line"><?php +</div><div class="codeblock-line">error_reporting(-1); +</div><div class="codeblock-line">$b = unpack('C*', file_get_contents(__FILE__)); +</div><div class="codeblock-line">$w = $b[20]+2; +</div><div class="codeblock-line">$h = $b[24]+2; +</div><div class="codeblock-line">// (以下略)</div></code></pre> </div> <p> <code>IHDR</code> や <code>IEND</code> が PNG 画像の一部で、<code><?php</code> からが実際のプログラムになっている。もちろんこれを PHP プログラムとして動かすと、PHP タグより前にある PNG 画像としてのデータはそのまま標準出力へと出力されてしまう。それを防ぐため、QR コードを読み込んだときの実行方法 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code>Guess password. $ echo "password" | php Q1.png >/dev/null -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">Guess password. $ echo "password" | php Q1.png >/dev/null</div></code></pre> </div> <p> には標準出力を捨てるよう <code>>/dev/null</code> と指定されている。 @@ -303,108 +298,107 @@ $h = $b[24]+2; 画像の正体がわかったところで、画像に隠されていた PHP プログラムについて見ていこう。先ほどは一部しか記載しなかったので、全体を載せる。なお、ある程度ゴルフしながら書いたので、空白こそ残しているものの可読性は非常に低いことと思う。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> -<span style="color: #953800">error_reporting</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -<span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -<span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">20</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$h</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$cs</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> -<span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$h</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">?</span> <span style="color: #0550ae">0</span> - <span style="color: #0550ae">:</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">122</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span> -<span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #953800">stream_isatty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">?</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span> - <span style="color: #0550ae">:</span> <span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">ord</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #24292f;background-color: #f6f8fa">string</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #953800">fgets</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">))));</span> -<span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> -<span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$ns</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #0550ae">$o</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$ns</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">></span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e5</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"infinite loop detected</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$c1</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">6</span> <span style="color: #0550ae">+</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">-</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c0</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">6</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$c1</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$c0</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">1</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">2</span> <span style="color: #0550ae">=></span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">3</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">4</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">5</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">8</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #0550ae">11</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">*=</span> <span style="color: #953800">pow</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">12</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">],</span> - <span style="color: #0550ae">13</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span> - <span style="color: #0550ae">...</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">([</span> - <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #24292f;background-color: #f6f8fa">]),</span> - <span style="color: #24292f;background-color: #f6f8fa">])(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">15</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">and</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_shift</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">),</span> - <span style="color: #0550ae">16</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%d'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #0550ae">17</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> - <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">'nop'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> - <span style="color: #24292f;background-color: #f6f8fa">};</span> - <span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$v</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #0550ae">$z</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">-=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$q</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$qq</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qq</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> - <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$qy</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$qx</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> - <span style="color: #24292f;background-color: #f6f8fa">)</span> - <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #0550ae">$np</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> - <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_keys</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">));</span> - <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #24292f;background-color: #f6f8fa">}</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">7</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> - <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -<span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span> -<span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span> -<span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span> -<span style="color: #6e7781">// Piet any longer at that time.</span> -<span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"><?php</span> +</div><div class="codeblock-line"><span style="color: #953800">error_reporting</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">20</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$h</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$cs</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> +</div><div class="codeblock-line"><span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$h</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">?</span> <span style="color: #0550ae">0</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">:</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">122</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #953800">stream_isatty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">?</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">:</span> <span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">ord</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #24292f;background-color: #f6f8fa">string</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #953800">fgets</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">))));</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #0550ae">$o</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$ns</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">></span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e5</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"infinite loop detected</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$c1</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">6</span> <span style="color: #0550ae">+</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">-</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c0</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">6</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$c1</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$c0</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">1</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">2</span> <span style="color: #0550ae">=></span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">3</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">4</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">5</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">8</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">11</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">*=</span> <span style="color: #953800">pow</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">12</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">],</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">13</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=></span> <span style="color: #24292f;background-color: #f6f8fa">[</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">([</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">]),</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">])(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">15</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">and</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_shift</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">16</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%d'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">17</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">default</span> <span style="color: #0550ae">=></span> <span style="color: #0a3069">'nop'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">};</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$v</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$z</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">-=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$q</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$qq</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qq</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$qy</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">&&</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae"><=></span><span style="color: #0550ae">$qx</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">)</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$np</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_keys</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</div><div class="codeblock-line"> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">7</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Piet any longer at that time.</span> +</div><div class="codeblock-line"><span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> <p> これは一体なんなのか。ずばり、難解プログラミング言語の一つ Piet のインタプリタである。Piet はピエト・モンドリアン (『赤・青・黄のコンポジション』などで知られる抽象画家) の作品にインスピレーションを受けて作られた、画像をソースコードとするプログラミング言語である。インタプリタは画像の各ピクセルの上を進みながら、色等に応じて特定の処理をおこなっていく。ここでは詳しい言語仕様については解説しないので、気になる方は <a href="https://ja.wikipedia.org/wiki/Piet" rel="noreferrer" target="_blank">Wikipedia の記事「Piet」</a> などを参照してほしい。 @@ -413,8 +407,7 @@ $h = $b[24]+2; プログラムの冒頭にあるこの箇所 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> <p> で <code>__FILE__</code> つまりこの画像ファイルを読み込んでいる。先ほど Piet は画像をソースコードにしていると説明した。そう、今回の問題の画像ファイル <code>Q1.png</code> は、PHP 製 Piet インタプリタであると同時に、Piet のソースコード画像でもあるのだ。QR コード中央のカラフルな部分が Piet の命令になっている。 @@ -466,12 +459,11 @@ $h = $b[24]+2; ところで、先ほど掲載した Piet のインタプリタのソースコード末尾には次のような箇所がある。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span> -<span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span> -<span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span> -<span style="color: #6e7781">// Piet any longer at that time.</span> -<span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span> +</div><div class="codeblock-line"><span style="color: #6e7781">// Piet any longer at that time.</span> +</div><div class="codeblock-line"><span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre> </div> <p> コメントにも書かれているが、この Piet のソースコード画像には誤りがあった。本来 HTTP のステータスコードを真似るのなら、認証の失敗には 401 を返さなければならない。しかし、Piet のソースは 403 を返すように書いてしまっていた。そのことに私が気付いたのは PHPerKaigi 2023 が開催されるひと月前で、その時点で私はこの Piet のソースコードを (ちょうどこの記事でそうなっているのと同じように) 読解できなくなっていた。さらに悪いことに、正しいメッセージ「401 Unauthorized」は元の「403 Forbidden」よりも3文字長い。3文字出力が長くなるということは、それだけ Piet で塗るべきピクセルが増えることを意味する。もはや3文字追加で出力するだけの余白はこの画像に残されていなかった (と思う。腕ききの Piet プログラマならできるかもしれないので挑戦してみてほしい)。 |
