~evanj/cms

cea564e6f0e42330bac4c0296fa8b5a767467285 — Evan M Jones 4 months ago 0307533
WIP(doc): Adding a documentation page. Only Spaces API complete so far.
M cms.go => cms.go +61 -80
@@ 9,6 9,7 @@ import (

	"git.sr.ht/~evanj/cms/internal/c/content"
	"git.sr.ht/~evanj/cms/internal/c/contenttype"
	"git.sr.ht/~evanj/cms/internal/c/doc"
	"git.sr.ht/~evanj/cms/internal/c/file"
	"git.sr.ht/~evanj/cms/internal/c/hook"
	"git.sr.ht/~evanj/cms/internal/c/ping"


@@ 41,16 42,11 @@ var (
)

type App struct {
	log         *log.Logger
	content     http.Handler
	contenttype http.Handler
	space       http.Handler
	user        http.Handler
	hook        http.Handler
	ping        http.Handler
	file        http.Handler
	static      http.Handler
	redirect    http.Handler
	log *log.Logger

	// NOTE: Concurrent read (only) is OK. This is never wrote (but defined on
	// server startup).
	handlers map[string]http.Handler
}

func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {


@@ 60,39 56,18 @@ func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
		return
	}

	switch parts[1] {
	case "file":
		a.file.ServeHTTP(w, r)
		return
	case "static":
		a.static.ServeHTTP(w, r)
		return
	case "redirect":
		a.redirect.ServeHTTP(w, r)
		return
	case "ping":
		a.ping.ServeHTTP(w, r)
		return
	case "":
		fallthrough
	case "user":
		a.user.ServeHTTP(w, r)
		return
	case "hook":
		a.hook.ServeHTTP(w, r)
		return
	case "space":
		a.space.ServeHTTP(w, r)
		return
	case "contenttype":
		a.contenttype.ServeHTTP(w, r)
		return
	case "content":
		a.content.ServeHTTP(w, r)
	namespace := parts[1]
	if namespace == "" {
		namespace = "user"
	}

	h, ok := a.handlers[namespace]
	if !ok {
		http.NotFound(w, r)
		return
	}

	http.NotFound(w, r)
	h.ServeHTTP(w, r)
}

func init() {


@@ 125,46 100,52 @@ func init() {
	fs := e3.New(e3user, e3pass, e3url)

	app = &App{
		log: applogger,
		content: content.New(
			log.New(w, "[cms:content] ", 0),
			cacher,
			fs,
			webhook.New(log.New(w, "[cms:hook] ", 0), cacher),
			url,
		),
		contenttype: contenttype.New(
			log.New(w, "[cms:contenttype] ", 0),
			cacher,
		),
		space: space.New(
			log.New(w, "[cms:space] ", 0),
			cacher,
		),
		user: user.New(
			log.New(w, "[cms:user] ", 0),
			cacher,
			signupEnabled,
		),
		hook: hook.New(
			log.New(w, "[cms:hook] ", 0),
			cacher,
		),
		ping: ping.New(
			log.New(w, "[cms:ping] ", 0),
			cacher,
		),
		file: file.New(
			log.New(w, "[cms:static] ", 0),
			cacher,
			fs,
			url,
		),
		static: http.StripPrefix("/static", http.FileServer(http.Dir(staticDir))),
		redirect: redirect.New(
			log.New(w, "[cms:redirect] ", 0),
			cacher,
		),
		applogger,
		map[string]http.Handler{
			"content": content.New(
				log.New(w, "[cms:content] ", 0),
				cacher,
				fs,
				webhook.New(log.New(w, "[cms:hook] ", 0), cacher),
				url,
			),
			"contenttype": contenttype.New(
				log.New(w, "[cms:contenttype] ", 0),
				cacher,
			),
			"space": space.New(
				log.New(w, "[cms:space] ", 0),
				cacher,
			),
			"user": user.New(
				log.New(w, "[cms:user] ", 0),
				cacher,
				signupEnabled,
			),
			"hook": hook.New(
				log.New(w, "[cms:hook] ", 0),
				cacher,
			),
			"ping": ping.New(
				log.New(w, "[cms:ping] ", 0),
				cacher,
			),
			"file": file.New(
				log.New(w, "[cms:static] ", 0),
				cacher,
				fs,
				url,
			),
			"static": http.StripPrefix("/static", http.FileServer(http.Dir(staticDir))),
			"redirect": redirect.New(
				log.New(w, "[cms:redirect] ", 0),
				cacher,
			),
			"doc": doc.New(
				log.New(w, "[cms:redirect] ", 0),
				cacher,
			),
		},
	}
}


A internal/c/doc/doc.go => internal/c/doc/doc.go +36 -0
@@ 0,0 1,36 @@
package doc

import (
	"log"
	"net/http"

	"git.sr.ht/~evanj/cms/internal/c"
	"git.sr.ht/~evanj/cms/internal/m/user"
	"git.sr.ht/~evanj/cms/internal/s/tmpl"
)

var docHTML = tmpl.MustParse("html/doc.html")

type Doc struct {
	*c.Controller
	log *log.Logger
}

type dber interface {
	UserGet(username, password string) (user.User, error)
	UserGetFromToken(token string) (user.User, error)
}

func New(log *log.Logger, db dber) *Doc {
	return &Doc{
		c.New(log, db),
		log,
	}
}

func (d *Doc) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	user, _ := d.GetCookieUser(w, r) // Don't need a user for documentation.
	d.HTML(w, r, docHTML, map[string]interface{}{
		"User": user,
	})
}

A internal/c/doc/doc_test.go => internal/c/doc/doc_test.go +1 -0
@@ 0,0 1,1 @@
package doc_test

M internal/s/tmpl/html/_header.html => internal/s/tmpl/html/_header.html +1 -0
@@ 41,6 41,7 @@
            </form>
          </li>
        {{ end}}
        <li class='nav-item'><a class='nav-link' href='/doc'>API Documentation</a></li>
        <li class='nav-item'><a class='nav-link' href='//git.sr.ht/~evanj/cms'>Source</a></li>
      </ul>
    </div>

A internal/s/tmpl/html/doc.html => internal/s/tmpl/html/doc.html +143 -0
@@ 0,0 1,143 @@
<!DOCTYPE html>
<html lang=en>
<head>
  {{ template "html/_head.html" }}
  <title>CMS</title>
</head>
<body class='index bg-light'>
  <style>{{ template "css/main.css" }}</style>
  <main>
    {{ template "html/_header.html" $ }}
    <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
      <h1 class="display-4">API Documentation</h1>
    </div>

    <div class='container'>
      <div class='row'>
        <div class="col-12 offset-0 col-lg-8 offset-lg-2">
          <h2>Concepts</h2>
          <p>CMS has five entities:</p>
          <ul>
            <li>Users</li>
            <li>Spaces</li>
            <li>Content Types</li>
            <li>Web Hooks</li>
            <li>Contents </li>
          </ul>
          <p>Users can be associated with many spaces. Spaces can be associated with
          many users. It's a many-to-many relationship. A space is a "backend"
          for the content of a single application. For example, a space
          represents a single website or a single mobile application.</p>
          <p>A space can "own" many content types, one-to-many.</p>
          <p>A content types is a taxonomy of content. For example, if you're familiar
          with the content management system WordPress, a content type here is akin to
          categories, tags, posts, or pages on WordPress.</p>
          <p>A content type "owns" many content instances, one-to-many.</p>
          <p>This is where CMS begins to differ from many other content management
          systems and content management infrastructures. In CMS concepts such as
          categories, tags, posts, and pages are on the same hierarchy. Where in other
          content management systems, such as WordPress, categories and tags exist on
          a level above posts and pages.</p>
          <p>Another very important distinctions: CMS does not provide you a rigid set
          of content types. You define content types and within content you define
          their relation to other contents. Meaning: if you choose to create a
          WordPress type heirarchy in CMS you would define the content types pages and
          posts that would have two fields: a category field which would be a
          Reference field type and a tags field which would be a ReferenceList field
          type. You would then create your two additional content types,
          categories and tags, then when creating content under pages and posts,
          you would choose what they are referencing.</p>
          <p>This is the biggest feature of CMS for me: arbitrarily many and
          arbitrarily deep connections from one content instance to another
          content instance or list of content instances. Creating content in
          CMS <mark>should not restrict your data model.</mark></p>
          <p>Web hooks are used when you want your application to respond to
          content within CMS under your space being created, updated, and
          deleted on the fly. For doing any cache breaking or other you may want to do within
          your application.</p>
          <h2>Using the API</h2>
          <p>Before diving into the API I suggest you poke around the user
          interace and test drive creating spaces, content types, and contents. To
          get a feel for the above concepts described.</p>
          <p>You'll also need an account to interact with the following APIs.
          The APIs use basic authentication for client applications. Sign ups
          are available to anyone but CMS is currently in a <mark>limited public
          alpha</mark>. Meaning: all your data is automatically deleted on a 15
          minute interval. CMS currently doesn't have any way to fight abuse.
          Once CMS' story on fighting abuse has been improved CMS will be moved
          into beta or general availability. If this is an inconvenience I urge
          you to look into self-hosting CMS. All you need is read access to the
          repository (which you already have), a Go compiler, and a MySQL
          database.</p>
          <h3>Spaces API</h3>
          <p>Five methods are available to the Spaces API.</p>
          <ul>
            <li>POST: Create a Space.</li>
            <li>GET: Retrieving a Space.</li>
            <li>PATCH: Update a Space.</li>
            <li>DELETE: Remove a Space.</li>
            <li>PUT: Copy a Space.</li>
          </ul>
          <h4>POST: Create a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X POST -F name="cURL test" -F desc="Some description here"</code></pre>
          <p>You'll be returned JSON that will have a redirectURL. The ID of the
          created space will be inside. You'll use the space ID to GET, PATCH,
          DELETE, and PUT the space.</p>
          <h4>GET: Retrieving a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X GET -F space=29</code></pre>
          <p>When you GET a Space you'll also retreive a paginated list of
          Content Types under the Space. The API returns JSON. Under the key
          "ContentTypes" you'll see a few more key/values: "ContentTypeList",
          "ContentTypeListMore", and "ContentTypeListBefore". Use the query
          parameter "?before=$ID" on your GET request to retrieve the next page
          of results, to use in conjunction with "ContentTypeListBefore".
          If another page of content type results exists
          "ContentTypeListMore" will state so with its boolean value.</p>
          <h4>PATCH: Update a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X PATCH -F space=29 -F name="cURL test (update)"</code></pre>
          <h4>DELETE: Remove a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X DELETE -F space=29</code></pre>
          <h4>PUT: Copy a Space.</h4>
          <pre><code>curl -s -u "$cmsuser:$cmspass" https://cms.evanjon.es/space
          -X PUT -F space=30 -F name="cURL test copy" -F desc="This is a copied space"</code></pre>
          <p>Please note: copying a space copies <mark>all</mark> of the space's
          content types and content instances.</p>
          <h3>Content Types API</h3>
          <p>Four methods are available to the Content Types API.</p>
          <ul>
            <li>POST: Create a Content Type.</li>
            <li>GET: Retrieving a Content Type.</li>
            <li>PATCH: Update a Content Type.</li>
            <li>DELETE: Remove a Content Type.</li>
          </ul>
          <h3>Web Hooks API</h3>
          <p>Four methods are available to the Web Hooks API.</p>
          <ul>
            <li>POST: Create a Web Hook.</li>
            <li>GET: Retrieving a Web Hook.</li>
            <li>PATCH: Update a Web Hook.</li>
            <li>DELETE: Remove a Web Hook.</li>
          </ul>
          <h3>Content API</h3>
          <p>Four methods are available to the Content API.</p>
          <ul>
            <li>POST: Create a Content.</li>
            <li>GET: Retrieving a Content.</li>
            <li>PATCH: Update a Content.</li>
            <li>DELETE: Remove a Content.</li>
          </ul>
        </div>
      </div>
    </div>



    {{ template "html/_footer.html" }}
  </main>
  {{ template "html/_scripts.html" }}
</body>
</html>

M internal/s/tmpl/tmpls_embed.go => internal/s/tmpl/tmpls_embed.go +3 -1
@@ 24,7 24,7 @@ func init() {

	tmpls["html/_head.html"] = tostring("PG1ldGEgY2hhcnNldD0ndXRmLTgnPgo8bWV0YSBuYW1lPSd2aWV3cG9ydCcgY29udGVudD0nd2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEnPgo8bGluayByZWw9J2ljb24nIHR5cGU9J2ltYWdlL3gtaWNvbicgaHJlZj0naHR0cHM6Ly9mYXZpY29uLmV2YW5qb24uZXMvMC8xMDUvMjE3LzMyL2Zhdmljb24uaWNvJyAvPgo8bGluayByZWw9J3N0eWxlc2hlZXQnIGhyZWY9Jy9zdGF0aWMvY3NzL2Jvb3RzdHJhcC5taW4uY3NzJyAvPgo=")

	tmpls["html/_header.html"] = tostring("PGhlYWRlciBjbGFzcz0nYmctcHJpbWFyeSc+CiAgPG5hdiBjbGFzcz0nY29udGFpbmVyIG5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1kYXJrJz4KICAgIDxhIGNsYXNzPSduYXZiYXItYnJhbmQnIGhyZWY9Jy8nPkNNUzwvYT4KICAgIDxidXR0b24gY2xhc3M9J25hdmJhci10b2dnbGVyJyB0eXBlPSdidXR0b24nIGRhdGEtdG9nZ2xlPSdjb2xsYXBzZScgZGF0YS10YXJnZXQ9JyNuYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWNvbnRyb2xzPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWV4cGFuZGVkPSdmYWxzZScgYXJpYS1sYWJlbD0nVG9nZ2xlIG5hdmlnYXRpb24nPgogICAgICA8c3BhbiBjbGFzcz0nbmF2YmFyLXRvZ2dsZXItaWNvbic+PC9zcGFuPgogICAgPC9idXR0b24+CiAgICA8ZGl2IGNsYXNzPSdjb2xsYXBzZSBuYXZiYXItY29sbGFwc2UnIGlkPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50Jz4KICAgICAgPHVsIGNsYXNzPSduYXZiYXItbmF2IG1sLWF1dG8nPgogICAgICAgIHt7IGlmIC5TcGFjZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyc+SG9tZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Db250ZW50VHlwZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuSG9vayB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudCB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL2NvbnRlbnR0eXBlL3t7IC5TcGFjZS5JRH19L3t7IC5Db250ZW50VHlwZS5JRCB9fSc+e3sgLkNvbnRlbnRUeXBlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiBhbmQgLlNwYWNlIChub3QgLkNvbnRlbnRUeXBlKSAobm90IC5Ib29rKSB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2NvcHlNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5Db3B5PC9hPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjdXBkYXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+VXBkYXRlPC9hPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgYW5kIC5Db250ZW50VHlwZSAobm90IC5Db250ZW50KSB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPlVwZGF0ZTwvYT48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2RlbGV0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Db250ZW50IH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9ImJ0biBidG4tbGluayBuYXYtbGluayBib3JkZXItMCIgdmFsdWU9U2F2ZSAvPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLkhvb2sgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNkZWxldGVNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+CiAgICAgICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3VzZXIvbG9nb3V0JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9ImJ0biBidG4tbGluayBuYXYtbGluayBib3JkZXItMCIgdmFsdWU9TG9nb3V0IC8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDwvbGk+CiAgICAgICAge3sgZW5kfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy8vZ2l0LnNyLmh0L35ldmFuai9jbXMnPlNvdXJjZTwvYT48L2xpPgogICAgICA8L3VsPgogICAgPC9kaXY+CiAgPC9uYXY+CjwvaGVhZGVyPgo=")
	tmpls["html/_header.html"] = tostring("PGhlYWRlciBjbGFzcz0nYmctcHJpbWFyeSc+CiAgPG5hdiBjbGFzcz0nY29udGFpbmVyIG5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1kYXJrJz4KICAgIDxhIGNsYXNzPSduYXZiYXItYnJhbmQnIGhyZWY9Jy8nPkNNUzwvYT4KICAgIDxidXR0b24gY2xhc3M9J25hdmJhci10b2dnbGVyJyB0eXBlPSdidXR0b24nIGRhdGEtdG9nZ2xlPSdjb2xsYXBzZScgZGF0YS10YXJnZXQ9JyNuYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWNvbnRyb2xzPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50JyBhcmlhLWV4cGFuZGVkPSdmYWxzZScgYXJpYS1sYWJlbD0nVG9nZ2xlIG5hdmlnYXRpb24nPgogICAgICA8c3BhbiBjbGFzcz0nbmF2YmFyLXRvZ2dsZXItaWNvbic+PC9zcGFuPgogICAgPC9idXR0b24+CiAgICA8ZGl2IGNsYXNzPSdjb2xsYXBzZSBuYXZiYXItY29sbGFwc2UnIGlkPSduYXZiYXJTdXBwb3J0ZWRDb250ZW50Jz4KICAgICAgPHVsIGNsYXNzPSduYXZiYXItbmF2IG1sLWF1dG8nPgogICAgICAgIHt7IGlmIC5TcGFjZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nLyc+SG9tZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Db250ZW50VHlwZSB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuSG9vayB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL3NwYWNlL3t7IC5TcGFjZS5JRCB9fSc+e3sgLlNwYWNlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuQ29udGVudCB9fQogICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGNsYXNzPSduYXYtbGluaycgaHJlZj0nL2NvbnRlbnR0eXBlL3t7IC5TcGFjZS5JRH19L3t7IC5Db250ZW50VHlwZS5JRCB9fSc+e3sgLkNvbnRlbnRUeXBlLk5hbWUgfX08L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiBhbmQgLlNwYWNlIChub3QgLkNvbnRlbnRUeXBlKSAobm90IC5Ib29rKSB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2NvcHlNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5Db3B5PC9hPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjdXBkYXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+VXBkYXRlPC9hPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgYW5kIC5Db250ZW50VHlwZSAobm90IC5Db250ZW50KSB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3VwZGF0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPlVwZGF0ZTwvYT48L2xpPgogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2RlbGV0ZU1vZGFsIiBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9JyMnPkRlbGV0ZTwvYT48L2xpPgogICAgICAgIHt7IGVuZCB9fQogICAgICAgIHt7IGlmIC5Db250ZW50IH19CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9ImJ0biBidG4tbGluayBuYXYtbGluayBib3JkZXItMCIgdmFsdWU9U2F2ZSAvPjwvbGk+CiAgICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjZGVsZXRlTW9kYWwiIGNsYXNzPSduYXYtbGluaycgaHJlZj0nIyc+RGVsZXRlPC9hPjwvbGk+CiAgICAgICAge3sgZW5kIH19CiAgICAgICAge3sgaWYgLkhvb2sgfX0KICAgICAgICAgIDxsaSBjbGFzcz0nbmF2LWl0ZW0nPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNkZWxldGVNb2RhbCIgY2xhc3M9J25hdi1saW5rJyBocmVmPScjJz5EZWxldGU8L2E+PC9saT4KICAgICAgICB7eyBlbmQgfX0KICAgICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+CiAgICAgICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3VzZXIvbG9nb3V0JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9ImJ0biBidG4tbGluayBuYXYtbGluayBib3JkZXItMCIgdmFsdWU9TG9nb3V0IC8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDwvbGk+CiAgICAgICAge3sgZW5kfX0KICAgICAgICA8bGkgY2xhc3M9J25hdi1pdGVtJz48YSBjbGFzcz0nbmF2LWxpbmsnIGhyZWY9Jy9kb2MnPkFQSSBEb2N1bWVudGF0aW9uPC9hPjwvbGk+CiAgICAgICAgPGxpIGNsYXNzPSduYXYtaXRlbSc+PGEgY2xhc3M9J25hdi1saW5rJyBocmVmPScvL2dpdC5zci5odC9+ZXZhbmovY21zJz5Tb3VyY2U8L2E+PC9saT4KICAgICAgPC91bD4KICAgIDwvZGl2PgogIDwvbmF2Pgo8L2hlYWRlcj4K")

	tmpls["html/_scripts.html"] = tostring("PHNjcmlwdCBzcmM9Jy9zdGF0aWMvanMvcG9wcGVyLm1pbi5qcyc+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPScvc3RhdGljL2pzL2Jvb3RzdHJhcC5taW4uanMnPjwvc2NyaXB0Pgo=")



@@ 32,6 32,8 @@ func init() {

	tmpls["html/contenttype.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+Cgo8aGVhZD4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9faGVhZC5odG1sIiB9fQogIDx0aXRsZT5DTVMgfCB7eyAuU3BhY2UuTmFtZSB9fSB8IHt7IC5Db250ZW50VHlwZS5OYW1lIH19PC90aXRsZT4KPC9oZWFkPgoKPGJvZHkgY2xhc3M9J2NvbnRlbnR0eXBlIGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+e3suQ29udGVudFR5cGUuTmFtZX19PC9oMT4KICAgIDwvZGl2PgogICAgPGFydGljbGU+CiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnR0eXBlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9REVMRVRFIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9c3BhY2UgdmFsdWU9Int7IC5TcGFjZS5JRCB9fSIgLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1jb250ZW50dHlwZSB2YWx1ZT0ie3sgLkNvbnRlbnRUeXBlLklEIH19IiAvPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJkZWxldGVNb2RhbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0iZGVsZXRlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJkZWxldGVNb2RhbExhYmVsIj5EZWxldGUge3suQ29udGVudFR5cGUuTmFtZX19PC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2xvc2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Zvcm0+CgogICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy9jb250ZW50JyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9UE9TVCAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Y29udGVudHR5cGUgdmFsdWU9Int7IC5Db250ZW50VHlwZS5JRCB9fSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY3JlYXRlTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9ImNyZWF0ZU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWxnIG1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0iY3JlYXRlTW9kYWxMYWJlbCI+Q3JlYXRlIGEgbmV3IHt7LkNvbnRlbnRUeXBlLk5hbWV9fSBjb250ZW50PC9oNT4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtbGFiZWw9IkNsb3NlIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgIHt7IHJhbmdlICRpbmRleCA6PSAuQ29udGVudFR5cGUuRmllbGRzIH19CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgbWItMyc+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19Ij57e3RpdGxlIC5OYW1lfX08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jb250cm9sIiBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0ie3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHBsYWNlaG9sZGVyPSJ7eyB0aXRsZSAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiU3RyaW5nQmlnIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiSW5wdXRIVE1MIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtaHRtbCIgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcmVxdWlyZWQgdHlwZT10ZXh0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBwbGFjZWhvbGRlcj0ie3sgdGl0bGUgLk5hbWUgfX0iID48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJJbnB1dE1hcmtkb3duIiB9fQogICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtbWFya2Rvd24iIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiA+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAuVHlwZSAiRmlsZSIgfX0KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZmlsZSBtYi0zIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiBtdWx0aXBsZT1mYWxzZSBpZD0iY3JlYXRlLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19IiByZXF1aXJlZCB0eXBlPSJmaWxlIiBjbGFzcz0iZm9ybS1maWxlLWlucHV0IiBpZD0iaW5wdXRHcm91cEZpbGVBZGRvbnt7ICRpbmRleCB9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1maWxlLWxhYmVsIiBmb3I9ImlucHV0R3JvdXBGaWxlQWRkb257eyAkaW5kZXggfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWZpbGUtdGV4dCI+Q2hvb3NlIGZpbGUuLi48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZvcm0tZmlsZS1idXR0b24iPkJyb3dzZTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJEYXRlIiB9fQogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIHJlcXVpcmVkIHR5cGU9ZGF0ZSBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgcGxhY2Vob2xkZXI9Int7IHRpdGxlIC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2UiIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyZWYtbW9kYWwnPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImNyZWF0ZS17eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgY2xhc3M9J291dHB1dC1yZWYnIHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9Int7IC5UeXBlIH19LXt7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI3JlZi1tb2RhbC17eyAuVHlwZSB9fS17eyAuSUQgfX0iIGNsYXNzPSJmb3JtLWNvbnRyb2wgaW5wdXQtcmVmIHctYXV0byIgdHlwZT1idXR0b24gdmFsdWU9T3BlbiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtZm9jdXM9ImZhbHNlIiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InJlZi1tb2RhbC17eyAuVHlwZSB9fS17eyAuSUQgfX0iIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InJlZk1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJyZWYtbW9kYWwtbGFiZWwte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iPkZpbmQgQ29udGVudCBmb3IgUmVmZXJlbmNlPC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWN0LXt7IC5UeXBlIH19LXt7IC5OYW1lIH19JyBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9J3NlYXJjaC1jdC17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWMte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWMte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGRpc2FibGVkIGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IE5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLWNsZWFyIj5DbGVhcjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIj5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICAgIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2VMaXN0IiB9fQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ncmVmLW1vZGFsIHJlZi1saXN0Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJjcmVhdGUte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0iIGNsYXNzPSdvdXRwdXQtcmVmJyByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPSJ7eyAuVHlwZSB9fS17eyAuTmFtZSB9fSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNyZWYtbW9kYWwte3sgLlR5cGUgfX0te3sgLklEIH19IiBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXJlZiB3LWF1dG8iIHR5cGU9YnV0dG9uIHZhbHVlPU9wZW4gLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSJmYWxzZSIgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJyZWYtbW9kYWwte3sgLlR5cGUgfX0te3sgLklEIH19IiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJyZWZNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0icmVmLW1vZGFsLWxhYmVsLXt7IC5UeXBlIH19LXt7IC5OYW1lIH19Ij5GaW5kIENvbnRlbnQgZm9yIFJlZmVyZW5jZSBMaXN0PC9oNT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHkgb3ZlcmZsb3ctaW5pdGlhbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWN0LXt7IC5UeXBlIH19LXt7IC5OYW1lIH19JyBjbGFzcz0nZC1ibG9jayc+Q29udGVudCBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9J3NlYXJjaC1jdC17eyAuVHlwZSB9fS17eyAuTmFtZSB9fScgY2xhc3M9J21iLTMgZm9ybS1jb250cm9sIGlucHV0LWNvbnRlbnR0eXBlJyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IFR5cGUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2VhcmNoLWMte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGNsYXNzPSdkLWJsb2NrJz5Db250ZW50IE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0nc2VhcmNoLWMte3sgLlR5cGUgfX0te3sgLk5hbWUgfX0nIGRpc2FibGVkIGNsYXNzPSdtYi0zIGZvcm0tY29udHJvbCBpbnB1dC1jb250ZW50JyB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCBieSBDb250ZW50IE5hbWUnIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLWNsZWFyIj5DbGVhcjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkYXRhLWRpc21pc3MtaW5uZXI9Im1vZGFsIj5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL2NvbnRlbnR0eXBlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1tZXRob2QgdmFsdWU9UEFUQ0ggLz4KICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1zcGFjZSB2YWx1ZT0ie3sgLlNwYWNlLklEIH19IiAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPWNvbnRlbnR0eXBlIHZhbHVlPSJ7eyAuQ29udGVudFR5cGUuSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InVwZGF0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJVcGRhdGUge3suQ29udGVudFR5cGUuTmFtZX19IiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImNvbnRlbnR0eXBlTW9kYWxMYWJlbCI+VXBkYXRlIHt7LkNvbnRlbnRUeXBlLk5hbWV9fTwvaDU+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb250ZW50dHlwZU5hbWUiPk5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlPSJ7ey5Db250ZW50VHlwZS5OYW1lfX0iIG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9ImNvbnRlbnR0eXBlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICB7eyByYW5nZSAkaW5kZXgsICRpdGVtIDo9IC5Db250ZW50VHlwZS5GaWVsZHMgfX0KICAgICAgICAgICAgICAgICAgICB7eyBpZiBlcSAkaW5kZXggMCB9fQogICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nZmlyc3QtZmllbGRzZXQnIGNsYXNzPSdjb250YWluZXItZmx1aWQgcHgtMCBtYi0zJz4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZmllbGRzZXRGaXJzdCI+RmllbGRzPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9ImZpZWxkX3VwZGF0ZV9pZF97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLklEIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiByZWFkb25seT0icmVhZG9ubHkiIHJlcXVpcmVkIHR5cGU9dGV4dCBuYW1lPSJmaWVsZF91cGRhdGVfbmFtZV97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLk5hbWUgfX0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAgcm93Jz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtNic+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJ3LTEwMCBmb3JtLWNvbnRyb2wiIHZhbHVlPSJ7eyAuVHlwZSB9fSIgcmVhZG9ubHk9InJlYWRvbmx5IiByZXF1aXJlZCBuYW1lPSJmaWVsZF91cGRhdGVfdHlwZV97eyBpbmMgJGluZGV4IH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT5GaWVsZCBUeXBlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9IlN0cmluZ1NtYWxsIj5TdHJpbmcgU21hbGw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iU3RyaW5nQmlnIj5TdHJpbmcgQmlnPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IklucHV0SFRNTCI+SFRNTDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJJbnB1dE1hcmtkb3duIj5NYXJrZG93bjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHZhbHVlPSJGaWxlIj5GaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9IkRhdGUiPkRhdGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iUmVmZXJlbmNlIj5SZWZlcmVuY2U8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkaXNhYmxlZCB2YWx1ZT0iUmVmZXJlbmNlTGlzdCI+UmVmZXJlbmNlTGlzdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndy0xMDAgYnRuIGJ0bi1wcmltYXJ5JyBkaXNhYmxlZCB0eXBlPWJ1dHRvbj5SZW1vdmUgRmllbGQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb250YWluZXItZmx1aWQgcHgtMCBtYi0zJz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9ImZpZWxkX3VwZGF0ZV9pZF97eyBpbmMgJGluZGV4IH19IiB2YWx1ZT0ie3sgLklEIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiByZXF1aXJlZCB0eXBlPXRleHQgbmFtZT0iZmllbGRfdXBkYXRlX25hbWVfe3sgaW5jICRpbmRleCB9fSIgdmFsdWU9Int7IC5OYW1lIH19IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwIHJvdyc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0idy0xMDAgZm9ybS1jb250cm9sIiB2YWx1ZT0ie3sgLlR5cGUgfX0iIHJlYWRvbmx5PSJyZWFkb25seSIgcmVxdWlyZWQgbmFtZT0iZmllbGRfdXBkYXRlX3R5cGVfe3sgaW5jICRpbmRleCB9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU+RmllbGQgVHlwZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdTbWFsbCIgfX0gICBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iU3RyaW5nU21hbGwiPlN0cmluZyBTbWFsbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJTdHJpbmdCaWciIH19ICAgICBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iU3RyaW5nQmlnIj5TdHJpbmcgQmlnPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIklucHV0SFRNTCIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJJbnB1dEhUTUwiPkhUTUw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB7eyBpZiBlcSAuVHlwZSAiSW5wdXRNYXJrZG93biIgfX0gc2VsZWN0ZWQge3sgZWxzZSB9fSBkaXNhYmxlZCB7eyBlbmQgfX0gdmFsdWU9IklucHV0TWFya2Rvd24iPk1hcmtkb3duPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIkZpbGUiIH19ICAgICAgICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJGaWxlIj5GaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIkRhdGUiIH19ICAgICAgICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJEYXRlIj5EYXRlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ge3sgaWYgZXEgLlR5cGUgIlJlZmVyZW5jZSIgfX0gICAgIHNlbGVjdGVkIHt7IGVsc2UgfX0gZGlzYWJsZWQge3sgZW5kIH19IHZhbHVlPSJSZWZlcmVuY2UiPlJlZmVyZW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHt7IGlmIGVxIC5UeXBlICJSZWZlcmVuY2VMaXN0IiB9fSBzZWxlY3RlZCB7eyBlbHNlIH19IGRpc2FibGVkIHt7IGVuZCB9fSB2YWx1ZT0iUmVmZXJlbmNlTGlzdCI+UmVmZXJlbmNlTGlzdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLTYnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndy0xMDAgYnRuIGJ0bi1wcmltYXJ5IGJ0bi1yZW1vdmUnIHR5cGU9YnV0dG9uPlJlbW92ZSBGaWVsZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxhIGhyZWY9JyMnIGNsYXNzPSdidG4gYnRuLWxpbmsnIGlkPSdhZGQtZmllbGRidG4nPkFkZCBBbm90aGVyIEZpZWxkPC9hPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KCiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICAgIDxkaXYgY2xhc3M9J29mZnNldC1sZy0zIGNvbC1sZy02Jz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPSJkLWJsb2NrIHRleHQtcmlnaHQgZmxvYXQtcmlnaHQiIGRhdGEtdG9nZ2xlPSJtb2RhbCIgZGF0YS10YXJnZXQ9IiNjcmVhdGVNb2RhbCI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPkNyZWF0ZSBhIG5ldyBjb250ZW50PC9hPgogICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgIDxoNiBjbGFzcz0iYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSBwYi0yIG1iLTAiPllvdXIge3suQ29udGVudFR5cGUuTmFtZX19IGNvbnRlbnQ8L2g2PgogICAgICAgICAgICAgIHt7IGlmIC5Db250ZW50TGlzdC5MaXN0IH19CiAgICAgICAgICAgICAgICB7eyByYW5nZSAuQ29udGVudExpc3QuTGlzdCB9fQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVkaWEgdGV4dC1tdXRlZCBwdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nL2NvbnRlbnQve3sgJC5TcGFjZS5JRCB9fS97eyAkLkNvbnRlbnRUeXBlLklEIH19L3t7IC5JRCB9fScgIGNsYXNzPSJkLWJsb2NrIG1lZGlhLWJvZHkgcGItMyBtYi0wIHNtYWxsIGxoLTEyNSBib3JkZXItYm90dG9tIGJvcmRlci1ncmF5Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj4KICAgICAgICAgICAgICAgICAgICAgIHt7ICguTXVzdFZhbHVlQnlOYW1lICJuYW1lIikuVmFsdWUgfX0KICAgICAgICAgICAgICAgICAgICA8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgIHt7IGlmIC5Db250ZW50TGlzdC5Nb3JlIH19CiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBtdC0zIj4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NvbnRlbnR0eXBlL3t7IC5TcGFjZS5JRCB9fS97eyAuQ29udGVudFR5cGUuSUQgfX0/YmVmb3JlPXt7IC5Db250ZW50TGlzdC5CZWZvcmUgfX0iPkxvYWQgbW9yZTwvYT4KICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICB7eyBlbHNlIH19CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdC0zIGFsZXJ0IGFsZXJ0LXByaW1hcnkiIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgICAgICAgWW91IGhhdmVuJ3QgY3JlYXRlZCBhbnkgY29udGVudCB5ZXQuIAogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAge3sgZW5kIH19CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQgc3JjPScvc3RhdGljL2pzL3RpbnltY2UubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0nL3N0YXRpYy9qcy9hdXRvY29tcGxldGUubWluLmpzJz48L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CiAgPHNjcmlwdD57eyB0ZW1wbGF0ZSAianMvc3BhY2UuanMiICQgfX08L3NjcmlwdD4KICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9jb250ZW50LmpzIiAkIH19PC9zY3JpcHQ+CjwvYm9keT4KCjwvaHRtbD4K")

	tmpls["html/doc.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUzwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J2luZGV4IGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+QVBJIERvY3VtZW50YXRpb248L2gxPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0nY29udGFpbmVyJz4KICAgICAgPGRpdiBjbGFzcz0ncm93Jz4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIgb2Zmc2V0LTAgY29sLWxnLTggb2Zmc2V0LWxnLTIiPgogICAgICAgICAgPGgyPkNvbmNlcHRzPC9oMj4KICAgICAgICAgIDxwPkNNUyBoYXMgZml2ZSBlbnRpdGllczo8L3A+CiAgICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT5Vc2VyczwvbGk+CiAgICAgICAgICAgIDxsaT5TcGFjZXM8L2xpPgogICAgICAgICAgICA8bGk+Q29udGVudCBUeXBlczwvbGk+CiAgICAgICAgICAgIDxsaT5XZWIgSG9va3M8L2xpPgogICAgICAgICAgICA8bGk+Q29udGVudHMgPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8cD5Vc2VycyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG1hbnkgc3BhY2VzLiBTcGFjZXMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgbWFueSB1c2Vycy4gSXQncyBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAuIEEgc3BhY2UgaXMgYSAiYmFja2VuZCIKICAgICAgICAgIGZvciB0aGUgY29udGVudCBvZiBhIHNpbmdsZSBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGEgc3BhY2UKICAgICAgICAgIHJlcHJlc2VudHMgYSBzaW5nbGUgd2Vic2l0ZSBvciBhIHNpbmdsZSBtb2JpbGUgYXBwbGljYXRpb24uPC9wPgogICAgICAgICAgPHA+QSBzcGFjZSBjYW4gIm93biIgbWFueSBjb250ZW50IHR5cGVzLCBvbmUtdG8tbWFueS48L3A+CiAgICAgICAgICA8cD5BIGNvbnRlbnQgdHlwZXMgaXMgYSB0YXhvbm9teSBvZiBjb250ZW50LiBGb3IgZXhhbXBsZSwgaWYgeW91J3JlIGZhbWlsaWFyCiAgICAgICAgICB3aXRoIHRoZSBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtIFdvcmRQcmVzcywgYSBjb250ZW50IHR5cGUgaGVyZSBpcyBha2luIHRvCiAgICAgICAgICBjYXRlZ29yaWVzLCB0YWdzLCBwb3N0cywgb3IgcGFnZXMgb24gV29yZFByZXNzLjwvcD4KICAgICAgICAgIDxwPkEgY29udGVudCB0eXBlICJvd25zIiBtYW55IGNvbnRlbnQgaW5zdGFuY2VzLCBvbmUtdG8tbWFueS48L3A+CiAgICAgICAgICA8cD5UaGlzIGlzIHdoZXJlIENNUyBiZWdpbnMgdG8gZGlmZmVyIGZyb20gbWFueSBvdGhlciBjb250ZW50IG1hbmFnZW1lbnQKICAgICAgICAgIHN5c3RlbXMgYW5kIGNvbnRlbnQgbWFuYWdlbWVudCBpbmZyYXN0cnVjdHVyZXMuIEluIENNUyBjb25jZXB0cyBzdWNoIGFzCiAgICAgICAgICBjYXRlZ29yaWVzLCB0YWdzLCBwb3N0cywgYW5kIHBhZ2VzIGFyZSBvbiB0aGUgc2FtZSBoaWVyYXJjaHkuIFdoZXJlIGluIG90aGVyCiAgICAgICAgICBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtcywgc3VjaCBhcyBXb3JkUHJlc3MsIGNhdGVnb3JpZXMgYW5kIHRhZ3MgZXhpc3Qgb24KICAgICAgICAgIGEgbGV2ZWwgYWJvdmUgcG9zdHMgYW5kIHBhZ2VzLjwvcD4KICAgICAgICAgIDxwPkFub3RoZXIgdmVyeSBpbXBvcnRhbnQgZGlzdGluY3Rpb25zOiBDTVMgZG9lcyBub3QgcHJvdmlkZSB5b3UgYSByaWdpZCBzZXQKICAgICAgICAgIG9mIGNvbnRlbnQgdHlwZXMuIFlvdSBkZWZpbmUgY29udGVudCB0eXBlcyBhbmQgd2l0aGluIGNvbnRlbnQgeW91IGRlZmluZQogICAgICAgICAgdGhlaXIgcmVsYXRpb24gdG8gb3RoZXIgY29udGVudHMuIE1lYW5pbmc6IGlmIHlvdSBjaG9vc2UgdG8gY3JlYXRlIGEKICAgICAgICAgIFdvcmRQcmVzcyB0eXBlIGhlaXJhcmNoeSBpbiBDTVMgeW91IHdvdWxkIGRlZmluZSB0aGUgY29udGVudCB0eXBlcyBwYWdlcyBhbmQKICAgICAgICAgIHBvc3RzIHRoYXQgd291bGQgaGF2ZSB0d28gZmllbGRzOiBhIGNhdGVnb3J5IGZpZWxkIHdoaWNoIHdvdWxkIGJlIGEKICAgICAgICAgIFJlZmVyZW5jZSBmaWVsZCB0eXBlIGFuZCBhIHRhZ3MgZmllbGQgd2hpY2ggd291bGQgYmUgYSBSZWZlcmVuY2VMaXN0IGZpZWxkCiAgICAgICAgICB0eXBlLiBZb3Ugd291bGQgdGhlbiBjcmVhdGUgeW91ciB0d28gYWRkaXRpb25hbCBjb250ZW50IHR5cGVzLAogICAgICAgICAgY2F0ZWdvcmllcyBhbmQgdGFncywgdGhlbiB3aGVuIGNyZWF0aW5nIGNvbnRlbnQgdW5kZXIgcGFnZXMgYW5kIHBvc3RzLAogICAgICAgICAgeW91IHdvdWxkIGNob29zZSB3aGF0IHRoZXkgYXJlIHJlZmVyZW5jaW5nLjwvcD4KICAgICAgICAgIDxwPlRoaXMgaXMgdGhlIGJpZ2dlc3QgZmVhdHVyZSBvZiBDTVMgZm9yIG1lOiBhcmJpdHJhcmlseSBtYW55IGFuZAogICAgICAgICAgYXJiaXRyYXJpbHkgZGVlcCBjb25uZWN0aW9ucyBmcm9tIG9uZSBjb250ZW50IGluc3RhbmNlIHRvIGFub3RoZXIKICAgICAgICAgIGNvbnRlbnQgaW5zdGFuY2Ugb3IgbGlzdCBvZiBjb250ZW50IGluc3RhbmNlcy4gQ3JlYXRpbmcgY29udGVudCBpbgogICAgICAgICAgQ01TIDxtYXJrPnNob3VsZCBub3QgcmVzdHJpY3QgeW91ciBkYXRhIG1vZGVsLjwvbWFyaz48L3A+CiAgICAgICAgICA8cD5XZWIgaG9va3MgYXJlIHVzZWQgd2hlbiB5b3Ugd2FudCB5b3VyIGFwcGxpY2F0aW9uIHRvIHJlc3BvbmQgdG8KICAgICAgICAgIGNvbnRlbnQgd2l0aGluIENNUyB1bmRlciB5b3VyIHNwYWNlIGJlaW5nIGNyZWF0ZWQsIHVwZGF0ZWQsIGFuZAogICAgICAgICAgZGVsZXRlZCBvbiB0aGUgZmx5LiBGb3IgZG9pbmcgYW55IGNhY2hlIGJyZWFraW5nIG9yIG90aGVyIHlvdSBtYXkgd2FudCB0byBkbyB3aXRoaW4KICAgICAgICAgIHlvdXIgYXBwbGljYXRpb24uPC9wPgogICAgICAgICAgPGgyPlVzaW5nIHRoZSBBUEk8L2gyPgogICAgICAgICAgPHA+QmVmb3JlIGRpdmluZyBpbnRvIHRoZSBBUEkgSSBzdWdnZXN0IHlvdSBwb2tlIGFyb3VuZCB0aGUgdXNlcgogICAgICAgICAgaW50ZXJhY2UgYW5kIHRlc3QgZHJpdmUgY3JlYXRpbmcgc3BhY2VzLCBjb250ZW50IHR5cGVzLCBhbmQgY29udGVudHMuIFRvCiAgICAgICAgICBnZXQgYSBmZWVsIGZvciB0aGUgYWJvdmUgY29uY2VwdHMgZGVzY3JpYmVkLjwvcD4KICAgICAgICAgIDxwPllvdSdsbCBhbHNvIG5lZWQgYW4gYWNjb3VudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBmb2xsb3dpbmcgQVBJcy4KICAgICAgICAgIFRoZSBBUElzIHVzZSBiYXNpYyBhdXRoZW50aWNhdGlvbiBmb3IgY2xpZW50IGFwcGxpY2F0aW9ucy4gU2lnbiB1cHMKICAgICAgICAgIGFyZSBhdmFpbGFibGUgdG8gYW55b25lIGJ1dCBDTVMgaXMgY3VycmVudGx5IGluIGEgPG1hcms+bGltaXRlZCBwdWJsaWMKICAgICAgICAgIGFscGhhPC9tYXJrPi4gTWVhbmluZzogYWxsIHlvdXIgZGF0YSBpcyBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgb24gYSAxNQogICAgICAgICAgbWludXRlIGludGVydmFsLiBDTVMgY3VycmVudGx5IGRvZXNuJ3QgaGF2ZSBhbnkgd2F5IHRvIGZpZ2h0IGFidXNlLgogICAgICAgICAgT25jZSBDTVMnIHN0b3J5IG9uIGZpZ2h0aW5nIGFidXNlIGhhcyBiZWVuIGltcHJvdmVkIENNUyB3aWxsIGJlIG1vdmVkCiAgICAgICAgICBpbnRvIGJldGEgb3IgZ2VuZXJhbCBhdmFpbGFiaWxpdHkuIElmIHRoaXMgaXMgYW4gaW5jb252ZW5pZW5jZSBJIHVyZ2UKICAgICAgICAgIHlvdSB0byBsb29rIGludG8gc2VsZi1ob3N0aW5nIENNUy4gQWxsIHlvdSBuZWVkIGlzIHJlYWQgYWNjZXNzIHRvIHRoZQogICAgICAgICAgcmVwb3NpdG9yeSAod2hpY2ggeW91IGFscmVhZHkgaGF2ZSksIGEgR28gY29tcGlsZXIsIGFuZCBhIE15U1FMCiAgICAgICAgICBkYXRhYmFzZS48L3A+CiAgICAgICAgICA8aDM+U3BhY2VzIEFQSTwvaDM+CiAgICAgICAgICA8cD5GaXZlIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byB0aGUgU3BhY2VzIEFQSS48L3A+CiAgICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT5QT1NUOiBDcmVhdGUgYSBTcGFjZS48L2xpPgogICAgICAgICAgICA8bGk+R0VUOiBSZXRyaWV2aW5nIGEgU3BhY2UuPC9saT4KICAgICAgICAgICAgPGxpPlBBVENIOiBVcGRhdGUgYSBTcGFjZS48L2xpPgogICAgICAgICAgICA8bGk+REVMRVRFOiBSZW1vdmUgYSBTcGFjZS48L2xpPgogICAgICAgICAgICA8bGk+UFVUOiBDb3B5IGEgU3BhY2UuPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8aDQ+UE9TVDogQ3JlYXRlIGEgU3BhY2UuPC9oND4KICAgICAgICAgIDxwcmU+PGNvZGU+Y3VybCAtcyAtdSAiJGNtc3VzZXI6JGNtc3Bhc3MiIGh0dHBzOi8vY21zLmV2YW5qb24uZXMvc3BhY2UKICAgICAgICAgIC1YIFBPU1QgLUYgbmFtZT0iY1VSTCB0ZXN0IiAtRiBkZXNjPSJTb21lIGRlc2NyaXB0aW9uIGhlcmUiPC9jb2RlPjwvcHJlPgogICAgICAgICAgPHA+WW91J2xsIGJlIHJldHVybmVkIEpTT04gdGhhdCB3aWxsIGhhdmUgYSByZWRpcmVjdFVSTC4gVGhlIElEIG9mIHRoZQogICAgICAgICAgY3JlYXRlZCBzcGFjZSB3aWxsIGJlIGluc2lkZS4gWW91J2xsIHVzZSB0aGUgc3BhY2UgSUQgdG8gR0VULCBQQVRDSCwKICAgICAgICAgIERFTEVURSwgYW5kIFBVVCB0aGUgc3BhY2UuPC9wPgogICAgICAgICAgPGg0PkdFVDogUmV0cmlldmluZyBhIFNwYWNlLjwvaDQ+CiAgICAgICAgICA8cHJlPjxjb2RlPmN1cmwgLXMgLXUgIiRjbXN1c2VyOiRjbXNwYXNzIiBodHRwczovL2Ntcy5ldmFuam9uLmVzL3NwYWNlCiAgICAgICAgICAtWCBHRVQgLUYgc3BhY2U9Mjk8L2NvZGU+PC9wcmU+CiAgICAgICAgICA8cD5XaGVuIHlvdSBHRVQgYSBTcGFjZSB5b3UnbGwgYWxzbyByZXRyZWl2ZSBhIHBhZ2luYXRlZCBsaXN0IG9mCiAgICAgICAgICBDb250ZW50IFR5cGVzIHVuZGVyIHRoZSBTcGFjZS4gVGhlIEFQSSByZXR1cm5zIEpTT04uIFVuZGVyIHRoZSBrZXkKICAgICAgICAgICJDb250ZW50VHlwZXMiIHlvdSdsbCBzZWUgYSBmZXcgbW9yZSBrZXkvdmFsdWVzOiAiQ29udGVudFR5cGVMaXN0IiwKICAgICAgICAgICJDb250ZW50VHlwZUxpc3RNb3JlIiwgYW5kICJDb250ZW50VHlwZUxpc3RCZWZvcmUiLiBVc2UgdGhlIHF1ZXJ5CiAgICAgICAgICBwYXJhbWV0ZXIgIj9iZWZvcmU9JElEIiBvbiB5b3VyIEdFVCByZXF1ZXN0IHRvIHJldHJpZXZlIHRoZSBuZXh0IHBhZ2UKICAgICAgICAgIG9mIHJlc3VsdHMsIHRvIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoICJDb250ZW50VHlwZUxpc3RCZWZvcmUiLgogICAgICAgICAgSWYgYW5vdGhlciBwYWdlIG9mIGNvbnRlbnQgdHlwZSByZXN1bHRzIGV4aXN0cwogICAgICAgICAgIkNvbnRlbnRUeXBlTGlzdE1vcmUiIHdpbGwgc3RhdGUgc28gd2l0aCBpdHMgYm9vbGVhbiB2YWx1ZS48L3A+CiAgICAgICAgICA8aDQ+UEFUQ0g6IFVwZGF0ZSBhIFNwYWNlLjwvaDQ+CiAgICAgICAgICA8cHJlPjxjb2RlPmN1cmwgLXMgLXUgIiRjbXN1c2VyOiRjbXNwYXNzIiBodHRwczovL2Ntcy5ldmFuam9uLmVzL3NwYWNlCiAgICAgICAgICAtWCBQQVRDSCAtRiBzcGFjZT0yOSAtRiBuYW1lPSJjVVJMIHRlc3QgKHVwZGF0ZSkiPC9jb2RlPjwvcHJlPgogICAgICAgICAgPGg0PkRFTEVURTogUmVtb3ZlIGEgU3BhY2UuPC9oND4KICAgICAgICAgIDxwcmU+PGNvZGU+Y3VybCAtcyAtdSAiJGNtc3VzZXI6JGNtc3Bhc3MiIGh0dHBzOi8vY21zLmV2YW5qb24uZXMvc3BhY2UKICAgICAgICAgIC1YIERFTEVURSAtRiBzcGFjZT0yOTwvY29kZT48L3ByZT4KICAgICAgICAgIDxoND5QVVQ6IENvcHkgYSBTcGFjZS48L2g0PgogICAgICAgICAgPHByZT48Y29kZT5jdXJsIC1zIC11ICIkY21zdXNlcjokY21zcGFzcyIgaHR0cHM6Ly9jbXMuZXZhbmpvbi5lcy9zcGFjZQogICAgICAgICAgLVggUFVUIC1GIHNwYWNlPTMwIC1GIG5hbWU9ImNVUkwgdGVzdCBjb3B5IiAtRiBkZXNjPSJUaGlzIGlzIGEgY29waWVkIHNwYWNlIjwvY29kZT48L3ByZT4KICAgICAgICAgIDxwPlBsZWFzZSBub3RlOiBjb3B5aW5nIGEgc3BhY2UgY29waWVzIDxtYXJrPmFsbDwvbWFyaz4gb2YgdGhlIHNwYWNlJ3MKICAgICAgICAgIGNvbnRlbnQgdHlwZXMgYW5kIGNvbnRlbnQgaW5zdGFuY2VzLjwvcD4KICAgICAgICAgIDxoMz5Db250ZW50IFR5cGVzIEFQSTwvaDM+CiAgICAgICAgICA8cD5Gb3VyIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byB0aGUgQ29udGVudCBUeXBlcyBBUEkuPC9wPgogICAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+UE9TVDogQ3JlYXRlIGEgQ29udGVudCBUeXBlLjwvbGk+CiAgICAgICAgICAgIDxsaT5HRVQ6IFJldHJpZXZpbmcgYSBDb250ZW50IFR5cGUuPC9saT4KICAgICAgICAgICAgPGxpPlBBVENIOiBVcGRhdGUgYSBDb250ZW50IFR5cGUuPC9saT4KICAgICAgICAgICAgPGxpPkRFTEVURTogUmVtb3ZlIGEgQ29udGVudCBUeXBlLjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgICAgPGgzPldlYiBIb29rcyBBUEk8L2gzPgogICAgICAgICAgPHA+Rm91ciBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gdGhlIFdlYiBIb29rcyBBUEkuPC9wPgogICAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+UE9TVDogQ3JlYXRlIGEgV2ViIEhvb2suPC9saT4KICAgICAgICAgICAgPGxpPkdFVDogUmV0cmlldmluZyBhIFdlYiBIb29rLjwvbGk+CiAgICAgICAgICAgIDxsaT5QQVRDSDogVXBkYXRlIGEgV2ViIEhvb2suPC9saT4KICAgICAgICAgICAgPGxpPkRFTEVURTogUmVtb3ZlIGEgV2ViIEhvb2suPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8aDM+Q29udGVudCBBUEk8L2gzPgogICAgICAgICAgPHA+Rm91ciBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gdGhlIENvbnRlbnQgQVBJLjwvcD4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPlBPU1Q6IENyZWF0ZSBhIENvbnRlbnQuPC9saT4KICAgICAgICAgICAgPGxpPkdFVDogUmV0cmlldmluZyBhIENvbnRlbnQuPC9saT4KICAgICAgICAgICAgPGxpPlBBVENIOiBVcGRhdGUgYSBDb250ZW50LjwvbGk+CiAgICAgICAgICAgIDxsaT5ERUxFVEU6IFJlbW92ZSBhIENvbnRlbnQuPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgoKCiAgICB7eyB0ZW1wbGF0ZSAiaHRtbC9fZm9vdGVyLmh0bWwiIH19CiAgPC9tYWluPgogIHt7IHRlbXBsYXRlICJodG1sL19zY3JpcHRzLmh0bWwiIH19CjwvYm9keT4KPC9odG1sPgo=")

	tmpls["html/hook.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUyB8IHt7IC5TcGFjZS5OYW1lIH19IHwge3sgLkhvb2suVVJMIH19PC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0naG9vayBiZy1saWdodCc+CiAgPHN0eWxlPnt7IHRlbXBsYXRlICJjc3MvbWFpbi5jc3MiIH19PC9zdHlsZT4KICA8bWFpbj4KICAgIHt7IHRlbXBsYXRlICJodG1sL19oZWFkZXIuaHRtbCIgJCB9fQogICAgPGRpdiBjbGFzcz0icHJpY2luZy1oZWFkZXIgcHgtMyBweS0zIHB0LW1kLTUgcGItbWQtNCBteC1hdXRvIHRleHQtY2VudGVyIj4KICAgICAgPGgxIGNsYXNzPSJkaXNwbGF5LTQiPnt7IC5Ib29rLlVSTCB9fTwvaDE+CiAgICA8L2Rpdj4KICAgIDxhcnRpY2xlIGNsYXNzPWNvbnRhaW5lcj4KICAgICAgPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScvaG9vaycgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9bWV0aG9kIHZhbHVlPURFTEVURSAvPgogICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWhpZGRlbiBuYW1lPXNwYWNlIHZhbHVlPSJ7eyAuU3BhY2UuSUQgfX0iIC8+CiAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9aG9vayB2YWx1ZT0ie3sgLkhvb2suSUQgfX0iIC8+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9ImRlbGV0ZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJkZWxldGVNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImRlbGV0ZU1vZGFsTGFiZWwiPkRlbGV0ZSB7eyAuSG9vay5VUkwgfX08L2g1PgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBkYXRhLWRpc21pc3M9Im1vZGFsIj5DbG9zZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkdvPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIDxzY3JpcHQ+e3sgdGVtcGxhdGUgImpzL21haW4uanMiICQgfX08L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==")

	tmpls["html/index.html"] = tostring("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ZW4+CjxoZWFkPgogIHt7IHRlbXBsYXRlICJodG1sL19oZWFkLmh0bWwiIH19CiAgPHRpdGxlPkNNUzwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgY2xhc3M9J2luZGV4IGJnLWxpZ2h0Jz4KICA8c3R5bGU+e3sgdGVtcGxhdGUgImNzcy9tYWluLmNzcyIgfX08L3N0eWxlPgogIDxtYWluPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2hlYWRlci5odG1sIiAkIH19CiAgICA8ZGl2IGNsYXNzPSJwcmljaW5nLWhlYWRlciBweC0zIHB5LTMgcHQtbWQtNSBwYi1tZC00IG14LWF1dG8gdGV4dC1jZW50ZXIiPgogICAgICA8aDEgY2xhc3M9ImRpc3BsYXktNCI+Q01TPC9oMT4KICAgICAgPHAgY2xhc3M9ImxlYWQiPkFuIG9sZC1zY2hvb2wgY29udGVudCBtYW5hZ2VtZW50IDxtYXJrPmluZnJhc3RydWN0dXJlPC9tYXJrPiBmb3IgbW9zdC48L3A+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lcic+CiAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIG9mZnNldC0wIGNvbC1sZy04IG9mZnNldC1sZy0yIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgPHA+PHN0cm9uZz5XQVJOSU5HOjwvc3Ryb25nPiBUaGlzIHNpdGUgaXMgaW4gPHN0cm9uZz5BTFBIQTwvc3Ryb25nPi4gCiAgICAgICAgICAgIFRoaXMgc2l0ZSBpcyBhIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0vaW5mcmFzdHJ1Y3R1cmUuIE1lYW5pbmc6IAogICAgICAgICAgICBpdCdzIHB1cnBvc2UgaXMgdG8gYWxsb3cgdXNlcnMgdG8gZ2VuZXJhdGUgY29udGVudC4gVGhhdCdzIGEgCiAgICAgICAgICAgIGRhbmdlcm91cyB0aGluZy4gSW5zdGVhZCBvZiBmb2N1c2luZyBvbiBmaWdodGluZyBhYnVzZSBJJ2xsIGJlIGF1dG8gCiAgICAgICAgICAgIGRlbGV0aW5nIGFsbCBjb250ZW50IChleGNlcHQgZm9yIG15IG93bikgb24gYSByZWd1bGFyIGFuZCB0aWdodCAKICAgICAgICAgICAgaW50ZXJ2YWwuIFlvdSBzdGlsbCBtaWdodCBoYXZlIGZ1biBwb2tpbmcgYXJvdW5kIG9uIHRoaXMgc2l0ZS4gSXQncyAKICAgICAgICAgICAgYWxzbyA8YSBocmVmPSdodHRwczovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvZmxvc3MtYW5kLWZvc3MuZW4uaHRtbCc+RkxPU1MsPC9hPgogICAgICAgICAgICBzbyB5b3UgY2FuIGVuam95IHNlbGYtaG9zdGluZyB5b3Vyc2VsZiBpZiB5b3UgYXJlIHNvIGluY2xpbmVkLiBJZiB5b3UKICAgICAgICAgICAgZmluZCBidWdzICh5b3UgbW9zdCBsaWtlbHkgd2lsbCkgb3IgaGF2ZSBmZWF0dXJlIHJlcXVlc3RzIHBsZWFzZSBzZW5kIAogICAgICAgICAgICB0aGVtIG15IHdheS4gSXQgaXMgYXBwcmVjaWF0ZWQuIFRoYW5rIHlvdS48L3A+CiAgICAgICAgICAgIDxwPklmIHlvdSBuZWVkIHRvIGhpdCB0aGUgQVBJIHRyeSBjVVJMJ2luZyBhbnkgcGFnZSB5b3Ugc2VlIGluIHRoZSAKICAgICAgICAgICAgVVJMIGJhciAoaW5jbHVkZSBiYXNpYyBhdXRoKS4gQSBzaW1wbGUgdXNlIGNhc2Ugb2YgY29uc3VtaW5nIHRoaXMgc2l0ZSBjYW4gYmUgZm91bmQgb24gbXkgCiAgICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vZ2l0LnNyLmh0L35ldmFuai9ldmFuam9uLmVzL3RyZWUvbWFzdGVyL3BrZy9jbXMvY21zLmdvJz5wZXJzb25hbCBzaXRlPC9hPi48L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxhcnRpY2xlPgogICAgICB7eyBpZiAuVXNlciB9fQogICAgICAgIDxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nL3NwYWNlJyBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4KICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW1ldGhvZCB2YWx1ZT1QT1NUIC8+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iZXhhbXBsZU1vZGFsIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJleGFtcGxlTW9kYWxMYWJlbCIgYXJpYS1oaWRkZW49InRydWUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSIgaWQ9ImV4YW1wbGVNb2RhbExhYmVsIj5DcmVhdGUgYSBuZXcgc3BhY2U8L2g1PgogICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic3BhY2VOYW1lIj5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9bmFtZSB0eXBlPXRleHQgaWQ9InNwYWNlTmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iTmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InNwYWNlRGVzYyI+RGVzY3JpcHRpb248L2xhYmVsPgogICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1kZXNjIHR5cGU9dGV4dCBpZD0ic3BhY2VEZXNjIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJEZXNjcmlwdGlvbiIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkNsb3NlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSdvZmZzZXQtbGctMyBjb2wtbGctNic+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXktMyBwLTMgYmctd2hpdGUgcm91bmRlZCBzaGFkb3ctc20iPgogICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9ImQtYmxvY2sgdGV4dC1yaWdodCBmbG9hdC1yaWdodCIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRhcmdldD0iI2V4YW1wbGVNb2RhbCI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+Q3JlYXRlIGEgbmV3IHNwYWNlPC9hPgogICAgICAgICAgICAgICAgICA8L3NtYWxsPgogICAgICAgICAgICAgICAgPGg2IGNsYXNzPSJib3JkZXItYm90dG9tIGJvcmRlci1ncmF5IHBiLTIgbWItMCI+WW91ciBzcGFjZXM8L2g2PgogICAgICAgICAgICAgICAge3sgaWYgLlNwYWNlcy5MaXN0IH19CiAgICAgICAgICAgICAgICAgIHt7IHJhbmdlIC5TcGFjZXMuTGlzdCB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWRpYSB0ZXh0LW11dGVkIHB0LTMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9zcGFjZS97eyAuSUQgfX0nICBjbGFzcz0iZC1ibG9jayBtZWRpYS1ib2R5IHBiLTMgbWItMCBzbWFsbCBsaC0xMjUgYm9yZGVyLWJvdHRvbSBib3JkZXItZ3JheSI+CiAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJkLWJsb2NrIHRleHQtZ3JheS1kYXJrIj57eyAuTmFtZSB9fTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAge3sgLkRlc2MgfX0KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICAgICAge3sgaWYgLlNwYWNlcy5Nb3JlIH19CiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0iZC1ibG9jayB0ZXh0LXJpZ2h0IG10LTMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii8/YmVmb3JlPXt7IC5TcGFjZXMuQmVmb3JlIH19Ij5Mb2FkIG1vcmU8L2E+CiAgICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICAgIHt7IGVuZCB9fQogICAgICAgICAgICAgICAge3sgZWxzZSB9fQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdC0zIGFsZXJ0IGFsZXJ0LXByaW1hcnkiIHJvbGU9ImFsZXJ0Ij4KICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZW4ndCBjcmVhdGVkIGFueSBzcGFjZXMgeWV0LiAKICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICB7eyBlbmQgfX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAge3sgZWxzZSB9fQogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdyb3cganVzdGlmeS1jb250ZW50LWNlbnRlcic+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiBjb2wtbWQtNiBjb2wtbGctNCBvZmZzZXQtY29sLWxnLTIgY29sLXhsLTMgb2Zmc2V0LWNvbC14bC0zIGQtZmxleCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZCBtYi00IHNoYWRvdy1zbSBmbGV4LWZpbGwiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9Im15LTAgZm9udC13ZWlnaHQtbm9ybWFsIj5TaWdudXA8L2g0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jy91c2VyL3NpZ251cCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2lnbnVwSW5wdXRVc2VybmFtZSIgY2xhc3M9InNyLW9ubHkiPkVtYWlsIGFkZHJlc3M8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPXVzZXJuYW1lIHR5cGU9InRleHQiIGlkPSJzaWdudXBJbnB1dFVzZXJuYW1lIiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJVc2VybmFtZSIgcmVxdWlyZWQ+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2lnbnVwSW5wdXRQYXNzd29yZCIgY2xhc3M9InNyLW9ubHkiPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1wYXNzd29yZCB0eXBlPSJwYXNzd29yZCIgaWQ9InNpZ251cElucHV0UGFzc3dvcmQiIGNsYXNzPSJtYi0zIGZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9IlBhc3N3b3JkIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzaWdudXBJbnB1dFZlcmlmeSIgY2xhc3M9InNyLW9ubHkiPkNvbmZpcm0gUGFzc3dvcmQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPXZlcmlmeSB0eXBlPSJwYXNzd29yZCIgaWQ9InNpZ251cElucHV0VmVyaWZ5IiBjbGFzcz0ibWItMyBmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJDb25maXJtIFBhc3N3b3JkIiByZXF1aXJlZD4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWxnIGJ0bi1wcmltYXJ5IGJ0bi1ibG9jayIgdHlwZT0ic3VibWl0Ij5HbzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiBjb2wtbWQtNiBjb2wtbGctNCBjb2wteGwtMyBkLWZsZXgiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItNCBzaGFkb3ctc20gZmxleC1maWxsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJteS0wIGZvbnQtd2VpZ2h0LW5vcm1hbCI+TG9naW48L2g0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkgZC1mbGV4Ij4KICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9J2QtZmxleCBmbGV4LWdyb3ctMSBmbGV4LWNvbHVtbicgbWV0aG9kPVBPU1QgYWN0aW9uPScvdXNlci9sb2dpbicgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibG9naW5JbnB1dFVzZXJuYW1lIiBjbGFzcz0ic3Itb25seSI+RW1haWwgYWRkcmVzczwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9dXNlcm5hbWUgdHlwZT0idGV4dCIgaWQ9ImxvZ2luSW5wdXRVc2VybmFtZSIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iVXNlcm5hbWUiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImxvZ2luSW5wdXRQYXNzd29yZCIgY2xhc3M9InNyLW9ubHkiPlBhc3N3b3JkPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1wYXNzd29yZCB0eXBlPSJwYXNzd29yZCIgaWQ9ImxvZ2luSW5wdXRQYXNzd29yZCIgY2xhc3M9Im1iLTMgZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iUGFzc3dvcmQiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im10LWF1dG8gYnRuIGJ0bi1sZyBidG4tcHJpbWFyeSBidG4tYmxvY2siIHR5cGU9InN1Ym1pdCI+R288L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIHt7IGVuZCB9fQogICAgPC9hcnRpY2xlPgogICAge3sgdGVtcGxhdGUgImh0bWwvX2Zvb3Rlci5odG1sIiB9fQogIDwvbWFpbj4KICB7eyB0ZW1wbGF0ZSAiaHRtbC9fc2NyaXB0cy5odG1sIiB9fQogIHt7IGlmIC5Vc2VyIH19CiAgICA8c2NyaXB0Pnt7IHRlbXBsYXRlICJqcy9tYWluLmpzIiAkIH19PC9zY3JpcHQ+CiAge3sgZW5kIH19CjwvYm9keT4KPC9odG1sPgo=")