<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <atom:link href="http://kitchingroup.cheme.cmu.edu/blog/feed/index.xml" rel="self" type="application/rss+xml" />
    <title>The Kitchin Research Group</title>
    <link>https://kitchingroup.cheme.cmu.edu/blog</link>
    <description>Chemical Engineering at Carnegie Mellon University</description>
    <pubDate>Sat, 01 Nov 2025 13:47:46 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    
    <item>
      <title>Another approach to embedding org-source in html</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2015/05/09/Another-approach-to-embedding-org-source-in-html</link>
      <pubDate>Sat, 09 May 2015 19:19:10 EDT</pubDate>
      <category><![CDATA[data]]></category>
      <category><![CDATA[orgmode]]></category>
      <guid isPermaLink="false">VDOCn9OcCwUtC5Mwgxhzeiweu7Y=</guid>
      <description>Another approach to embedding org-source in html</description>
      <content:encoded><![CDATA[


&lt;p&gt;
In this &lt;a href="http://kitchingroup.cheme.cmu.edu/blog/2015/05/09/An-alternative-approach-to-including-org-source-in-blog-posts/"&gt;post&lt;/a&gt; I examined a way to embed the org-source in a comment in the html of the post, and developed a reasonably convenient way to extract the source in emacs. One downside of the approach was the need to escape at least the dashes, and then unescape them on extraction. I came across another idea, which is to put the org-source in base64 encoded form in a &lt;a href="http://en.wikipedia.org/wiki/Data_URI_scheme"&gt;data uri&lt;/a&gt; .
&lt;/p&gt;

&lt;p&gt;
First let us see what the encoding means:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;(base64-encode-string &lt;span style="color: #008000;"&gt;"&amp;lt;!-- test--&amp;gt;"&lt;/span&gt;)
&lt;/pre&gt;
&lt;/div&gt;
&lt;pre class="example"&gt;
PCEtLSB0ZXN0LS0+
&lt;/pre&gt;

&lt;p&gt;
And decoding:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;(base64-decode-string &lt;span style="color: #008000;"&gt;"PCEtLSB0ZXN0LS0+"&lt;/span&gt;)
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
&amp;lt;!-- test--&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
The encoding looks random, but it is reversible. More importantly, it probably will not have any html like characters in it that need escaped. The idea of a data uri is that the data it serves is embedded in the URL href attribute. This is basically how to make a data uri. We give the url here a class so we can find it later.
&lt;/p&gt;
&lt;pre class="example"&gt;
&amp;lt;a class="some-org-source" href="data:text/plain;charset=US-ASCII;base64,PCEtLSB0ZXN0LS0+"&amp;gt;source&amp;lt;/a&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
Here is the actual html for the browser. If you click on it, your browser automatically decodes it for you!
&lt;/p&gt;
&lt;a class="some-org-source" href="data:text/plain;charset=US-ASCII;base64,PCEtLSB0ZXN0LS0+"&gt;source&lt;/a&gt;

&lt;p&gt;
So, during the blog publish step, we just need to add this little step to the html generation, and it will be included as a data uri. Here is the function that generates the data uri for us, and example of using it. The encoded source is not at all attractive to look at it, but you almost never need to look at it, it is invisible in the browser. Interestingly, if you click on the link, you will see the org source right in your browser!
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;(&lt;span style="color: #0000FF;"&gt;defun&lt;/span&gt; &lt;span style="color: #006699;"&gt;source-data-uri&lt;/span&gt; (source)
  &lt;span style="color: #036A07;"&gt;"Encode the string in SOURCE to a data uri."&lt;/span&gt;
  (format
   &lt;span style="color: #008000;"&gt;"&amp;lt;a class=\"org-source\" href=\"data:text/plain;charset=US-ASCII;base64,%s\"&amp;gt;source&amp;lt;/a&amp;gt;"&lt;/span&gt;
   (base64-encode-string source)))

(source-data-uri (buffer-string))
&lt;/pre&gt;
&lt;/div&gt;

&lt;a class="org-source" href="data:text/plain;charset=US-ASCII;base64,KiBBbm90aGVyIGFwcHJvYWNoIHRvIGVtYmVkZGluZyBvcmctc291cmNlIGluIGh0bWwKSW4gdGhp
cyBbW2h0dHA6Ly9raXRjaGluZ3JvdXAuY2hlbWUuY211LmVkdS9ibG9nLzIwMTUvMDUvMDkvQW4t
YWx0ZXJuYXRpdmUtYXBwcm9hY2gtdG8taW5jbHVkaW5nLW9yZy1zb3VyY2UtaW4tYmxvZy1wb3N0
cy9dW3Bvc3RdXSBJIGV4YW1pbmVkIGEgd2F5IHRvIGVtYmVkIHRoZSBvcmctc291cmNlIGluIGEg
Y29tbWVudCBpbiB0aGUgaHRtbCBvZiB0aGUgcG9zdCwgYW5kIGRldmVsb3BlZCBhIHJlYXNvbmFi
bHkgY29udmVuaWVudCB3YXkgdG8gZXh0cmFjdCB0aGUgc291cmNlIGluIGVtYWNzLiBPbmUgZG93
bnNpZGUgb2YgdGhlIGFwcHJvYWNoIHdhcyB0aGUgbmVlZCB0byBlc2NhcGUgYXQgbGVhc3QgdGhl
IGRhc2hlcywgYW5kIHRoZW4gdW5lc2NhcGUgdGhlbSBvbiBleHRyYWN0aW9uLiBJIGNhbWUgYWNy
b3NzIGFub3RoZXIgaWRlYSwgd2hpY2ggaXMgdG8gcHV0IHRoZSBvcmctc291cmNlIGluIGJhc2U2
NCBlbmNvZGVkIGZvcm0gaW4gYSBbW2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0YV9V
Uklfc2NoZW1lXVtkYXRhIHVyaV1dLgoKRmlyc3QgbGV0IHVzIHNlZSB3aGF0IHRoZSBlbmNvZGlu
ZyBtZWFuczoKCiMrQkVHSU5fU1JDIGVtYWNzLWxpc3AKKGJhc2U2NC1lbmNvZGUtc3RyaW5nICI8
IS0tIHRlc3QtLT4iKQojK0VORF9TUkMKIytSRVNVTFRTOgo6IFBDRXRMU0IwWlhOMExTMCsKCkFu
ZCBkZWNvZGluZzoKCiMrQkVHSU5fU1JDIGVtYWNzLWxpc3AKKGJhc2U2NC1kZWNvZGUtc3RyaW5n
ICJQQ0V0TFNCMFpYTjBMUzArIikKIytFTkRfU1JDCgojK1JFU1VMVFM6CjogPCEtLSB0ZXN0LS0+
CgpBbmQgdGhpcyBpcyBiYXNpY2FsbHkgaG93IHRvIG1ha2UgYSBkYXRhIHVyaS4gV2UgZ2l2ZSB0
aGUgdXJsIGhlcmUgYSBjbGFzcyBzbyB3ZSBjYW4gZmluZCBpdCBsYXRlci4KIytCRUdJTl9FWEFN
UExFCjxhIGNsYXNzPSJvcmctc291cmNlIiBocmVmPSJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD1V
Uy1BU0NJSTtiYXNlNjQsUENFdExTQjBaWE4wTFMwKyI+c291cmNlPC9hPgojK0VORF9FWEFNUExF
CgpIZXJlIGlzIHRoZSBhY3R1YWwgaHRtbCBmb3IgdGhlIGJyb3dzZXI6IAojK0JFR0lOX0hUTUwK
PGEgY2xhc3M9Im9yZy1zb3VyY2UiIGhyZWY9ImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFT
Q0lJO2Jhc2U2NCxQQ0V0TFNCMFpYTjBMUzArIj5zb3VyY2U8L2E+CiMrRU5EX0hUTUwKClNvLCBk
dXJpbmcgdGhlIGJsb2cgcHVibGlzaCBzdGVwLCB3ZSBqdXN0IG5lZWQgdG8gYWRkIHRoaXMgbGl0
dGxlIHN0ZXAgdG8gdGhlIGh0bWwgZ2VuZXJhdGlvbiwgYW5kIGl0IHdpbGwgYmUgaW5jbHVkZWQg
YXMgYSBkYXRhIHVyaS4gSGVyZSBpcyB0aGUgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIGRh
dGEgdXJpIGZvciB1cywgYW5kIGV4YW1wbGUgb2YgdXNpbmcgaXQ6CgojK0JFR0lOX1NSQyBlbWFj
cy1saXNwICA6cmVzdWx0cyBodG1sCihkZWZ1biBzb3VyY2UtZGF0YS11cmkgKHNvdXJjZSkKICAi
RW5jb2RlIHRoZSBzdHJpbmcgaW4gU09VUkNFIHRvIGEgZGF0YSB1cmkuIgogIChmb3JtYXQKICAg
IjxhIGNsYXNzPVwib3JnLXNvdXJjZVwiIGhyZWY9XCJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD1V
Uy1BU0NJSTtiYXNlNjQsJXNcIiBkb3dubG9hZD1cInNvdXJjZS5vcmdcIj5zb3VyY2U8L2E+IiAK
ICAgKGJhc2U2NC1lbmNvZGUtc3RyaW5nIHNvdXJjZSkpKQoKKHNvdXJjZS1kYXRhLXVyaSAoYnVm
ZmVyLXN0cmluZykpCiMrRU5EX1NSQwoKCgoKCgoK" download="source.org"&gt;source&lt;/a&gt;

&lt;p&gt;
Now, we integrate it into the blogofile function:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;(&lt;span style="color: #0000FF;"&gt;defun&lt;/span&gt; &lt;span style="color: #006699;"&gt;bf-get-post-html&lt;/span&gt; ()
  &lt;span style="color: #036A07;"&gt;"Return a string containing the YAML header, the post html, my&lt;/span&gt;
&lt;span style="color: #036A07;"&gt;copyright line, and a link to the org-source code."&lt;/span&gt;
  (&lt;span style="color: #0000FF;"&gt;interactive&lt;/span&gt;)
  (&lt;span style="color: #0000FF;"&gt;let&lt;/span&gt; ((org-source (buffer-string))
        (url-to-org (bf-get-url-to-org-source))
        (yaml (bf-get-YAML-heading))
        (body (bf-get-HTML)))

    (&lt;span style="color: #0000FF;"&gt;with-temp-buffer&lt;/span&gt;
      (insert yaml)
      (insert body)
      (insert
       (format &lt;span style="color: #008000;"&gt;"&amp;lt;p&amp;gt;Copyright (C) %s by John Kitchin. See the &amp;lt;a href=\"/copying.html\"&amp;gt;License&amp;lt;/a&amp;gt; for information about copying.&amp;lt;p&amp;gt;"&lt;/span&gt;
               (format-time-string &lt;span style="color: #008000;"&gt;"%Y"&lt;/span&gt;)))
      (insert (format &lt;span style="color: #008000;"&gt;"&amp;lt;p&amp;gt;&amp;lt;a href=\"%s\"&amp;gt;org-mode source&amp;lt;/a&amp;gt;&amp;lt;p&amp;gt;"&lt;/span&gt;
                      url-to-org))
      (insert (format &lt;span style="color: #008000;"&gt;"&amp;lt;p&amp;gt;Org-mode version = %s&amp;lt;/p&amp;gt;"&lt;/span&gt; (org-version)))
      &lt;span style="color: #8D8D84;"&gt;;; &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;this is the only new code we need to add.&lt;/span&gt;
      (insert (source-data-uri org-source))
      &lt;span style="color: #8D8D84;"&gt;;; &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;return value&lt;/span&gt;
      (buffer-string))))
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now we need a new adaptation of the grab-org-source function. We still need a regexp search to get the source, and we still need to decode it.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;(&lt;span style="color: #0000FF;"&gt;defun&lt;/span&gt; &lt;span style="color: #006699;"&gt;grab-org-source&lt;/span&gt; (url)
  &lt;span style="color: #036A07;"&gt;"Extract org-source from URL to a buffer named *grab-org-source*."&lt;/span&gt;
  (&lt;span style="color: #0000FF;"&gt;interactive&lt;/span&gt; &lt;span style="color: #008000;"&gt;"sURL: "&lt;/span&gt;)
  (switch-to-buffer (get-buffer-create &lt;span style="color: #008000;"&gt;"*grab-org-source*"&lt;/span&gt;))
  (erase-buffer)
  (org-mode)
  (insert
   (&lt;span style="color: #0000FF;"&gt;with-current-buffer&lt;/span&gt;
       (url-retrieve-synchronously url)
     (&lt;span style="color: #0000FF;"&gt;let&lt;/span&gt; (start)
       (re-search-forward
        &lt;span style="color: #008000;"&gt;"&amp;lt;a class=\"org-source\" href=\"data:text/plain;charset=US-ASCII;base64,&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;\\&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #008000;"&gt;[&lt;/span&gt;&lt;span style="color: #008000;"&gt;^&lt;/span&gt;&lt;span style="color: #008000;"&gt;\"]*&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;\\&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #008000;"&gt;\\\"&amp;gt;"&lt;/span&gt; nil t)
       (base64-decode-string  (match-string 1))))))
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
What else could we do with this? One idea would be to generate data uris for each code block that you could open in your browser. For example, here we generate a list of data uris for each code block in the buffer. We don't take care to label them or make it easy to see what they are, but if you click on one, you should see a plain text version of the block. If this is done a lot, it might even make sense to change the mime type to download the code in some native app.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;(org-element-map (org-element-parse-buffer) 'src-block
  (&lt;span style="color: #0000FF;"&gt;lambda&lt;/span&gt; (src-block)
    (source-data-uri (org-element-property &lt;span style="color: #006FE0;"&gt;:value&lt;/span&gt; src-block))))
&lt;/pre&gt;
&lt;/div&gt;

(&lt;a class="org-source" href="data:text/plain;charset=US-ASCII;base64,KGJhc2U2NC1lbmNvZGUtc3RyaW5nICI8IS0tIHRlc3QtLT4iKQo="&gt;source&lt;/a&gt; &lt;a class="org-source" href="data:text/plain;charset=US-ASCII;base64,KGJhc2U2NC1kZWNvZGUtc3RyaW5nICJQQ0V0TFNCMFpYTjBMUzArIikK"&gt;source&lt;/a&gt; &lt;a class="org-source" href="data:text/plain;charset=US-ASCII;base64,KGRlZnVuIHNvdXJjZS1kYXRhLXVyaSAoc291cmNlKQogICJFbmNvZGUgdGhlIHN0cmluZyBpbiBT
T1VSQ0UgdG8gYSBkYXRhIHVyaS4iCiAgKGZvcm1hdAogICAiPGEgY2xhc3M9XCJvcmctc291cmNl
XCIgaHJlZj1cImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJO2Jhc2U2NCwlc1wiPnNv
dXJjZTwvYT4iCiAgIChiYXNlNjQtZW5jb2RlLXN0cmluZyBzb3VyY2UpKSkKCihzb3VyY2UtZGF0
YS11cmkgKGJ1ZmZlci1zdHJpbmcpKQo="&gt;source&lt;/a&gt; &lt;a class="org-source" href="data:text/plain;charset=US-ASCII;base64,KGRlZnVuIGJmLWdldC1wb3N0LWh0bWwgKCkKICAiUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcg
dGhlIFlBTUwgaGVhZGVyLCB0aGUgcG9zdCBodG1sLCBteQpjb3B5cmlnaHQgbGluZSwgYW5kIGEg
bGluayB0byB0aGUgb3JnLXNvdXJjZSBjb2RlLiIKICAoaW50ZXJhY3RpdmUpCiAgKGxldCAoKG9y
Zy1zb3VyY2UgKGJ1ZmZlci1zdHJpbmcpKQoJKHVybC10by1vcmcgKGJmLWdldC11cmwtdG8tb3Jn
LXNvdXJjZSkpCgkoeWFtbCAoYmYtZ2V0LVlBTUwtaGVhZGluZykpCgkoYm9keSAoYmYtZ2V0LUhU
TUwpKSkKCiAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAgICAoaW5zZXJ0IHlhbWwpCiAgICAgIChp
bnNlcnQgYm9keSkKICAgICAgKGluc2VydAogICAgICAgKGZvcm1hdCAiPHA+Q29weXJpZ2h0IChD
KSAlcyBieSBKb2huIEtpdGNoaW4uIFNlZSB0aGUgPGEgaHJlZj1cIi9jb3B5aW5nLmh0bWxcIj5M
aWNlbnNlPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgY29weWluZy48cD4iCgkgICAgICAgKGZv
cm1hdC10aW1lLXN0cmluZyAiJVkiKSkpCiAgICAgIChpbnNlcnQgKGZvcm1hdCAiPHA+PGEgaHJl
Zj1cIiVzXCI+b3JnLW1vZGUgc291cmNlPC9hPjxwPiIKCQkgICAgICB1cmwtdG8tb3JnKSkKICAg
ICAgKGluc2VydCAoZm9ybWF0ICI8cD5PcmctbW9kZSB2ZXJzaW9uID0gJXM8L3A+IiAob3JnLXZl
cnNpb24pKSkKICAgICAgOzsgdGhpcyBpcyB0aGUgb25seSBuZXcgY29kZSB3ZSBuZWVkIHRvIGFk
ZC4KICAgICAgKGluc2VydCAoc291cmNlLWRhdGEtdXJpIG9yZy1zb3VyY2UpKQogICAgICA7OyBy
ZXR1cm4gdmFsdWUKICAgICAgKGJ1ZmZlci1zdHJpbmcpKSkpCg=="&gt;source&lt;/a&gt; &lt;a class="org-source" href="data:text/plain;charset=US-ASCII;base64,KGRlZnVuIGdyYWItb3JnLXNvdXJjZSAodXJsKQogICJFeHRyYWN0IG9yZy1zb3VyY2UgZnJvbSBV
UkwgdG8gYSBidWZmZXIgbmFtZWQgKmdyYWItb3JnLXNvdXJjZSouIgogIChpbnRlcmFjdGl2ZSAi
c1VSTDogIikKICAoc3dpdGNoLXRvLWJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIipncmFiLW9y
Zy1zb3VyY2UqIikpCiAgKGVyYXNlLWJ1ZmZlcikKICAob3JnLW1vZGUpCiAgKGluc2VydAogICAo
d2l0aC1jdXJyZW50LWJ1ZmZlcgogICAgICAgKHVybC1yZXRyaWV2ZS1zeW5jaHJvbm91c2x5IHVy
bCkKICAgICAobGV0IChzdGFydCkKICAgICAgIChyZS1zZWFyY2gtZm9yd2FyZAoJIjxhIGNsYXNz
PVwib3JnLXNvdXJjZVwiIGhyZWY9XCJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD1VUy1BU0NJSTti
YXNlNjQsXFwoW15cIl0qXFwpXFxcIj4iIG5pbCB0KQogICAgICAgKGJhc2U2NC1kZWNvZGUtc3Ry
aW5nICAobWF0Y2gtc3RyaW5nIDEpKSkpKSkK"&gt;source&lt;/a&gt; &lt;a class="org-source" href="data:text/plain;charset=US-ASCII;base64,KG9yZy1lbGVtZW50LW1hcCAob3JnLWVsZW1lbnQtcGFyc2UtYnVmZmVyKSAnc3JjLWJsb2NrCiAg
KGxhbWJkYSAoc3JjLWJsb2NrKQogICAgKHNvdXJjZS1kYXRhLXVyaSAob3JnLWVsZW1lbnQtcHJv
cGVydHkgOnZhbHVlIHNyYy1ibG9jaykpKSkK"&gt;source&lt;/a&gt;)


&lt;p&gt;
I am not sure if this is better or worse than the other approach. I have not tested it very thoroughly, but it seems like it should work pretty generally. I imagine you could also embed other kinds of files in the html, if for some reason you did not want to put the files on your server. Overall this seems to lack some elegance in searching for data, e.g. like &lt;a href="http://en.wikipedia.org/wiki/Embedded_RDF"&gt;RDF&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/RDFa"&gt;RDFa&lt;/a&gt; is supposed to enable, but it might be a step in that direction, using org-mode and Emacs as the editor.
&lt;/p&gt;
&lt;p&gt;Copyright (C) 2015 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2015/05/09/Another-approach-to-embedding-org-source-in-html.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;&lt;p&gt;Org-mode version = 8.2.10&lt;/p&gt;&lt;a class="org-source" href="data:text/plain;charset=US-ASCII;base64,KiBET05FIEFub3RoZXIgYXBwcm9hY2ggdG8gZW1iZWRkaW5nIG9yZy1zb3VyY2UgaW4gaHRtbAog
IENMT1NFRDogWzIwMTUtMDUtMDkgU2F0IDE5OjE5XQogIDpQUk9QRVJUSUVTOgogIDpkYXRlOiAg
ICAgMjAxNS8wNS8wOSAxOToxOToxMAogIDp1cGRhdGVkOiAgMjAxNS8wNS8xMCAwOTozNDo1NQog
IDpjYXRlZ29yaWVzOiBvcmdtb2RlLCBkYXRhCiAgOkVORDoKSW4gdGhpcyBbW2h0dHA6Ly9raXRj
aGluZ3JvdXAuY2hlbWUuY211LmVkdS9ibG9nLzIwMTUvMDUvMDkvQW4tYWx0ZXJuYXRpdmUtYXBw
cm9hY2gtdG8taW5jbHVkaW5nLW9yZy1zb3VyY2UtaW4tYmxvZy1wb3N0cy9dW3Bvc3RdXSBJIGV4
YW1pbmVkIGEgd2F5IHRvIGVtYmVkIHRoZSBvcmctc291cmNlIGluIGEgY29tbWVudCBpbiB0aGUg
aHRtbCBvZiB0aGUgcG9zdCwgYW5kIGRldmVsb3BlZCBhIHJlYXNvbmFibHkgY29udmVuaWVudCB3
YXkgdG8gZXh0cmFjdCB0aGUgc291cmNlIGluIGVtYWNzLiBPbmUgZG93bnNpZGUgb2YgdGhlIGFw
cHJvYWNoIHdhcyB0aGUgbmVlZCB0byBlc2NhcGUgYXQgbGVhc3QgdGhlIGRhc2hlcywgYW5kIHRo
ZW4gdW5lc2NhcGUgdGhlbSBvbiBleHRyYWN0aW9uLiBJIGNhbWUgYWNyb3NzIGFub3RoZXIgaWRl
YSwgd2hpY2ggaXMgdG8gcHV0IHRoZSBvcmctc291cmNlIGluIGJhc2U2NCBlbmNvZGVkIGZvcm0g
aW4gYSBbW2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0YV9VUklfc2NoZW1lXVtkYXRh
IHVyaV1dLgoKRmlyc3QgbGV0IHVzIHNlZSB3aGF0IHRoZSBlbmNvZGluZyBtZWFuczoKCiMrQkVH
SU5fU1JDIGVtYWNzLWxpc3AKKGJhc2U2NC1lbmNvZGUtc3RyaW5nICI8IS0tIHRlc3QtLT4iKQoj
K0VORF9TUkMKIytSRVNVTFRTOgo6IFBDRXRMU0IwWlhOMExTMCsKCkFuZCBkZWNvZGluZzoKCiMr
QkVHSU5fU1JDIGVtYWNzLWxpc3AKKGJhc2U2NC1kZWNvZGUtc3RyaW5nICJQQ0V0TFNCMFpYTjBM
UzArIikKIytFTkRfU1JDCgojK1JFU1VMVFM6CjogPCEtLSB0ZXN0LS0+CgpUaGUgZW5jb2Rpbmcg
bG9va3MgcmFuZG9tLCBidXQgaXQgaXMgcmV2ZXJzaWJsZS4gTW9yZSBpbXBvcnRhbnRseSwgaXQg
cHJvYmFibHkgd2lsbCBub3QgaGF2ZSBhbnkgaHRtbCBsaWtlIGNoYXJhY3RlcnMgaW4gaXQgdGhh
dCBuZWVkIGVzY2FwZWQuIFRoZSBpZGVhIG9mIGEgZGF0YSB1cmkgaXMgdGhhdCB0aGUgZGF0YSBp
dCBzZXJ2ZXMgaXMgZW1iZWRkZWQgaW4gdGhlIFVSTCBocmVmIGF0dHJpYnV0ZS4gVGhpcyBpcyBi
YXNpY2FsbHkgaG93IHRvIG1ha2UgYSBkYXRhIHVyaS4gV2UgZ2l2ZSB0aGUgdXJsIGhlcmUgYSBj
bGFzcyBzbyB3ZSBjYW4gZmluZCBpdCBsYXRlci4KIytCRUdJTl9FWEFNUExFCjxhIGNsYXNzPSJz
b21lLW9yZy1zb3VyY2UiIGhyZWY9ImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJO2Jh
c2U2NCxQQ0V0TFNCMFpYTjBMUzArIj5zb3VyY2U8L2E+CiMrRU5EX0VYQU1QTEUKCkhlcmUgaXMg
dGhlIGFjdHVhbCBodG1sIGZvciB0aGUgYnJvd3Nlci4gSWYgeW91IGNsaWNrIG9uIGl0LCB5b3Vy
IGJyb3dzZXIgYXV0b21hdGljYWxseSBkZWNvZGVzIGl0IGZvciB5b3UhCiMrQkVHSU5fSFRNTAo8
YSBjbGFzcz0ic29tZS1vcmctc291cmNlIiBocmVmPSJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD1V
Uy1BU0NJSTtiYXNlNjQsUENFdExTQjBaWE4wTFMwKyI+c291cmNlPC9hPgojK0VORF9IVE1MCgpT
bywgZHVyaW5nIHRoZSBibG9nIHB1Ymxpc2ggc3RlcCwgd2UganVzdCBuZWVkIHRvIGFkZCB0aGlz
IGxpdHRsZSBzdGVwIHRvIHRoZSBodG1sIGdlbmVyYXRpb24sIGFuZCBpdCB3aWxsIGJlIGluY2x1
ZGVkIGFzIGEgZGF0YSB1cmkuIEhlcmUgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIHRo
ZSBkYXRhIHVyaSBmb3IgdXMsIGFuZCBleGFtcGxlIG9mIHVzaW5nIGl0LiBUaGUgZW5jb2RlZCBz
b3VyY2UgaXMgbm90IGF0IGFsbCBhdHRyYWN0aXZlIHRvIGxvb2sgYXQgaXQsIGJ1dCB5b3UgYWxt
b3N0IG5ldmVyIG5lZWQgdG8gbG9vayBhdCBpdCwgaXQgaXMgaW52aXNpYmxlIGluIHRoZSBicm93
c2VyLiBJbnRlcmVzdGluZ2x5LCBpZiB5b3UgY2xpY2sgb24gdGhlIGxpbmssIHlvdSB3aWxsIHNl
ZSB0aGUgb3JnIHNvdXJjZSByaWdodCBpbiB5b3VyIGJyb3dzZXIhCgojK0JFR0lOX1NSQyBlbWFj
cy1saXNwICA6cmVzdWx0cyBodG1sCihkZWZ1biBzb3VyY2UtZGF0YS11cmkgKHNvdXJjZSkKICAi
RW5jb2RlIHRoZSBzdHJpbmcgaW4gU09VUkNFIHRvIGEgZGF0YSB1cmkuIgogIChmb3JtYXQKICAg
IjxhIGNsYXNzPVwib3JnLXNvdXJjZVwiIGhyZWY9XCJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD1V
Uy1BU0NJSTtiYXNlNjQsJXNcIj5zb3VyY2U8L2E+IgogICAoYmFzZTY0LWVuY29kZS1zdHJpbmcg
c291cmNlKSkpCgooc291cmNlLWRhdGEtdXJpIChidWZmZXItc3RyaW5nKSkKIytFTkRfU1JDCgoj
K1JFU1VMVFM6CiMrQkVHSU5fSFRNTAo8YSBjbGFzcz0ib3JnLXNvdXJjZSIgaHJlZj0iZGF0YTp0
ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUk7YmFzZTY0LEtpQkJibTkwYUdWeUlHRndjSEp2WVdO
b0lIUnZJR1Z0WW1Wa1pHbHVaeUJ2Y21jdGMyOTFjbU5sSUdsdUlHaDBiV3dLU1c0Z2RHaHAKY3lC
YlcyaDBkSEE2THk5cmFYUmphR2x1WjNKdmRYQXVZMmhsYldVdVkyMTFMbVZrZFM5aWJHOW5Mekl3
TVRVdk1EVXZNRGt2UVc0dApZV3gwWlhKdVlYUnBkbVV0WVhCd2NtOWhZMmd0ZEc4dGFXNWpiSFZr
YVc1bkxXOXlaeTF6YjNWeVkyVXRhVzR0WW14dlp5MXdiM04wCmN5OWRXM0J2YzNSZFhTQkpJR1Y0
WVcxcGJtVmtJR0VnZDJGNUlIUnZJR1Z0WW1Wa0lIUm9aU0J2Y21jdGMyOTFjbU5sSUdsdUlHRWcK
WTI5dGJXVnVkQ0JwYmlCMGFHVWdhSFJ0YkNCdlppQjBhR1VnY0c5emRDd2dZVzVrSUdSbGRtVnNi
M0JsWkNCaElISmxZWE52Ym1GaQpiSGtnWTI5dWRtVnVhV1Z1ZENCM1lYa2dkRzhnWlhoMGNtRmpk
Q0IwYUdVZ2MyOTFjbU5sSUdsdUlHVnRZV056TGlCUGJtVWdaRzkzCmJuTnBaR1VnYjJZZ2RHaGxJ
R0Z3Y0hKdllXTm9JSGRoY3lCMGFHVWdibVZsWkNCMGJ5QmxjMk5oY0dVZ1lYUWdiR1ZoYzNRZ2RH
aGwKSUdSaGMyaGxjeXdnWVc1a0lIUm9aVzRnZFc1bGMyTmhjR1VnZEdobGJTQnZiaUJsZUhSeVlX
TjBhVzl1TGlCSklHTmhiV1VnWVdOeQpiM056SUdGdWIzUm9aWElnYVdSbFlTd2dkMmhwWTJnZ2FY
TWdkRzhnY0hWMElIUm9aU0J2Y21jdGMyOTFjbU5sSUdsdUlHSmhjMlUyCk5DQmxibU52WkdWa0lH
WnZjbTBnYVc0Z1lTQmJXMmgwZEhBNkx5OWxiaTUzYVd0cGNHVmthV0V1YjNKbkwzZHBhMmt2UkdG
MFlWOVYKVWtsZmMyTm9aVzFsWFZ0a1lYUmhJSFZ5YVYxZExnb0tSbWx5YzNRZ2JHVjBJSFZ6SUhO
bFpTQjNhR0YwSUhSb1pTQmxibU52WkdsdQpaeUJ0WldGdWN6b0tDaU1yUWtWSFNVNWZVMUpESUdW
dFlXTnpMV3hwYzNBS0tHSmhjMlUyTkMxbGJtTnZaR1V0YzNSeWFXNW5JQ0k4CklTMHRJSFJsYzNR
dExUNGlLUW9qSzBWT1JGOVRVa01LSXl0U1JWTlZURlJUT2dvNklGQkRSWFJNVTBJd1dsaE9NRXhU
TUNzS0NrRnUKWkNCa1pXTnZaR2x1WnpvS0NpTXJRa1ZIU1U1ZlUxSkRJR1Z0WVdOekxXeHBjM0FL
S0dKaGMyVTJOQzFrWldOdlpHVXRjM1J5YVc1bgpJQ0pRUTBWMFRGTkNNRnBZVGpCTVV6QXJJaWtL
SXl0RlRrUmZVMUpEQ2dvaksxSkZVMVZNVkZNNkNqb2dQQ0V0TFNCMFpYTjBMUzArCkNncEJibVFn
ZEdocGN5QnBjeUJpWVhOcFkyRnNiSGtnYUc5M0lIUnZJRzFoYTJVZ1lTQmtZWFJoSUhWeWFTNGdW
MlVnWjJsMlpTQjAKYUdVZ2RYSnNJR2hsY21VZ1lTQmpiR0Z6Y3lCemJ5QjNaU0JqWVc0Z1ptbHVa
Q0JwZENCc1lYUmxjaTRLSXl0Q1JVZEpUbDlGV0VGTgpVRXhGQ2p4aElHTnNZWE56UFNKdmNtY3Rj
MjkxY21ObElpQm9jbVZtUFNKa1lYUmhPblJsZUhRdmNHeGhhVzQ3WTJoaGNuTmxkRDFWClV5MUJV
ME5KU1R0aVlYTmxOalFzVUVORmRFeFRRakJhV0U0d1RGTXdLeUkrYzI5MWNtTmxQQzloUGdvaksw
Vk9SRjlGV0VGTlVFeEYKQ2dwSVpYSmxJR2x6SUhSb1pTQmhZM1IxWVd3Z2FIUnRiQ0JtYjNJZ2RH
aGxJR0p5YjNkelpYSTZJQW9qSzBKRlIwbE9YMGhVVFV3SwpQR0VnWTJ4aGMzTTlJbTl5WnkxemIz
VnlZMlVpSUdoeVpXWTlJbVJoZEdFNmRHVjRkQzl3YkdGcGJqdGphR0Z5YzJWMFBWVlRMVUZUClEw
bEpPMkpoYzJVMk5DeFFRMFYwVEZOQ01GcFlUakJNVXpBcklqNXpiM1Z5WTJVOEwyRStDaU1yUlU1
RVgwaFVUVXdLQ2xOdkxDQmsKZFhKcGJtY2dkR2hsSUdKc2IyY2djSFZpYkdsemFDQnpkR1Z3TENC
M1pTQnFkWE4wSUc1bFpXUWdkRzhnWVdSa0lIUm9hWE1nYkdsMApkR3hsSUhOMFpYQWdkRzhnZEdo
bElHaDBiV3dnWjJWdVpYSmhkR2x2Yml3Z1lXNWtJR2wwSUhkcGJHd2dZbVVnYVc1amJIVmtaV1Fn
CllYTWdZU0JrWVhSaElIVnlhUzRnU0dWeVpTQnBjeUIwYUdVZ1puVnVZM1JwYjI0Z2RHaGhkQ0Ju
Wlc1bGNtRjBaWE1nZEdobElHUmgKZEdFZ2RYSnBJR1p2Y2lCMWN5d2dZVzVrSUdWNFlXMXdiR1Vn
YjJZZ2RYTnBibWNnYVhRNkNnb2pLMEpGUjBsT1gxTlNReUJsYldGagpjeTFzYVhOd0lDQTZjbVZ6
ZFd4MGN5Qm9kRzFzQ2loa1pXWjFiaUJ6YjNWeVkyVXRaR0YwWVMxMWNta2dLSE52ZFhKalpTa0tJ
Q0FpClJXNWpiMlJsSUhSb1pTQnpkSEpwYm1jZ2FXNGdVMDlWVWtORklIUnZJR0VnWkdGMFlTQjFj
bWt1SWdvZ0lDaG1iM0p0WVhRS0lDQWcKSWp4aElHTnNZWE56UFZ3aWIzSm5MWE52ZFhKalpWd2lJ
R2h5WldZOVhDSmtZWFJoT25SbGVIUXZjR3hoYVc0N1kyaGhjbk5sZEQxVgpVeTFCVTBOSlNUdGlZ
WE5sTmpRc0pYTmNJaUJrYjNkdWJHOWhaRDFjSW5OdmRYSmpaUzV2Y21kY0lqNXpiM1Z5WTJVOEwy
RStJaUFLCklDQWdLR0poYzJVMk5DMWxibU52WkdVdGMzUnlhVzVuSUhOdmRYSmpaU2twS1FvS0tI
TnZkWEpqWlMxa1lYUmhMWFZ5YVNBb1luVm0KWm1WeUxYTjBjbWx1WnlrcENpTXJSVTVFWDFOU1F3
b0tDZ29LQ2dvSyIgZG93bmxvYWQ9InNvdXJjZS5vcmciPnNvdXJjZTwvYT4KIytFTkRfSFRNTAoK
Tm93LCB3ZSBpbnRlZ3JhdGUgaXQgaW50byB0aGUgYmxvZ29maWxlIGZ1bmN0aW9uOgoKIytCRUdJ
Tl9TUkMgZW1hY3MtbGlzcAooZGVmdW4gYmYtZ2V0LXBvc3QtaHRtbCAoKQogICJSZXR1cm4gYSBz
dHJpbmcgY29udGFpbmluZyB0aGUgWUFNTCBoZWFkZXIsIHRoZSBwb3N0IGh0bWwsIG15CmNvcHly
aWdodCBsaW5lLCBhbmQgYSBsaW5rIHRvIHRoZSBvcmctc291cmNlIGNvZGUuIgogIChpbnRlcmFj
dGl2ZSkKICAobGV0ICgob3JnLXNvdXJjZSAoYnVmZmVyLXN0cmluZykpCgkodXJsLXRvLW9yZyAo
YmYtZ2V0LXVybC10by1vcmctc291cmNlKSkKCSh5YW1sIChiZi1nZXQtWUFNTC1oZWFkaW5nKSkK
CShib2R5IChiZi1nZXQtSFRNTCkpKQoKICAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgIChpbnNl
cnQgeWFtbCkKICAgICAgKGluc2VydCBib2R5KQogICAgICAoaW5zZXJ0CiAgICAgICAoZm9ybWF0
ICI8cD5Db3B5cmlnaHQgKEMpICVzIGJ5IEpvaG4gS2l0Y2hpbi4gU2VlIHRoZSA8YSBocmVmPVwi
L2NvcHlpbmcuaHRtbFwiPkxpY2Vuc2U8L2E+IGZvciBpbmZvcm1hdGlvbiBhYm91dCBjb3B5aW5n
LjxwPiIKCSAgICAgICAoZm9ybWF0LXRpbWUtc3RyaW5nICIlWSIpKSkKICAgICAgKGluc2VydCAo
Zm9ybWF0ICI8cD48YSBocmVmPVwiJXNcIj5vcmctbW9kZSBzb3VyY2U8L2E+PHA+IgoJCSAgICAg
IHVybC10by1vcmcpKQogICAgICAoaW5zZXJ0IChmb3JtYXQgIjxwPk9yZy1tb2RlIHZlcnNpb24g
PSAlczwvcD4iIChvcmctdmVyc2lvbikpKQogICAgICA7OyB0aGlzIGlzIHRoZSBvbmx5IG5ldyBj
b2RlIHdlIG5lZWQgdG8gYWRkLgogICAgICAoaW5zZXJ0IChzb3VyY2UtZGF0YS11cmkgb3JnLXNv
dXJjZSkpCiAgICAgIDs7IHJldHVybiB2YWx1ZQogICAgICAoYnVmZmVyLXN0cmluZykpKSkKIytF
TkRfU1JDCgpOb3cgd2UgbmVlZCBhIG5ldyBhZGFwdGF0aW9uIG9mIHRoZSBncmFiLW9yZy1zb3Vy
Y2UgZnVuY3Rpb24uIFdlIHN0aWxsIG5lZWQgYSByZWdleHAgc2VhcmNoIHRvIGdldCB0aGUgc291
cmNlLCBhbmQgd2Ugc3RpbGwgbmVlZCB0byBkZWNvZGUgaXQuCgojK0JFR0lOX1NSQyBlbWFjcy1s
aXNwCihkZWZ1biBncmFiLW9yZy1zb3VyY2UgKHVybCkKICAiRXh0cmFjdCBvcmctc291cmNlIGZy
b20gVVJMIHRvIGEgYnVmZmVyIG5hbWVkICpncmFiLW9yZy1zb3VyY2UqLiIKICAoaW50ZXJhY3Rp
dmUgInNVUkw6ICIpCiAgKHN3aXRjaC10by1idWZmZXIgKGdldC1idWZmZXItY3JlYXRlICIqZ3Jh
Yi1vcmctc291cmNlKiIpKQogIChlcmFzZS1idWZmZXIpCiAgKG9yZy1tb2RlKQogIChpbnNlcnQK
ICAgKHdpdGgtY3VycmVudC1idWZmZXIKICAgICAgICh1cmwtcmV0cmlldmUtc3luY2hyb25vdXNs
eSB1cmwpCiAgICAgKGxldCAoc3RhcnQpCiAgICAgICAocmUtc2VhcmNoLWZvcndhcmQKCSI8YSBj
bGFzcz1cIm9yZy1zb3VyY2VcIiBocmVmPVwiZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVND
SUk7YmFzZTY0LFxcKFteXCJdKlxcKVxcXCI+IiBuaWwgdCkKICAgICAgIChiYXNlNjQtZGVjb2Rl
LXN0cmluZyAgKG1hdGNoLXN0cmluZyAxKSkpKSkpCiMrRU5EX1NSQwoKV2hhdCBlbHNlIGNvdWxk
IHdlIGRvIHdpdGggdGhpcz8gT25lIGlkZWEgd291bGQgYmUgdG8gZ2VuZXJhdGUgZGF0YSB1cmlz
IGZvciBlYWNoIGNvZGUgYmxvY2sgdGhhdCB5b3UgY291bGQgb3BlbiBpbiB5b3VyIGJyb3dzZXIu
IEZvciBleGFtcGxlLCBoZXJlIHdlIGdlbmVyYXRlIGEgbGlzdCBvZiBkYXRhIHVyaXMgZm9yIGVh
Y2ggY29kZSBibG9jayBpbiB0aGUgYnVmZmVyLiBXZSBkb24ndCB0YWtlIGNhcmUgdG8gbGFiZWwg
dGhlbSBvciBtYWtlIGl0IGVhc3kgdG8gc2VlIHdoYXQgdGhleSBhcmUsIGJ1dCBpZiB5b3UgY2xp
Y2sgb24gb25lLCB5b3Ugc2hvdWxkIHNlZSBhIHBsYWluIHRleHQgdmVyc2lvbiBvZiB0aGUgYmxv
Y2suIElmIHRoaXMgaXMgZG9uZSBhIGxvdCwgaXQgbWlnaHQgZXZlbiBtYWtlIHNlbnNlIHRvIGNo
YW5nZSB0aGUgbWltZSB0eXBlIHRvIGRvd25sb2FkIHRoZSBjb2RlIGluIHNvbWUgbmF0aXZlIGFw
cC4KCiMrQkVHSU5fU1JDIGVtYWNzLWxpc3AgOnJlc3VsdHMgaHRtbAoob3JnLWVsZW1lbnQtbWFw
IChvcmctZWxlbWVudC1wYXJzZS1idWZmZXIpICdzcmMtYmxvY2sKICAobGFtYmRhIChzcmMtYmxv
Y2spCiAgICAoc291cmNlLWRhdGEtdXJpIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6dmFsdWUgc3Jj
LWJsb2NrKSkpKQojK0VORF9TUkMKCiMrUkVTVUxUUzoKIytCRUdJTl9IVE1MCig8YSBjbGFzcz0i
b3JnLXNvdXJjZSIgaHJlZj0iZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUk7YmFzZTY0
LEtHSmhjMlUyTkMxbGJtTnZaR1V0YzNSeWFXNW5JQ0k4SVMwdElIUmxjM1F0TFQ0aUtRbz0iPnNv
dXJjZTwvYT4gPGEgY2xhc3M9Im9yZy1zb3VyY2UiIGhyZWY9ImRhdGE6dGV4dC9wbGFpbjtjaGFy
c2V0PVVTLUFTQ0lJO2Jhc2U2NCxLR0poYzJVMk5DMWtaV052WkdVdGMzUnlhVzVuSUNKUVEwVjBU
Rk5DTUZwWVRqQk1VekFySWlrSyI+c291cmNlPC9hPiA8YSBjbGFzcz0ib3JnLXNvdXJjZSIgaHJl
Zj0iZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUk7YmFzZTY0LEtHUmxablZ1SUhOdmRY
SmpaUzFrWVhSaExYVnlhU0FvYzI5MWNtTmxLUW9nSUNKRmJtTnZaR1VnZEdobElITjBjbWx1WnlC
cGJpQlQKVDFWU1EwVWdkRzhnWVNCa1lYUmhJSFZ5YVM0aUNpQWdLR1p2Y20xaGRBb2dJQ0FpUEdF
Z1kyeGhjM005WENKdmNtY3RjMjkxY21ObApYQ0lnYUhKbFpqMWNJbVJoZEdFNmRHVjRkQzl3YkdG
cGJqdGphR0Z5YzJWMFBWVlRMVUZUUTBsSk8ySmhjMlUyTkN3bGMxd2lQbk52CmRYSmpaVHd2WVQ0
aUNpQWdJQ2hpWVhObE5qUXRaVzVqYjJSbExYTjBjbWx1WnlCemIzVnlZMlVwS1NrS0NpaHpiM1Z5
WTJVdFpHRjAKWVMxMWNta2dLR0oxWm1abGNpMXpkSEpwYm1jcEtRbz0iPnNvdXJjZTwvYT4gPGEg
Y2xhc3M9Im9yZy1zb3VyY2UiIGhyZWY9ImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJ
O2Jhc2U2NCxLR1JsWm5WdUlHSm1MV2RsZEMxd2IzTjBMV2gwYld3Z0tDa0tJQ0FpVW1WMGRYSnVJ
R0VnYzNSeWFXNW5JR052Ym5SaGFXNXBibWNnCmRHaGxJRmxCVFV3Z2FHVmhaR1Z5TENCMGFHVWdj
Rzl6ZENCb2RHMXNMQ0J0ZVFwamIzQjVjbWxuYUhRZ2JHbHVaU3dnWVc1a0lHRWcKYkdsdWF5QjBi
eUIwYUdVZ2IzSm5MWE52ZFhKalpTQmpiMlJsTGlJS0lDQW9hVzUwWlhKaFkzUnBkbVVwQ2lBZ0tH
eGxkQ0FvS0c5eQpaeTF6YjNWeVkyVWdLR0oxWm1abGNpMXpkSEpwYm1jcEtRb0pLSFZ5YkMxMGJ5
MXZjbWNnS0dKbUxXZGxkQzExY213dGRHOHRiM0puCkxYTnZkWEpqWlNrcENna29lV0Z0YkNBb1lt
WXRaMlYwTFZsQlRVd3RhR1ZoWkdsdVp5a3BDZ2tvWW05a2VTQW9ZbVl0WjJWMExVaFUKVFV3cEtT
a0tDaUFnSUNBb2QybDBhQzEwWlcxd0xXSjFabVpsY2dvZ0lDQWdJQ0FvYVc1elpYSjBJSGxoYld3
cENpQWdJQ0FnSUNocApibk5sY25RZ1ltOWtlU2tLSUNBZ0lDQWdLR2x1YzJWeWRBb2dJQ0FnSUNB
Z0tHWnZjbTFoZENBaVBIQStRMjl3ZVhKcFoyaDBJQ2hECktTQWxjeUJpZVNCS2IyaHVJRXRwZEdO
b2FXNHVJRk5sWlNCMGFHVWdQR0VnYUhKbFpqMWNJaTlqYjNCNWFXNW5MbWgwYld4Y0lqNU0KYVdO
bGJuTmxQQzloUGlCbWIzSWdhVzVtYjNKdFlYUnBiMjRnWVdKdmRYUWdZMjl3ZVdsdVp5NDhjRDRp
Q2drZ0lDQWdJQ0FnS0dadgpjbTFoZEMxMGFXMWxMWE4wY21sdVp5QWlKVmtpS1NrcENpQWdJQ0Fn
SUNocGJuTmxjblFnS0dadmNtMWhkQ0FpUEhBK1BHRWdhSEpsClpqMWNJaVZ6WENJK2IzSm5MVzF2
WkdVZ2MyOTFjbU5sUEM5aFBqeHdQaUlLQ1FrZ0lDQWdJQ0IxY213dGRHOHRiM0puS1NrS0lDQWcK
SUNBZ0tHbHVjMlZ5ZENBb1ptOXliV0YwSUNJOGNENVBjbWN0Ylc5a1pTQjJaWEp6YVc5dUlEMGdK
WE04TDNBK0lpQW9iM0puTFhabApjbk5wYjI0cEtTa0tJQ0FnSUNBZ096c2dkR2hwY3lCcGN5QjBh
R1VnYjI1c2VTQnVaWGNnWTI5a1pTQjNaU0J1WldWa0lIUnZJR0ZrClpDNEtJQ0FnSUNBZ0tHbHVj
MlZ5ZENBb2MyOTFjbU5sTFdSaGRHRXRkWEpwSUc5eVp5MXpiM1Z5WTJVcEtRb2dJQ0FnSUNBN095
QnkKWlhSMWNtNGdkbUZzZFdVS0lDQWdJQ0FnS0dKMVptWmxjaTF6ZEhKcGJtY3BLU2twQ2c9PSI+
c291cmNlPC9hPiA8YSBjbGFzcz0ib3JnLXNvdXJjZSIgaHJlZj0iZGF0YTp0ZXh0L3BsYWluO2No
YXJzZXQ9VVMtQVNDSUk7YmFzZTY0LEtHUmxablZ1SUdkeVlXSXRiM0puTFhOdmRYSmpaU0FvZFhK
c0tRb2dJQ0pGZUhSeVlXTjBJRzl5WnkxemIzVnlZMlVnWm5KdmJTQlYKVWt3Z2RHOGdZU0JpZFda
bVpYSWdibUZ0WldRZ0ttZHlZV0l0YjNKbkxYTnZkWEpqWlNvdUlnb2dJQ2hwYm5SbGNtRmpkR2wy
WlNBaQpjMVZTVERvZ0lpa0tJQ0FvYzNkcGRHTm9MWFJ2TFdKMVptWmxjaUFvWjJWMExXSjFabVps
Y2kxamNtVmhkR1VnSWlwbmNtRmlMVzl5Clp5MXpiM1Z5WTJVcUlpa3BDaUFnS0dWeVlYTmxMV0ox
Wm1abGNpa0tJQ0FvYjNKbkxXMXZaR1VwQ2lBZ0tHbHVjMlZ5ZEFvZ0lDQW8KZDJsMGFDMWpkWEp5
Wlc1MExXSjFabVpsY2dvZ0lDQWdJQ0FnS0hWeWJDMXlaWFJ5YVdWMlpTMXplVzVqYUhKdmJtOTFj
Mng1SUhWeQpiQ2tLSUNBZ0lDQW9iR1YwSUNoemRHRnlkQ2tLSUNBZ0lDQWdJQ2h5WlMxelpXRnlZ
Mmd0Wm05eWQyRnlaQW9KSWp4aElHTnNZWE56ClBWd2liM0puTFhOdmRYSmpaVndpSUdoeVpXWTlY
Q0prWVhSaE9uUmxlSFF2Y0d4aGFXNDdZMmhoY25ObGREMVZVeTFCVTBOSlNUdGkKWVhObE5qUXNY
RndvVzE1Y0lsMHFYRndwWEZ4Y0lqNGlJRzVwYkNCMEtRb2dJQ0FnSUNBZ0tHSmhjMlUyTkMxa1pX
TnZaR1V0YzNSeQphVzVuSUNBb2JXRjBZMmd0YzNSeWFXNW5JREVwS1NrcEtTa0siPnNvdXJjZTwv
YT4gPGEgY2xhc3M9Im9yZy1zb3VyY2UiIGhyZWY9ImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PVVT
LUFTQ0lJO2Jhc2U2NCxLRzl5WnkxbGJHVnRaVzUwTFcxaGNDQW9iM0puTFdWc1pXMWxiblF0Y0dG
eWMyVXRZblZtWm1WeUtTQW5jM0pqTFdKc2IyTnJDaUFnCktHeGhiV0prWVNBb2MzSmpMV0pzYjJO
cktRb2dJQ0FnS0hOdmRYSmpaUzFrWVhSaExYVnlhU0FvYjNKbkxXVnNaVzFsYm5RdGNISnYKY0dW
eWRIa2dPblpoYkhWbElITnlZeTFpYkc5amF5a3BLU2tLIj5zb3VyY2U8L2E+KQojK0VORF9IVE1M
CgoKSSBhbSBub3Qgc3VyZSBpZiB0aGlzIGlzIGJldHRlciBvciB3b3JzZSB0aGFuIHRoZSBvdGhl
ciBhcHByb2FjaC4gSSBoYXZlIG5vdCB0ZXN0ZWQgaXQgdmVyeSB0aG9yb3VnaGx5LCBidXQgaXQg
c2VlbXMgbGlrZSBpdCBzaG91bGQgd29yayBwcmV0dHkgZ2VuZXJhbGx5LiBJIGltYWdpbmUgeW91
IGNvdWxkIGFsc28gZW1iZWQgb3RoZXIga2luZHMgb2YgZmlsZXMgaW4gdGhlIGh0bWwsIGlmIGZv
ciBzb21lIHJlYXNvbiB5b3UgZGlkIG5vdCB3YW50IHRvIHB1dCB0aGUgZmlsZXMgb24geW91ciBz
ZXJ2ZXIuIE92ZXJhbGwgdGhpcyBzZWVtcyB0byBsYWNrIHNvbWUgZWxlZ2FuY2UgaW4gc2VhcmNo
aW5nIGZvciBkYXRhLCBlLmcuIGxpa2UgW1todHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Vt
YmVkZGVkX1JERl1bUkRGXV0gb3IgW1todHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JERmFd
W1JERmFdXSBpcyBzdXBwb3NlZCB0byBlbmFibGUsIGJ1dCBpdCBtaWdodCBiZSBhIHN0ZXAgaW4g
dGhhdCBkaXJlY3Rpb24sIHVzaW5nIG9yZy1tb2RlIGFuZCBFbWFjcyBhcyB0aGUgZWRpdG9yLgoK"&gt;source&lt;/a&gt;]]></content:encoded>
    </item>
    <item>
      <title>Git archives for data sharing</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2013/10/26/Git-archives-for-data-sharing</link>
      <pubDate>Sat, 26 Oct 2013 18:49:02 EDT</pubDate>
      <category><![CDATA[data]]></category>
      <guid isPermaLink="false">fF3ZY_ixudfAXztyPT5Y-OCknvo=</guid>
      <description>Git archives for data sharing</description>
      <content:encoded><![CDATA[


&lt;div id="table-of-contents"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#sec-1"&gt;1. A molecule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sec-2"&gt;2. A bulk calculation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sec-3"&gt;3. Analysis via the JSON files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sec-4"&gt;4. Create the archive file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sec-5"&gt;5. Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
in some past posts we have looked at &lt;a href="http://jkitchin.github.io/blog/2013/10/22/Sharing-data-via-JSON-files/"&gt;constructing&lt;/a&gt; JSON files for data sharing. While functional, that approach requires some extra work to create the data files for sharing, and may not be useful for all sorts of data. For instance you may not want to store electron density in a JSON file. 
&lt;/p&gt;

&lt;p&gt;
Here we consider using &lt;a href="http://git-scm.com/book/ch5-3.html#Preparing-a-Release"&gt;git archives&lt;/a&gt; for packaging exactly the data you used in the same hierarchy as on your file system. The idea is to store your work in a git repository. You commit any data files you would want to share, and then create an archive of that data. This enables you to control what gets shared, while keeping the data that should not be shared out of the archive. 
&lt;/p&gt;

&lt;p&gt;
We will run a few VASP calculations, and summarize each one in a JSON file. We will commit those JSON files to the git repository, and finally make a small archive that contains them.
&lt;/p&gt;

&lt;div id="outline-container-sec-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;&lt;span class="section-number-2"&gt;1&lt;/span&gt; A molecule&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;
&lt;p&gt;
Calculate the total energy of a CO molecule.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;from&lt;/span&gt; ase &lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; Atoms, Atom
&lt;span style="color: #8b0000;"&gt;from&lt;/span&gt; jasp &lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; *
&lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; numpy &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; np
&lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; json
np.set_printoptions(precision=3, suppress=&lt;span style="color: #cd0000;"&gt;True&lt;/span&gt;)

&lt;span style="color: #8b008b;"&gt;co&lt;/span&gt; = Atoms([Atom(&lt;span style="color: #228b22;"&gt;'C'&lt;/span&gt;,[0,   0, 0]),
            Atom(&lt;span style="color: #228b22;"&gt;'O'&lt;/span&gt;,[1.2, 0, 0])],
            cell=(6., 6., 6.))

&lt;span style="color: #8b0000;"&gt;with&lt;/span&gt; jasp(&lt;span style="color: #228b22;"&gt;'molecules/simple-co'&lt;/span&gt;, &lt;span style="color: #ff0000; font-weight: bold;"&gt;#&lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;output dir&lt;/span&gt;
          xc=&lt;span style="color: #228b22;"&gt;'PBE'&lt;/span&gt;,  &lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;the exchange-correlation functional&lt;/span&gt;
          nbands=6,  &lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;number of bands&lt;/span&gt;
          encut=350, &lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;planewave cutoff&lt;/span&gt;
          ismear=1,  &lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;Methfessel-Paxton smearing&lt;/span&gt;
          sigma=0.01,&lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;very small smearing factor for a molecule&lt;/span&gt;
          atoms=co) &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; calc:
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; &lt;span style="color: #228b22;"&gt;'energy = {0} eV'&lt;/span&gt;.&lt;span style="color: #cd0000;"&gt;format&lt;/span&gt;(co.get_potential_energy())
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; co.get_forces()
    &lt;span style="color: #8b0000;"&gt;with&lt;/span&gt; &lt;span style="color: #cd0000;"&gt;open&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;'JSON'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'wb'&lt;/span&gt;) &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; f:
        f.write(json.dumps(calc.&lt;span style="color: #cd0000;"&gt;dict&lt;/span&gt;))
    os.system(&lt;span style="color: #228b22;"&gt;'git add JSON'&lt;/span&gt;)
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
energy = -14.687906 eV
[[ 5.095  0.     0.   ]
 [-5.095  0.     0.   ]]
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-sec-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;&lt;span class="section-number-2"&gt;2&lt;/span&gt; A bulk calculation&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;
&lt;p&gt;
Now we run a bulk calculation
&lt;/p&gt;
&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;from&lt;/span&gt; jasp &lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; *

&lt;span style="color: #8b0000;"&gt;from&lt;/span&gt; ase &lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; Atom, Atoms

&lt;span style="color: #8b008b;"&gt;atoms&lt;/span&gt; = Atoms([Atom(&lt;span style="color: #228b22;"&gt;'Cu'&lt;/span&gt;,  [0.000,      0.000,      0.000])],
              cell=  [[ 1.818,  0.000,  1.818],
                      [ 1.818,  1.818,  0.000],
                      [ 0.000,  1.818,  1.818]])

&lt;span style="color: #8b0000;"&gt;with&lt;/span&gt; jasp(&lt;span style="color: #228b22;"&gt;'bulk/alloy/cu'&lt;/span&gt;,
          xc=&lt;span style="color: #228b22;"&gt;'PBE'&lt;/span&gt;,
          encut=350,
          kpts=(13,13,13),
          nbands=9,
          ibrion=2,
          isif=4,
          nsw=10,
          atoms=atoms) &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; calc:
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; atoms.get_potential_energy()
    &lt;span style="color: #8b0000;"&gt;with&lt;/span&gt; &lt;span style="color: #cd0000;"&gt;open&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;'JSON'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'wb'&lt;/span&gt;) &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; f:
        f.write(json.dumps(calc.&lt;span style="color: #cd0000;"&gt;dict&lt;/span&gt;))
    os.system(&lt;span style="color: #228b22;"&gt;'git add JSON'&lt;/span&gt;)
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
-3.723306
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-sec-3" class="outline-2"&gt;
&lt;h2 id="sec-3"&gt;&lt;span class="section-number-2"&gt;3&lt;/span&gt; Analysis via the JSON files&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;
&lt;p&gt;
This analysis is independent of &lt;code&gt;jasp&lt;/code&gt; and therefore is portable
&lt;/p&gt;

&lt;p&gt;
We can retrieve the bulk data
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; json

&lt;span style="color: #8b0000;"&gt;with&lt;/span&gt; &lt;span style="color: #cd0000;"&gt;open&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;'bulk/alloy/cu/JSON'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'rb'&lt;/span&gt;) &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; f:
    &lt;span style="color: #8b008b;"&gt;d&lt;/span&gt; = json.loads(f.read())
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; d[&lt;span style="color: #228b22;"&gt;'data'&lt;/span&gt;][&lt;span style="color: #228b22;"&gt;'total_energy'&lt;/span&gt;]
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
-3.723306
&lt;/pre&gt;

&lt;p&gt;
Or the molecule data:
&lt;/p&gt;
&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; json

&lt;span style="color: #8b0000;"&gt;with&lt;/span&gt; &lt;span style="color: #cd0000;"&gt;open&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;'molecules/simple-co/JSON'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'rb'&lt;/span&gt;) &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; f:
    &lt;span style="color: #8b008b;"&gt;d&lt;/span&gt; = json.loads(f.read())
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; d[&lt;span style="color: #228b22;"&gt;'data'&lt;/span&gt;][&lt;span style="color: #228b22;"&gt;'total_energy'&lt;/span&gt;]
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
-14.687906
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-sec-4" class="outline-2"&gt;
&lt;h2 id="sec-4"&gt;&lt;span class="section-number-2"&gt;4&lt;/span&gt; Create the archive file&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;
&lt;p&gt;
As you do your work, you add and commit files as needed. For this project all that needs to be shared are the JSON files, and the scripts (which are in this document) that we used to run the calculations and do the analysis. If we are satisfied with the state of the git repository, we create an archive like this:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-sh"&gt;git archive --format zip HEAD -o archive.zip
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Here is the result: &lt;a href="/media/2013-10-26-Git-archives-for-data-sharing/archive.zip"&gt;archive.zip&lt;/a&gt; .
&lt;/p&gt;

&lt;p&gt;
You can download the zip file, unzip it, and rerun the analysis to extract the total energies on any system with a modern Python installation.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-sec-5" class="outline-2"&gt;
&lt;h2 id="sec-5"&gt;&lt;span class="section-number-2"&gt;5&lt;/span&gt; Summary&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-5"&gt;
&lt;p&gt;
This seems to be an easy way to share data from a single project, i.e. a single git repository. It isn't obvious how you would package data from multiple projects, or how you would run multiple projects in a single directory.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Copyright (C) 2013 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2013/10/26/Git-archives-for-data-sharing.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;]]></content:encoded>
    </item>
  </channel>
</rss>
