{"action":"created","comment":{"url":"https://api.github.com/repos/mirage/mirage-www/pulls/comments/34839215","id":34839215,"diff_hunk":"@@ -146,64 +161,90 @@ a small `travis-senv` command-line tool to make this easier.\n \n To use it, just `opam install travis-senv` and follow the instructions on the\n [README at the homepage](https://github.com/avsm/travis-senv). The final\n-fragment of the [travis-ci.sh](https://github.com/mirage/mirage-www/blob/master/.travis-ci.sh#L41)\n-shows this in action for the website.\n+fragment of the\n+[travis_mirage.ml](https://github.com/mirage/mirage-www/blob/master/travis_mirage.ml),\n+having defined the following predicates:\n+\n+```\n+let is_deploy = getenv_default \"DEPLOY\" \"false\" |> fuzzy_bool_of_string\n+let is_travis_pr =\n+  getenv_default \"TRAVIS_PULL_REQUEST\" \"false\" |> fuzzy_bool_of_string\n+let have_secret =\n+  getenv_default \"XSECRET_default_0\" \"false\" |> fuzzy_bool_of_string\n+let is_xen =\n+  getenv_default \"MIRAGE_BACKEND\" \"\" |> function \"xen\" -> true | _ -> false\n+let travis_branch = getenv_default \"TRAVIS_BRANCH\" \"\"\n+```\n+\n+...shows this in action:\n \n ```\n-if [ \"$DEPLOY\" = \"1\" -a \"$TRAVIS_PULL_REQUEST\" = \"false\" ]; then\n-  # get the secure key out for deployment\n-  opam install travis-senv\n-  mkdir -p ~/.ssh\n-  SSH_DEPLOY_KEY=~/.ssh/id_dsa\n-  travis-senv decrypt > $SSH_DEPLOY_KEY\n-  chmod 600 $SSH_DEPLOY_KEY\n-  echo \"Host mirdeploy github.com\" >> ~/.ssh/config\n-  echo \"   Hostname github.com\" >> ~/.ssh/config\n-  echo \"   StrictHostKeyChecking no\" >> ~/.ssh/config\n-  echo \"   CheckHostIP no\" >> ~/.ssh/config\n-  echo \"   UserKnownHostsFile=/dev/null\" >> ~/.ssh/config\n-  git config --global user.email \"travis@openmirage.org\"\n-  git config --global user.name \"Travis the Build Bot\"\n-  git clone git@mirdeploy:mirage/mirage-www-deployment\n-  case \"$MIRAGE_BACKEND\" in\n-  xen)\n-    cd mirage-www-deployment\n-    rm -rf xen/$TRAVIS_COMMIT\n-    mkdir -p xen/$TRAVIS_COMMIT\n-    cp ../src/mir-main.xen ../src/config.ml xen/$TRAVIS_COMMIT\n-    bzip2 -9 xen/$TRAVIS_COMMIT/mir-main.xen\n-    git pull --rebase\n-    echo $TRAVIS_COMMIT > xen/latest\n-    git add xen/$TRAVIS_COMMIT xen/latest\n-    ;;\n-  *)\n-    echo unsupported deploy mode: $MIRAGE_BACKEND\n-    exit 1\n-    ;;\n-  esac\n-  git commit -m \"adding $TRAVIS_COMMIT for $MIRAGE_BACKEND\"\n-  git push\n+if is_deploy && is_xen && have_secret && (not is_travis_pr) &&\n+   travis_branch = \"master\"\n+then begin\n+  let ssh_config = \"Host mir-deploy github.com\n+                   \\  Hostname github.com\n+                   \\  StrictHostKeyChecking no\n+                   \\  CheckHostIP no\n+                   \\  UserKnownHostsFile=/dev/null\"\n+  in\n+  export \"XENIMG\" \"mir-${XENIMG:-$TRAVIS_REPO_SLUG#mirage/mirage-}.xen\";\n+  export \"MIRDIR\" \"${MIRDIR:-src}\";\n+  export \"DEPLOYD\" \"${TRAVIS_REPO_SLUG#*/}-deployment\";\n+\n+  (* setup ssh *)\n+  ?|  \"opam install travis-senv\";\n+  ?|  \"mkdir -p ~/.ssh\";\n+  ?|  \"travis-senv decrypt > ~/.ssh/id_dsa\";\n+  ?|  \"chmod 600 ~/.ssh/id_dsa\";\n+  ?|~ \"echo '%s' > ~/.ssh/config\" ssh_config;\n+  (* configure git for github *)\n+  ?|  \"git config --global user.email 'travis@openmirage.org'\";\n+  ?|  \"git config --global user.name 'Travis the Build Bot'\";\n+  ?|  \"git config --global push.default simple\";\n+  (* clone deployment repo *)\n+  ?|  \"git clone git@mir-deploy:${TRAVIS_REPO_SLUG}-deployment\";\n+  (* remove and recreate any existing image for this commit *)\n+  ?|  \"rm -rf $DEPLOYD/xen/$TRAVIS_COMMIT\";\n+  ?|  \"mkdir -p $DEPLOYD/xen/$TRAVIS_COMMIT\";\n+  ?|  \"cp $MIRDIR/$XENIMG $MIRDIR/config.ml $DEPLOYD/xen/$TRAVIS_COMMIT\";\n+  ?|  \"bzip2 -9 $DEPLOYD/xen/$TRAVIS_COMMIT/$XENIMG\";\n+  ?|  \"echo $TRAVIS_COMMIT > $DEPLOYD/xen/latest\";\n+  (* commit and push changes *)\n+  ?|  \"cd $DEPLOYD &&\\\n+       \\ git add xen/$TRAVIS_COMMIT xen/latest &&\\\n+       \\ git commit -m \\\"adding $TRAVIS_COMMIT for $MIRAGE_BACKEND\\\" &&\\\n+       \\ git push\"\n+end\n ```\n \n-While this fragment is a bit longer than the rest, it's all rather\n-straightforward.  We install `travis-senv` and use it to retrieve\n-our SSH deployment key (which is stored encrypted in the `.travis.yml`\n-file, and can only be decrypted by the Travis infrastructure).\n-Once that's installed, we initialize `git` and clone the deployment\n-repository.  We then compress our output kernel and commit it to\n-the repository along with the configuration data.\n+(The `?|` and `?|~` operators are defined in [`yorick.ml`](https://github.com/ocaml/ocaml-travisci-skeleton/blob/master/yorick.ml) and act simply as shell\n+invocations piping `stdin`/`stdout`/`stderr` in the usual way, with\n+success/failure tests on the status of each invoked command.)\n+\n+While this fragment is a bit longer than the rest, it's actually rather\n+straightforward. We install `travis-senv` and use it to retrieve our SSH\n+deployment key (which is stored encrypted in the `.travis.yml` file, and can\n+only be decrypted by the Travis infrastructure). Once that's installed, we\n+initialise `git` and clone the deployment repository. We then compress our\n+output kernel, update the `xen/latest` pointer to refer to the new kernel,\n+commit everything, and push the results back.\n \n ### Updating the live website\n \n-The live website runs on a Xen machine hosted in Cambridge, and\n-this simply polls the [mirage/mirage-www-deployment](http://github.com/mirage/mirage-www-deployment)\n-repository for new pushes, and updates to the latest version in\n-that repository when one appears.  This machine doesn't need to\n-have any of the MirageOS tools installed, and if there's an error in\n-an updated website, we can simply revert back to a previous changeset\n-of the deployed site.\n+The live website runs on a Xen machine which has a crontab entry in dom0 that\n+polls the\n+[mirage/mirage-www-deployment](http://github.com/mirage/mirage-www-deployment)\n+repository for new content via `git pull`. When new content __is__ obtained, a\n+Git [`merge-hook`](https://github.com/mirage/mirage-www-deployment) is invoked\n+which stops the current unikernel and boots the newly updated latest version.\n+This machine doesn't need to have any of the MirageOS tools installed, and if\n+there's an error in an updated website, we can simply revert back to a previous\n+as previous binary revisions of the site remain in the deployment repository.\n \n The same approach could be used to deploy to Heroku, Rackspace or EC2 instead of\n a custom Xen host; we'll cover this in future updates.\n \n-*(Note: This article is based on a similar blog post for general OCaml use available [here](http://anil.recoil.org/2013/10/06/travis-secure-ssh-integration.html))*\n+*(Note: This article is based on a similar blog post for general OCaml use\n+ available\n+ [here](http://anil.recoil.org/2013/10/06/travis-secure-ssh-integration.html).)*","path":"tmpl/wiki/deployment.md","position":399,"original_position":399,"commit_id":"9e64caa6404d68743e4b85e129d9fe34563676aa","original_commit_id":"9e64caa6404d68743e4b85e129d9fe34563676aa","user":{"login":"amirmc","id":121855,"avatar_url":"https://avatars.githubusercontent.com/u/121855?v=3","gravatar_id":"","url":"https://api.github.com/users/amirmc","html_url":"https://github.com/amirmc","followers_url":"https://api.github.com/users/amirmc/followers","following_url":"https://api.github.com/users/amirmc/following{/other_user}","gists_url":"https://api.github.com/users/amirmc/gists{/gist_id}","starred_url":"https://api.github.com/users/amirmc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amirmc/subscriptions","organizations_url":"https://api.github.com/users/amirmc/orgs","repos_url":"https://api.github.com/users/amirmc/repos","events_url":"https://api.github.com/users/amirmc/events{/privacy}","received_events_url":"https://api.github.com/users/amirmc/received_events","type":"User","site_admin":false},"body":"The following use specific examples to guide the user through details of what the scripts are doing — though the scripts themselves re general-purpose. .\r\n\r\n- http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines/\r\n- http://amirchaudhry.com/heroku-for-unikernels-pt1/","created_at":"2015-07-16T21:20:32Z","updated_at":"2015-07-16T21:20:32Z","html_url":"https://github.com/mirage/mirage-www/pull/370#discussion_r34839215","pull_request_url":"https://api.github.com/repos/mirage/mirage-www/pulls/370","_links":{"self":{"href":"https://api.github.com/repos/mirage/mirage-www/pulls/comments/34839215"},"html":{"href":"https://github.com/mirage/mirage-www/pull/370#discussion_r34839215"},"pull_request":{"href":"https://api.github.com/repos/mirage/mirage-www/pulls/370"}}},"pull_request":{"url":"https://api.github.com/repos/mirage/mirage-www/pulls/370","id":39837055,"html_url":"https://github.com/mirage/mirage-www/pull/370","diff_url":"https://github.com/mirage/mirage-www/pull/370.diff","patch_url":"https://github.com/mirage/mirage-www/pull/370.patch","issue_url":"https://api.github.com/repos/mirage/mirage-www/issues/370","number":370,"state":"open","locked":false,"title":"layout, sync to `skeleton`, start fixing network egs","user":{"login":"mor1","id":167904,"avatar_url":"https://avatars.githubusercontent.com/u/167904?v=3","gravatar_id":"","url":"https://api.github.com/users/mor1","html_url":"https://github.com/mor1","followers_url":"https://api.github.com/users/mor1/followers","following_url":"https://api.github.com/users/mor1/following{/other_user}","gists_url":"https://api.github.com/users/mor1/gists{/gist_id}","starred_url":"https://api.github.com/users/mor1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mor1/subscriptions","organizations_url":"https://api.github.com/users/mor1/orgs","repos_url":"https://api.github.com/users/mor1/repos","events_url":"https://api.github.com/users/mor1/events{/privacy}","received_events_url":"https://api.github.com/users/mor1/received_events","type":"User","site_admin":false},"body":"work to this point on OSX for me. yet to test linux.\r\n\r\nDo not merge yet. Also relies on mirage/mirage-skeleton#98","created_at":"2015-07-13T17:43:09Z","updated_at":"2015-07-16T21:20:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f4002aabcd8dafa2a1f6c98aca94c519b9e576c1","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mirage/mirage-www/pulls/370/commits","review_comments_url":"https://api.github.com/repos/mirage/mirage-www/pulls/370/comments","review_comment_url":"https://api.github.com/repos/mirage/mirage-www/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mirage/mirage-www/issues/370/comments","statuses_url":"https://api.github.com/repos/mirage/mirage-www/statuses/9e64caa6404d68743e4b85e129d9fe34563676aa","head":{"label":"mor1:master","ref":"master","sha":"9e64caa6404d68743e4b85e129d9fe34563676aa","user":{"login":"mor1","id":167904,"avatar_url":"https://avatars.githubusercontent.com/u/167904?v=3","gravatar_id":"","url":"https://api.github.com/users/mor1","html_url":"https://github.com/mor1","followers_url":"https://api.github.com/users/mor1/followers","following_url":"https://api.github.com/users/mor1/following{/other_user}","gists_url":"https://api.github.com/users/mor1/gists{/gist_id}","starred_url":"https://api.github.com/users/mor1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mor1/subscriptions","organizations_url":"https://api.github.com/users/mor1/orgs","repos_url":"https://api.github.com/users/mor1/repos","events_url":"https://api.github.com/users/mor1/events{/privacy}","received_events_url":"https://api.github.com/users/mor1/received_events","type":"User","site_admin":false},"repo":{"id":15075241,"name":"mirage-www","full_name":"mor1/mirage-www","owner":{"login":"mor1","id":167904,"avatar_url":"https://avatars.githubusercontent.com/u/167904?v=3","gravatar_id":"","url":"https://api.github.com/users/mor1","html_url":"https://github.com/mor1","followers_url":"https://api.github.com/users/mor1/followers","following_url":"https://api.github.com/users/mor1/following{/other_user}","gists_url":"https://api.github.com/users/mor1/gists{/gist_id}","starred_url":"https://api.github.com/users/mor1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mor1/subscriptions","organizations_url":"https://api.github.com/users/mor1/orgs","repos_url":"https://api.github.com/users/mor1/repos","events_url":"https://api.github.com/users/mor1/events{/privacy}","received_events_url":"https://api.github.com/users/mor1/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mor1/mirage-www","description":"Website infrastructure for openmirage.org","fork":true,"url":"https://api.github.com/repos/mor1/mirage-www","forks_url":"https://api.github.com/repos/mor1/mirage-www/forks","keys_url":"https://api.github.com/repos/mor1/mirage-www/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mor1/mirage-www/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mor1/mirage-www/teams","hooks_url":"https://api.github.com/repos/mor1/mirage-www/hooks","issue_events_url":"https://api.github.com/repos/mor1/mirage-www/issues/events{/number}","events_url":"https://api.github.com/repos/mor1/mirage-www/events","assignees_url":"https://api.github.com/repos/mor1/mirage-www/assignees{/user}","branches_url":"https://api.github.com/repos/mor1/mirage-www/branches{/branch}","tags_url":"https://api.github.com/repos/mor1/mirage-www/tags","blobs_url":"https://api.github.com/repos/mor1/mirage-www/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mor1/mirage-www/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mor1/mirage-www/git/refs{/sha}","trees_url":"https://api.github.com/repos/mor1/mirage-www/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mor1/mirage-www/statuses/{sha}","languages_url":"https://api.github.com/repos/mor1/mirage-www/languages","stargazers_url":"https://api.github.com/repos/mor1/mirage-www/stargazers","contributors_url":"https://api.github.com/repos/mor1/mirage-www/contributors","subscribers_url":"https://api.github.com/repos/mor1/mirage-www/subscribers","subscription_url":"https://api.github.com/repos/mor1/mirage-www/subscription","commits_url":"https://api.github.com/repos/mor1/mirage-www/commits{/sha}","git_commits_url":"https://api.github.com/repos/mor1/mirage-www/git/commits{/sha}","comments_url":"https://api.github.com/repos/mor1/mirage-www/comments{/number}","issue_comment_url":"https://api.github.com/repos/mor1/mirage-www/issues/comments{/number}","contents_url":"https://api.github.com/repos/mor1/mirage-www/contents/{+path}","compare_url":"https://api.github.com/repos/mor1/mirage-www/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mor1/mirage-www/merges","archive_url":"https://api.github.com/repos/mor1/mirage-www/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mor1/mirage-www/downloads","issues_url":"https://api.github.com/repos/mor1/mirage-www/issues{/number}","pulls_url":"https://api.github.com/repos/mor1/mirage-www/pulls{/number}","milestones_url":"https://api.github.com/repos/mor1/mirage-www/milestones{/number}","notifications_url":"https://api.github.com/repos/mor1/mirage-www/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mor1/mirage-www/labels{/name}","releases_url":"https://api.github.com/repos/mor1/mirage-www/releases{/id}","created_at":"2013-12-10T11:26:26Z","updated_at":"2015-02-15T16:36:57Z","pushed_at":"2015-07-16T19:45:40Z","git_url":"git://github.com/mor1/mirage-www.git","ssh_url":"git@github.com:mor1/mirage-www.git","clone_url":"https://github.com/mor1/mirage-www.git","svn_url":"https://github.com/mor1/mirage-www","homepage":"http://www.openmirage.org/","size":4849,"stargazers_count":0,"watchers_count":0,"language":"OCaml","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mirage:master","ref":"master","sha":"655dbc13020d085312ef4c3fe4cc64a25511df78","user":{"login":"mirage","id":131943,"avatar_url":"https://avatars.githubusercontent.com/u/131943?v=3","gravatar_id":"","url":"https://api.github.com/users/mirage","html_url":"https://github.com/mirage","followers_url":"https://api.github.com/users/mirage/followers","following_url":"https://api.github.com/users/mirage/following{/other_user}","gists_url":"https://api.github.com/users/mirage/gists{/gist_id}","starred_url":"https://api.github.com/users/mirage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mirage/subscriptions","organizations_url":"https://api.github.com/users/mirage/orgs","repos_url":"https://api.github.com/users/mirage/repos","events_url":"https://api.github.com/users/mirage/events{/privacy}","received_events_url":"https://api.github.com/users/mirage/received_events","type":"Organization","site_admin":false},"repo":{"id":4755520,"name":"mirage-www","full_name":"mirage/mirage-www","owner":{"login":"mirage","id":131943,"avatar_url":"https://avatars.githubusercontent.com/u/131943?v=3","gravatar_id":"","url":"https://api.github.com/users/mirage","html_url":"https://github.com/mirage","followers_url":"https://api.github.com/users/mirage/followers","following_url":"https://api.github.com/users/mirage/following{/other_user}","gists_url":"https://api.github.com/users/mirage/gists{/gist_id}","starred_url":"https://api.github.com/users/mirage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mirage/subscriptions","organizations_url":"https://api.github.com/users/mirage/orgs","repos_url":"https://api.github.com/users/mirage/repos","events_url":"https://api.github.com/users/mirage/events{/privacy}","received_events_url":"https://api.github.com/users/mirage/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mirage/mirage-www","description":"Website infrastructure for mirage.io","fork":false,"url":"https://api.github.com/repos/mirage/mirage-www","forks_url":"https://api.github.com/repos/mirage/mirage-www/forks","keys_url":"https://api.github.com/repos/mirage/mirage-www/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mirage/mirage-www/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mirage/mirage-www/teams","hooks_url":"https://api.github.com/repos/mirage/mirage-www/hooks","issue_events_url":"https://api.github.com/repos/mirage/mirage-www/issues/events{/number}","events_url":"https://api.github.com/repos/mirage/mirage-www/events","assignees_url":"https://api.github.com/repos/mirage/mirage-www/assignees{/user}","branches_url":"https://api.github.com/repos/mirage/mirage-www/branches{/branch}","tags_url":"https://api.github.com/repos/mirage/mirage-www/tags","blobs_url":"https://api.github.com/repos/mirage/mirage-www/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mirage/mirage-www/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mirage/mirage-www/git/refs{/sha}","trees_url":"https://api.github.com/repos/mirage/mirage-www/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mirage/mirage-www/statuses/{sha}","languages_url":"https://api.github.com/repos/mirage/mirage-www/languages","stargazers_url":"https://api.github.com/repos/mirage/mirage-www/stargazers","contributors_url":"https://api.github.com/repos/mirage/mirage-www/contributors","subscribers_url":"https://api.github.com/repos/mirage/mirage-www/subscribers","subscription_url":"https://api.github.com/repos/mirage/mirage-www/subscription","commits_url":"https://api.github.com/repos/mirage/mirage-www/commits{/sha}","git_commits_url":"https://api.github.com/repos/mirage/mirage-www/git/commits{/sha}","comments_url":"https://api.github.com/repos/mirage/mirage-www/comments{/number}","issue_comment_url":"https://api.github.com/repos/mirage/mirage-www/issues/comments{/number}","contents_url":"https://api.github.com/repos/mirage/mirage-www/contents/{+path}","compare_url":"https://api.github.com/repos/mirage/mirage-www/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mirage/mirage-www/merges","archive_url":"https://api.github.com/repos/mirage/mirage-www/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mirage/mirage-www/downloads","issues_url":"https://api.github.com/repos/mirage/mirage-www/issues{/number}","pulls_url":"https://api.github.com/repos/mirage/mirage-www/pulls{/number}","milestones_url":"https://api.github.com/repos/mirage/mirage-www/milestones{/number}","notifications_url":"https://api.github.com/repos/mirage/mirage-www/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mirage/mirage-www/labels{/name}","releases_url":"https://api.github.com/repos/mirage/mirage-www/releases{/id}","created_at":"2012-06-22T20:32:07Z","updated_at":"2015-07-07T12:11:17Z","pushed_at":"2015-07-16T19:45:41Z","git_url":"git://github.com/mirage/mirage-www.git","ssh_url":"git@github.com:mirage/mirage-www.git","clone_url":"https://github.com/mirage/mirage-www.git","svn_url":"https://github.com/mirage/mirage-www","homepage":"https://mirage.io","size":7460,"stargazers_count":59,"watchers_count":59,"language":"OCaml","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":48,"mirror_url":null,"open_issues_count":32,"forks":48,"open_issues":32,"watchers":59,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mirage/mirage-www/pulls/370"},"html":{"href":"https://github.com/mirage/mirage-www/pull/370"},"issue":{"href":"https://api.github.com/repos/mirage/mirage-www/issues/370"},"comments":{"href":"https://api.github.com/repos/mirage/mirage-www/issues/370/comments"},"review_comments":{"href":"https://api.github.com/repos/mirage/mirage-www/pulls/370/comments"},"review_comment":{"href":"https://api.github.com/repos/mirage/mirage-www/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mirage/mirage-www/pulls/370/commits"},"statuses":{"href":"https://api.github.com/repos/mirage/mirage-www/statuses/9e64caa6404d68743e4b85e129d9fe34563676aa"}}}}