<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=“www.w3.org/1999/xhtml”> <head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<title></title>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">

table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {

margin: 0; padding: 0; vertical-align: baseline; border: none; }

table.sourceCode { width: 100%; line-height: 100%; } td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: aaaaaa; border-right: 1px solid aaaaaa; } td.sourceCode { padding-left: 5px; } code > span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span.dv { color: #40a070; } code > span.bn { color: #40a070; } code > span.fl { color: #40a070; } code > span.ch { color: #4070a0; } code > span.st { color: #4070a0; } code > span.co { color: #60a0b0; font-style: italic; } code > span.ot { color: #007020; } code > span.al { color: ff0000; font-weight: bold; } code > span.fu { color: #06287e; } code > span.er { color: ff0000; font-weight: bold; }

</style>
<link href="data:text/css,body%20%7B%0A%20%20font%2Dfamily%3A%20Helvetica%2C%20arial%2C%20sans%2Dserif%3B%0A%20%20font%2Dsize%3A%2014px%3B%0A%20%20margin%3A%200%20auto%3B%0A%20%20max%2Dwidth%3A%20790px%3B%0A%20%20line%2Dheight%3A%201%2E6%3B%0A%20%20padding%2Dtop%3A%2010px%3B%0A%20%20padding%2Dbottom%3A%2010px%3B%0A%20%20background%2Dcolor%3A%20white%3B%0A%20%20padding%3A%2030px%3B%20%7D%0A%0Abody%20%3E%20%2A%3Afirst%2Dchild%20%7B%0A%20%20margin%2Dtop%3A%200%20%21important%3B%20%7D%0Abody%20%3E%20%2A%3Alast%2Dchild%20%7B%0A%20%20margin%2Dbottom%3A%200%20%21important%3B%20%7D%0A%0Aa%20%7B%0A%20%20color%3A%20%234183C4%3B%20%7D%0Aa%2Eabsent%20%7B%0A%20%20color%3A%20%23cc0000%3B%20%7D%0Aa%2Eanchor%20%7B%0A%20%20display%3A%20block%3B%0A%20%20padding%2Dleft%3A%2030px%3B%0A%20%20margin%2Dleft%3A%20%2D30px%3B%0A%20%20cursor%3A%20pointer%3B%0A%20%20position%3A%20absolute%3B%0A%20%20top%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20bottom%3A%200%3B%20%7D%0A%0Ah1%20a%2C%20h2%20a%2C%20h3%20a%2C%20h4%20a%2C%20h5%20a%2C%20h6%20a%20%7B%0A%20%20color%3A%20black%20%21important%3B%0A%20%20text%2Ddecoration%3A%20none%20%21important%3B%0A%7D%0A%0Ah1%2C%20h2%2C%20h3%2C%20h4%2C%20h5%2C%20h6%20%7B%0A%20%20margin%3A%2020px%200%2010px%3B%0A%20%20padding%3A%200%3B%0A%20%20font%2Dweight%3A%20bold%3B%0A%20%20%2Dwebkit%2Dfont%2Dsmoothing%3A%20antialiased%3B%0A%20%20cursor%3A%20text%3B%0A%20%20position%3A%20relative%3B%20%7D%0A%0Ah1%3Ahover%20a%2Eanchor%2C%20h2%3Ahover%20a%2Eanchor%2C%20h3%3Ahover%20a%2Eanchor%2C%20h4%3Ahover%20a%2Eanchor%2C%20h5%3Ahover%20a%2Eanchor%2C%20h6%3Ahover%20a%2Eanchor%20%7B%0A%20%20background%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA09pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoMTMuMCAyMDEyMDMwNS5tLjQxNSAyMDEyLzAzLzA1OjIxOjAwOjAwKSAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM2NjlDQjI4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM2NjlDQjM4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzY2OUNCMDg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzY2OUNCMTg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI%2FPsQhXeAAAABfSURBVHjaYvz%2F%2Fz8DJYCRUgMYQAbAMBQIAvEqkBQWXI6sHqwHiwG70TTBxGaiWwjCTGgOUgJiF1J8wMRAIUA34B4Q76HUBelAfJYSA0CuMIEaRP8wGIkGMA54bgQIMACAmkXJi0hKJQAAAABJRU5ErkJggg%3D%3D%29%20no%2Drepeat%2010px%20center%3B%0A%20%20text%2Ddecoration%3A%20none%3B%20%7D%0A%0Ah1%20tt%2C%20h1%20code%20%7B%0A%20%20font%2Dsize%3A%20inherit%3B%20%7D%0A%0Ah2%20tt%2C%20h2%20code%20%7B%0A%20%20font%2Dsize%3A%20inherit%3B%20%7D%0A%0Ah3%20tt%2C%20h3%20code%20%7B%0A%20%20font%2Dsize%3A%20inherit%3B%20%7D%0A%0Ah4%20tt%2C%20h4%20code%20%7B%0A%20%20font%2Dsize%3A%20inherit%3B%20%7D%0A%0Ah5%20tt%2C%20h5%20code%20%7B%0A%20%20font%2Dsize%3A%20inherit%3B%20%7D%0A%0Ah6%20tt%2C%20h6%20code%20%7B%0A%20%20font%2Dsize%3A%20inherit%3B%20%7D%0A%0Ah1%20%7B%0A%20%20font%2Dsize%3A%2028px%3B%0A%20%20color%3A%20black%3B%20%7D%0A%0Ah2%20%7B%0A%20%20font%2Dsize%3A%2024px%3B%0A%20%20border%2Dbottom%3A%201px%20solid%20%23cccccc%3B%0A%20%20color%3A%20black%3B%20%7D%0A%0Ah3%20%7B%0A%20%20font%2Dsize%3A%2018px%3B%20%7D%0A%0Ah4%20%7B%0A%20%20font%2Dsize%3A%2016px%3B%20%7D%0A%0Ah5%20%7B%0A%20%20font%2Dsize%3A%2014px%3B%20%7D%0A%0Ah6%20%7B%0A%20%20color%3A%20%23777777%3B%0A%20%20font%2Dsize%3A%2014px%3B%20%7D%0A%0Ap%2C%20blockquote%2C%20ul%2C%20ol%2C%20dl%2C%20li%2C%20table%2C%20pre%20%7B%0A%20%20margin%3A%2015px%200%3B%20%7D%0A%0Ahr%20%7B%0A%20%20background%3A%20transparent%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI%2FPqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC%29%20repeat%2Dx%200%200%3B%0A%20%20border%3A%200%20none%3B%0A%20%20color%3A%20%23cccccc%3B%0A%20%20height%3A%204px%3B%0A%20%20padding%3A%200%3B%20%7D%0A%0Abody%20%3E%20h2%3Afirst%2Dchild%20%7B%0A%20%20margin%2Dtop%3A%200%3B%0A%20%20padding%2Dtop%3A%200%3B%20%7D%0Abody%20%3E%20h1%3Afirst%2Dchild%20%7B%0A%20%20margin%2Dtop%3A%200%3B%0A%20%20padding%2Dtop%3A%200%3B%20%7D%0A%20%20body%20%3E%20h1%3Afirst%2Dchild%20%2B%20h2%20%7B%0A%20%20%20%20margin%2Dtop%3A%200%3B%0A%20%20%20%20padding%2Dtop%3A%200%3B%20%7D%0Abody%20%3E%20h3%3Afirst%2Dchild%2C%20body%20%3E%20h4%3Afirst%2Dchild%2C%20body%20%3E%20h5%3Afirst%2Dchild%2C%20body%20%3E%20h6%3Afirst%2Dchild%20%7B%0A%20%20margin%2Dtop%3A%200%3B%0A%20%20padding%2Dtop%3A%200%3B%20%7D%0A%0Aa%3Afirst%2Dchild%20h1%2C%20a%3Afirst%2Dchild%20h2%2C%20a%3Afirst%2Dchild%20h3%2C%20a%3Afirst%2Dchild%20h4%2C%20a%3Afirst%2Dchild%20h5%2C%20a%3Afirst%2Dchild%20h6%20%7B%0A%20%20margin%2Dtop%3A%200%3B%0A%20%20padding%2Dtop%3A%200%3B%20%7D%0A%0Ah1%20p%2C%20h2%20p%2C%20h3%20p%2C%20h4%20p%2C%20h5%20p%2C%20h6%20p%20%7B%0A%20%20margin%2Dtop%3A%200%3B%20%7D%0A%0Ali%20p%2Efirst%20%7B%0A%20%20display%3A%20inline%2Dblock%3B%20%7D%0A%0Aul%2C%20ol%20%7B%0A%20%20padding%2Dleft%3A%2030px%3B%20%7D%0A%0Aul%20%3Afirst%2Dchild%2C%20ol%20%3Afirst%2Dchild%20%7B%0A%20%20margin%2Dtop%3A%200%3B%20%7D%0A%0Aul%20%3Alast%2Dchild%2C%20ol%20%3Alast%2Dchild%20%7B%0A%20%20margin%2Dbottom%3A%200%3B%20%7D%0A%0Adl%20%7B%0A%20%20padding%3A%200%3B%20%7D%0A%20%20dl%20dt%20%7B%0A%20%20%20%20font%2Dsize%3A%2014px%3B%0A%20%20%20%20font%2Dweight%3A%20bold%3B%0A%20%20%20%20font%2Dstyle%3A%20italic%3B%0A%20%20%20%20padding%3A%200%3B%0A%20%20%20%20margin%3A%2015px%200%205px%3B%20%7D%0A%20%20%20%20dl%20dt%3Afirst%2Dchild%20%7B%0A%20%20%20%20%20%20padding%3A%200%3B%20%7D%0A%20%20%20%20dl%20dt%20%3E%20%3Afirst%2Dchild%20%7B%0A%20%20%20%20%20%20margin%2Dtop%3A%200%3B%20%7D%0A%20%20%20%20dl%20dt%20%3E%20%3Alast%2Dchild%20%7B%0A%20%20%20%20%20%20margin%2Dbottom%3A%200%3B%20%7D%0A%20%20dl%20dd%20%7B%0A%20%20%20%20margin%3A%200%200%2015px%3B%0A%20%20%20%20padding%3A%200%2015px%3B%20%7D%0A%20%20%20%20dl%20dd%20%3E%20%3Afirst%2Dchild%20%7B%0A%20%20%20%20%20%20margin%2Dtop%3A%200%3B%20%7D%0A%20%20%20%20dl%20dd%20%3E%20%3Alast%2Dchild%20%7B%0A%20%20%20%20%20%20margin%2Dbottom%3A%200%3B%20%7D%0A%0Ablockquote%20%7B%0A%20%20border%2Dleft%3A%204px%20solid%20%23dddddd%3B%0A%20%20padding%3A%200%2015px%3B%0A%20%20color%3A%20%23777777%3B%20%7D%0A%20%20blockquote%20%3E%20%3Afirst%2Dchild%20%7B%0A%20%20%20%20margin%2Dtop%3A%200%3B%20%7D%0A%20%20blockquote%20%3E%20%3Alast%2Dchild%20%7B%0A%20%20%20%20margin%2Dbottom%3A%200%3B%20%7D%0A%0Atable%20%7B%0A%20%20padding%3A%200%3B%20%7D%0A%20%20table%20tr%20%7B%0A%20%20%20%20border%2Dtop%3A%201px%20solid%20%23cccccc%3B%0A%20%20%20%20background%2Dcolor%3A%20white%3B%0A%20%20%20%20margin%3A%200%3B%0A%20%20%20%20padding%3A%200%3B%20%7D%0A%20%20%20%20table%20tr%3Anth%2Dchild%282n%29%20%7B%0A%20%20%20%20%20%20background%2Dcolor%3A%20%23f8f8f8%3B%20%7D%0A%20%20%20%20table%20tr%20th%20%7B%0A%20%20%20%20%20%20font%2Dweight%3A%20bold%3B%0A%20%20%20%20%20%20border%3A%201px%20solid%20%23cccccc%3B%0A%20%20%20%20%20%20text%2Dalign%3A%20left%3B%0A%20%20%20%20%20%20margin%3A%200%3B%0A%20%20%20%20%20%20padding%3A%206px%2013px%3B%20%7D%0A%20%20%20%20table%20tr%20td%20%7B%0A%20%20%20%20%20%20border%3A%201px%20solid%20%23cccccc%3B%0A%20%20%20%20%20%20text%2Dalign%3A%20left%3B%0A%20%20%20%20%20%20margin%3A%200%3B%0A%20%20%20%20%20%20padding%3A%206px%2013px%3B%20%7D%0A%20%20%20%20table%20tr%20th%20%3Afirst%2Dchild%2C%20table%20tr%20td%20%3Afirst%2Dchild%20%7B%0A%20%20%20%20%20%20margin%2Dtop%3A%200%3B%20%7D%0A%20%20%20%20table%20tr%20th%20%3Alast%2Dchild%2C%20table%20tr%20td%20%3Alast%2Dchild%20%7B%0A%20%20%20%20%20%20margin%2Dbottom%3A%200%3B%20%7D%0A%0Aimg%20%7B%0A%20%20max%2Dwidth%3A%20100%25%3B%20%7D%0A%0Aspan%2Eframe%20%7B%0A%20%20display%3A%20block%3B%0A%20%20overflow%3A%20hidden%3B%20%7D%0A%20%20span%2Eframe%20%3E%20span%20%7B%0A%20%20%20%20border%3A%201px%20solid%20%23dddddd%3B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20float%3A%20left%3B%0A%20%20%20%20overflow%3A%20hidden%3B%0A%20%20%20%20margin%3A%2013px%200%200%3B%0A%20%20%20%20padding%3A%207px%3B%0A%20%20%20%20width%3A%20auto%3B%20%7D%0A%20%20span%2Eframe%20span%20img%20%7B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20float%3A%20left%3B%20%7D%0A%20%20span%2Eframe%20span%20span%20%7B%0A%20%20%20%20clear%3A%20both%3B%0A%20%20%20%20color%3A%20%23333333%3B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20padding%3A%205px%200%200%3B%20%7D%0Aspan%2Ealign%2Dcenter%20%7B%0A%20%20display%3A%20block%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20clear%3A%20both%3B%20%7D%0A%20%20span%2Ealign%2Dcenter%20%3E%20span%20%7B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20overflow%3A%20hidden%3B%0A%20%20%20%20margin%3A%2013px%20auto%200%3B%0A%20%20%20%20text%2Dalign%3A%20center%3B%20%7D%0A%20%20span%2Ealign%2Dcenter%20span%20img%20%7B%0A%20%20%20%20margin%3A%200%20auto%3B%0A%20%20%20%20text%2Dalign%3A%20center%3B%20%7D%0Aspan%2Ealign%2Dright%20%7B%0A%20%20display%3A%20block%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20clear%3A%20both%3B%20%7D%0A%20%20span%2Ealign%2Dright%20%3E%20span%20%7B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20overflow%3A%20hidden%3B%0A%20%20%20%20margin%3A%2013px%200%200%3B%0A%20%20%20%20text%2Dalign%3A%20right%3B%20%7D%0A%20%20span%2Ealign%2Dright%20span%20img%20%7B%0A%20%20%20%20margin%3A%200%3B%0A%20%20%20%20text%2Dalign%3A%20right%3B%20%7D%0Aspan%2Efloat%2Dleft%20%7B%0A%20%20display%3A%20block%3B%0A%20%20margin%2Dright%3A%2013px%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20float%3A%20left%3B%20%7D%0A%20%20span%2Efloat%2Dleft%20span%20%7B%0A%20%20%20%20margin%3A%2013px%200%200%3B%20%7D%0Aspan%2Efloat%2Dright%20%7B%0A%20%20display%3A%20block%3B%0A%20%20margin%2Dleft%3A%2013px%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20float%3A%20right%3B%20%7D%0A%20%20span%2Efloat%2Dright%20%3E%20span%20%7B%0A%20%20%20%20display%3A%20block%3B%0A%20%20%20%20overflow%3A%20hidden%3B%0A%20%20%20%20margin%3A%2013px%20auto%200%3B%0A%20%20%20%20text%2Dalign%3A%20right%3B%20%7D%0A%0Acode%2C%20tt%20%7B%0A%20%20margin%3A%200%202px%3B%0A%20%20padding%3A%200%205px%3B%0A%20%20white%2Dspace%3A%20nowrap%3B%0A%20%20border%3A%201px%20solid%20%23eaeaea%3B%0A%20%20background%2Dcolor%3A%20%23f8f8f8%3B%0A%20%20border%2Dradius%3A%203px%3B%20%7D%0A%0Apre%20code%20%7B%0A%20%20margin%3A%200%3B%0A%20%20padding%3A%200%3B%0A%20%20white%2Dspace%3A%20pre%3B%0A%20%20border%3A%20none%3B%0A%20%20background%3A%20transparent%3B%20%7D%0A%0A%2Ehighlight%20pre%20%7B%0A%20%20background%2Dcolor%3A%20%23f8f8f8%3B%0A%20%20border%3A%201px%20solid%20%23cccccc%3B%0A%20%20font%2Dsize%3A%2013px%3B%0A%20%20line%2Dheight%3A%2019px%3B%0A%20%20overflow%3A%20auto%3B%0A%20%20padding%3A%206px%2010px%3B%0A%20%20border%2Dradius%3A%203px%3B%20%7D%0A%0Apre%20%7B%0A%20%20background%2Dcolor%3A%20%23f8f8f8%3B%0A%20%20border%3A%201px%20solid%20%23cccccc%3B%0A%20%20font%2Dsize%3A%2013px%3B%0A%20%20line%2Dheight%3A%2019px%3B%0A%20%20overflow%3A%20auto%3B%0A%20%20padding%3A%206px%2010px%3B%0A%20%20border%2Dradius%3A%203px%3B%20%7D%0A%20%20pre%20code%2C%20pre%20tt%20%7B%0A%20%20%20%20background%2Dcolor%3A%20transparent%3B%0A%20%20%20%20border%3A%20none%3B%20%7D%0A%0A%2Efigure%20%7B%0A%20%20%20display%3A%20block%3B%0A%20%20%20text%2Dalign%3A%20center%3B%0A%20%20%20margin%3A%2010px%200%2010px%200%3B%0A%20%20%20padding%3A%2010px%2010px%200px%2010px%3B%0A%20%20%20border%3A%202px%20solid%20%23eaeaea%3B%0A%20%20%20background%2Dcolor%3A%20%23f8f8f8%3B%0A%20%20%20border%2Dradius%3A%203px%3B%0A%7D%0A%0A%2Efigure%20img%20%7B%0A%20%20%20max%2Dwidth%3A%20700px%3B%0A%20%20%20background%2Dcolor%3A%20white%3B%0A%7D%0A%0A%2Ecaption%20%7B%0A%20%20%20font%2Dsize%3A%2016px%3B%0A%20%20%20font%2Dweight%3A%20bold%3B%0A%20%20%20%2Dwebkit%2Dfont%2Dsmoothing%3A%20antialiased%3B%0A%7D%0A" rel="stylesheet" type="text/css" />

</head> <body> <div id=“TOC”> <ul> <li><a href=“#elparser”>Elparser</a><ul> <li><a href=“#sample-code”>Sample code</a><ul> <li><a href=“#parsing-s-exp-and-getting-ruby-objects”>Parsing S-exp and getting ruby objects</a></li> <li><a href=“#encoding-ruby-objects-into-s-exp”>Encoding ruby objects into S-exp</a></li> </ul></li> <li><a href=“#installation”>Installation</a></li> <li><a href=“#api-document”>API Document</a><ul> <li><a href=“#parser”>Parser</a></li> <li><a href=“#encoder”>Encoder</a></li> <li><a href=“#object-mapping”>Object Mapping</a></li> </ul></li> </ul></li> </ul> </div> <h1 id=“elparser”><a href=“#elparser”>Elparser</a></h1> <p>A parser for S-expression of emacs lisp and some utilities.</p> <h2 id=“sample-code”><a href=“#sample-code”>Sample code</a></h2> <h3 id=“parsing-s-exp-and-getting-ruby-objects”><a href=“#parsing-s-exp-and-getting-ruby-objects”>Parsing S-exp and getting ruby objects</a></h3> <pre class=“sourceCode ruby”><code class=“sourceCode ruby”>require <span class=“st”>‘elparser’</span>

parser = <span class=“dt”>Elparser</span>::<span class=“dt”>Parser</span>.new

<span class="co"># list and literals</span>

obj1 = parser.parse(<span class=“st”>&quot;(1 2.3 a "b&quot; () (c ‘d))&quot;</span>)

p obj1.to_ruby

<span class="co"># =&gt; [1, 2.3, :a, &quot;b&quot;, nil, [:c, [:d]]]</span>

<span class="co"># alist and hash</span>

obj2 = parser.parse(<span class=“st”>&quot;( (a . 1) (b . "xxx&quot;) (c 3 4) ("d&quot; . "e&quot;))&quot;</span>)

p obj2.to_ruby

<span class="co"># =&gt; [[:a, 1], [:b, &quot;xxx&quot;], [:c, 3, 4], [&quot;d&quot;, &quot;e&quot;]] </span>

p obj2.to_h

<span class="co">#  =&gt; {:a=&gt;1, :b=&gt;&quot;xxx&quot;, :c=&gt;[3, 4], &quot;d&quot;=&gt;&quot;e&quot;} </span></code></pre>

<h3 id=“encoding-ruby-objects-into-s-exp”><a href=“#encoding-ruby-objects-into-s-exp”>Encoding ruby objects into S-exp</a></h3> <pre class=“sourceCode ruby”><code class=“sourceCode ruby”>p <span class=“dt”>Elparser</span>::encode([<span class=“dv”>1</span>,<span class=“fl”>1.2</span>,-<span class=“dv”>4</span>,<span class=“st”>&quot;xxx&quot;</span>,<span class=“st”>:www</span>,<span class=“dv”>true</span>,<span class=“dv”>nil</span>])

<span class="co"># =&gt; &quot;(1 1.2 -4 \&quot;xxx\&quot; www t nil)&quot;</span>

p <span class=“dt”>Elparser</span>::encode({<span class=“st”>:a</span> =&gt; [<span class=“dv”>1</span>,<span class=“dv”>2</span>,<span class=“dv”>3</span>], <span class=“st”>:b</span> =&gt; {<span class=“st”>:c</span> =&gt; [<span class=“dv”>4</span>,<span class=“dv”>5</span>,<span class=“dv”>6</span>]}})

<span class="co"># =&gt; &quot;((a 1 2 3) (b (c 4 5 6)))&quot;</span></code></pre>

<h2 id=“installation”><a href=“#installation”>Installation</a></h2> <p>Add this line to your application’s Gemfile:</p> <pre class=“sourceCode ruby”><code class=“sourceCode ruby”>gem <span class=“st”>‘elparser’</span></code></pre> <p>And then execute:</p> <pre>$ bundle</pre> <p>Or install it yourself as:</p> <pre>$ gem install elparser</pre> <h2 id=“api-document”><a href=“#api-document”>API Document</a></h2> <h3 id=“parser”><a href=“#parser”>Parser</a></h3> <p>The class Elparser::Parser is parser for emacs-lisp S-expression. The user program creates an instance of the class and parses the S-exp string with parse method.</p> <p>If the parse method succeed in parsing the given S-exp string, it returns a SExp object which is AST of S-exp. Invoking to_ruby method of the SExp object, one can obtain a ruby object.</p> <p>The SExp objects are instances of SExpXXX classes: SExpNumber, SExpString, SExpSymbol, SExpNil, SExpCons, SExpList, SExpListDot and SExpQuoted. Each classes represent corresponding S-exp objects.</p> <p>If the given S-exp list is an alist, invoking SExpList#to_h method, a Hash object can be obtained.</p> <h3 id=“encoder”><a href=“#encoder”>Encoder</a></h3> <p>The module method Elparser::encode encodes the ruby objects into elisp S-expressions.</p> <p>If an object which is not defined in serialization rules is given, this method raises the exception StandardError with some messages. See the next section for the encoding detail.</p> <h3 id=“object-mapping”><a href=“#object-mapping”>Object Mapping</a></h3> <p>The primitive objects are translated straightforwardly.</p> <h4 id=“decoding-s-expression—ruby”><a href=“#decoding-s-expression—ruby”>Decoding (S-expression -&gt; Ruby)</a></h4> <p>A quoted expression is translated to an array. Both nil and () are translated to nil. Cons cells and lists are translated to arrays.</p> <table> <thead> <tr class=“header”> <th align=“left”>type</th> <th align=“left”>S-exp (input)</th> <th align=“left”>Ruby (output)</th> </tr> </thead> <tbody> <tr class=“odd”> <td align=“left”>integer</td> <td align=“left”>1</td> <td align=“left”>1</td> </tr> <tr class=“even”> <td align=“left”>float</td> <td align=“left”>1.2</td> <td align=“left”>1.2</td> </tr> <tr class=“odd”> <td align=“left”>float</td> <td align=“left”>1e4</td> <td align=“left”>1e4</td> </tr> <tr class=“even”> <td align=“left”>float</td> <td align=“left”>.45</td> <td align=“left”>.45</td> </tr> <tr class=“odd”> <td align=“left”>symbol</td> <td align=“left”>abc</td> <td align=“left”>:abc</td> </tr> <tr class=“even”> <td align=“left”>string</td> <td align=“left”>&quot;abc&quot;</td> <td align=“left”>&quot;abc&quot;</td> </tr> <tr class=“odd”> <td align=“left”>quote</td> <td align=“left”>'abc</td> <td align=“left”>[:abc]</td> </tr> <tr class=“even”> <td align=“left”>null</td> <td align=“left”>nil</td> <td align=“left”>nil</td> </tr> <tr class=“odd”> <td align=“left”>empty list</td> <td align=“left”>()</td> <td align=“left”>nil</td> </tr> <tr class=“even”> <td align=“left”>list</td> <td align=“left”>(1 2)</td> <td align=“left”>[1,2]</td> </tr> <tr class=“odd”> <td align=“left”>nest list</td> <td align=“left”>(a (b))</td> <td align=“left”>[:a [:b]]</td> </tr> <tr class=“even”> <td align=“left”>cons cell</td> <td align=“left”>(a . b)</td> <td align=“left”>[:a,:b]</td> </tr> <tr class=“odd”> <td align=“left”>dot list</td> <td align=“left”>(a b . d)</td> <td align=“left”>[:a,:b,:c]</td> </tr> <tr class=“even”> <td align=“left”>alist(to_ruby)</td> <td align=“left”>((a . 1) (b . 2))</td> <td align=“left”>[[:a,1],[:b,2]]</td> </tr> <tr class=“odd”> <td align=“left”>alist(to_h)</td> <td align=“left”>((a . 1) (b . 2))</td> <td align=“left”>{:a=&gt;1,:b=&gt;2}</td> </tr> <tr class=“even”> <td align=“left”>alist list</td> <td align=“left”>((a 1 2) (b . 3))</td> <td align=“left”>{:a=&gt;[1,2],:b=&gt;3}</td> </tr> </tbody> </table> <h4 id=“encoding-ruby—s-expression”><a href=“#encoding-ruby—s-expression”>Encoding (Ruby -&gt; S-expression)</a></h4> <p>The Array and Hash objects are translated to lists and alist respectively. Cons cells and quoted expressions can’t be expressed by any Ruby object. If those S-expressions are needed, one can obtain such S-expressions with creating instances of SExpCons and SExpQuoted directly and calling the to_s method.</p> <table> <thead> <tr class=“header”> <th align=“left”>type</th> <th align=“left”>Ruby (input)</th> <th align=“left”>S-exp (output)</th> </tr> </thead> <tbody> <tr class=“odd”> <td align=“left”>primitive</td> <td align=“left”>[1,1.2,-4,&quot;xxx&quot;,:www,true,nil]</td> <td align=“left”>(1 1.2 -4 &quot;xxx&quot; www t nil)</td> </tr> <tr class=“even”> <td align=“left”>empty list</td> <td align=“left”>[]</td> <td align=“left”>nil</td> </tr> <tr class=“odd”> <td align=“left”>nest list</td> <td align=“left”>[1,[2,[3,4]]]</td> <td align=“left”>(1 (2 (3 4)))</td> </tr> <tr class=“even”> <td align=“left”>hash</td> <td align=“left”>{&quot;a&quot; =&gt; &quot;b&quot;, &quot;c&quot; =&gt; &quot;d&quot;}</td> <td align=“left”>((&quot;a&quot; . &quot;b&quot;) (&quot;c&quot; . &quot;d&quot;))</td> </tr> <tr class=“odd”> <td align=“left”>hash</td> <td align=“left”>{:a =&gt; [1,2,3], :b =&gt; {:c =&gt; [4,5,6]}}</td> <td align=“left”>((a 1 2 3) (b (c 4 5 6)))</td> </tr> </tbody> </table> </body> </html>