Skip to content

Instantly share code, notes, and snippets.

@fonsp
Last active December 10, 2021 17:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fonsp/056877529633cdbc4e91fcabdb056d3f to your computer and use it in GitHub Desktop.
Save fonsp/056877529633cdbc4e91fcabdb056d3f to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width" />
<title>⚡ Pluto.jl ⚡</title>
<meta charset="utf-8" />
<script>
console.log(
"Pluto.jl, by Fons van der Plas (https://github.com/fonsp), Mikołaj Bochenski (https://github.com/malyvsen), Michiel Dral (https://github.com/dralletje) and friends 🌈"
)
</script>
<meta name="theme-color" content="#ffffff" />
<link rel="icon" type="image/png" sizes="16x16" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="96x96" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/favicon-96x96.png" />
<meta name="description" content="Pluto.jl notebooks" />
<link rel="pluto-logo-big" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/logo.svg" />
<link rel="pluto-logo-small" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/favicon_unsaturated.svg" />
<link rel="pluto-sw" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/sw.js" />
<script>
navigator.serviceWorker?.register(document.head.querySelector("link[rel='pluto-sw']").getAttribute("href"), { scope: "./" }).catch(console.warn)
</script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js" defer></script>
<script src="https://cdn.jsdelivr.net/npm/@observablehq/stdlib@3.3.1/dist/stdlib.js" defer></script>
<script src="https://cdn.jsdelivr.net/npm/iframe-resizer@4.2.11/js/iframeResizer.min.js" defer></script>
<script src="https://cdn.jsdelivr.net/npm/ansi_up@5.0.1/ansi_up.min.js" defer></script>
<!-- This doesn't do anything unless activated, and it makes sure parcel bundles this -->
<script id="iframe-resizer-content-window-script" src="https://cdn.jsdelivr.net/npm/iframe-resizer@4.2.11/js/iframeResizer.contentWindow.min.js" crossorigin="anonymous" defer></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/editor.css" type="text/css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/hide-ui.css" type="text/css" media="all" data-pluto-file="hide-ui" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/binder.css" type="text/css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/treeview.css" type="text/css" />
<link rel="preload" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/juliamono.css" as="style" />
<link rel="preload" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/vollkorn.css" as="style" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.2.0/build/styles/atom-one-light.min.css" />
<script data-pluto-file="launch-parameters">
window.pluto_notebook_id = undefined;
window.pluto_isolated_cell_ids = undefined;
window.pluto_notebookfile = "data:text/julia;charset=utf-8;base64,IyMjIEEgUGx1dG8uamwgbm90ZWJvb2sgIyMjCiMgdjAuMTcuMwoKdXNpbmcgTWFya2Rvd24KdXNpbmcgSW50ZXJhY3RpdmVVdGlscwoKIyBUaGlzIFBsdXRvIG5vdGVib29rIHVzZXMgQGJpbmQgZm9yIGludGVyYWN0aXZpdHkuIFdoZW4gcnVubmluZyB0aGlzIG5vdGVib29rIG91dHNpZGUgb2YgUGx1dG8sIHRoZSBmb2xsb3dpbmcgJ21vY2sgdmVyc2lvbicgb2YgQGJpbmQgZ2l2ZXMgYm91bmQgdmFyaWFibGVzIGEgZGVmYXVsdCB2YWx1ZSAoaW5zdGVhZCBvZiBhbiBlcnJvcikuCm1hY3JvIGJpbmQoZGVmLCBlbGVtZW50KQogICAgcXVvdGUKICAgICAgICBsb2NhbCBpdiA9IHRyeSBCYXNlLmxvYWRlZF9tb2R1bGVzW0Jhc2UuUGtnSWQoQmFzZS5VVUlEKCI2ZTY5NmM3Mi02NTQyLTIwNjctNzI2NS00MjIwNmM3NTYxNTAiKSwgIkFic3RyYWN0UGx1dG9EaW5nZXRqZXMiKV0uQm9uZHMuaW5pdGlhbF92YWx1ZSBjYXRjaDsgYiAtPiBtaXNzaW5nOyBlbmQKICAgICAgICBsb2NhbCBlbCA9ICQoZXNjKGVsZW1lbnQpKQogICAgICAgIGdsb2JhbCAkKGVzYyhkZWYpKSA9IENvcmUuYXBwbGljYWJsZShCYXNlLmdldCwgZWwpID8gQmFzZS5nZXQoZWwpIDogaXYoZWwpCiAgICAgICAgZWwKICAgIGVuZAplbmQKCiMg4pWU4pWQ4pWhIDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwYwp1c2luZyBIeXBlcnRleHRMaXRlcmFsCgojIOKVlOKVkOKVoSA4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzUKZnVuY3Rpb24gc2tpcF9hc19zY3JpcHQobTo6TW9kdWxlKQoJaWYgaXNkZWZpbmVkKG0sIDpQbHV0b0ZvcmNlRGlzcGxheSkKCQlyZXR1cm4gbS5QbHV0b0ZvcmNlRGlzcGxheQoJZWxzZQoJCWlzZGVmaW5lZChtLCA6UGx1dG9SdW5uZXIpICYmIHBhcmVudG1vZHVsZShtKSA9PSBNYWluCgllbmQKZW5kCgojIOKVlOKVkOKVoSBkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2YKaWYgc2tpcF9hc19zY3JpcHQoQF9fTU9EVUxFX18pCglpbXBvcnQgUGtnCglQa2cuYWN0aXZhdGUoQmFzZS5jdXJyZW50X3Byb2plY3QoQF9fRElSX18pKQoJVGV4dCgiUHJvamVjdCBlbnYgYWN0aXZlIikKZW5kCgojIOKVlOKVkOKVoSAzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWMKaWYgc2tpcF9hc19zY3JpcHQoQF9fTU9EVUxFX18pCgl1c2luZyBQbHV0b1VJCmVuZAoKIyDilZTilZDilaEgYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2CiIiIgoJQHNraXBfYXNfc2NyaXB0IGV4cHJlc3Npb24KCk1hcmtzIGEgZXhwcmVzc2lvbiBhcyBQbHV0by1vbmx5LCB3aGljaCBtZWFucyB0aGF0IGl0IHdvbid0IGJlIGV4ZWN1dGVkIHdoZW4gcnVubmluZyBvdXRzaWRlIFBsdXRvLiBEbyBub3QgdXNlIHRoaXMgZm9yIHlvdXIgb3duIHByb2plY3RzLgoiIiIKbWFjcm8gc2tpcF9hc19zY3JpcHQoZXgpIHNraXBfYXNfc2NyaXB0KF9fbW9kdWxlX18pID8gZXNjKGV4KSA6IG5vdGhpbmcgZW5kCgojIOKVlOKVkOKVoSA5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjEKbWFjcm8gb25seV9hc19zY3JpcHQoZXgpIHNraXBfYXNfc2NyaXB0KF9fbW9kdWxlX18pID8gbm90aGluZyA6IGVzYyhleCkgZW5kCgojIOKVlOKVkOKVoSA1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjEKaW1wb3J0IEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuQm9uZHMKCiMg4pWU4pWQ4pWhIGNjYmU0NDIzLTgwMWItNGMyMC1hZDJkLWVlODlkNWNmYTg1OQptZCIiIgojIENvbWJpbmluZyBib25kcwoiIiIKCiMg4pWU4pWQ4pWhIDg1OTE4NjA5LTVlMWYtNDA0MC05OWJlLTYxYzJkZDhmZjY1NAptZCIiIgojIyBUaGUgbWFnaWMKIiIiCgojIOKVlOKVkOKVoSA5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4NjkKY29uc3Qgc2V0X2lucHV0X3ZhbHVlX2NvbXBhdCA9IEh5cGVydGV4dExpdGVyYWwuSmF2YVNjcmlwdCgiIiIKKCgpID0+IHsKCWxldCByZXN1bHQgPSBudWxsCgl0cnkgewoJcmVzdWx0ID0gc2V0Qm91bmRFbGVtZW50VmFsdWVMaWtlUGx1dG8KfSBjYXRjaCAoZSkgewoJcmVzdWx0ID0gKChpbnB1dCwgbmV3X3ZhbHVlKSA9PiB7CgkvLyBmYWxsYmFjayBpbiBjYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb25zcC9QbHV0by5qbC9wdWxsLzE3NTUgaXMgbm90IGF2YWlsYWJsZQogICAgaWYgKG5ld192YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgICAgICByZXR1cm4KICAgIH0KICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHsKICAgICAgICBzd2l0Y2ggKGlucHV0LnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAicmFuZ2UiOgogICAgICAgICAgICBjYXNlICJudW1iZXIiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc051bWJlciAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc051bWJlciA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzRGF0ZSA9PSBudWxsIHx8IE51bWJlcihpbnB1dC52YWx1ZUFzRGF0ZSkgIT09IE51bWJlcihuZXdfdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc0RhdGUgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImNoZWNrYm94IjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImZpbGUiOiB7CiAgICAgICAgICAgICAgICAvLyBDYW4ndCBzZXQgZmlsZXMgOigKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGlucHV0Lm11bHRpcGxlKSB7CiAgICAgICAgZm9yIChsZXQgb3B0aW9uIG9mIEFycmF5LmZyb20oaW5wdXQub3B0aW9ucykpIHsKICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbmV3X3ZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICAvL0B0cy1pZ25vcmUKICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgIH0KfSkKfQpyZXR1cm4gcmVzdWx0Cn0pKCkKIiIiKQoKIyDilZTilZDilaEgMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY3CmJlZ2luCglCYXNlLkBrd2RlZiBzdHJ1Y3QgQ29tYmluZWRCb25kcwoJCWRpc3BsYXlfY29udGVudDo6QW55CgkJY2FwdHVyZWRfbmFtZXM6OlVuaW9ue05vdGhpbmcsTlR1cGxle04sU3ltYm9sfSB3aGVyZSBOfQoJCWNhcHR1cmVkX2JvbmRzOjpWZWN0b3J7QW55fQoJCXNlY3JldF9rZXk6OlN0cmluZwoJZW5kCgoJZnVuY3Rpb24gQmFzZS5zaG93KGlvOjpJTywgbTo6TUlNRSJ0ZXh0L2h0bWwiLCBjYjo6Q29tYmluZWRCb25kcykKCQlvdXRwdXQgPSBAaHRsKCIiIgoJCTxzcGFuPgoJCSQoY2IuZGlzcGxheV9jb250ZW50KQoJCTxzY3JpcHQgaWQ9JChjYi5zZWNyZXRfa2V5KT4KCQljb25zdCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKCQlsZXQga2V5ID0gJChjYi5zZWNyZXRfa2V5KQoJCWNvbnN0IGlucHV0cyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKGBwbC1jb21iaW5lZF9jaGlsZFtrZXk9J1wke2tleX0nXSA+ICo6Zmlyc3QtY2hpbGRgKQoJCQoJCWNvbnN0IHZhbHVlcyA9IEFycmF5KGlucHV0cy5sZW5ndGgpCgkJCgkJaW5wdXRzLmZvckVhY2goYXN5bmMgKGVsLGkpID0+IHsKCQkJZWwub25pbnB1dCA9IChlKSA9PiB7CgkJCQllLnN0b3BQcm9wYWdhdGlvbigpCgkJCX0KCQkJY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChlbCkKCQkJd2hpbGUodHJ1ZSkgewoJCQkJdmFsdWVzW2ldID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCQkJZGl2LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHt9KSkKCQkJfQoJCX0pCgoKCQlsZXQgc2V0X2lucHV0X3ZhbHVlID0gJChzZXRfaW5wdXRfdmFsdWVfY29tcGF0KQoJCgkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGRpdiwgJ3ZhbHVlJywgewoJCQlnZXQ6ICgpID0+IHZhbHVlcywKCQkJc2V0OiAobmV3dmFscykgPT4gewoJCQkJaWYoIW5ld3ZhbHMpIHsKCQkJCQlyZXR1cm4KCQkJCX0KCQkJCWlucHV0cy5mb3JFYWNoKChlbCwgaSkgPT4gewoJCQkJCXZhbHVlc1tpXSA9IG5ld3ZhbHNbaV0KCQkJCQlzZXRfaW5wdXRfdmFsdWUoZWwsIG5ld3ZhbHNbaV0pCgkJCQl9KQoJCX0sCgkJCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKCQl9KTsKCQoJCTwvc2NyaXB0PgoJCTwvc3Bhbj4KCQkiIiIpCgkJQmFzZS5zaG93KGlvLCBtLCBvdXRwdXQpCgllbmQKCglmdW5jdGlvbiBCb25kcy5pbml0aWFsX3ZhbHVlKGNiOjpDb21iaW5lZEJvbmRzKQoJCXZhbHMgPSB0dXBsZSgoQm9uZHMuaW5pdGlhbF92YWx1ZShiKSBmb3IgYiBpbiBjYi5jYXB0dXJlZF9ib25kcykuLi4pCgoJCWlmIGNiLmNhcHR1cmVkX25hbWVzID09PSBub3RoaW5nCgkJCXZhbHMKCQllbHNlCgkJCU5hbWVkVHVwbGV7Y2IuY2FwdHVyZWRfbmFtZXN9KHZhbHMpCgkJZW5kCgllbmQKCWZ1bmN0aW9uIEJvbmRzLnZhbGlkYXRlX3ZhbHVlKGNiOjpDb21iaW5lZEJvbmRzLCBmcm9tX2pzKQoJCWlmIGZyb21fanMgaXNhIFZlY3RvciAmJiBsZW5ndGgoZnJvbV9qcykgPT0gbGVuZ3RoKGNiLmNhcHR1cmVkX2JvbmRzKQoJCQlhbGwoKAoJCQkJQm9uZHMudmFsaWRhdGVfdmFsdWUoYm9uZCwgdmFsX2pzKQoJCQkJZm9yIChib25kLCB2YWxfanMpIGluIHppcChjYi5jYXB0dXJlZF9ib25kcywgZnJvbV9qcykKCQkJKSkKCQllbHNlCgkJCWZhbHNlCgkJZW5kCgllbmQKCWZ1bmN0aW9uIEJvbmRzLnRyYW5zZm9ybV92YWx1ZShjYjo6Q29tYmluZWRCb25kcywgZnJvbV9qcykKCQlAYXNzZXJ0IGZyb21fanMgaXNhIFZlY3RvcgoJCUBhc3NlcnQgbGVuZ3RoKGZyb21fanMpID09IGxlbmd0aChjYi5jYXB0dXJlZF9ib25kcykKCgkJdmFscyA9IHR1cGxlKCgKCQkJQm9uZHMudHJhbnNmb3JtX3ZhbHVlKGJvbmQsIHZhbF9qcykKCQkJZm9yIChib25kLCB2YWxfanMpIGluIHppcChjYi5jYXB0dXJlZF9ib25kcywgZnJvbV9qcykKCQkpLi4uKQoKCQlpZiBjYi5jYXB0dXJlZF9uYW1lcyA9PT0gbm90aGluZwoJCQl2YWxzCgkJZWxzZQoJCQlOYW1lZFR1cGxle2NiLmNhcHR1cmVkX25hbWVzfSh2YWxzKQoJCWVuZAoJCQoJCSMgWwoJCSMgCUJvbmRzLnRyYW5zZm9ybV92YWx1ZShib25kLCB2YWxfanMpCgkJIyAJZm9yIChib25kLCB2YWxfanMpIGluIHppcChjYi5jYXB0dXJlZF9ib25kcywgZnJvbV9qcykKCQkjIF0KCWVuZAoJCgkjIFRPRE86CgkjIGZ1bmN0aW9uIEJvbmRzLnBvc3NpYmxlX3ZhbHVlcyAoY2I6OkNvbWJpbmVkQm9uZHMsIGZyb21fanMpCgkjIGVuZAoJCmVuZAoKIyDilZTilZDilaEgYTIwZGExOGYtN2E3NC00M2NhLTliNjYtMWYzYjgyZWZhMGMzCiIiIgpgYGBqdWxpYQpjb21iaW5lKHJlbmRlcl9mdW5jdGlvbjo6RnVuY3Rpb24pCmBgYAoKQ29tYmluZSBtdWx0aXBsZSBpbnB1dCBlbGVtZW50cyBpbnRvIG9uZS4gVGhlIGNvbWJpbmVkIHZhbHVlcyBhcmUgc2VudCB0byBgQGJpbmRgIGFzIGEgc2luZ2xlIHR1cGxlLgoKYHJlbmRlcl9mdW5jdGlvbmAgaXMgYSBmdW5jdGlvbiB0aGF0IHlvdSB3cml0ZSB5b3Vyc2VsZiwgdGFrZSBhIGxvb2sgYXQgdGhlIGV4YW1wbGVzIGJlbG93LgoKIyBFeGFtcGxlcwoKIyMg8J+QtiAmIPCfkLEKCldlIHVzZSB0aGUgW2Bkb2Agc3ludGF4XShodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9tYW51YWwvZnVuY3Rpb25zLyNEby1CbG9jay1TeW50YXgtZm9yLUZ1bmN0aW9uLUFyZ3VtZW50cykgdG8gd3JpdGUgb3VyIGByZW5kZXJfZnVuY3Rpb25gLiBUaGUgYENoaWxkYCBmdW5jdGlvbiBpcyB3cmFwcGVkIGFyb3VuZCBlYWNoIGlucHV0LCB0byBsZXQgYGNvbWJpbmVgIGtub3cgd2hpY2ggdmFsdWVzIHRvIGNvbWJpbmUuCgpgYGBqdWxpYQpAYmluZCB2YWx1ZXMgY29tYmluZSgpIGRvIENoaWxkCgltZCIiXCIKCSMgSGkgdGhlcmUhCgoJSSBoYXZlIFwkKAoJCUNoaWxkKFNsaWRlcigxOjEwKSkKCSkgZG9ncyBhbmQgXCQoCgkJQ2hpbGQoU2xpZGVyKDU6MTAwKSkKCSkgY2F0cy4KCglXb3VsZCB5b3UgbGlrZSB0byBzZWUgdGhlbT8gXCQoQ2hpbGQoQ2hlY2tCb3godHJ1ZSkpKQoJIiJcIgplbmQKCnZhbHVlcyA9PSAoMSwgNSwgdHJ1ZSkgIyAoaW5pdGlhbGx5KQpgYGAKCgo+IFRoZSBvdXRwdXQgbG9va3MgbGlrZToKPiAKPiAhW3NjcmVlbnNob3Qgb2YgcnVubmluZyB0aGUgY29kZSBhYm92ZSBpbnNpZGUgUGx1dG9dKGh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzY5MzM1MTAvMTQ1NTg5OTE4LTI1YTNjNzMyLWMwMmUtNDgyYi04MzFiLTA2MTMxYjI4MzU5Ny5wbmcpCgojIyDwn46PCgoKVGhlIGBjb21iaW5lYCBmdW5jdGlvbiBpcyBtb3N0IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGdlbmVyYXRlIHlvdXIgaW5wdXQgZWxlbWVudHMgX2R5bmFtaWNhbGx5Xy4gVGhpcyBleGFtcGxlIHVzZXMgW0h5cGVydGV4dExpdGVyYWwuamxdKGh0dHBzOi8vZ2l0aHViLmNvbS9NZWNoYW5pY2FsUmFiYml0L0h5cGVydGV4dExpdGVyYWwuamwpIGZvciB0aGUgYEBodGxgIG1hY3JvOgoKYGBganVsaWEKQGJpbmQgc3BlZWRzIGNvbWJpbmUoKSBkbyBDaGlsZAoJQGh0bCgiIlwiCgk8aDY+V2luZCBzcGVlZHM8L2g2PgoJPHVsPgoJXCQoWwoJCUBodGwoIjxsaT5cJChuYW1lKTogXCQoQ2hpbGQoU2xpZGVyKDE6MTAwKSkpPC9saT4iKQoJCWZvciBuYW1lIGluIFsiTm9ydGgiLCAiRWFzdCIsICJTb3V0aCIsICJXZXN0Il0KCV0pCgk8L3VsPgoJIiJcIikKZW5kCgpzcGVlZHMgPT0gKDEsIDEsIDEsIDEpICMgKGluaXRpYWxseSkKCiMgYWZ0ZXIgbW92aW5nIHRoZSBzbGlkZXJzOgpzcGVlZHMgPT0gKDEwMCwgMzYsIDczLCA2MCkKYGBgCgo+IFRoZSBvdXRwdXQgbG9va3MgbGlrZToKPiAKPiAhW3NjcmVlbnNob3Qgb2YgcnVubmluZyB0aGUgY29kZSBhYm92ZSBpbnNpZGUgUGx1dG9dKGh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzY5MzM1MTAvMTQ1NTg4NjEyLTE0ODI0NjU0LTVjNzMtNDVmOC05ODNjLTg5MTNjNzEwMWE3OC5wbmcpCgoKIyBOYW1lZCB2YXJpYW50CgpJbiB0aGUgbGFzdCBleGFtcGxlLCB3ZSB1c2VkIGBDaGlsZGAgdG8gd3JhcCBhcm91bmQgY29udGFpbmVkIGlucHV0czoKYGBganVsaWEKQ2hpbGQoU2xpZGVyKDE6MTAwKSkKYGBgCldlIGNhbiBhbHNvIHVzZSB0aGUgKipuYW1lZCB2YXJpYW50KiosIHdoaWNoIGxvb2tzIGxpa2U6CmBgYGp1bGlhCkNoaWxkKCJFYXN0IiwgU2xpZGVyKDE6MTAwKSkKYGBgCgpXaGVuIHlvdSB1c2UgdGhlICpuYW1lZCB2YXJpYW50KiBmb3IgYWxsIGNoaWxkcmVuLCAqKnRoZSBib3VuZCB2YWx1ZSB3aWxsIGJlIGBOYW1lZFR1cGxlYCwgaW5zdGVhZCBvZiBhIGBUdXBsZWAqKi4KCkxldCdzIHJld3JpdGUgb3VyIGV4YW1wbGUgdG8gdXNlIHRoZSAqbmFtZWQgdmFyaWFudCo6CgpgYGBqdWxpYQpAYmluZCBzcGVlZHMgY29tYmluZSgpIGRvIENoaWxkCglAaHRsKCIiXCIKCTxoNj5XaW5kIHNwZWVkczwvaDY+Cgk8dWw+CglcJChbCgkJQGh0bCgiPGxpPlwkKG5hbWUpOiBcJChDaGlsZChuYW1lLCBTbGlkZXIoMToxMDApKSk8L2xpPiIpCgkJZm9yIG5hbWUgaW4gWyJOb3J0aCIsICJFYXN0IiwgIlNvdXRoIiwgIldlc3QiXQoJXSkKCTwvdWw+CgkiIlwiKQplbmQKCnNwZWVkcyA9PSAoTm9ydGg9MSwgRWFzdD0xLCBTb3V0aD0xLCBXZXN0PTEpICMgKGluaXRpYWxseSkKCiMgYWZ0ZXIgbW92aW5nIHRoZSBzbGlkZXJzOgpzcGVlZHMgPT0gKE5vcnRoPTEwMCwgRWFzdD0zNiwgU291dGg9NzMsIFdlc3Q9NjApCgptZCJUaGUgRWFzdGVybiB3aW5kIHNwZWVkIGlzIFwkKHNwZWVkcy5FYXN0KS4iCmBgYAoKCgojIFdoeT8KVGhlIHN0YW5kYXJkIHdheSB0byBjb21iaW5lIG11bHRpcGxlIGlucHV0cyBpbnRvIG9uZSBvdXRwdXQgaXMgdG8gdXNlIGBAYmluZGAgbXVsdGlwbGUgdGltZXMuIE91ciBpbml0aWFsIGV4YW1wbGUgY291bGQgbW9yZSBlYXNpbHkgYmUgd3JpdHRlbiBhczoKYGBganVsaWEKbWQiIlwiCiMgSGkgdGhlcmUhCgpJIGhhdmUgXCQoQGJpbmQgbnVtX2RvZ3MgU2xpZGVyKDE6MTApKSBkb2dzIGFuZCBcJChAYmluZCBudW1fY2F0cyBTbGlkZXIoNToxMCkpIGNhdHMuCgpXb3VsZCB5b3UgbGlrZSB0byBzZWUgdGhlbT8gXCQoQGJpbmQgd2FudF90b19zZWUgQ2hlY2tCb3godHJ1ZSkpCiIiXCIKYGBgCgpUaGUgYGNvbWJpbmVgIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBhcmUgZ2VuZXJhdGluZyBpbnB1dHMgKipkeW5hbWljYWxseSoqLCBsaWtlIGluIG91ciBzZWNvbmQgZXhhbXBsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbjoKLSBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgdmVyeSBsYXJnZSwgYW5kIHlvdSBkb24ndCB3YW50IHRvIHdyaXRlIGBAYmluZCBwYXJhbWV0ZXIxIC4uLmAsIGBAYmluZCBwYXJhbWV0ZXIyIC4uLmAsIGV0Yy4gCi0gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIGR5bmFtaWMhIEZvciBleGFtcGxlLCB5b3UgY2FuIGxvYWQgaW4gYSB0YWJsZSBpbiBvbmUgY2VsbCwgYW5kIHRoZW4gdXNlIGBjb21iaW5lYCBpbiBhbm90aGVyIGNlbGwgdG8gc2VsZWN0IHdoaWNoIHJvd3MgeW91IHdhbnQgdG8gdXNlLgoKIiIiCmZ1bmN0aW9uIGNvbWJpbmUoZjo6RnVuY3Rpb24pCglrZXkgPSBTdHJpbmcocmFuZCgnYSc6J3onLCAxMCkpCgoJY2FwdHVyZWRfbmFtZXMgPSBTeW1ib2xbXQoJY2FwdHVyZWRfYm9uZHMgPSBbXQoKCWZ1bmN0aW9uIGNvbWJpbmVkX2NoaWxkKHgpCgkJcHVzaCEoY2FwdHVyZWRfYm9uZHMsIHgpCgkJQGh0bCgiIiI8cGwtY29tYmluZWRfY2hpbGQga2V5PSQoa2V5KT4kKHgpPC9wbC1jb21iaW5lZF9jaGlsZD4iIiIpCgllbmQKCWZ1bmN0aW9uIGNvbWJpbmVkX2NoaWxkKG5hbWU6OlVuaW9ue1N0cmluZyxTeW1ib2x9LCB4KQoJCXB1c2ghKGNhcHR1cmVkX25hbWVzLCBTeW1ib2wobmFtZSkpCgkJY29tYmluZWRfY2hpbGQoeCkKCWVuZAoKCXJlc3VsdCA9IGYoY29tYmluZWRfY2hpbGQpCgoJQGFzc2VydCBpc2VtcHR5KGNhcHR1cmVkX25hbWVzKSB8fCBsZW5ndGgoY2FwdHVyZWRfbmFtZXMpID09IGxlbmd0aChjYXB0dXJlZF9ib25kcykgIlNvbWUgY2hpbGRyZW4gZG8gbm90IGhhdmUgYSBuYW1lLiBNYWtlIHN1cmUgdGhhdCBhbGwgY2FsbHMgb2YgYENoaWxkYCBwcm92aWRlIHR3byBhcmd1bWVudHMuIgoJCglDb21iaW5lZEJvbmRzKDsKCQlzZWNyZXRfa2V5ID0ga2V5LAoJCWNhcHR1cmVkX25hbWVzID0gaXNlbXB0eShjYXB0dXJlZF9uYW1lcykgPyBub3RoaW5nIDogdHVwbGUoY2FwdHVyZWRfbmFtZXMuLi4pLAoJCWNhcHR1cmVkX2JvbmRzID0gY2FwdHVyZWRfYm9uZHMsCgkJZGlzcGxheV9jb250ZW50ID0gcmVzdWx0LAoJKQplbmQKCiMg4pWU4pWQ4pWhIGFkNWNmZmE1LTMxM2MtNGRlOS05MzYwLTAwNTM2NWI0MDc4MApleHBvcnQgY29tYmluZQoKIyDilZTilZDilaEgNmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdkCm1kIiIiCiMjIEV4YW1wbGVzCiIiIgoKIyDilZTilZDilaEgZjA4NjgwYjItZWQyOC00ZmFjLTgzOGMtMmVjYTdlNzVjNmRjCkBza2lwX2FzX3NjcmlwdCBAYmluZCB2YWx1ZXMgY29tYmluZSgpIGRvIENoaWxkCgltZCIiIgoJIyBIaSB0aGVyZSEKCglJIGhhdmUgJChDaGlsZChTbGlkZXIoMToxMCkpKSBkb2dzIGFuZCAkKENoaWxkKFNsaWRlcig1OjEwKSkpIGNhdHMuCgoJV291bGQgeW91IGxpa2UgdG8gc2VlIHRoZW0/ICQoQ2hpbGQoQ2hlY2tCb3godHJ1ZSkpKQoJIiIiCmVuZAoKIyDilZTilZDilaEgOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVhCkBza2lwX2FzX3NjcmlwdCB2YWx1ZXMKCiMg4pWU4pWQ4pWhIDgwMWZiMDIxLTczYTAtNDExNC1hMzZhLTMyOGU4NGYwMGI1MQpAc2tpcF9hc19zY3JpcHQgQGJpbmQgc3BlZWRzIGNvbWJpbmUoKSBkbyBDaGlsZAoJQGh0bCgiIiIKCTxoMz5XaW5kIHNwZWVkczwvaDM+Cgk8dWw+CgkkKFsKCQlAaHRsKCI8bGk+JChuYW1lKTogJChDaGlsZChTbGlkZXIoMToxMDApKSkiKQoJCWZvciBuYW1lIGluIFsiTm9ydGgiLCAiRWFzdCIsICJTb3V0aCIsICJXZXN0Il0KCV0pCgk8L3VsPgoJIiIiKQplbmQKCiMg4pWU4pWQ4pWhIGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MgpAc2tpcF9hc19zY3JpcHQgc3BlZWRzCgojIOKVlOKVkOKVoSAzOWJlNjUyZi1iY2Q3LTRhNGYtOGIwMy01MTY3Mjg1ZGM3YTIKQHNraXBfYXNfc2NyaXB0IEBiaW5kIHNwZWVkc19uYW1lZCBjb21iaW5lKCkgZG8gQ2hpbGQKCUBodGwoIiIiCgk8aDM+V2luZCBzcGVlZHM8L2gzPgoJPHVsPgoJJChbCgkJQGh0bCgiPGxpPiQobmFtZSk6ICQoQ2hpbGQobmFtZSwgU2xpZGVyKDE6MTAwKSkpIikKCQlmb3IgbmFtZSBpbiBbIk5vcnRoIiwgIkVhc3QiLCAiU291dGgiLCAiV2VzdCJdCgldKQoJPC91bD4KCSIiIikKZW5kCgojIOKVlOKVkOKVoSBjOGUwOWJmNS1lYWU0LTQ5MmYtOTQ2ZS00YmI1NWZmN2UxNjEKQHNraXBfYXNfc2NyaXB0IHNwZWVkc19uYW1lZAoKIyDilZTilZDilaEgYzMxNzY1NDktN2M0Ni00ZDg5LTljNzYtODE3YzZiZmNiYjcxCkBza2lwX2FzX3NjcmlwdCByYiA9IEBiaW5kIHRvZ2V0aGVyIGNvbWJpbmUoKSBkbyBDaGlsZAoJQGh0bCgiIiIKCTxwPkhlbGxvIHdvcmxkITwvcD4KCSQoQ2hpbGQoVGV4dEZpZWxkKCkpKQoJJChDaGlsZChTbGlkZXIoW3NpbiwgY29zLCB0YW5dKSkpCgkkKFsKCQlDaGlsZChTY3J1YmJhYmxlKDcpKQoJCWZvciBfIGluIDE6MwoJXSkKCQoJIiIiKQplbmQKCiMg4pWU4pWQ4pWhIDUzMDBiODBkLTQwOTctNGI4NS1hZDJhLTNhNTRiMDE1NTliZgpAc2tpcF9hc19zY3JpcHQgbGV0CglzbGVlcCguNSkKCXRvZ2V0aGVyCmVuZAoKIyDilZTilZDilaEgNmQ0ZjYyYTYtZTNkOS00MTZmLWExZTMtNjk0YzMxY2ZiYjMxCkBza2lwX2FzX3NjcmlwdCByYgoKIyDilZTilZDilaEgNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIzCm1kIiIiCiMjIFRlc3RzCiIiIgoKIyDilZTilZDilaEgM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE1Cm1kIiIiCiMjIyBJbml0aWFsIHZhbHVlICYgdHJhbnNmb3JtCiIiIgoKIyDilZTilZDilaEgMGI2NDNlZDktOTE0YS00NzViLWExY2UtZDg0MGRmMWZjMjIzCkBza2lwX2FzX3NjcmlwdCBiZWdpbgoJaXR2cyA9IFtdCglpdGIgPSBAYmluZCBpdHYgY29tYmluZSgpIGRvIENoaWxkCgkJQGh0bCgiIiIKCQk8cD5IZWxsbyB3b3JsZCE8L3A+CgkJJChDaGlsZChAaHRsKCI8aW5wdXQgdHlwZT1yYW5nZT4iKSkpCgkJJChDaGlsZChTbGlkZXIoW3NpbiwgY29zLCB0YW5dKSkpCgkJCgkJIiIiKQoJZW5kCmVuZAoKIyDilZTilZDilaEgNTlhMTk5ZjQtNGNjYy00MzE5LTlkMzItMDNkYTNhZGJiNWRiCkBza2lwX2FzX3NjcmlwdCBpdGIKCiMg4pWU4pWQ4pWhIGNjM2U0NzVlLWQyYzItNGI0MC1hMWJhLTAzMzU3NmFlZmRhZQptZCIiIgpTaG91bGQgYmUgYFtbbWlzc2luZywgc2luXSwgWzUwLCBzaW5dXWAKIiIiCgojIOKVlOKVkOKVoSAxMjdkZDU4Yi05YmEwLTQxZDgtOTFlNi0zNTdkOWVjNjNlNmIKQHNraXBfYXNfc2NyaXB0IHB1c2ghKGl0dnMsIGl0dikKCiMg4pWU4pWQ4pWhIDdkZTUwNDM1LWU5NjItNDQwNS1iMDZkLTgzZmJlOTQzNmNmZgptZCIiIgojIyMgQ29tYmluZSBpbnNpZGUgY29tYmluZQoiIiIKCiMg4pWU4pWQ4pWhIDMzOTZhNWJhLTUzM2UtNGUwZC1hYjRmLWM2MzM0NTliZDgxYQpAc2tpcF9hc19zY3JpcHQgY2IxID0gY29tYmluZSgpIGRvIENoaWxkCgltZCIiIgoJTGVmdDogJChDaGlsZCg6bGVmdCwgU2xpZGVyKDE6MTApKSksIHJpZ2h0OiAkKENoaWxkKDpyaWdodCwgU2NydWJiYWJsZSg1KSkpCgkiIiIKZW5kCgojIOKVlOKVkOKVoSA4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjAKQHNraXBfYXNfc2NyaXB0IGNiMmIgPSBAYmluZCB3b3d6IGNvbWJpbmUoKSBkbyBDaGlsZAoJbWQiIiIKCURvIGEgdGhpbmc6ICQoQ2hpbGQoQ2hlY2tCb3goKSkpCgkKCSMjIyMgVXAKCSQoQ2hpbGQoY2IxKSkKCgkjIyMjIERvd24KCSQoQ2hpbGQoY2IxKSkKCQoJIiIiCmVuZAoKIyDilZTilZDilaEgYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM1CkBza2lwX2FzX3NjcmlwdCB3b3d6CgojIOKVlOKVkOKVoSBjN2EzMmFiMi0yYTViLTQ4NWItOTc5NS00YTc0MzYwNGRlODIKQHNraXBfYXNfc2NyaXB0IGNiMmIKCiMg4pWU4pWQ4pWhIENlbGwgb3JkZXI6CiMg4pWf4pSAODgxYjc1ZDMtY2ViZS00YTUzLThjZjUtYmVhZWVkZGFmZDM1CiMg4pWf4pSAYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2CiMg4pWf4pSAOWU1NmRiYjktMmU5My00MTM2LWIxMGItN2IxZWNiMDdlNmYxCiMg4pWf4pSAZGFkZjJmNDAtMTc2NC00N2E0LWI1NjAtNjgzYjY0NzlkNzdmCiMg4pWg4pWQMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBjCiMg4pWg4pWQNTAyOGZjMDEtNGUxNC00NTUwLThhZTYtNDg3MDNiODZkYzIxCiMg4pWf4pSAY2NiZTQ0MjMtODAxYi00YzIwLWFkMmQtZWU4OWQ1Y2ZhODU5CiMg4pWg4pWQYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwCiMg4pWg4pWQYTIwZGExOGYtN2E3NC00M2NhLTliNjYtMWYzYjgyZWZhMGMzCiMg4pWf4pSAODU5MTg2MDktNWUxZi00MDQwLTk5YmUtNjFjMmRkOGZmNjU0CiMg4pWg4pWQMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY3CiMg4pWf4pSAOTU3ODU4ZjgtNGFjZS00Y2FlLWJiMTYtNDk1NjlkYWE5ODY5CiMg4pWf4pSANmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdkCiMg4pWg4pWQMzhiN2VlYjktODBiYi00YTNhLWEyZDItODA5ZmM0MjM2MjVjCiMg4pWg4pWQZjA4NjgwYjItZWQyOC00ZmFjLTgzOGMtMmVjYTdlNzVjNmRjCiMg4pWg4pWQOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVhCiMg4pWg4pWQODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUxCiMg4pWg4pWQZDc5ODU4NDQtNTk0NC00MmI5LWFkNDEtNTk5Y2Q3MmVlYTgyCiMg4pWg4pWQMzliZTY1MmYtYmNkNy00YTRmLThiMDMtNTE2NzI4NWRjN2EyCiMg4pWg4pWQYzhlMDliZjUtZWFlNC00OTJmLTk0NmUtNGJiNTVmZjdlMTYxCiMg4pWg4pWQYzMxNzY1NDktN2M0Ni00ZDg5LTljNzYtODE3YzZiZmNiYjcxCiMg4pWg4pWQNTMwMGI4MGQtNDA5Ny00Yjg1LWFkMmEtM2E1NGIwMTU1OWJmCiMg4pWg4pWQNmQ0ZjYyYTYtZTNkOS00MTZmLWExZTMtNjk0YzMxY2ZiYjMxCiMg4pWf4pSANWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIzCiMg4pWf4pSAM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE1CiMg4pWg4pWQMGI2NDNlZDktOTE0YS00NzViLWExY2UtZDg0MGRmMWZjMjIzCiMg4pWg4pWQNTlhMTk5ZjQtNGNjYy00MzE5LTlkMzItMDNkYTNhZGJiNWRiCiMg4pWf4pSAY2MzZTQ3NWUtZDJjMi00YjQwLWExYmEtMDMzNTc2YWVmZGFlCiMg4pWg4pWQMTI3ZGQ1OGItOWJhMC00MWQ4LTkxZTYtMzU3ZDllYzYzZTZiCiMg4pWf4pSAN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2ZmCiMg4pWg4pWQMzM5NmE1YmEtNTMzZS00ZTBkLWFiNGYtYzYzMzQ1OWJkODFhCiMg4pWg4pWQODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwCiMg4pWg4pWQYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM1CiMg4pWg4pWQYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgyCg==";
window.pluto_disable_ui = true;
window.pluto_slider_server_url = undefined;
window.pluto_binder_url = "https://mybinder.org/v2/gh/fonsp/pluto-on-binder/v0.17.3";
window.pluto_statefile = "data:;base64,j6Vib25kc4amdmFsdWVzgaV2YWx1ZZMBAcOmc3BlZWRzgaV2YWx1ZZQBAQEBpHdvd3qBpXZhbHVlk8KSAQWSAQWodG9nZXRoZXKBpXZhbHVllaABBwcHo2l0doGldmFsdWWSMgGsc3BlZWRzX25hbWVkgaV2YWx1ZZQBAQEBrGNlbGxfcmVzdWx0c94AItkkN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2ZmiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedk8PGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMz5Db21iaW5lIGluc2lkZSBjb21iaW5lPC9oMz4KPC9kaXY+sHBlcnNpc3RfanNfc3RhdGXCpG1pbWWpdGV4dC9odG1ssmxhc3RfcnVuX3RpbWVzdGFtcMtB2Gzf+Xo0qLdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQ3ZGU1MDQzNS1lOTYyLTQ0MDUtYjA2ZC04M2ZiZTk0MzZjZma5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAbQJtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDZjOGEwM2U0LTdkOGUtNGFhNC1hNzUwLTdiODE1NjIyMTQ3ZIimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnZLjxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDI+RXhhbXBsZXM8L2gyPgo8L2Rpdj6wcGVyc2lzdF9qc19zdGF0ZcKkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbN/5eXeSt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDZjOGEwM2U0LTdkOGUtNGFhNC1hNzUwLTdiODE1NjIyMTQ3ZLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgABq2m1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIziKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedkrPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMj5UZXN0czwvaDI+CjwvZGl2PrBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs3/l5g1a3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIzuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAGzObVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQ4NTkxODYwOS01ZTFmLTQwNDAtOTliZS02MWMyZGQ4ZmY2NTSIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52S88ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgyPlRoZSBtYWdpYzwvaDI+CjwvZGl2PrBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs3/l5a7q3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkODU5MTg2MDktNWUxZi00MDQwLTk5YmUtNjFjMmRkOGZmNjU0uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAIDIrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2aIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5slByb2plY3QgZW52IGFjdGl2ZbBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqnRleHQvcGxhaW6ybGFzdF9ydW5fdGltZXN0YW1wy0HYbN/7YXnIt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJGRhZGYyZjQwLTE3NjQtNDdhNC1iNTYwLTY4M2I2NDc5ZDc3ZrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgTBbUy1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkNTAyOGZjMDEtNGUxNC00NTUwLThhZTYtNDg3MDNiODZkYzIxiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9keaCwcGVyc2lzdF9qc19zdGF0ZcKkbWltZap0ZXh0L3BsYWlusmxhc3RfcnVuX3RpbWVzdGFtcMtB2Gzf/FLbmLdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQ1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAwjatXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM4imcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnaFMQ8ZGl2IGNsYXNzPSJwbHV0by1kb2NzLWJpbmRpbmciIHN0eWxlPSJtYXJnaW46IC41ZW07IHBhZGRpbmc6IDFlbTsgYmFja2dyb3VuZDogIzgzODM4MzBhOyBib3JkZXItcmFkaXVzOiAxZW07Ij4KPHNwYW4gc3R5bGU9IgogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTE5cHgsIC0xNnB4KTsKICAgIGZvbnQtZmFtaWx5OiAnSnVsaWFNb25vJywgbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAuOXJlbTsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAvKiBoZWlnaHQ6IDFweDsgKi8KICAgIG1hcmdpbi10b3A6IC0xZW07CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDdweDsKICAgIC8qIGNvbG9yOiAjNjQ2NDY0OyAqLwogICAgLyogYm9yZGVyOiAzcHggc29saWQgI2Y5OWIxNTM2OwoiPmNvbWJpbmU8L3NwYW4+CjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS1qdWxpYSI+Y29tYmluZSYjNDA7cmVuZGVyX2Z1bmN0aW9uOjpGdW5jdGlvbiYjNDE7PC9jb2RlPjwvcHJlPgo8cD5Db21iaW5lIG11bHRpcGxlIGlucHV0IGVsZW1lbnRzIGludG8gb25lLiBUaGUgY29tYmluZWQgdmFsdWVzIGFyZSBzZW50IHRvIDxjb2RlPkBiaW5kPC9jb2RlPiBhcyBhIHNpbmdsZSB0dXBsZS48L3A+CjxwPjxjb2RlPnJlbmRlcl9mdW5jdGlvbjwvY29kZT4gaXMgYSBmdW5jdGlvbiB0aGF0IHlvdSB3cml0ZSB5b3Vyc2VsZiwgdGFrZSBhIGxvb2sgYXQgdGhlIGV4YW1wbGVzIGJlbG93LjwvcD4KPGgxPkV4YW1wbGVzPC9oMT4KPGgyPvCfkLYgJmFtcDsg8J+QsTwvaDI+CjxwPldlIHVzZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL2Z1bmN0aW9ucy8jRG8tQmxvY2stU3ludGF4LWZvci1GdW5jdGlvbi1Bcmd1bWVudHMiPjxjb2RlPmRvPC9jb2RlPiBzeW50YXg8L2E+IHRvIHdyaXRlIG91ciA8Y29kZT5yZW5kZXJfZnVuY3Rpb248L2NvZGU+LiBUaGUgPGNvZGU+Q2hpbGQ8L2NvZGU+IGZ1bmN0aW9uIGlzIHdyYXBwZWQgYXJvdW5kIGVhY2ggaW5wdXQsIHRvIGxldCA8Y29kZT5jb21iaW5lPC9jb2RlPiBrbm93IHdoaWNoIHZhbHVlcyB0byBjb21iaW5lLjwvcD4KPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtanVsaWEiPkBiaW5kIHZhbHVlcyBjb21iaW5lJiM0MDsmIzQxOyBkbyBDaGlsZAoJbWQmcXVvdDsmcXVvdDsmcXVvdDsKCSMgSGkgdGhlcmUmIzMzOwoKCUkgaGF2ZSAmIzM2OyYjNDA7CgkJQ2hpbGQmIzQwO1NsaWRlciYjNDA7MToxMCYjNDE7JiM0MTsKCSYjNDE7IGRvZ3MgYW5kICYjMzY7JiM0MDsKCQlDaGlsZCYjNDA7U2xpZGVyJiM0MDs1OjEwMCYjNDE7JiM0MTsKCSYjNDE7IGNhdHMuCgoJV291bGQgeW91IGxpa2UgdG8gc2VlIHRoZW0/ICYjMzY7JiM0MDtDaGlsZCYjNDA7Q2hlY2tCb3gmIzQwO3RydWUmIzQxOyYjNDE7JiM0MTsKCSZxdW90OyZxdW90OyZxdW90OwplbmQKCnZhbHVlcyAmIzYxOyYjNjE7ICYjNDA7MSwgNSwgdHJ1ZSYjNDE7ICMgJiM0MDtpbml0aWFsbHkmIzQxOzwvY29kZT48L3ByZT4KPGJsb2NrcXVvdGU+CjxwPlRoZSBvdXRwdXQgbG9va3MgbGlrZTo8L3A+CjxwPjxpbWcgc3JjPSJodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS82OTMzNTEwLzE0NTU4OTkxOC0yNWEzYzczMi1jMDJlLTQ4MmItODMxYi0wNjEzMWIyODM1OTcucG5nIiBhbHQ9InNjcmVlbnNob3Qgb2YgcnVubmluZyB0aGUgY29kZSBhYm92ZSBpbnNpZGUgUGx1dG8iIC8+PC9wPgo8L2Jsb2NrcXVvdGU+CjxoMj7wn46PPC9oMj4KPHA+VGhlIDxjb2RlPmNvbWJpbmU8L2NvZGU+IGZ1bmN0aW9uIGlzIG1vc3QgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gZ2VuZXJhdGUgeW91ciBpbnB1dCBlbGVtZW50cyA8ZW0+ZHluYW1pY2FsbHk8L2VtPi4gVGhpcyBleGFtcGxlIHVzZXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL01lY2hhbmljYWxSYWJiaXQvSHlwZXJ0ZXh0TGl0ZXJhbC5qbCI+SHlwZXJ0ZXh0TGl0ZXJhbC5qbDwvYT4gZm9yIHRoZSA8Y29kZT5AaHRsPC9jb2RlPiBtYWNybzo8L3A+CjxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLWp1bGlhIj5AYmluZCBzcGVlZHMgY29tYmluZSYjNDA7JiM0MTsgZG8gQ2hpbGQKCUBodGwmIzQwOyZxdW90OyZxdW90OyZxdW90OwoJJmx0O2g2Jmd0O1dpbmQgc3BlZWRzJmx0Oy9oNiZndDsKCSZsdDt1bCZndDsKCSYjMzY7JiM0MDsmIzkxOwoJCUBodGwmIzQwOyZxdW90OyZsdDtsaSZndDsmIzM2OyYjNDA7bmFtZSYjNDE7OiAmIzM2OyYjNDA7Q2hpbGQmIzQwO1NsaWRlciYjNDA7MToxMDAmIzQxOyYjNDE7JiM0MTsmbHQ7L2xpJmd0OyZxdW90OyYjNDE7CgkJZm9yIG5hbWUgaW4gJiM5MTsmcXVvdDtOb3J0aCZxdW90OywgJnF1b3Q7RWFzdCZxdW90OywgJnF1b3Q7U291dGgmcXVvdDssICZxdW90O1dlc3QmcXVvdDsmIzkzOwoJJiM5MzsmIzQxOwoJJmx0Oy91bCZndDsKCSZxdW90OyZxdW90OyZxdW90OyYjNDE7CmVuZAoKc3BlZWRzICYjNjE7JiM2MTsgJiM0MDsxLCAxLCAxLCAxJiM0MTsgIyAmIzQwO2luaXRpYWxseSYjNDE7CgojIGFmdGVyIG1vdmluZyB0aGUgc2xpZGVyczoKc3BlZWRzICYjNjE7JiM2MTsgJiM0MDsxMDAsIDM2LCA3MywgNjAmIzQxOzwvY29kZT48L3ByZT4KPGJsb2NrcXVvdGU+CjxwPlRoZSBvdXRwdXQgbG9va3MgbGlrZTo8L3A+CjxwPjxpbWcgc3JjPSJodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS82OTMzNTEwLzE0NTU4ODYxMi0xNDgyNDY1NC01YzczLTQ1ZjgtOTgzYy04OTEzYzcxMDFhNzgucG5nIiBhbHQ9InNjcmVlbnNob3Qgb2YgcnVubmluZyB0aGUgY29kZSBhYm92ZSBpbnNpZGUgUGx1dG8iIC8+PC9wPgo8L2Jsb2NrcXVvdGU+CjxoMT5OYW1lZCB2YXJpYW50PC9oMT4KPHA+SW4gdGhlIGxhc3QgZXhhbXBsZSwgd2UgdXNlZCA8Y29kZT5DaGlsZDwvY29kZT4gdG8gd3JhcCBhcm91bmQgY29udGFpbmVkIGlucHV0czo8L3A+CjxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLWp1bGlhIj5DaGlsZCYjNDA7U2xpZGVyJiM0MDsxOjEwMCYjNDE7JiM0MTs8L2NvZGU+PC9wcmU+CjxwPldlIGNhbiBhbHNvIHVzZSB0aGUgPHN0cm9uZz5uYW1lZCB2YXJpYW50PC9zdHJvbmc+LCB3aGljaCBsb29rcyBsaWtlOjwvcD4KPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtanVsaWEiPkNoaWxkJiM0MDsmcXVvdDtFYXN0JnF1b3Q7LCBTbGlkZXImIzQwOzE6MTAwJiM0MTsmIzQxOzwvY29kZT48L3ByZT4KPHA+V2hlbiB5b3UgdXNlIHRoZSA8ZW0+bmFtZWQgdmFyaWFudDwvZW0+IGZvciBhbGwgY2hpbGRyZW4sIDxzdHJvbmc+dGhlIGJvdW5kIHZhbHVlIHdpbGwgYmUgPGNvZGU+TmFtZWRUdXBsZTwvY29kZT4sIGluc3RlYWQgb2YgYSA8Y29kZT5UdXBsZTwvY29kZT48L3N0cm9uZz4uPC9wPgo8cD5MZXQmIzM5O3MgcmV3cml0ZSBvdXIgZXhhbXBsZSB0byB1c2UgdGhlIDxlbT5uYW1lZCB2YXJpYW50PC9lbT46PC9wPgo8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS1qdWxpYSI+QGJpbmQgc3BlZWRzIGNvbWJpbmUmIzQwOyYjNDE7IGRvIENoaWxkCglAaHRsJiM0MDsmcXVvdDsmcXVvdDsmcXVvdDsKCSZsdDtoNiZndDtXaW5kIHNwZWVkcyZsdDsvaDYmZ3Q7CgkmbHQ7dWwmZ3Q7CgkmIzM2OyYjNDA7JiM5MTsKCQlAaHRsJiM0MDsmcXVvdDsmbHQ7bGkmZ3Q7JiMzNjsmIzQwO25hbWUmIzQxOzogJiMzNjsmIzQwO0NoaWxkJiM0MDtuYW1lLCBTbGlkZXImIzQwOzE6MTAwJiM0MTsmIzQxOyYjNDE7Jmx0Oy9saSZndDsmcXVvdDsmIzQxOwoJCWZvciBuYW1lIGluICYjOTE7JnF1b3Q7Tm9ydGgmcXVvdDssICZxdW90O0Vhc3QmcXVvdDssICZxdW90O1NvdXRoJnF1b3Q7LCAmcXVvdDtXZXN0JnF1b3Q7JiM5MzsKCSYjOTM7JiM0MTsKCSZsdDsvdWwmZ3Q7CgkmcXVvdDsmcXVvdDsmcXVvdDsmIzQxOwplbmQKCnNwZWVkcyAmIzYxOyYjNjE7ICYjNDA7Tm9ydGgmIzYxOzEsIEVhc3QmIzYxOzEsIFNvdXRoJiM2MTsxLCBXZXN0JiM2MTsxJiM0MTsgIyAmIzQwO2luaXRpYWxseSYjNDE7CgojIGFmdGVyIG1vdmluZyB0aGUgc2xpZGVyczoKc3BlZWRzICYjNjE7JiM2MTsgJiM0MDtOb3J0aCYjNjE7MTAwLCBFYXN0JiM2MTszNiwgU291dGgmIzYxOzczLCBXZXN0JiM2MTs2MCYjNDE7CgptZCZxdW90O1RoZSBFYXN0ZXJuIHdpbmQgc3BlZWQgaXMgJiMzNjsmIzQwO3NwZWVkcy5FYXN0JiM0MTsuJnF1b3Q7PC9jb2RlPjwvcHJlPgo8aDE+V2h5PzwvaDE+CjxwPlRoZSBzdGFuZGFyZCB3YXkgdG8gY29tYmluZSBtdWx0aXBsZSBpbnB1dHMgaW50byBvbmUgb3V0cHV0IGlzIHRvIHVzZSA8Y29kZT5AYmluZDwvY29kZT4gbXVsdGlwbGUgdGltZXMuIE91ciBpbml0aWFsIGV4YW1wbGUgY291bGQgbW9yZSBlYXNpbHkgYmUgd3JpdHRlbiBhczo8L3A+CjxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLWp1bGlhIj5tZCZxdW90OyZxdW90OyZxdW90OwojIEhpIHRoZXJlJiMzMzsKCkkgaGF2ZSAmIzM2OyYjNDA7QGJpbmQgbnVtX2RvZ3MgU2xpZGVyJiM0MDsxOjEwJiM0MTsmIzQxOyBkb2dzIGFuZCAmIzM2OyYjNDA7QGJpbmQgbnVtX2NhdHMgU2xpZGVyJiM0MDs1OjEwJiM0MTsmIzQxOyBjYXRzLgoKV291bGQgeW91IGxpa2UgdG8gc2VlIHRoZW0/ICYjMzY7JiM0MDtAYmluZCB3YW50X3RvX3NlZSBDaGVja0JveCYjNDA7dHJ1ZSYjNDE7JiM0MTsKJnF1b3Q7JnF1b3Q7JnF1b3Q7PC9jb2RlPjwvcHJlPgo8cD5UaGUgPGNvZGU+Y29tYmluZTwvY29kZT4gZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4geW91IGFyZSBnZW5lcmF0aW5nIGlucHV0cyA8c3Ryb25nPmR5bmFtaWNhbGx5PC9zdHJvbmc+LCBsaWtlIGluIG91ciBzZWNvbmQgZXhhbXBsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbjo8L3A+Cjx1bD4KPGxpPjxwPlRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpcyB2ZXJ5IGxhcmdlLCBhbmQgeW91IGRvbiYjMzk7dCB3YW50IHRvIHdyaXRlIDxjb2RlPkBiaW5kIHBhcmFtZXRlcjEgLi4uPC9jb2RlPiwgPGNvZGU+QGJpbmQgcGFyYW1ldGVyMiAuLi48L2NvZGU+LCBldGMuIDwvcD4KPC9saT4KPGxpPjxwPlRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpcyBkeW5hbWljJiMzMzsgRm9yIGV4YW1wbGUsIHlvdSBjYW4gbG9hZCBpbiBhIHRhYmxlIGluIG9uZSBjZWxsLCBhbmQgdGhlbiB1c2UgPGNvZGU+Y29tYmluZTwvY29kZT4gaW4gYW5vdGhlciBjZWxsIHRvIHNlbGVjdCB3aGljaCByb3dzIHlvdSB3YW50IHRvIHVzZS48L3A+CjwvbGk+CjwvdWw+CgoKPC9kaXY+CjwvZGl2PgqwcGVyc2lzdF9qc19zdGF0ZcKkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOIB6ijht2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAkuLe1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkMzliZTY1MmYtYmNkNy00YTRmLThiMDMtNTE2NzI4NWRjN2EyiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedoKwDxib25kIGRlZj0ic3BlZWRzX25hbWVkIj48c3Bhbj4KPGgzPldpbmQgc3BlZWRzPC9oMz4KPHVsPgo8bGk+Tm9ydGg6IDxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J2ZoYm16bnNjZ28nPjxpbnB1dCAKdHlwZT0icmFuZ2UiIAptaW49MSBtYXg9JzEwMCcgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPjxsaT5FYXN0OiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdmaGJtem5zY2dvJz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMDAnIHZhbHVlPScxJwo+CgoKPC9wbC1jb21iaW5lZF9jaGlsZD48bGk+U291dGg6IDxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J2ZoYm16bnNjZ28nPjxpbnB1dCAKdHlwZT0icmFuZ2UiIAptaW49MSBtYXg9JzEwMCcgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPjxsaT5XZXN0OiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdmaGJtem5zY2dvJz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMDAnIHZhbHVlPScxJwo+CgoKPC9wbC1jb21iaW5lZF9jaGlsZD4KPC91bD4KCjxzY3JpcHQgaWQ9J2ZoYm16bnNjZ28nPgpjb25zdCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKbGV0IGtleSA9ICJmaGJtem5zY2dvIgpjb25zdCBpbnB1dHMgPSBkaXYucXVlcnlTZWxlY3RvckFsbChgcGwtY29tYmluZWRfY2hpbGRba2V5PScke2tleX0nXSA+ICo6Zmlyc3QtY2hpbGRgKQoKY29uc3QgdmFsdWVzID0gQXJyYXkoaW5wdXRzLmxlbmd0aCkKCmlucHV0cy5mb3JFYWNoKGFzeW5jIChlbCxpKSA9PiB7CgllbC5vbmlucHV0ID0gKGUpID0+IHsKCQllLnN0b3BQcm9wYWdhdGlvbigpCgl9Cgljb25zdCBnZW4gPSBHZW5lcmF0b3JzLmlucHV0KGVsKQoJd2hpbGUodHJ1ZSkgewoJCXZhbHVlc1tpXSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQlkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlcywKCXNldDogKG5ld3ZhbHMpID0+IHsKCQlpZighbmV3dmFscykgewoJCQlyZXR1cm4KCQl9CgkJaW5wdXRzLmZvckVhY2goKGVsLCBpKSA9PiB7CgkJCXZhbHVlc1tpXSA9IG5ld3ZhbHNbaV0KCQkJc2V0X2lucHV0X3ZhbHVlKGVsLCBuZXd2YWxzW2ldKQoJCX0pCn0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvYm9uZD6wcGVyc2lzdF9qc19zdGF0ZcOkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOIB8pqmt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDM5YmU2NTJmLWJjZDctNGE0Zi04YjAzLTUxNjcyODVkYzdhMrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgIW2gq1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedotbDxib25kIGRlZj0id293eiI+PHNwYW4+CjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5EbyBhIHRoaW5nOiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdzcnlocGhhdHFvJz48aW5wdXQgdHlwZT0iY2hlY2tib3giPjwvcGwtY29tYmluZWRfY2hpbGQ+PC9wPgo8aDQ+VXA8L2g0Pgo8cGwtY29tYmluZWRfY2hpbGQga2V5PSdzcnlocGhhdHFvJz48c3Bhbj4KPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxwPkxlZnQ6IDxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3Nyb2txd2ppenQnPjxpbnB1dCAKdHlwZT0icmFuZ2UiIAptaW49MSBtYXg9JzEwJyB2YWx1ZT0nMScKPgoKCjwvcGwtY29tYmluZWRfY2hpbGQ+LCByaWdodDogPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nc3Jva3F3aml6dCc+PHNjcmlwdCBpZD0nYXlxdHJxYWtnam91YXZzZCc+Ci8vIHdlaXJkIGltcG9ydCB0byBtYWtlIGl0IGZhc3Rlci4gVGhlIGBhd2FpdCBpbXBvcnRgIGNhbiBzdGlsbCBkZWxheSBleGVjdXRpb24gYnkgb25lIGZyYW1lIGlmIGl0IGlzIGFscmVhZHkgbG9hZGVkLi4uCndpbmRvdy5kM2Zvcm1hdCA9IHdpbmRvdy5kM2Zvcm1hdCA/PyBhd2FpdCBpbXBvcnQoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vZDMtZm9ybWF0QDIvK2VzbSIpCgpjb25zdCBhcmdtaW4gPSB4cyA9PiB4cy5pbmRleE9mKE1hdGgubWluKC4uLnhzKSkKY29uc3QgY2xvc2VzdF9pbmRleCA9ICh4cywgeSkgPT4gYXJnbWluKHhzLm1hcCh4ID0+IE1hdGguYWJzKHgteSkpKQoKY29uc3QgdmFsdWVzID0gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXQoKY29uc3QgZWwgPSBodG1sYAo8c3BhbiB0aXRsZT0iQ2xpY2sgYW5kIGRyYWcgdGhpcyBudW1iZXIgbGVmdCBvciByaWdodCEiIHN0eWxlPSJjdXJzb3I6IGNvbC1yZXNpemU7CnRvdWNoLWFjdGlvbjogbm9uZTsKYmFja2dyb3VuZDogcmdiKDI1MiwgMjA5LCAyMDQpOwpwYWRkaW5nOiAwZW0gLjJlbTsKYm9yZGVyLXJhZGl1czogLjNlbTsKZm9udC13ZWlnaHQ6IGJvbGQ7Ij41PC9zcGFuPgpgCgoKCmxldCBvbGRfeCA9IDAKbGV0IG9sZF9pbmRleCA9IDAKY29uc3QgaW5pdGlhbF9pbmRleCA9IGNsb3Nlc3RfaW5kZXgodmFsdWVzLCA1KQpsZXQgY3VycmVudF9pbmRleCA9IGluaXRpYWxfaW5kZXgKCmNvbnN0IGZvcm1hdHRlciA9IHMgPT4gIiIgKyBkM2Zvcm1hdC5mb3JtYXQoIiIpKHMpICsgIiIKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gdmFsdWVzW2N1cnJlbnRfaW5kZXhdLAoJc2V0OiB4ID0+IHsKCQljdXJyZW50X2luZGV4ID0gY2xvc2VzdF9pbmRleCh2YWx1ZXMsIHgpCgkJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgovLyBpbml0aWFsIHZhbHVlCmVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcig1KQoKY29uc3Qgb25TY3J1YiA9IChlKSA9PiB7Cgljb25zdCBvZmZzZXQgPSBlLmNsaWVudFggLSBvbGRfeAoJY29uc3QgbmV3X2luZGV4ID0gTWF0aC5taW4odmFsdWVzLmxlbmd0aC0xLCBNYXRoLm1heCgwLCAKCQlNYXRoLnJvdW5kKG9mZnNldC8xMCkgKyBvbGRfaW5kZXgKCSkpCgoJaWYobmV3X2luZGV4ICE9PSBjdXJyZW50X2luZGV4KSB7CgkJY3VycmVudF9pbmRleCA9IG5ld19pbmRleAoJCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCQllbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiKSkKCX0KfQoKY29uc3Qgb25wb2ludGVyZG93biA9IChlKSA9PiB7Cgl3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkoKQoJb2xkX3ggPSBlLmNsaWVudFgKCW9sZF9pbmRleCA9IGN1cnJlbnRfaW5kZXgKCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uU2NydWIpCn0KZWwuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBvbnBvaW50ZXJkb3duKQoKY29uc3Qgb25kYmxjbGljayA9IChlKSA9PiB7CgljdXJyZW50X2luZGV4ID0gaW5pdGlhbF9pbmRleAoJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0IikpCn0KZWwuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCBvbmRibGNsaWNrKQoKY29uc3Qgb25wb2ludGVydXAgPSAoKSA9PiB7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblNjcnViKQp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvbnBvaW50ZXJ1cCkKCmVsLm9uc2VsZWN0c3RhcnQgPSAoKSA9PiBmYWxzZQoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBvbnBvaW50ZXJkb3duKQoJZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCBvbmRibGNsaWNrKQoJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIG9ucG9pbnRlcnVwKQp9KQoKcmV0dXJuIGVsCgo8L3NjcmlwdD48L3BsLWNvbWJpbmVkX2NoaWxkPjwvcD4KPC9kaXY+CjxzY3JpcHQgaWQ9J3Nyb2txd2ppenQnPgpjb25zdCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKbGV0IGtleSA9ICJzcm9rcXdqaXp0Igpjb25zdCBpbnB1dHMgPSBkaXYucXVlcnlTZWxlY3RvckFsbChgcGwtY29tYmluZWRfY2hpbGRba2V5PScke2tleX0nXSA+ICo6Zmlyc3QtY2hpbGRgKQoKY29uc3QgdmFsdWVzID0gQXJyYXkoaW5wdXRzLmxlbmd0aCkKCmlucHV0cy5mb3JFYWNoKGFzeW5jIChlbCxpKSA9PiB7CgllbC5vbmlucHV0ID0gKGUpID0+IHsKCQllLnN0b3BQcm9wYWdhdGlvbigpCgl9Cgljb25zdCBnZW4gPSBHZW5lcmF0b3JzLmlucHV0KGVsKQoJd2hpbGUodHJ1ZSkgewoJCXZhbHVlc1tpXSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQlkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlcywKCXNldDogKG5ld3ZhbHMpID0+IHsKCQlpZighbmV3dmFscykgewoJCQlyZXR1cm4KCQl9CgkJaW5wdXRzLmZvckVhY2goKGVsLCBpKSA9PiB7CgkJCXZhbHVlc1tpXSA9IG5ld3ZhbHNbaV0KCQkJc2V0X2lucHV0X3ZhbHVlKGVsLCBuZXd2YWxzW2ldKQoJCX0pCn0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvcGwtY29tYmluZWRfY2hpbGQ+CjxoND5Eb3duPC9oND4KPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nc3J5aHBoYXRxbyc+PHNwYW4+CjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5MZWZ0OiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdzcm9rcXdqaXp0Jz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMCcgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPiwgcmlnaHQ6IDxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3Nyb2txd2ppenQnPjxzY3JpcHQgaWQ9J2F5cXRycWFrZ2pvdWF2c2QnPgovLyB3ZWlyZCBpbXBvcnQgdG8gbWFrZSBpdCBmYXN0ZXIuIFRoZSBgYXdhaXQgaW1wb3J0YCBjYW4gc3RpbGwgZGVsYXkgZXhlY3V0aW9uIGJ5IG9uZSBmcmFtZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4uLgp3aW5kb3cuZDNmb3JtYXQgPSB3aW5kb3cuZDNmb3JtYXQgPz8gYXdhaXQgaW1wb3J0KCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2QzLWZvcm1hdEAyLytlc20iKQoKY29uc3QgYXJnbWluID0geHMgPT4geHMuaW5kZXhPZihNYXRoLm1pbiguLi54cykpCmNvbnN0IGNsb3Nlc3RfaW5kZXggPSAoeHMsIHkpID0+IGFyZ21pbih4cy5tYXAoeCA9PiBNYXRoLmFicyh4LXkpKSkKCmNvbnN0IHZhbHVlcyA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0KCmNvbnN0IGVsID0gaHRtbGAKPHNwYW4gdGl0bGU9IkNsaWNrIGFuZCBkcmFnIHRoaXMgbnVtYmVyIGxlZnQgb3IgcmlnaHQhIiBzdHlsZT0iY3Vyc29yOiBjb2wtcmVzaXplOwp0b3VjaC1hY3Rpb246IG5vbmU7CmJhY2tncm91bmQ6IHJnYigyNTIsIDIwOSwgMjA0KTsKcGFkZGluZzogMGVtIC4yZW07CmJvcmRlci1yYWRpdXM6IC4zZW07CmZvbnQtd2VpZ2h0OiBib2xkOyI+NTwvc3Bhbj4KYAoKCgpsZXQgb2xkX3ggPSAwCmxldCBvbGRfaW5kZXggPSAwCmNvbnN0IGluaXRpYWxfaW5kZXggPSBjbG9zZXN0X2luZGV4KHZhbHVlcywgNSkKbGV0IGN1cnJlbnRfaW5kZXggPSBpbml0aWFsX2luZGV4Cgpjb25zdCBmb3JtYXR0ZXIgPSBzID0+ICIiICsgZDNmb3JtYXQuZm9ybWF0KCIiKShzKSArICIiCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlc1tjdXJyZW50X2luZGV4XSwKCXNldDogeCA9PiB7CgkJY3VycmVudF9pbmRleCA9IGNsb3Nlc3RfaW5kZXgodmFsdWVzLCB4KQoJCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCX0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoKLy8gaW5pdGlhbCB2YWx1ZQplbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoNSkKCmNvbnN0IG9uU2NydWIgPSAoZSkgPT4gewoJY29uc3Qgb2Zmc2V0ID0gZS5jbGllbnRYIC0gb2xkX3gKCWNvbnN0IG5ld19pbmRleCA9IE1hdGgubWluKHZhbHVlcy5sZW5ndGgtMSwgTWF0aC5tYXgoMCwgCgkJTWF0aC5yb3VuZChvZmZzZXQvMTApICsgb2xkX2luZGV4CgkpKQoKCWlmKG5ld19pbmRleCAhPT0gY3VycmVudF9pbmRleCkgewoJCWN1cnJlbnRfaW5kZXggPSBuZXdfaW5kZXgKCQllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgkJZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0IikpCgl9Cn0KCmNvbnN0IG9ucG9pbnRlcmRvd24gPSAoZSkgPT4gewoJd2luZG93LmdldFNlbGVjdGlvbigpLmVtcHR5KCkKCW9sZF94ID0gZS5jbGllbnRYCglvbGRfaW5kZXggPSBjdXJyZW50X2luZGV4Cgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblNjcnViKQp9CmVsLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25wb2ludGVyZG93bikKCmNvbnN0IG9uZGJsY2xpY2sgPSAoZSkgPT4gewoJY3VycmVudF9pbmRleCA9IGluaXRpYWxfaW5kZXgKCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCWVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIpKQp9CmVsLmFkZEV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgb25kYmxjbGljaykKCmNvbnN0IG9ucG9pbnRlcnVwID0gKCkgPT4gewoJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25TY3J1YikKfQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25wb2ludGVydXApCgplbC5vbnNlbGVjdHN0YXJ0ID0gKCkgPT4gZmFsc2UKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25wb2ludGVyZG93bikKCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgb25kYmxjbGljaykKCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvbnBvaW50ZXJ1cCkKfSkKCnJldHVybiBlbAoKPC9zY3JpcHQ+PC9wbC1jb21iaW5lZF9jaGlsZD48L3A+CjwvZGl2Pgo8c2NyaXB0IGlkPSdzcm9rcXdqaXp0Jz4KY29uc3QgZGl2ID0gY3VycmVudFNjcmlwdC5wYXJlbnRFbGVtZW50CmxldCBrZXkgPSAic3Jva3F3aml6dCIKY29uc3QgaW5wdXRzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoYHBsLWNvbWJpbmVkX2NoaWxkW2tleT0nJHtrZXl9J10gPiAqOmZpcnN0LWNoaWxkYCkKCmNvbnN0IHZhbHVlcyA9IEFycmF5KGlucHV0cy5sZW5ndGgpCgppbnB1dHMuZm9yRWFjaChhc3luYyAoZWwsaSkgPT4gewoJZWwub25pbnB1dCA9IChlKSA9PiB7CgkJZS5zdG9wUHJvcGFnYXRpb24oKQoJfQoJY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChlbCkKCXdoaWxlKHRydWUpIHsKCQl2YWx1ZXNbaV0gPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCgkJZGl2LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHt9KSkKCX0KfSkKCgpsZXQgc2V0X2lucHV0X3ZhbHVlID0gKCgpID0+IHsKCWxldCByZXN1bHQgPSBudWxsCgl0cnkgewoJcmVzdWx0ID0gc2V0Qm91bmRFbGVtZW50VmFsdWVMaWtlUGx1dG8KfSBjYXRjaCAoZSkgewoJcmVzdWx0ID0gKChpbnB1dCwgbmV3X3ZhbHVlKSA9PiB7CgkvLyBmYWxsYmFjayBpbiBjYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb25zcC9QbHV0by5qbC9wdWxsLzE3NTUgaXMgbm90IGF2YWlsYWJsZQogICAgaWYgKG5ld192YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgICAgICByZXR1cm4KICAgIH0KICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHsKICAgICAgICBzd2l0Y2ggKGlucHV0LnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAicmFuZ2UiOgogICAgICAgICAgICBjYXNlICJudW1iZXIiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc051bWJlciAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc051bWJlciA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzRGF0ZSA9PSBudWxsIHx8IE51bWJlcihpbnB1dC52YWx1ZUFzRGF0ZSkgIT09IE51bWJlcihuZXdfdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc0RhdGUgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImNoZWNrYm94IjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImZpbGUiOiB7CiAgICAgICAgICAgICAgICAvLyBDYW4ndCBzZXQgZmlsZXMgOigKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGlucHV0Lm11bHRpcGxlKSB7CiAgICAgICAgZm9yIChsZXQgb3B0aW9uIG9mIEFycmF5LmZyb20oaW5wdXQub3B0aW9ucykpIHsKICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbmV3X3ZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICAvL0B0cy1pZ25vcmUKICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgIH0KfSkKfQpyZXR1cm4gcmVzdWx0Cn0pKCkKCgkKT2JqZWN0LmRlZmluZVByb3BlcnR5KGRpdiwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiB2YWx1ZXMsCglzZXQ6IChuZXd2YWxzKSA9PiB7CgkJaWYoIW5ld3ZhbHMpIHsKCQkJcmV0dXJuCgkJfQoJCWlucHV0cy5mb3JFYWNoKChlbCwgaSkgPT4gewoJCQl2YWx1ZXNbaV0gPSBuZXd2YWxzW2ldCgkJCXNldF9pbnB1dF92YWx1ZShlbCwgbmV3dmFsc1tpXSkKCQl9KQp9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCQo8L3NjcmlwdD4KPC9zcGFuPgo8L3BsLWNvbWJpbmVkX2NoaWxkPgo8L2Rpdj4KPHNjcmlwdCBpZD0nc3J5aHBoYXRxbyc+CmNvbnN0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudApsZXQga2V5ID0gInNyeWhwaGF0cW8iCmNvbnN0IGlucHV0cyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKGBwbC1jb21iaW5lZF9jaGlsZFtrZXk9JyR7a2V5fSddID4gKjpmaXJzdC1jaGlsZGApCgpjb25zdCB2YWx1ZXMgPSBBcnJheShpbnB1dHMubGVuZ3RoKQoKaW5wdXRzLmZvckVhY2goYXN5bmMgKGVsLGkpID0+IHsKCWVsLm9uaW5wdXQgPSAoZSkgPT4gewoJCWUuc3RvcFByb3BhZ2F0aW9uKCkKCX0KCWNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoZWwpCgl3aGlsZSh0cnVlKSB7CgkJdmFsdWVzW2ldID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pCgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gdmFsdWVzLAoJc2V0OiAobmV3dmFscykgPT4gewoJCWlmKCFuZXd2YWxzKSB7CgkJCXJldHVybgoJCX0KCQlpbnB1dHMuZm9yRWFjaCgoZWwsIGkpID0+IHsKCQkJdmFsdWVzW2ldID0gbmV3dmFsc1tpXQoJCQlzZXRfaW5wdXRfdmFsdWUoZWwsIG5ld3ZhbHNbaV0pCgkJfSkKfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KPC9ib25kPrBwZXJzaXN0X2pzX3N0YXRlw6RtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4gIe/Ou3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZbRAc2tpcF9hc19zY3JpcHQgY2IyYqdjZWxsX2lk2SQ4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjC5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4B3bYbtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJGM3YTMyYWIyLTJhNWItNDg1Yi05Nzk1LTRhNzQzNjA0ZGU4MoimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnaLWw8Ym9uZCBkZWY9Indvd3oiPjxzcGFuPgo8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHA+RG8gYSB0aGluZzogPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nc3J5aHBoYXRxbyc+PGlucHV0IHR5cGU9ImNoZWNrYm94Ij48L3BsLWNvbWJpbmVkX2NoaWxkPjwvcD4KPGg0PlVwPC9oND4KPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nc3J5aHBoYXRxbyc+PHNwYW4+CjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cD5MZWZ0OiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdzcm9rcXdqaXp0Jz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMCcgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPiwgcmlnaHQ6IDxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3Nyb2txd2ppenQnPjxzY3JpcHQgaWQ9J2F5cXRycWFrZ2pvdWF2c2QnPgovLyB3ZWlyZCBpbXBvcnQgdG8gbWFrZSBpdCBmYXN0ZXIuIFRoZSBgYXdhaXQgaW1wb3J0YCBjYW4gc3RpbGwgZGVsYXkgZXhlY3V0aW9uIGJ5IG9uZSBmcmFtZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4uLgp3aW5kb3cuZDNmb3JtYXQgPSB3aW5kb3cuZDNmb3JtYXQgPz8gYXdhaXQgaW1wb3J0KCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2QzLWZvcm1hdEAyLytlc20iKQoKY29uc3QgYXJnbWluID0geHMgPT4geHMuaW5kZXhPZihNYXRoLm1pbiguLi54cykpCmNvbnN0IGNsb3Nlc3RfaW5kZXggPSAoeHMsIHkpID0+IGFyZ21pbih4cy5tYXAoeCA9PiBNYXRoLmFicyh4LXkpKSkKCmNvbnN0IHZhbHVlcyA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0KCmNvbnN0IGVsID0gaHRtbGAKPHNwYW4gdGl0bGU9IkNsaWNrIGFuZCBkcmFnIHRoaXMgbnVtYmVyIGxlZnQgb3IgcmlnaHQhIiBzdHlsZT0iY3Vyc29yOiBjb2wtcmVzaXplOwp0b3VjaC1hY3Rpb246IG5vbmU7CmJhY2tncm91bmQ6IHJnYigyNTIsIDIwOSwgMjA0KTsKcGFkZGluZzogMGVtIC4yZW07CmJvcmRlci1yYWRpdXM6IC4zZW07CmZvbnQtd2VpZ2h0OiBib2xkOyI+NTwvc3Bhbj4KYAoKCgpsZXQgb2xkX3ggPSAwCmxldCBvbGRfaW5kZXggPSAwCmNvbnN0IGluaXRpYWxfaW5kZXggPSBjbG9zZXN0X2luZGV4KHZhbHVlcywgNSkKbGV0IGN1cnJlbnRfaW5kZXggPSBpbml0aWFsX2luZGV4Cgpjb25zdCBmb3JtYXR0ZXIgPSBzID0+ICIiICsgZDNmb3JtYXQuZm9ybWF0KCIiKShzKSArICIiCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlc1tjdXJyZW50X2luZGV4XSwKCXNldDogeCA9PiB7CgkJY3VycmVudF9pbmRleCA9IGNsb3Nlc3RfaW5kZXgodmFsdWVzLCB4KQoJCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCX0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoKLy8gaW5pdGlhbCB2YWx1ZQplbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoNSkKCmNvbnN0IG9uU2NydWIgPSAoZSkgPT4gewoJY29uc3Qgb2Zmc2V0ID0gZS5jbGllbnRYIC0gb2xkX3gKCWNvbnN0IG5ld19pbmRleCA9IE1hdGgubWluKHZhbHVlcy5sZW5ndGgtMSwgTWF0aC5tYXgoMCwgCgkJTWF0aC5yb3VuZChvZmZzZXQvMTApICsgb2xkX2luZGV4CgkpKQoKCWlmKG5ld19pbmRleCAhPT0gY3VycmVudF9pbmRleCkgewoJCWN1cnJlbnRfaW5kZXggPSBuZXdfaW5kZXgKCQllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgkJZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0IikpCgl9Cn0KCmNvbnN0IG9ucG9pbnRlcmRvd24gPSAoZSkgPT4gewoJd2luZG93LmdldFNlbGVjdGlvbigpLmVtcHR5KCkKCW9sZF94ID0gZS5jbGllbnRYCglvbGRfaW5kZXggPSBjdXJyZW50X2luZGV4Cgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblNjcnViKQp9CmVsLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25wb2ludGVyZG93bikKCmNvbnN0IG9uZGJsY2xpY2sgPSAoZSkgPT4gewoJY3VycmVudF9pbmRleCA9IGluaXRpYWxfaW5kZXgKCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCWVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIpKQp9CmVsLmFkZEV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgb25kYmxjbGljaykKCmNvbnN0IG9ucG9pbnRlcnVwID0gKCkgPT4gewoJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25TY3J1YikKfQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25wb2ludGVydXApCgplbC5vbnNlbGVjdHN0YXJ0ID0gKCkgPT4gZmFsc2UKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25wb2ludGVyZG93bikKCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgb25kYmxjbGljaykKCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvbnBvaW50ZXJ1cCkKfSkKCnJldHVybiBlbAoKPC9zY3JpcHQ+PC9wbC1jb21iaW5lZF9jaGlsZD48L3A+CjwvZGl2Pgo8c2NyaXB0IGlkPSdzcm9rcXdqaXp0Jz4KY29uc3QgZGl2ID0gY3VycmVudFNjcmlwdC5wYXJlbnRFbGVtZW50CmxldCBrZXkgPSAic3Jva3F3aml6dCIKY29uc3QgaW5wdXRzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoYHBsLWNvbWJpbmVkX2NoaWxkW2tleT0nJHtrZXl9J10gPiAqOmZpcnN0LWNoaWxkYCkKCmNvbnN0IHZhbHVlcyA9IEFycmF5KGlucHV0cy5sZW5ndGgpCgppbnB1dHMuZm9yRWFjaChhc3luYyAoZWwsaSkgPT4gewoJZWwub25pbnB1dCA9IChlKSA9PiB7CgkJZS5zdG9wUHJvcGFnYXRpb24oKQoJfQoJY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChlbCkKCXdoaWxlKHRydWUpIHsKCQl2YWx1ZXNbaV0gPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCgkJZGl2LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHt9KSkKCX0KfSkKCgpsZXQgc2V0X2lucHV0X3ZhbHVlID0gKCgpID0+IHsKCWxldCByZXN1bHQgPSBudWxsCgl0cnkgewoJcmVzdWx0ID0gc2V0Qm91bmRFbGVtZW50VmFsdWVMaWtlUGx1dG8KfSBjYXRjaCAoZSkgewoJcmVzdWx0ID0gKChpbnB1dCwgbmV3X3ZhbHVlKSA9PiB7CgkvLyBmYWxsYmFjayBpbiBjYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb25zcC9QbHV0by5qbC9wdWxsLzE3NTUgaXMgbm90IGF2YWlsYWJsZQogICAgaWYgKG5ld192YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgICAgICByZXR1cm4KICAgIH0KICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHsKICAgICAgICBzd2l0Y2ggKGlucHV0LnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAicmFuZ2UiOgogICAgICAgICAgICBjYXNlICJudW1iZXIiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc051bWJlciAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc051bWJlciA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzRGF0ZSA9PSBudWxsIHx8IE51bWJlcihpbnB1dC52YWx1ZUFzRGF0ZSkgIT09IE51bWJlcihuZXdfdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc0RhdGUgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImNoZWNrYm94IjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImZpbGUiOiB7CiAgICAgICAgICAgICAgICAvLyBDYW4ndCBzZXQgZmlsZXMgOigKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGlucHV0Lm11bHRpcGxlKSB7CiAgICAgICAgZm9yIChsZXQgb3B0aW9uIG9mIEFycmF5LmZyb20oaW5wdXQub3B0aW9ucykpIHsKICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbmV3X3ZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICAvL0B0cy1pZ25vcmUKICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgIH0KfSkKfQpyZXR1cm4gcmVzdWx0Cn0pKCkKCgkKT2JqZWN0LmRlZmluZVByb3BlcnR5KGRpdiwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiB2YWx1ZXMsCglzZXQ6IChuZXd2YWxzKSA9PiB7CgkJaWYoIW5ld3ZhbHMpIHsKCQkJcmV0dXJuCgkJfQoJCWlucHV0cy5mb3JFYWNoKChlbCwgaSkgPT4gewoJCQl2YWx1ZXNbaV0gPSBuZXd2YWxzW2ldCgkJCXNldF9pbnB1dF92YWx1ZShlbCwgbmV3dmFsc1tpXSkKCQl9KQp9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCQo8L3NjcmlwdD4KPC9zcGFuPgo8L3BsLWNvbWJpbmVkX2NoaWxkPgo8aDQ+RG93bjwvaDQ+CjxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3NyeWhwaGF0cW8nPjxzcGFuPgo8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHA+TGVmdDogPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nc3Jva3F3aml6dCc+PGlucHV0IAp0eXBlPSJyYW5nZSIgCm1pbj0xIG1heD0nMTAnIHZhbHVlPScxJwo+CgoKPC9wbC1jb21iaW5lZF9jaGlsZD4sIHJpZ2h0OiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdzcm9rcXdqaXp0Jz48c2NyaXB0IGlkPSdheXF0cnFha2dqb3VhdnNkJz4KLy8gd2VpcmQgaW1wb3J0IHRvIG1ha2UgaXQgZmFzdGVyLiBUaGUgYGF3YWl0IGltcG9ydGAgY2FuIHN0aWxsIGRlbGF5IGV4ZWN1dGlvbiBieSBvbmUgZnJhbWUgaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuLi4Kd2luZG93LmQzZm9ybWF0ID0gd2luZG93LmQzZm9ybWF0ID8/IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9kMy1mb3JtYXRAMi8rZXNtIikKCmNvbnN0IGFyZ21pbiA9IHhzID0+IHhzLmluZGV4T2YoTWF0aC5taW4oLi4ueHMpKQpjb25zdCBjbG9zZXN0X2luZGV4ID0gKHhzLCB5KSA9PiBhcmdtaW4oeHMubWFwKHggPT4gTWF0aC5hYnMoeC15KSkpCgpjb25zdCB2YWx1ZXMgPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdCgpjb25zdCBlbCA9IGh0bWxgCjxzcGFuIHRpdGxlPSJDbGljayBhbmQgZHJhZyB0aGlzIG51bWJlciBsZWZ0IG9yIHJpZ2h0ISIgc3R5bGU9ImN1cnNvcjogY29sLXJlc2l6ZTsKdG91Y2gtYWN0aW9uOiBub25lOwpiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyMDksIDIwNCk7CnBhZGRpbmc6IDBlbSAuMmVtOwpib3JkZXItcmFkaXVzOiAuM2VtOwpmb250LXdlaWdodDogYm9sZDsiPjU8L3NwYW4+CmAKCgoKbGV0IG9sZF94ID0gMApsZXQgb2xkX2luZGV4ID0gMApjb25zdCBpbml0aWFsX2luZGV4ID0gY2xvc2VzdF9pbmRleCh2YWx1ZXMsIDUpCmxldCBjdXJyZW50X2luZGV4ID0gaW5pdGlhbF9pbmRleAoKY29uc3QgZm9ybWF0dGVyID0gcyA9PiAiIiArIGQzZm9ybWF0LmZvcm1hdCgiIikocykgKyAiIgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiB2YWx1ZXNbY3VycmVudF9pbmRleF0sCglzZXQ6IHggPT4gewoJCWN1cnJlbnRfaW5kZXggPSBjbG9zZXN0X2luZGV4KHZhbHVlcywgeCkKCQllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgl9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCi8vIGluaXRpYWwgdmFsdWUKZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKDUpCgpjb25zdCBvblNjcnViID0gKGUpID0+IHsKCWNvbnN0IG9mZnNldCA9IGUuY2xpZW50WCAtIG9sZF94Cgljb25zdCBuZXdfaW5kZXggPSBNYXRoLm1pbih2YWx1ZXMubGVuZ3RoLTEsIE1hdGgubWF4KDAsIAoJCU1hdGgucm91bmQob2Zmc2V0LzEwKSArIG9sZF9pbmRleAoJKSkKCglpZihuZXdfaW5kZXggIT09IGN1cnJlbnRfaW5kZXgpIHsKCQljdXJyZW50X2luZGV4ID0gbmV3X2luZGV4CgkJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJCWVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIpKQoJfQp9Cgpjb25zdCBvbnBvaW50ZXJkb3duID0gKGUpID0+IHsKCXdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSgpCglvbGRfeCA9IGUuY2xpZW50WAoJb2xkX2luZGV4ID0gY3VycmVudF9pbmRleAoJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25TY3J1YikKfQplbC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9ucG9pbnRlcmRvd24pCgpjb25zdCBvbmRibGNsaWNrID0gKGUpID0+IHsKCWN1cnJlbnRfaW5kZXggPSBpbml0aWFsX2luZGV4CgllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgllbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiKSkKfQplbC5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIG9uZGJsY2xpY2spCgpjb25zdCBvbnBvaW50ZXJ1cCA9ICgpID0+IHsKCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uU2NydWIpCn0Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIG9ucG9pbnRlcnVwKQoKZWwub25zZWxlY3RzdGFydCA9ICgpID0+IGZhbHNlCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgllbC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9ucG9pbnRlcmRvd24pCgllbC5yZW1vdmVFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIG9uZGJsY2xpY2spCgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25wb2ludGVydXApCn0pCgpyZXR1cm4gZWwKCjwvc2NyaXB0PjwvcGwtY29tYmluZWRfY2hpbGQ+PC9wPgo8L2Rpdj4KPHNjcmlwdCBpZD0nc3Jva3F3aml6dCc+CmNvbnN0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudApsZXQga2V5ID0gInNyb2txd2ppenQiCmNvbnN0IGlucHV0cyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKGBwbC1jb21iaW5lZF9jaGlsZFtrZXk9JyR7a2V5fSddID4gKjpmaXJzdC1jaGlsZGApCgpjb25zdCB2YWx1ZXMgPSBBcnJheShpbnB1dHMubGVuZ3RoKQoKaW5wdXRzLmZvckVhY2goYXN5bmMgKGVsLGkpID0+IHsKCWVsLm9uaW5wdXQgPSAoZSkgPT4gewoJCWUuc3RvcFByb3BhZ2F0aW9uKCkKCX0KCWNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoZWwpCgl3aGlsZSh0cnVlKSB7CgkJdmFsdWVzW2ldID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pCgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gdmFsdWVzLAoJc2V0OiAobmV3dmFscykgPT4gewoJCWlmKCFuZXd2YWxzKSB7CgkJCXJldHVybgoJCX0KCQlpbnB1dHMuZm9yRWFjaCgoZWwsIGkpID0+IHsKCQkJdmFsdWVzW2ldID0gbmV3dmFsc1tpXQoJCQlzZXRfaW5wdXRfdmFsdWUoZWwsIG5ld3ZhbHNbaV0pCgkJfSkKfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KPC9wbC1jb21iaW5lZF9jaGlsZD4KPC9kaXY+CjxzY3JpcHQgaWQ9J3NyeWhwaGF0cW8nPgpjb25zdCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKbGV0IGtleSA9ICJzcnlocGhhdHFvIgpjb25zdCBpbnB1dHMgPSBkaXYucXVlcnlTZWxlY3RvckFsbChgcGwtY29tYmluZWRfY2hpbGRba2V5PScke2tleX0nXSA+ICo6Zmlyc3QtY2hpbGRgKQoKY29uc3QgdmFsdWVzID0gQXJyYXkoaW5wdXRzLmxlbmd0aCkKCmlucHV0cy5mb3JFYWNoKGFzeW5jIChlbCxpKSA9PiB7CgllbC5vbmlucHV0ID0gKGUpID0+IHsKCQllLnN0b3BQcm9wYWdhdGlvbigpCgl9Cgljb25zdCBnZW4gPSBHZW5lcmF0b3JzLmlucHV0KGVsKQoJd2hpbGUodHJ1ZSkgewoJCXZhbHVlc1tpXSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQlkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlcywKCXNldDogKG5ld3ZhbHMpID0+IHsKCQlpZighbmV3dmFscykgewoJCQlyZXR1cm4KCQl9CgkJaW5wdXRzLmZvckVhY2goKGVsLCBpKSA9PiB7CgkJCXZhbHVlc1tpXSA9IG5ld3ZhbHNbaV0KCQkJc2V0X2lucHV0X3ZhbHVlKGVsLCBuZXd2YWxzW2ldKQoJCX0pCn0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvYm9uZD6wcGVyc2lzdF9qc19zdGF0ZcOkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOICHyPdt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJGM3YTMyYWIyLTJhNWItNDg1Yi05Nzk1LTRhNzQzNjA0ZGU4MrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lKbVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjeIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5oLBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqnRleHQvcGxhaW6ybGFzdF9ydW5fdGltZXN0YW1wy0HYbOCdoQzyt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgBfNBK1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkMzM5NmE1YmEtNTMzZS00ZTBkLWFiNGYtYzYzMzQ1OWJkODFhiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedoR0jxzcGFuPgo8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHA+TGVmdDogPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nc3Jva3F3aml6dCc+PGlucHV0IAp0eXBlPSJyYW5nZSIgCm1pbj0xIG1heD0nMTAnIHZhbHVlPScxJwo+CgoKPC9wbC1jb21iaW5lZF9jaGlsZD4sIHJpZ2h0OiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdzcm9rcXdqaXp0Jz48c2NyaXB0IGlkPSdheXF0cnFha2dqb3VhdnNkJz4KLy8gd2VpcmQgaW1wb3J0IHRvIG1ha2UgaXQgZmFzdGVyLiBUaGUgYGF3YWl0IGltcG9ydGAgY2FuIHN0aWxsIGRlbGF5IGV4ZWN1dGlvbiBieSBvbmUgZnJhbWUgaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuLi4Kd2luZG93LmQzZm9ybWF0ID0gd2luZG93LmQzZm9ybWF0ID8/IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9kMy1mb3JtYXRAMi8rZXNtIikKCmNvbnN0IGFyZ21pbiA9IHhzID0+IHhzLmluZGV4T2YoTWF0aC5taW4oLi4ueHMpKQpjb25zdCBjbG9zZXN0X2luZGV4ID0gKHhzLCB5KSA9PiBhcmdtaW4oeHMubWFwKHggPT4gTWF0aC5hYnMoeC15KSkpCgpjb25zdCB2YWx1ZXMgPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdCgpjb25zdCBlbCA9IGh0bWxgCjxzcGFuIHRpdGxlPSJDbGljayBhbmQgZHJhZyB0aGlzIG51bWJlciBsZWZ0IG9yIHJpZ2h0ISIgc3R5bGU9ImN1cnNvcjogY29sLXJlc2l6ZTsKdG91Y2gtYWN0aW9uOiBub25lOwpiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyMDksIDIwNCk7CnBhZGRpbmc6IDBlbSAuMmVtOwpib3JkZXItcmFkaXVzOiAuM2VtOwpmb250LXdlaWdodDogYm9sZDsiPjU8L3NwYW4+CmAKCgoKbGV0IG9sZF94ID0gMApsZXQgb2xkX2luZGV4ID0gMApjb25zdCBpbml0aWFsX2luZGV4ID0gY2xvc2VzdF9pbmRleCh2YWx1ZXMsIDUpCmxldCBjdXJyZW50X2luZGV4ID0gaW5pdGlhbF9pbmRleAoKY29uc3QgZm9ybWF0dGVyID0gcyA9PiAiIiArIGQzZm9ybWF0LmZvcm1hdCgiIikocykgKyAiIgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiB2YWx1ZXNbY3VycmVudF9pbmRleF0sCglzZXQ6IHggPT4gewoJCWN1cnJlbnRfaW5kZXggPSBjbG9zZXN0X2luZGV4KHZhbHVlcywgeCkKCQllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgl9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCi8vIGluaXRpYWwgdmFsdWUKZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKDUpCgpjb25zdCBvblNjcnViID0gKGUpID0+IHsKCWNvbnN0IG9mZnNldCA9IGUuY2xpZW50WCAtIG9sZF94Cgljb25zdCBuZXdfaW5kZXggPSBNYXRoLm1pbih2YWx1ZXMubGVuZ3RoLTEsIE1hdGgubWF4KDAsIAoJCU1hdGgucm91bmQob2Zmc2V0LzEwKSArIG9sZF9pbmRleAoJKSkKCglpZihuZXdfaW5kZXggIT09IGN1cnJlbnRfaW5kZXgpIHsKCQljdXJyZW50X2luZGV4ID0gbmV3X2luZGV4CgkJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJCWVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIpKQoJfQp9Cgpjb25zdCBvbnBvaW50ZXJkb3duID0gKGUpID0+IHsKCXdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSgpCglvbGRfeCA9IGUuY2xpZW50WAoJb2xkX2luZGV4ID0gY3VycmVudF9pbmRleAoJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25TY3J1YikKfQplbC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9ucG9pbnRlcmRvd24pCgpjb25zdCBvbmRibGNsaWNrID0gKGUpID0+IHsKCWN1cnJlbnRfaW5kZXggPSBpbml0aWFsX2luZGV4CgllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgllbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiKSkKfQplbC5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIG9uZGJsY2xpY2spCgpjb25zdCBvbnBvaW50ZXJ1cCA9ICgpID0+IHsKCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uU2NydWIpCn0Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIG9ucG9pbnRlcnVwKQoKZWwub25zZWxlY3RzdGFydCA9ICgpID0+IGZhbHNlCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgllbC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9ucG9pbnRlcmRvd24pCgllbC5yZW1vdmVFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIG9uZGJsY2xpY2spCgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25wb2ludGVydXApCn0pCgpyZXR1cm4gZWwKCjwvc2NyaXB0PjwvcGwtY29tYmluZWRfY2hpbGQ+PC9wPgo8L2Rpdj4KPHNjcmlwdCBpZD0nc3Jva3F3aml6dCc+CmNvbnN0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudApsZXQga2V5ID0gInNyb2txd2ppenQiCmNvbnN0IGlucHV0cyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKGBwbC1jb21iaW5lZF9jaGlsZFtrZXk9JyR7a2V5fSddID4gKjpmaXJzdC1jaGlsZGApCgpjb25zdCB2YWx1ZXMgPSBBcnJheShpbnB1dHMubGVuZ3RoKQoKaW5wdXRzLmZvckVhY2goYXN5bmMgKGVsLGkpID0+IHsKCWVsLm9uaW5wdXQgPSAoZSkgPT4gewoJCWUuc3RvcFByb3BhZ2F0aW9uKCkKCX0KCWNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoZWwpCgl3aGlsZSh0cnVlKSB7CgkJdmFsdWVzW2ldID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pCgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gdmFsdWVzLAoJc2V0OiAobmV3dmFscykgPT4gewoJCWlmKCFuZXd2YWxzKSB7CgkJCXJldHVybgoJCX0KCQlpbnB1dHMuZm9yRWFjaCgoZWwsIGkpID0+IHsKCQkJdmFsdWVzW2ldID0gbmV3dmFsc1tpXQoJCQlzZXRfaW5wdXRfdmFsdWUoZWwsIG5ld3ZhbHNbaV0pCgkJfSkKfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KsHBlcnNpc3RfanNfc3RhdGXDpG1pbWWpdGV4dC9odG1ssmxhc3RfcnVuX3RpbWVzdGFtcMtB2GziAhzQeLdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVls0Bza2lwX2FzX3NjcmlwdCBjYjGnY2VsbF9pZNkkMzM5NmE1YmEtNTMzZS00ZTBkLWFiNGYtYzYzMzQ1OWJkODFhuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAgmqELVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQ5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjGIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52SVAb25seV9hc19zY3JpcHQgKG1hY3JvIHdpdGggMSBtZXRob2QpsHBlcnNpc3RfanNfc3RhdGXCpG1pbWWqdGV4dC9wbGFpbrJsYXN0X3J1bl90aW1lc3RhbXDLQdhs3/xSwsK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkOWU1NmRiYjktMmU5My00MTM2LWIxMGItN2IxZWNiMDdlNmYxuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAASex7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGOIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5oLBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqnRleHQvcGxhaW6ybGFzdF9ydW5fdGltZXN0YW1wy0HYbN/7Ih99t2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwY7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgBPCWa1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkOTU3ODU4ZjgtNGFjZS00Y2FlLWJiMTYtNDk1NjlkYWE5ODY5iKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9keYWmcHJlZml4u0h5cGVydGV4dExpdGVyYWwuSmF2YVNjcmlwdKhlbGVtZW50c5GSp2NvbnRlbnSS2WYiKCgpID0+IHtcblx0bGV0IHJlc3VsdCA9IG51bGxcblx0dHJ5IHsiIOKLryAxNDIwIGJ5dGVzIOKLryAibHVlXG4gICAgfVxufSlcbn1cbnJldHVybiByZXN1bHRcbn0pKClcbiKqdGV4dC9wbGFpbqR0eXBlpnN0cnVjdKxwcmVmaXhfc2hvcnSqSmF2YVNjcmlwdKhvYmplY3RpZLBiMzEzNDg3MzI2MWJhNDUxsHBlcnNpc3RfanNfc3RhdGXCpG1pbWXZIWFwcGxpY2F0aW9uL3ZuZC5wbHV0by50cmVlK29iamVjdLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs3/xsjwS3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZbxjb25zdCBzZXRfaW5wdXRfdmFsdWVfY29tcGF0p2NlbGxfaWTZJDk1Nzg1OGY4LTRhY2UtNGNhZS1iYjE2LTQ5NTY5ZGFhOTg2OblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgASeFu1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkODgxYjc1ZDMtY2ViZS00YTUzLThjZjUtYmVhZWVkZGFmZDM1iKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedkvc2tpcF9hc19zY3JpcHQgKGdlbmVyaWMgZnVuY3Rpb24gd2l0aCAxIG1ldGhvZCmwcGVyc2lzdF9qc19zdGF0ZcKkbWltZap0ZXh0L3BsYWlusmxhc3RfcnVuX3RpbWVzdGFtcMtB2Gzf+1d/7bdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQ4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzW5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ABb6KtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDgwMWZiMDIxLTczYTAtNDExNC1hMzZhLTMyOGU4NGYwMGI1MYimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnaCro8Ym9uZCBkZWY9InNwZWVkcyI+PHNwYW4+CjxoMz5XaW5kIHNwZWVkczwvaDM+Cjx1bD4KPGxpPk5vcnRoOiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSd3d2R4bXh0eHFvJz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMDAnIHZhbHVlPScxJwo+CgoKPC9wbC1jb21iaW5lZF9jaGlsZD48bGk+RWFzdDogPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nd3dkeG14dHhxbyc+PGlucHV0IAp0eXBlPSJyYW5nZSIgCm1pbj0xIG1heD0nMTAwJyB2YWx1ZT0nMScKPgoKCjwvcGwtY29tYmluZWRfY2hpbGQ+PGxpPlNvdXRoOiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSd3d2R4bXh0eHFvJz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMDAnIHZhbHVlPScxJwo+CgoKPC9wbC1jb21iaW5lZF9jaGlsZD48bGk+V2VzdDogPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nd3dkeG14dHhxbyc+PGlucHV0IAp0eXBlPSJyYW5nZSIgCm1pbj0xIG1heD0nMTAwJyB2YWx1ZT0nMScKPgoKCjwvcGwtY29tYmluZWRfY2hpbGQ+CjwvdWw+Cgo8c2NyaXB0IGlkPSd3d2R4bXh0eHFvJz4KY29uc3QgZGl2ID0gY3VycmVudFNjcmlwdC5wYXJlbnRFbGVtZW50CmxldCBrZXkgPSAid3dkeG14dHhxbyIKY29uc3QgaW5wdXRzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoYHBsLWNvbWJpbmVkX2NoaWxkW2tleT0nJHtrZXl9J10gPiAqOmZpcnN0LWNoaWxkYCkKCmNvbnN0IHZhbHVlcyA9IEFycmF5KGlucHV0cy5sZW5ndGgpCgppbnB1dHMuZm9yRWFjaChhc3luYyAoZWwsaSkgPT4gewoJZWwub25pbnB1dCA9IChlKSA9PiB7CgkJZS5zdG9wUHJvcGFnYXRpb24oKQoJfQoJY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChlbCkKCXdoaWxlKHRydWUpIHsKCQl2YWx1ZXNbaV0gPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCgkJZGl2LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHt9KSkKCX0KfSkKCgpsZXQgc2V0X2lucHV0X3ZhbHVlID0gKCgpID0+IHsKCWxldCByZXN1bHQgPSBudWxsCgl0cnkgewoJcmVzdWx0ID0gc2V0Qm91bmRFbGVtZW50VmFsdWVMaWtlUGx1dG8KfSBjYXRjaCAoZSkgewoJcmVzdWx0ID0gKChpbnB1dCwgbmV3X3ZhbHVlKSA9PiB7CgkvLyBmYWxsYmFjayBpbiBjYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb25zcC9QbHV0by5qbC9wdWxsLzE3NTUgaXMgbm90IGF2YWlsYWJsZQogICAgaWYgKG5ld192YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgICAgICByZXR1cm4KICAgIH0KICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHsKICAgICAgICBzd2l0Y2ggKGlucHV0LnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAicmFuZ2UiOgogICAgICAgICAgICBjYXNlICJudW1iZXIiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc051bWJlciAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc051bWJlciA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzRGF0ZSA9PSBudWxsIHx8IE51bWJlcihpbnB1dC52YWx1ZUFzRGF0ZSkgIT09IE51bWJlcihuZXdfdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc0RhdGUgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImNoZWNrYm94IjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImZpbGUiOiB7CiAgICAgICAgICAgICAgICAvLyBDYW4ndCBzZXQgZmlsZXMgOigKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGlucHV0Lm11bHRpcGxlKSB7CiAgICAgICAgZm9yIChsZXQgb3B0aW9uIG9mIEFycmF5LmZyb20oaW5wdXQub3B0aW9ucykpIHsKICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbmV3X3ZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICAvL0B0cy1pZ25vcmUKICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgIH0KfSkKfQpyZXR1cm4gcmVzdWx0Cn0pKCkKCgkKT2JqZWN0LmRlZmluZVByb3BlcnR5KGRpdiwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiB2YWx1ZXMsCglzZXQ6IChuZXd2YWxzKSA9PiB7CgkJaWYoIW5ld3ZhbHMpIHsKCQkJcmV0dXJuCgkJfQoJCWlucHV0cy5mb3JFYWNoKChlbCwgaSkgPT4gewoJCQl2YWx1ZXNbaV0gPSBuZXd2YWxzW2ldCgkJCXNldF9pbnB1dF92YWx1ZShlbCwgbmV3dmFsc1tpXSkKCQl9KQp9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCQo8L3NjcmlwdD4KPC9zcGFuPgo8L2JvbmQ+sHBlcnNpc3RfanNfc3RhdGXDpG1pbWWpdGV4dC9odG1ssmxhc3RfcnVuX3RpbWVzdGFtcMtB2GziAfAp8bdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4CKct8tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJGFkNWNmZmE1LTMxM2MtNGRlOS05MzYwLTAwNTM2NWI0MDc4MIimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHmgsHBlcnNpc3RfanNfc3RhdGXDpG1pbWWqdGV4dC9wbGFpbrJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4gHqT5y3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXN0Sa1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkMTI3ZGQ1OGItOWJhMC00MWQ4LTkxZTYtMzU3ZDllYzYzZTZiiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9keYWmcHJlZml4o0FueahlbGVtZW50c5GSAZKDqGVsZW1lbnRzkpIBkqdtaXNzaW5nqnRleHQvcGxhaW6SApKjc2luqnRleHQvcGxhaW6kdHlwZaVUdXBsZahvYmplY3RpZLBmZmZmZmZmZjU4MDdhODM32SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SkdHlwZaVBcnJheaxwcmVmaXhfc2hvcnSgqG9iamVjdGlksGU2ZWRiMTE3MTg3NmY0MmWwcGVyc2lzdF9qc19zdGF0ZcOkbWltZdkhYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0smxhc3RfcnVuX3RpbWVzdGFtcMtB2GziAhnexrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQxMjdkZDU4Yi05YmEwLTQxZDgtOTFlNi0zNTdkOWVjNjNlNmK5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZX21cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkMzhiN2VlYjktODBiYi00YTNhLWEyZDItODA5ZmM0MjM2MjVjiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9keaCwcGVyc2lzdF9qc19zdGF0ZcKkbWltZap0ZXh0L3BsYWlusmxhc3RfcnVuX3RpbWVzdGFtcMtB2Gzf/DLburdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWO5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc7BlsfZtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDBiNjQzZWQ5LTkxNGEtNDc1Yi1hMWNlLWQ4NDBkZjFmYzIyM4imcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnaCYc8Ym9uZCBkZWY9Iml0diI+PHNwYW4+CjxwPkhlbGxvIHdvcmxkITwvcD4KPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0neGdya2VwbW5ycSc+PGlucHV0IHR5cGU9cmFuZ2U+PC9wbC1jb21iaW5lZF9jaGlsZD4KPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0neGdya2VwbW5ycSc+PGlucHV0IAp0eXBlPSJyYW5nZSIgCm1pbj0xIG1heD0nMycgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPgoKCjxzY3JpcHQgaWQ9J3hncmtlcG1ucnEnPgpjb25zdCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKbGV0IGtleSA9ICJ4Z3JrZXBtbnJxIgpjb25zdCBpbnB1dHMgPSBkaXYucXVlcnlTZWxlY3RvckFsbChgcGwtY29tYmluZWRfY2hpbGRba2V5PScke2tleX0nXSA+ICo6Zmlyc3QtY2hpbGRgKQoKY29uc3QgdmFsdWVzID0gQXJyYXkoaW5wdXRzLmxlbmd0aCkKCmlucHV0cy5mb3JFYWNoKGFzeW5jIChlbCxpKSA9PiB7CgllbC5vbmlucHV0ID0gKGUpID0+IHsKCQllLnN0b3BQcm9wYWdhdGlvbigpCgl9Cgljb25zdCBnZW4gPSBHZW5lcmF0b3JzLmlucHV0KGVsKQoJd2hpbGUodHJ1ZSkgewoJCXZhbHVlc1tpXSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQlkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlcywKCXNldDogKG5ld3ZhbHMpID0+IHsKCQlpZighbmV3dmFscykgewoJCQlyZXR1cm4KCQl9CgkJaW5wdXRzLmZvckVhY2goKGVsLCBpKSA9PiB7CgkJCXZhbHVlc1tpXSA9IG5ld3ZhbHNbaV0KCQkJc2V0X2lucHV0X3ZhbHVlKGVsLCBuZXd2YWxzW2ldKQoJCX0pCn0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvYm9uZD6wcGVyc2lzdF9qc19zdGF0ZcOkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOICGbait2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDBiNjQzZWQ5LTkxNGEtNDc1Yi1hMWNlLWQ4NDBkZjFmYzIyM7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgIqh1C1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVhiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9keYOoZWxlbWVudHOTkgGSoTGqdGV4dC9wbGFpbpICkqE1qnRleHQvcGxhaW6SA5KkdHJ1Zap0ZXh0L3BsYWlupHR5cGWlVHVwbGWob2JqZWN0aWSwMzk3MDFkODI3OGU2YzdhYrBwZXJzaXN0X2pzX3N0YXRlw6RtaW1l2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SybGFzdF9ydW5fdGltZXN0YW1wy0HYbOIB7b2tt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDhkY2IyNDk4LTAwY2YtNDlhOC04MDc0LTMwMWZlODhiNzZlYblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lALVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRjYzNlNDc1ZS1kMmMyLTRiNDAtYTFiYS0wMzM1NzZhZWZkYWWIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52W48ZGl2IGNsYXNzPSJtYXJrZG93biI+PHA+U2hvdWxkIGJlIDxjb2RlPiYjOTE7JiM5MTttaXNzaW5nLCBzaW4mIzkzOywgJiM5MTs1MCwgc2luJiM5MzsmIzkzOzwvY29kZT48L3A+CjwvZGl2PrBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs3/l6KEq3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkY2MzZTQ3NWUtZDJjMi00YjQwLWExYmEtMDMzNTc2YWVmZGFluWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAJl77VwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQ1MzAwYjgwZC00MDk3LTRiODUtYWQyYS0zYTU0YjAxNTU5YmaIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5g6hlbGVtZW50c5WSAZKiIiKqdGV4dC9wbGFpbpICkqNzaW6qdGV4dC9wbGFpbpIDkqE3qnRleHQvcGxhaW6SBJKhN6p0ZXh0L3BsYWlukgWSoTeqdGV4dC9wbGFpbqR0eXBlpVR1cGxlqG9iamVjdGlksDEzMmZjZGU0YWUxODY5NmKwcGVyc2lzdF9qc19zdGF0ZcOkbWltZdkhYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0smxhc3RfcnVuX3RpbWVzdGFtcMtB2GziAhbhDbdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQ1MzAwYjgwZC00MDk3LTRiODUtYWQyYS0zYTU0YjAxNTU5Yma5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4d7Z/RtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDNkM2E2YWJiLWJlYTctNDFlMi04NjJkLTk1MzZhOTY4N2VhNYimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnZQzxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDM+SW5pdGlhbCB2YWx1ZSAmYW1wOyB0cmFuc2Zvcm08L2gzPgo8L2Rpdj6wcGVyc2lzdF9qc19zdGF0ZcKkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbN/5ehcvt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDNkM2E2YWJiLWJlYTctNDFlMi04NjJkLTk1MzZhOTY4N2VhNblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgABuzO1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkYzMxNzY1NDktN2M0Ni00ZDg5LTljNzYtODE3YzZiZmNiYjcxiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedojRDxib25kIGRlZj0idG9nZXRoZXIiPjxzcGFuPgo8cD5IZWxsbyB3b3JsZCE8L3A+CjxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3hjYWlhdHdna2gnPjxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0nJz48L3BsLWNvbWJpbmVkX2NoaWxkPgo8cGwtY29tYmluZWRfY2hpbGQga2V5PSd4Y2FpYXR3Z2toJz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PSczJyB2YWx1ZT0nMScKPgoKCjwvcGwtY29tYmluZWRfY2hpbGQ+CjxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3hjYWlhdHdna2gnPjxzY3JpcHQgaWQ9J2tkanJyeWlxeG14Z2xqZWQnPgovLyB3ZWlyZCBpbXBvcnQgdG8gbWFrZSBpdCBmYXN0ZXIuIFRoZSBgYXdhaXQgaW1wb3J0YCBjYW4gc3RpbGwgZGVsYXkgZXhlY3V0aW9uIGJ5IG9uZSBmcmFtZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4uLgp3aW5kb3cuZDNmb3JtYXQgPSB3aW5kb3cuZDNmb3JtYXQgPz8gYXdhaXQgaW1wb3J0KCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2QzLWZvcm1hdEAyLytlc20iKQoKY29uc3QgYXJnbWluID0geHMgPT4geHMuaW5kZXhPZihNYXRoLm1pbiguLi54cykpCmNvbnN0IGNsb3Nlc3RfaW5kZXggPSAoeHMsIHkpID0+IGFyZ21pbih4cy5tYXAoeCA9PiBNYXRoLmFicyh4LXkpKSkKCmNvbnN0IHZhbHVlcyA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0KCmNvbnN0IGVsID0gaHRtbGAKPHNwYW4gdGl0bGU9IkNsaWNrIGFuZCBkcmFnIHRoaXMgbnVtYmVyIGxlZnQgb3IgcmlnaHQhIiBzdHlsZT0iY3Vyc29yOiBjb2wtcmVzaXplOwp0b3VjaC1hY3Rpb246IG5vbmU7CmJhY2tncm91bmQ6IHJnYigyNTIsIDIwOSwgMjA0KTsKcGFkZGluZzogMGVtIC4yZW07CmJvcmRlci1yYWRpdXM6IC4zZW07CmZvbnQtd2VpZ2h0OiBib2xkOyI+Nzwvc3Bhbj4KYAoKCgpsZXQgb2xkX3ggPSAwCmxldCBvbGRfaW5kZXggPSAwCmNvbnN0IGluaXRpYWxfaW5kZXggPSBjbG9zZXN0X2luZGV4KHZhbHVlcywgNykKbGV0IGN1cnJlbnRfaW5kZXggPSBpbml0aWFsX2luZGV4Cgpjb25zdCBmb3JtYXR0ZXIgPSBzID0+ICIiICsgZDNmb3JtYXQuZm9ybWF0KCIiKShzKSArICIiCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlc1tjdXJyZW50X2luZGV4XSwKCXNldDogeCA9PiB7CgkJY3VycmVudF9pbmRleCA9IGNsb3Nlc3RfaW5kZXgodmFsdWVzLCB4KQoJCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCX0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoKLy8gaW5pdGlhbCB2YWx1ZQplbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoNykKCmNvbnN0IG9uU2NydWIgPSAoZSkgPT4gewoJY29uc3Qgb2Zmc2V0ID0gZS5jbGllbnRYIC0gb2xkX3gKCWNvbnN0IG5ld19pbmRleCA9IE1hdGgubWluKHZhbHVlcy5sZW5ndGgtMSwgTWF0aC5tYXgoMCwgCgkJTWF0aC5yb3VuZChvZmZzZXQvMTApICsgb2xkX2luZGV4CgkpKQoKCWlmKG5ld19pbmRleCAhPT0gY3VycmVudF9pbmRleCkgewoJCWN1cnJlbnRfaW5kZXggPSBuZXdfaW5kZXgKCQllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgkJZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0IikpCgl9Cn0KCmNvbnN0IG9ucG9pbnRlcmRvd24gPSAoZSkgPT4gewoJd2luZG93LmdldFNlbGVjdGlvbigpLmVtcHR5KCkKCW9sZF94ID0gZS5jbGllbnRYCglvbGRfaW5kZXggPSBjdXJyZW50X2luZGV4Cgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblNjcnViKQp9CmVsLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25wb2ludGVyZG93bikKCmNvbnN0IG9uZGJsY2xpY2sgPSAoZSkgPT4gewoJY3VycmVudF9pbmRleCA9IGluaXRpYWxfaW5kZXgKCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCWVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIpKQp9CmVsLmFkZEV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgb25kYmxjbGljaykKCmNvbnN0IG9ucG9pbnRlcnVwID0gKCkgPT4gewoJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25TY3J1YikKfQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25wb2ludGVydXApCgplbC5vbnNlbGVjdHN0YXJ0ID0gKCkgPT4gZmFsc2UKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25wb2ludGVyZG93bikKCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgb25kYmxjbGljaykKCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvbnBvaW50ZXJ1cCkKfSkKCnJldHVybiBlbAoKPC9zY3JpcHQ+PC9wbC1jb21iaW5lZF9jaGlsZD48cGwtY29tYmluZWRfY2hpbGQga2V5PSd4Y2FpYXR3Z2toJz48c2NyaXB0IGlkPSd4dXdrbW5lcGFmb2FrbGx6Jz4KLy8gd2VpcmQgaW1wb3J0IHRvIG1ha2UgaXQgZmFzdGVyLiBUaGUgYGF3YWl0IGltcG9ydGAgY2FuIHN0aWxsIGRlbGF5IGV4ZWN1dGlvbiBieSBvbmUgZnJhbWUgaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuLi4Kd2luZG93LmQzZm9ybWF0ID0gd2luZG93LmQzZm9ybWF0ID8/IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9kMy1mb3JtYXRAMi8rZXNtIikKCmNvbnN0IGFyZ21pbiA9IHhzID0+IHhzLmluZGV4T2YoTWF0aC5taW4oLi4ueHMpKQpjb25zdCBjbG9zZXN0X2luZGV4ID0gKHhzLCB5KSA9PiBhcmdtaW4oeHMubWFwKHggPT4gTWF0aC5hYnMoeC15KSkpCgpjb25zdCB2YWx1ZXMgPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdCgpjb25zdCBlbCA9IGh0bWxgCjxzcGFuIHRpdGxlPSJDbGljayBhbmQgZHJhZyB0aGlzIG51bWJlciBsZWZ0IG9yIHJpZ2h0ISIgc3R5bGU9ImN1cnNvcjogY29sLXJlc2l6ZTsKdG91Y2gtYWN0aW9uOiBub25lOwpiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyMDksIDIwNCk7CnBhZGRpbmc6IDBlbSAuMmVtOwpib3JkZXItcmFkaXVzOiAuM2VtOwpmb250LXdlaWdodDogYm9sZDsiPjc8L3NwYW4+CmAKCgoKbGV0IG9sZF94ID0gMApsZXQgb2xkX2luZGV4ID0gMApjb25zdCBpbml0aWFsX2luZGV4ID0gY2xvc2VzdF9pbmRleCh2YWx1ZXMsIDcpCmxldCBjdXJyZW50X2luZGV4ID0gaW5pdGlhbF9pbmRleAoKY29uc3QgZm9ybWF0dGVyID0gcyA9PiAiIiArIGQzZm9ybWF0LmZvcm1hdCgiIikocykgKyAiIgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiB2YWx1ZXNbY3VycmVudF9pbmRleF0sCglzZXQ6IHggPT4gewoJCWN1cnJlbnRfaW5kZXggPSBjbG9zZXN0X2luZGV4KHZhbHVlcywgeCkKCQllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgl9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCi8vIGluaXRpYWwgdmFsdWUKZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKDcpCgpjb25zdCBvblNjcnViID0gKGUpID0+IHsKCWNvbnN0IG9mZnNldCA9IGUuY2xpZW50WCAtIG9sZF94Cgljb25zdCBuZXdfaW5kZXggPSBNYXRoLm1pbih2YWx1ZXMubGVuZ3RoLTEsIE1hdGgubWF4KDAsIAoJCU1hdGgucm91bmQob2Zmc2V0LzEwKSArIG9sZF9pbmRleAoJKSkKCglpZihuZXdfaW5kZXggIT09IGN1cnJlbnRfaW5kZXgpIHsKCQljdXJyZW50X2luZGV4ID0gbmV3X2luZGV4CgkJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJCWVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIpKQoJfQp9Cgpjb25zdCBvbnBvaW50ZXJkb3duID0gKGUpID0+IHsKCXdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSgpCglvbGRfeCA9IGUuY2xpZW50WAoJb2xkX2luZGV4ID0gY3VycmVudF9pbmRleAoJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25TY3J1YikKfQplbC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9ucG9pbnRlcmRvd24pCgpjb25zdCBvbmRibGNsaWNrID0gKGUpID0+IHsKCWN1cnJlbnRfaW5kZXggPSBpbml0aWFsX2luZGV4CgllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgllbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiKSkKfQplbC5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIG9uZGJsY2xpY2spCgpjb25zdCBvbnBvaW50ZXJ1cCA9ICgpID0+IHsKCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uU2NydWIpCn0Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIG9ucG9pbnRlcnVwKQoKZWwub25zZWxlY3RzdGFydCA9ICgpID0+IGZhbHNlCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgllbC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9ucG9pbnRlcmRvd24pCgllbC5yZW1vdmVFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIG9uZGJsY2xpY2spCgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25wb2ludGVydXApCn0pCgpyZXR1cm4gZWwKCjwvc2NyaXB0PjwvcGwtY29tYmluZWRfY2hpbGQ+PHBsLWNvbWJpbmVkX2NoaWxkIGtleT0neGNhaWF0d2draCc+PHNjcmlwdCBpZD0naHV3amJkZGh3amt2b2J6cCc+Ci8vIHdlaXJkIGltcG9ydCB0byBtYWtlIGl0IGZhc3Rlci4gVGhlIGBhd2FpdCBpbXBvcnRgIGNhbiBzdGlsbCBkZWxheSBleGVjdXRpb24gYnkgb25lIGZyYW1lIGlmIGl0IGlzIGFscmVhZHkgbG9hZGVkLi4uCndpbmRvdy5kM2Zvcm1hdCA9IHdpbmRvdy5kM2Zvcm1hdCA/PyBhd2FpdCBpbXBvcnQoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vZDMtZm9ybWF0QDIvK2VzbSIpCgpjb25zdCBhcmdtaW4gPSB4cyA9PiB4cy5pbmRleE9mKE1hdGgubWluKC4uLnhzKSkKY29uc3QgY2xvc2VzdF9pbmRleCA9ICh4cywgeSkgPT4gYXJnbWluKHhzLm1hcCh4ID0+IE1hdGguYWJzKHgteSkpKQoKY29uc3QgdmFsdWVzID0gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXQoKY29uc3QgZWwgPSBodG1sYAo8c3BhbiB0aXRsZT0iQ2xpY2sgYW5kIGRyYWcgdGhpcyBudW1iZXIgbGVmdCBvciByaWdodCEiIHN0eWxlPSJjdXJzb3I6IGNvbC1yZXNpemU7CnRvdWNoLWFjdGlvbjogbm9uZTsKYmFja2dyb3VuZDogcmdiKDI1MiwgMjA5LCAyMDQpOwpwYWRkaW5nOiAwZW0gLjJlbTsKYm9yZGVyLXJhZGl1czogLjNlbTsKZm9udC13ZWlnaHQ6IGJvbGQ7Ij43PC9zcGFuPgpgCgoKCmxldCBvbGRfeCA9IDAKbGV0IG9sZF9pbmRleCA9IDAKY29uc3QgaW5pdGlhbF9pbmRleCA9IGNsb3Nlc3RfaW5kZXgodmFsdWVzLCA3KQpsZXQgY3VycmVudF9pbmRleCA9IGluaXRpYWxfaW5kZXgKCmNvbnN0IGZvcm1hdHRlciA9IHMgPT4gIiIgKyBkM2Zvcm1hdC5mb3JtYXQoIiIpKHMpICsgIiIKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gdmFsdWVzW2N1cnJlbnRfaW5kZXhdLAoJc2V0OiB4ID0+IHsKCQljdXJyZW50X2luZGV4ID0gY2xvc2VzdF9pbmRleCh2YWx1ZXMsIHgpCgkJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgovLyBpbml0aWFsIHZhbHVlCmVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcig3KQoKY29uc3Qgb25TY3J1YiA9IChlKSA9PiB7Cgljb25zdCBvZmZzZXQgPSBlLmNsaWVudFggLSBvbGRfeAoJY29uc3QgbmV3X2luZGV4ID0gTWF0aC5taW4odmFsdWVzLmxlbmd0aC0xLCBNYXRoLm1heCgwLCAKCQlNYXRoLnJvdW5kKG9mZnNldC8xMCkgKyBvbGRfaW5kZXgKCSkpCgoJaWYobmV3X2luZGV4ICE9PSBjdXJyZW50X2luZGV4KSB7CgkJY3VycmVudF9pbmRleCA9IG5ld19pbmRleAoJCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCQllbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiKSkKCX0KfQoKY29uc3Qgb25wb2ludGVyZG93biA9IChlKSA9PiB7Cgl3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkoKQoJb2xkX3ggPSBlLmNsaWVudFgKCW9sZF9pbmRleCA9IGN1cnJlbnRfaW5kZXgKCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uU2NydWIpCn0KZWwuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBvbnBvaW50ZXJkb3duKQoKY29uc3Qgb25kYmxjbGljayA9IChlKSA9PiB7CgljdXJyZW50X2luZGV4ID0gaW5pdGlhbF9pbmRleAoJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0IikpCn0KZWwuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCBvbmRibGNsaWNrKQoKY29uc3Qgb25wb2ludGVydXAgPSAoKSA9PiB7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblNjcnViKQp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvbnBvaW50ZXJ1cCkKCmVsLm9uc2VsZWN0c3RhcnQgPSAoKSA9PiBmYWxzZQoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBvbnBvaW50ZXJkb3duKQoJZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCBvbmRibGNsaWNrKQoJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIG9ucG9pbnRlcnVwKQp9KQoKcmV0dXJuIGVsCgo8L3NjcmlwdD48L3BsLWNvbWJpbmVkX2NoaWxkPgoKCjxzY3JpcHQgaWQ9J3hjYWlhdHdna2gnPgpjb25zdCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKbGV0IGtleSA9ICJ4Y2FpYXR3Z2toIgpjb25zdCBpbnB1dHMgPSBkaXYucXVlcnlTZWxlY3RvckFsbChgcGwtY29tYmluZWRfY2hpbGRba2V5PScke2tleX0nXSA+ICo6Zmlyc3QtY2hpbGRgKQoKY29uc3QgdmFsdWVzID0gQXJyYXkoaW5wdXRzLmxlbmd0aCkKCmlucHV0cy5mb3JFYWNoKGFzeW5jIChlbCxpKSA9PiB7CgllbC5vbmlucHV0ID0gKGUpID0+IHsKCQllLnN0b3BQcm9wYWdhdGlvbigpCgl9Cgljb25zdCBnZW4gPSBHZW5lcmF0b3JzLmlucHV0KGVsKQoJd2hpbGUodHJ1ZSkgewoJCXZhbHVlc1tpXSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQlkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlcywKCXNldDogKG5ld3ZhbHMpID0+IHsKCQlpZighbmV3dmFscykgewoJCQlyZXR1cm4KCQl9CgkJaW5wdXRzLmZvckVhY2goKGVsLCBpKSA9PiB7CgkJCXZhbHVlc1tpXSA9IG5ld3ZhbHNbaV0KCQkJc2V0X2lucHV0X3ZhbHVlKGVsLCBuZXd2YWxzW2ldKQoJCX0pCn0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvYm9uZD6wcGVyc2lzdF9qc19zdGF0ZcOkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOIB9n85t2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWWyQHNraXBfYXNfc2NyaXB0IHJip2NlbGxfaWTZJGMzMTc2NTQ5LTdjNDYtNGQ4OS05Yzc2LTgxN2M2YmZjYmI3MblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgNmgxO1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkNTlhMTk5ZjQtNGNjYy00MzE5LTlkMzItMDNkYTNhZGJiNWRiiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedoJhzxib25kIGRlZj0iaXR2Ij48c3Bhbj4KPHA+SGVsbG8gd29ybGQhPC9wPgo8cGwtY29tYmluZWRfY2hpbGQga2V5PSd4Z3JrZXBtbnJxJz48aW5wdXQgdHlwZT1yYW5nZT48L3BsLWNvbWJpbmVkX2NoaWxkPgo8cGwtY29tYmluZWRfY2hpbGQga2V5PSd4Z3JrZXBtbnJxJz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PSczJyB2YWx1ZT0nMScKPgoKCjwvcGwtY29tYmluZWRfY2hpbGQ+CgoKPHNjcmlwdCBpZD0neGdya2VwbW5ycSc+CmNvbnN0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudApsZXQga2V5ID0gInhncmtlcG1ucnEiCmNvbnN0IGlucHV0cyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKGBwbC1jb21iaW5lZF9jaGlsZFtrZXk9JyR7a2V5fSddID4gKjpmaXJzdC1jaGlsZGApCgpjb25zdCB2YWx1ZXMgPSBBcnJheShpbnB1dHMubGVuZ3RoKQoKaW5wdXRzLmZvckVhY2goYXN5bmMgKGVsLGkpID0+IHsKCWVsLm9uaW5wdXQgPSAoZSkgPT4gewoJCWUuc3RvcFByb3BhZ2F0aW9uKCkKCX0KCWNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoZWwpCgl3aGlsZSh0cnVlKSB7CgkJdmFsdWVzW2ldID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pCgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gdmFsdWVzLAoJc2V0OiAobmV3dmFscykgPT4gewoJCWlmKCFuZXd2YWxzKSB7CgkJCXJldHVybgoJCX0KCQlpbnB1dHMuZm9yRWFjaCgoZWwsIGkpID0+IHsKCQkJdmFsdWVzW2ldID0gbmV3dmFsc1tpXQoJCQlzZXRfaW5wdXRfdmFsdWUoZWwsIG5ld3ZhbHNbaV0pCgkJfSkKfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KPC9ib25kPrBwZXJzaXN0X2pzX3N0YXRlw6RtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4gIZyRC3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkNTlhMTk5ZjQtNGNjYy00MzE5LTlkMzItMDNkYTNhZGJiNWRiuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWUAtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDZkNGY2MmE2LWUzZDktNDE2Zi1hMWUzLTY5NGMzMWNmYmIzMYimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnaI0Q8Ym9uZCBkZWY9InRvZ2V0aGVyIj48c3Bhbj4KPHA+SGVsbG8gd29ybGQhPC9wPgo8cGwtY29tYmluZWRfY2hpbGQga2V5PSd4Y2FpYXR3Z2toJz48aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9Jyc+PC9wbC1jb21iaW5lZF9jaGlsZD4KPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0neGNhaWF0d2draCc+PGlucHV0IAp0eXBlPSJyYW5nZSIgCm1pbj0xIG1heD0nMycgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPgo8cGwtY29tYmluZWRfY2hpbGQga2V5PSd4Y2FpYXR3Z2toJz48c2NyaXB0IGlkPSdrZGpycnlpcXhteGdsamVkJz4KLy8gd2VpcmQgaW1wb3J0IHRvIG1ha2UgaXQgZmFzdGVyLiBUaGUgYGF3YWl0IGltcG9ydGAgY2FuIHN0aWxsIGRlbGF5IGV4ZWN1dGlvbiBieSBvbmUgZnJhbWUgaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuLi4Kd2luZG93LmQzZm9ybWF0ID0gd2luZG93LmQzZm9ybWF0ID8/IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9kMy1mb3JtYXRAMi8rZXNtIikKCmNvbnN0IGFyZ21pbiA9IHhzID0+IHhzLmluZGV4T2YoTWF0aC5taW4oLi4ueHMpKQpjb25zdCBjbG9zZXN0X2luZGV4ID0gKHhzLCB5KSA9PiBhcmdtaW4oeHMubWFwKHggPT4gTWF0aC5hYnMoeC15KSkpCgpjb25zdCB2YWx1ZXMgPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdCgpjb25zdCBlbCA9IGh0bWxgCjxzcGFuIHRpdGxlPSJDbGljayBhbmQgZHJhZyB0aGlzIG51bWJlciBsZWZ0IG9yIHJpZ2h0ISIgc3R5bGU9ImN1cnNvcjogY29sLXJlc2l6ZTsKdG91Y2gtYWN0aW9uOiBub25lOwpiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyMDksIDIwNCk7CnBhZGRpbmc6IDBlbSAuMmVtOwpib3JkZXItcmFkaXVzOiAuM2VtOwpmb250LXdlaWdodDogYm9sZDsiPjc8L3NwYW4+CmAKCgoKbGV0IG9sZF94ID0gMApsZXQgb2xkX2luZGV4ID0gMApjb25zdCBpbml0aWFsX2luZGV4ID0gY2xvc2VzdF9pbmRleCh2YWx1ZXMsIDcpCmxldCBjdXJyZW50X2luZGV4ID0gaW5pdGlhbF9pbmRleAoKY29uc3QgZm9ybWF0dGVyID0gcyA9PiAiIiArIGQzZm9ybWF0LmZvcm1hdCgiIikocykgKyAiIgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiB2YWx1ZXNbY3VycmVudF9pbmRleF0sCglzZXQ6IHggPT4gewoJCWN1cnJlbnRfaW5kZXggPSBjbG9zZXN0X2luZGV4KHZhbHVlcywgeCkKCQllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgl9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCi8vIGluaXRpYWwgdmFsdWUKZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKDcpCgpjb25zdCBvblNjcnViID0gKGUpID0+IHsKCWNvbnN0IG9mZnNldCA9IGUuY2xpZW50WCAtIG9sZF94Cgljb25zdCBuZXdfaW5kZXggPSBNYXRoLm1pbih2YWx1ZXMubGVuZ3RoLTEsIE1hdGgubWF4KDAsIAoJCU1hdGgucm91bmQob2Zmc2V0LzEwKSArIG9sZF9pbmRleAoJKSkKCglpZihuZXdfaW5kZXggIT09IGN1cnJlbnRfaW5kZXgpIHsKCQljdXJyZW50X2luZGV4ID0gbmV3X2luZGV4CgkJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJCWVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIpKQoJfQp9Cgpjb25zdCBvbnBvaW50ZXJkb3duID0gKGUpID0+IHsKCXdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSgpCglvbGRfeCA9IGUuY2xpZW50WAoJb2xkX2luZGV4ID0gY3VycmVudF9pbmRleAoJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25TY3J1YikKfQplbC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9ucG9pbnRlcmRvd24pCgpjb25zdCBvbmRibGNsaWNrID0gKGUpID0+IHsKCWN1cnJlbnRfaW5kZXggPSBpbml0aWFsX2luZGV4CgllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgllbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiKSkKfQplbC5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIG9uZGJsY2xpY2spCgpjb25zdCBvbnBvaW50ZXJ1cCA9ICgpID0+IHsKCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uU2NydWIpCn0Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIG9ucG9pbnRlcnVwKQoKZWwub25zZWxlY3RzdGFydCA9ICgpID0+IGZhbHNlCgppbnZhbGlkYXRpb24udGhlbigoKSA9PiB7CgllbC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9ucG9pbnRlcmRvd24pCgllbC5yZW1vdmVFdmVudExpc3RlbmVyKCJkYmxjbGljayIsIG9uZGJsY2xpY2spCgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25wb2ludGVydXApCn0pCgpyZXR1cm4gZWwKCjwvc2NyaXB0PjwvcGwtY29tYmluZWRfY2hpbGQ+PHBsLWNvbWJpbmVkX2NoaWxkIGtleT0neGNhaWF0d2draCc+PHNjcmlwdCBpZD0neHV3a21uZXBhZm9ha2xseic+Ci8vIHdlaXJkIGltcG9ydCB0byBtYWtlIGl0IGZhc3Rlci4gVGhlIGBhd2FpdCBpbXBvcnRgIGNhbiBzdGlsbCBkZWxheSBleGVjdXRpb24gYnkgb25lIGZyYW1lIGlmIGl0IGlzIGFscmVhZHkgbG9hZGVkLi4uCndpbmRvdy5kM2Zvcm1hdCA9IHdpbmRvdy5kM2Zvcm1hdCA/PyBhd2FpdCBpbXBvcnQoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vZDMtZm9ybWF0QDIvK2VzbSIpCgpjb25zdCBhcmdtaW4gPSB4cyA9PiB4cy5pbmRleE9mKE1hdGgubWluKC4uLnhzKSkKY29uc3QgY2xvc2VzdF9pbmRleCA9ICh4cywgeSkgPT4gYXJnbWluKHhzLm1hcCh4ID0+IE1hdGguYWJzKHgteSkpKQoKY29uc3QgdmFsdWVzID0gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXQoKY29uc3QgZWwgPSBodG1sYAo8c3BhbiB0aXRsZT0iQ2xpY2sgYW5kIGRyYWcgdGhpcyBudW1iZXIgbGVmdCBvciByaWdodCEiIHN0eWxlPSJjdXJzb3I6IGNvbC1yZXNpemU7CnRvdWNoLWFjdGlvbjogbm9uZTsKYmFja2dyb3VuZDogcmdiKDI1MiwgMjA5LCAyMDQpOwpwYWRkaW5nOiAwZW0gLjJlbTsKYm9yZGVyLXJhZGl1czogLjNlbTsKZm9udC13ZWlnaHQ6IGJvbGQ7Ij43PC9zcGFuPgpgCgoKCmxldCBvbGRfeCA9IDAKbGV0IG9sZF9pbmRleCA9IDAKY29uc3QgaW5pdGlhbF9pbmRleCA9IGNsb3Nlc3RfaW5kZXgodmFsdWVzLCA3KQpsZXQgY3VycmVudF9pbmRleCA9IGluaXRpYWxfaW5kZXgKCmNvbnN0IGZvcm1hdHRlciA9IHMgPT4gIiIgKyBkM2Zvcm1hdC5mb3JtYXQoIiIpKHMpICsgIiIKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gdmFsdWVzW2N1cnJlbnRfaW5kZXhdLAoJc2V0OiB4ID0+IHsKCQljdXJyZW50X2luZGV4ID0gY2xvc2VzdF9pbmRleCh2YWx1ZXMsIHgpCgkJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgovLyBpbml0aWFsIHZhbHVlCmVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcig3KQoKY29uc3Qgb25TY3J1YiA9IChlKSA9PiB7Cgljb25zdCBvZmZzZXQgPSBlLmNsaWVudFggLSBvbGRfeAoJY29uc3QgbmV3X2luZGV4ID0gTWF0aC5taW4odmFsdWVzLmxlbmd0aC0xLCBNYXRoLm1heCgwLCAKCQlNYXRoLnJvdW5kKG9mZnNldC8xMCkgKyBvbGRfaW5kZXgKCSkpCgoJaWYobmV3X2luZGV4ICE9PSBjdXJyZW50X2luZGV4KSB7CgkJY3VycmVudF9pbmRleCA9IG5ld19pbmRleAoJCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCQllbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiKSkKCX0KfQoKY29uc3Qgb25wb2ludGVyZG93biA9IChlKSA9PiB7Cgl3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkoKQoJb2xkX3ggPSBlLmNsaWVudFgKCW9sZF9pbmRleCA9IGN1cnJlbnRfaW5kZXgKCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uU2NydWIpCn0KZWwuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBvbnBvaW50ZXJkb3duKQoKY29uc3Qgb25kYmxjbGljayA9IChlKSA9PiB7CgljdXJyZW50X2luZGV4ID0gaW5pdGlhbF9pbmRleAoJZWwuaW5uZXJUZXh0ID0gZm9ybWF0dGVyKGVsLnZhbHVlKQoJZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0IikpCn0KZWwuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCBvbmRibGNsaWNrKQoKY29uc3Qgb25wb2ludGVydXAgPSAoKSA9PiB7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblNjcnViKQp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvbnBvaW50ZXJ1cCkKCmVsLm9uc2VsZWN0c3RhcnQgPSAoKSA9PiBmYWxzZQoKaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gewoJZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBvbnBvaW50ZXJkb3duKQoJZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCBvbmRibGNsaWNrKQoJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIG9ucG9pbnRlcnVwKQp9KQoKcmV0dXJuIGVsCgo8L3NjcmlwdD48L3BsLWNvbWJpbmVkX2NoaWxkPjxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3hjYWlhdHdna2gnPjxzY3JpcHQgaWQ9J2h1d2piZGRod2prdm9ienAnPgovLyB3ZWlyZCBpbXBvcnQgdG8gbWFrZSBpdCBmYXN0ZXIuIFRoZSBgYXdhaXQgaW1wb3J0YCBjYW4gc3RpbGwgZGVsYXkgZXhlY3V0aW9uIGJ5IG9uZSBmcmFtZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4uLgp3aW5kb3cuZDNmb3JtYXQgPSB3aW5kb3cuZDNmb3JtYXQgPz8gYXdhaXQgaW1wb3J0KCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2QzLWZvcm1hdEAyLytlc20iKQoKY29uc3QgYXJnbWluID0geHMgPT4geHMuaW5kZXhPZihNYXRoLm1pbiguLi54cykpCmNvbnN0IGNsb3Nlc3RfaW5kZXggPSAoeHMsIHkpID0+IGFyZ21pbih4cy5tYXAoeCA9PiBNYXRoLmFicyh4LXkpKSkKCmNvbnN0IHZhbHVlcyA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0KCmNvbnN0IGVsID0gaHRtbGAKPHNwYW4gdGl0bGU9IkNsaWNrIGFuZCBkcmFnIHRoaXMgbnVtYmVyIGxlZnQgb3IgcmlnaHQhIiBzdHlsZT0iY3Vyc29yOiBjb2wtcmVzaXplOwp0b3VjaC1hY3Rpb246IG5vbmU7CmJhY2tncm91bmQ6IHJnYigyNTIsIDIwOSwgMjA0KTsKcGFkZGluZzogMGVtIC4yZW07CmJvcmRlci1yYWRpdXM6IC4zZW07CmZvbnQtd2VpZ2h0OiBib2xkOyI+Nzwvc3Bhbj4KYAoKCgpsZXQgb2xkX3ggPSAwCmxldCBvbGRfaW5kZXggPSAwCmNvbnN0IGluaXRpYWxfaW5kZXggPSBjbG9zZXN0X2luZGV4KHZhbHVlcywgNykKbGV0IGN1cnJlbnRfaW5kZXggPSBpbml0aWFsX2luZGV4Cgpjb25zdCBmb3JtYXR0ZXIgPSBzID0+ICIiICsgZDNmb3JtYXQuZm9ybWF0KCIiKShzKSArICIiCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlc1tjdXJyZW50X2luZGV4XSwKCXNldDogeCA9PiB7CgkJY3VycmVudF9pbmRleCA9IGNsb3Nlc3RfaW5kZXgodmFsdWVzLCB4KQoJCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCX0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoKLy8gaW5pdGlhbCB2YWx1ZQplbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoNykKCmNvbnN0IG9uU2NydWIgPSAoZSkgPT4gewoJY29uc3Qgb2Zmc2V0ID0gZS5jbGllbnRYIC0gb2xkX3gKCWNvbnN0IG5ld19pbmRleCA9IE1hdGgubWluKHZhbHVlcy5sZW5ndGgtMSwgTWF0aC5tYXgoMCwgCgkJTWF0aC5yb3VuZChvZmZzZXQvMTApICsgb2xkX2luZGV4CgkpKQoKCWlmKG5ld19pbmRleCAhPT0gY3VycmVudF9pbmRleCkgewoJCWN1cnJlbnRfaW5kZXggPSBuZXdfaW5kZXgKCQllbC5pbm5lclRleHQgPSBmb3JtYXR0ZXIoZWwudmFsdWUpCgkJZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0IikpCgl9Cn0KCmNvbnN0IG9ucG9pbnRlcmRvd24gPSAoZSkgPT4gewoJd2luZG93LmdldFNlbGVjdGlvbigpLmVtcHR5KCkKCW9sZF94ID0gZS5jbGllbnRYCglvbGRfaW5kZXggPSBjdXJyZW50X2luZGV4Cgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblNjcnViKQp9CmVsLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25wb2ludGVyZG93bikKCmNvbnN0IG9uZGJsY2xpY2sgPSAoZSkgPT4gewoJY3VycmVudF9pbmRleCA9IGluaXRpYWxfaW5kZXgKCWVsLmlubmVyVGV4dCA9IGZvcm1hdHRlcihlbC52YWx1ZSkKCWVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIpKQp9CmVsLmFkZEV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgb25kYmxjbGljaykKCmNvbnN0IG9ucG9pbnRlcnVwID0gKCkgPT4gewoJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25TY3J1YikKfQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25wb2ludGVydXApCgplbC5vbnNlbGVjdHN0YXJ0ID0gKCkgPT4gZmFsc2UKCmludmFsaWRhdGlvbi50aGVuKCgpID0+IHsKCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25wb2ludGVyZG93bikKCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRibGNsaWNrIiwgb25kYmxjbGljaykKCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvbnBvaW50ZXJ1cCkKfSkKCnJldHVybiBlbAoKPC9zY3JpcHQ+PC9wbC1jb21iaW5lZF9jaGlsZD4KCgo8c2NyaXB0IGlkPSd4Y2FpYXR3Z2toJz4KY29uc3QgZGl2ID0gY3VycmVudFNjcmlwdC5wYXJlbnRFbGVtZW50CmxldCBrZXkgPSAieGNhaWF0d2draCIKY29uc3QgaW5wdXRzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoYHBsLWNvbWJpbmVkX2NoaWxkW2tleT0nJHtrZXl9J10gPiAqOmZpcnN0LWNoaWxkYCkKCmNvbnN0IHZhbHVlcyA9IEFycmF5KGlucHV0cy5sZW5ndGgpCgppbnB1dHMuZm9yRWFjaChhc3luYyAoZWwsaSkgPT4gewoJZWwub25pbnB1dCA9IChlKSA9PiB7CgkJZS5zdG9wUHJvcGFnYXRpb24oKQoJfQoJY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChlbCkKCXdoaWxlKHRydWUpIHsKCQl2YWx1ZXNbaV0gPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCgkJZGl2LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHt9KSkKCX0KfSkKCgpsZXQgc2V0X2lucHV0X3ZhbHVlID0gKCgpID0+IHsKCWxldCByZXN1bHQgPSBudWxsCgl0cnkgewoJcmVzdWx0ID0gc2V0Qm91bmRFbGVtZW50VmFsdWVMaWtlUGx1dG8KfSBjYXRjaCAoZSkgewoJcmVzdWx0ID0gKChpbnB1dCwgbmV3X3ZhbHVlKSA9PiB7CgkvLyBmYWxsYmFjayBpbiBjYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb25zcC9QbHV0by5qbC9wdWxsLzE3NTUgaXMgbm90IGF2YWlsYWJsZQogICAgaWYgKG5ld192YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgICAgICByZXR1cm4KICAgIH0KICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHsKICAgICAgICBzd2l0Y2ggKGlucHV0LnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAicmFuZ2UiOgogICAgICAgICAgICBjYXNlICJudW1iZXIiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc051bWJlciAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc051bWJlciA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzRGF0ZSA9PSBudWxsIHx8IE51bWJlcihpbnB1dC52YWx1ZUFzRGF0ZSkgIT09IE51bWJlcihuZXdfdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc0RhdGUgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImNoZWNrYm94IjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImZpbGUiOiB7CiAgICAgICAgICAgICAgICAvLyBDYW4ndCBzZXQgZmlsZXMgOigKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGlucHV0Lm11bHRpcGxlKSB7CiAgICAgICAgZm9yIChsZXQgb3B0aW9uIG9mIEFycmF5LmZyb20oaW5wdXQub3B0aW9ucykpIHsKICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbmV3X3ZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICAvL0B0cy1pZ25vcmUKICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgIH0KfSkKfQpyZXR1cm4gcmVzdWx0Cn0pKCkKCgkKT2JqZWN0LmRlZmluZVByb3BlcnR5KGRpdiwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiB2YWx1ZXMsCglzZXQ6IChuZXd2YWxzKSA9PiB7CgkJaWYoIW5ld3ZhbHMpIHsKCQkJcmV0dXJuCgkJfQoJCWlucHV0cy5mb3JFYWNoKChlbCwgaSkgPT4gewoJCQl2YWx1ZXNbaV0gPSBuZXd2YWxzW2ldCgkJCXNldF9pbnB1dF92YWx1ZShlbCwgbmV3dmFsc1tpXSkKCQl9KQp9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCQo8L3NjcmlwdD4KPC9zcGFuPgo8L2JvbmQ+sHBlcnNpc3RfanNfc3RhdGXDpG1pbWWpdGV4dC9odG1ssmxhc3RfcnVuX3RpbWVzdGFtcMtB2GziAhc2i7doYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQ2ZDRmNjJhNi1lM2Q5LTQxNmYtYTFlMy02OTRjMzFjZmJiMzG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZSq1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkYzhlMDliZjUtZWFlNC00OTJmLTk0NmUtNGJiNTVmZjdlMTYxiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9keYOoZWxlbWVudHOUkqVOb3J0aJKhMap0ZXh0L3BsYWlukqRFYXN0kqExqnRleHQvcGxhaW6SpVNvdXRokqExqnRleHQvcGxhaW6SpFdlc3SSoTGqdGV4dC9wbGFpbqR0eXBlqk5hbWVkVHVwbGWob2JqZWN0aWSwMzAzNjQ0ZTAxNDhkMjFiNLBwZXJzaXN0X2pzX3N0YXRlw6RtaW1l2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SybGFzdF9ydW5fdGltZXN0YW1wy0HYbOIB8r/5t2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJGM4ZTA5YmY1LWVhZTQtNDkyZi05NDZlLTRiYjU1ZmY3ZTE2MblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lALVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzaIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52gLKPGRpdiBjbGFzcz0icGx1dG8tZG9jcy1iaW5kaW5nIiBzdHlsZT0ibWFyZ2luOiAuNWVtOyBwYWRkaW5nOiAxZW07IGJhY2tncm91bmQ6ICM4MzgzODMwYTsgYm9yZGVyLXJhZGl1czogMWVtOyI+CjxzcGFuIHN0eWxlPSIKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xOXB4LCAtMTZweCk7CiAgICBmb250LWZhbWlseTogJ0p1bGlhTW9ubycsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogLjlyZW07CiAgICBmb250LXdlaWdodDogNzAwOwogICAgLyogaGVpZ2h0OiAxcHg7ICovCiAgICBtYXJnaW4tdG9wOiAtMWVtOwogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICAvKiBjb2xvcjogIzY0NjQ2NDsgKi8KICAgIC8qIGJvcmRlcjogM3B4IHNvbGlkICNmOTliMTUzNjsKIj5Ac2tpcF9hc19zY3JpcHQ8L3NwYW4+CjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cHJlPjxjb2RlPkBza2lwX2FzX3NjcmlwdCBleHByZXNzaW9uPC9jb2RlPjwvcHJlPgo8cD5NYXJrcyBhIGV4cHJlc3Npb24gYXMgUGx1dG8tb25seSwgd2hpY2ggbWVhbnMgdGhhdCBpdCB3b24mIzM5O3QgYmUgZXhlY3V0ZWQgd2hlbiBydW5uaW5nIG91dHNpZGUgUGx1dG8uIERvIG5vdCB1c2UgdGhpcyBmb3IgeW91ciBvd24gcHJvamVjdHMuPC9wPgoKCjwvZGl2Pgo8L2Rpdj4KsHBlcnNpc3RfanNfc3RhdGXCpG1pbWWpdGV4dC9odG1ssmxhc3RfcnVuX3RpbWVzdGFtcMtB2Gzf/DxIPbdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1Mza5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ACAU4tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJGNjYmU0NDIzLTgwMWItNGMyMC1hZDJkLWVlODlkNWNmYTg1OYimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnZNTxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+Q29tYmluaW5nIGJvbmRzPC9oMT4KPC9kaXY+sHBlcnNpc3RfanNfc3RhdGXCpG1pbWWpdGV4dC9odG1ssmxhc3RfcnVuX3RpbWVzdGFtcMtB2Gzf+XleY7doYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SRjY2JlNDQyMy04MDFiLTRjMjAtYWQyZC1lZTg5ZDVjZmE4NTm5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAgCItXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJGYwODY4MGIyLWVkMjgtNGZhYy04MzhjLTJlY2E3ZTc1YzZkY4imcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnaCmE8Ym9uZCBkZWY9InZhbHVlcyI+PHNwYW4+CjxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+SGkgdGhlcmUmIzMzOzwvaDE+CjxwPkkgaGF2ZSA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdsaHVra3RkcHR1Jz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMCcgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPiBkb2dzIGFuZCA8cGwtY29tYmluZWRfY2hpbGQga2V5PSdsaHVra3RkcHR1Jz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PSc2JyB2YWx1ZT0nMScKPgoKCjwvcGwtY29tYmluZWRfY2hpbGQ+IGNhdHMuPC9wPgo8cD5Xb3VsZCB5b3UgbGlrZSB0byBzZWUgdGhlbT8gPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0nbGh1a2t0ZHB0dSc+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPjwvcGwtY29tYmluZWRfY2hpbGQ+PC9wPgo8L2Rpdj4KPHNjcmlwdCBpZD0nbGh1a2t0ZHB0dSc+CmNvbnN0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudApsZXQga2V5ID0gImxodWtrdGRwdHUiCmNvbnN0IGlucHV0cyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKGBwbC1jb21iaW5lZF9jaGlsZFtrZXk9JyR7a2V5fSddID4gKjpmaXJzdC1jaGlsZGApCgpjb25zdCB2YWx1ZXMgPSBBcnJheShpbnB1dHMubGVuZ3RoKQoKaW5wdXRzLmZvckVhY2goYXN5bmMgKGVsLGkpID0+IHsKCWVsLm9uaW5wdXQgPSAoZSkgPT4gewoJCWUuc3RvcFByb3BhZ2F0aW9uKCkKCX0KCWNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoZWwpCgl3aGlsZSh0cnVlKSB7CgkJdmFsdWVzW2ldID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pCgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gdmFsdWVzLAoJc2V0OiAobmV3dmFscykgPT4gewoJCWlmKCFuZXd2YWxzKSB7CgkJCXJldHVybgoJCX0KCQlpbnB1dHMuZm9yRWFjaCgoZWwsIGkpID0+IHsKCQkJdmFsdWVzW2ldID0gbmV3dmFsc1tpXQoJCQlzZXRfaW5wdXRfdmFsdWUoZWwsIG5ld3ZhbHNbaV0pCgkJfSkKfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KPC9ib25kPrBwZXJzaXN0X2pzX3N0YXRlw6RtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4gHtmVu3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkZjA4NjgwYjItZWQyOC00ZmFjLTgzOGMtMmVjYTdlNzVjNmRjuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAvYJ8bVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODKIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5g6hlbGVtZW50c5SSAZKhMap0ZXh0L3BsYWlukgKSoTGqdGV4dC9wbGFpbpIDkqExqnRleHQvcGxhaW6SBJKhMap0ZXh0L3BsYWlupHR5cGWlVHVwbGWob2JqZWN0aWSwMzAzNjQ0ZTA4OTk1ODNmZLBwZXJzaXN0X2pzX3N0YXRlw6RtaW1l2SFhcHBsaWNhdGlvbi92bmQucGx1dG8udHJlZStvYmplY3SybGFzdF9ydW5fdGltZXN0YW1wy0HYbOIB8EIxt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lALVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzWIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5g6hlbGVtZW50c5OSAZKlZmFsc2WqdGV4dC9wbGFpbpICkoOoZWxlbWVudHOSkqRsZWZ0kqExqnRleHQvcGxhaW6SpXJpZ2h0kqE1qnRleHQvcGxhaW6kdHlwZapOYW1lZFR1cGxlqG9iamVjdGlksDU5Mzc2OTIwODg4NTExNzTZIWFwcGxpY2F0aW9uL3ZuZC5wbHV0by50cmVlK29iamVjdJIDkoOoZWxlbWVudHOSkqRsZWZ0kqExqnRleHQvcGxhaW6SpXJpZ2h0kqE1qnRleHQvcGxhaW6kdHlwZapOYW1lZFR1cGxlqG9iamVjdGlksDU5Mzc2OTIwODg4NTExNzTZIWFwcGxpY2F0aW9uL3ZuZC5wbHV0by50cmVlK29iamVjdKR0eXBlpVR1cGxlqG9iamVjdGlksDJjZjRiMWY5OGRhMzFlZDmwcGVyc2lzdF9qc19zdGF0ZcOkbWltZdkhYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0smxhc3RfcnVuX3RpbWVzdGFtcMtB2GziAiHei7doYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SRhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzW5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZQC1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwrFjZWxsX2RlcGVuZGVuY2llc94AItkkN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2ZmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2ZmtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCBqGdldGluZGV4kNkkNmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdkhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdktGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCBqGdldGluZGV4kNkkNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIzhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIztGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCBqGdldGluZGV4kNkkODU5MTg2MDktNWUxZi00MDQwLTk5YmUtNjFjMmRkOGZmNjU0hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkODU5MTg2MDktNWUxZi00MDQwLTk5YmUtNjFjMmRkOGZmNjU0tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCBqGdldGluZGV4kNkkZGFkZjJmNDAtMTc2NC00N2E0LWI1NjAtNjgzYjY0NzlkNzdmhLRwcmVjZWRlbmNlX2hldXJpc3RpYwGnY2VsbF9pZNkkZGFkZjJmNDAtMTc2NC00N2E0LWI1NjAtNjgzYjY0NzlkNzdmtGRvd25zdHJlYW1fY2VsbHNfbWFwgaNQa2eR2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2aydXBzdHJlYW1fY2VsbHNfbWFwiKRCYXNlkKNQa2eR2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2arQF9fTU9EVUxFX1+QtEJhc2UuY3VycmVudF9wcm9qZWN0kKxQa2cuYWN0aXZhdGWQqEBfX0RJUl9fkK5za2lwX2FzX3NjcmlwdJHZJDg4MWI3NWQzLWNlYmUtNGE1My04Y2Y1LWJlYWVlZGRhZmQzNaRUZXh0kNkkNTAyOGZjMDEtNGUxNC00NTUwLThhZTYtNDg3MDNiODZkYzIxhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkNTAyOGZjMDEtNGUxNC00NTUwLThhZTYtNDg3MDNiODZkYzIxtGRvd25zdHJlYW1fY2VsbHNfbWFwgaVCb25kc5HZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N7J1cHN0cmVhbV9jZWxsc19tYXCA2SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzO0ZG93bnN0cmVhbV9jZWxsc19tYXCBp2NvbWJpbmWY2SRhZDVjZmZhNS0zMTNjLTRkZTktOTM2MC0wMDUzNjViNDA3ODDZJGYwODY4MGIyLWVkMjgtNGZhYy04MzhjLTJlY2E3ZTc1YzZkY9kkODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUx2SQzOWJlNjUyZi1iY2Q3LTRhNGYtOGIwMy01MTY3Mjg1ZGM3YTLZJGMzMTc2NTQ5LTdjNDYtNGQ4OS05Yzc2LTgxN2M2YmZjYmI3MdkkMGI2NDNlZDktOTE0YS00NzViLWExY2UtZDg0MGRmMWZjMjIz2SQzMzk2YTViYS01MzNlLTRlMGQtYWI0Zi1jNjMzNDU5YmQ4MWHZJDgyOWY5MGFjLWM0ZDktNGFmOS05ODRhLWI0ZTUyYTA3NTQ2MLJ1cHN0cmVhbV9jZWxsc19tYXDeABelVHVwbGWQpXR1cGxlkK1Db21iaW5lZEJvbmRzkdkkMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY3plN0cmluZ5Cnbm90aGluZ5CmbGVuZ3RokLdIeXBlcnRleHRMaXRlcmFsLlJlc3VsdJCnaXNlbXB0eZCiPT2Qs0Jhc2UuQXNzZXJ0aW9uRXJyb3KQpEBkb2OQoTqQqkJhc2UudGhyb3eQt0h5cGVydGV4dExpdGVyYWwuQnlwYXNzkLhIeXBlcnRleHRMaXRlcmFsLmNvbnRlbnSQpHJhbmSQqEZ1bmN0aW9ukKZTeW1ib2yQpEJhc2WQv0h5cGVydGV4dExpdGVyYWwuYXR0cmlidXRlX3BhaXKQpXB1c2ghkLBIeXBlcnRleHRMaXRlcmFskdkkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBjpVVuaW9ukNkkMzliZTY1MmYtYmNkNy00YTRmLThiMDMtNTE2NzI4NWRjN2EyhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkMzliZTY1MmYtYmNkNy00YTRmLThiMDMtNTE2NzI4NWRjN2EytGRvd25zdHJlYW1fY2VsbHNfbWFwgrdhbm9uOTE1NjMxMDcwNDg2MDM3MzkwM5Csc3BlZWRzX25hbWVkkdkkYzhlMDliZjUtZWFlNC00OTJmLTk0NmUtNGJiNTVmZjdlMTYxsnVwc3RyZWFtX2NlbGxzX21hcI3ZIE1haW4uUGx1dG9SdW5uZXIuQ29yZS5hcHBsaWNhYmxlkKE6kLdIeXBlcnRleHRMaXRlcmFsLkJ5cGFzc5C5TWFpbi5QbHV0b1J1bm5lci5CYXNlLmdldJClQGJpbmSQuEh5cGVydGV4dExpdGVyYWwuY29udGVudJCmU2xpZGVykNkoTWFpbi5QbHV0b1J1bm5lci5QbHV0b1J1bm5lci5jcmVhdGVfYm9uZJCvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2pE1haW6Qp2NvbWJpbmWR2SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzO3SHlwZXJ0ZXh0TGl0ZXJhbC5SZXN1bHSQsEh5cGVydGV4dExpdGVyYWyR2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGPZJDgyOWY5MGFjLWM0ZDktNGFmOS05ODRhLWI0ZTUyYTA3NTQ2MIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDgyOWY5MGFjLWM0ZDktNGFmOS05ODRhLWI0ZTUyYTA3NTQ2MLRkb3duc3RyZWFtX2NlbGxzX21hcIOkY2IyYpHZJGM3YTMyYWIyLTJhNWItNDg1Yi05Nzk1LTRhNzQzNjA0ZGU4MqR3b3d6kdkkYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM1uGFub24xNDgyNjg1ODY5MTA0NDgxMDUzNZCydXBzdHJlYW1fY2VsbHNfbWFwi9kgTWFpbi5QbHV0b1J1bm5lci5Db3JlLmFwcGxpY2FibGWQrUJhc2UuZ2V0aW5kZXiQuU1haW4uUGx1dG9SdW5uZXIuQmFzZS5nZXSQpUBiaW5kkNkoTWFpbi5QbHV0b1J1bm5lci5QbHV0b1J1bm5lci5jcmVhdGVfYm9uZJCvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2pE1haW6QpEJhc2WQqENoZWNrQm94kKNjYjGR2SQzMzk2YTViYS01MzNlLTRlMGQtYWI0Zi1jNjMzNDU5YmQ4MWGnY29tYmluZZHZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM9kkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgyhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgytGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCr0Bza2lwX2FzX3NjcmlwdJHZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNqRjYjJikdkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYw2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjeEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4Nje0ZG93bnN0cmVhbV9jZWxsc19tYXCFtEJvbmRzLnZhbGlkYXRlX3ZhbHVlkKlCYXNlLnNob3eR2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjetQ29tYmluZWRCb25kc5HZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM7VCb25kcy50cmFuc2Zvcm1fdmFsdWWQs0JvbmRzLmluaXRpYWxfdmFsdWWR2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjeydXBzdHJlYW1fY2VsbHNfbWFw3gAhoklPkKdAYXNzZXJ0kKV0dXBsZZCmU3RyaW5nkKN6aXCQpEBodGyQp25vdGhpbmeQpmxlbmd0aJCqTmFtZWRUdXBsZZCmVmVjdG9ykKlCYXNlLnNob3eR2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjehTpC3SHlwZXJ0ZXh0TGl0ZXJhbC5SZXN1bHSQpk5UdXBsZZCiPT2Qp05vdGhpbmeQt0h5cGVydGV4dExpdGVyYWwuQnlwYXNzkLhIeXBlcnRleHRMaXRlcmFsLmNvbnRlbnSQqUBNSU1FX3N0cpC6SHlwZXJ0ZXh0TGl0ZXJhbC5TY3JpcHRUYWeQq0Jhc2UuQGt3ZGVmkLZzZXRfaW5wdXRfdmFsdWVfY29tcGF0kdkkOTU3ODU4ZjgtNGFjZS00Y2FlLWJiMTYtNDk1NjlkYWE5ODY5o2FsbJCjaXNhkL9IeXBlcnRleHRMaXRlcmFsLmF0dHJpYnV0ZV9wYWlykKRCYXNlkKNBbnmQoz09PZCzQm9uZHMuaW5pdGlhbF92YWx1ZZHZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N6VCb25kc5HZJDUwMjhmYzAxLTRlMTQtNDU1MC04YWU2LTQ4NzAzYjg2ZGMyMbBIeXBlcnRleHRMaXRlcmFskdkkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBjplN5bWJvbJClVW5pb26Q2SQzMzk2YTViYS01MzNlLTRlMGQtYWI0Zi1jNjMzNDU5YmQ4MWGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQzMzk2YTViYS01MzNlLTRlMGQtYWI0Zi1jNjMzNDU5YmQ4MWG0ZG93bnN0cmVhbV9jZWxsc19tYXCCo2NiMZHZJDgyOWY5MGFjLWM0ZDktNGFmOS05ODRhLWI0ZTUyYTA3NTQ2MLdhbm9uMTI3MTIyNjQwNjg5ODQ4NzkzN5CydXBzdHJlYW1fY2VsbHNfbWFwh69Ac2tpcF9hc19zY3JpcHSR2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzatQmFzZS5nZXRpbmRleJCkQmFzZZChOpCnY29tYmluZZHZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM6ZTbGlkZXKQqlNjcnViYmFibGWQ2SQ5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjG0ZG93bnN0cmVhbV9jZWxsc19tYXCBr0Bvbmx5X2FzX3NjcmlwdJCydXBzdHJlYW1fY2VsbHNfbWFwhKNlc2OQql9fbW9kdWxlX1+QrnNraXBfYXNfc2NyaXB0kdkkODgxYjc1ZDMtY2ViZS00YTUzLThjZjUtYmVhZWVkZGFmZDM1p25vdGhpbmeQ2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGOEtHByZWNlZGVuY2VfaGV1cmlzdGljB6djZWxsX2lk2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGO0ZG93bnN0cmVhbV9jZWxsc19tYXCBsEh5cGVydGV4dExpdGVyYWyX2SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzPZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N9kkOTU3ODU4ZjgtNGFjZS00Y2FlLWJiMTYtNDk1NjlkYWE5ODY52SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTHZJDM5YmU2NTJmLWJjZDctNGE0Zi04YjAzLTUxNjcyODVkYzdhMtkkYzMxNzY1NDktN2M0Ni00ZDg5LTljNzYtODE3YzZiZmNiYjcx2SQwYjY0M2VkOS05MTRhLTQ3NWItYTFjZS1kODQwZGYxZmMyMjOydXBzdHJlYW1fY2VsbHNfbWFwgNkkOTU3ODU4ZjgtNGFjZS00Y2FlLWJiMTYtNDk1NjlkYWE5ODY5hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOTU3ODU4ZjgtNGFjZS00Y2FlLWJiMTYtNDk1NjlkYWE5ODY5tGRvd25zdHJlYW1fY2VsbHNfbWFwgbZzZXRfaW5wdXRfdmFsdWVfY29tcGF0kdkkMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY3snVwc3RyZWFtX2NlbGxzX21hcIK7SHlwZXJ0ZXh0TGl0ZXJhbC5KYXZhU2NyaXB0kLBIeXBlcnRleHRMaXRlcmFskdkkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBj2SQ4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzWEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzW0ZG93bnN0cmVhbV9jZWxsc19tYXCBrnNraXBfYXNfc2NyaXB0k9kkOWU1NmRiYjktMmU5My00MTM2LWIxMGItN2IxZWNiMDdlNmYx2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2bZJDM4YjdlZWI5LTgwYmItNGEzYS1hMmQyLTgwOWZjNDIzNjI1Y7J1cHN0cmVhbV9jZWxsc19tYXCFpk1vZHVsZZCkTWFpbpCscGFyZW50bW9kdWxlkKI9PZCpaXNkZWZpbmVkkNkkODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUxhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUxtGRvd25zdHJlYW1fY2VsbHNfbWFwgqZzcGVlZHOR2SRkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODK2YW5vbjMxODU5MTgzNzYyMTY0ODc4NpCydXBzdHJlYW1fY2VsbHNfbWFwjdkgTWFpbi5QbHV0b1J1bm5lci5Db3JlLmFwcGxpY2FibGWQoTqQt0h5cGVydGV4dExpdGVyYWwuQnlwYXNzkLlNYWluLlBsdXRvUnVubmVyLkJhc2UuZ2V0kKVAYmluZJC4SHlwZXJ0ZXh0TGl0ZXJhbC5jb250ZW50kKZTbGlkZXKQ2ShNYWluLlBsdXRvUnVubmVyLlBsdXRvUnVubmVyLmNyZWF0ZV9ib25kkK9Ac2tpcF9hc19zY3JpcHSR2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzakTWFpbpCnY29tYmluZZHZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM7dIeXBlcnRleHRMaXRlcmFsLlJlc3VsdJCwSHlwZXJ0ZXh0TGl0ZXJhbJHZJDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwY9kkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCBp2NvbWJpbmWR2SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzPZJDEyN2RkNThiLTliYTAtNDFkOC05MWU2LTM1N2Q5ZWM2M2U2YoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDEyN2RkNThiLTliYTAtNDFkOC05MWU2LTM1N2Q5ZWM2M2U2YrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwhK9Ac2tpcF9hc19zY3JpcHSR2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzalcHVzaCGQpGl0dnOR2SQwYjY0M2VkOS05MTRhLTQ3NWItYTFjZS1kODQwZGYxZmMyMjOjaXR2kdkkMGI2NDNlZDktOTE0YS00NzViLWExY2UtZDg0MGRmMWZjMjIz2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWOEtHByZWNlZGVuY2VfaGV1cmlzdGljB6djZWxsX2lk2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWO0ZG93bnN0cmVhbV9jZWxsc19tYXCBp1BsdXRvVUmQsnVwc3RyZWFtX2NlbGxzX21hcIKrQF9fTU9EVUxFX1+QrnNraXBfYXNfc2NyaXB0kdkkODgxYjc1ZDMtY2ViZS00YTUzLThjZjUtYmVhZWVkZGFmZDM12SQwYjY0M2VkOS05MTRhLTQ3NWItYTFjZS1kODQwZGYxZmMyMjOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQwYjY0M2VkOS05MTRhLTQ3NWItYTFjZS1kODQwZGYxZmMyMjO0ZG93bnN0cmVhbV9jZWxsc19tYXCEt2Fub243MzM2MDA2Njg1MTA0MzM4MTk0kKNpdGKR2SQ1OWExOTlmNC00Y2NjLTQzMTktOWQzMi0wM2RhM2FkYmI1ZGKkaXR2c5HZJDEyN2RkNThiLTliYTAtNDFkOC05MWU2LTM1N2Q5ZWM2M2U2YqNpdHaR2SQxMjdkZDU4Yi05YmEwLTQxZDgtOTFlNi0zNTdkOWVjNjNlNmKydXBzdHJlYW1fY2VsbHNfbWFwj9kgTWFpbi5QbHV0b1J1bm5lci5Db3JlLmFwcGxpY2FibGWQt0h5cGVydGV4dExpdGVyYWwuQnlwYXNzkLlNYWluLlBsdXRvUnVubmVyLkJhc2UuZ2V0kKVAYmluZJC4SHlwZXJ0ZXh0TGl0ZXJhbC5jb250ZW50kKN0YW6QplNsaWRlcpDZKE1haW4uUGx1dG9SdW5uZXIuUGx1dG9SdW5uZXIuY3JlYXRlX2JvbmSQr0Bza2lwX2FzX3NjcmlwdJHZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNqRNYWlukKdjb21iaW5lkdkkYTIwZGExOGYtN2E3NC00M2NhLTliNjYtMWYzYjgyZWZhMGMzt0h5cGVydGV4dExpdGVyYWwuUmVzdWx0kLBIeXBlcnRleHRMaXRlcmFskdkkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBjo2Nvc5Cjc2lukNkkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVhhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVhtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCr0Bza2lwX2FzX3NjcmlwdJHZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNqZ2YWx1ZXOR2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGPZJGNjM2U0NzVlLWQyYzItNGI0MC1hMWJhLTAzMzU3NmFlZmRhZYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGNjM2U0NzVlLWQyYzItNGI0MC1hMWJhLTAzMzU3NmFlZmRhZbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgahnZXRpbmRleJDZJDUzMDBiODBkLTQwOTctNGI4NS1hZDJhLTNhNTRiMDE1NTliZoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDUzMDBiODBkLTQwOTctNGI4NS1hZDJhLTNhNTRiMDE1NTliZrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwg69Ac2tpcF9hc19zY3JpcHSR2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1Mzalc2xlZXCQqHRvZ2V0aGVykdkkYzMxNzY1NDktN2M0Ni00ZDg5LTljNzYtODE3YzZiZmNiYjcx2SQzZDNhNmFiYi1iZWE3LTQxZTItODYyZC05NTM2YTk2ODdlYTWEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQzZDNhNmFiYi1iZWE3LTQxZTItODYyZC05NTM2YTk2ODdlYTW0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIGoZ2V0aW5kZXiQ2SRjMzE3NjU0OS03YzQ2LTRkODktOWM3Ni04MTdjNmJmY2JiNzGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRjMzE3NjU0OS03YzQ2LTRkODktOWM3Ni04MTdjNmJmY2JiNzG0ZG93bnN0cmVhbV9jZWxsc19tYXCDuGFub24xNjk5Mjc3NTk3MzUxMjE2NTgwMpCodG9nZXRoZXKR2SQ1MzAwYjgwZC00MDk3LTRiODUtYWQyYS0zYTU0YjAxNTU5YmaicmKR2SQ2ZDRmNjJhNi1lM2Q5LTQxNmYtYTFlMy02OTRjMzFjZmJiMzGydXBzdHJlYW1fY2VsbHNfbWFw3gAS2SBNYWluLlBsdXRvUnVubmVyLkNvcmUuYXBwbGljYWJsZZChOpC3SHlwZXJ0ZXh0TGl0ZXJhbC5CeXBhc3OQuU1haW4uUGx1dG9SdW5uZXIuQmFzZS5nZXSQpUBiaW5kkLhIeXBlcnRleHRMaXRlcmFsLmNvbnRlbnSQo3RhbpCmU2xpZGVykNkoTWFpbi5QbHV0b1J1bm5lci5QbHV0b1J1bm5lci5jcmVhdGVfYm9uZJCvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2pE1haW6QqVRleHRGaWVsZJCnY29tYmluZZHZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM7dIeXBlcnRleHRMaXRlcmFsLlJlc3VsdJCwSHlwZXJ0ZXh0TGl0ZXJhbJHZJDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwY6Njb3OQo3NpbpCqU2NydWJiYWJsZZDZJDU5YTE5OWY0LTRjY2MtNDMxOS05ZDMyLTAzZGEzYWRiYjVkYoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDU5YTE5OWY0LTRjY2MtNDMxOS05ZDMyLTAzZGEzYWRiYjVkYrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgq9Ac2tpcF9hc19zY3JpcHSR2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzajaXRikdkkMGI2NDNlZDktOTE0YS00NzViLWExY2UtZDg0MGRmMWZjMjIz2SQ2ZDRmNjJhNi1lM2Q5LTQxNmYtYTFlMy02OTRjMzFjZmJiMzGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ2ZDRmNjJhNi1lM2Q5LTQxNmYtYTFlMy02OTRjMzFjZmJiMzG0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2onJikdkkYzMxNzY1NDktN2M0Ni00ZDg5LTljNzYtODE3YzZiZmNiYjcx2SRjOGUwOWJmNS1lYWU0LTQ5MmYtOTQ2ZS00YmI1NWZmN2UxNjGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRjOGUwOWJmNS1lYWU0LTQ5MmYtOTQ2ZS00YmI1NWZmN2UxNjG0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2rHNwZWVkc19uYW1lZJHZJDM5YmU2NTJmLWJjZDctNGE0Zi04YjAzLTUxNjcyODVkYzdhMtkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2tGRvd25zdHJlYW1fY2VsbHNfbWFwga9Ac2tpcF9hc19zY3JpcHTcABDZJGYwODY4MGIyLWVkMjgtNGZhYy04MzhjLTJlY2E3ZTc1YzZkY9kkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVh2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTHZJGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MtkkMzliZTY1MmYtYmNkNy00YTRmLThiMDMtNTE2NzI4NWRjN2Ey2SRjOGUwOWJmNS1lYWU0LTQ5MmYtOTQ2ZS00YmI1NWZmN2UxNjHZJGMzMTc2NTQ5LTdjNDYtNGQ4OS05Yzc2LTgxN2M2YmZjYmI3MdkkNTMwMGI4MGQtNDA5Ny00Yjg1LWFkMmEtM2E1NGIwMTU1OWJm2SQ2ZDRmNjJhNi1lM2Q5LTQxNmYtYTFlMy02OTRjMzFjZmJiMzHZJDBiNjQzZWQ5LTkxNGEtNDc1Yi1hMWNlLWQ4NDBkZjFmYzIyM9kkNTlhMTk5ZjQtNGNjYy00MzE5LTlkMzItMDNkYTNhZGJiNWRi2SQxMjdkZDU4Yi05YmEwLTQxZDgtOTFlNi0zNTdkOWVjNjNlNmLZJDMzOTZhNWJhLTUzM2UtNGUwZC1hYjRmLWM2MzM0NTliZDgxYdkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYw2SRhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzXZJGM3YTMyYWIyLTJhNWItNDg1Yi05Nzk1LTRhNzQzNjA0ZGU4MrJ1cHN0cmVhbV9jZWxsc19tYXCHpEBkb2OQpVR1cGxlkKNlc2OQpVVuaW9ukKpfX21vZHVsZV9fkKNBbnmQp25vdGhpbmeQ2SRjY2JlNDQyMy04MDFiLTRjMjAtYWQyZC1lZTg5ZDVjZmE4NTmEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRjY2JlNDQyMy04MDFiLTRjMjAtYWQyZC1lZTg5ZDVjZmE4NTm0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIGoZ2V0aW5kZXiQ2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGO0ZG93bnN0cmVhbV9jZWxsc19tYXCCuGFub24xMzc5MDc5NTY1OTEwOTQ0NDgyNJCmdmFsdWVzkdkkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVhsnVwc3RyZWFtX2NlbGxzX21hcIzZIE1haW4uUGx1dG9SdW5uZXIuQ29yZS5hcHBsaWNhYmxlkK1CYXNlLmdldGluZGV4kKE6kLlNYWluLlBsdXRvUnVubmVyLkJhc2UuZ2V0kKVAYmluZJCmU2xpZGVykNkoTWFpbi5QbHV0b1J1bm5lci5QbHV0b1J1bm5lci5jcmVhdGVfYm9uZJCvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2pE1haW6QpEJhc2WQqENoZWNrQm94kKdjb21iaW5lkdkkYTIwZGExOGYtN2E3NC00M2NhLTliNjYtMWYzYjgyZWZhMGMz2SRkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODKEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODK0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2pnNwZWVkc5HZJDgwMWZiMDIxLTczYTAtNDExNC1hMzZhLTMyOGU4NGYwMGI1MdkkYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM1hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM1tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCr0Bza2lwX2FzX3NjcmlwdJHZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNqR3b3d6kdkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwtGNlbGxfZXhlY3V0aW9uX29yZGVy3AAi2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGPZJDg4MWI3NWQzLWNlYmUtNGE1My04Y2Y1LWJlYWVlZGRhZmQzNdkkZGFkZjJmNDAtMTc2NC00N2E0LWI1NjAtNjgzYjY0NzlkNzdm2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWPZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNtkkOWU1NmRiYjktMmU5My00MTM2LWIxMGItN2IxZWNiMDdlNmYx2SQ1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjHZJGNjYmU0NDIzLTgwMWItNGMyMC1hZDJkLWVlODlkNWNmYTg1OdkkODU5MTg2MDktNWUxZi00MDQwLTk5YmUtNjFjMmRkOGZmNjU02SQ5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4NjnZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N9kkYTIwZGExOGYtN2E3NC00M2NhLTliNjYtMWYzYjgyZWZhMGMz2SRhZDVjZmZhNS0zMTNjLTRkZTktOTM2MC0wMDUzNjViNDA3ODDZJDZjOGEwM2U0LTdkOGUtNGFhNC1hNzUwLTdiODE1NjIyMTQ3ZNkkZjA4NjgwYjItZWQyOC00ZmFjLTgzOGMtMmVjYTdlNzVjNmRj2SQ4ZGNiMjQ5OC0wMGNmLTQ5YTgtODA3NC0zMDFmZTg4Yjc2ZWHZJDgwMWZiMDIxLTczYTAtNDExNC1hMzZhLTMyOGU4NGYwMGI1MdkkZDc5ODU4NDQtNTk0NC00MmI5LWFkNDEtNTk5Y2Q3MmVlYTgy2SQzOWJlNjUyZi1iY2Q3LTRhNGYtOGIwMy01MTY3Mjg1ZGM3YTLZJGM4ZTA5YmY1LWVhZTQtNDkyZi05NDZlLTRiYjU1ZmY3ZTE2MdkkYzMxNzY1NDktN2M0Ni00ZDg5LTljNzYtODE3YzZiZmNiYjcx2SQ1MzAwYjgwZC00MDk3LTRiODUtYWQyYS0zYTU0YjAxNTU5YmbZJDZkNGY2MmE2LWUzZDktNDE2Zi1hMWUzLTY5NGMzMWNmYmIzMdkkNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIz2SQzZDNhNmFiYi1iZWE3LTQxZTItODYyZC05NTM2YTk2ODdlYTXZJDBiNjQzZWQ5LTkxNGEtNDc1Yi1hMWNlLWQ4NDBkZjFmYzIyM9kkNTlhMTk5ZjQtNGNjYy00MzE5LTlkMzItMDNkYTNhZGJiNWRi2SRjYzNlNDc1ZS1kMmMyLTRiNDAtYTFiYS0wMzM1NzZhZWZkYWXZJDEyN2RkNThiLTliYTAtNDFkOC05MWU2LTM1N2Q5ZWM2M2U2YtkkN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2Zm2SQzMzk2YTViYS01MzNlLTRlMGQtYWI0Zi1jNjMzNDU5YmQ4MWHZJDgyOWY5MGFjLWM0ZDktNGFmOS05ODRhLWI0ZTUyYTA3NTQ2MNkkYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM12SRjN2EzMmFiMi0yYTViLTQ4NWItOTc5NS00YTc0MzYwNGRlODK0bGFzdF9ob3RfcmVsb2FkX3RpbWXLAAAAAAAAAACpc2hvcnRwYXRoqkNvbWJpbmUuamyucHJvY2Vzc19zdGF0dXOlcmVhZHmkcGF0aNkvL1VzZXJzL2ZvbnMvRG9jdW1lbnRzL1BsdXRvVUkuamwvc3JjL0NvbWJpbmUuamyubGFzdF9zYXZlX3RpbWXLQdhs4gIhAHqqY2VsbF9vcmRlctwAItkkODgxYjc1ZDMtY2ViZS00YTUzLThjZjUtYmVhZWVkZGFmZDM12SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzbZJDllNTZkYmI5LTJlOTMtNDEzNi1iMTBiLTdiMWVjYjA3ZTZmMdkkZGFkZjJmNDAtMTc2NC00N2E0LWI1NjAtNjgzYjY0NzlkNzdm2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGPZJDUwMjhmYzAxLTRlMTQtNDU1MC04YWU2LTQ4NzAzYjg2ZGMyMdkkY2NiZTQ0MjMtODAxYi00YzIwLWFkMmQtZWU4OWQ1Y2ZhODU52SRhZDVjZmZhNS0zMTNjLTRkZTktOTM2MC0wMDUzNjViNDA3ODDZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM9kkODU5MTg2MDktNWUxZi00MDQwLTk5YmUtNjFjMmRkOGZmNjU02SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjfZJDk1Nzg1OGY4LTRhY2UtNGNhZS1iYjE2LTQ5NTY5ZGFhOTg2OdkkNmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdk2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWPZJGYwODY4MGIyLWVkMjgtNGZhYy04MzhjLTJlY2E3ZTc1YzZkY9kkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVh2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTHZJGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MtkkMzliZTY1MmYtYmNkNy00YTRmLThiMDMtNTE2NzI4NWRjN2Ey2SRjOGUwOWJmNS1lYWU0LTQ5MmYtOTQ2ZS00YmI1NWZmN2UxNjHZJGMzMTc2NTQ5LTdjNDYtNGQ4OS05Yzc2LTgxN2M2YmZjYmI3MdkkNTMwMGI4MGQtNDA5Ny00Yjg1LWFkMmEtM2E1NGIwMTU1OWJm2SQ2ZDRmNjJhNi1lM2Q5LTQxNmYtYTFlMy02OTRjMzFjZmJiMzHZJDVhMDE5NmQwLWUxOWYtNDIwMi1iMzZkLTE4YWI5YmU4MzliM9kkM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE12SQwYjY0M2VkOS05MTRhLTQ3NWItYTFjZS1kODQwZGYxZmMyMjPZJDU5YTE5OWY0LTRjY2MtNDMxOS05ZDMyLTAzZGEzYWRiYjVkYtkkY2MzZTQ3NWUtZDJjMi00YjQwLWExYmEtMDMzNTc2YWVmZGFl2SQxMjdkZDU4Yi05YmEwLTQxZDgtOTFlNi0zNTdkOWVjNjNlNmLZJDdkZTUwNDM1LWU5NjItNDQwNS1iMDZkLTgzZmJlOTQzNmNmZtkkMzM5NmE1YmEtNTMzZS00ZTBkLWFiNGYtYzYzMzQ1OWJkODFh2SQ4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjDZJGExYTliMjJmLTlkZjctNGM1Zi1hNzNkLTM4ZTE4NGRhN2MzNdkkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgysXB1Ymxpc2hlZF9vYmplY3RzgKVuYnBrZ4eyaW5zdGFsbGVkX3ZlcnNpb25zgLB0ZXJtaW5hbF9vdXRwdXRzgKdlbmFibGVkwrdyZXN0YXJ0X3JlY29tbWVuZGVkX21zZ8C0cmVzdGFydF9yZXF1aXJlZF9tc2fArWJ1c3lfcGFja2FnZXOQrGluc3RhbnRpYXRlZMKrY2VsbF9pbnB1dHPeACLZJDdkZTUwNDM1LWU5NjItNDQwNS1iMDZkLTgzZmJlOTQzNmNmZoSnY2VsbF9pZNkkN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2ZmsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZJG1kIiIiCiMjIyBDb21iaW5lIGluc2lkZSBjb21iaW5lCiIiIqtjb2RlX2ZvbGRlZMPZJDZjOGEwM2U0LTdkOGUtNGFhNC1hNzUwLTdiODE1NjIyMTQ3ZISnY2VsbF9pZNkkNmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdksHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGW1bWQiIiIKIyMgRXhhbXBsZXMKIiIiq2NvZGVfZm9sZGVkw9kkNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIzhKdjZWxsX2lk2SQ1YTAxOTZkMC1lMTlmLTQyMDItYjM2ZC0xOGFiOWJlODM5YjOwcnVubmluZ19kaXNhYmxlZMKkY29kZbJtZCIiIgojIyBUZXN0cwoiIiKrY29kZV9mb2xkZWTD2SQ4NTkxODYwOS01ZTFmLTQwNDAtOTliZS02MWMyZGQ4ZmY2NTSEp2NlbGxfaWTZJDg1OTE4NjA5LTVlMWYtNDA0MC05OWJlLTYxYzJkZDhmZjY1NLBydW5uaW5nX2Rpc2FibGVkwqRjb2Rltm1kIiIiCiMjIFRoZSBtYWdpYwoiIiKrY29kZV9mb2xkZWTD2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2aEp2NlbGxfaWTZJGRhZGYyZjQwLTE3NjQtNDdhNC1iNTYwLTY4M2I2NDc5ZDc3ZrBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2XhpZiBza2lwX2FzX3NjcmlwdChAX19NT0RVTEVfXykKCWltcG9ydCBQa2cKCVBrZy5hY3RpdmF0ZShCYXNlLmN1cnJlbnRfcHJvamVjdChAX19ESVJfXykpCglUZXh0KCJQcm9qZWN0IGVudiBhY3RpdmUiKQplbmSrY29kZV9mb2xkZWTD2SQ1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjGEp2NlbGxfaWTZJDUwMjhmYzAxLTRlMTQtNDU1MC04YWU2LTQ4NzAzYjg2ZGMyMbBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2SNpbXBvcnQgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5Cb25kc6tjb2RlX2ZvbGRlZMLZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM4SnY2VsbF9pZNkkYTIwZGExOGYtN2E3NC00M2NhLTliNjYtMWYzYjgyZWZhMGMzsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXaD7giIiIKYGBganVsaWEKY29tYmluZShyZW5kZXJfZnVuY3Rpb246OkZ1bmN0aW9uKQpgYGAKCkNvbWJpbmUgbXVsdGlwbGUgaW5wdXQgZWxlbWVudHMgaW50byBvbmUuIFRoZSBjb21iaW5lZCB2YWx1ZXMgYXJlIHNlbnQgdG8gYEBiaW5kYCBhcyBhIHNpbmdsZSB0dXBsZS4KCmByZW5kZXJfZnVuY3Rpb25gIGlzIGEgZnVuY3Rpb24gdGhhdCB5b3Ugd3JpdGUgeW91cnNlbGYsIHRha2UgYSBsb29rIGF0IHRoZSBleGFtcGxlcyBiZWxvdy4KCiMgRXhhbXBsZXMKCiMjIPCfkLYgJiDwn5CxCgpXZSB1c2UgdGhlIFtgZG9gIHN5bnRheF0oaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL2Z1bmN0aW9ucy8jRG8tQmxvY2stU3ludGF4LWZvci1GdW5jdGlvbi1Bcmd1bWVudHMpIHRvIHdyaXRlIG91ciBgcmVuZGVyX2Z1bmN0aW9uYC4gVGhlIGBDaGlsZGAgZnVuY3Rpb24gaXMgd3JhcHBlZCBhcm91bmQgZWFjaCBpbnB1dCwgdG8gbGV0IGBjb21iaW5lYCBrbm93IHdoaWNoIHZhbHVlcyB0byBjb21iaW5lLgoKYGBganVsaWEKQGJpbmQgdmFsdWVzIGNvbWJpbmUoKSBkbyBDaGlsZAoJbWQiIlwiCgkjIEhpIHRoZXJlIQoKCUkgaGF2ZSBcJCgKCQlDaGlsZChTbGlkZXIoMToxMCkpCgkpIGRvZ3MgYW5kIFwkKAoJCUNoaWxkKFNsaWRlcig1OjEwMCkpCgkpIGNhdHMuCgoJV291bGQgeW91IGxpa2UgdG8gc2VlIHRoZW0/IFwkKENoaWxkKENoZWNrQm94KHRydWUpKSkKCSIiXCIKZW5kCgp2YWx1ZXMgPT0gKDEsIDUsIHRydWUpICMgKGluaXRpYWxseSkKYGBgCgoKPiBUaGUgb3V0cHV0IGxvb2tzIGxpa2U6Cj4gCj4gIVtzY3JlZW5zaG90IG9mIHJ1bm5pbmcgdGhlIGNvZGUgYWJvdmUgaW5zaWRlIFBsdXRvXShodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS82OTMzNTEwLzE0NTU4OTkxOC0yNWEzYzczMi1jMDJlLTQ4MmItODMxYi0wNjEzMWIyODM1OTcucG5nKQoKIyMg8J+OjwoKClRoZSBgY29tYmluZWAgZnVuY3Rpb24gaXMgbW9zdCB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBnZW5lcmF0ZSB5b3VyIGlucHV0IGVsZW1lbnRzIF9keW5hbWljYWxseV8uIFRoaXMgZXhhbXBsZSB1c2VzIFtIeXBlcnRleHRMaXRlcmFsLmpsXShodHRwczovL2dpdGh1Yi5jb20vTWVjaGFuaWNhbFJhYmJpdC9IeXBlcnRleHRMaXRlcmFsLmpsKSBmb3IgdGhlIGBAaHRsYCBtYWNybzoKCmBgYGp1bGlhCkBiaW5kIHNwZWVkcyBjb21iaW5lKCkgZG8gQ2hpbGQKCUBodGwoIiJcIgoJPGg2PldpbmQgc3BlZWRzPC9oNj4KCTx1bD4KCVwkKFsKCQlAaHRsKCI8bGk+XCQobmFtZSk6IFwkKENoaWxkKFNsaWRlcigxOjEwMCkpKTwvbGk+IikKCQlmb3IgbmFtZSBpbiBbIk5vcnRoIiwgIkVhc3QiLCAiU291dGgiLCAiV2VzdCJdCgldKQoJPC91bD4KCSIiXCIpCmVuZAoKc3BlZWRzID09ICgxLCAxLCAxLCAxKSAjIChpbml0aWFsbHkpCgojIGFmdGVyIG1vdmluZyB0aGUgc2xpZGVyczoKc3BlZWRzID09ICgxMDAsIDM2LCA3MywgNjApCmBgYAoKPiBUaGUgb3V0cHV0IGxvb2tzIGxpa2U6Cj4gCj4gIVtzY3JlZW5zaG90IG9mIHJ1bm5pbmcgdGhlIGNvZGUgYWJvdmUgaW5zaWRlIFBsdXRvXShodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS82OTMzNTEwLzE0NTU4ODYxMi0xNDgyNDY1NC01YzczLTQ1ZjgtOTgzYy04OTEzYzcxMDFhNzgucG5nKQoKCiMgTmFtZWQgdmFyaWFudAoKSW4gdGhlIGxhc3QgZXhhbXBsZSwgd2UgdXNlZCBgQ2hpbGRgIHRvIHdyYXAgYXJvdW5kIGNvbnRhaW5lZCBpbnB1dHM6CmBgYGp1bGlhCkNoaWxkKFNsaWRlcigxOjEwMCkpCmBgYApXZSBjYW4gYWxzbyB1c2UgdGhlICoqbmFtZWQgdmFyaWFudCoqLCB3aGljaCBsb29rcyBsaWtlOgpgYGBqdWxpYQpDaGlsZCgiRWFzdCIsIFNsaWRlcigxOjEwMCkpCmBgYAoKV2hlbiB5b3UgdXNlIHRoZSAqbmFtZWQgdmFyaWFudCogZm9yIGFsbCBjaGlsZHJlbiwgKip0aGUgYm91bmQgdmFsdWUgd2lsbCBiZSBgTmFtZWRUdXBsZWAsIGluc3RlYWQgb2YgYSBgVHVwbGVgKiouCgpMZXQncyByZXdyaXRlIG91ciBleGFtcGxlIHRvIHVzZSB0aGUgKm5hbWVkIHZhcmlhbnQqOgoKYGBganVsaWEKQGJpbmQgc3BlZWRzIGNvbWJpbmUoKSBkbyBDaGlsZAoJQGh0bCgiIlwiCgk8aDY+V2luZCBzcGVlZHM8L2g2PgoJPHVsPgoJXCQoWwoJCUBodGwoIjxsaT5cJChuYW1lKTogXCQoQ2hpbGQobmFtZSwgU2xpZGVyKDE6MTAwKSkpPC9saT4iKQoJCWZvciBuYW1lIGluIFsiTm9ydGgiLCAiRWFzdCIsICJTb3V0aCIsICJXZXN0Il0KCV0pCgk8L3VsPgoJIiJcIikKZW5kCgpzcGVlZHMgPT0gKE5vcnRoPTEsIEVhc3Q9MSwgU291dGg9MSwgV2VzdD0xKSAjIChpbml0aWFsbHkpCgojIGFmdGVyIG1vdmluZyB0aGUgc2xpZGVyczoKc3BlZWRzID09IChOb3J0aD0xMDAsIEVhc3Q9MzYsIFNvdXRoPTczLCBXZXN0PTYwKQoKbWQiVGhlIEVhc3Rlcm4gd2luZCBzcGVlZCBpcyBcJChzcGVlZHMuRWFzdCkuIgpgYGAKCgoKIyBXaHk/ClRoZSBzdGFuZGFyZCB3YXkgdG8gY29tYmluZSBtdWx0aXBsZSBpbnB1dHMgaW50byBvbmUgb3V0cHV0IGlzIHRvIHVzZSBgQGJpbmRgIG11bHRpcGxlIHRpbWVzLiBPdXIgaW5pdGlhbCBleGFtcGxlIGNvdWxkIG1vcmUgZWFzaWx5IGJlIHdyaXR0ZW4gYXM6CmBgYGp1bGlhCm1kIiJcIgojIEhpIHRoZXJlIQoKSSBoYXZlIFwkKEBiaW5kIG51bV9kb2dzIFNsaWRlcigxOjEwKSkgZG9ncyBhbmQgXCQoQGJpbmQgbnVtX2NhdHMgU2xpZGVyKDU6MTApKSBjYXRzLgoKV291bGQgeW91IGxpa2UgdG8gc2VlIHRoZW0/IFwkKEBiaW5kIHdhbnRfdG9fc2VlIENoZWNrQm94KHRydWUpKQoiIlwiCmBgYAoKVGhlIGBjb21iaW5lYCBmdW5jdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgYXJlIGdlbmVyYXRpbmcgaW5wdXRzICoqZHluYW1pY2FsbHkqKiwgbGlrZSBpbiBvdXIgc2Vjb25kIGV4YW1wbGUuIFRoaXMgaXMgdXNlZnVsIHdoZW46Ci0gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIHZlcnkgbGFyZ2UsIGFuZCB5b3UgZG9uJ3Qgd2FudCB0byB3cml0ZSBgQGJpbmQgcGFyYW1ldGVyMSAuLi5gLCBgQGJpbmQgcGFyYW1ldGVyMiAuLi5gLCBldGMuIAotIFRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpcyBkeW5hbWljISBGb3IgZXhhbXBsZSwgeW91IGNhbiBsb2FkIGluIGEgdGFibGUgaW4gb25lIGNlbGwsIGFuZCB0aGVuIHVzZSBgY29tYmluZWAgaW4gYW5vdGhlciBjZWxsIHRvIHNlbGVjdCB3aGljaCByb3dzIHlvdSB3YW50IHRvIHVzZS4KCiIiIgpmdW5jdGlvbiBjb21iaW5lKGY6OkZ1bmN0aW9uKQoJa2V5ID0gU3RyaW5nKHJhbmQoJ2EnOid6JywgMTApKQoKCWNhcHR1cmVkX25hbWVzID0gU3ltYm9sW10KCWNhcHR1cmVkX2JvbmRzID0gW10KCglmdW5jdGlvbiBjb21iaW5lZF9jaGlsZCh4KQoJCXB1c2ghKGNhcHR1cmVkX2JvbmRzLCB4KQoJCUBodGwoIiIiPHBsLWNvbWJpbmVkX2NoaWxkIGtleT0kKGtleSk+JCh4KTwvcGwtY29tYmluZWRfY2hpbGQ+IiIiKQoJZW5kCglmdW5jdGlvbiBjb21iaW5lZF9jaGlsZChuYW1lOjpVbmlvbntTdHJpbmcsU3ltYm9sfSwgeCkKCQlwdXNoIShjYXB0dXJlZF9uYW1lcywgU3ltYm9sKG5hbWUpKQoJCWNvbWJpbmVkX2NoaWxkKHgpCgllbmQKCglyZXN1bHQgPSBmKGNvbWJpbmVkX2NoaWxkKQoKCUBhc3NlcnQgaXNlbXB0eShjYXB0dXJlZF9uYW1lcykgfHwgbGVuZ3RoKGNhcHR1cmVkX25hbWVzKSA9PSBsZW5ndGgoY2FwdHVyZWRfYm9uZHMpICJTb21lIGNoaWxkcmVuIGRvIG5vdCBoYXZlIGEgbmFtZS4gTWFrZSBzdXJlIHRoYXQgYWxsIGNhbGxzIG9mIGBDaGlsZGAgcHJvdmlkZSB0d28gYXJndW1lbnRzLiIKCQoJQ29tYmluZWRCb25kcyg7CgkJc2VjcmV0X2tleSA9IGtleSwKCQljYXB0dXJlZF9uYW1lcyA9IGlzZW1wdHkoY2FwdHVyZWRfbmFtZXMpID8gbm90aGluZyA6IHR1cGxlKGNhcHR1cmVkX25hbWVzLi4uKSwKCQljYXB0dXJlZF9ib25kcyA9IGNhcHR1cmVkX2JvbmRzLAoJCWRpc3BsYXlfY29udGVudCA9IHJlc3VsdCwKCSkKZW5kq2NvZGVfZm9sZGVkwtkkMzliZTY1MmYtYmNkNy00YTRmLThiMDMtNTE2NzI4NWRjN2EyhKdjZWxsX2lk2SQzOWJlNjUyZi1iY2Q3LTRhNGYtOGIwMy01MTY3Mjg1ZGM3YTKwcnVubmluZ19kaXNhYmxlZMKkY29kZdnbQHNraXBfYXNfc2NyaXB0IEBiaW5kIHNwZWVkc19uYW1lZCBjb21iaW5lKCkgZG8gQ2hpbGQKCUBodGwoIiIiCgk8aDM+V2luZCBzcGVlZHM8L2gzPgoJPHVsPgoJJChbCgkJQGh0bCgiPGxpPiQobmFtZSk6ICQoQ2hpbGQobmFtZSwgU2xpZGVyKDE6MTAwKSkpIikKCQlmb3IgbmFtZSBpbiBbIk5vcnRoIiwgIkVhc3QiLCAiU291dGgiLCAiV2VzdCJdCgldKQoJPC91bD4KCSIiIikKZW5kq2NvZGVfZm9sZGVkwtkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwhKdjZWxsX2lk2SQ4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjCwcnVubmluZ19kaXNhYmxlZMKkY29kZdmdQHNraXBfYXNfc2NyaXB0IGNiMmIgPSBAYmluZCB3b3d6IGNvbWJpbmUoKSBkbyBDaGlsZAoJbWQiIiIKCURvIGEgdGhpbmc6ICQoQ2hpbGQoQ2hlY2tCb3goKSkpCgkKCSMjIyMgVXAKCSQoQ2hpbGQoY2IxKSkKCgkjIyMjIERvd24KCSQoQ2hpbGQoY2IxKSkKCQoJIiIiCmVuZKtjb2RlX2ZvbGRlZMLZJGM3YTMyYWIyLTJhNWItNDg1Yi05Nzk1LTRhNzQzNjA0ZGU4MoSnY2VsbF9pZNkkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgysHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGW0QHNraXBfYXNfc2NyaXB0IGNiMmKrY29kZV9mb2xkZWTC2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjeEp2NlbGxfaWTZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N7BydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2gimYmVnaW4KCUJhc2UuQGt3ZGVmIHN0cnVjdCBDb21iaW5lZEJvbmRzCgkJZGlzcGxheV9jb250ZW50OjpBbnkKCQljYXB0dXJlZF9uYW1lczo6VW5pb257Tm90aGluZyxOVHVwbGV7TixTeW1ib2x9IHdoZXJlIE59CgkJY2FwdHVyZWRfYm9uZHM6OlZlY3RvcntBbnl9CgkJc2VjcmV0X2tleTo6U3RyaW5nCgllbmQKCglmdW5jdGlvbiBCYXNlLnNob3coaW86OklPLCBtOjpNSU1FInRleHQvaHRtbCIsIGNiOjpDb21iaW5lZEJvbmRzKQoJCW91dHB1dCA9IEBodGwoIiIiCgkJPHNwYW4+CgkJJChjYi5kaXNwbGF5X2NvbnRlbnQpCgkJPHNjcmlwdCBpZD0kKGNiLnNlY3JldF9rZXkpPgoJCWNvbnN0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudAoJCWxldCBrZXkgPSAkKGNiLnNlY3JldF9rZXkpCgkJY29uc3QgaW5wdXRzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoYHBsLWNvbWJpbmVkX2NoaWxkW2tleT0nXCR7a2V5fSddID4gKjpmaXJzdC1jaGlsZGApCgkJCgkJY29uc3QgdmFsdWVzID0gQXJyYXkoaW5wdXRzLmxlbmd0aCkKCQkKCQlpbnB1dHMuZm9yRWFjaChhc3luYyAoZWwsaSkgPT4gewoJCQllbC5vbmlucHV0ID0gKGUpID0+IHsKCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCkKCQkJfQoJCQljb25zdCBnZW4gPSBHZW5lcmF0b3JzLmlucHV0KGVsKQoJCQl3aGlsZSh0cnVlKSB7CgkJCQl2YWx1ZXNbaV0gPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCgkJCQlkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJCQl9CgkJfSkKCgoJCWxldCBzZXRfaW5wdXRfdmFsdWUgPSAkKHNldF9pbnB1dF92YWx1ZV9jb21wYXQpCgkKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CgkJCWdldDogKCkgPT4gdmFsdWVzLAoJCQlzZXQ6IChuZXd2YWxzKSA9PiB7CgkJCQlpZighbmV3dmFscykgewoJCQkJCXJldHVybgoJCQkJfQoJCQkJaW5wdXRzLmZvckVhY2goKGVsLCBpKSA9PiB7CgkJCQkJdmFsdWVzW2ldID0gbmV3dmFsc1tpXQoJCQkJCXNldF9pbnB1dF92YWx1ZShlbCwgbmV3dmFsc1tpXSkKCQkJCX0pCgkJfSwKCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCX0pOwoJCgkJPC9zY3JpcHQ+CgkJPC9zcGFuPgoJCSIiIikKCQlCYXNlLnNob3coaW8sIG0sIG91dHB1dCkKCWVuZAoKCWZ1bmN0aW9uIEJvbmRzLmluaXRpYWxfdmFsdWUoY2I6OkNvbWJpbmVkQm9uZHMpCgkJdmFscyA9IHR1cGxlKChCb25kcy5pbml0aWFsX3ZhbHVlKGIpIGZvciBiIGluIGNiLmNhcHR1cmVkX2JvbmRzKS4uLikKCgkJaWYgY2IuY2FwdHVyZWRfbmFtZXMgPT09IG5vdGhpbmcKCQkJdmFscwoJCWVsc2UKCQkJTmFtZWRUdXBsZXtjYi5jYXB0dXJlZF9uYW1lc30odmFscykKCQllbmQKCWVuZAoJZnVuY3Rpb24gQm9uZHMudmFsaWRhdGVfdmFsdWUoY2I6OkNvbWJpbmVkQm9uZHMsIGZyb21fanMpCgkJaWYgZnJvbV9qcyBpc2EgVmVjdG9yICYmIGxlbmd0aChmcm9tX2pzKSA9PSBsZW5ndGgoY2IuY2FwdHVyZWRfYm9uZHMpCgkJCWFsbCgoCgkJCQlCb25kcy52YWxpZGF0ZV92YWx1ZShib25kLCB2YWxfanMpCgkJCQlmb3IgKGJvbmQsIHZhbF9qcykgaW4gemlwKGNiLmNhcHR1cmVkX2JvbmRzLCBmcm9tX2pzKQoJCQkpKQoJCWVsc2UKCQkJZmFsc2UKCQllbmQKCWVuZAoJZnVuY3Rpb24gQm9uZHMudHJhbnNmb3JtX3ZhbHVlKGNiOjpDb21iaW5lZEJvbmRzLCBmcm9tX2pzKQoJCUBhc3NlcnQgZnJvbV9qcyBpc2EgVmVjdG9yCgkJQGFzc2VydCBsZW5ndGgoZnJvbV9qcykgPT0gbGVuZ3RoKGNiLmNhcHR1cmVkX2JvbmRzKQoKCQl2YWxzID0gdHVwbGUoKAoJCQlCb25kcy50cmFuc2Zvcm1fdmFsdWUoYm9uZCwgdmFsX2pzKQoJCQlmb3IgKGJvbmQsIHZhbF9qcykgaW4gemlwKGNiLmNhcHR1cmVkX2JvbmRzLCBmcm9tX2pzKQoJCSkuLi4pCgoJCWlmIGNiLmNhcHR1cmVkX25hbWVzID09PSBub3RoaW5nCgkJCXZhbHMKCQllbHNlCgkJCU5hbWVkVHVwbGV7Y2IuY2FwdHVyZWRfbmFtZXN9KHZhbHMpCgkJZW5kCgkJCgkJIyBbCgkJIyAJQm9uZHMudHJhbnNmb3JtX3ZhbHVlKGJvbmQsIHZhbF9qcykKCQkjIAlmb3IgKGJvbmQsIHZhbF9qcykgaW4gemlwKGNiLmNhcHR1cmVkX2JvbmRzLCBmcm9tX2pzKQoJCSMgXQoJZW5kCgkKCSMgVE9ETzoKCSMgZnVuY3Rpb24gQm9uZHMucG9zc2libGVfdmFsdWVzIChjYjo6Q29tYmluZWRCb25kcywgZnJvbV9qcykKCSMgZW5kCgkKZW5kq2NvZGVfZm9sZGVkwtkkMzM5NmE1YmEtNTMzZS00ZTBkLWFiNGYtYzYzMzQ1OWJkODFhhKdjZWxsX2lk2SQzMzk2YTViYS01MzNlLTRlMGQtYWI0Zi1jNjMzNDU5YmQ4MWGwcnVubmluZ19kaXNhYmxlZMKkY29kZdmFQHNraXBfYXNfc2NyaXB0IGNiMSA9IGNvbWJpbmUoKSBkbyBDaGlsZAoJbWQiIiIKCUxlZnQ6ICQoQ2hpbGQoOmxlZnQsIFNsaWRlcigxOjEwKSkpLCByaWdodDogJChDaGlsZCg6cmlnaHQsIFNjcnViYmFibGUoNSkpKQoJIiIiCmVuZKtjb2RlX2ZvbGRlZMLZJDllNTZkYmI5LTJlOTMtNDEzNi1iMTBiLTdiMWVjYjA3ZTZmMYSnY2VsbF9pZNkkOWU1NmRiYjktMmU5My00MTM2LWIxMGItN2IxZWNiMDdlNmYxsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZS21hY3JvIG9ubHlfYXNfc2NyaXB0KGV4KSBza2lwX2FzX3NjcmlwdChfX21vZHVsZV9fKSA/IG5vdGhpbmcgOiBlc2MoZXgpIGVuZKtjb2RlX2ZvbGRlZMPZJDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwY4SnY2VsbF9pZNkkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBjsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGW2dXNpbmcgSHlwZXJ0ZXh0TGl0ZXJhbKtjb2RlX2ZvbGRlZMLZJDk1Nzg1OGY4LTRhY2UtNGNhZS1iYjE2LTQ5NTY5ZGFhOTg2OYSnY2VsbF9pZNkkOTU3ODU4ZjgtNGFjZS00Y2FlLWJiMTYtNDk1NjlkYWE5ODY5sHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXaBhNjb25zdCBzZXRfaW5wdXRfdmFsdWVfY29tcGF0ID0gSHlwZXJ0ZXh0TGl0ZXJhbC5KYXZhU2NyaXB0KCIiIgooKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoiIiIpq2NvZGVfZm9sZGVkw9kkODgxYjc1ZDMtY2ViZS00YTUzLThjZjUtYmVhZWVkZGFmZDM1hKdjZWxsX2lk2SQ4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzWwcnVubmluZ19kaXNhYmxlZMKkY29kZdmrZnVuY3Rpb24gc2tpcF9hc19zY3JpcHQobTo6TW9kdWxlKQoJaWYgaXNkZWZpbmVkKG0sIDpQbHV0b0ZvcmNlRGlzcGxheSkKCQlyZXR1cm4gbS5QbHV0b0ZvcmNlRGlzcGxheQoJZWxzZQoJCWlzZGVmaW5lZChtLCA6UGx1dG9SdW5uZXIpICYmIHBhcmVudG1vZHVsZShtKSA9PSBNYWluCgllbmQKZW5kq2NvZGVfZm9sZGVkw9kkODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUxhKdjZWxsX2lk2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTGwcnVubmluZ19kaXNhYmxlZMKkY29kZdnPQHNraXBfYXNfc2NyaXB0IEBiaW5kIHNwZWVkcyBjb21iaW5lKCkgZG8gQ2hpbGQKCUBodGwoIiIiCgk8aDM+V2luZCBzcGVlZHM8L2gzPgoJPHVsPgoJJChbCgkJQGh0bCgiPGxpPiQobmFtZSk6ICQoQ2hpbGQoU2xpZGVyKDE6MTAwKSkpIikKCQlmb3IgbmFtZSBpbiBbIk5vcnRoIiwgIkVhc3QiLCAiU291dGgiLCAiV2VzdCJdCgldKQoJPC91bD4KCSIiIikKZW5kq2NvZGVfZm9sZGVkwtkkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwhKdjZWxsX2lk2SRhZDVjZmZhNS0zMTNjLTRkZTktOTM2MC0wMDUzNjViNDA3ODCwcnVubmluZ19kaXNhYmxlZMKkY29kZa5leHBvcnQgY29tYmluZatjb2RlX2ZvbGRlZMLZJDEyN2RkNThiLTliYTAtNDFkOC05MWU2LTM1N2Q5ZWM2M2U2YoSnY2VsbF9pZNkkMTI3ZGQ1OGItOWJhMC00MWQ4LTkxZTYtMzU3ZDllYzYzZTZisHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZIEBza2lwX2FzX3NjcmlwdCBwdXNoIShpdHZzLCBpdHYpq2NvZGVfZm9sZGVkwtkkMzhiN2VlYjktODBiYi00YTNhLWEyZDItODA5ZmM0MjM2MjVjhKdjZWxsX2lk2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWOwcnVubmluZ19kaXNhYmxlZMKkY29kZdkxaWYgc2tpcF9hc19zY3JpcHQoQF9fTU9EVUxFX18pCgl1c2luZyBQbHV0b1VJCmVuZKtjb2RlX2ZvbGRlZMLZJDBiNjQzZWQ5LTkxNGEtNDc1Yi1hMWNlLWQ4NDBkZjFmYzIyM4SnY2VsbF9pZNkkMGI2NDNlZDktOTE0YS00NzViLWExY2UtZDg0MGRmMWZjMjIzsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZw0Bza2lwX2FzX3NjcmlwdCBiZWdpbgoJaXR2cyA9IFtdCglpdGIgPSBAYmluZCBpdHYgY29tYmluZSgpIGRvIENoaWxkCgkJQGh0bCgiIiIKCQk8cD5IZWxsbyB3b3JsZCE8L3A+CgkJJChDaGlsZChAaHRsKCI8aW5wdXQgdHlwZT1yYW5nZT4iKSkpCgkJJChDaGlsZChTbGlkZXIoW3NpbiwgY29zLCB0YW5dKSkpCgkJCgkJIiIiKQoJZW5kCmVuZKtjb2RlX2ZvbGRlZMLZJDhkY2IyNDk4LTAwY2YtNDlhOC04MDc0LTMwMWZlODhiNzZlYYSnY2VsbF9pZNkkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVhsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGW2QHNraXBfYXNfc2NyaXB0IHZhbHVlc6tjb2RlX2ZvbGRlZMLZJGNjM2U0NzVlLWQyYzItNGI0MC1hMWJhLTAzMzU3NmFlZmRhZYSnY2VsbF9pZNkkY2MzZTQ3NWUtZDJjMi00YjQwLWExYmEtMDMzNTc2YWVmZGFlsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZMW1kIiIiClNob3VsZCBiZSBgW1ttaXNzaW5nLCBzaW5dLCBbNTAsIHNpbl1dYAoiIiKrY29kZV9mb2xkZWTD2SQ1MzAwYjgwZC00MDk3LTRiODUtYWQyYS0zYTU0YjAxNTU5YmaEp2NlbGxfaWTZJDUzMDBiODBkLTQwOTctNGI4NS1hZDJhLTNhNTRiMDE1NTliZrBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2SxAc2tpcF9hc19zY3JpcHQgbGV0CglzbGVlcCguNSkKCXRvZ2V0aGVyCmVuZKtjb2RlX2ZvbGRlZMLZJDNkM2E2YWJiLWJlYTctNDFlMi04NjJkLTk1MzZhOTY4N2VhNYSnY2VsbF9pZNkkM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE1sHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZJ21kIiIiCiMjIyBJbml0aWFsIHZhbHVlICYgdHJhbnNmb3JtCiIiIqtjb2RlX2ZvbGRlZMPZJGMzMTc2NTQ5LTdjNDYtNGQ4OS05Yzc2LTgxN2M2YmZjYmI3MYSnY2VsbF9pZNkkYzMxNzY1NDktN2M0Ni00ZDg5LTljNzYtODE3YzZiZmNiYjcxsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZykBza2lwX2FzX3NjcmlwdCByYiA9IEBiaW5kIHRvZ2V0aGVyIGNvbWJpbmUoKSBkbyBDaGlsZAoJQGh0bCgiIiIKCTxwPkhlbGxvIHdvcmxkITwvcD4KCSQoQ2hpbGQoVGV4dEZpZWxkKCkpKQoJJChDaGlsZChTbGlkZXIoW3NpbiwgY29zLCB0YW5dKSkpCgkkKFsKCQlDaGlsZChTY3J1YmJhYmxlKDcpKQoJCWZvciBfIGluIDE6MwoJXSkKCQoJIiIiKQplbmSrY29kZV9mb2xkZWTC2SQ1OWExOTlmNC00Y2NjLTQzMTktOWQzMi0wM2RhM2FkYmI1ZGKEp2NlbGxfaWTZJDU5YTE5OWY0LTRjY2MtNDMxOS05ZDMyLTAzZGEzYWRiYjVkYrBydW5uaW5nX2Rpc2FibGVkwqRjb2Rls0Bza2lwX2FzX3NjcmlwdCBpdGKrY29kZV9mb2xkZWTC2SQ2ZDRmNjJhNi1lM2Q5LTQxNmYtYTFlMy02OTRjMzFjZmJiMzGEp2NlbGxfaWTZJDZkNGY2MmE2LWUzZDktNDE2Zi1hMWUzLTY5NGMzMWNmYmIzMbBydW5uaW5nX2Rpc2FibGVkwqRjb2RlskBza2lwX2FzX3NjcmlwdCByYqtjb2RlX2ZvbGRlZMLZJGM4ZTA5YmY1LWVhZTQtNDkyZi05NDZlLTRiYjU1ZmY3ZTE2MYSnY2VsbF9pZNkkYzhlMDliZjUtZWFlNC00OTJmLTk0NmUtNGJiNTVmZjdlMTYxsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGW8QHNraXBfYXNfc2NyaXB0IHNwZWVkc19uYW1lZKtjb2RlX2ZvbGRlZMLZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNoSnY2VsbF9pZNkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2sHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZ+yIiIgoJQHNraXBfYXNfc2NyaXB0IGV4cHJlc3Npb24KCk1hcmtzIGEgZXhwcmVzc2lvbiBhcyBQbHV0by1vbmx5LCB3aGljaCBtZWFucyB0aGF0IGl0IHdvbid0IGJlIGV4ZWN1dGVkIHdoZW4gcnVubmluZyBvdXRzaWRlIFBsdXRvLiBEbyBub3QgdXNlIHRoaXMgZm9yIHlvdXIgb3duIHByb2plY3RzLgoiIiIKbWFjcm8gc2tpcF9hc19zY3JpcHQoZXgpIHNraXBfYXNfc2NyaXB0KF9fbW9kdWxlX18pID8gZXNjKGV4KSA6IG5vdGhpbmcgZW5kq2NvZGVfZm9sZGVkw9kkY2NiZTQ0MjMtODAxYi00YzIwLWFkMmQtZWU4OWQ1Y2ZhODU5hKdjZWxsX2lk2SRjY2JlNDQyMy04MDFiLTRjMjAtYWQyZC1lZTg5ZDVjZmE4NTmwcnVubmluZ19kaXNhYmxlZMKkY29kZbttZCIiIgojIENvbWJpbmluZyBib25kcwoiIiKrY29kZV9mb2xkZWTD2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGOEp2NlbGxfaWTZJGYwODY4MGIyLWVkMjgtNGZhYy04MzhjLTJlY2E3ZTc1YzZkY7BydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2clAc2tpcF9hc19zY3JpcHQgQGJpbmQgdmFsdWVzIGNvbWJpbmUoKSBkbyBDaGlsZAoJbWQiIiIKCSMgSGkgdGhlcmUhCgoJSSBoYXZlICQoQ2hpbGQoU2xpZGVyKDE6MTApKSkgZG9ncyBhbmQgJChDaGlsZChTbGlkZXIoNToxMCkpKSBjYXRzLgoKCVdvdWxkIHlvdSBsaWtlIHRvIHNlZSB0aGVtPyAkKENoaWxkKENoZWNrQm94KHRydWUpKSkKCSIiIgplbmSrY29kZV9mb2xkZWTC2SRkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODKEp2NlbGxfaWTZJGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MrBydW5uaW5nX2Rpc2FibGVkwqRjb2RltkBza2lwX2FzX3NjcmlwdCBzcGVlZHOrY29kZV9mb2xkZWTC2SRhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzWEp2NlbGxfaWTZJGExYTliMjJmLTlkZjctNGM1Zi1hNzNkLTM4ZTE4NGRhN2MzNbBydW5uaW5nX2Rpc2FibGVkwqRjb2RltEBza2lwX2FzX3NjcmlwdCB3b3d6q2NvZGVfZm9sZGVkwqtub3RlYm9va19pZNkkMGE5NzIxNzQtNTlkNi0xMWVjLTAwZTAtZWJjMGE4MGJiYjkwq2luX3RlbXBfZGlywg==";
window.pluto_preamble_html = undefined;
</script>
<!-- [automatically generated launch parameters can be inserted here] -->
<script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/editor.js" type="module" defer></script>
<script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/warn_old_browsers.js"></script>
<script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/common/SetupMathJax.js"></script>
<script type="text/javascript" id="MathJax-script" src="https://cdn.jsdelivr.net/npm/mathjax@3.1.2/es5/tex-svg-full.js" async></script>
</head>
<body class="loading no-MαθJax"></body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width" />
<title>⚡ Pluto.jl ⚡</title>
<meta charset="utf-8" />
<script>
console.log(
"Pluto.jl, by Fons van der Plas (https://github.com/fonsp), Mikołaj Bochenski (https://github.com/malyvsen), Michiel Dral (https://github.com/dralletje) and friends 🌈"
)
</script>
<meta name="theme-color" content="#ffffff" />
<link rel="icon" type="image/png" sizes="16x16" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="96x96" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/favicon-96x96.png" />
<meta name="description" content="Pluto.jl notebooks" />
<link rel="pluto-logo-big" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/logo.svg" />
<link rel="pluto-logo-small" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/img/favicon_unsaturated.svg" />
<link rel="pluto-sw" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/sw.js" />
<script>
navigator.serviceWorker?.register(document.head.querySelector("link[rel='pluto-sw']").getAttribute("href"), { scope: "./" }).catch(console.warn)
</script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js" defer></script>
<script src="https://cdn.jsdelivr.net/npm/@observablehq/stdlib@3.3.1/dist/stdlib.js" defer></script>
<script src="https://cdn.jsdelivr.net/npm/iframe-resizer@4.2.11/js/iframeResizer.min.js" defer></script>
<script src="https://cdn.jsdelivr.net/npm/ansi_up@5.0.1/ansi_up.min.js" defer></script>
<!-- This doesn't do anything unless activated, and it makes sure parcel bundles this -->
<script id="iframe-resizer-content-window-script" src="https://cdn.jsdelivr.net/npm/iframe-resizer@4.2.11/js/iframeResizer.contentWindow.min.js" crossorigin="anonymous" defer></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/editor.css" type="text/css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/hide-ui.css" type="text/css" media="all" data-pluto-file="hide-ui" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/binder.css" type="text/css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/treeview.css" type="text/css" />
<link rel="preload" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/juliamono.css" as="style" />
<link rel="preload" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/vollkorn.css" as="style" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.2.0/build/styles/atom-one-light.min.css" />
<script data-pluto-file="launch-parameters">
window.pluto_notebook_id = undefined;
window.pluto_isolated_cell_ids = undefined;
window.pluto_notebookfile = "data:text/julia;charset=utf-8;base64,IyMjIEEgUGx1dG8uamwgbm90ZWJvb2sgIyMjCiMgdjAuMTcuMwoKdXNpbmcgTWFya2Rvd24KdXNpbmcgSW50ZXJhY3RpdmVVdGlscwoKIyBUaGlzIFBsdXRvIG5vdGVib29rIHVzZXMgQGJpbmQgZm9yIGludGVyYWN0aXZpdHkuIFdoZW4gcnVubmluZyB0aGlzIG5vdGVib29rIG91dHNpZGUgb2YgUGx1dG8sIHRoZSBmb2xsb3dpbmcgJ21vY2sgdmVyc2lvbicgb2YgQGJpbmQgZ2l2ZXMgYm91bmQgdmFyaWFibGVzIGEgZGVmYXVsdCB2YWx1ZSAoaW5zdGVhZCBvZiBhbiBlcnJvcikuCm1hY3JvIGJpbmQoZGVmLCBlbGVtZW50KQogICAgcXVvdGUKICAgICAgICBsb2NhbCBpdiA9IHRyeSBCYXNlLmxvYWRlZF9tb2R1bGVzW0Jhc2UuUGtnSWQoQmFzZS5VVUlEKCI2ZTY5NmM3Mi02NTQyLTIwNjctNzI2NS00MjIwNmM3NTYxNTAiKSwgIkFic3RyYWN0UGx1dG9EaW5nZXRqZXMiKV0uQm9uZHMuaW5pdGlhbF92YWx1ZSBjYXRjaDsgYiAtPiBtaXNzaW5nOyBlbmQKICAgICAgICBsb2NhbCBlbCA9ICQoZXNjKGVsZW1lbnQpKQogICAgICAgIGdsb2JhbCAkKGVzYyhkZWYpKSA9IENvcmUuYXBwbGljYWJsZShCYXNlLmdldCwgZWwpID8gQmFzZS5nZXQoZWwpIDogaXYoZWwpCiAgICAgICAgZWwKICAgIGVuZAplbmQKCiMg4pWU4pWQ4pWhIDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwYwp1c2luZyBIeXBlcnRleHRMaXRlcmFsCgojIOKVlOKVkOKVoSA4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzUKZnVuY3Rpb24gc2tpcF9hc19zY3JpcHQobTo6TW9kdWxlKQoJaWYgaXNkZWZpbmVkKG0sIDpQbHV0b0ZvcmNlRGlzcGxheSkKCQlyZXR1cm4gbS5QbHV0b0ZvcmNlRGlzcGxheQoJZWxzZQoJCWlzZGVmaW5lZChtLCA6UGx1dG9SdW5uZXIpICYmIHBhcmVudG1vZHVsZShtKSA9PSBNYWluCgllbmQKZW5kCgojIOKVlOKVkOKVoSBkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2YKaWYgc2tpcF9hc19zY3JpcHQoQF9fTU9EVUxFX18pCglpbXBvcnQgUGtnCglQa2cuYWN0aXZhdGUoQmFzZS5jdXJyZW50X3Byb2plY3QoQF9fRElSX18pKQoJVGV4dCgiUHJvamVjdCBlbnYgYWN0aXZlIikKZW5kCgojIOKVlOKVkOKVoSAzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWMKaWYgc2tpcF9hc19zY3JpcHQoQF9fTU9EVUxFX18pCgl1c2luZyBQbHV0b1VJCmVuZAoKIyDilZTilZDilaEgYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2CiIiIgoJQHNraXBfYXNfc2NyaXB0IGV4cHJlc3Npb24KCk1hcmtzIGEgZXhwcmVzc2lvbiBhcyBQbHV0by1vbmx5LCB3aGljaCBtZWFucyB0aGF0IGl0IHdvbid0IGJlIGV4ZWN1dGVkIHdoZW4gcnVubmluZyBvdXRzaWRlIFBsdXRvLiBEbyBub3QgdXNlIHRoaXMgZm9yIHlvdXIgb3duIHByb2plY3RzLgoiIiIKbWFjcm8gc2tpcF9hc19zY3JpcHQoZXgpIHNraXBfYXNfc2NyaXB0KF9fbW9kdWxlX18pID8gZXNjKGV4KSA6IG5vdGhpbmcgZW5kCgojIOKVlOKVkOKVoSA5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjEKbWFjcm8gb25seV9hc19zY3JpcHQoZXgpIHNraXBfYXNfc2NyaXB0KF9fbW9kdWxlX18pID8gbm90aGluZyA6IGVzYyhleCkgZW5kCgojIOKVlOKVkOKVoSA1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjEKaW1wb3J0IEFic3RyYWN0UGx1dG9EaW5nZXRqZXMuQm9uZHMKCiMg4pWU4pWQ4pWhIGNjYmU0NDIzLTgwMWItNGMyMC1hZDJkLWVlODlkNWNmYTg1OQptZCIiIgojIEhvbGRpbmcgaW50ZXJtZWRpYXRlIHVwZGF0ZXMKIiIiCgojIOKVlOKVkOKVoSA4NTkxODYwOS01ZTFmLTQwNDAtOTliZS02MWMyZGQ4ZmY2NTQKbWQiIiIKIyMgVGhlIG1hZ2ljCiIiIgoKIyDilZTilZDilaEgYjAxZTAxNzktMzU5NC00ZDQ0LTgzMWEtMTIwMjhlM2JmNDhlCkBodGwoCgkiIiIKCTxzY3JpcHQ+CgoJY29uc29sZS5sb2coR2VuZXJhdG9ycykKCTwvc2NyaXB0PgoJIiIiCikKCiMg4pWU4pWQ4pWhIDk1Nzg1OGY4LTRhY2UtNGNhZS1iYjE2LTQ5NTY5ZGFhOTg2OQpjb25zdCBzZXRfaW5wdXRfdmFsdWVfY29tcGF0ID0gSHlwZXJ0ZXh0TGl0ZXJhbC5KYXZhU2NyaXB0KCIiIgooKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoiIiIpCgojIOKVlOKVkOKVoSAxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjcKYmVnaW4KCUJhc2UuQGt3ZGVmIHN0cnVjdCBDb25maXJtQm9uZAoJCWVsZW1lbnQ6OkFueQoJCXNlY3JldF9rZXk6OlN0cmluZz1TdHJpbmcocmFuZCgnYSc6J3onLCAxMCkpCgllbmQKCglmdW5jdGlvbiBCYXNlLnNob3coaW86OklPLCBtOjpNSU1FInRleHQvaHRtbCIsIGNiOjpDb25maXJtQm9uZCkKCQlvdXRwdXQgPSBAaHRsKCIiIgoJCTxzcGFuPgoJCSQoY2IuZWxlbWVudCkKCQk8YnV0dG9uIGlkPSQoY2Iuc2VjcmV0X2tleSk+Q29uZmlybTwvYnV0dG9uPgoJCQoJCTxzY3JpcHQgaWQ9JChjYi5zZWNyZXRfa2V5KT4KCQkKCQlsZXQga2V5ID0gJChjYi5zZWNyZXRfa2V5KQoJCQoJCWxldCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKCQlsZXQgYnV0dG9uID0gY3VycmVudFNjcmlwdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nCgkJbGV0IGlucHV0ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkCgkJaWYoaW5wdXQgPT09IGJ1dHRvbikgewoJCQlyZXR1cm4KCQl9CgoJCQoJCWxldCBzZXRfaW5wdXRfdmFsdWUgPSAkKHNldF9pbnB1dF92YWx1ZV9jb21wYXQpCgoKCQlsZXQgcHJpdmF0ZV92YWx1ZSA9IG51bGwKCQlsZXQgcHVibGljX3ZhbHVlID0gbnVsbAoKCQkKCgkJCgkJcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGRpdi52YWx1ZQoJCWlmKHByaXZhdGVfdmFsdWUgIT0gbnVsbCkgewoJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIHByaXZhdGVfdmFsdWUpCgkJfSBlbHNlIHsKCQkKCQkJLy8gcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGlucHV0LnZhbHVlCgkJfQoJCQoJCWlucHV0Lm9uaW5wdXQgPSAoZSkgPT4gewoJCQllLnN0b3BQcm9wYWdhdGlvbigpCgkJfQoJCWNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoaW5wdXQpCgoJCWxldCBmaXJzdF92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQlwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gZmlyc3RfdmFsdWUKCQkKCQk7KGFzeW5jICgpID0+IHsKCQkJd2hpbGUodHJ1ZSkgewoJCQkJcHJpdmF0ZV92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQkJCS8vIGRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgkJCX0KCQl9KSgpCgoJCWJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKCQkJcHVibGljX3ZhbHVlID0gcHJpdmF0ZV92YWx1ZQoJCQlkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJCX0pCgoJCgkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGRpdiwgJ3ZhbHVlJywgewoJCQlnZXQ6ICgpID0+IHB1YmxpY192YWx1ZSwKCQkJc2V0OiAobmV3dmFsKSA9PiB7CgkJCQlwcml2YXRlX3ZhbHVlID0gbmV3dmFsCgkJCQlwdWJsaWNfdmFsdWUgPSBuZXd2YWwKCQkJCQoJCQkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCBuZXd2YWwpCgkJCX0sCgkJCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKCQl9KTsKCQoJCTwvc2NyaXB0PgoJCTwvc3Bhbj4KCQkiIiIpCgkJQmFzZS5zaG93KGlvLCBtLCBvdXRwdXQpCgllbmQKCglmdW5jdGlvbiBCb25kcy5pbml0aWFsX3ZhbHVlKGNiOjpDb25maXJtQm9uZCkKCQlCb25kcy5pbml0aWFsX3ZhbHVlKGNiLmVsZW1lbnQpCgllbmQKCWZ1bmN0aW9uIEJvbmRzLnZhbGlkYXRlX3ZhbHVlKGNiOjpDb25maXJtQm9uZCwgZnJvbV9qcykKCQlCb25kcy52YWxpZGF0ZV92YWx1ZShjYi5lbGVtZW50LCBmcm9tX2pzKQoJZW5kCglmdW5jdGlvbiBCb25kcy50cmFuc2Zvcm1fdmFsdWUoY2I6OkNvbmZpcm1Cb25kLCBmcm9tX2pzKQoJCUJvbmRzLnRyYW5zZm9ybV92YWx1ZShjYi5lbGVtZW50LCBmcm9tX2pzKQoJZW5kCglmdW5jdGlvbiBCb25kcy5wb3NzaWJsZV92YWx1ZXMoY2I6OkNvbmZpcm1Cb25kKQoJCUJvbmRzLnBvc3NpYmxlX3ZhbHVlcyhjYi5lbGVtZW50KQoJZW5kCgkKZW5kCgojIOKVlOKVkOKVoSBhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzMKIiIiCmBgYGp1bGlhCmNvbmZpcm0oZWxlbWVudDo6QW55KQpgYGAKCk5vcm1hbGx5LCB3aGVuIHlvdSBtb3ZlIGEgW2BTbGlkZXJgXShAcmVmKSBvciB0eXBlIGluIGEgW2BUZXh0RmllbGRgXShAcmVmKSwgYWxsIGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIHNlbnQgYmFjayB0byBgQGJpbmRgLgoKQnkgd3JhcHBpbmcgYW4gaW5wdXQgZWxlbWVudCBpbiBgY29uZmlybWAsIHlvdSBnZXQgYSBidXR0b24gdG8gbWFudWFsbHkgY29udHJvbCB3aGVuIHRoZSB2YWx1ZSBpcyBzZW50LCBpbnRlcm1lZGlhdGUgdXBkYXRlcyBhcmUgaGlkZGVuIGZyb20gUGx1dG8uCgpPbmUgY2FzZSB3aGVyZSB0aGlzIGlzIHVzZWZ1bCBpcyBhIG5vdGVib29rIHRoYXQgZG9lcyBhIGxvbmcgY29tcHV0YXRpb24gYmFzZWQgb24gYSBgQGJpbmRgIGlucHV0LgoKIyBFeGFtcGxlcwoKYGBganVsaWEKQGJpbmQgeCBjb25maXJtKFNsaWRlcigxOjEwMCkpCgp4ID09IDEgIyAoaW5pdGlhbGx5KQpgYGAKCk5vdywgd2hlbiB5b3UgbW92ZSB0aGUgc2xpZGVyLCBub3RoaW5nIGhhcHBlbnMsIHVudGlsIHlvdSBjbGljayB0aGUgYCJDb25maXJtImAgYnV0dG9uLCBhbmQgYHhgIGlzIHNldCB0byB0aGUgbmV3IHNsaWRlciB2YWx1ZS4KCj4gVGhlIHJlc3VsdCBsb29rcyBsaWtlOgo+IAo+ICFbc2NyZWVuc2hvdCBvZiBydW5uaW5nIHRoZSBjb2RlIGFib3ZlIGluIHBsdXRvXShodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS82OTMzNTEwLzE0NTYxNTIxMS0yNzMxZjFmNS01YzdkLTRhYWMtOWFhNS04YWZlODllMjRhNmIucG5nKQoKIyBTZWUgYWxzbwoKWW91IGNhbiBjb21iaW5lIHRoaXMgd2l0aCBbYFBsdXRvVUkuY29tYmluZWBdKEByZWYpIQoKYGBganVsaWEKQGJpbmQgc3BlZWRzIGNvbmZpcm0oCgljb21iaW5lKCkgZG8gQ2hpbGQKCQlAaHRsKCIiXCIKCQk8aDM+V2luZCBzcGVlZHM8L2gzPgoJCTx1bD4KCQlcJChbCgkJCUBodGwoIjxsaT5cJChuYW1lKTogXCQoQ2hpbGQobmFtZSwgU2xpZGVyKDE6MTAwKSkpIikKCQkJZm9yIG5hbWUgaW4gWyJOb3J0aCIsICJFYXN0IiwgIlNvdXRoIiwgIldlc3QiXQoJCV0pCgkJPC91bD4KCQkiIlwiKQoJZW5kCikKYGBgCgo+IFRoZSByZXN1bHQgbG9va3MgbGlrZToKPiAKPiAhW3NjcmVlbnNob3Qgb2YgcnVubmluZyB0aGUgY29kZSBhYm92ZSBpbiBwbHV0b10oaHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vNjkzMzUxMC8xNDU2MTQ5NjUtN2ExZTg2MzAtNDc2Ni00NTg5LThhODQtYjAyMmJkZmIwOWZjLmdpZikKCiIiIgpmdW5jdGlvbiBjb25maXJtKGVsZW1lbnQ6OkFueSkKCUNvbmZpcm1Cb25kKDsKCQllbGVtZW50PWVsZW1lbnQsCgkpCmVuZAoKIyDilZTilZDilaEgYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwCmV4cG9ydCBjb25maXJtCgojIOKVlOKVkOKVoSA2YzhhMDNlNC03ZDhlLTRhYTQtYTc1MC03YjgxNTYyMjE0N2QKbWQiIiIKIyMgRXhhbXBsZXMKIiIiCgojIOKVlOKVkOKVoSBmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGMKQHNraXBfYXNfc2NyaXB0IHhiID0gQGJpbmQgeCBjb25maXJtKFNsaWRlcihbc2luLCBjb3MsIHRhbiwgc3FydCwgZmxvb3JdKSkKCiMg4pWU4pWQ4pWhIDQxZDY0YTk1LTZjMDMtNGE1ZC05ZmQ3LTQ5NmQwZTZjMDM0NgpAc2tpcF9hc19zY3JpcHQgeGIKCiMg4pWU4pWQ4pWhIDhkY2IyNDk4LTAwY2YtNDlhOC04MDc0LTMwMWZlODhiNzZlYQpAc2tpcF9hc19zY3JpcHQgeCgyMzQpCgojIOKVlOKVkOKVoSBmYzkyYjNmYy02MTQzLTQ3N2MtYTQxMy04NGRjZDFiNGNmYzAKQGJpbmQgdCBjb25maXJtKGh0bWwiPGlucHV0PiIpCgojIOKVlOKVkOKVoSAzNjNhNjVlYy0yMThjLTQzYTItYjc0MC04MDYxZmFjMjUwMTEKdAoKIyDilZTilZDilaEgODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUxCkBza2lwX2FzX3NjcmlwdCBAYmluZCBzcGVlZHMgaWRlbnRpdHkoCgljb21iaW5lKCkgZG8gQ2hpbGQKCQlAaHRsKCIiIgoJCTxoMz5XaW5kIHNwZWVkczwvaDM+CgkJPHVsPgoJCSQoWwoJCQlAaHRsKCI8bGk+JChuYW1lKTogJChDaGlsZChuYW1lLCBTbGlkZXIoMToxMDApKSkiKQoJCQlmb3IgbmFtZSBpbiBbIk5vcnRoIiwgIkVhc3QiLCAiU291dGgiLCAiV2VzdCJdCgkJXSkKCQk8L3VsPgoJCSIiIikKCWVuZAopCgojIOKVlOKVkOKVoSBkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODIKc3BlZWRzCgojIOKVlOKVkOKVoSA1YTAxOTZkMC1lMTlmLTQyMDItYjM2ZC0xOGFiOWJlODM5YjMKbWQiIiIKIyMgVGVzdHMKIiIiCgojIOKVlOKVkOKVoSAzZDNhNmFiYi1iZWE3LTQxZTItODYyZC05NTM2YTk2ODdlYTUKbWQiIiIKIyMjIEluaXRpYWwgdmFsdWUgJiB0cmFuc2Zvcm0KIiIiCgojIOKVlOKVkOKVoSA0NTFjM2MxMS1jM2RjLTRkNmUtYjllNS1jMzkwNGU0MDU4MTIKQHNraXBfYXNfc2NyaXB0IGJlZ2luCglpdHZzID0gW10KCglpdGIgPSBAYmluZCBpdHYgY29uZmlybShTbGlkZXIoW3NpbiwgY29zXSkpCmVuZAoKIyDilZTilZDilaEgYmI5ZWRkYzMtMjA4Yy00MTEzLTg5ODgtMzExZWIxZGNmY2Q0CnB1c2ghKGl0dnMsIGl0dikKCiMg4pWU4pWQ4pWhIDdkZTUwNDM1LWU5NjItNDQwNS1iMDZkLTgzZmJlOTQzNmNmZgptZCIiIgojIyMgQ29tYmluZSBpbnNpZGUgY29tYmluZQoiIiIKCiMg4pWU4pWQ4pWhIDgyOWY5MGFjLWM0ZDktNGFmOS05ODRhLWI0ZTUyYTA3NTQ2MApAc2tpcF9hc19zY3JpcHQgY2IyYiA9IEBiaW5kIHdvd3ogY29uZmlybShjb25maXJtKFNsaWRlcigxOjEvLzM6MTApKSkKCiMg4pWU4pWQ4pWhIGExYTliMjJmLTlkZjctNGM1Zi1hNzNkLTM4ZTE4NGRhN2MzNQpAc2tpcF9hc19zY3JpcHQgbGV0CglzbGVlcCgxKQoJd293egplbmQKCiMg4pWU4pWQ4pWhIGM3YTMyYWIyLTJhNWItNDg1Yi05Nzk1LTRhNzQzNjA0ZGU4MgpAc2tpcF9hc19zY3JpcHQgY2IyYgoKIyDilZTilZDilaEgQ2VsbCBvcmRlcjoKIyDilZ/ilIA4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzUKIyDilZ/ilIBiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzYKIyDilZ/ilIA5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjEKIyDilZ/ilIBkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2YKIyDilaDilZAxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGMKIyDilaDilZA1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjEKIyDilZ/ilIBjY2JlNDQyMy04MDFiLTRjMjAtYWQyZC1lZTg5ZDVjZmE4NTkKIyDilaDilZBhZDVjZmZhNS0zMTNjLTRkZTktOTM2MC0wMDUzNjViNDA3ODAKIyDilaDilZBhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzMKIyDilZ/ilIA4NTkxODYwOS01ZTFmLTQwNDAtOTliZS02MWMyZGQ4ZmY2NTQKIyDilaDilZAxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjcKIyDilaDilZBiMDFlMDE3OS0zNTk0LTRkNDQtODMxYS0xMjAyOGUzYmY0OGUKIyDilZ/ilIA5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4NjkKIyDilZ/ilIA2YzhhMDNlNC03ZDhlLTRhYTQtYTc1MC03YjgxNTYyMjE0N2QKIyDilaDilZAzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWMKIyDilaDilZBmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGMKIyDilaDilZA0MWQ2NGE5NS02YzAzLTRhNWQtOWZkNy00OTZkMGU2YzAzNDYKIyDilaDilZA4ZGNiMjQ5OC0wMGNmLTQ5YTgtODA3NC0zMDFmZTg4Yjc2ZWEKIyDilaDilZBmYzkyYjNmYy02MTQzLTQ3N2MtYTQxMy04NGRjZDFiNGNmYzAKIyDilaDilZAzNjNhNjVlYy0yMThjLTQzYTItYjc0MC04MDYxZmFjMjUwMTEKIyDilZ/ilIA4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTEKIyDilaDilZBkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODIKIyDilZ/ilIA1YTAxOTZkMC1lMTlmLTQyMDItYjM2ZC0xOGFiOWJlODM5YjMKIyDilZ/ilIAzZDNhNmFiYi1iZWE3LTQxZTItODYyZC05NTM2YTk2ODdlYTUKIyDilaDilZA0NTFjM2MxMS1jM2RjLTRkNmUtYjllNS1jMzkwNGU0MDU4MTIKIyDilaDilZBiYjllZGRjMy0yMDhjLTQxMTMtODk4OC0zMTFlYjFkY2ZjZDQKIyDilZ/ilIA3ZGU1MDQzNS1lOTYyLTQ0MDUtYjA2ZC04M2ZiZTk0MzZjZmYKIyDilaDilZA4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjAKIyDilaDilZBhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzUKIyDilaDilZBjN2EzMmFiMi0yYTViLTQ4NWItOTc5NS00YTc0MzYwNGRlODIK";
window.pluto_disable_ui = true;
window.pluto_slider_server_url = undefined;
window.pluto_binder_url = "https://mybinder.org/v2/gh/fonsp/pluto-on-binder/v0.17.3";
window.pluto_statefile = "data:;base64,j6Vib25kc4WhdIGldmFsdWWgoXiBpXZhbHVlAaZzcGVlZHOBpXZhbHVllEtKHwGkd293eoGldmFsdWUBo2l0doGldmFsdWUBrGNlbGxfcmVzdWx0c94AHtkkNDUxYzNjMTEtYzNkYy00ZDZlLWI5ZTUtYzM5MDRlNDA1ODEyiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedoKmDxib25kIGRlZj0iaXR2Ij48c3Bhbj4KPGlucHV0IAp0eXBlPSJyYW5nZSIgCm1pbj0xIG1heD0nMicgdmFsdWU9JzEnCj4KCgoKPGJ1dHRvbiBpZD0naGJjaHJ4YXFxZyc+Q29uZmlybTwvYnV0dG9uPgoKPHNjcmlwdCBpZD0naGJjaHJ4YXFxZyc+CgpsZXQga2V5ID0gImhiY2hyeGFxcWciCgpsZXQgZGl2ID0gY3VycmVudFNjcmlwdC5wYXJlbnRFbGVtZW50CmxldCBidXR0b24gPSBjdXJyZW50U2NyaXB0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcKbGV0IGlucHV0ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkCmlmKGlucHV0ID09PSBidXR0b24pIHsKCXJldHVybgp9CgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoKCmxldCBwcml2YXRlX3ZhbHVlID0gbnVsbApsZXQgcHVibGljX3ZhbHVlID0gbnVsbAoKCgoKcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGRpdi52YWx1ZQppZihwcml2YXRlX3ZhbHVlICE9IG51bGwpIHsKCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgcHJpdmF0ZV92YWx1ZSkKfSBlbHNlIHsKCgkvLyBwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gaW5wdXQudmFsdWUKfQoKaW5wdXQub25pbnB1dCA9IChlKSA9PiB7CgllLnN0b3BQcm9wYWdhdGlvbigpCn0KY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChpbnB1dCkKCmxldCBmaXJzdF92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGZpcnN0X3ZhbHVlCgo7KGFzeW5jICgpID0+IHsKCXdoaWxlKHRydWUpIHsKCQlwcml2YXRlX3ZhbHVlID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCS8vIGRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pKCkKCmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKCXB1YmxpY192YWx1ZSA9IHByaXZhdGVfdmFsdWUKCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCn0pCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gcHVibGljX3ZhbHVlLAoJc2V0OiAobmV3dmFsKSA9PiB7CgkJcHJpdmF0ZV92YWx1ZSA9IG5ld3ZhbAoJCXB1YmxpY192YWx1ZSA9IG5ld3ZhbAoJCQoJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgbmV3dmFsKQoJfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KPC9ib25kPrBwZXJzaXN0X2pzX3N0YXRlw6RtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4yRLGTO3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkNDUxYzNjMTEtYzNkYy00ZDZlLWI5ZTUtYzM5MDRlNDA1ODEyuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAodr7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQzNjNhNjVlYy0yMThjLTQzYTItYjc0MC04MDYxZmFjMjUwMTGIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5oiIisHBlcnNpc3RfanNfc3RhdGXDpG1pbWWqdGV4dC9wbGFpbrJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4ySPXY23aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkMzYzYTY1ZWMtMjE4Yy00M2EyLWI3NDAtODA2MWZhYzI1MDExuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWUAtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDdkZTUwNDM1LWU5NjItNDQwNS1iMDZkLTgzZmJlOTQzNmNmZoimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnZPDxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDM+Q29tYmluZSBpbnNpZGUgY29tYmluZTwvaDM+CjwvZGl2PrBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4nejDrK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2ZmuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAGvULVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQ2YzhhMDNlNC03ZDhlLTRhYTQtYTc1MC03YjgxNTYyMjE0N2SIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52S48ZGl2IGNsYXNzPSJtYXJrZG93biI+PGgyPkV4YW1wbGVzPC9oMj4KPC9kaXY+sHBlcnNpc3RfanNfc3RhdGXCpG1pbWWpdGV4dC9odG1ssmxhc3RfcnVuX3RpbWVzdGFtcMtB2Gzid6LVordoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQ2YzhhMDNlNC03ZDhlLTRhYTQtYTc1MC03YjgxNTYyMjE0N2S5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4AAbK8tXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDVhMDE5NmQwLWUxOWYtNDIwMi1iMzZkLTE4YWI5YmU4MzliM4imcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnZKzxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDI+VGVzdHM8L2gyPgo8L2Rpdj6wcGVyc2lzdF9qc19zdGF0ZcKkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOJ3ouFht2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDVhMDE5NmQwLWUxOWYtNDIwMi1iMzZkLTE4YWI5YmU4MzliM7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgABonW1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkODU5MTg2MDktNWUxZi00MDQwLTk5YmUtNjFjMmRkOGZmNjU0iKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedkvPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMj5UaGUgbWFnaWM8L2gyPgo8L2Rpdj6wcGVyc2lzdF9qc19zdGF0ZcKkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOJ3osmXt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDg1OTE4NjA5LTVlMWYtNDA0MC05OWJlLTYxYzJkZDhmZjY1NLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgABrbC1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkZGFkZjJmNDAtMTc2NC00N2E0LWI1NjAtNjgzYjY0NzlkNzdmiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kebJQcm9qZWN0IGVudiBhY3RpdmWwcGVyc2lzdF9qc19zdGF0ZcKkbWltZap0ZXh0L3BsYWlusmxhc3RfcnVuX3RpbWVzdGFtcMtB2GzieX3i87doYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2a5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4Ex3RDtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDUwMjhmYzAxLTRlMTQtNDU1MC04YWU2LTQ4NzAzYjg2ZGMyMYimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHmgsHBlcnNpc3RfanNfc3RhdGXCpG1pbWWqdGV4dC9wbGFpbrJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4nmZYIW3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkNTAyOGZjMDEtNGUxNC00NTUwLThhZTYtNDg3MDNiODZkYzIxuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAMTw7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzOIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52gluPGRpdiBjbGFzcz0icGx1dG8tZG9jcy1iaW5kaW5nIiBzdHlsZT0ibWFyZ2luOiAuNWVtOyBwYWRkaW5nOiAxZW07IGJhY2tncm91bmQ6ICM4MzgzODMwYTsgYm9yZGVyLXJhZGl1czogMWVtOyI+CjxzcGFuIHN0eWxlPSIKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xOXB4LCAtMTZweCk7CiAgICBmb250LWZhbWlseTogJ0p1bGlhTW9ubycsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogLjlyZW07CiAgICBmb250LXdlaWdodDogNzAwOwogICAgLyogaGVpZ2h0OiAxcHg7ICovCiAgICBtYXJnaW4tdG9wOiAtMWVtOwogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICAvKiBjb2xvcjogIzY0NjQ2NDsgKi8KICAgIC8qIGJvcmRlcjogM3B4IHNvbGlkICNmOTliMTUzNjsKIj5jb25maXJtPC9zcGFuPgo8ZGl2IGNsYXNzPSJtYXJrZG93biI+PHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtanVsaWEiPmNvbmZpcm0mIzQwO2VsZW1lbnQ6OkFueSYjNDE7PC9jb2RlPjwvcHJlPgo8cD5Ob3JtYWxseSwgd2hlbiB5b3UgbW92ZSBhIDxhIGhyZWY9IkByZWYiPjxjb2RlPlNsaWRlcjwvY29kZT48L2E+IG9yIHR5cGUgaW4gYSA8YSBocmVmPSJAcmVmIj48Y29kZT5UZXh0RmllbGQ8L2NvZGU+PC9hPiwgYWxsIGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIHNlbnQgYmFjayB0byA8Y29kZT5AYmluZDwvY29kZT4uPC9wPgo8cD5CeSB3cmFwcGluZyBhbiBpbnB1dCBlbGVtZW50IGluIDxjb2RlPmNvbmZpcm08L2NvZGU+LCB5b3UgZ2V0IGEgYnV0dG9uIHRvIG1hbnVhbGx5IGNvbnRyb2wgd2hlbiB0aGUgdmFsdWUgaXMgc2VudCwgaW50ZXJtZWRpYXRlIHVwZGF0ZXMgYXJlIGhpZGRlbiBmcm9tIFBsdXRvLjwvcD4KPHA+T25lIGNhc2Ugd2hlcmUgdGhpcyBpcyB1c2VmdWwgaXMgYSBub3RlYm9vayB0aGF0IGRvZXMgYSBsb25nIGNvbXB1dGF0aW9uIGJhc2VkIG9uIGEgPGNvZGU+QGJpbmQ8L2NvZGU+IGlucHV0LjwvcD4KPGgxPkV4YW1wbGVzPC9oMT4KPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtanVsaWEiPkBiaW5kIHggY29uZmlybSYjNDA7U2xpZGVyJiM0MDsxOjEwMCYjNDE7JiM0MTsKCnggJiM2MTsmIzYxOyAxICMgJiM0MDtpbml0aWFsbHkmIzQxOzwvY29kZT48L3ByZT4KPHA+Tm93LCB3aGVuIHlvdSBtb3ZlIHRoZSBzbGlkZXIsIG5vdGhpbmcgaGFwcGVucywgdW50aWwgeW91IGNsaWNrIHRoZSA8Y29kZT4mcXVvdDtDb25maXJtJnF1b3Q7PC9jb2RlPiBidXR0b24sIGFuZCA8Y29kZT54PC9jb2RlPiBpcyBzZXQgdG8gdGhlIG5ldyBzbGlkZXIgdmFsdWUuPC9wPgo8YmxvY2txdW90ZT4KPHA+VGhlIHJlc3VsdCBsb29rcyBsaWtlOjwvcD4KPHA+PGltZyBzcmM9Imh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzY5MzM1MTAvMTQ1NjE1MjExLTI3MzFmMWY1LTVjN2QtNGFhYy05YWE1LThhZmU4OWUyNGE2Yi5wbmciIGFsdD0ic2NyZWVuc2hvdCBvZiBydW5uaW5nIHRoZSBjb2RlIGFib3ZlIGluIHBsdXRvIiAvPjwvcD4KPC9ibG9ja3F1b3RlPgo8aDE+U2VlIGFsc288L2gxPgo8cD5Zb3UgY2FuIGNvbWJpbmUgdGhpcyB3aXRoIDxhIGhyZWY9IkByZWYiPjxjb2RlPlBsdXRvVUkuY29tYmluZTwvY29kZT48L2E+JiMzMzs8L3A+CjxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLWp1bGlhIj5AYmluZCBzcGVlZHMgY29uZmlybSYjNDA7Cgljb21iaW5lJiM0MDsmIzQxOyBkbyBDaGlsZAoJCUBodGwmIzQwOyZxdW90OyZxdW90OyZxdW90OwoJCSZsdDtoMyZndDtXaW5kIHNwZWVkcyZsdDsvaDMmZ3Q7CgkJJmx0O3VsJmd0OwoJCSYjMzY7JiM0MDsmIzkxOwoJCQlAaHRsJiM0MDsmcXVvdDsmbHQ7bGkmZ3Q7JiMzNjsmIzQwO25hbWUmIzQxOzogJiMzNjsmIzQwO0NoaWxkJiM0MDtuYW1lLCBTbGlkZXImIzQwOzE6MTAwJiM0MTsmIzQxOyYjNDE7JnF1b3Q7JiM0MTsKCQkJZm9yIG5hbWUgaW4gJiM5MTsmcXVvdDtOb3J0aCZxdW90OywgJnF1b3Q7RWFzdCZxdW90OywgJnF1b3Q7U291dGgmcXVvdDssICZxdW90O1dlc3QmcXVvdDsmIzkzOwoJCSYjOTM7JiM0MTsKCQkmbHQ7L3VsJmd0OwoJCSZxdW90OyZxdW90OyZxdW90OyYjNDE7CgllbmQKJiM0MTs8L2NvZGU+PC9wcmU+CjxibG9ja3F1b3RlPgo8cD5UaGUgcmVzdWx0IGxvb2tzIGxpa2U6PC9wPgo8cD48aW1nIHNyYz0iaHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vNjkzMzUxMC8xNDU2MTQ5NjUtN2ExZTg2MzAtNDc2Ni00NTg5LThhODQtYjAyMmJkZmIwOWZjLmdpZiIgYWx0PSJzY3JlZW5zaG90IG9mIHJ1bm5pbmcgdGhlIGNvZGUgYWJvdmUgaW4gcGx1dG8iIC8+PC9wPgo8L2Jsb2NrcXVvdGU+CgoKPC9kaXY+CjwvZGl2PgqwcGVyc2lzdF9qc19zdGF0ZcKkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOMkRcPjt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgANTHW1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedoU6Txib25kIGRlZj0id293eiI+PHNwYW4+CjxzcGFuPgo8aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScyOCcgdmFsdWU9JzEnCj4KCgoKPGJ1dHRvbiBpZD0ncmt6bHVvcXlnYic+Q29uZmlybTwvYnV0dG9uPgoKPHNjcmlwdCBpZD0ncmt6bHVvcXlnYic+CgpsZXQga2V5ID0gInJremx1b3F5Z2IiCgpsZXQgZGl2ID0gY3VycmVudFNjcmlwdC5wYXJlbnRFbGVtZW50CmxldCBidXR0b24gPSBjdXJyZW50U2NyaXB0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcKbGV0IGlucHV0ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkCmlmKGlucHV0ID09PSBidXR0b24pIHsKCXJldHVybgp9CgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoKCmxldCBwcml2YXRlX3ZhbHVlID0gbnVsbApsZXQgcHVibGljX3ZhbHVlID0gbnVsbAoKCgoKcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGRpdi52YWx1ZQppZihwcml2YXRlX3ZhbHVlICE9IG51bGwpIHsKCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgcHJpdmF0ZV92YWx1ZSkKfSBlbHNlIHsKCgkvLyBwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gaW5wdXQudmFsdWUKfQoKaW5wdXQub25pbnB1dCA9IChlKSA9PiB7CgllLnN0b3BQcm9wYWdhdGlvbigpCn0KY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChpbnB1dCkKCmxldCBmaXJzdF92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGZpcnN0X3ZhbHVlCgo7KGFzeW5jICgpID0+IHsKCXdoaWxlKHRydWUpIHsKCQlwcml2YXRlX3ZhbHVlID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCS8vIGRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pKCkKCmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKCXB1YmxpY192YWx1ZSA9IHByaXZhdGVfdmFsdWUKCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCn0pCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gcHVibGljX3ZhbHVlLAoJc2V0OiAobmV3dmFsKSA9PiB7CgkJcHJpdmF0ZV92YWx1ZSA9IG5ld3ZhbAoJCXB1YmxpY192YWx1ZSA9IG5ld3ZhbAoJCQoJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgbmV3dmFsKQoJfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KCjxidXR0b24gaWQ9J3R3ZHh3aWtkeHInPkNvbmZpcm08L2J1dHRvbj4KCjxzY3JpcHQgaWQ9J3R3ZHh3aWtkeHInPgoKbGV0IGtleSA9ICJ0d2R4d2lrZHhyIgoKbGV0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudApsZXQgYnV0dG9uID0gY3VycmVudFNjcmlwdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nCmxldCBpbnB1dCA9IGRpdi5maXJzdEVsZW1lbnRDaGlsZAppZihpbnB1dCA9PT0gYnV0dG9uKSB7CglyZXR1cm4KfQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCgpsZXQgcHJpdmF0ZV92YWx1ZSA9IG51bGwKbGV0IHB1YmxpY192YWx1ZSA9IG51bGwKCgoKCnByaXZhdGVfdmFsdWUgPSBwdWJsaWNfdmFsdWUgPSBkaXYudmFsdWUKaWYocHJpdmF0ZV92YWx1ZSAhPSBudWxsKSB7CglzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIHByaXZhdGVfdmFsdWUpCn0gZWxzZSB7CgoJLy8gcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGlucHV0LnZhbHVlCn0KCmlucHV0Lm9uaW5wdXQgPSAoZSkgPT4gewoJZS5zdG9wUHJvcGFnYXRpb24oKQp9CmNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoaW5wdXQpCgpsZXQgZmlyc3RfdmFsdWUgPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCnByaXZhdGVfdmFsdWUgPSBwdWJsaWNfdmFsdWUgPSBmaXJzdF92YWx1ZQoKOyhhc3luYyAoKSA9PiB7Cgl3aGlsZSh0cnVlKSB7CgkJcHJpdmF0ZV92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQkvLyBkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KSgpCgpidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CglwdWJsaWNfdmFsdWUgPSBwcml2YXRlX3ZhbHVlCglkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQp9KQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHB1YmxpY192YWx1ZSwKCXNldDogKG5ld3ZhbCkgPT4gewoJCXByaXZhdGVfdmFsdWUgPSBuZXd2YWwKCQlwdWJsaWNfdmFsdWUgPSBuZXd2YWwKCQkKCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIG5ld3ZhbCkKCX0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvYm9uZD6wcGVyc2lzdF9qc19zdGF0ZcOkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOMkS8X8t2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWW0QHNraXBfYXNfc2NyaXB0IGNiMmKnY2VsbF9pZNkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAHrorrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRjN2EzMmFiMi0yYTViLTQ4NWItOTc5NS00YTc0MzYwNGRlODKIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52hTpPGJvbmQgZGVmPSJ3b3d6Ij48c3Bhbj4KPHNwYW4+CjxpbnB1dCAKdHlwZT0icmFuZ2UiIAptaW49MSBtYXg9JzI4JyB2YWx1ZT0nMScKPgoKCgo8YnV0dG9uIGlkPSdya3psdW9xeWdiJz5Db25maXJtPC9idXR0b24+Cgo8c2NyaXB0IGlkPSdya3psdW9xeWdiJz4KCmxldCBrZXkgPSAicmt6bHVvcXlnYiIKCmxldCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKbGV0IGJ1dHRvbiA9IGN1cnJlbnRTY3JpcHQucHJldmlvdXNFbGVtZW50U2libGluZwpsZXQgaW5wdXQgPSBkaXYuZmlyc3RFbGVtZW50Q2hpbGQKaWYoaW5wdXQgPT09IGJ1dHRvbikgewoJcmV0dXJuCn0KCgpsZXQgc2V0X2lucHV0X3ZhbHVlID0gKCgpID0+IHsKCWxldCByZXN1bHQgPSBudWxsCgl0cnkgewoJcmVzdWx0ID0gc2V0Qm91bmRFbGVtZW50VmFsdWVMaWtlUGx1dG8KfSBjYXRjaCAoZSkgewoJcmVzdWx0ID0gKChpbnB1dCwgbmV3X3ZhbHVlKSA9PiB7CgkvLyBmYWxsYmFjayBpbiBjYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb25zcC9QbHV0by5qbC9wdWxsLzE3NTUgaXMgbm90IGF2YWlsYWJsZQogICAgaWYgKG5ld192YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgICAgICByZXR1cm4KICAgIH0KICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHsKICAgICAgICBzd2l0Y2ggKGlucHV0LnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAicmFuZ2UiOgogICAgICAgICAgICBjYXNlICJudW1iZXIiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc051bWJlciAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc051bWJlciA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzRGF0ZSA9PSBudWxsIHx8IE51bWJlcihpbnB1dC52YWx1ZUFzRGF0ZSkgIT09IE51bWJlcihuZXdfdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc0RhdGUgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImNoZWNrYm94IjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImZpbGUiOiB7CiAgICAgICAgICAgICAgICAvLyBDYW4ndCBzZXQgZmlsZXMgOigKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGlucHV0Lm11bHRpcGxlKSB7CiAgICAgICAgZm9yIChsZXQgb3B0aW9uIG9mIEFycmF5LmZyb20oaW5wdXQub3B0aW9ucykpIHsKICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbmV3X3ZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICAvL0B0cy1pZ25vcmUKICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgIH0KfSkKfQpyZXR1cm4gcmVzdWx0Cn0pKCkKCgoKbGV0IHByaXZhdGVfdmFsdWUgPSBudWxsCmxldCBwdWJsaWNfdmFsdWUgPSBudWxsCgoKCgpwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gZGl2LnZhbHVlCmlmKHByaXZhdGVfdmFsdWUgIT0gbnVsbCkgewoJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCBwcml2YXRlX3ZhbHVlKQp9IGVsc2UgewoKCS8vIHByaXZhdGVfdmFsdWUgPSBwdWJsaWNfdmFsdWUgPSBpbnB1dC52YWx1ZQp9CgppbnB1dC5vbmlucHV0ID0gKGUpID0+IHsKCWUuc3RvcFByb3BhZ2F0aW9uKCkKfQpjb25zdCBnZW4gPSBHZW5lcmF0b3JzLmlucHV0KGlucHV0KQoKbGV0IGZpcnN0X3ZhbHVlID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQpwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gZmlyc3RfdmFsdWUKCjsoYXN5bmMgKCkgPT4gewoJd2hpbGUodHJ1ZSkgewoJCXByaXZhdGVfdmFsdWUgPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCgkJLy8gZGl2LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHt9KSkKCX0KfSkoKQoKYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewoJcHVibGljX3ZhbHVlID0gcHJpdmF0ZV92YWx1ZQoJZGl2LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHt9KSkKfSkKCgkKT2JqZWN0LmRlZmluZVByb3BlcnR5KGRpdiwgJ3ZhbHVlJywgewoJZ2V0OiAoKSA9PiBwdWJsaWNfdmFsdWUsCglzZXQ6IChuZXd2YWwpID0+IHsKCQlwcml2YXRlX3ZhbHVlID0gbmV3dmFsCgkJcHVibGljX3ZhbHVlID0gbmV3dmFsCgkJCgkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCBuZXd2YWwpCgl9LAoJY29uZmlndXJhYmxlOiB0cnVlLAp9KTsKCQo8L3NjcmlwdD4KPC9zcGFuPgoKPGJ1dHRvbiBpZD0ndHdkeHdpa2R4cic+Q29uZmlybTwvYnV0dG9uPgoKPHNjcmlwdCBpZD0ndHdkeHdpa2R4cic+CgpsZXQga2V5ID0gInR3ZHh3aWtkeHIiCgpsZXQgZGl2ID0gY3VycmVudFNjcmlwdC5wYXJlbnRFbGVtZW50CmxldCBidXR0b24gPSBjdXJyZW50U2NyaXB0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcKbGV0IGlucHV0ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkCmlmKGlucHV0ID09PSBidXR0b24pIHsKCXJldHVybgp9CgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoKCmxldCBwcml2YXRlX3ZhbHVlID0gbnVsbApsZXQgcHVibGljX3ZhbHVlID0gbnVsbAoKCgoKcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGRpdi52YWx1ZQppZihwcml2YXRlX3ZhbHVlICE9IG51bGwpIHsKCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgcHJpdmF0ZV92YWx1ZSkKfSBlbHNlIHsKCgkvLyBwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gaW5wdXQudmFsdWUKfQoKaW5wdXQub25pbnB1dCA9IChlKSA9PiB7CgllLnN0b3BQcm9wYWdhdGlvbigpCn0KY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChpbnB1dCkKCmxldCBmaXJzdF92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGZpcnN0X3ZhbHVlCgo7KGFzeW5jICgpID0+IHsKCXdoaWxlKHRydWUpIHsKCQlwcml2YXRlX3ZhbHVlID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCS8vIGRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pKCkKCmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKCXB1YmxpY192YWx1ZSA9IHByaXZhdGVfdmFsdWUKCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCn0pCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gcHVibGljX3ZhbHVlLAoJc2V0OiAobmV3dmFsKSA9PiB7CgkJcHJpdmF0ZV92YWx1ZSA9IG5ld3ZhbAoJCXB1YmxpY192YWx1ZSA9IG5ld3ZhbAoJCQoJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgbmV3dmFsKQoJfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KPC9ib25kPrBwZXJzaXN0X2pzX3N0YXRlw6RtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4ySMT0i3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgyuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWUqtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N4imcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHmgsHBlcnNpc3RfanNfc3RhdGXCpG1pbWWqdGV4dC9wbGFpbrJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4nm9z323aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY3uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXODV8O5bVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRiMDFlMDE3OS0zNTk0LTRkNDQtODMxYS0xMjAyOGUzYmY0OGWIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52Sw8c2NyaXB0PgoKY29uc29sZS5sb2coR2VuZXJhdG9ycykKPC9zY3JpcHQ+CrBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4nmqCI23aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkYjAxZTAxNzktMzU5NC00ZDQ0LTgzMWEtMTIwMjhlM2JmNDhluWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOCF08abVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQ5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjGIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52SVAb25seV9hc19zY3JpcHQgKG1hY3JvIHdpdGggMSBtZXRob2QpsHBlcnNpc3RfanNfc3RhdGXCpG1pbWWqdGV4dC9wbGFpbrJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4nmZSW+3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkOWU1NmRiYjktMmU5My00MTM2LWIxMGItN2IxZWNiMDdlNmYxuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAATxI7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGOIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5oLBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqnRleHQvcGxhaW6ybGFzdF9ydW5fdGltZXN0YW1wy0HYbOJ5PUTUt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwY7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgBIxty1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkNDFkNjRhOTUtNmMwMy00YTVkLTlmZDctNDk2ZDBlNmMwMzQ2iKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedoKljxib25kIGRlZj0ieCI+PHNwYW4+CjxpbnB1dCAKdHlwZT0icmFuZ2UiIAptaW49MSBtYXg9JzUnIHZhbHVlPScxJwo+CgoKCjxidXR0b24gaWQ9J29jZnVyb3JyY28nPkNvbmZpcm08L2J1dHRvbj4KCjxzY3JpcHQgaWQ9J29jZnVyb3JyY28nPgoKbGV0IGtleSA9ICJvY2Z1cm9ycmNvIgoKbGV0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudApsZXQgYnV0dG9uID0gY3VycmVudFNjcmlwdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nCmxldCBpbnB1dCA9IGRpdi5maXJzdEVsZW1lbnRDaGlsZAppZihpbnB1dCA9PT0gYnV0dG9uKSB7CglyZXR1cm4KfQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCgpsZXQgcHJpdmF0ZV92YWx1ZSA9IG51bGwKbGV0IHB1YmxpY192YWx1ZSA9IG51bGwKCgoKCnByaXZhdGVfdmFsdWUgPSBwdWJsaWNfdmFsdWUgPSBkaXYudmFsdWUKaWYocHJpdmF0ZV92YWx1ZSAhPSBudWxsKSB7CglzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIHByaXZhdGVfdmFsdWUpCn0gZWxzZSB7CgoJLy8gcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGlucHV0LnZhbHVlCn0KCmlucHV0Lm9uaW5wdXQgPSAoZSkgPT4gewoJZS5zdG9wUHJvcGFnYXRpb24oKQp9CmNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoaW5wdXQpCgpsZXQgZmlyc3RfdmFsdWUgPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCnByaXZhdGVfdmFsdWUgPSBwdWJsaWNfdmFsdWUgPSBmaXJzdF92YWx1ZQoKOyhhc3luYyAoKSA9PiB7Cgl3aGlsZSh0cnVlKSB7CgkJcHJpdmF0ZV92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQkvLyBkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KSgpCgpidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CglwdWJsaWNfdmFsdWUgPSBwcml2YXRlX3ZhbHVlCglkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQp9KQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHB1YmxpY192YWx1ZSwKCXNldDogKG5ld3ZhbCkgPT4gewoJCXByaXZhdGVfdmFsdWUgPSBuZXd2YWwKCQlwdWJsaWNfdmFsdWUgPSBuZXd2YWwKCQkKCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIG5ld3ZhbCkKCX0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvYm9uZD6wcGVyc2lzdF9qc19zdGF0ZcOkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOMkRsMit2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDQxZDY0YTk1LTZjMDMtNGE1ZC05ZmQ3LTQ5NmQwZTZjMDM0NrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lALVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQ5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4NjmIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5haZwcmVmaXi7SHlwZXJ0ZXh0TGl0ZXJhbC5KYXZhU2NyaXB0qGVsZW1lbnRzkZKnY29udGVudJLZZiIoKCkgPT4ge1xuXHRsZXQgcmVzdWx0ID0gbnVsbFxuXHR0cnkgeyIg4ouvIDE0MjAgYnl0ZXMg4ouvICJsdWVcbiAgICB9XG59KVxufVxucmV0dXJuIHJlc3VsdFxufSkoKVxuIqp0ZXh0L3BsYWlupHR5cGWmc3RydWN0rHByZWZpeF9zaG9ydKpKYXZhU2NyaXB0qG9iamVjdGlksGIzMTM0ODczMjYxYmE0NTGwcGVyc2lzdF9qc19zdGF0ZcKkbWltZdkhYXBwbGljYXRpb24vdm5kLnBsdXRvLnRyZWUrb2JqZWN0smxhc3RfcnVuX3RpbWVzdGFtcMtB2Gzieb1qJ7doYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlvGNvbnN0IHNldF9pbnB1dF92YWx1ZV9jb21wYXSnY2VsbF9pZNkkOTU3ODU4ZjgtNGFjZS00Y2FlLWJiMTYtNDk1NjlkYWE5ODY5uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOABLwJbVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQ4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzWIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52S9za2lwX2FzX3NjcmlwdCAoZ2VuZXJpYyBmdW5jdGlvbiB3aXRoIDEgbWV0aG9kKbBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqnRleHQvcGxhaW6ybGFzdF9ydW5fdGltZXN0YW1wy0HYbOJ5c8KPt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDg4MWI3NWQzLWNlYmUtNGE1My04Y2Y1LWJlYWVlZGRhZmQzNblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgAGIYC1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUxiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedoKujxib25kIGRlZj0ic3BlZWRzIj48c3Bhbj4KPGgzPldpbmQgc3BlZWRzPC9oMz4KPHVsPgo8bGk+Tm9ydGg6IDxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3d0dnJkdmdvaG0nPjxpbnB1dCAKdHlwZT0icmFuZ2UiIAptaW49MSBtYXg9JzEwMCcgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPjxsaT5FYXN0OiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSd3dHZyZHZnb2htJz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMDAnIHZhbHVlPScxJwo+CgoKPC9wbC1jb21iaW5lZF9jaGlsZD48bGk+U291dGg6IDxwbC1jb21iaW5lZF9jaGlsZCBrZXk9J3d0dnJkdmdvaG0nPjxpbnB1dCAKdHlwZT0icmFuZ2UiIAptaW49MSBtYXg9JzEwMCcgdmFsdWU9JzEnCj4KCgo8L3BsLWNvbWJpbmVkX2NoaWxkPjxsaT5XZXN0OiA8cGwtY29tYmluZWRfY2hpbGQga2V5PSd3dHZyZHZnb2htJz48aW5wdXQgCnR5cGU9InJhbmdlIiAKbWluPTEgbWF4PScxMDAnIHZhbHVlPScxJwo+CgoKPC9wbC1jb21iaW5lZF9jaGlsZD4KPC91bD4KCjxzY3JpcHQgaWQ9J3d0dnJkdmdvaG0nPgpjb25zdCBkaXYgPSBjdXJyZW50U2NyaXB0LnBhcmVudEVsZW1lbnQKbGV0IGtleSA9ICJ3dHZyZHZnb2htIgpjb25zdCBpbnB1dHMgPSBkaXYucXVlcnlTZWxlY3RvckFsbChgcGwtY29tYmluZWRfY2hpbGRba2V5PScke2tleX0nXSA+ICo6Zmlyc3QtY2hpbGRgKQoKY29uc3QgdmFsdWVzID0gQXJyYXkoaW5wdXRzLmxlbmd0aCkKCmlucHV0cy5mb3JFYWNoKGFzeW5jIChlbCxpKSA9PiB7CgllbC5vbmlucHV0ID0gKGUpID0+IHsKCQllLnN0b3BQcm9wYWdhdGlvbigpCgl9Cgljb25zdCBnZW4gPSBHZW5lcmF0b3JzLmlucHV0KGVsKQoJd2hpbGUodHJ1ZSkgewoJCXZhbHVlc1tpXSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQlkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHZhbHVlcywKCXNldDogKG5ld3ZhbHMpID0+IHsKCQlpZighbmV3dmFscykgewoJCQlyZXR1cm4KCQl9CgkJaW5wdXRzLmZvckVhY2goKGVsLCBpKSA9PiB7CgkJCXZhbHVlc1tpXSA9IG5ld3ZhbHNbaV0KCQkJc2V0X2lucHV0X3ZhbHVlKGVsLCBuZXd2YWxzW2ldKQoJCX0pCn0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvYm9uZD6wcGVyc2lzdF9qc19zdGF0ZcKkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOMq8si4t2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDgwMWZiMDIxLTczYTAtNDExNC1hMzZhLTMyOGU4NGYwMGI1MblkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgLQKiS1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9keaCwcGVyc2lzdF9qc19zdGF0ZcOkbWltZap0ZXh0L3BsYWlusmxhc3RfcnVuX3RpbWVzdGFtcMtB2GzjJEXvjbdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SRhZDVjZmZhNS0zMTNjLTRkZTktOTM2MC0wMDUzNjViNDA3ODC5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc3NkbVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWOIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5oLBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqnRleHQvcGxhaW6ybGFzdF9ydW5fdGltZXN0YW1wy0HYbOJ5h5/Ht2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJDM4YjdlZWI5LTgwYmItNGEzYS1hMmQyLTgwOWZjNDIzNjI1Y7lkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgduf421cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVhiKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kebIwLjk5ODgxNjY5MTIwMjgwODKwcGVyc2lzdF9qc19zdGF0ZcOkbWltZap0ZXh0L3BsYWlusmxhc3RfcnVuX3RpbWVzdGFtcMtB2GzjJEb0DrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SQ4ZGNiMjQ5OC0wMGNmLTQ5YTgtODA3NC0zMDFmZTg4Yjc2ZWG5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZQC1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE1iKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9kedlDPGRpdiBjbGFzcz0ibWFya2Rvd24iPjxoMz5Jbml0aWFsIHZhbHVlICZhbXA7IHRyYW5zZm9ybTwvaDM+CjwvZGl2PrBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4pwFL3O3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE1uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAE+zz7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzaIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52gLKPGRpdiBjbGFzcz0icGx1dG8tZG9jcy1iaW5kaW5nIiBzdHlsZT0ibWFyZ2luOiAuNWVtOyBwYWRkaW5nOiAxZW07IGJhY2tncm91bmQ6ICM4MzgzODMwYTsgYm9yZGVyLXJhZGl1czogMWVtOyI+CjxzcGFuIHN0eWxlPSIKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xOXB4LCAtMTZweCk7CiAgICBmb250LWZhbWlseTogJ0p1bGlhTW9ubycsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogLjlyZW07CiAgICBmb250LXdlaWdodDogNzAwOwogICAgLyogaGVpZ2h0OiAxcHg7ICovCiAgICBtYXJnaW4tdG9wOiAtMWVtOwogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICAvKiBjb2xvcjogIzY0NjQ2NDsgKi8KICAgIC8qIGJvcmRlcjogM3B4IHNvbGlkICNmOTliMTUzNjsKIj5Ac2tpcF9hc19zY3JpcHQ8L3NwYW4+CjxkaXYgY2xhc3M9Im1hcmtkb3duIj48cHJlPjxjb2RlPkBza2lwX2FzX3NjcmlwdCBleHByZXNzaW9uPC9jb2RlPjwvcHJlPgo8cD5NYXJrcyBhIGV4cHJlc3Npb24gYXMgUGx1dG8tb25seSwgd2hpY2ggbWVhbnMgdGhhdCBpdCB3b24mIzM5O3QgYmUgZXhlY3V0ZWQgd2hlbiBydW5uaW5nIG91dHNpZGUgUGx1dG8uIERvIG5vdCB1c2UgdGhpcyBmb3IgeW91ciBvd24gcHJvamVjdHMuPC9wPgoKCjwvZGl2Pgo8L2Rpdj4KsHBlcnNpc3RfanNfc3RhdGXCpG1pbWWpdGV4dC9odG1ssmxhc3RfcnVuX3RpbWVzdGFtcMtB2GzieZE0WbdoYXNfcGx1dG9faG9va19mZWF0dXJlc8Kscm9vdGFzc2lnbmVlwKdjZWxsX2lk2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1Mza5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4ACj+ztXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJGJiOWVkZGMzLTIwOGMtNDExMy04OTg4LTMxMWViMWRjZmNkNIimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHmFpnByZWZpeKNBbnmoZWxlbWVudHORkgGSo3Npbqp0ZXh0L3BsYWlupHR5cGWlQXJyYXmscHJlZml4X3Nob3J0oKhvYmplY3RpZLA0MmQyZTc3OWRlMmIwMDFhsHBlcnNpc3RfanNfc3RhdGXDpG1pbWXZIWFwcGxpY2F0aW9uL3ZuZC5wbHV0by50cmVlK29iamVjdLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4yRLKgK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkYmI5ZWRkYzMtMjA4Yy00MTEzLTg5ODgtMzExZWIxZGNmY2Q0uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWVTtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJGNjYmU0NDIzLTgwMWItNGMyMC1hZDJkLWVlODlkNWNmYTg1OYimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnZQjxkaXYgY2xhc3M9Im1hcmtkb3duIj48aDE+SG9sZGluZyBpbnRlcm1lZGlhdGUgdXBkYXRlczwvaDE+CjwvZGl2PrBwZXJzaXN0X2pzX3N0YXRlwqRtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4neivX+3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkY2NiZTQ0MjMtODAxYi00YzIwLWFkMmQtZWU4OWQ1Y2ZhODU5uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAAHAPrVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGOIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R52gqWPGJvbmQgZGVmPSJ4Ij48c3Bhbj4KPGlucHV0IAp0eXBlPSJyYW5nZSIgCm1pbj0xIG1heD0nNScgdmFsdWU9JzEnCj4KCgoKPGJ1dHRvbiBpZD0nb2NmdXJvcnJjbyc+Q29uZmlybTwvYnV0dG9uPgoKPHNjcmlwdCBpZD0nb2NmdXJvcnJjbyc+CgpsZXQga2V5ID0gIm9jZnVyb3JyY28iCgpsZXQgZGl2ID0gY3VycmVudFNjcmlwdC5wYXJlbnRFbGVtZW50CmxldCBidXR0b24gPSBjdXJyZW50U2NyaXB0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcKbGV0IGlucHV0ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkCmlmKGlucHV0ID09PSBidXR0b24pIHsKCXJldHVybgp9CgoKbGV0IHNldF9pbnB1dF92YWx1ZSA9ICgoKSA9PiB7CglsZXQgcmVzdWx0ID0gbnVsbAoJdHJ5IHsKCXJlc3VsdCA9IHNldEJvdW5kRWxlbWVudFZhbHVlTGlrZVBsdXRvCn0gY2F0Y2ggKGUpIHsKCXJlc3VsdCA9ICgoaW5wdXQsIG5ld192YWx1ZSkgPT4gewoJLy8gZmFsbGJhY2sgaW4gY2FzZSBodHRwczovL2dpdGh1Yi5jb20vZm9uc3AvUGx1dG8uamwvcHVsbC8xNzU1IGlzIG5vdCBhdmFpbGFibGUKICAgIGlmIChuZXdfdmFsdWUgPT0gbnVsbCkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICAgICAgcmV0dXJuCiAgICB9CiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInJhbmdlIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNOdW1iZXIgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNOdW1iZXIgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImRhdGUiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc0RhdGUgPT0gbnVsbCB8fCBOdW1iZXIoaW5wdXQudmFsdWVBc0RhdGUpICE9PSBOdW1iZXIobmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlQXNEYXRlID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJjaGVja2JveCI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJmaWxlIjogewogICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgc2V0IGZpbGVzIDooCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBpbnB1dC5tdWx0aXBsZSkgewogICAgICAgIGZvciAobGV0IG9wdGlvbiBvZiBBcnJheS5mcm9tKGlucHV0Lm9wdGlvbnMpKSB7CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG5ld192YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQogICAgLy9AdHMtaWdub3JlCiAgICBpZiAoaW5wdXQudmFsdWUgIT09IG5ld192YWx1ZSkgewogICAgICAgIC8vQHRzLWlnbm9yZQogICAgICAgIGlucHV0LnZhbHVlID0gbmV3X3ZhbHVlCiAgICB9Cn0pCn0KcmV0dXJuIHJlc3VsdAp9KSgpCgoKCmxldCBwcml2YXRlX3ZhbHVlID0gbnVsbApsZXQgcHVibGljX3ZhbHVlID0gbnVsbAoKCgoKcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGRpdi52YWx1ZQppZihwcml2YXRlX3ZhbHVlICE9IG51bGwpIHsKCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgcHJpdmF0ZV92YWx1ZSkKfSBlbHNlIHsKCgkvLyBwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gaW5wdXQudmFsdWUKfQoKaW5wdXQub25pbnB1dCA9IChlKSA9PiB7CgllLnN0b3BQcm9wYWdhdGlvbigpCn0KY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChpbnB1dCkKCmxldCBmaXJzdF92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGZpcnN0X3ZhbHVlCgo7KGFzeW5jICgpID0+IHsKCXdoaWxlKHRydWUpIHsKCQlwcml2YXRlX3ZhbHVlID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCS8vIGRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgl9Cn0pKCkKCmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKCXB1YmxpY192YWx1ZSA9IHByaXZhdGVfdmFsdWUKCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCn0pCgoJCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaXYsICd2YWx1ZScsIHsKCWdldDogKCkgPT4gcHVibGljX3ZhbHVlLAoJc2V0OiAobmV3dmFsKSA9PiB7CgkJcHJpdmF0ZV92YWx1ZSA9IG5ld3ZhbAoJCXB1YmxpY192YWx1ZSA9IG5ld3ZhbAoJCQoJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgbmV3dmFsKQoJfSwKCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKfSk7CgkKPC9zY3JpcHQ+Cjwvc3Bhbj4KPC9ib25kPrBwZXJzaXN0X2pzX3N0YXRlw6RtaW1lqXRleHQvaHRtbLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4yRGhy+3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZbJAc2tpcF9hc19zY3JpcHQgeGKnY2VsbF9pZNkkZjA4NjgwYjItZWQyOC00ZmFjLTgzOGMtMmVjYTdlNzVjNmRjuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAGC+R7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTC2SRkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODKIpnF1ZXVlZMKncnVubmluZ8Kmb3V0cHV0hqRib2R5g6hlbGVtZW50c5SSpU5vcnRokqI3Nap0ZXh0L3BsYWlukqRFYXN0kqI3NKp0ZXh0L3BsYWlukqVTb3V0aJKiMzGqdGV4dC9wbGFpbpKkV2VzdJKhMap0ZXh0L3BsYWlupHR5cGWqTmFtZWRUdXBsZahvYmplY3RpZLA4MjFmMmU1ZGE5NDdiYWE2sHBlcnNpc3RfanNfc3RhdGXDpG1pbWXZIWFwcGxpY2F0aW9uL3ZuZC5wbHV0by50cmVlK29iamVjdLJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4y4dLBu3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkZDc5ODU4NDQtNTk0NC00MmI5LWFkNDEtNTk5Y2Q3MmVlYTgyuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWUAtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5CnZXJyb3JlZMLZJGZjOTJiM2ZjLTYxNDMtNDc3Yy1hNDEzLTg0ZGNkMWI0Y2ZjMIimcXVldWVkwqdydW5uaW5nwqZvdXRwdXSGpGJvZHnaCms8Ym9uZCBkZWY9InQiPjxzcGFuPgo8aW5wdXQ+CjxidXR0b24gaWQ9J3lra2djcW9mZXEnPkNvbmZpcm08L2J1dHRvbj4KCjxzY3JpcHQgaWQ9J3lra2djcW9mZXEnPgoKbGV0IGtleSA9ICJ5a2tnY3FvZmVxIgoKbGV0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudApsZXQgYnV0dG9uID0gY3VycmVudFNjcmlwdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nCmxldCBpbnB1dCA9IGRpdi5maXJzdEVsZW1lbnRDaGlsZAppZihpbnB1dCA9PT0gYnV0dG9uKSB7CglyZXR1cm4KfQoKCmxldCBzZXRfaW5wdXRfdmFsdWUgPSAoKCkgPT4gewoJbGV0IHJlc3VsdCA9IG51bGwKCXRyeSB7CglyZXN1bHQgPSBzZXRCb3VuZEVsZW1lbnRWYWx1ZUxpa2VQbHV0bwp9IGNhdGNoIChlKSB7CglyZXN1bHQgPSAoKGlucHV0LCBuZXdfdmFsdWUpID0+IHsKCS8vIGZhbGxiYWNrIGluIGNhc2UgaHR0cHM6Ly9naXRodWIuY29tL2ZvbnNwL1BsdXRvLmpsL3B1bGwvMTc1NSBpcyBub3QgYXZhaWxhYmxlCiAgICBpZiAobmV3X3ZhbHVlID09IG51bGwpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgICAgIHJldHVybgogICAgfQogICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgewogICAgICAgIHN3aXRjaCAoaW5wdXQudHlwZSkgewogICAgICAgICAgICBjYXNlICJyYW5nZSI6CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzTnVtYmVyICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzTnVtYmVyID0gbmV3X3ZhbHVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICJkYXRlIjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlQXNEYXRlID09IG51bGwgfHwgTnVtYmVyKGlucHV0LnZhbHVlQXNEYXRlKSAhPT0gTnVtYmVyKG5ld192YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZUFzRGF0ZSA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZmlsZSI6IHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHNldCBmaWxlcyA6KAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgaW5wdXQubXVsdGlwbGUpIHsKICAgICAgICBmb3IgKGxldCBvcHRpb24gb2YgQXJyYXkuZnJvbShpbnB1dC5vcHRpb25zKSkgewogICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBuZXdfdmFsdWUuaW5jbHVkZXMob3B0aW9uLnZhbHVlKQogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgIH0KICAgIC8vQHRzLWlnbm9yZQogICAgaWYgKGlucHV0LnZhbHVlICE9PSBuZXdfdmFsdWUpIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBpbnB1dC52YWx1ZSA9IG5ld192YWx1ZQogICAgfQp9KQp9CnJldHVybiByZXN1bHQKfSkoKQoKCgpsZXQgcHJpdmF0ZV92YWx1ZSA9IG51bGwKbGV0IHB1YmxpY192YWx1ZSA9IG51bGwKCgoKCnByaXZhdGVfdmFsdWUgPSBwdWJsaWNfdmFsdWUgPSBkaXYudmFsdWUKaWYocHJpdmF0ZV92YWx1ZSAhPSBudWxsKSB7CglzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIHByaXZhdGVfdmFsdWUpCn0gZWxzZSB7CgoJLy8gcHJpdmF0ZV92YWx1ZSA9IHB1YmxpY192YWx1ZSA9IGlucHV0LnZhbHVlCn0KCmlucHV0Lm9uaW5wdXQgPSAoZSkgPT4gewoJZS5zdG9wUHJvcGFnYXRpb24oKQp9CmNvbnN0IGdlbiA9IEdlbmVyYXRvcnMuaW5wdXQoaW5wdXQpCgpsZXQgZmlyc3RfdmFsdWUgPSBhd2FpdCBnZW4ubmV4dCgpLnZhbHVlCnByaXZhdGVfdmFsdWUgPSBwdWJsaWNfdmFsdWUgPSBmaXJzdF92YWx1ZQoKOyhhc3luYyAoKSA9PiB7Cgl3aGlsZSh0cnVlKSB7CgkJcHJpdmF0ZV92YWx1ZSA9IGF3YWl0IGdlbi5uZXh0KCkudmFsdWUKCQkvLyBkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQoJfQp9KSgpCgpidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CglwdWJsaWNfdmFsdWUgPSBwcml2YXRlX3ZhbHVlCglkaXYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0Iiwge30pKQp9KQoKCQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CglnZXQ6ICgpID0+IHB1YmxpY192YWx1ZSwKCXNldDogKG5ld3ZhbCkgPT4gewoJCXByaXZhdGVfdmFsdWUgPSBuZXd2YWwKCQlwdWJsaWNfdmFsdWUgPSBuZXd2YWwKCQkKCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIG5ld3ZhbCkKCX0sCgljb25maWd1cmFibGU6IHRydWUsCn0pOwoJCjwvc2NyaXB0Pgo8L3NwYW4+CjwvYm9uZD6wcGVyc2lzdF9qc19zdGF0ZcOkbWltZal0ZXh0L2h0bWyybGFzdF9ydW5fdGltZXN0YW1wy0HYbOMkR8lLt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqxyb290YXNzaWduZWXAp2NlbGxfaWTZJGZjOTJiM2ZjLTYxNDMtNDc3Yy1hNDEzLTg0ZGNkMWI0Y2ZjMLlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzgCP6nK1cHVibGlzaGVkX29iamVjdF9rZXlzkKdlcnJvcmVkwtkkYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM1iKZxdWV1ZWTCp3J1bm5pbmfCpm91dHB1dIakYm9keaQxLy8xsHBlcnNpc3RfanNfc3RhdGXDpG1pbWWqdGV4dC9wbGFpbrJsYXN0X3J1bl90aW1lc3RhbXDLQdhs4yTPv/S3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCrHJvb3Rhc3NpZ25lZcCnY2VsbF9pZNkkYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM1uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOO71TebVwdWJsaXNoZWRfb2JqZWN0X2tleXOQp2Vycm9yZWTCsWNlbGxfZGVwZW5kZW5jaWVz3gAe2SQ0NTFjM2MxMS1jM2RjLTRkNmUtYjllNS1jMzkwNGU0MDU4MTKEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ0NTFjM2MxMS1jM2RjLTRkNmUtYjllNS1jMzkwNGU0MDU4MTK0ZG93bnN0cmVhbV9jZWxsc19tYXCDo2l0YpCkaXR2c5HZJGJiOWVkZGMzLTIwOGMtNDExMy04OTg4LTMxMWViMWRjZmNkNKNpdHaR2SRiYjllZGRjMy0yMDhjLTQxMTMtODk4OC0zMTFlYjFkY2ZjZDSydXBzdHJlYW1fY2VsbHNfbWFwitkgTWFpbi5QbHV0b1J1bm5lci5Db3JlLmFwcGxpY2FibGWQpE1haW6Qr0Bza2lwX2FzX3NjcmlwdJHZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNrlNYWluLlBsdXRvUnVubmVyLkJhc2UuZ2V0kKdjb25maXJtkdkkYTIwZGExOGYtN2E3NC00M2NhLTliNjYtMWYzYjgyZWZhMGMzpUBiaW5kkKNjb3OQ2ShNYWluLlBsdXRvUnVubmVyLlBsdXRvUnVubmVyLmNyZWF0ZV9ib25kkKZTbGlkZXKQo3NpbpDZJDM2M2E2NWVjLTIxOGMtNDNhMi1iNzQwLTgwNjFmYWMyNTAxMYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDM2M2E2NWVjLTIxOGMtNDNhMi1iNzQwLTgwNjFmYWMyNTAxMbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgaF0kdkkZmM5MmIzZmMtNjE0My00NzdjLWE0MTMtODRkY2QxYjRjZmMw2SQ3ZGU1MDQzNS1lOTYyLTQ0MDUtYjA2ZC04M2ZiZTk0MzZjZmaEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ3ZGU1MDQzNS1lOTYyLTQ0MDUtYjA2ZC04M2ZiZTk0MzZjZma0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIGoZ2V0aW5kZXiQ2SQ2YzhhMDNlNC03ZDhlLTRhYTQtYTc1MC03YjgxNTYyMjE0N2SEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ2YzhhMDNlNC03ZDhlLTRhYTQtYTc1MC03YjgxNTYyMjE0N2S0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIGoZ2V0aW5kZXiQ2SQ1YTAxOTZkMC1lMTlmLTQyMDItYjM2ZC0xOGFiOWJlODM5YjOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ1YTAxOTZkMC1lMTlmLTQyMDItYjM2ZC0xOGFiOWJlODM5YjO0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIGoZ2V0aW5kZXiQ2SQ4NTkxODYwOS01ZTFmLTQwNDAtOTliZS02MWMyZGQ4ZmY2NTSEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ4NTkxODYwOS01ZTFmLTQwNDAtOTliZS02MWMyZGQ4ZmY2NTS0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIGoZ2V0aW5kZXiQ2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2aEtHByZWNlZGVuY2VfaGV1cmlzdGljAadjZWxsX2lk2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2a0ZG93bnN0cmVhbV9jZWxsc19tYXCBo1BrZ5HZJGRhZGYyZjQwLTE3NjQtNDdhNC1iNTYwLTY4M2I2NDc5ZDc3ZrJ1cHN0cmVhbV9jZWxsc19tYXCIpEJhc2WQo1BrZ5HZJGRhZGYyZjQwLTE3NjQtNDdhNC1iNTYwLTY4M2I2NDc5ZDc3ZqtAX19NT0RVTEVfX5C0QmFzZS5jdXJyZW50X3Byb2plY3SQrFBrZy5hY3RpdmF0ZZCoQF9fRElSX1+QrnNraXBfYXNfc2NyaXB0kdkkODgxYjc1ZDMtY2ViZS00YTUzLThjZjUtYmVhZWVkZGFmZDM1pFRleHSQ2SQ1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjG0ZG93bnN0cmVhbV9jZWxsc19tYXCBpUJvbmRzkdkkMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY3snVwc3RyZWFtX2NlbGxzX21hcIDZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM7Rkb3duc3RyZWFtX2NlbGxzX21hcIGnY29uZmlybZXZJGFkNWNmZmE1LTMxM2MtNGRlOS05MzYwLTAwNTM2NWI0MDc4MNkkZjA4NjgwYjItZWQyOC00ZmFjLTgzOGMtMmVjYTdlNzVjNmRj2SRmYzkyYjNmYy02MTQzLTQ3N2MtYTQxMy04NGRjZDFiNGNmYzDZJDQ1MWMzYzExLWMzZGMtNGQ2ZS1iOWU1LWMzOTA0ZTQwNTgxMtkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwsnVwc3RyZWFtX2NlbGxzX21hcIWkQGRvY5CrQ29uZmlybUJvbmSR2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjelVHVwbGWQpVVuaW9ukKNBbnmQ2SQ4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjCEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjC0ZG93bnN0cmVhbV9jZWxsc19tYXCCpGNiMmKR2SRjN2EzMmFiMi0yYTViLTQ4NWItOTc5NS00YTc0MzYwNGRlODKkd293epHZJGExYTliMjJmLTlkZjctNGM1Zi1hNzNkLTM4ZTE4NGRhN2MzNbJ1cHN0cmVhbV9jZWxsc19tYXCK2SBNYWluLlBsdXRvUnVubmVyLkNvcmUuYXBwbGljYWJsZZCkTWFpbpChOpCvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2oi8vkLlNYWluLlBsdXRvUnVubmVyLkJhc2UuZ2V0kKVAYmluZJCnY29uZmlybZHZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM6ZTbGlkZXKQ2ShNYWluLlBsdXRvUnVubmVyLlBsdXRvUnVubmVyLmNyZWF0ZV9ib25kkNkkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgyhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgytGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCr0Bza2lwX2FzX3NjcmlwdJHZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNqRjYjJikdkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYw2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjeEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4Nje0ZG93bnN0cmVhbV9jZWxsc19tYXCGtEJvbmRzLnZhbGlkYXRlX3ZhbHVlkKtDb25maXJtQm9uZJHZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM7VCb25kcy5wb3NzaWJsZV92YWx1ZXOQqUJhc2Uuc2hvd5HZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N7VCb25kcy50cmFuc2Zvcm1fdmFsdWWQs0JvbmRzLmluaXRpYWxfdmFsdWWR2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjeydXBzdHJlYW1fY2VsbHNfbWFw3gAToklPkKE6kLdIeXBlcnRleHRMaXRlcmFsLkJ5cGFzc5C4SHlwZXJ0ZXh0TGl0ZXJhbC5jb250ZW50kKlATUlNRV9zdHKQpHJhbmSQo0FueZCmU3RyaW5nkLNCb25kcy5pbml0aWFsX3ZhbHVlkdkkMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY3tnNldF9pbnB1dF92YWx1ZV9jb21wYXSR2SQ5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4Njm/SHlwZXJ0ZXh0TGl0ZXJhbC5hdHRyaWJ1dGVfcGFpcpCkQGh0bJC6SHlwZXJ0ZXh0TGl0ZXJhbC5TY3JpcHRUYWeQpEJhc2WQqUJhc2Uuc2hvd5HZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N6VCb25kc5HZJDUwMjhmYzAxLTRlMTQtNDU1MC04YWU2LTQ4NzAzYjg2ZGMyMbBIeXBlcnRleHRMaXRlcmFskdkkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBjt0h5cGVydGV4dExpdGVyYWwuUmVzdWx0kKtCYXNlLkBrd2RlZpDZJGIwMWUwMTc5LTM1OTQtNGQ0NC04MzFhLTEyMDI4ZTNiZjQ4ZYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGIwMWUwMTc5LTM1OTQtNGQ0NC04MzFhLTEyMDI4ZTNiZjQ4ZbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwhLdIeXBlcnRleHRMaXRlcmFsLkJ5cGFzc5C3SHlwZXJ0ZXh0TGl0ZXJhbC5SZXN1bHSQsEh5cGVydGV4dExpdGVyYWyR2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGOkQGh0bJDZJDllNTZkYmI5LTJlOTMtNDEzNi1iMTBiLTdiMWVjYjA3ZTZmMYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDllNTZkYmI5LTJlOTMtNDEzNi1iMTBiLTdiMWVjYjA3ZTZmMbRkb3duc3RyZWFtX2NlbGxzX21hcIGvQG9ubHlfYXNfc2NyaXB0kLJ1cHN0cmVhbV9jZWxsc19tYXCEo2VzY5CqX19tb2R1bGVfX5Cuc2tpcF9hc19zY3JpcHSR2SQ4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzWnbm90aGluZ5DZJDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwY4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMHp2NlbGxfaWTZJDFiNzM3ODA1LWE0MTEtNDU4NS1iMjE1LWQwZjk5ZWFmYWMwY7Rkb3duc3RyZWFtX2NlbGxzX21hcIGwSHlwZXJ0ZXh0TGl0ZXJhbJTZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N9kkYjAxZTAxNzktMzU5NC00ZDQ0LTgzMWEtMTIwMjhlM2JmNDhl2SQ5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4NjnZJDgwMWZiMDIxLTczYTAtNDExNC1hMzZhLTMyOGU4NGYwMGI1MbJ1cHN0cmVhbV9jZWxsc19tYXCA2SQ0MWQ2NGE5NS02YzAzLTRhNWQtOWZkNy00OTZkMGU2YzAzNDaEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ0MWQ2NGE5NS02YzAzLTRhNWQtOWZkNy00OTZkMGU2YzAzNDa0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIKvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2onhikdkkZjA4NjgwYjItZWQyOC00ZmFjLTgzOGMtMmVjYTdlNzVjNmRj2SQ5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4NjmEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4Njm0ZG93bnN0cmVhbV9jZWxsc19tYXCBtnNldF9pbnB1dF92YWx1ZV9jb21wYXSR2SQxOTYxM2YzZi01ODI1LTQ1YTQtODk1MS04ZmYxMDQzZDA4NjeydXBzdHJlYW1fY2VsbHNfbWFwgrtIeXBlcnRleHRMaXRlcmFsLkphdmFTY3JpcHSQsEh5cGVydGV4dExpdGVyYWyR2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGPZJDg4MWI3NWQzLWNlYmUtNGE1My04Y2Y1LWJlYWVlZGRhZmQzNYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDg4MWI3NWQzLWNlYmUtNGE1My04Y2Y1LWJlYWVlZGRhZmQzNbRkb3duc3RyZWFtX2NlbGxzX21hcIGuc2tpcF9hc19zY3JpcHST2SQ5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjHZJGRhZGYyZjQwLTE3NjQtNDdhNC1iNTYwLTY4M2I2NDc5ZDc3ZtkkMzhiN2VlYjktODBiYi00YTNhLWEyZDItODA5ZmM0MjM2MjVjsnVwc3RyZWFtX2NlbGxzX21hcIWmTW9kdWxlkKRNYWlukKxwYXJlbnRtb2R1bGWQoj09kKlpc2RlZmluZWSQ2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTGEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTG0ZG93bnN0cmVhbV9jZWxsc19tYXCCuGFub24xNzMwNzM4MTcwMDk2NDU1MTY3MJCmc3BlZWRzkdkkZDc5ODU4NDQtNTk0NC00MmI5LWFkNDEtNTk5Y2Q3MmVlYTgysnVwc3RyZWFtX2NlbGxzX21hcI7ZIE1haW4uUGx1dG9SdW5uZXIuQ29yZS5hcHBsaWNhYmxlkKE6kLdIeXBlcnRleHRMaXRlcmFsLkJ5cGFzc5C5TWFpbi5QbHV0b1J1bm5lci5CYXNlLmdldJClQGJpbmSQuEh5cGVydGV4dExpdGVyYWwuY29udGVudJCmU2xpZGVykNkoTWFpbi5QbHV0b1J1bm5lci5QbHV0b1J1bm5lci5jcmVhdGVfYm9uZJCvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2pE1haW6Qp2NvbWJpbmWQt0h5cGVydGV4dExpdGVyYWwuUmVzdWx0kLBIeXBlcnRleHRMaXRlcmFskdkkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBjqGlkZW50aXR5kNkkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwtGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCBp2NvbmZpcm2R2SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzPZJDM4YjdlZWI5LTgwYmItNGEzYS1hMmQyLTgwOWZjNDIzNjI1Y4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMHp2NlbGxfaWTZJDM4YjdlZWI5LTgwYmItNGEzYS1hMmQyLTgwOWZjNDIzNjI1Y7Rkb3duc3RyZWFtX2NlbGxzX21hcIGnUGx1dG9VSZCydXBzdHJlYW1fY2VsbHNfbWFwgqtAX19NT0RVTEVfX5Cuc2tpcF9hc19zY3JpcHSR2SQ4ODFiNzVkMy1jZWJlLTRhNTMtOGNmNS1iZWFlZWRkYWZkMzXZJDhkY2IyNDk4LTAwY2YtNDlhOC04MDc0LTMwMWZlODhiNzZlYYS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDhkY2IyNDk4LTAwY2YtNDlhOC04MDc0LTMwMWZlODhiNzZlYbRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgq9Ac2tpcF9hc19zY3JpcHSR2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzaheJHZJGYwODY4MGIyLWVkMjgtNGZhYy04MzhjLTJlY2E3ZTc1YzZkY9kkM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE1hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE1tGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCCp0BtZF9zdHKQqGdldGluZGV4kNkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2hLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2tGRvd25zdHJlYW1fY2VsbHNfbWFwga9Ac2tpcF9hc19zY3JpcHSY2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGPZJDQxZDY0YTk1LTZjMDMtNGE1ZC05ZmQ3LTQ5NmQwZTZjMDM0NtkkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVh2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTHZJDQ1MWMzYzExLWMzZGMtNGQ2ZS1iOWU1LWMzOTA0ZTQwNTgxMtkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYw2SRhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzXZJGM3YTMyYWIyLTJhNWItNDg1Yi05Nzk1LTRhNzQzNjA0ZGU4MrJ1cHN0cmVhbV9jZWxsc19tYXCHpEBkb2OQpVR1cGxlkKNlc2OQpVVuaW9ukKpfX21vZHVsZV9fkKNBbnmQp25vdGhpbmeQ2SRiYjllZGRjMy0yMDhjLTQxMTMtODk4OC0zMTFlYjFkY2ZjZDSEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRiYjllZGRjMy0yMDhjLTQxMTMtODk4OC0zMTFlYjFkY2ZjZDS0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIOlcHVzaCGQpGl0dnOR2SQ0NTFjM2MxMS1jM2RjLTRkNmUtYjllNS1jMzkwNGU0MDU4MTKjaXR2kdkkNDUxYzNjMTEtYzNkYy00ZDZlLWI5ZTUtYzM5MDRlNDA1ODEy2SRjY2JlNDQyMy04MDFiLTRjMjAtYWQyZC1lZTg5ZDVjZmE4NTmEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRjY2JlNDQyMy04MDFiLTRjMjAtYWQyZC1lZTg5ZDVjZmE4NTm0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIGoZ2V0aW5kZXiQ2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGOEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGO0ZG93bnN0cmVhbV9jZWxsc19tYXCConhikdkkNDFkNjRhOTUtNmMwMy00YTVkLTlmZDctNDk2ZDBlNmMwMzQ2oXiR2SQ4ZGNiMjQ5OC0wMGNmLTQ5YTgtODA3NC0zMDFmZTg4Yjc2ZWGydXBzdHJlYW1fY2VsbHNfbWFwjdkgTWFpbi5QbHV0b1J1bm5lci5Db3JlLmFwcGxpY2FibGWQpHNxcnSQuU1haW4uUGx1dG9SdW5uZXIuQmFzZS5nZXSQpUBiaW5kkKN0YW6Q2ShNYWluLlBsdXRvUnVubmVyLlBsdXRvUnVubmVyLmNyZWF0ZV9ib25kkKZTbGlkZXKQr0Bza2lwX2FzX3NjcmlwdJHZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNqRNYWlukKVmbG9vcpCnY29uZmlybZHZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM6Njb3OQo3NpbpDZJGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgaZzcGVlZHOR2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTHZJGZjOTJiM2ZjLTYxNDMtNDc3Yy1hNDEzLTg0ZGNkMWI0Y2ZjMIS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJGZjOTJiM2ZjLTYxNDMtNDc3Yy1hNDEzLTg0ZGNkMWI0Y2ZjMLRkb3duc3RyZWFtX2NlbGxzX21hcIGhdJHZJDM2M2E2NWVjLTIxOGMtNDNhMi1iNzQwLTgwNjFmYWMyNTAxMbJ1cHN0cmVhbV9jZWxsc19tYXCJ2SBNYWluLlBsdXRvUnVubmVyLkNvcmUuYXBwbGljYWJsZZCkTWFpbpCkQmFzZZCuQmFzZS5Eb2NzLkhUTUyQqUBodG1sX3N0cpC5TWFpbi5QbHV0b1J1bm5lci5CYXNlLmdldJCnY29uZmlybZHZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM6VAYmluZJDZKE1haW4uUGx1dG9SdW5uZXIuUGx1dG9SdW5uZXIuY3JlYXRlX2JvbmSQ2SRhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzWEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzW0ZG93bnN0cmVhbV9jZWxsc19tYXCAsnVwc3RyZWFtX2NlbGxzX21hcIOvQHNraXBfYXNfc2NyaXB0kdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM2pXNsZWVwkKR3b3d6kdkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwtGNlbGxfZXhlY3V0aW9uX29yZGVy3AAe2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGPZJDg4MWI3NWQzLWNlYmUtNGE1My04Y2Y1LWJlYWVlZGRhZmQzNdkkZGFkZjJmNDAtMTc2NC00N2E0LWI1NjAtNjgzYjY0NzlkNzdm2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWPZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNtkkOWU1NmRiYjktMmU5My00MTM2LWIxMGItN2IxZWNiMDdlNmYx2SQ1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjHZJGNjYmU0NDIzLTgwMWItNGMyMC1hZDJkLWVlODlkNWNmYTg1OdkkODU5MTg2MDktNWUxZi00MDQwLTk5YmUtNjFjMmRkOGZmNjU02SRiMDFlMDE3OS0zNTk0LTRkNDQtODMxYS0xMjAyOGUzYmY0OGXZJDk1Nzg1OGY4LTRhY2UtNGNhZS1iYjE2LTQ5NTY5ZGFhOTg2OdkkMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY32SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzPZJGFkNWNmZmE1LTMxM2MtNGRlOS05MzYwLTAwNTM2NWI0MDc4MNkkNmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdk2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGPZJDQxZDY0YTk1LTZjMDMtNGE1ZC05ZmQ3LTQ5NmQwZTZjMDM0NtkkOGRjYjI0OTgtMDBjZi00OWE4LTgwNzQtMzAxZmU4OGI3NmVh2SRmYzkyYjNmYy02MTQzLTQ3N2MtYTQxMy04NGRjZDFiNGNmYzDZJDM2M2E2NWVjLTIxOGMtNDNhMi1iNzQwLTgwNjFmYWMyNTAxMdkkODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUx2SRkNzk4NTg0NC01OTQ0LTQyYjktYWQ0MS01OTljZDcyZWVhODLZJDVhMDE5NmQwLWUxOWYtNDIwMi1iMzZkLTE4YWI5YmU4MzliM9kkM2QzYTZhYmItYmVhNy00MWUyLTg2MmQtOTUzNmE5Njg3ZWE12SQ0NTFjM2MxMS1jM2RjLTRkNmUtYjllNS1jMzkwNGU0MDU4MTLZJGJiOWVkZGMzLTIwOGMtNDExMy04OTg4LTMxMWViMWRjZmNkNNkkN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2Zm2SQ4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjDZJGExYTliMjJmLTlkZjctNGM1Zi1hNzNkLTM4ZTE4NGRhN2MzNdkkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgytGxhc3RfaG90X3JlbG9hZF90aW1lywAAAAAAAAAAqXNob3J0cGF0aKpDb25maXJtLmpsrnByb2Nlc3Nfc3RhdHVzpXJlYWR5pHBhdGjZLy9Vc2Vycy9mb25zL0RvY3VtZW50cy9QbHV0b1VJLmpsL3NyYy9Db25maXJtLmpsrmxhc3Rfc2F2ZV90aW1ly0HYbOMuHQAAqmNlbGxfb3JkZXLcAB7ZJDg4MWI3NWQzLWNlYmUtNGE1My04Y2Y1LWJlYWVlZGRhZmQzNdkkYmE5NGM5YjMtNTViZi00ODZhLThiZjMtZWIwYjNlNjVlNTM22SQ5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjHZJGRhZGYyZjQwLTE3NjQtNDdhNC1iNTYwLTY4M2I2NDc5ZDc3ZtkkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBj2SQ1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjHZJGNjYmU0NDIzLTgwMWItNGMyMC1hZDJkLWVlODlkNWNmYTg1OdkkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgw2SRhMjBkYTE4Zi03YTc0LTQzY2EtOWI2Ni0xZjNiODJlZmEwYzPZJDg1OTE4NjA5LTVlMWYtNDA0MC05OWJlLTYxYzJkZDhmZjY1NNkkMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY32SRiMDFlMDE3OS0zNTk0LTRkNDQtODMxYS0xMjAyOGUzYmY0OGXZJDk1Nzg1OGY4LTRhY2UtNGNhZS1iYjE2LTQ5NTY5ZGFhOTg2OdkkNmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdk2SQzOGI3ZWViOS04MGJiLTRhM2EtYTJkMi04MDlmYzQyMzYyNWPZJGYwODY4MGIyLWVkMjgtNGZhYy04MzhjLTJlY2E3ZTc1YzZkY9kkNDFkNjRhOTUtNmMwMy00YTVkLTlmZDctNDk2ZDBlNmMwMzQ22SQ4ZGNiMjQ5OC0wMGNmLTQ5YTgtODA3NC0zMDFmZTg4Yjc2ZWHZJGZjOTJiM2ZjLTYxNDMtNDc3Yy1hNDEzLTg0ZGNkMWI0Y2ZjMNkkMzYzYTY1ZWMtMjE4Yy00M2EyLWI3NDAtODA2MWZhYzI1MDEx2SQ4MDFmYjAyMS03M2EwLTQxMTQtYTM2YS0zMjhlODRmMDBiNTHZJGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MtkkNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIz2SQzZDNhNmFiYi1iZWE3LTQxZTItODYyZC05NTM2YTk2ODdlYTXZJDQ1MWMzYzExLWMzZGMtNGQ2ZS1iOWU1LWMzOTA0ZTQwNTgxMtkkYmI5ZWRkYzMtMjA4Yy00MTEzLTg5ODgtMzExZWIxZGNmY2Q02SQ3ZGU1MDQzNS1lOTYyLTQ0MDUtYjA2ZC04M2ZiZTk0MzZjZmbZJDgyOWY5MGFjLWM0ZDktNGFmOS05ODRhLWI0ZTUyYTA3NTQ2MNkkYTFhOWIyMmYtOWRmNy00YzVmLWE3M2QtMzhlMTg0ZGE3YzM12SRjN2EzMmFiMi0yYTViLTQ4NWItOTc5NS00YTc0MzYwNGRlODKxcHVibGlzaGVkX29iamVjdHOApW5icGtnh7JpbnN0YWxsZWRfdmVyc2lvbnOAsHRlcm1pbmFsX291dHB1dHOAp2VuYWJsZWTCt3Jlc3RhcnRfcmVjb21tZW5kZWRfbXNnwLRyZXN0YXJ0X3JlcXVpcmVkX21zZ8CtYnVzeV9wYWNrYWdlc5CsaW5zdGFudGlhdGVkwqtjZWxsX2lucHV0c94AHtkkNDUxYzNjMTEtYzNkYy00ZDZlLWI5ZTUtYzM5MDRlNDA1ODEyhKdjZWxsX2lk2SQ0NTFjM2MxMS1jM2RjLTRkNmUtYjllNS1jMzkwNGU0MDU4MTKwcnVubmluZ19kaXNhYmxlZMKkY29kZdlSQHNraXBfYXNfc2NyaXB0IGJlZ2luCglpdHZzID0gW10KCglpdGIgPSBAYmluZCBpdHYgY29uZmlybShTbGlkZXIoW3NpbiwgY29zXSkpCmVuZKtjb2RlX2ZvbGRlZMLZJDM2M2E2NWVjLTIxOGMtNDNhMi1iNzQwLTgwNjFmYWMyNTAxMYSnY2VsbF9pZNkkMzYzYTY1ZWMtMjE4Yy00M2EyLWI3NDAtODA2MWZhYzI1MDExsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGWhdKtjb2RlX2ZvbGRlZMLZJDdkZTUwNDM1LWU5NjItNDQwNS1iMDZkLTgzZmJlOTQzNmNmZoSnY2VsbF9pZNkkN2RlNTA0MzUtZTk2Mi00NDA1LWIwNmQtODNmYmU5NDM2Y2ZmsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZJG1kIiIiCiMjIyBDb21iaW5lIGluc2lkZSBjb21iaW5lCiIiIqtjb2RlX2ZvbGRlZMPZJDZjOGEwM2U0LTdkOGUtNGFhNC1hNzUwLTdiODE1NjIyMTQ3ZISnY2VsbF9pZNkkNmM4YTAzZTQtN2Q4ZS00YWE0LWE3NTAtN2I4MTU2MjIxNDdksHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGW1bWQiIiIKIyMgRXhhbXBsZXMKIiIiq2NvZGVfZm9sZGVkw9kkNWEwMTk2ZDAtZTE5Zi00MjAyLWIzNmQtMThhYjliZTgzOWIzhKdjZWxsX2lk2SQ1YTAxOTZkMC1lMTlmLTQyMDItYjM2ZC0xOGFiOWJlODM5YjOwcnVubmluZ19kaXNhYmxlZMKkY29kZbJtZCIiIgojIyBUZXN0cwoiIiKrY29kZV9mb2xkZWTD2SQ4NTkxODYwOS01ZTFmLTQwNDAtOTliZS02MWMyZGQ4ZmY2NTSEp2NlbGxfaWTZJDg1OTE4NjA5LTVlMWYtNDA0MC05OWJlLTYxYzJkZDhmZjY1NLBydW5uaW5nX2Rpc2FibGVkwqRjb2Rltm1kIiIiCiMjIFRoZSBtYWdpYwoiIiKrY29kZV9mb2xkZWTD2SRkYWRmMmY0MC0xNzY0LTQ3YTQtYjU2MC02ODNiNjQ3OWQ3N2aEp2NlbGxfaWTZJGRhZGYyZjQwLTE3NjQtNDdhNC1iNTYwLTY4M2I2NDc5ZDc3ZrBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2XhpZiBza2lwX2FzX3NjcmlwdChAX19NT0RVTEVfXykKCWltcG9ydCBQa2cKCVBrZy5hY3RpdmF0ZShCYXNlLmN1cnJlbnRfcHJvamVjdChAX19ESVJfXykpCglUZXh0KCJQcm9qZWN0IGVudiBhY3RpdmUiKQplbmSrY29kZV9mb2xkZWTD2SQ1MDI4ZmMwMS00ZTE0LTQ1NTAtOGFlNi00ODcwM2I4NmRjMjGEp2NlbGxfaWTZJDUwMjhmYzAxLTRlMTQtNDU1MC04YWU2LTQ4NzAzYjg2ZGMyMbBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2SNpbXBvcnQgQWJzdHJhY3RQbHV0b0RpbmdldGplcy5Cb25kc6tjb2RlX2ZvbGRlZMLZJGEyMGRhMThmLTdhNzQtNDNjYS05YjY2LTFmM2I4MmVmYTBjM4SnY2VsbF9pZNkkYTIwZGExOGYtN2E3NC00M2NhLTliNjYtMWYzYjgyZWZhMGMzsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXaBVkiIiIKYGBganVsaWEKY29uZmlybShlbGVtZW50OjpBbnkpCmBgYAoKTm9ybWFsbHksIHdoZW4geW91IG1vdmUgYSBbYFNsaWRlcmBdKEByZWYpIG9yIHR5cGUgaW4gYSBbYFRleHRGaWVsZGBdKEByZWYpLCBhbGwgaW50ZXJtZWRpYXRlIHZhbHVlcyBhcmUgc2VudCBiYWNrIHRvIGBAYmluZGAuCgpCeSB3cmFwcGluZyBhbiBpbnB1dCBlbGVtZW50IGluIGBjb25maXJtYCwgeW91IGdldCBhIGJ1dHRvbiB0byBtYW51YWxseSBjb250cm9sIHdoZW4gdGhlIHZhbHVlIGlzIHNlbnQsIGludGVybWVkaWF0ZSB1cGRhdGVzIGFyZSBoaWRkZW4gZnJvbSBQbHV0by4KCk9uZSBjYXNlIHdoZXJlIHRoaXMgaXMgdXNlZnVsIGlzIGEgbm90ZWJvb2sgdGhhdCBkb2VzIGEgbG9uZyBjb21wdXRhdGlvbiBiYXNlZCBvbiBhIGBAYmluZGAgaW5wdXQuCgojIEV4YW1wbGVzCgpgYGBqdWxpYQpAYmluZCB4IGNvbmZpcm0oU2xpZGVyKDE6MTAwKSkKCnggPT0gMSAjIChpbml0aWFsbHkpCmBgYAoKTm93LCB3aGVuIHlvdSBtb3ZlIHRoZSBzbGlkZXIsIG5vdGhpbmcgaGFwcGVucywgdW50aWwgeW91IGNsaWNrIHRoZSBgIkNvbmZpcm0iYCBidXR0b24sIGFuZCBgeGAgaXMgc2V0IHRvIHRoZSBuZXcgc2xpZGVyIHZhbHVlLgoKPiBUaGUgcmVzdWx0IGxvb2tzIGxpa2U6Cj4gCj4gIVtzY3JlZW5zaG90IG9mIHJ1bm5pbmcgdGhlIGNvZGUgYWJvdmUgaW4gcGx1dG9dKGh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzY5MzM1MTAvMTQ1NjE1MjExLTI3MzFmMWY1LTVjN2QtNGFhYy05YWE1LThhZmU4OWUyNGE2Yi5wbmcpCgojIFNlZSBhbHNvCgpZb3UgY2FuIGNvbWJpbmUgdGhpcyB3aXRoIFtgUGx1dG9VSS5jb21iaW5lYF0oQHJlZikhCgpgYGBqdWxpYQpAYmluZCBzcGVlZHMgY29uZmlybSgKCWNvbWJpbmUoKSBkbyBDaGlsZAoJCUBodGwoIiJcIgoJCTxoMz5XaW5kIHNwZWVkczwvaDM+CgkJPHVsPgoJCVwkKFsKCQkJQGh0bCgiPGxpPlwkKG5hbWUpOiBcJChDaGlsZChuYW1lLCBTbGlkZXIoMToxMDApKSkiKQoJCQlmb3IgbmFtZSBpbiBbIk5vcnRoIiwgIkVhc3QiLCAiU291dGgiLCAiV2VzdCJdCgkJXSkKCQk8L3VsPgoJCSIiXCIpCgllbmQKKQpgYGAKCj4gVGhlIHJlc3VsdCBsb29rcyBsaWtlOgo+IAo+ICFbc2NyZWVuc2hvdCBvZiBydW5uaW5nIHRoZSBjb2RlIGFib3ZlIGluIHBsdXRvXShodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS82OTMzNTEwLzE0NTYxNDk2NS03YTFlODYzMC00NzY2LTQ1ODktOGE4NC1iMDIyYmRmYjA5ZmMuZ2lmKQoKIiIiCmZ1bmN0aW9uIGNvbmZpcm0oZWxlbWVudDo6QW55KQoJQ29uZmlybUJvbmQoOwoJCWVsZW1lbnQ9ZWxlbWVudCwKCSkKZW5kq2NvZGVfZm9sZGVkwtkkODI5ZjkwYWMtYzRkOS00YWY5LTk4NGEtYjRlNTJhMDc1NDYwhKdjZWxsX2lk2SQ4MjlmOTBhYy1jNGQ5LTRhZjktOTg0YS1iNGU1MmEwNzU0NjCwcnVubmluZ19kaXNhYmxlZMKkY29kZdlFQHNraXBfYXNfc2NyaXB0IGNiMmIgPSBAYmluZCB3b3d6IGNvbmZpcm0oY29uZmlybShTbGlkZXIoMToxLy8zOjEwKSkpq2NvZGVfZm9sZGVkwtkkYzdhMzJhYjItMmE1Yi00ODViLTk3OTUtNGE3NDM2MDRkZTgyhKdjZWxsX2lk2SRjN2EzMmFiMi0yYTViLTQ4NWItOTc5NS00YTc0MzYwNGRlODKwcnVubmluZ19kaXNhYmxlZMKkY29kZbRAc2tpcF9hc19zY3JpcHQgY2IyYqtjb2RlX2ZvbGRlZMLZJDE5NjEzZjNmLTU4MjUtNDVhNC04OTUxLThmZjEwNDNkMDg2N4SnY2VsbF9pZNkkMTk2MTNmM2YtNTgyNS00NWE0LTg5NTEtOGZmMTA0M2QwODY3sHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXaB5ViZWdpbgoJQmFzZS5Aa3dkZWYgc3RydWN0IENvbmZpcm1Cb25kCgkJZWxlbWVudDo6QW55CgkJc2VjcmV0X2tleTo6U3RyaW5nPVN0cmluZyhyYW5kKCdhJzoneicsIDEwKSkKCWVuZAoKCWZ1bmN0aW9uIEJhc2Uuc2hvdyhpbzo6SU8sIG06Ok1JTUUidGV4dC9odG1sIiwgY2I6OkNvbmZpcm1Cb25kKQoJCW91dHB1dCA9IEBodGwoIiIiCgkJPHNwYW4+CgkJJChjYi5lbGVtZW50KQoJCTxidXR0b24gaWQ9JChjYi5zZWNyZXRfa2V5KT5Db25maXJtPC9idXR0b24+CgkJCgkJPHNjcmlwdCBpZD0kKGNiLnNlY3JldF9rZXkpPgoJCQoJCWxldCBrZXkgPSAkKGNiLnNlY3JldF9rZXkpCgkJCgkJbGV0IGRpdiA9IGN1cnJlbnRTY3JpcHQucGFyZW50RWxlbWVudAoJCWxldCBidXR0b24gPSBjdXJyZW50U2NyaXB0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcKCQlsZXQgaW5wdXQgPSBkaXYuZmlyc3RFbGVtZW50Q2hpbGQKCQlpZihpbnB1dCA9PT0gYnV0dG9uKSB7CgkJCXJldHVybgoJCX0KCgkJCgkJbGV0IHNldF9pbnB1dF92YWx1ZSA9ICQoc2V0X2lucHV0X3ZhbHVlX2NvbXBhdCkKCgoJCWxldCBwcml2YXRlX3ZhbHVlID0gbnVsbAoJCWxldCBwdWJsaWNfdmFsdWUgPSBudWxsCgoJCQoKCQkKCQlwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gZGl2LnZhbHVlCgkJaWYocHJpdmF0ZV92YWx1ZSAhPSBudWxsKSB7CgkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgcHJpdmF0ZV92YWx1ZSkKCQl9IGVsc2UgewoJCQoJCQkvLyBwcml2YXRlX3ZhbHVlID0gcHVibGljX3ZhbHVlID0gaW5wdXQudmFsdWUKCQl9CgkJCgkJaW5wdXQub25pbnB1dCA9IChlKSA9PiB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCkKCQl9CgkJY29uc3QgZ2VuID0gR2VuZXJhdG9ycy5pbnB1dChpbnB1dCkKCgkJbGV0IGZpcnN0X3ZhbHVlID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCXByaXZhdGVfdmFsdWUgPSBwdWJsaWNfdmFsdWUgPSBmaXJzdF92YWx1ZQoJCQoJCTsoYXN5bmMgKCkgPT4gewoJCQl3aGlsZSh0cnVlKSB7CgkJCQlwcml2YXRlX3ZhbHVlID0gYXdhaXQgZ2VuLm5leHQoKS52YWx1ZQoJCQkJLy8gZGl2LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHt9KSkKCQkJfQoJCX0pKCkKCgkJYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewoJCQlwdWJsaWNfdmFsdWUgPSBwcml2YXRlX3ZhbHVlCgkJCWRpdi5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7fSkpCgkJfSkKCgkKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZGl2LCAndmFsdWUnLCB7CgkJCWdldDogKCkgPT4gcHVibGljX3ZhbHVlLAoJCQlzZXQ6IChuZXd2YWwpID0+IHsKCQkJCXByaXZhdGVfdmFsdWUgPSBuZXd2YWwKCQkJCXB1YmxpY192YWx1ZSA9IG5ld3ZhbAoJCQkJCgkJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIG5ld3ZhbCkKCQkJfSwKCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCX0pOwoJCgkJPC9zY3JpcHQ+CgkJPC9zcGFuPgoJCSIiIikKCQlCYXNlLnNob3coaW8sIG0sIG91dHB1dCkKCWVuZAoKCWZ1bmN0aW9uIEJvbmRzLmluaXRpYWxfdmFsdWUoY2I6OkNvbmZpcm1Cb25kKQoJCUJvbmRzLmluaXRpYWxfdmFsdWUoY2IuZWxlbWVudCkKCWVuZAoJZnVuY3Rpb24gQm9uZHMudmFsaWRhdGVfdmFsdWUoY2I6OkNvbmZpcm1Cb25kLCBmcm9tX2pzKQoJCUJvbmRzLnZhbGlkYXRlX3ZhbHVlKGNiLmVsZW1lbnQsIGZyb21fanMpCgllbmQKCWZ1bmN0aW9uIEJvbmRzLnRyYW5zZm9ybV92YWx1ZShjYjo6Q29uZmlybUJvbmQsIGZyb21fanMpCgkJQm9uZHMudHJhbnNmb3JtX3ZhbHVlKGNiLmVsZW1lbnQsIGZyb21fanMpCgllbmQKCWZ1bmN0aW9uIEJvbmRzLnBvc3NpYmxlX3ZhbHVlcyhjYjo6Q29uZmlybUJvbmQpCgkJQm9uZHMucG9zc2libGVfdmFsdWVzKGNiLmVsZW1lbnQpCgllbmQKCQplbmSrY29kZV9mb2xkZWTC2SRiMDFlMDE3OS0zNTk0LTRkNDQtODMxYS0xMjAyOGUzYmY0OGWEp2NlbGxfaWTZJGIwMWUwMTc5LTM1OTQtNGQ0NC04MzFhLTEyMDI4ZTNiZjQ4ZbBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2UBAaHRsKAoJIiIiCgk8c2NyaXB0PgoKCWNvbnNvbGUubG9nKEdlbmVyYXRvcnMpCgk8L3NjcmlwdD4KCSIiIgopq2NvZGVfZm9sZGVkwtkkOWU1NmRiYjktMmU5My00MTM2LWIxMGItN2IxZWNiMDdlNmYxhKdjZWxsX2lk2SQ5ZTU2ZGJiOS0yZTkzLTQxMzYtYjEwYi03YjFlY2IwN2U2ZjGwcnVubmluZ19kaXNhYmxlZMKkY29kZdlLbWFjcm8gb25seV9hc19zY3JpcHQoZXgpIHNraXBfYXNfc2NyaXB0KF9fbW9kdWxlX18pID8gbm90aGluZyA6IGVzYyhleCkgZW5kq2NvZGVfZm9sZGVkw9kkMWI3Mzc4MDUtYTQxMS00NTg1LWIyMTUtZDBmOTllYWZhYzBjhKdjZWxsX2lk2SQxYjczNzgwNS1hNDExLTQ1ODUtYjIxNS1kMGY5OWVhZmFjMGOwcnVubmluZ19kaXNhYmxlZMKkY29kZbZ1c2luZyBIeXBlcnRleHRMaXRlcmFsq2NvZGVfZm9sZGVkwtkkNDFkNjRhOTUtNmMwMy00YTVkLTlmZDctNDk2ZDBlNmMwMzQ2hKdjZWxsX2lk2SQ0MWQ2NGE5NS02YzAzLTRhNWQtOWZkNy00OTZkMGU2YzAzNDawcnVubmluZ19kaXNhYmxlZMKkY29kZbJAc2tpcF9hc19zY3JpcHQgeGKrY29kZV9mb2xkZWTC2SQ5NTc4NThmOC00YWNlLTRjYWUtYmIxNi00OTU2OWRhYTk4NjmEp2NlbGxfaWTZJDk1Nzg1OGY4LTRhY2UtNGNhZS1iYjE2LTQ5NTY5ZGFhOTg2ObBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2gYTY29uc3Qgc2V0X2lucHV0X3ZhbHVlX2NvbXBhdCA9IEh5cGVydGV4dExpdGVyYWwuSmF2YVNjcmlwdCgiIiIKKCgpID0+IHsKCWxldCByZXN1bHQgPSBudWxsCgl0cnkgewoJcmVzdWx0ID0gc2V0Qm91bmRFbGVtZW50VmFsdWVMaWtlUGx1dG8KfSBjYXRjaCAoZSkgewoJcmVzdWx0ID0gKChpbnB1dCwgbmV3X3ZhbHVlKSA9PiB7CgkvLyBmYWxsYmFjayBpbiBjYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb25zcC9QbHV0by5qbC9wdWxsLzE3NTUgaXMgbm90IGF2YWlsYWJsZQogICAgaWYgKG5ld192YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgICAgICByZXR1cm4KICAgIH0KICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHsKICAgICAgICBzd2l0Y2ggKGlucHV0LnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAicmFuZ2UiOgogICAgICAgICAgICBjYXNlICJudW1iZXIiOiB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsdWVBc051bWJlciAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc051bWJlciA9IG5ld192YWx1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6IHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZUFzRGF0ZSA9PSBudWxsIHx8IE51bWJlcihpbnB1dC52YWx1ZUFzRGF0ZSkgIT09IE51bWJlcihuZXdfdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWVBc0RhdGUgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImNoZWNrYm94IjogewogICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgIT09IG5ld192YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImZpbGUiOiB7CiAgICAgICAgICAgICAgICAvLyBDYW4ndCBzZXQgZmlsZXMgOigKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGlucHV0Lm11bHRpcGxlKSB7CiAgICAgICAgZm9yIChsZXQgb3B0aW9uIG9mIEFycmF5LmZyb20oaW5wdXQub3B0aW9ucykpIHsKICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbmV3X3ZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkKICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICB9CiAgICAvL0B0cy1pZ25vcmUKICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gbmV3X3ZhbHVlKSB7CiAgICAgICAgLy9AdHMtaWdub3JlCiAgICAgICAgaW5wdXQudmFsdWUgPSBuZXdfdmFsdWUKICAgIH0KfSkKfQpyZXR1cm4gcmVzdWx0Cn0pKCkKIiIiKatjb2RlX2ZvbGRlZMPZJDg4MWI3NWQzLWNlYmUtNGE1My04Y2Y1LWJlYWVlZGRhZmQzNYSnY2VsbF9pZNkkODgxYjc1ZDMtY2ViZS00YTUzLThjZjUtYmVhZWVkZGFmZDM1sHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZq2Z1bmN0aW9uIHNraXBfYXNfc2NyaXB0KG06Ok1vZHVsZSkKCWlmIGlzZGVmaW5lZChtLCA6UGx1dG9Gb3JjZURpc3BsYXkpCgkJcmV0dXJuIG0uUGx1dG9Gb3JjZURpc3BsYXkKCWVsc2UKCQlpc2RlZmluZWQobSwgOlBsdXRvUnVubmVyKSAmJiBwYXJlbnRtb2R1bGUobSkgPT0gTWFpbgoJZW5kCmVuZKtjb2RlX2ZvbGRlZMPZJDgwMWZiMDIxLTczYTAtNDExNC1hMzZhLTMyOGU4NGYwMGI1MYSnY2VsbF9pZNkkODAxZmIwMjEtNzNhMC00MTE0LWEzNmEtMzI4ZTg0ZjAwYjUxsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZ7EBza2lwX2FzX3NjcmlwdCBAYmluZCBzcGVlZHMgaWRlbnRpdHkoCgljb21iaW5lKCkgZG8gQ2hpbGQKCQlAaHRsKCIiIgoJCTxoMz5XaW5kIHNwZWVkczwvaDM+CgkJPHVsPgoJCSQoWwoJCQlAaHRsKCI8bGk+JChuYW1lKTogJChDaGlsZChuYW1lLCBTbGlkZXIoMToxMDApKSkiKQoJCQlmb3IgbmFtZSBpbiBbIk5vcnRoIiwgIkVhc3QiLCAiU291dGgiLCAiV2VzdCJdCgkJXSkKCQk8L3VsPgoJCSIiIikKCWVuZAopq2NvZGVfZm9sZGVkw9kkYWQ1Y2ZmYTUtMzEzYy00ZGU5LTkzNjAtMDA1MzY1YjQwNzgwhKdjZWxsX2lk2SRhZDVjZmZhNS0zMTNjLTRkZTktOTM2MC0wMDUzNjViNDA3ODCwcnVubmluZ19kaXNhYmxlZMKkY29kZa5leHBvcnQgY29uZmlybatjb2RlX2ZvbGRlZMLZJDM4YjdlZWI5LTgwYmItNGEzYS1hMmQyLTgwOWZjNDIzNjI1Y4SnY2VsbF9pZNkkMzhiN2VlYjktODBiYi00YTNhLWEyZDItODA5ZmM0MjM2MjVjsHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZMWlmIHNraXBfYXNfc2NyaXB0KEBfX01PRFVMRV9fKQoJdXNpbmcgUGx1dG9VSQplbmSrY29kZV9mb2xkZWTC2SQ4ZGNiMjQ5OC0wMGNmLTQ5YTgtODA3NC0zMDFmZTg4Yjc2ZWGEp2NlbGxfaWTZJDhkY2IyNDk4LTAwY2YtNDlhOC04MDc0LTMwMWZlODhiNzZlYbBydW5uaW5nX2Rpc2FibGVkwqRjb2RltkBza2lwX2FzX3NjcmlwdCB4KDIzNCmrY29kZV9mb2xkZWTC2SQzZDNhNmFiYi1iZWE3LTQxZTItODYyZC05NTM2YTk2ODdlYTWEp2NlbGxfaWTZJDNkM2E2YWJiLWJlYTctNDFlMi04NjJkLTk1MzZhOTY4N2VhNbBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2SdtZCIiIgojIyMgSW5pdGlhbCB2YWx1ZSAmIHRyYW5zZm9ybQoiIiKrY29kZV9mb2xkZWTD2SRiYTk0YzliMy01NWJmLTQ4NmEtOGJmMy1lYjBiM2U2NWU1MzaEp2NlbGxfaWTZJGJhOTRjOWIzLTU1YmYtNDg2YS04YmYzLWViMGIzZTY1ZTUzNrBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2fsiIiIKCUBza2lwX2FzX3NjcmlwdCBleHByZXNzaW9uCgpNYXJrcyBhIGV4cHJlc3Npb24gYXMgUGx1dG8tb25seSwgd2hpY2ggbWVhbnMgdGhhdCBpdCB3b24ndCBiZSBleGVjdXRlZCB3aGVuIHJ1bm5pbmcgb3V0c2lkZSBQbHV0by4gRG8gbm90IHVzZSB0aGlzIGZvciB5b3VyIG93biBwcm9qZWN0cy4KIiIiCm1hY3JvIHNraXBfYXNfc2NyaXB0KGV4KSBza2lwX2FzX3NjcmlwdChfX21vZHVsZV9fKSA/IGVzYyhleCkgOiBub3RoaW5nIGVuZKtjb2RlX2ZvbGRlZMPZJGJiOWVkZGMzLTIwOGMtNDExMy04OTg4LTMxMWViMWRjZmNkNISnY2VsbF9pZNkkYmI5ZWRkYzMtMjA4Yy00MTEzLTg5ODgtMzExZWIxZGNmY2Q0sHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGWwcHVzaCEoaXR2cywgaXR2Katjb2RlX2ZvbGRlZMLZJGNjYmU0NDIzLTgwMWItNGMyMC1hZDJkLWVlODlkNWNmYTg1OYSnY2VsbF9pZNkkY2NiZTQ0MjMtODAxYi00YzIwLWFkMmQtZWU4OWQ1Y2ZhODU5sHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGXZKG1kIiIiCiMgSG9sZGluZyBpbnRlcm1lZGlhdGUgdXBkYXRlcwoiIiKrY29kZV9mb2xkZWTD2SRmMDg2ODBiMi1lZDI4LTRmYWMtODM4Yy0yZWNhN2U3NWM2ZGOEp2NlbGxfaWTZJGYwODY4MGIyLWVkMjgtNGZhYy04MzhjLTJlY2E3ZTc1YzZkY7BydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2UpAc2tpcF9hc19zY3JpcHQgeGIgPSBAYmluZCB4IGNvbmZpcm0oU2xpZGVyKFtzaW4sIGNvcywgdGFuLCBzcXJ0LCBmbG9vcl0pKatjb2RlX2ZvbGRlZMLZJGQ3OTg1ODQ0LTU5NDQtNDJiOS1hZDQxLTU5OWNkNzJlZWE4MoSnY2VsbF9pZNkkZDc5ODU4NDQtNTk0NC00MmI5LWFkNDEtNTk5Y2Q3MmVlYTgysHJ1bm5pbmdfZGlzYWJsZWTCpGNvZGWmc3BlZWRzq2NvZGVfZm9sZGVkwtkkZmM5MmIzZmMtNjE0My00NzdjLWE0MTMtODRkY2QxYjRjZmMwhKdjZWxsX2lk2SRmYzkyYjNmYy02MTQzLTQ3N2MtYTQxMy04NGRjZDFiNGNmYzCwcnVubmluZ19kaXNhYmxlZMKkY29kZb5AYmluZCB0IGNvbmZpcm0oaHRtbCI8aW5wdXQ+IimrY29kZV9mb2xkZWTC2SRhMWE5YjIyZi05ZGY3LTRjNWYtYTczZC0zOGUxODRkYTdjMzWEp2NlbGxfaWTZJGExYTliMjJmLTlkZjctNGM1Zi1hNzNkLTM4ZTE4NGRhN2MzNbBydW5uaW5nX2Rpc2FibGVkwqRjb2Rl2SdAc2tpcF9hc19zY3JpcHQgbGV0CglzbGVlcCgxKQoJd293egplbmSrY29kZV9mb2xkZWTCq25vdGVib29rX2lk2SRmYzFkYzRiMi01OWRiLTExZWMtM2EwZS00NzJkOWUyOWE0YjWraW5fdGVtcF9kaXLC";
window.pluto_preamble_html = undefined;
</script>
<!-- [automatically generated launch parameters can be inserted here] -->
<script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/editor.js" type="module" defer></script>
<script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/warn_old_browsers.js"></script>
<script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.17.3/frontend/common/SetupMathJax.js"></script>
<script type="text/javascript" id="MathJax-script" src="https://cdn.jsdelivr.net/npm/mathjax@3.1.2/es5/tex-svg-full.js" async></script>
</head>
<body class="loading no-MαθJax"></body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment