Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active November 28, 2019 00:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save timelyportfolio/2e4ccebc16e30f94596cb38aff27e673 to your computer and use it in GitHub Desktop.
Save timelyportfolio/2e4ccebc16e30f94596cb38aff27e673 to your computer and use it in GitHub Desktop.
R leaflet popups with sparkline htmlwidget
license: mit

See DT issue

library(leaflet)

m = leaflet() %>% addTiles()

# popup
rand_lng = function(n = 10) rnorm(n, -93.65, .01)
rand_lat = function(n = 10) rnorm(n, 42.0285, .01)

# use automatic bounds derived from lng/lat data
m = m %>% clearBounds()

# popup
m %>% addPopups(
  rand_lng(),
  rand_lat(),
  lapply(1:10, function(x){
    as.character(sparkline(runif(10)))
  })
) %>%
  onRender(
"
function(el,x) {HTMLWidgets.staticRender()}
"
  ) %>%
  add_deps("sparkline", "sparkline") %>%
  browsable()

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgew0KICAvLyBJZiB3aW5kb3cuSFRNTFdpZGdldHMgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIHVzZSBpdDsgb3RoZXJ3aXNlIGNyZWF0ZSBhDQogIC8vIG5ldyBvYmplY3QuIFRoaXMgYWxsb3dzIHByZWNlZGluZyBjb2RlIHRvIHNldCBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZQ0KICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLg0KICB3aW5kb3cuSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMgfHwge307DQoNCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLg0KICB2YXIgdmlld2VyTW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy52aWV3ZXJNb2RlID0NCiAgICAgIC9cYnZpZXdlcl9wYW5lPTFcYi8udGVzdCh3aW5kb3cubG9jYXRpb24pOw0KDQogIC8vIFNlZSBpZiB3ZSdyZSBydW5uaW5nIGluIFNoaW55IG1vZGUuIElmIG5vdCwgaXQncyBhIHN0YXRpYyBkb2N1bWVudC4NCiAgLy8gTm90ZSB0aGF0IHN0YXRpYyB3aWRnZXRzIGNhbiBhcHBlYXIgaW4gYm90aCBTaGlueSBhbmQgc3RhdGljIG1vZGVzLCBidXQNCiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4NCiAgdmFyIHNoaW55TW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy5zaGlueU1vZGUgPQ0KICAgICAgdHlwZW9mKHdpbmRvdy5TaGlueSkgIT09ICJ1bmRlZmluZWQiICYmICEhd2luZG93LlNoaW55Lm91dHB1dEJpbmRpbmdzOw0KDQogIC8vIFdlIGNhbid0IGNvdW50IG9uIGpRdWVyeSBiZWluZyBhdmFpbGFibGUsIHNvIHdlIGltcGxlbWVudCBvdXIgb3duDQogIC8vIHZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2YoalF1ZXJ5KSAhPT0gInVuZGVmaW5lZCIgJiYgc2NvcGUgaW5zdGFuY2VvZiBqUXVlcnkpIHsNCiAgICAgIHJldHVybiBzY29wZS5maW5kKHNlbGVjdG9yKTsNCiAgICB9DQogICAgaWYgKHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwpIHsNCiAgICAgIHJldHVybiBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID09PSBudWxsKQ0KICAgICAgcmV0dXJuIFtdOw0KICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQ0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIHJldHVybiBbdmFsdWVdOw0KICB9DQoNCiAgLy8gSW1wbGVtZW50IGpRdWVyeSdzIGV4dGVuZA0KICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICByZXR1cm4gdGFyZ2V0Ow0KICAgIH0NCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7DQogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRhcmdldDsNCiAgfQ0KDQogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4NCiAgZnVuY3Rpb24gZm9yRWFjaCh2YWx1ZXMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7DQogICAgaWYgKHZhbHVlcy5mb3JFYWNoKSB7DQogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBmdW5jU291cmNlLg0KICAvLw0KICAvLyBOb3RlIHRoYXQgZnVuY1NvdXJjZSBzaG91bGQgbm90IEJFIHRoZSBuZXcgbWV0aG9kLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbg0KICAvLyB0aGF0IFJFVFVSTlMgdGhlIG5ldyBtZXRob2QuIGZ1bmNTb3VyY2UgcmVjZWl2ZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcw0KICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4NCiAgLy8gbWV0aG9kIGNhbiBiZSBjYWxsZWQgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIGl0IGhhcyB0aGUgdGFyZ2V0IHBlcm1hbmVudGx5DQogIC8vIGJvdW5kIHRvIGl0IHNvICJ0aGlzIiB3aWxsIHdvcmsgY29ycmVjdGx5Lg0KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsNCiAgICB2YXIgc3VwZXJGdW5jID0gdGFyZ2V0W21ldGhvZE5hbWVdIHx8IGZ1bmN0aW9uKCkge307DQogICAgdmFyIHN1cGVyRnVuY0JvdW5kID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIHRhcmdldFttZXRob2ROYW1lXSA9IGZ1bmNTb3VyY2Uoc3VwZXJGdW5jQm91bmQpOw0KICB9DQoNCiAgLy8gQWRkIGEgbWV0aG9kIHRvIGRlbGVnYXRvciB0aGF0LCB3aGVuIGludm9rZWQsIGNhbGxzDQogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbg0KICAvLyB0aGUgZGVsZWdhdGVlLCBidXQgdGhlcmUgd2FzIG9uZSBvbiBkZWxlZ2F0b3IgYmVmb3JlDQogIC8vIGRlbGVnYXRlTWV0aG9kIHdhcyBjYWxsZWQsIHRoZW4gdGhlIG9yaWdpbmFsIHZlcnNpb24NCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLg0KICAvLyBGb3IgZXhhbXBsZToNCiAgLy8NCiAgLy8gdmFyIGEgPSB7DQogIC8vICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMScpOyB9DQogIC8vICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMicpOyB9DQogIC8vIH07DQogIC8vIHZhciBiID0gew0KICAvLyAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYjEnKTsgfQ0KICAvLyB9Ow0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMSIpOw0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMiIpOw0KICAvLyBhLm1ldGhvZDEoKTsNCiAgLy8gYS5tZXRob2QyKCk7DQogIC8vDQogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4NCiAgZnVuY3Rpb24gZGVsZWdhdGVNZXRob2QoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIG1ldGhvZE5hbWUpIHsNCiAgICB2YXIgaW5oZXJpdGVkID0gZGVsZWdhdG9yW21ldGhvZE5hbWVdOw0KICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHRhcmdldCA9IGRlbGVnYXRlZTsNCiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZWVbbWV0aG9kTmFtZV07DQoNCiAgICAgIC8vIFRoZSBtZXRob2QgZG9lc24ndCBleGlzdCBvbiB0aGUgZGVsZWdhdGVlLiBJbnN0ZWFkLA0KICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIG9uIHRoZSBkZWxlZ2F0b3IsIGlmIGl0IGV4aXN0cy4NCiAgICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIHRhcmdldCA9IGRlbGVnYXRvcjsNCiAgICAgICAgbWV0aG9kID0gaW5oZXJpdGVkOw0KICAgICAgfQ0KDQogICAgICBpZiAobWV0aG9kKSB7DQogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgfQ0KICAgIH07DQogIH0NCg0KICAvLyBJbXBsZW1lbnQgYSB2YWd1ZSBmYWNzaW1pbGllIG9mIGpRdWVyeSdzIGRhdGEgbWV0aG9kDQogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgIHJldHVybiBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXTsNCiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgew0KICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsNCiAgICAgIHJldHVybiBlbDsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArDQogICAgICAgIGFyZ3VtZW50cy5sZW5ndGgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleA0KICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIik7DQogIH0NCg0KICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7DQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOw0KICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7DQogIH0NCg0KICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cw0KICAvLyBjbGFzc05hbWUgLSBjbGFzcyBuYW1lIHRvIHRlc3QgZm9yDQogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsNCiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQ0KICBmdW5jdGlvbiBmaWx0ZXJCeUNsYXNzKGVsZW1lbnRzLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50c1tpXSwgY2xhc3NOYW1lKSA9PSBpbmNsdWRlKQ0KICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsNCiAgICB9IGVsc2UgaWYgKG9iai5hdHRhY2hFdmVudCkgew0KICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7DQogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7DQogICAgICBvYmouZGV0YWNoRXZlbnQoZXZlbnROYW1lLCBmdW5jKTsNCiAgICB9DQogIH0NCg0KICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aA0KICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQ0KICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGFkZGluZw0KICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7DQogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQ0KICAgICAgdmFsdWUgPSBbdmFsdWVdOw0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07DQogICAgfQ0KICB9DQoNCiAgLy8gQ29udmVydCBhbiB1bnBhY2tlZCBwYWRkaW5nIG9iamVjdCB0byBhIENTUyB2YWx1ZQ0KICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgew0KICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7DQogIH0NCg0KICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTDQogIGZ1bmN0aW9uIHB4KHgpIHsNCiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikNCiAgICAgIHJldHVybiB4ICsgInB4IjsNCiAgICBlbHNlDQogICAgICByZXR1cm4geDsNCiAgfQ0KDQogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuDQogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsDQogIC8vIGRlZmF1bHRXaWR0aCwgZGVmYXVsdEhlaWdodCBmaWVsZHMuDQogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgew0KICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsNCiAgICBpZiAoIXNpemluZ0VsKQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOw0KICAgIGlmICh2aWV3ZXJNb2RlKSB7DQogICAgICByZXR1cm4gc3Audmlld2VyOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gc3AuYnJvd3NlcjsNCiAgICB9DQogIH0NCg0KICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLg0KICAvLyAgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgeWllbGRzIGENCiAgLy8gICBmdW5jdGlvbi4gT3IsIGNhbiBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggImNvZGUiIGFuZCAiZGF0YSINCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nDQogIC8vICAgb2YgSlMgdGhhdCdzIGFuIGV4cHIgdGhhdCB5aWVsZHMgYSBmdW5jdGlvbiwgYW5kICJkYXRhIiBzaG91bGQgYmUNCiAgLy8gICBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hlbiB0aGF0DQogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICAvLyBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlICJ0aGlzIiBmb3IgZWFjaCBmdW5jdGlvbg0KICAvLyAgIGV4ZWN1dGlvbi4NCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlDQogIC8vICAgc2FtZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucy4pDQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgew0KICAgIGlmICh0YXNrcykgew0KICAgICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykgew0KICAgICAgICB2YXIgdGhlc2VBcmdzID0gYXJnczsNCiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICB0aGVzZUFyZ3MgPSB0aGVzZUFyZ3MuY29uY2F0KFt0YXNrLmRhdGFdKTsNCiAgICAgICAgICB0YXNrID0gdGFzay5jb2RlOw0KICAgICAgICB9DQogICAgICAgIHZhciB0YXNrRnVuYyA9IGV2YWwoIigiICsgdGFzayArICIpIik7DQogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOw0KICAgICAgICB9DQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgdGhlc2VBcmdzKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsNCiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsNCiAgICBpZiAoIXNpemluZykNCiAgICAgIHJldHVybjsNCg0KICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsNCiAgICBpZiAoIWNlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOw0KICAgIH0NCg0KICAgIGlmIChzaXppbmcuZmlsbCkgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsNCiAgICAgIGlmIChjZWwpIHsNCiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOw0KICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsNCiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7DQogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7DQogICAgICB9DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwNCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0NCiAgICAgIH07DQoNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOw0KICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LA0KICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9DQogICAgICB9Ow0KICAgIH0NCiAgfQ0KDQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzDQogIHZhciBkZWZhdWx0cyA9IHsNCiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7DQogICAgfSwNCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgew0KICAgICAgdmFyICRlbCA9ICQoZWwpOw0KDQogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOw0KDQogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMNCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOw0KICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7DQogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcw0KICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOw0KICAgICAgICB9KS5qb2luKCIgIik7DQogICAgICB9DQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7DQoNCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQNCiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLg0KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgICRlbC5oaWRlKCk7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOw0KICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7DQogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlDQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuDQogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuDQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQ0KICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UNCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3INCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkDQogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOw0KDQogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aA0KICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuDQogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yRGl2DQogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpDQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsNCiAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgIGlmIChkaXNwbGF5KQ0KICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsNCiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsNCiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7DQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOw0KICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2l6aW5nOiB7fQ0KICB9Ow0KDQogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uDQogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlDQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLg0KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkDQogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuDQogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlDQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyDQogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4NCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsNCiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOw0KICAgIH0NCiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOw0KICAgIH0NCiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzDQogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsNCiAgICB9DQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lDQoNCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kDQogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YNCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cw0KICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndA0KICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQNCiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0DQogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QNCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpDQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4NCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0DQogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUNCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzDQogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMNCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuDQogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgew0KICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOw0KICAgIH0NCg0KICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsNCiAgICB9DQoNCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24NCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28NCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLg0KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107DQogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLg0KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7DQogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7DQogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZA0KICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOw0KDQogICAgaWYgKHNoaW55TW9kZSkgew0KICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4NCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQNCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlDQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kDQogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzDQogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQ0KICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0DQogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QNCiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bA0KICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZg0KICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55DQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uDQoNCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuDQogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOw0KDQogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4NCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOw0KDQogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzDQogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvDQogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwNCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkNCiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMNCiAgICAgIC8vIGxpc3QuDQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7DQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7DQoNCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQ0KICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7DQoNCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzDQogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7DQoNCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQ0KICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuDQogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQ0KICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQ0KICAgICAgICAvLyB0aW1lcy4NCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpDQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsNCg0KICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7DQogICAgICB9Ow0KDQogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndA0KICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsNCiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMNCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsNCiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7DQogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7DQogICAgICAgICAgaW5pdFNpemluZyhlbCk7DQoNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7DQogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7DQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsNCiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7DQogICAgICB9Ow0KDQogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQNCiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgew0KICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuDQogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuDQogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgew0KICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOw0KICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsNCiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgew0KICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsNCiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOw0KICAgICAgfSwgMSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nDQogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsNCiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgew0KICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOw0KDQogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQ0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOw0KDQogICAgICAgIHZhciBpbml0UmVzdWx0Ow0KICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7DQogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgKTsNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsNCiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsNCiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApDQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7DQogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOw0KICAgICAgICAgIH07DQoNCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsNCg0KICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkNCiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dA0KICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzDQogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldA0KICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8NCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMNCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuDQogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoDQogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLg0KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUNCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LA0KICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlDQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4NCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcg0KICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cw0KICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4NCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOw0KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsNCiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsNCiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOw0KICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzDQogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7DQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOw0KICB9DQoNCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuDQogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsNCiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICB9LCBmYWxzZSk7DQogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsNCiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0NCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQ0KICAgICAga2V5ID0gMTsNCg0KICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOw0KICAgIGlmICghbGluaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsNCiAgICB9DQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgew0KICAgIHZhciBuYW1lcyA9IFtdOw0KICAgIHZhciBsZW5ndGg7DQogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgew0KICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpDQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsNCiAgICAgICAgfQ0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogICAgfQ0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGl0ZW07DQogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgew0KICAgICAgICBpdGVtID0ge307DQogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsNCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICB9DQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5Ow0KICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgew0KICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7DQogICAgICAgICAgICAgIHJldHVybiByb3dbaV0NCiAgICAgICAgICB9KQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3QXJyYXk7DQogIH07DQogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkDQogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcg0KICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLg0KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOw0KICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsNCiAgICAgIGlmICghZXNjYXBlTW9kZSkgew0KICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOw0KICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsNCiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7DQogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107DQogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7DQogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUNCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7DQogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsNCiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQ0KICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgew0KICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlDQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikNCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOw0KICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QNCiAgICAgICAgICBvID0gb1twYXJ0XTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuDQogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pDQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7DQogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsNCiAgfTsNCg0KICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwNCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUNCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0DQogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLg0KICAvLw0KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgew0KICAgICAgc2VsZWN0b3IgPSBzY29wZTsNCiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgaWYgKGVsID09PSBudWxsKSB7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7DQogICAgfQ0KICB9Ow0KDQogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZA0KICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdA0KICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQNCiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuDQogIC8vDQogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4NCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICBzZWxlY3RvciA9IHNjb3BlOw0KICAgICAgc2NvcGUgPSBkb2N1bWVudDsNCiAgICB9DQoNCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOw0KICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7DQogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsNCiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7DQogICAgICBpZiAoaGFuZGxlcikgew0KICAgICAgICBoYW5kbGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOw0KICB9Ow0KDQogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuDQogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nDQogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoDQogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLg0KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7DQogICAgdmFyIHJlc3VsdCA9IHsNCiAgICAgIG5hbWU6IGRlZm4ubmFtZSwNCiAgICAgIHR5cGU6IGRlZm4udHlwZSwNCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgfSwNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOw0KICAgICAgfSwNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICB9DQogICAgfTsNCg0KICAgIGlmIChkZWZuLmZpbmQpDQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsNCiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikNCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7DQogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikNCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOw0KDQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KfSkoKTsNCg0K"></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWEuZG9jdW1lbnQsZT1jLnNsaWNlLGY9Yy5jb25jYXQsZz1jLnB1c2gsaD1jLmluZGV4T2YsaT17fSxqPWkudG9TdHJpbmcsaz1pLmhhc093blByb3BlcnR5LGw9e30sbT0iMS4xMi40IixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmUuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZWFjaCh0aGlzLGEpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpnLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihuLmlzUGxhaW5PYmplY3QoYyl8fChiPW4uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbi5pc0FycmF5KGEpP2E6W10pOmY9YSYmbi5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1uLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW4udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXt2YXIgYj1hJiZhLnRvU3RyaW5nKCk7cmV0dXJuIW4uaXNBcnJheShhKSYmYi1wYXJzZUZsb2F0KGIpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFrLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWsuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKCFsLm93bkZpcnN0KWZvcihiIGluIGEpcmV0dXJuIGsuY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxrLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGgpcmV0dXJuIGguY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc9MCxoPVtdO2lmKHMoYSkpZm9yKGQ9YS5sZW5ndGg7ZD5nO2crKyllPWIoYVtnXSxnLGMpLG51bGwhPWUmJmgucHVzaChlKTtlbHNlIGZvcihnIGluIGEpZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7cmV0dXJuIGYuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWUuY2FsbChhcmd1bWVudHMsMiksZD1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpKX0sZC5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGQpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYobi5mbltTeW1ib2wuaXRlcmF0b3JdPWNbU3ltYm9sLml0ZXJhdG9yXSksbi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj0hIWEmJiJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9Z2EoKSx6PWdhKCksQT1nYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitNKyIpKXwpIitMKyIqXFxdIixPPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTisiKSopfC4qKVxcKXwpIixQPW5ldyBSZWdFeHAoTCsiKyIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxUPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFU9bmV3IFJlZ0V4cChPKSxWPW5ldyBSZWdFeHAoIl4iK00rIiQiKSxXPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK04pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitPKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWT0vXmhcZCQvaSxaPS9eW157XStce1xzKlxbbmF0aXZlIFx3LywkPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sXz0vWyt+XS8sYWE9Lyd8XFwvZyxiYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksY2E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGRhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZmEoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3PWImJmIub3duZXJEb2N1bWVudCx4PWI/Yi5ub2RlVHlwZTo5O2lmKGQ9ZHx8W10sInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PXgmJjkhPT14JiYxMSE9PXgpcmV0dXJuIGQ7aWYoIWUmJigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dikhPT1uJiZtKGIpLGI9Ynx8bixwKSl7aWYoMTEhPT14JiYobz0kLmV4ZWMoYSkpKWlmKGY9b1sxXSl7aWYoOT09PXgpe2lmKCEoaj1iLmdldEVsZW1lbnRCeUlkKGYpKSlyZXR1cm4gZDtpZihqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZSBpZih3JiYoaj13LmdldEVsZW1lbnRCeUlkKGYpKSYmdChiLGopJiZqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZXtpZihvWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoZj1vWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZikpLGR9aWYoYy5xc2EmJiFBW2ErIiAiXSYmKCFxfHwhcS50ZXN0KGEpKSl7aWYoMSE9PXgpdz1iLHM9YTtlbHNlIGlmKCJvYmplY3QiIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoaz1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/az1rLnJlcGxhY2UoYWEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLGs9dSkscj1nKGEpLGg9ci5sZW5ndGgsbD1WLnRlc3Qoayk/IiMiK2s6IltpZD0nIitrKyInXSI7d2hpbGUoaC0tKXJbaF09bCsiICIrcWEocltoXSk7cz1yLmpvaW4oIiwiKSx3PV8udGVzdChhKSYmb2EoYi5wYXJlbnROb2RlKXx8Yn1pZihzKXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbChzKSksZH1jYXRjaCh5KXt9ZmluYWxseXtrPT09dSYmYi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gaShhLnJlcGxhY2UoUSwiJDEiKSxiLGQsZSl9ZnVuY3Rpb24gZ2EoKXt2YXIgYT1bXTtmdW5jdGlvbiBiKGMsZSl7cmV0dXJuIGEucHVzaChjKyIgIik+ZC5jYWNoZUxlbmd0aCYmZGVsZXRlIGJbYS5zaGlmdCgpXSxiW2MrIiAiXT1lfXJldHVybiBifWZ1bmN0aW9uIGhhKGEpe3JldHVybiBhW3VdPSEwLGF9ZnVuY3Rpb24gaWEoYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuISFhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsfX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuc3BsaXQoInwiKSxlPWMubGVuZ3RoO3doaWxlKGUtLSlkLmF0dHJIYW5kbGVbY1tlXV09Yn1mdW5jdGlvbiBrYShhLGIpe3ZhciBjPWImJmEsZD1jJiYxPT09YS5ub2RlVHlwZSYmMT09PWIubm9kZVR5cGUmJih+Yi5zb3VyY2VJbmRleHx8QyktKH5hLnNvdXJjZUluZGV4fHxDKTtpZihkKXJldHVybiBkO2lmKGMpd2hpbGUoYz1jLm5leHRTaWJsaW5nKWlmKGM9PT1iKXJldHVybi0xO3JldHVybiBhPzE6LTF9ZnVuY3Rpb24gbGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YyYmYi50eXBlPT09YX19ZnVuY3Rpb24gbWEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PWN8fCJidXR0b24iPT09YykmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBoYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixoYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIG9hKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1mYS5zdXBwb3J0PXt9LGY9ZmEuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiPyJIVE1MIiE9PWIubm9kZU5hbWU6ITF9LG09ZmEuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZSxnPWE/YS5vd25lckRvY3VtZW50fHxhOnY7cmV0dXJuIGchPT1uJiY5PT09Zy5ub2RlVHlwZSYmZy5kb2N1bWVudEVsZW1lbnQ/KG49ZyxvPW4uZG9jdW1lbnRFbGVtZW50LHA9IWYobiksKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1pYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVoudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1pYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoYmEsY2EpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT1aLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihpYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGlhKGZ1bmN0aW9uKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVoudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmaWEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLE8pfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj1aLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHxaLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1ufHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PW58fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxnPVthXSxoPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1uPy0xOmI9PT1uPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGthKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWcudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO3doaWxlKGdbZF09PT1oW2RdKWQrKztyZXR1cm4gZD9rYShnW2RdLGhbZF0pOmdbZF09PT12Py0xOmhbZF09PT12PzE6MH0sbik6bn0sZmEubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBmYShhLG51bGwsbnVsbCxiKX0sZmEubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFQsIj0nJDEnXSIpLGMubWF0Y2hlc1NlbGVjdG9yJiZwJiYhQVtiKyIgIl0mJighcnx8IXIudGVzdChiKSkmJighcXx8IXEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGZhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGZhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZmEuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGZhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZmEudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWZhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1mYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpoYSxtYXRjaDpXLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYmEsY2EpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGJhLGNhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZmEuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZmEuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFcuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVS50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZmEuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShQLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2hhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1KKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmhhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShRLCIkMSIpKTtyZXR1cm4gZFt1XT9oYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZmEoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczpoYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoYmEsY2EpLGZ1bmN0aW9uKGIpe3JldHVybihiLnRleHRDb250ZW50fHxiLmlubmVyVGV4dHx8ZShiKSkuaW5kZXhPZihhKT4tMX19KSxsYW5nOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBWLnRlc3QoYXx8IiIpfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIithKSxhPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXt2YXIgYztkbyBpZihjPXA/Yi5sYW5nOmIuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxiLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBjPWMudG9Mb3dlckNhc2UoKSxjPT09YXx8MD09PWMuaW5kZXhPZihhKyItIik7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmMT09PWIubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihiKXt2YXIgYz1hLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhhc2g7cmV0dXJuIGMmJmMuc2xpY2UoMSk9PT1iLmlkfSxyb290OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09b30sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1uLmFjdGl2ZUVsZW1lbnQmJighbi5oYXNGb2N1c3x8bi5oYXNGb2N1cygpKSYmISEoYS50eXBlfHxhLmhyZWZ8fH5hLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFkudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6bmEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Om5hKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpuYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuWzA+Yz9jK2I6Y119KSxldmVuOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6bmEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpuYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bGEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bWEoYik7ZnVuY3Rpb24gcGEoKXt9cGEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyBwYSxnPWZhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1SLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1TLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFEsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1XW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/ZmEuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBxYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHJhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGosaz1bdyxmXTtpZihnKXt3aGlsZShiPWJbZF0paWYoKDE9PT1iLm5vZGVUeXBlfHxlKSYmYShiLGMsZykpcmV0dXJuITB9ZWxzZSB3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpe2lmKGo9Ylt1XXx8KGJbdV09e30pLGk9altiLnVuaXF1ZUlEXXx8KGpbYi51bmlxdWVJRF09e30pLChoPWlbZF0pJiZoWzBdPT09dyYmaFsxXT09PWYpcmV0dXJuIGtbMl09aFsyXTtpZihpW2RdPWssa1syXT1hKGIsYyxnKSlyZXR1cm4hMH19fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhLmxlbmd0aD4xP2Z1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0paWYoIWFbZV0oYixjLGQpKXJldHVybiExO3JldHVybiEwfTphWzBdfWZ1bmN0aW9uIHRhKGEsYixjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZmEoYSxiW2RdLGMpO3JldHVybiBjfWZ1bmN0aW9uIHVhKGEsYixjLGQsZSl7Zm9yKHZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1udWxsIT1iO2k+aDtoKyspKGY9YVtoXSkmJihjJiYhYyhmLGQsZSl8fChnLnB1c2goZiksaiYmYi5wdXNoKGgpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFt1XSYmKGQ9dmEoZCkpLGUmJiFlW3VdJiYoZT12YShlLGYpKSxoYShmdW5jdGlvbihmLGcsaCxpKXt2YXIgaixrLGwsbT1bXSxuPVtdLG89Zy5sZW5ndGgscD1mfHx0YShifHwiKiIsaC5ub2RlVHlwZT9baF06aCxbXSkscT0hYXx8IWYmJmI/cDp1YShwLG0sYSxoLGkpLHI9Yz9lfHwoZj9hOm98fGQpP1tdOmc6cTtpZihjJiZjKHEscixoLGkpLGQpe2o9dWEocixuKSxkKGosW10saCxpKSxrPWoubGVuZ3RoO3doaWxlKGstLSkobD1qW2tdKSYmKHJbbltrXV09IShxW25ba11dPWwpKX1pZihmKXtpZihlfHxhKXtpZihlKXtqPVtdLGs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiZqLnB1c2gocVtrXT1sKTtlKG51bGwscj1bXSxqLGkpfWs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiYoaj1lP0ooZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXVhKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpILmFwcGx5KGcscil9KX1mdW5jdGlvbiB3YShhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saD1nfHxkLnJlbGF0aXZlWyIgIl0saT1nPzE6MCxrPXJhKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saCwhMCksbD1yYShmdW5jdGlvbihhKXtyZXR1cm4gSihiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7dmFyIGU9IWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSk7cmV0dXJuIGI9bnVsbCxlfV07Zj5pO2krKylpZihjPWQucmVsYXRpdmVbYVtpXS50eXBlXSltPVtyYShzYShtKSxjKV07ZWxzZXtpZihjPWQuZmlsdGVyW2FbaV0udHlwZV0uYXBwbHkobnVsbCxhW2ldLm1hdGNoZXMpLGNbdV0pe2ZvcihlPSsraTtmPmU7ZSsrKWlmKGQucmVsYXRpdmVbYVtlXS50eXBlXSlicmVhaztyZXR1cm4gdmEoaT4xJiZzYShtKSxpPjEmJnFhKGEuc2xpY2UoMCxpLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09YVtpLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoUSwiJDEiKSxjLGU+aSYmd2EoYS5zbGljZShpLGUpKSxmPmUmJndhKGE9YS5zbGljZShlKSksZj5lJiZxYShhKSl9bS5wdXNoKGMpfXJldHVybiBzYShtKX1mdW5jdGlvbiB4YShhLGIpe3ZhciBjPWIubGVuZ3RoPjAsZT1hLmxlbmd0aD4wLGY9ZnVuY3Rpb24oZixnLGgsaSxrKXt2YXIgbCxvLHEscj0wLHM9IjAiLHQ9ZiYmW10sdT1bXSx2PWoseD1mfHxlJiZkLmZpbmQuVEFHKCIqIixrKSx5PXcrPW51bGw9PXY/MTpNYXRoLnJhbmRvbSgpfHwuMSx6PXgubGVuZ3RoO2ZvcihrJiYoaj1nPT09bnx8Z3x8ayk7cyE9PXomJm51bGwhPShsPXhbc10pO3MrKyl7aWYoZSYmbCl7bz0wLGd8fGwub3duZXJEb2N1bWVudD09PW58fChtKGwpLGg9IXApO3doaWxlKHE9YVtvKytdKWlmKHEobCxnfHxuLGgpKXtpLnB1c2gobCk7YnJlYWt9ayYmKHc9eSl9YyYmKChsPSFxJiZsKSYmci0tLGYmJnQucHVzaChsKSl9aWYocis9cyxjJiZzIT09cil7bz0wO3doaWxlKHE9YltvKytdKXEodCx1LGcsaCk7aWYoZil7aWYocj4wKXdoaWxlKHMtLSl0W3NdfHx1W3NdfHwodVtzXT1GLmNhbGwoaSkpO3U9dWEodSl9SC5hcHBseShpLHUpLGsmJiFmJiZ1Lmxlbmd0aD4wJiZyK2IubGVuZ3RoPjEmJmZhLnVuaXF1ZVNvcnQoaSl9cmV0dXJuIGsmJih3PXksaj12KSx0fTtyZXR1cm4gYz9oYShmKTpmfXJldHVybiBoPWZhLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1BW2ErIiAiXTtpZighZil7Ynx8KGI9ZyhhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj13YShiW2NdKSxmW3VdP2QucHVzaChmKTplLnB1c2goZik7Zj1BKGEseGEoZSxkKSksZi5zZWxlY3Rvcj1hfXJldHVybiBmfSxpPWZhLnNlbGVjdD1mdW5jdGlvbihhLGIsZSxmKXt2YXIgaSxqLGssbCxtLG49ImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEsbz0hZiYmZyhhPW4uc2VsZWN0b3J8fGEpO2lmKGU9ZXx8W10sMT09PW8ubGVuZ3RoKXtpZihqPW9bMF09b1swXS5zbGljZSgwKSxqLmxlbmd0aD4yJiYiSUQiPT09KGs9alswXSkudHlwZSYmYy5nZXRCeUlkJiY5PT09Yi5ub2RlVHlwZSYmcCYmZC5yZWxhdGl2ZVtqWzFdLnR5cGVdKXtpZihiPShkLmZpbmQuSUQoay5tYXRjaGVzWzBdLnJlcGxhY2UoYmEsY2EpLGIpfHxbXSlbMF0sIWIpcmV0dXJuIGU7biYmKGI9Yi5wYXJlbnROb2RlKSxhPWEuc2xpY2Uoai5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1XLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6ai5sZW5ndGg7d2hpbGUoaS0tKXtpZihrPWpbaV0sZC5yZWxhdGl2ZVtsPWsudHlwZV0pYnJlYWs7aWYoKG09ZC5maW5kW2xdKSYmKGY9bShrLm1hdGNoZXNbMF0ucmVwbGFjZShiYSxjYSksXy50ZXN0KGpbMF0udHlwZSkmJm9hKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZxYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSwhYnx8Xy50ZXN0KGEpJiZvYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGphKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGphKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxqYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxmYX0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlU29ydD1uLnVuaXF1ZT10LnVuaXF1ZVNvcnQsbi50ZXh0PXQuZ2V0VGV4dCxuLmlzWE1MRG9jPXQuaXNYTUwsbi5jb250YWlucz10LmNvbnRhaW5zO3ZhciB1PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sdj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY30sdz1uLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHg9L148KFtcdy1dKylccypcLz8+KD86PFwvXDE+fCkkLyx5PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24geihhLGIsYyl7aWYobi5pc0Z1bmN0aW9uKGIpKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih5LnRlc3QoYikpcmV0dXJuIG4uZmlsdGVyKGIsYSxjKTtiPW4uZmlsdGVyKGIsYSl9cmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBuLmluQXJyYXkoYSxiKT4tMSE9PWN9KX1uLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9uLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm4uZmluZC5tYXRjaGVzKGEsbi5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxuLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobi5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyluLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9uLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEheih0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdy50ZXN0KGEpP24oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgQSxCPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sQz1uLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxBLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hLmNoYXJBdCgwKSYmIj4iPT09YS5jaGFyQXQoYS5sZW5ndGgtMSkmJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06Qi5leGVjKGEpLCFlfHwhZVsxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fGMpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGVbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChlWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmQsITApKSx4LnRlc3QoZVsxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoZSBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2VdKT90aGlzW2VdKGJbZV0pOnRoaXMuYXR0cihlLGJbZV0pO3JldHVybiB0aGlzfWlmKGY9ZC5nZXRFbGVtZW50QnlJZChlWzJdKSxmJiZmLnBhcmVudE5vZGUpe2lmKGYuaWQhPT1lWzJdKXJldHVybiBBLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWZ9cmV0dXJuIHRoaXMuY29udGV4dD1kLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpPyJ1bmRlZmluZWQiIT10eXBlb2YgYy5yZWFkeT9jLnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0MucHJvdG90eXBlPW4uZm4sQT1uKGQpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW4oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihuLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dy50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlU29ydChmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWVTb3J0KG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEYoYSxiKXtkbyBhPWFbYl07d2hpbGUoYSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEYoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gdigoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihFW2FdfHwoZT1uLnVuaXF1ZVNvcnQoZSkpLEQudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRz0vXFMrL2c7ZnVuY3Rpb24gSChhKXt2YXIgYj17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRyl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmPVtdLGc9W10saD0tMSxpPWZ1bmN0aW9uKCl7Zm9yKGU9YS5vbmNlLGQ9Yj0hMDtnLmxlbmd0aDtoPS0xKXtjPWcuc2hpZnQoKTt3aGlsZSgrK2g8Zi5sZW5ndGgpZltoXS5hcHBseShjWzBdLGNbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihoPWYubGVuZ3RoLGM9ITEpfWEubWVtb3J5fHwoYz0hMSksYj0hMSxlJiYoZj1jP1tdOiIiKX0saj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGYmJihjJiYhYiYmKGg9Zi5sZW5ndGgtMSxnLnB1c2goYykpLGZ1bmN0aW9uIGQoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXtuLmlzRnVuY3Rpb24oYyk/YS51bmlxdWUmJmouaGFzKGMpfHxmLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09bi50eXBlKGMpJiZkKGMpfSl9KGFyZ3VtZW50cyksYyYmIWImJmkoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixmLGMpKT4tMSlmLnNwbGljZShjLDEpLGg+PWMmJmgtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxmKT4tMTpmLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBmJiYoZj1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBlPWc9W10sZj1jPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZT0hMCxjfHxqLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhjLm5vdGlmeSkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1lLmNhbGwoYXJndW1lbnRzKSxkPWMubGVuZ3RoLGY9MSE9PWR8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2Q6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZS5jYWxsKGFyZ3VtZW50cyk6ZCxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGQ+MSlmb3IoaT1uZXcgQXJyYXkoZCksaj1uZXcgQXJyYXkoZCksaz1uZXcgQXJyYXkoZCk7ZD5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5wcm9ncmVzcyhoKGIsaixpKSkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEkucmVzb2x2ZVdpdGgoZCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG4oZCkub2ZmKCJyZWFkeSIpKSkpfX0pO2Z1bmN0aW9uIEooKXtkLmFkZEV2ZW50TGlzdGVuZXI/KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixLKSk6KGQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5kZXRhY2hFdmVudCgib25sb2FkIixLKSl9ZnVuY3Rpb24gSygpeyhkLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWEuZXZlbnQudHlwZXx8ImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZSkmJihKKCksbi5yZWFkeSgpKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7aWYoIUkpaWYoST1uLkRlZmVycmVkKCksImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09ZC5yZWFkeVN0YXRlJiYhZC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwpYS5zZXRUaW1lb3V0KG4ucmVhZHkpO2Vsc2UgaWYoZC5hZGRFdmVudExpc3RlbmVyKWQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixLKTtlbHNle2QuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5hdHRhY2hFdmVudCgib25sb2FkIixLKTt2YXIgYz0hMTt0cnl7Yz1udWxsPT1hLmZyYW1lRWxlbWVudCYmZC5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZSl7fWMmJmMuZG9TY3JvbGwmJiFmdW5jdGlvbiBmKCl7aWYoIW4uaXNSZWFkeSl7dHJ5e2MuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChiKXtyZXR1cm4gYS5zZXRUaW1lb3V0KGYsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBMO2ZvcihMIGluIG4obCkpYnJlYWs7bC5vd25GaXJzdD0iMCI9PT1MLGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxuKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGU7Yz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGIuc3R5bGUuem9vbSYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsbC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChlKSl9KSxmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX1hPW51bGx9KCk7dmFyIE09ZnVuY3Rpb24oYSl7dmFyIGI9bi5ub0RhdGFbKGEubm9kZU5hbWUrIiAiKS50b0xvd2VyQ2FzZSgpXSxjPSthLm5vZGVUeXBlfHwxO3JldHVybiAxIT09YyYmOSE9PWM/ITE6IWJ8fGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9LE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwOwp9cmV0dXJuIGN9ZnVuY3Rpb24gUShhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbi5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFIoYSxiLGQsZSl7aWYoTShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksIm9iamVjdCIhPXR5cGVvZiBiJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8KGU/altrXT1uLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1uLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbi5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbi5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKE0oYSkpe3ZhciBkLGUsZj1hLm5vZGVUeXBlLGc9Zj9uLmNhY2hlOmEsaD1mP2Fbbi5leHBhbmRvXTpuLmV4cGFuZG87aWYoZ1toXSl7aWYoYiYmKGQ9Yz9nW2hdOmdbaF0uZGF0YSkpe24uaXNBcnJheShiKT9iPWIuY29uY2F0KG4ubWFwKGIsbi5jYW1lbENhc2UpKTpiIGluIGQ/Yj1bYl06KGI9bi5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIuc3BsaXQoIiAiKSksZT1iLmxlbmd0aDt3aGlsZShlLS0pZGVsZXRlIGRbYltlXV07aWYoYz8hUShkKTohbi5pc0VtcHR5T2JqZWN0KGQpKXJldHVybn0oY3x8KGRlbGV0ZSBnW2hdLmRhdGEsUShnW2hdKSkpJiYoZj9uLmNsZWFuRGF0YShbYV0sITApOmwuZGVsZXRlRXhwYW5kb3x8ZyE9Zy53aW5kb3c/ZGVsZXRlIGdbaF06Z1toXT12b2lkIDApfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFAoZixkLGVbZF0pKSk7bi5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhLGIpfSk6Zj9QKGYsYSxuLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1uLl9kYXRhKGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1uLl9kYXRhKGEsYixuLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbi5fZGF0YShhLGMpfHxuLl9kYXRhKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bi5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbi5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bi5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1uLnF1ZXVlKHRoaXMsYSxiKTtuLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1uLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW4uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSksZnVuY3Rpb24oKXt2YXIgYTtsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxlO3JldHVybiBjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoYiksInVuZGVmaW5lZCIhPXR5cGVvZiBiLnN0eWxlLnpvb20mJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChlKSxhKTp2b2lkIDB9fSgpO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1QrIikoW2EteiVdKikkIiwiaSIpLFY9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxXPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX07ZnVuY3Rpb24gWChhLGIsYyxkKXt2YXIgZSxmPTEsZz0yMCxoPWQ/ZnVuY3Rpb24oKXtyZXR1cm4gZC5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbi5jc3MoYSxiLCIiKX0saT1oKCksaj1jJiZjWzNdfHwobi5jc3NOdW1iZXJbYl0/IiI6InB4Iiksaz0obi5jc3NOdW1iZXJbYl18fCJweCIhPT1qJiYraSkmJlUuZXhlYyhuLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixuLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBZPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1uLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYylZKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9LFo9L14oPzpjaGVja2JveHxyYWRpbykkL2ksJD0vPChbXHc6LV0rKS8sXz0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksYWE9L15ccysvLGJhPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZGlhbG9nfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1haW58bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHBpY3R1cmV8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRlbXBsYXRlfHRpbWV8dmlkZW8iO2Z1bmN0aW9uIGNhKGEpe3ZhciBiPWJhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfSFmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ZC5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYi5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGEuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYi5hcHBlbmRDaGlsZChhKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYS5hcHBlbmRDaGlsZChjKSxsLmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ISFhLmFkZEV2ZW50TGlzdGVuZXIsYVtuLmV4cGFuZG9dPTEsbC5hdHRyaWJ1dGVzPSFhLmdldEF0dHJpYnV0ZShuLmV4cGFuZG8pfSgpO3ZhciBkYT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19O2RhLm9wdGdyb3VwPWRhLm9wdGlvbixkYS50Ym9keT1kYS50Zm9vdD1kYS5jb2xncm91cD1kYS5jYXB0aW9uPWRhLnRoZWFkLGRhLnRoPWRhLnRkO2Z1bmN0aW9uIGVhKGEsYil7dmFyIGMsZCxlPTAsZj0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLGVhKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiBmYShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW4uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG4uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX12YXIgZ2E9Lzx8JiM/XHcrOy8saGE9Lzx0Ym9keS9pO2Z1bmN0aW9uIGlhKGEpe1oudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGphKGEsYixjLGQsZSl7Zm9yKHZhciBmLGcsaCxpLGosayxtLG89YS5sZW5ndGgscD1jYShiKSxxPVtdLHI9MDtvPnI7cisrKWlmKGc9YVtyXSxnfHwwPT09ZylpZigib2JqZWN0Ij09PW4udHlwZShnKSluLm1lcmdlKHEsZy5ub2RlVHlwZT9bZ106Zyk7ZWxzZSBpZihnYS50ZXN0KGcpKXtpPWl8fHAuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaj0oJC5leGVjKGcpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09ZGFbal18fGRhLl9kZWZhdWx0LGkuaW5uZXJIVE1MPW1bMV0rbi5odG1sUHJlZmlsdGVyKGcpK21bMl0sZj1tWzBdO3doaWxlKGYtLSlpPWkubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZhYS50ZXN0KGcpJiZxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShhYS5leGVjKGcpWzBdKSksIWwudGJvZHkpe2c9InRhYmxlIiE9PWp8fGhhLnRlc3QoZyk/Ijx0YWJsZT4iIT09bVsxXXx8aGEudGVzdChnKT8wOmk6aS5maXJzdENoaWxkLGY9ZyYmZy5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShmLS0pbi5ub2RlTmFtZShrPWcuY2hpbGROb2Rlc1tmXSwidGJvZHkiKSYmIWsuY2hpbGROb2Rlcy5sZW5ndGgmJmcucmVtb3ZlQ2hpbGQoayl9bi5tZXJnZShxLGkuY2hpbGROb2RlcyksaS50ZXh0Q29udGVudD0iIjt3aGlsZShpLmZpcnN0Q2hpbGQpaS5yZW1vdmVDaGlsZChpLmZpcnN0Q2hpbGQpO2k9cC5sYXN0Q2hpbGR9ZWxzZSBxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShnKSk7aSYmcC5yZW1vdmVDaGlsZChpKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcChlYShxLCJpbnB1dCIpLGlhKSxyPTA7d2hpbGUoZz1xW3IrK10paWYoZCYmbi5pbkFycmF5KGcsZCk+LTEpZSYmZS5wdXNoKGcpO2Vsc2UgaWYoaD1uLmNvbnRhaW5zKGcub3duZXJEb2N1bWVudCxnKSxpPWVhKHAuYXBwZW5kQ2hpbGQoZyksInNjcmlwdCIpLGgmJmZhKGkpLGMpe2Y9MDt3aGlsZShnPWlbZisrXSlfLnRlc3QoZy50eXBlfHwiIikmJmMucHVzaChnKX1yZXR1cm4gaT1udWxsLHB9IWZ1bmN0aW9uKCl7dmFyIGIsYyxlPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiXT1jIGluIGEpfHwoZS5zZXRBdHRyaWJ1dGUoYywidCIpLGxbYl09ZS5hdHRyaWJ1dGVzW2NdLmV4cGFuZG89PT0hMSk7ZT1udWxsfSgpO3ZhciBrYT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksbGE9L15rZXkvLG1hPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxuYT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sb2E9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIHBhKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMX1mdW5jdGlvbiByYSgpe3RyeXtyZXR1cm4gZC5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319ZnVuY3Rpb24gc2EoYSxiLGMsZCxlLGYpe3ZhciBnLGg7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXsic3RyaW5nIiE9dHlwZW9mIGMmJihkPWR8fGMsYz12b2lkIDApO2ZvcihoIGluIGIpc2EoYSxoLGMsZCxiW2hdLGYpO3JldHVybiBhfWlmKG51bGw9PWQmJm51bGw9PWU/KGU9YyxkPWM9dm9pZCAwKTpudWxsPT1lJiYoInN0cmluZyI9PXR5cGVvZiBjPyhlPWQsZD12b2lkIDApOihlPWQsZD1jLGM9dm9pZCAwKSksZT09PSExKWU9cWE7ZWxzZSBpZighZSlyZXR1cm4gYTtyZXR1cm4gMT09PWYmJihnPWUsZT1mdW5jdGlvbihhKXtyZXR1cm4gbigpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1uLmd1aWQrKykpLGEuZWFjaChmdW5jdGlvbigpe24uZXZlbnQuYWRkKHRoaXMsYixlLGQsYyl9KX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygbnx8YSYmbi5ldmVudC50cmlnZ2VyZWQ9PT1hLnR5cGU/dm9pZCAwOm4uZXZlbnQuZGlzcGF0Y2guYXBwbHkoay5lbGVtLGFyZ3VtZW50cyl9LGsuZWxlbT1hKSxiPShifHwiIikubWF0Y2goRyl8fFsiIl0saD1iLmxlbmd0aDt3aGlsZShoLS0pZj1vYS5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChtPWdbb10pfHwobT1nW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsbCk6bS5wdXNoKGwpLG4uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9bi5oYXNEYXRhKGEpJiZuLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9b2EuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09a1tvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGk9Zj1tLmxlbmd0aDt3aGlsZShmLS0pZz1tW2ZdLCFlJiZxIT09Zy5vcmlnVHlwZXx8YyYmYy5ndWlkIT09Zy5ndWlkfHxoJiYhaC50ZXN0KGcubmFtZXNwYWNlKXx8ZCYmZCE9PWcuc2VsZWN0b3ImJigiKioiIT09ZHx8IWcuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxnLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGcpKTtpJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGtbb10pfWVsc2UgZm9yKG8gaW4gayluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChrKSYmKGRlbGV0ZSByLmhhbmRsZSxuLl9yZW1vdmVEYXRhKGEsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGUsZil7dmFyIGcsaCxpLGosbCxtLG8scD1bZXx8ZF0scT1rLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHI9ay5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoaT1tPWU9ZXx8ZCwzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJiFuYS50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKCIuIik+LTEmJihyPXEuc3BsaXQoIi4iKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksaD1xLmluZGV4T2YoIjoiKTwwJiYib24iK3EsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChxLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9Zj8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKCIuIiksYi5ybmFtZXNwYWNlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1lKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxsPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZnx8IWwudHJpZ2dlcnx8bC50cmlnZ2VyLmFwcGx5KGUsYykhPT0hMSkpe2lmKCFmJiYhbC5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZSkpe2ZvcihqPWwuZGVsZWdhdGVUeXBlfHxxLG5hLnRlc3QoaitxKXx8KGk9aS5wYXJlbnROb2RlKTtpO2k9aS5wYXJlbnROb2RlKXAucHVzaChpKSxtPWk7bT09PShlLm93bmVyRG9jdW1lbnR8fGQpJiZwLnB1c2gobS5kZWZhdWx0Vmlld3x8bS5wYXJlbnRXaW5kb3d8fGEpfW89MDt3aGlsZSgoaT1wW28rK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1vPjE/ajpsLmJpbmRUeXBlfHxxLGc9KG4uX2RhdGEoaSwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZuLl9kYXRhKGksImhhbmRsZSIpLGcmJmcuYXBwbHkoaSxjKSxnPWgmJmlbaF0sZyYmZy5hcHBseSYmTShpKSYmKGIucmVzdWx0PWcuYXBwbHkoaSxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1xLCFmJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFsLl9kZWZhdWx0fHxsLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksYyk9PT0hMSkmJk0oZSkmJmgmJmVbcV0mJiFuLmlzV2luZG93KGUpKXttPWVbaF0sbSYmKGVbaF09bnVsbCksbi5ldmVudC50cmlnZ2VyZWQ9cTt0cnl7ZVtxXSgpfWNhdGNoKHMpe31uLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbSYmKGVbaF09bSl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGQsZixnLGg9W10saT1lLmNhbGwoYXJndW1lbnRzKSxqPShuLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1uLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1uLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGM9MDt3aGlsZSgoZz1mLmhhbmRsZXJzW2MrK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWEucm5hbWVzcGFjZSYmIWEucm5hbWVzcGFjZS50ZXN0KGcubmFtZXNwYWNlKXx8KGEuaGFuZGxlT2JqPWcsYS5kYXRhPWcuZGF0YSxkPSgobi5ldmVudC5zcGVjaWFsW2cub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxnLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1kJiYoYS5yZXN1bHQ9ZCk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8aXNOYU4oYS5idXR0b24pfHxhLmJ1dHRvbjwxKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZD1bXSxjPTA7aD5jO2MrKylmPWJbY10sZT1mLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1kW2VdJiYoZFtlXT1mLm5lZWRzQ29udGV4dD9uKGUsdGhpcykuaW5kZXgoaSk+LTE6bi5maW5kKGUsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxkW2VdJiZkLnB1c2goZik7ZC5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmR9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW24uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxlLGY9YS50eXBlLGc9YSxoPXRoaXMuZml4SG9va3NbZl07aHx8KHRoaXMuZml4SG9va3NbZl09aD1tYS50ZXN0KGYpP3RoaXMubW91c2VIb29rczpsYS50ZXN0KGYpP3RoaXMua2V5SG9va3M6e30pLGU9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZyksYj1lLmxlbmd0aDt3aGlsZShiLS0pYz1lW2JdLGFbY109Z1tjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGQpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBkZXRhaWwgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGc9Yi5idXR0b24saD1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGQsZj1lLmRvY3VtZW50RWxlbWVudCxjPWUuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmgmJihhLnJlbGF0ZWRUYXJnZXQ9aD09PWEudGFyZ2V0P2IudG9FbGVtZW50OmgpLGEud2hpY2h8fHZvaWQgMD09PWd8fChhLndoaWNoPTEmZz8xOjImZz8zOjQmZz8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09cmEoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1yYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMH0pO24uZXZlbnQudHJpZ2dlcihkLG51bGwsYiksZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD1kLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgYVtkXSYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/cGE6cWEpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6bi5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6cWEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6cWEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6cWEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGEsYSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1wYSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9cGEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fG4uY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLGwuc3VibWl0fHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP24ucHJvcChiLCJmb3JtIik6dm9pZCAwO2MmJiFuLl9kYXRhKGMsInN1Ym1pdCIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdEJ1YmJsZT0hMH0pLG4uX2RhdGEoYywic3VibWl0IiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRCdWJibGUmJihkZWxldGUgYS5fc3VibWl0QnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZuLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxsLmNoYW5nZXx8KG4uZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIGthLnRlc3QodGhpcy5ub2RlTmFtZSk/KCJjaGVja2JveCIhPT10aGlzLnR5cGUmJiJyYWRpbyIhPT10aGlzLnR5cGV8fChuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdENoYW5nZWQ9ITApfSksbi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdENoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RDaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7a2EudGVzdChiLm5vZGVOYW1lKSYmIW4uX2RhdGEoYiwiY2hhbmdlIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEpfSksbi5fZGF0YShiLCJjaGFuZ2UiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFrYS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbnx8bi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe24uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxuLmV2ZW50LmZpeChhKSl9O24uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbi5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW4uX2RhdGEoZCxiKS0xO2U/bi5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG4uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gc2EodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBzYSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixuKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9cWEpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSk7dmFyIHRhPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csdWE9bmV3IFJlZ0V4cCgiPCg/OiIrYmErIilbXFxzLz5dIiwiaSIpLHZhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzotXSspW14+XSopXC8+L2dpLHdhPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLHhhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHlhPS9edHJ1ZVwvKC4qKS8semE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLEFhPWNhKGQpLEJhPUFhLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Z1bmN0aW9uIENhKGEsYil7cmV0dXJuIG4ubm9kZU5hbWUoYSwidGFibGUiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBEYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bi5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gRWEoYSl7dmFyIGI9eWEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBGYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZuLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW4uX2RhdGEoYSksZz1uLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyluLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW4uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBHYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWwubm9DbG9uZUV2ZW50JiZiW24uZXhwYW5kb10pe2U9bi5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyluLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobi5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oRGEoYikudGV4dD1hLnRleHQsRWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGwuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFuLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmWi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19ZnVuY3Rpb24gSGEoYSxiLGMsZCl7Yj1mLmFwcGx5KFtdLGIpO3ZhciBlLGcsaCxpLGosayxtPTAsbz1hLmxlbmd0aCxwPW8tMSxxPWJbMF0scj1uLmlzRnVuY3Rpb24ocSk7aWYocnx8bz4xJiYic3RyaW5nIj09dHlwZW9mIHEmJiFsLmNoZWNrQ2xvbmUmJnhhLnRlc3QocSkpcmV0dXJuIGEuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1hLmVxKGUpO3ImJihiWzBdPXEuY2FsbCh0aGlzLGUsZi5odG1sKCkpKSxIYShmLGIsYyxkKX0pO2lmKG8mJihrPWphKGIsYVswXS5vd25lckRvY3VtZW50LCExLGEsZCksZT1rLmZpcnN0Q2hpbGQsMT09PWsuY2hpbGROb2Rlcy5sZW5ndGgmJihrPWUpLGV8fGQpKXtmb3IoaT1uLm1hcChlYShrLCJzY3JpcHQiKSxEYSksaD1pLmxlbmd0aDtvPm07bSsrKWc9ayxtIT09cCYmKGc9bi5jbG9uZShnLCEwLCEwKSxoJiZuLm1lcmdlKGksZWEoZywic2NyaXB0IikpKSxjLmNhbGwoYVttXSxnLG0pO2lmKGgpZm9yKGo9aVtpLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG4ubWFwKGksRWEpLG09MDtoPm07bSsrKWc9aVttXSxfLnRlc3QoZy50eXBlfHwiIikmJiFuLl9kYXRhKGcsImdsb2JhbEV2YWwiKSYmbi5jb250YWlucyhqLGcpJiYoZy5zcmM/bi5fZXZhbFVybCYmbi5fZXZhbFVybChnLnNyYyk6bi5nbG9iYWxFdmFsKChnLnRleHR8fGcudGV4dENvbnRlbnR8fGcuaW5uZXJIVE1MfHwiIikucmVwbGFjZSh6YSwiIikpKTtrPWU9bnVsbH1yZXR1cm4gYX1mdW5jdGlvbiBJYShhLGIsYyl7Zm9yKHZhciBkLGU9Yj9uLmZpbHRlcihiLGEpOmEsZj0wO251bGwhPShkPWVbZl0pO2YrKyljfHwxIT09ZC5ub2RlVHlwZXx8bi5jbGVhbkRhdGEoZWEoZCkpLGQucGFyZW50Tm9kZSYmKGMmJm4uY29udGFpbnMoZC5vd25lckRvY3VtZW50LGQpJiZmYShlYShkLCJzY3JpcHQiKSksZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpKTtyZXR1cm4gYX1uLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHZhLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1uLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihsLmh0bWw1Q2xvbmV8fG4uaXNYTUxEb2MoYSl8fCF1YS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KEJhLmlubmVySFRNTD1hLm91dGVySFRNTCxCYS5yZW1vdmVDaGlsZChmPUJhLmZpcnN0Q2hpbGQpKSwhKGwubm9DbG9uZUV2ZW50JiZsLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZD1lYShmKSxoPWVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmR2EoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8ZWEoYSksZD1kfHxlYShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUZhKGUsZFtnXSk7ZWxzZSBGYShhLGYpO3JldHVybiBkPWVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJmZhKGQsIWkmJmVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5hdHRyaWJ1dGVzLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8TShkKSkmJihmPWRbaV0sZz1mJiZqW2ZdKSl7aWYoZy5ldmVudHMpZm9yKGUgaW4gZy5ldmVudHMpbVtlXT9uLmV2ZW50LnJlbW92ZShkLGUpOm4ucmVtb3ZlRXZlbnQoZCxlLGcuaGFuZGxlKTtqW2ZdJiYoZGVsZXRlIGpbZl0sa3x8InVuZGVmaW5lZCI9PXR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZT9kW2ldPXZvaWQgMDpkLnJlbW92ZUF0dHJpYnV0ZShpKSxjLnB1c2goZikpfX19KSxuLmZuLmV4dGVuZCh7ZG9tTWFuaXA6SGEsZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBJYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIElhKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9uLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxkKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEhhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1DYSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUNhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm4uY2xlYW5EYXRhKGVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbi5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UodGEsIiIpOnZvaWQgMDtpZigic3RyaW5nIj09dHlwZW9mIGEmJiF3YS50ZXN0KGEpJiYobC5odG1sU2VyaWFsaXplfHwhdWEudGVzdChhKSkmJihsLmxlYWRpbmdXaGl0ZXNwYWNlfHwhYWEudGVzdChhKSkmJiFkYVsoJC5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1uLmh0bWxQcmVmaWx0ZXIoYSk7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEoZWEoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5wYXJlbnROb2RlO24uaW5BcnJheSh0aGlzLGEpPDAmJihuLmNsZWFuRGF0YShlYSh0aGlzKSksYyYmYy5yZXBsYWNlQ2hpbGQoYix0aGlzKSl9LGEpfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZj1uKGEpLGg9Zi5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihmW2RdKVtiXShjKSxnLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBKYSxLYT17SFRNTDoiYmxvY2siLEJPRFk6ImJsb2NrIn07ZnVuY3Rpb24gTGEoYSxiKXt2YXIgYz1uKGIuY3JlYXRlRWxlbWVudChhKSkuYXBwZW5kVG8oYi5ib2R5KSxkPW4uY3NzKGNbMF0sImRpc3BsYXkiKTtyZXR1cm4gYy5kZXRhY2goKSxkfWZ1bmN0aW9uIE1hKGEpe3ZhciBiPWQsYz1LYVthXTtyZXR1cm4gY3x8KGM9TGEoYSxiKSwibm9uZSIhPT1jJiZjfHwoSmE9KEphfHxuKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKGIuZG9jdW1lbnRFbGVtZW50KSxiPShKYVswXS5jb250ZW50V2luZG93fHxKYVswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz1MYShhLGIpLEphLmRldGFjaCgpKSxLYVthXT1jKSxjfXZhciBOYT0vXm1hcmdpbi8sT2E9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxQYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX0sUWE9ZC5kb2N1bWVudEVsZW1lbnQ7IWZ1bmN0aW9uKCl7dmFyIGIsYyxlLGYsZyxoLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxqPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYoai5zdHlsZSl7ai5zdHlsZS5jc3NUZXh0PSJmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLGwub3BhY2l0eT0iMC41Ij09PWouc3R5bGUub3BhY2l0eSxsLmNzc0Zsb2F0PSEhai5zdHlsZS5jc3NGbG9hdCxqLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsai5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGwuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1qLnN0eWxlLmJhY2tncm91bmRDbGlwLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixqLmlubmVySFRNTD0iIixpLmFwcGVuZENoaWxkKGopLGwuYm94U2l6aW5nPSIiPT09ai5zdHlsZS5ib3hTaXppbmd8fCIiPT09ai5zdHlsZS5Nb3pCb3hTaXppbmd8fCIiPT09ai5zdHlsZS5XZWJraXRCb3hTaXppbmcsbi5leHRlbmQobCx7cmVsaWFibGVIaWRkZW5PZmZzZXRzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxmfSxib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZX0scGl4ZWxNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksY30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksYn0scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZ30scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxofX0pO2Z1bmN0aW9uIGsoKXt2YXIgayxsLG09ZC5kb2N1bWVudEVsZW1lbnQ7bS5hcHBlbmRDaGlsZChpKSxqLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7dG9wOjElO3dpZHRoOjUwJSIsYj1lPWg9ITEsYz1nPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9YS5nZXRDb21wdXRlZFN0eWxlKGopLGI9IjElIiE9PShsfHx7fSkudG9wLGg9IjJweCI9PT0obHx8e30pLm1hcmdpbkxlZnQsZT0iNHB4Ij09PShsfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxqLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGM9IjRweCI9PT0obHx8e21hcmdpblJpZ2h0OiI0cHgifSkubWFyZ2luUmlnaHQsaz1qLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGsuc3R5bGUuY3NzVGV4dD1qLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsay5zdHlsZS5tYXJnaW5SaWdodD1rLnN0eWxlLndpZHRoPSIwIixqLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShrKXx8e30pLm1hcmdpblJpZ2h0KSxqLnJlbW92ZUNoaWxkKGspKSxqLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWouZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsZiYmKGouc3R5bGUuZGlzcGxheT0iIixqLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsai5jaGlsZE5vZGVzWzBdLnN0eWxlLmJvcmRlckNvbGxhcHNlPSJzZXBhcmF0ZSIsaz1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGtbMF0uc3R5bGUuY3NzVGV4dD0ibWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowO2Rpc3BsYXk6bm9uZSIsZj0wPT09a1swXS5vZmZzZXRIZWlnaHQsZiYmKGtbMF0uc3R5bGUuZGlzcGxheT0iIixrWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWtbMF0ub2Zmc2V0SGVpZ2h0KSksbS5yZW1vdmVDaGlsZChpKX19fSgpO3ZhciBSYSxTYSxUYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhSYT1mdW5jdGlvbihiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGMmJmMub3BlbmVyfHwoYz1hKSxjLmdldENvbXB1dGVkU3R5bGUoYil9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2MuZ2V0UHJvcGVydHlWYWx1ZShiKXx8Y1tiXTp2b2lkIDAsIiIhPT1nJiZ2b2lkIDAhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxjJiYhbC5waXhlbE1hcmdpblJpZ2h0KCkmJk9hLnRlc3QoZykmJk5hLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9Ziksdm9pZCAwPT09Zz9nOmcrIiJ9KTpRYS5jdXJyZW50U3R5bGUmJihSYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jdXJyZW50U3R5bGV9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2NbYl06dm9pZCAwLG51bGw9PWcmJmgmJmhbYl0mJihnPWhbYl0pLE9hLnRlc3QoZykmJiFUYS50ZXN0KGIpJiYoZD1oLmxlZnQsZT1hLnJ1bnRpbWVTdHlsZSxmPWUmJmUubGVmdCxmJiYoZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGgubGVmdD0iZm9udFNpemUiPT09Yj8iMWVtIjpnLGc9aC5waXhlbExlZnQrInB4IixoLmxlZnQ9ZCxmJiYoZS5sZWZ0PWYpKSx2b2lkIDA9PT1nP2c6ZysiInx8ImF1dG8ifSk7ZnVuY3Rpb24gVWEoYSxiKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19dmFyIFZhPS9hbHBoYVwoW14pXSpcKS9pLFdhPS9vcGFjaXR5XHMqPVxzKihbXildKikvaSxYYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sWWE9bmV3IFJlZ0V4cCgiXigiK1QrIikoLiopJCIsImkiKSxaYT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sJGE9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LF9hPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sYWI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtmdW5jdGlvbiBiYihhKXtpZihhIGluIGFiKXJldHVybiBhO3ZhciBiPWEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPV9hLmxlbmd0aDt3aGlsZShjLS0paWYoYT1fYVtjXStiLGEgaW4gYWIpcmV0dXJuIGF9ZnVuY3Rpb24gY2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlcoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsTWEoZC5ub2RlTmFtZSkpKSk6KGU9VyhkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIGRiKGEsYixjKXt2YXIgZD1ZYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIGViKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVltmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gZmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPVJhKGEpLGc9bC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1TYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLE9hLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYobC5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK2ViKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1uLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPVNhKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1iYihoKXx8aCksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWMpcmV0dXJuIGcmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdO2lmKGY9dHlwZW9mIGMsInN0cmluZyI9PT1mJiYoZT1VLmV4ZWMoYykpJiZlWzFdJiYoYz1YKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChuLmNzc051bWJlcltoXT8iIjoicHgiKSksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPWJiKGgpfHxoKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZj1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1mJiYoZj1TYShhLGIsZCkpLCJub3JtYWwiPT09ZiYmYiBpbiAkYSYmKGY9JGFbYl0pLCIiPT09Y3x8Yz8oZT1wYXJzZUZsb2F0KGYpLGM9PT0hMHx8aXNGaW5pdGUoZSk/ZXx8MDpmKTpmfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP1hhLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/UGEoYSxaYSxmdW5jdGlvbigpe3JldHVybiBmYihhLGIsZCl9KTpmYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJlJhKGEpO3JldHVybiBkYihhLGMsZD9lYihhLGIsZCxsLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbC5vcGFjaXR5fHwobi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gV2EudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW4uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1uLnRyaW0oZi5yZXBsYWNlKFZhLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPVZhLnRlc3QoZik/Zi5yZXBsYWNlKFZhLGUpOmYrIiAiK2UpfX0pLG4uY3NzSG9va3MubWFyZ2luUmlnaHQ9VWEobC5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/UGEoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sU2EsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uY3NzSG9va3MubWFyZ2luTGVmdD1VYShsLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihhLGIpe3JldHVybiBiPyhwYXJzZUZsb2F0KFNhKGEsIm1hcmdpbkxlZnQiKSl8fChuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtUGEoYSx7Cm1hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSk6MCkpKyJweCI6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxOYS50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1kYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPVJhKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGE/YT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMpP24odGhpcykuc2hvdygpOm4odGhpcykuaGlkZSgpfSl9fSk7ZnVuY3Rpb24gZ2IoYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGdiLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bi5Ud2Vlbj1nYixnYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fG4uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWdiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpnYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1nYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmdiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGdiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1nYi5wcm90b3R5cGUsZ2IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiAxIT09YS5lbGVtLm5vZGVUeXBlfHxudWxsIT1hLmVsZW1bYS5wcm9wXSYmbnVsbD09YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtW2EucHJvcF06KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6MSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbD09YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV0mJiFuLmNzc0hvb2tzW2EucHJvcF0/YS5lbGVtW2EucHJvcF09YS5ub3c6bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCl9fX0sZ2IucHJvcEhvb2tzLnNjcm9sbFRvcD1nYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LG4uZng9Z2IucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBoYixpYixqYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sa2I9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBsYigpe3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoYj12b2lkIDB9KSxoYj1uLm5vdygpfWZ1bmN0aW9uIG1iKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VltlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIG5iKGEsYixjKXtmb3IodmFyIGQsZT0ocWIudHdlZW5lcnNbYl18fFtdKS5jb25jYXQocWIudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gb2IoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVyhhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP24uX2RhdGEoYSwib2xkZGlzcGxheSIpfHxNYShhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09ayYmIm5vbmUiPT09bi5jc3MoYSwiZmxvYXQiKSYmKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmImlubGluZSIhPT1NYShhLm5vZGVOYW1lKT9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGpiLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChvKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP01hKGEubm9kZU5hbWUpOmopJiYocC5kaXNwbGF5PWopO2Vsc2V7cj8iaGlkZGVuImluIHImJihxPXIuaGlkZGVuKTpyPW4uX2RhdGEoYSwiZnhzaG93Iix7fSksZiYmKHIuaGlkZGVuPSFxKSxxP24oYSkuc2hvdygpOm0uZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbS5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7bi5fcmVtb3ZlRGF0YShhLCJmeHNob3ciKTtmb3IoYiBpbiBvKW4uc3R5bGUoYSxiLG9bYl0pfSk7Zm9yKGQgaW4gbylnPW5iKHE/cltkXTowLGQsbSksZCBpbiByfHwocltkXT1nLnN0YXJ0LHEmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBxYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1xYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWhifHxsYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpuLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmhifHxsYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihwYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9cWIucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIG4uaXNGdW5jdGlvbihkLnN0b3ApJiYobi5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPW4ucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiBuLm1hcChrLG5iLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQocWIse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpO3JldHVybiBYKGMuZWxlbSxhLFUuZXhlYyhiKSxjKSxjfV19LHR3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEubWF0Y2goRyk7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLHFiLnR3ZWVuZXJzW2NdPXFiLnR3ZWVuZXJzW2NdfHxbXSxxYi50d2VlbmVyc1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXJzOltvYl0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9xYi5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6cWIucHJlZmlsdGVycy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihXKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9cWIodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8bi5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9bi5fZGF0YSh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZrYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1uLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobWIoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOm1iKCJzaG93Iiksc2xpZGVVcDptYigiaGlkZSIpLHNsaWRlVG9nZ2xlOm1iKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW4udGltZXJzLGM9MDtmb3IoaGI9bi5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxuLmZ4LnN0b3AoKSxoYj12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpYnx8KGliPWEuc2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7YS5jbGVhckludGVydmFsKGliKSxpYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9bi5meD9uLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYSxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGY9ZS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnNldEF0dHJpYnV0ZSgidHlwZSIsImNoZWNrYm94IiksYy5hcHBlbmRDaGlsZChiKSxhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGwuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWMuY2xhc3NOYW1lLGwuc3R5bGU9L3RvcC8udGVzdChhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksbC5ocmVmTm9ybWFsaXplZD0iL2EiPT09YS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxsLmNoZWNrT249ISFiLnZhbHVlLGwub3B0U2VsZWN0ZWQ9Zi5zZWxlY3RlZCxsLmVuY3R5cGU9ISFkLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGUuZGlzYWJsZWQ9ITAsbC5vcHREaXNhYmxlZD0hZi5kaXNhYmxlZCxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxsLmlucHV0PSIiPT09Yi5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYi52YWx1ZT0idCIsYi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGwucmFkaW9WYWx1ZT0idCI9PT1iLnZhbHVlfSgpO3ZhciByYj0vXHIvZyxzYj0vW1x4MjBcdFxyXG5cZl0rL2c7bi5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW4uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxuKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bi5pc0FycmF5KGUpJiYoZT1uLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKHJiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxuLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKS5yZXBsYWNlKHNiLCIgIil9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwoYy5zZWxlY3RlZHx8aT09PWUpJiYobC5vcHREaXNhYmxlZD8hYy5kaXNhYmxlZDpudWxsPT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpJiYoIWMucGFyZW50Tm9kZS5kaXNhYmxlZHx8IW4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0paWYoZD1lW2ddLG4uaW5BcnJheShuLnZhbEhvb2tzLm9wdGlvbi5nZXQoZCksZik+LTEpdHJ5e2Quc2VsZWN0ZWQ9Yz0hMH1jYXRjaChoKXtkLnNjcm9sbEhlaWdodH1lbHNlIGQuc2VsZWN0ZWQ9ITE7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGV9fX19KSxuLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtuLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5pc0FycmF5KGIpP2EuY2hlY2tlZD1uLmluQXJyYXkobihhKS52YWwoKSxiKT4tMTp2b2lkIDB9fSxsLmNoZWNrT258fChuLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSk7dmFyIHRiLHViLHZiPW4uZXhwci5hdHRySGFuZGxlLHdiPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2kseGI9bC5nZXRTZXRBdHRyaWJ1dGUseWI9bC5pbnB1dDtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBZKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZigzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGU/bi5wcm9wKGEsYixjKTooMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxlPW4uYXR0ckhvb2tzW2JdfHwobi5leHByLm1hdGNoLmJvb2wudGVzdChiKT91Yjp0YikpLHZvaWQgMCE9PWM/bnVsbD09PWM/dm9pZCBuLnJlbW92ZUF0dHIoYSxiKTplJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOihkPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZD92b2lkIDA6ZCkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFsLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEcpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/eWImJnhifHwhd2IudGVzdChjKT9hW2RdPSExOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTpuLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh4Yj9jOmQpfX0pLHViPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6eWImJnhifHwhd2IudGVzdChjKT9hLnNldEF0dHJpYnV0ZSgheGImJm4ucHJvcEZpeFtjXXx8YyxjKTphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPXZiW2JdfHxuLmZpbmQuYXR0cjt5YiYmeGJ8fCF3Yi50ZXN0KGIpP3ZiW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj12YltiXSx2YltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsdmJbYl09ZiksZX06dmJbYl09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHliJiZ4Ynx8KG4uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTp0YiYmdGIuc2V0KGEsYixjKX19KSx4Ynx8KHRiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sdmIuaWQ9dmIubmFtZT12Yi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxuLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0OnRiLnNldH0sbi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3RiLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe24uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxsLnN0eWxlfHwobi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksQWI9L14oPzphfGFyZWEpJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bi5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKDMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1uLnByb3BGaXhbYl18fGIsZT1uLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTp6Yi50ZXN0KGEubm9kZU5hbWUpfHxBYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGwuZW5jdHlwZXx8KG4ucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpO3ZhciBCYj0vW1x0XHJcblxmXS9nO2Z1bmN0aW9uIENiKGEpe3JldHVybiBuLmF0dHIoYSwiY2xhc3MiKXx8IiJ9bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk9MDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsQ2IodGhpcykpKX0pO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKWQuaW5kZXhPZigiICIrZisiICIpPDAmJihkKz1mKyIgIik7aD1uLnRyaW0oZCksZSE9PWgmJm4uYXR0cihjLCJjbGFzcyIsaCl9fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLENiKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZisiICIpPi0xKWQ9ZC5yZXBsYWNlKCIgIitmKyIgIiwiICIpO2g9bi50cmltKGQpLGUhPT1oJiZuLmF0dHIoYywiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6bi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsQ2IodGhpcyksYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixkLGUsZjtpZigic3RyaW5nIj09PWMpe2Q9MCxlPW4odGhpcyksZj1hLm1hdGNoKEcpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlIHZvaWQgMCE9PWEmJiJib29sZWFuIiE9PWN8fChiPUNiKHRoaXMpLGImJm4uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsYiksbi5hdHRyKHRoaXMsImNsYXNzIixifHxhPT09ITE/IiI6bi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPTA7Yj0iICIrYSsiICI7d2hpbGUoYz10aGlzW2QrK10paWYoMT09PWMubm9kZVR5cGUmJigiICIrQ2IoYykrIiAiKS5yZXBsYWNlKEJiLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KSxuLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxuLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIERiPWEubG9jYXRpb24sRWI9bi5ub3coKSxGYj0vXD8vLEdiPS8oLCl8KFxbfHspfCh9fF0pfCIoPzpbXiJcXFxyXG5dfFxcWyJcXFwvYmZucnRdfFxcdVtcZGEtZkEtRl17NH0pKiJccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXGQpXGQrKD86XC5cZCt8KSg/OltlRV1bKy1dP1xkK3wpL2c7bi5wYXJzZUpTT049ZnVuY3Rpb24oYil7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKyIiKTt2YXIgYyxkPW51bGwsZT1uLnRyaW0oYisiIik7cmV0dXJuIGUmJiFuLnRyaW0oZS5yZXBsYWNlKEdiLGZ1bmN0aW9uKGEsYixlLGYpe3JldHVybiBjJiZiJiYoZD0wKSwwPT09ZD9hOihjPWV8fGIsZCs9IWYtIWUsIiIpfSkpP0Z1bmN0aW9uKCJyZXR1cm4gIitlKSgpOm4uZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihiKXt2YXIgYyxkO2lmKCFifHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIG51bGw7dHJ5e2EuRE9NUGFyc2VyPyhkPW5ldyBhLkRPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIEhiPS8jLiokLyxJYj0vKFs/Jl0pXz1bXiZdKi8sSmI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxLYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxMYj0vXig/OkdFVHxIRUFEKSQvLE1iPS9eXC9cLy8sTmI9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sT2I9e30sUGI9e30sUWI9IiovIi5jb25jYXQoIioiKSxSYj1EYi5ocmVmLFNiPU5iLmV4ZWMoUmIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIFRiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEcpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gVWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09UGI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBWYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gV2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gWGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6UmIsdHlwZToiR0VUIixpc0xvY2FsOktiLnRlc3QoU2JbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6UWIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bi5wYXJzZUpTT04sInRleHQgeG1sIjpuLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9WYihWYihhLG4uYWpheFNldHRpbmdzKSxiKTpWYihuLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpUYihPYiksYWpheFRyYW5zcG9ydDpUYihQYiksYWpheDpmdW5jdGlvbihiLGMpeyJvYmplY3QiPT10eXBlb2YgYiYmKGM9YixiPXZvaWQgMCksYz1jfHx7fTt2YXIgZCxlLGYsZyxoLGksaixrLGw9bi5hamF4U2V0dXAoe30sYyksbT1sLmNvbnRleHR8fGwsbz1sLmNvbnRleHQmJihtLm5vZGVUeXBlfHxtLmpxdWVyeSk/bihtKTpuLmV2ZW50LHA9bi5EZWZlcnJlZCgpLHE9bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHM9e30sdD17fSx1PTAsdj0iY2FuY2VsZWQiLHc9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dSl7aWYoIWspe2s9e307d2hpbGUoYj1KYi5leGVjKGcpKWtbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9a1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT11P2c6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdXx8KGE9dFtjXT10W2NdfHxhLHNbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdXx8KGwubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dSlmb3IoYiBpbiBhKXJbYl09W3JbYl0sYVtiXV07ZWxzZSB3LmFsd2F5cyhhW3cuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHY7cmV0dXJuIGomJmouYWJvcnQoYikseSgwLGIpLHRoaXN9fTtpZihwLnByb21pc2UodykuY29tcGxldGU9cS5hZGQsdy5zdWNjZXNzPXcuZG9uZSx3LmVycm9yPXcuZmFpbCxsLnVybD0oKGJ8fGwudXJsfHxSYikrIiIpLnJlcGxhY2UoSGIsIiIpLnJlcGxhY2UoTWIsU2JbMV0rIi8vIiksbC50eXBlPWMubWV0aG9kfHxjLnR5cGV8fGwubWV0aG9kfHxsLnR5cGUsbC5kYXRhVHlwZXM9bi50cmltKGwuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChHKXx8WyIiXSxudWxsPT1sLmNyb3NzRG9tYWluJiYoZD1OYi5leGVjKGwudXJsLnRvTG93ZXJDYXNlKCkpLGwuY3Jvc3NEb21haW49ISghZHx8ZFsxXT09PVNiWzFdJiZkWzJdPT09U2JbMl0mJihkWzNdfHwoImh0dHA6Ij09PWRbMV0/IjgwIjoiNDQzIikpPT09KFNiWzNdfHwoImh0dHA6Ij09PVNiWzFdPyI4MCI6IjQ0MyIpKSkpLGwuZGF0YSYmbC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBsLmRhdGEmJihsLmRhdGE9bi5wYXJhbShsLmRhdGEsbC50cmFkaXRpb25hbCkpLFViKE9iLGwsYyx3KSwyPT09dSlyZXR1cm4gdztpPW4uZXZlbnQmJmwuZ2xvYmFsLGkmJjA9PT1uLmFjdGl2ZSsrJiZuLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGwudHlwZT1sLnR5cGUudG9VcHBlckNhc2UoKSxsLmhhc0NvbnRlbnQ9IUxiLnRlc3QobC50eXBlKSxmPWwudXJsLGwuaGFzQ29udGVudHx8KGwuZGF0YSYmKGY9bC51cmwrPShGYi50ZXN0KGYpPyImIjoiPyIpK2wuZGF0YSxkZWxldGUgbC5kYXRhKSxsLmNhY2hlPT09ITEmJihsLnVybD1JYi50ZXN0KGYpP2YucmVwbGFjZShJYiwiJDFfPSIrRWIrKyk6ZisoRmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0ViKyspKSxsLmlmTW9kaWZpZWQmJihuLmxhc3RNb2RpZmllZFtmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbi5sYXN0TW9kaWZpZWRbZl0pLG4uZXRhZ1tmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixuLmV0YWdbZl0pKSwobC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJncuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSx3LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsbC5kYXRhVHlwZXNbMF0mJmwuYWNjZXB0c1tsLmRhdGFUeXBlc1swXV0/bC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXSsoIioiIT09bC5kYXRhVHlwZXNbMF0/IiwgIitRYisiOyBxPTAuMDEiOiIiKTpsLmFjY2VwdHNbIioiXSk7Zm9yKGUgaW4gbC5oZWFkZXJzKXcuc2V0UmVxdWVzdEhlYWRlcihlLGwuaGVhZGVyc1tlXSk7aWYobC5iZWZvcmVTZW5kJiYobC5iZWZvcmVTZW5kLmNhbGwobSx3LGwpPT09ITF8fDI9PT11KSlyZXR1cm4gdy5hYm9ydCgpO3Y9ImFib3J0Ijtmb3IoZSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl3W2VdKGxbZV0pO2lmKGo9VWIoUGIsbCxjLHcpKXtpZih3LnJlYWR5U3RhdGU9MSxpJiZvLnRyaWdnZXIoImFqYXhTZW5kIixbdyxsXSksMj09PXUpcmV0dXJuIHc7bC5hc3luYyYmbC50aW1lb3V0PjAmJihoPWEuc2V0VGltZW91dChmdW5jdGlvbigpe3cuYWJvcnQoInRpbWVvdXQiKX0sbC50aW1lb3V0KSk7dHJ5e3U9MSxqLnNlbmQocyx5KX1jYXRjaCh4KXtpZighKDI+dSkpdGhyb3cgeDt5KC0xLHgpfX1lbHNlIHkoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHkoYixjLGQsZSl7dmFyIGsscyx0LHYseCx5PWM7MiE9PXUmJih1PTIsaCYmYS5jbGVhclRpbWVvdXQoaCksaj12b2lkIDAsZz1lfHwiIix3LnJlYWR5U3RhdGU9Yj4wPzQ6MCxrPWI+PTIwMCYmMzAwPmJ8fDMwND09PWIsZCYmKHY9V2IobCx3LGQpKSx2PVhiKGwsdix3LGspLGs/KGwuaWZNb2RpZmllZCYmKHg9dy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHgmJihuLmxhc3RNb2RpZmllZFtmXT14KSx4PXcuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx4JiYobi5ldGFnW2ZdPXgpKSwyMDQ9PT1ifHwiSEVBRCI9PT1sLnR5cGU/eT0ibm9jb250ZW50IjozMDQ9PT1iP3k9Im5vdG1vZGlmaWVkIjooeT12LnN0YXRlLHM9di5kYXRhLHQ9di5lcnJvcixrPSF0KSk6KHQ9eSwhYiYmeXx8KHk9ImVycm9yIiwwPmImJihiPTApKSksdy5zdGF0dXM9Yix3LnN0YXR1c1RleHQ9KGN8fHkpKyIiLGs/cC5yZXNvbHZlV2l0aChtLFtzLHksd10pOnAucmVqZWN0V2l0aChtLFt3LHksdF0pLHcuc3RhdHVzQ29kZShyKSxyPXZvaWQgMCxpJiZvLnRyaWdnZXIoaz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt3LGwsaz9zOnRdKSxxLmZpcmVXaXRoKG0sW3cseV0pLGkmJihvLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3csbF0pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB3fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheChuLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sbi5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KTtmdW5jdGlvbiBZYihhKXtyZXR1cm4gYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5Iil9ZnVuY3Rpb24gWmIoYSl7aWYoIW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50fHxkLGEpKXJldHVybiEwO3doaWxlKGEmJjE9PT1hLm5vZGVUeXBlKXtpZigibm9uZSI9PT1ZYihhKXx8ImhpZGRlbiI9PT1hLnR5cGUpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9bi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpP2Eub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wJiYhYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDpaYihhKX0sbi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgJGI9LyUyMC9nLF9iPS9cW1xdJC8sYWM9L1xyP1xuL2csYmM9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGNjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBkYyhhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxfYi50ZXN0KGEpP2QoYSxlKTpkYyhhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bi50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpZGMoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlkYyhjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSgkYiwiKyIpfSxuLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1uLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmY2MudGVzdCh0aGlzLm5vZGVOYW1lKSYmIWJjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFaLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYWMsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGFjLCJcclxuIil9fSkuZ2V0KCl9fSksbi5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTG9jYWw/aWMoKTpkLmRvY3VtZW50TW9kZT44P2hjKCk6L14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmaGMoKXx8aWMoKX06aGM7dmFyIGVjPTAsZmM9e30sZ2M9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGZjKWZjW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFnYyYmIndpdGhDcmVkZW50aWFscyJpbiBnYyxnYz1sLmFqYXg9ISFnYyxnYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGIpe2lmKCFiLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7dmFyIGYsZz1iLnhocigpLGg9KytlYztpZihnLm9wZW4oYi50eXBlLGIudXJsLGIuYXN5bmMsYi51c2VybmFtZSxiLnBhc3N3b3JkKSxiLnhockZpZWxkcylmb3IoZiBpbiBiLnhockZpZWxkcylnW2ZdPWIueGhyRmllbGRzW2ZdO2IubWltZVR5cGUmJmcub3ZlcnJpZGVNaW1lVHlwZSYmZy5vdmVycmlkZU1pbWVUeXBlKGIubWltZVR5cGUpLGIuY3Jvc3NEb21haW58fGRbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGRbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZiBpbiBkKXZvaWQgMCE9PWRbZl0mJmcuc2V0UmVxdWVzdEhlYWRlcihmLGRbZl0rIiIpO2cuc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCksYz1mdW5jdGlvbihhLGQpe3ZhciBmLGksajtpZihjJiYoZHx8ND09PWcucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIGZjW2hdLGM9dm9pZCAwLGcub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxkKTQhPT1nLnJlYWR5U3RhdGUmJmcuYWJvcnQoKTtlbHNle2o9e30sZj1nLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGcucmVzcG9uc2VUZXh0JiYoai50ZXh0PWcucmVzcG9uc2VUZXh0KTt0cnl7aT1nLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1mfHwhYi5pc0xvY2FsfHxiLmNyb3NzRG9tYWluPzEyMjM9PT1mJiYoZj0yMDQpOmY9ai50ZXh0PzIwMDo0MDR9aiYmZShmLGksaixnLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYi5hc3luYz80PT09Zy5yZWFkeVN0YXRlP2Euc2V0VGltZW91dChjKTpnLm9ucmVhZHlzdGF0ZWNoYW5nZT1mY1toXT1jOmMoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKHZvaWQgMCwhMCl9fX19KTtmdW5jdGlvbiBoYygpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBpYygpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fW4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPWQuaGVhZHx8bigiaGVhZCIpWzBdfHxkLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGYpe2I9ZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxmKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgamM9W10sa2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9amMucG9wKCl8fG4uZXhwYW5kbysiXyIrRWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGtjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYma2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGtjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShGYi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1mP24oYSkucmVtb3ZlUHJvcChlKTphW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssamMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGQ7dmFyIGU9eC5leGVjKGEpLGY9IWMmJltdO3JldHVybiBlP1tiLmNyZWF0ZUVsZW1lbnQoZVsxXSldOihlPWphKFthXSxiLGYpLGYmJmYubGVuZ3RoJiZuKGYpLnJlbW92ZSgpLG4ubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9O3ZhciBsYz1uLmZuLmxvYWQ7bi5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJmxjKXJldHVybiBsYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZigiICIpO3JldHVybiBoPi0xJiYoZD1uLnRyaW0oYS5zbGljZShoLGEubGVuZ3RoKSksYT1hLnNsaWNlKDAsaCkpLG4uaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmbi5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07ZnVuY3Rpb24gbWMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZuLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLG4uZXh0ZW5kKHt9LGgpKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8oInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1tYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYhbi5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bi5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxRYX0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO24uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9bWMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bihmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bihmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT1VYShsLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1TYShhLGIpLE9hLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7CnBhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pLG4uZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sbi5mbi5hbmRTZWxmPW4uZm4uYWRkQmFjaywiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBuYz1hLmpRdWVyeSxvYz1hLiQ7cmV0dXJuIG4ubm9Db25mbGljdD1mdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09biYmKGEuJD1vYyksYiYmYS5qUXVlcnk9PT1uJiYoYS5qUXVlcnk9bmMpLG59LGJ8fChhLmpRdWVyeT1hLiQ9biksbn0pOwo="></script>
<link href="data:text/css;charset=utf-8,%0A%2Eleaflet%2Dmap%2Dpane%2C%0A%2Eleaflet%2Dtile%2C%0A%2Eleaflet%2Dmarker%2Dicon%2C%0A%2Eleaflet%2Dmarker%2Dshadow%2C%0A%2Eleaflet%2Dtile%2Dpane%2C%0A%2Eleaflet%2Dtile%2Dcontainer%2C%0A%2Eleaflet%2Doverlay%2Dpane%2C%0A%2Eleaflet%2Dshadow%2Dpane%2C%0A%2Eleaflet%2Dmarker%2Dpane%2C%0A%2Eleaflet%2Dpopup%2Dpane%2C%0A%2Eleaflet%2Doverlay%2Dpane%20svg%2C%0A%2Eleaflet%2Dzoom%2Dbox%2C%0A%2Eleaflet%2Dimage%2Dlayer%2C%0A%2Eleaflet%2Dlayer%20%7B%0Aposition%3A%20absolute%3B%0Aleft%3A%200%3B%0Atop%3A%200%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20%7B%0Aoverflow%3A%20hidden%3B%0A%2Dms%2Dtouch%2Daction%3A%20none%3B%0Atouch%2Daction%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dtile%2C%0A%2Eleaflet%2Dmarker%2Dicon%2C%0A%2Eleaflet%2Dmarker%2Dshadow%20%7B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0A%2Dwebkit%2Duser%2Ddrag%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dmarker%2Dicon%2C%0A%2Eleaflet%2Dmarker%2Dshadow%20%7B%0Adisplay%3A%20block%3B%0A%7D%0A%0A%2Eleaflet%2Dcontainer%20img%20%7B%0Amax%2Dwidth%3A%20none%20%21important%3B%0A%7D%0A%0A%2Eleaflet%2Dcontainer%20img%2Eleaflet%2Dimage%2Dlayer%20%7B%0Amax%2Dwidth%3A%2015000px%20%21important%3B%0A%7D%0A%2Eleaflet%2Dtile%20%7B%0Afilter%3A%20inherit%3B%0Avisibility%3A%20hidden%3B%0A%7D%0A%2Eleaflet%2Dtile%2Dloaded%20%7B%0Avisibility%3A%20inherit%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Dbox%20%7B%0Awidth%3A%200%3B%0Aheight%3A%200%3B%0A%7D%0A%0A%2Eleaflet%2Doverlay%2Dpane%20svg%20%7B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dtile%2Dpane%20%7B%20z%2Dindex%3A%202%3B%20%7D%0A%2Eleaflet%2Dobjects%2Dpane%20%7B%20z%2Dindex%3A%203%3B%20%7D%0A%2Eleaflet%2Doverlay%2Dpane%20%7B%20z%2Dindex%3A%204%3B%20%7D%0A%2Eleaflet%2Dshadow%2Dpane%20%7B%20z%2Dindex%3A%205%3B%20%7D%0A%2Eleaflet%2Dmarker%2Dpane%20%7B%20z%2Dindex%3A%206%3B%20%7D%0A%2Eleaflet%2Dpopup%2Dpane%20%7B%20z%2Dindex%3A%207%3B%20%7D%0A%2Eleaflet%2Dvml%2Dshape%20%7B%0Awidth%3A%201px%3B%0Aheight%3A%201px%3B%0A%7D%0A%2Elvml%20%7B%0Abehavior%3A%20url%28%23default%23VML%29%3B%0Adisplay%3A%20inline%2Dblock%3B%0Aposition%3A%20absolute%3B%0A%7D%0A%0A%2Eleaflet%2Dcontrol%20%7B%0Aposition%3A%20relative%3B%0Az%2Dindex%3A%207%3B%0Apointer%2Devents%3A%20auto%3B%0A%7D%0A%2Eleaflet%2Dtop%2C%0A%2Eleaflet%2Dbottom%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%201000%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dtop%20%7B%0Atop%3A%200%3B%0A%7D%0A%2Eleaflet%2Dright%20%7B%0Aright%3A%200%3B%0A%7D%0A%2Eleaflet%2Dbottom%20%7B%0Abottom%3A%200%3B%0A%7D%0A%2Eleaflet%2Dleft%20%7B%0Aleft%3A%200%3B%0A%7D%0A%2Eleaflet%2Dcontrol%20%7B%0Afloat%3A%20left%3B%0Aclear%3A%20both%3B%0A%7D%0A%2Eleaflet%2Dright%20%2Eleaflet%2Dcontrol%20%7B%0Afloat%3A%20right%3B%0A%7D%0A%2Eleaflet%2Dtop%20%2Eleaflet%2Dcontrol%20%7B%0Amargin%2Dtop%3A%2010px%3B%0A%7D%0A%2Eleaflet%2Dbottom%20%2Eleaflet%2Dcontrol%20%7B%0Amargin%2Dbottom%3A%2010px%3B%0A%7D%0A%2Eleaflet%2Dleft%20%2Eleaflet%2Dcontrol%20%7B%0Amargin%2Dleft%3A%2010px%3B%0A%7D%0A%2Eleaflet%2Dright%20%2Eleaflet%2Dcontrol%20%7B%0Amargin%2Dright%3A%2010px%3B%0A%7D%0A%0A%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dtile%2C%0A%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dpopup%20%7B%0Aopacity%3A%200%3B%0A%2Dwebkit%2Dtransition%3A%20opacity%200%2E2s%20linear%3B%0A%2Dmoz%2Dtransition%3A%20opacity%200%2E2s%20linear%3B%0A%2Do%2Dtransition%3A%20opacity%200%2E2s%20linear%3B%0Atransition%3A%20opacity%200%2E2s%20linear%3B%0A%7D%0A%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dtile%2Dloaded%2C%0A%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dmap%2Dpane%20%2Eleaflet%2Dpopup%20%7B%0Aopacity%3A%201%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dzoom%2Danimated%20%7B%0A%2Dwebkit%2Dtransition%3A%20%2Dwebkit%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%0A%2Dmoz%2Dtransition%3A%20%2Dmoz%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%0A%2Do%2Dtransition%3A%20%2Do%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%0Atransition%3A%20transform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dtile%2C%0A%2Eleaflet%2Dpan%2Danim%20%2Eleaflet%2Dtile%2C%0A%2Eleaflet%2Dtouching%20%2Eleaflet%2Dzoom%2Danimated%20%7B%0A%2Dwebkit%2Dtransition%3A%20none%3B%0A%2Dmoz%2Dtransition%3A%20none%3B%0A%2Do%2Dtransition%3A%20none%3B%0Atransition%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dzoom%2Dhide%20%7B%0Avisibility%3A%20hidden%3B%0A%7D%0A%0A%2Eleaflet%2Dclickable%20%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20%7B%0Acursor%3A%20%2Dwebkit%2Dgrab%3B%0Acursor%3A%20%2Dmoz%2Dgrab%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dpane%2C%0A%2Eleaflet%2Dcontrol%20%7B%0Acursor%3A%20auto%3B%0A%7D%0A%2Eleaflet%2Ddragging%20%2Eleaflet%2Dcontainer%2C%0A%2Eleaflet%2Ddragging%20%2Eleaflet%2Dclickable%20%7B%0Acursor%3A%20move%3B%0Acursor%3A%20%2Dwebkit%2Dgrabbing%3B%0Acursor%3A%20%2Dmoz%2Dgrabbing%3B%0A%7D%0A%0A%2Eleaflet%2Dcontainer%20%7B%0Abackground%3A%20%23ddd%3B%0Aoutline%3A%200%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20a%20%7B%0Acolor%3A%20%230078A8%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dactive%20%7B%0Aoutline%3A%202px%20solid%20orange%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Dbox%20%7B%0Aborder%3A%202px%20dotted%20%2338f%3B%0Abackground%3A%20rgba%28255%2C255%2C255%2C0%2E5%29%3B%0A%7D%0A%0A%2Eleaflet%2Dcontainer%20%7B%0Afont%3A%2012px%2F1%2E5%20%22Helvetica%20Neue%22%2C%20Arial%2C%20Helvetica%2C%20sans%2Dserif%3B%0A%7D%0A%0A%2Eleaflet%2Dbar%20%7B%0Abox%2Dshadow%3A%200%201px%205px%20rgba%280%2C0%2C0%2C0%2E65%29%3B%0Aborder%2Dradius%3A%204px%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%2C%0A%2Eleaflet%2Dbar%20a%3Ahover%20%7B%0Abackground%2Dcolor%3A%20%23fff%3B%0Aborder%2Dbottom%3A%201px%20solid%20%23ccc%3B%0Awidth%3A%2026px%3B%0Aheight%3A%2026px%3B%0Aline%2Dheight%3A%2026px%3B%0Adisplay%3A%20block%3B%0Atext%2Dalign%3A%20center%3B%0Atext%2Ddecoration%3A%20none%3B%0Acolor%3A%20black%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%2C%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Abackground%2Dposition%3A%2050%25%2050%25%3B%0Abackground%2Drepeat%3A%20no%2Drepeat%3B%0Adisplay%3A%20block%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%3Ahover%20%7B%0Abackground%2Dcolor%3A%20%23f4f4f4%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%3Afirst%2Dchild%20%7B%0Aborder%2Dtop%2Dleft%2Dradius%3A%204px%3B%0Aborder%2Dtop%2Dright%2Dradius%3A%204px%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%3Alast%2Dchild%20%7B%0Aborder%2Dbottom%2Dleft%2Dradius%3A%204px%3B%0Aborder%2Dbottom%2Dright%2Dradius%3A%204px%3B%0Aborder%2Dbottom%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%2Eleaflet%2Ddisabled%20%7B%0Acursor%3A%20default%3B%0Abackground%2Dcolor%3A%20%23f4f4f4%3B%0Acolor%3A%20%23bbb%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20a%20%7B%0Awidth%3A%2030px%3B%0Aheight%3A%2030px%3B%0Aline%2Dheight%3A%2030px%3B%0A%7D%0A%0A%2Eleaflet%2Dcontrol%2Dzoom%2Din%2C%0A%2Eleaflet%2Dcontrol%2Dzoom%2Dout%20%7B%0Afont%3A%20bold%2018px%20%27Lucida%20Console%27%2C%20Monaco%2C%20monospace%3B%0Atext%2Dindent%3A%201px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dzoom%2Dout%20%7B%0Afont%2Dsize%3A%2020px%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dzoom%2Din%20%7B%0Afont%2Dsize%3A%2022px%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dzoom%2Dout%20%7B%0Afont%2Dsize%3A%2024px%3B%0A%7D%0A%0A%2Eleaflet%2Dcontrol%2Dlayers%20%7B%0Abox%2Dshadow%3A%200%201px%205px%20rgba%280%2C0%2C0%2C0%2E4%29%3B%0Abackground%3A%20%23fff%3B%0Aborder%2Dradius%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAVbSURBVEiJrZZfSFt3FMe%2Fv3tvbmLUZleNKSHE%2FLGRiNbGRovTtrA9lcFkpcOnMvawwhhjrb3soQ8djGFhXMQNRqEvY3R9kJVuPpRRWQebcdKYxkaHqcHchKJ2rVo1WhNz%2F%2Fz2UOLUadVuv9fvOedzfuec3x9CKcV%2B1qVLlwgAdHV17cuR7AfU29tb43a73wWAVCr1Q0dHx8T%2FCuru7i5ubGw843K5ms1mMwBgdXUV6XQ6HI1Gb3Z2dj7%2Fz6C%2Bvr6T1dXVp6xWa%2Bl2%2Buzs7PLk5OTP7e3tv70S6Pr1647q6uoOt9vtYRjmpcnouo5UKiVPTk72nj17dmpPIEmS%2BIaGhnaPx3O8tLSU3ahRSotyudzrAGAymf4ghGQ36svLy5osywOxWKxPFMX8jqBbt241ejyed%2Bx2e9nWjPL5fK2iKC2UUiMAEELWDAbDEM%2Fz41ttZ2Zmnsmy%2FOPp06ejm0DXrl2rqK2tPeNyuQ7zPL9pi5qmVaytrZ3Qdf3gdiVhGOYvo9H4O8uyc1sSI%2Bl0enR8fPzmuXPn5sjt27ff8nq9bwiCYNpSJsPa2lqzqqr1AF7eJEDnOG7MaDSGCSHKRmFhYSGXTCZ%2FZd1u93dOp3NJEAS9ICqK4snlcm%2Fpuu4EQHaBAADRdf2gqqo1hJBllmUXCsLjx4%2BL7t69e4Ztamqaffjw4QepVOr5oUOHDKqqvqkoShAAvwfA1sVrmlataVqlqqqzvb29lnA43KwoymeEUoqenp7XdF3vW11dPX7s2DHi9XpfgfHPSiaTuHfvHjWbzQMMw7SfP39%2BkUSj0ZOU0qsA%2FEtLSwiHwygpKUFraysOHDiwL0Amk8Hg4CBWVlbQ3NwMi8UCAHFCyIesw%2BH43uFwuAwGg9lkMsHj8SCfzyMUCkFRFNhsNux2YDVNQzQaRSgUgsvlwtGjR2EyvZitbDbL9Pf3H2YDgcD8xMREk67rCZvN5iSEkLKyMrjdbsiyjJGREVgslh13NzU1hf7%2Bfui6jra2NlitVhBCQCmlo6OjoYGBASWbzX5BKKW4cuWKhRDyk67rJ4LBIFNRUbEeaHZ2FpFIBDabDS0tLSgqKipkiqGhITx58gTBYBBWq3XdZ25uDpFIhLIsO8jzfPuFCxeekTt37rQCuAqgfmVlBfF4HOXl5Thy5Ah4%2FsXgUUoRj8chyzIaGhoAALFYDB6PB36%2FH4S8OAH5fB4PHjzA%2FPw8%2FH4%2FSkpKACAB4CPW6%2FXeqKysrOI4rpjnedjtdmSzWUSjURgMBgiCAEIIrFYrHA4HxsfHsbi4iNbWVtjt9nWILMsYGhpCeXk5ampqYDQaC3AyPDxcSy5evPg2IaTL6XTO%2B3y%2BNkIIAwCKoiCRSEBVVTQ1Ne3Yo0wmg%2BHhYXAcB5%2FPB4PBUJBoMpkclGW5lFJ6mVBKIYpiMYDLHMedCgQCnCAI%2FoL1wsICEokEHA4H6uvr1ydQ13WMjY1hamoKPp8PgiBshE%2Fev38%2FoyjKLwA%2BlyTp%2BabbWxTFOgDfCIKAQCAQ4DiutNCjdDqNp0%2BfIhAIAABGRkZQWVkJl8u1Xj5N01Zjsdjw3NwcBfCxJEl%2FFmL%2F6z0SRZEAeJ8QIvp8vsWqqqqWgpbL5RCPxwEAfr9%2F%2FawAwPT0dDgejxfput4D4FtJkjYF3vGFFUWxHMCXRqPxcDAYtBYXF1dtZ5fNZmcikcijbDY7DuBTSZLmt7Pb9c8gimIbIeQrm82Wqaura2EYxggAlFI1Ho8PTk9PmymlnZIkhV4WZ0%2B%2FIFEUOQCdDMO8V19fn2NZ1hCLxaimaTcAdEuSpO4WY1%2F%2FOlEUnQC%2BBkABfCJJ0qO9%2Bv4NmO9xnZob3WcAAAAASUVORK5CYII%3D%29%3B%0Awidth%3A%2036px%3B%0Aheight%3A%2036px%3B%0A%7D%0A%2Eleaflet%2Dretina%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAbrwAAG68BXhqRHAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAArPSURBVGiB3Zp7TFvXHce%2F916%2FeBhCDInJwDjGBhvjQHi5SclaKRL5Z1Wl%2FrEq%2FWNr11TJmkpMw900pLVrplJ1cadFarp0zdZmmpZpf3SqNrUKfSnKgwI2sQPGBmNjAsUOxCW8bGzfe8%2F%2BSEAkMfa1A5m075%2F2%2Bf3O%2BZ7X595zLkUIwf%2BT6EdRSWdnp7izs1P8KOqitnqE3n%2F%2F%2FQMajeYZAPD7%2FR8fPXr00lbWt2WGTp48qdRoNC%2Fs2bNHXVhYyALA%2FPy86Pr16wG%2F3%2F%2Fhq6%2B%2BGtqKejfdUGdnJ6XT6Q4bDIZWjUaTNLnf76fcbvdlr9d7vqura1MbsKmGTp8%2BXadWqw%2Fv3bu3UCQS8anKsixLX7t2bT4QCJw%2Ffvy4c7PasCmGTpw4Ia%2BqqnrRZDIZSkpK2ExiZ2dnRYODg%2B7R0dE%2Fv%2Fbaa4sP25aHNnT27Nkf6HS6QwaD4aF2TLfbzXu93gtHjhz5z8PkydrQqVOnKtVq9Y%2Fq6uqUubm5GY3KRopEIiKn0xkKBAJ%2FbW9v92WTI2NDnZ2dYoPB8ILRaGwoKyvjsqk0naamphiXyzXgdrs%2F7OrqSmQSm5GhM2fOHNBoNM%2FU1dVJKYoSFEgIEcVisWYAkEql%2FRRFCRpNQgjldDpjfr%2F%2F42PHjglmlyBDJ0%2BeVO7evfsndXV1FatMEaJEIqGOx%2BMHCCFyAKAoalEikVwSi8UBoTnm5%2BdFTqdzYnx8%2FC9C2JXS0CpT9Hr9gcrKypTb8HrxPJ%2B%2FsrJygOf53cn%2Bp2l6XCaTXaJpekloTp%2FPR3s8nkvp2LWhoXfffbderVYfbmhoKEjHlPVtjcVidSzLNhFCUj67URSVEIlENqlU6gQgKD%2FLsvTAwMBCIBA4%2F8orrziS5r3f0IkTJ%2BQ6ne6IyWQy7NixQ%2FCCZFm2NB6PP8Hz%2FHahMQBA0%2FR3EonkokgkCgqNmZmZEQ8ODrq9Xu%2FZ%2B9l1j6EPPvjgKZ1Od6impoYSmpzneVksFtvHcZxBaEwyMQzjlkqlPTRNrwiNGR4eJl6v98JLL73079XfKEIITp06VVlRUfHj%2Bvr6nZkwJR6P6xOJxH5CiCxTA8lEUdSKWCy%2BKpFIPEJjIpGIyOFw3JyYmDjX3t7uo86dO3fUaDQ2lJeXCzbCcdz2WCz2BM%2Fzpdk1PbVomg5KpdKLDMN8JzRmcnJS5HK5Bhi9Xv9RcXHx7V27dqUd6rtMMcfj8YOEkIKHa3bKeuQsy9bwPC9mGCZEUVTaTWNsbKzQbrc%2FRXV0dBAAMYVCcfnpp5%2BeKC4uTmrsfqY8KqVj161bt2SffPJJRTgcbgUgZVpbW3sIIQei0Wij0%2BksmZubW9DpdEsUdWdf4Hk%2BPxqNHmRZtgWA9NFZWZOU4zgdy7LFd0crDgCEEHz66aelX3zxxfcjkUg9gAmapg8zV65c8fX09PwpHo%2FzhJC22dnZ2oGBARQUFCwVFBTUxOPxQ4QQxf%2FAyD0ihBSxLFtDCCFerzdy%2Fvz5PcFg8CAhRAqgSy6XP%2Ffmm2%2BO3LNtd3R0VFEU9R6AgyKRiNfr9fS%2BffsgFj%2BS8420SiQS6Onpgcfj4VmWpQF8SQh5%2BZ133hldLSNaH%2FDss8%2BGGYYJ3Lhxg9jtdnpoaAiTk5NoampCdXX1IzewXiMjI7DZbJifn4dMJqPNZjNRqVQBjuPC68utjhA1MDDwPIDfASgG7vSGw%2BHA2NgYAEClUmH%2F%2Fv0oKip6pEbm5uZw9epV3LhxAwCg1WpRX1%2B%2FftbcAvCLhoaGjwAQyuFwGDmOOwOgNVnCcDiMvr4%2BzM3NQSaTwWg0orm5GTS9tUd6PM%2Bjv78fLpcLKysrKCoqQktLCxSKDZfzZYZhjjFarfYfKpWqmabppAslNzcXWq0WMpkMwWAQU1NTCAQCyM%2FPx7Zt27bEzMTEBD7%2F%2FHP4fD5QFIWGhgaYzWbk5uZuGMNxXPHXX39tYkwm07nh4eGZ3Nxcz%2Fbt27%2BXrDBFUVAoFNBoNIhEIggGg%2FD5fLh9%2BzaUSuWmbRqRSAQXL15EX18flpeXoVKp8OSTT0KpVGIVI8nk8%2Fn6uru7xYuLi3WrHDr07bffmvx%2Bf295eTktkUiSwlMsFkOlUqGkpAQzMzMIBoPwer0AAKVS%2BVBmHA4HvvrqK4RCIeTl5aG1tRU1NTUpO2t5eXn6s88%2BGx4fHzcDmKVp%2BjBFCMEbb7whW1xc%2FBWAXwJgKysrbS0tLY9TFCXaKBnP8xgaGoLb7QbHcSgtLcW%2BffsyNhYKhdDT04NgMAiGYWAwGFBbW5tyjRJC2L6%2Bvis%2Bn68Jd3bqt%2BVy%2BVuvv%2F76yoYcysvLi5nNZmm6Bi4sLMBmsyEUCkEsFkOv1%2BOxxx5LOw0TiQS%2B%2BeYbeDweJBIJKJVKNDU1oaAg9SNiKBRCb28vu7y8LEISDt1jqLu7ezuAt0Oh0IsjIyNUPB5HeXk5mpubIZWmfuqZmJiA3W7HysoKCgsLU7LrPqagsbERFRUVKfPHYjH09%2FdjcnISEokE1dXVUCqV%2FwLQ3tbWNvmAoe7u7ucBnMRdDrEsC6%2FXu5bAZDKhqqoq5eJMxy4BTHlAhBCMjo5icHAQqx2s0%2BkgEq2thiUAvwFwqq2tjaUuXLhQA%2BCPAL6fLOHCwgJcLhcWFxeFsADAg%2Byqra0FAAwNDQllygN55HI5jEZjqil5HcBPmerq6r%2Ft2LFjL8MwOclKSaVSlJWVQSKRIBQKwefzIRqNYufOnRsu3GTsmp6eFswUlmVht9ths9mQSCRQVVUFo9EImWzjF2OO4%2BROp1NPdXR0JAAsaLVat0ajeXzDCNyZxx6PBzdv3kROTg727t0LtVqdKgTRaBR2ux0A0NjYiJycpP22pkAggGvXrq11ml6vT7t%2Bp6en%2B10uVykhpIzq6OhoA%2FAegEqxWOxsamrKl8vllakShMNhDA8Pr1VqNpuRn5%2BfstJ0WlpaQm9v71pn1dTUpJ2S0Wh02mazTUajUTMAH4CXKUIILBaLDMAqh%2BiSkpIre%2FbsaWEYZsN5wfM8%2FH4%2FAoEAKIqCwWCAyWRKuWkkEyEEg4ODcLvdIIRArVZDo9Gk5ZDb7b4yNTW1xiEAb1mt1ns5ZLFYqnBntA5SFDVlNBqDu3btak7VoOXlZXg8HoTDYeTn56OlpUUwXEOhEPr6%2BrC0tASFQgG9Xo%2B8vLyUMeFweNDhcEg5jqsC8CWAl61Wa3IOrTP2HIDfA9iZk5PT29TUVJ6Tk7MrXeNGRkYghF0bMCWlkUQiMWe324cWFhZaAcwA%2BLnVav37%2FeU2PAq2WCyFALoAHAMQLSsrsxkMhpSPQ%2BnYJYApSeX3%2By%2BPjY3VANgG4AyATqvVOp%2BsbNrbB4vF0nw3SQPDMKP19fUxhUJhShWTjF0AMmEKAGBxcdFns9mWEolEHYABAMesVmt%2FqhhB1ykWi4UBcBzAbwHICwoKLjc2NtaKxeINX18JIZicnMTY2Bh4%2Fs6xGk3T0Gq1KC8vT7l5cBwXuX79et%2Fs7OzjAKIAfg3gtNVqTXvBltGFl8ViKQXwBwA%2FBPCdVqsd1mg0Sd90V7XKLgAZMwXAPwH8zGq1Cj7Iz%2BqO1WKxZMyudErGFKvV2p1pnqwvjbNhVzKlYko27Xroa%2F1s2LWqdEzJRpv2JUkm7BLKlGy0qZ%2FGCGFXJkzJRlvyNVYydkkkktxMmZKNtuzzsvvZBYADEEEGTMlGW%2F4B4Dp2ARkyJRv9F9vsxWD%2F43R9AAAAAElFTkSuQmCC%29%3B%0Abackground%2Dsize%3A%2026px%2026px%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Awidth%3A%2044px%3B%0Aheight%3A%2044px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%20%2Eleaflet%2Dcontrol%2Dlayers%2Dlist%2C%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Adisplay%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%2Eleaflet%2Dcontrol%2Dlayers%2Dlist%20%7B%0Adisplay%3A%20block%3B%0Aposition%3A%20relative%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%7B%0Apadding%3A%206px%2010px%206px%206px%3B%0Acolor%3A%20%23333%3B%0Abackground%3A%20%23fff%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dselector%20%7B%0Amargin%2Dtop%3A%202px%3B%0Aposition%3A%20relative%3B%0Atop%3A%201px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%20label%20%7B%0Adisplay%3A%20block%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dseparator%20%7B%0Aheight%3A%200%3B%0Aborder%2Dtop%3A%201px%20solid%20%23ddd%3B%0Amargin%3A%205px%20%2D10px%205px%20%2D6px%3B%0A%7D%0A%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dattribution%20%7B%0Abackground%3A%20%23fff%3B%0Abackground%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E7%29%3B%0Amargin%3A%200%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dattribution%2C%0A%2Eleaflet%2Dcontrol%2Dscale%2Dline%20%7B%0Apadding%3A%200%205px%3B%0Acolor%3A%20%23333%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dattribution%20a%20%7B%0Atext%2Ddecoration%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dattribution%20a%3Ahover%20%7B%0Atext%2Ddecoration%3A%20underline%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dattribution%2C%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dscale%20%7B%0Afont%2Dsize%3A%2011px%3B%0A%7D%0A%2Eleaflet%2Dleft%20%2Eleaflet%2Dcontrol%2Dscale%20%7B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dbottom%20%2Eleaflet%2Dcontrol%2Dscale%20%7B%0Amargin%2Dbottom%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dscale%2Dline%20%7B%0Aborder%3A%202px%20solid%20%23777%3B%0Aborder%2Dtop%3A%20none%3B%0Aline%2Dheight%3A%201%2E1%3B%0Apadding%3A%202px%205px%201px%3B%0Afont%2Dsize%3A%2011px%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Aoverflow%3A%20hidden%3B%0A%2Dmoz%2Dbox%2Dsizing%3A%20content%2Dbox%3B%0Abox%2Dsizing%3A%20content%2Dbox%3B%0Abackground%3A%20%23fff%3B%0Abackground%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E5%29%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dscale%2Dline%3Anot%28%3Afirst%2Dchild%29%20%7B%0Aborder%2Dtop%3A%202px%20solid%20%23777%3B%0Aborder%2Dbottom%3A%20none%3B%0Amargin%2Dtop%3A%20%2D2px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dscale%2Dline%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%20%7B%0Aborder%2Dbottom%3A%202px%20solid%20%23777%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dattribution%2C%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2C%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20%7B%0Abox%2Dshadow%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2C%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20%7B%0Aborder%3A%202px%20solid%20rgba%280%2C0%2C0%2C0%2E2%29%3B%0Abackground%2Dclip%3A%20padding%2Dbox%3B%0A%7D%0A%0A%2Eleaflet%2Dpopup%20%7B%0Aposition%3A%20absolute%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%20%7B%0Apadding%3A%201px%3B%0Atext%2Dalign%3A%20left%3B%0Aborder%2Dradius%3A%2012px%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dcontent%20%7B%0Amargin%3A%2013px%2019px%3B%0Aline%2Dheight%3A%201%2E4%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dcontent%20p%20%7B%0Amargin%3A%2018px%200%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dtip%2Dcontainer%20%7B%0Amargin%3A%200%20auto%3B%0Awidth%3A%2040px%3B%0Aheight%3A%2020px%3B%0Aposition%3A%20relative%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dtip%20%7B%0Awidth%3A%2017px%3B%0Aheight%3A%2017px%3B%0Apadding%3A%201px%3B%0Amargin%3A%20%2D10px%20auto%200%3B%0A%2Dwebkit%2Dtransform%3A%20rotate%2845deg%29%3B%0A%2Dmoz%2Dtransform%3A%20rotate%2845deg%29%3B%0A%2Dms%2Dtransform%3A%20rotate%2845deg%29%3B%0A%2Do%2Dtransform%3A%20rotate%2845deg%29%3B%0Atransform%3A%20rotate%2845deg%29%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%2C%0A%2Eleaflet%2Dpopup%2Dtip%20%7B%0Abackground%3A%20white%3B%0Abox%2Dshadow%3A%200%203px%2014px%20rgba%280%2C0%2C0%2C0%2E4%29%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dpopup%2Dclose%2Dbutton%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aright%3A%200%3B%0Apadding%3A%204px%204px%200%200%3B%0Atext%2Dalign%3A%20center%3B%0Awidth%3A%2018px%3B%0Aheight%3A%2014px%3B%0Afont%3A%2016px%2F14px%20Tahoma%2C%20Verdana%2C%20sans%2Dserif%3B%0Acolor%3A%20%23c3c3c3%3B%0Atext%2Ddecoration%3A%20none%3B%0Afont%2Dweight%3A%20bold%3B%0Abackground%3A%20transparent%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dpopup%2Dclose%2Dbutton%3Ahover%20%7B%0Acolor%3A%20%23999%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dscrolled%20%7B%0Aoverflow%3A%20auto%3B%0Aborder%2Dbottom%3A%201px%20solid%20%23ddd%3B%0Aborder%2Dtop%3A%201px%20solid%20%23ddd%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%20%7B%0Azoom%3A%201%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%20%7B%0Awidth%3A%2024px%3B%0Amargin%3A%200%20auto%3B%0A%2Dms%2Dfilter%3A%20%22progid%3ADXImageTransform%2EMicrosoft%2EMatrix%28M11%3D0%2E70710678%2C%20M12%3D0%2E70710678%2C%20M21%3D%2D0%2E70710678%2C%20M22%3D0%2E70710678%29%22%3B%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2EMatrix%28M11%3D0%2E70710678%2C%20M12%3D0%2E70710678%2C%20M21%3D%2D0%2E70710678%2C%20M22%3D0%2E70710678%29%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%2Dcontainer%20%7B%0Amargin%2Dtop%3A%20%2D1px%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dcontrol%2Dzoom%2C%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dcontrol%2Dlayers%2C%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%2C%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%20%7B%0Aborder%3A%201px%20solid%20%23999%3B%0A%7D%0A%0A%2Eleaflet%2Ddiv%2Dicon%20%7B%0Abackground%3A%20%23fff%3B%0Aborder%3A%201px%20solid%20%23666%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoKIExlYWZsZXQsIGEgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBtb2JpbGUtZnJpZW5kbHkgaW50ZXJhY3RpdmUgbWFwcy4gaHR0cDovL2xlYWZsZXRqcy5jb20KIChjKSAyMDEwLTIwMTUsIFZsYWRpbWlyIEFnYWZvbmtpbgogKGMpIDIwMTAtMjAxMSwgQ2xvdWRNYWRlCiovCiFmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5MLG89e307by52ZXJzaW9uPSIwLjcuNyIsIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9bzoiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUobyksby5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuTD1uLHRoaXN9LHQuTD1vLG8uVXRpbD17ZXh0ZW5kOmZ1bmN0aW9uKHQpe3ZhciBlLGksbixvLHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2ZvcihpPTAsbj1zLmxlbmd0aDtuPmk7aSsrKXtvPXNbaV18fHt9O2ZvcihlIGluIG8pby5oYXNPd25Qcm9wZXJ0eShlKSYmKHRbZV09b1tlXSl9cmV0dXJuIHR9LGJpbmQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOm51bGw7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxpfHxhcmd1bWVudHMpfX0sc3RhbXA6ZnVuY3Rpb24oKXt2YXIgdD0wLGU9Il9sZWFmbGV0X2lkIjtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIGlbZV09aVtlXXx8Kyt0LGlbZV19fSgpLGludm9rZUVhY2g6ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtvPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTtmb3IobiBpbiB0KWUuYXBwbHkoaSxbbix0W25dXS5jb25jYXQobykpO3JldHVybiEwfXJldHVybiExfSxsaW1pdEV4ZWNCeUludGVydmFsOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO3JldHVybiBmdW5jdGlvbiBzKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuP3ZvaWQobz0hMCk6KG49ITAsc2V0VGltZW91dChmdW5jdGlvbigpe249ITEsbyYmKHMuYXBwbHkoaSxhKSxvPSExKX0sZSksdm9pZCB0LmFwcGx5KGksYSkpfX0sZmFsc2VGbjpmdW5jdGlvbigpe3JldHVybiExfSxmb3JtYXROdW06ZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLnBvdygxMCxlfHw1KTtyZXR1cm4gTWF0aC5yb3VuZCh0KmkpL2l9LHRyaW06ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sc3BsaXRXb3JkczpmdW5jdGlvbih0KXtyZXR1cm4gby5VdGlsLnRyaW0odCkuc3BsaXQoL1xzKy8pfSxzZXRPcHRpb25zOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQub3B0aW9ucz1vLmV4dGVuZCh7fSx0Lm9wdGlvbnMsZSksdC5vcHRpb25zfSxnZXRQYXJhbVN0cmluZzpmdW5jdGlvbih0LGUsaSl7dmFyIG49W107Zm9yKHZhciBvIGluIHQpbi5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChpP28udG9VcHBlckNhc2UoKTpvKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHRbb10pKTtyZXR1cm4oZSYmLTEhPT1lLmluZGV4T2YoIj8iKT8iJiI6Ij8iKStuLmpvaW4oIiYiKX0sdGVtcGxhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5yZXBsYWNlKC9ceyAqKFtcd19dKykgKlx9L2csZnVuY3Rpb24odCxuKXt2YXIgbz1lW25dO2lmKG89PT1pKXRocm93IG5ldyBFcnJvcigiTm8gdmFsdWUgcHJvdmlkZWQgZm9yIHZhcmlhYmxlICIrdCk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG8mJihvPW8oZSkpLG99KX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSxlbXB0eUltYWdlVXJsOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHM9In0sZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZhciBpLG4sbz1bIndlYmtpdCIsIm1veiIsIm8iLCJtcyJdO2ZvcihpPTA7aTxvLmxlbmd0aCYmIW47aSsrKW49dFtvW2ldK2VdO3JldHVybiBufWZ1bmN0aW9uIGkoZSl7dmFyIGk9K25ldyBEYXRlLG89TWF0aC5tYXgoMCwxNi0oaS1uKSk7cmV0dXJuIG49aStvLHQuc2V0VGltZW91dChlLG8pfXZhciBuPTAscz10LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8ZSgiUmVxdWVzdEFuaW1hdGlvbkZyYW1lIil8fGksYT10LmNhbmNlbEFuaW1hdGlvbkZyYW1lfHxlKCJDYW5jZWxBbmltYXRpb25GcmFtZSIpfHxlKCJDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKXx8ZnVuY3Rpb24oZSl7dC5jbGVhclRpbWVvdXQoZSl9O28uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lPWZ1bmN0aW9uKGUsbixhLHIpe3JldHVybiBlPW8uYmluZChlLG4pLGEmJnM9PT1pP3ZvaWQgZSgpOnMuY2FsbCh0LGUscil9LG8uVXRpbC5jYW5jZWxBbmltRnJhbWU9ZnVuY3Rpb24oZSl7ZSYmYS5jYWxsKHQsZSl9fSgpLG8uZXh0ZW5kPW8uVXRpbC5leHRlbmQsby5iaW5kPW8uVXRpbC5iaW5kLG8uc3RhbXA9by5VdGlsLnN0YW1wLG8uc2V0T3B0aW9ucz1vLlV0aWwuc2V0T3B0aW9ucyxvLkNsYXNzPWZ1bmN0aW9uKCl7fSxvLkNsYXNzLmV4dGVuZD1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe3RoaXMuaW5pdGlhbGl6ZSYmdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9pbml0SG9va3MmJnRoaXMuY2FsbEluaXRIb29rcygpfSxpPWZ1bmN0aW9uKCl7fTtpLnByb3RvdHlwZT10aGlzLnByb3RvdHlwZTt2YXIgbj1uZXcgaTtuLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGU9bjtmb3IodmFyIHMgaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KHMpJiYicHJvdG90eXBlIiE9PXMmJihlW3NdPXRoaXNbc10pO3Quc3RhdGljcyYmKG8uZXh0ZW5kKGUsdC5zdGF0aWNzKSxkZWxldGUgdC5zdGF0aWNzKSx0LmluY2x1ZGVzJiYoby5VdGlsLmV4dGVuZC5hcHBseShudWxsLFtuXS5jb25jYXQodC5pbmNsdWRlcykpLGRlbGV0ZSB0LmluY2x1ZGVzKSx0Lm9wdGlvbnMmJm4ub3B0aW9ucyYmKHQub3B0aW9ucz1vLmV4dGVuZCh7fSxuLm9wdGlvbnMsdC5vcHRpb25zKSksby5leHRlbmQobix0KSxuLl9pbml0SG9va3M9W107dmFyIGE9dGhpcztyZXR1cm4gZS5fX3N1cGVyX189YS5wcm90b3R5cGUsbi5jYWxsSW5pdEhvb2tzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2luaXRIb29rc0NhbGxlZCl7YS5wcm90b3R5cGUuY2FsbEluaXRIb29rcyYmYS5wcm90b3R5cGUuY2FsbEluaXRIb29rcy5jYWxsKHRoaXMpLHRoaXMuX2luaXRIb29rc0NhbGxlZD0hMDtmb3IodmFyIHQ9MCxlPW4uX2luaXRIb29rcy5sZW5ndGg7ZT50O3QrKyluLl9pbml0SG9va3NbdF0uY2FsbCh0aGlzKX19LGV9LG8uQ2xhc3MuaW5jbHVkZT1mdW5jdGlvbih0KXtvLmV4dGVuZCh0aGlzLnByb3RvdHlwZSx0KX0sby5DbGFzcy5tZXJnZU9wdGlvbnM9ZnVuY3Rpb24odCl7by5leHRlbmQodGhpcy5wcm90b3R5cGUub3B0aW9ucyx0KX0sby5DbGFzcy5hZGRJbml0SG9vaz1mdW5jdGlvbih0KXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7dGhpc1t0XS5hcHBseSh0aGlzLGUpfTt0aGlzLnByb3RvdHlwZS5faW5pdEhvb2tzPXRoaXMucHJvdG90eXBlLl9pbml0SG9va3N8fFtdLHRoaXMucHJvdG90eXBlLl9pbml0SG9va3MucHVzaChpKX07dmFyIHM9Il9sZWFmbGV0X2V2ZW50cyI7by5NaXhpbj17fSxvLk1peGluLkV2ZW50cz17YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbih0LGUsaSl7aWYoby5VdGlsLmludm9rZUVhY2godCx0aGlzLmFkZEV2ZW50TGlzdGVuZXIsdGhpcyxlLGkpKXJldHVybiB0aGlzO3ZhciBuLGEscixoLGwsdSxjLGQ9dGhpc1tzXT10aGlzW3NdfHx7fSxwPWkmJmkhPT10aGlzJiZvLnN0YW1wKGkpO2Zvcih0PW8uVXRpbC5zcGxpdFdvcmRzKHQpLG49MCxhPXQubGVuZ3RoO2E+bjtuKyspcj17YWN0aW9uOmUsY29udGV4dDppfHx0aGlzfSxoPXRbbl0scD8obD1oKyJfaWR4Iix1PWwrIl9sZW4iLGM9ZFtsXT1kW2xdfHx7fSxjW3BdfHwoY1twXT1bXSxkW3VdPShkW3VdfHwwKSsxKSxjW3BdLnB1c2gocikpOihkW2hdPWRbaF18fFtdLGRbaF0ucHVzaChyKSk7cmV0dXJuIHRoaXN9LGhhc0V2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXNbc107cmV0dXJuISFlJiYodCBpbiBlJiZlW3RdLmxlbmd0aD4wfHx0KyJfaWR4ImluIGUmJmVbdCsiX2lkeF9sZW4iXT4wKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbih0LGUsaSl7aWYoIXRoaXNbc10pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuY2xlYXJBbGxFdmVudExpc3RlbmVycygpO2lmKG8uVXRpbC5pbnZva2VFYWNoKHQsdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyLHRoaXMsZSxpKSlyZXR1cm4gdGhpczt2YXIgbixhLHIsaCxsLHUsYyxkLHAsXz10aGlzW3NdLG09aSYmaSE9PXRoaXMmJm8uc3RhbXAoaSk7Zm9yKHQ9by5VdGlsLnNwbGl0V29yZHModCksbj0wLGE9dC5sZW5ndGg7YT5uO24rKylpZihyPXRbbl0sdT1yKyJfaWR4IixjPXUrIl9sZW4iLGQ9X1t1XSxlKXtpZihoPW0mJmQ/ZFttXTpfW3JdKXtmb3IobD1oLmxlbmd0aC0xO2w+PTA7bC0tKWhbbF0uYWN0aW9uIT09ZXx8aSYmaFtsXS5jb250ZXh0IT09aXx8KHA9aC5zcGxpY2UobCwxKSxwWzBdLmFjdGlvbj1vLlV0aWwuZmFsc2VGbik7aSYmZCYmMD09PWgubGVuZ3RoJiYoZGVsZXRlIGRbbV0sX1tjXS0tKX19ZWxzZSBkZWxldGUgX1tyXSxkZWxldGUgX1t1XSxkZWxldGUgX1tjXTtyZXR1cm4gdGhpc30sY2xlYXJBbGxFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe3JldHVybiBkZWxldGUgdGhpc1tzXSx0aGlzfSxmaXJlRXZlbnQ6ZnVuY3Rpb24odCxlKXtpZighdGhpcy5oYXNFdmVudExpc3RlbmVycyh0KSlyZXR1cm4gdGhpczt2YXIgaSxuLGEscixoLGw9by5VdGlsLmV4dGVuZCh7fSxlLHt0eXBlOnQsdGFyZ2V0OnRoaXN9KSx1PXRoaXNbc107aWYodVt0XSlmb3IoaT11W3RdLnNsaWNlKCksbj0wLGE9aS5sZW5ndGg7YT5uO24rKylpW25dLmFjdGlvbi5jYWxsKGlbbl0uY29udGV4dCxsKTtyPXVbdCsiX2lkeCJdO2ZvcihoIGluIHIpaWYoaT1yW2hdLnNsaWNlKCkpZm9yKG49MCxhPWkubGVuZ3RoO2E+bjtuKyspaVtuXS5hY3Rpb24uY2FsbChpW25dLmNvbnRleHQsbCk7cmV0dXJuIHRoaXN9LGFkZE9uZVRpbWVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKHQsZSxpKXtpZihvLlV0aWwuaW52b2tlRWFjaCh0LHRoaXMuYWRkT25lVGltZUV2ZW50TGlzdGVuZXIsdGhpcyxlLGkpKXJldHVybiB0aGlzO3ZhciBuPW8uYmluZChmdW5jdGlvbigpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUsaSkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4saSl9LHRoaXMpO3JldHVybiB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodCxlLGkpLmFkZEV2ZW50TGlzdGVuZXIodCxuLGkpfX0sby5NaXhpbi5FdmVudHMub249by5NaXhpbi5FdmVudHMuYWRkRXZlbnRMaXN0ZW5lcixvLk1peGluLkV2ZW50cy5vZmY9by5NaXhpbi5FdmVudHMucmVtb3ZlRXZlbnRMaXN0ZW5lcixvLk1peGluLkV2ZW50cy5vbmNlPW8uTWl4aW4uRXZlbnRzLmFkZE9uZVRpbWVFdmVudExpc3RlbmVyLG8uTWl4aW4uRXZlbnRzLmZpcmU9by5NaXhpbi5FdmVudHMuZmlyZUV2ZW50LGZ1bmN0aW9uKCl7dmFyIG49IkFjdGl2ZVhPYmplY3QiaW4gdCxzPW4mJiFlLmFkZEV2ZW50TGlzdGVuZXIsYT1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkscj0tMSE9PWEuaW5kZXhPZigid2Via2l0IiksaD0tMSE9PWEuaW5kZXhPZigiY2hyb21lIiksbD0tMSE9PWEuaW5kZXhPZigicGhhbnRvbSIpLHU9LTEhPT1hLmluZGV4T2YoImFuZHJvaWQiKSxjPS0xIT09YS5zZWFyY2goImFuZHJvaWQgWzIzXSIpLGQ9LTEhPT1hLmluZGV4T2YoImdlY2tvIikscD10eXBlb2Ygb3JpZW50YXRpb24hPWkrIiIsXz0hdC5Qb2ludGVyRXZlbnQmJnQuTVNQb2ludGVyRXZlbnQsbT10LlBvaW50ZXJFdmVudCYmdC5uYXZpZ2F0b3IucG9pbnRlckVuYWJsZWQmJnQubmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzfHxfLGY9ImRldmljZVBpeGVsUmF0aW8iaW4gdCYmdC5kZXZpY2VQaXhlbFJhdGlvPjF8fCJtYXRjaE1lZGlhImluIHQmJnQubWF0Y2hNZWRpYSgiKG1pbi1yZXNvbHV0aW9uOjE0NGRwaSkiKSYmdC5tYXRjaE1lZGlhKCIobWluLXJlc29sdXRpb246MTQ0ZHBpKSIpLm1hdGNoZXMsZz1lLmRvY3VtZW50RWxlbWVudCx2PW4mJiJ0cmFuc2l0aW9uImluIGcuc3R5bGUseT0iV2ViS2l0Q1NTTWF0cml4ImluIHQmJiJtMTEiaW4gbmV3IHQuV2ViS2l0Q1NTTWF0cml4JiYhYyxQPSJNb3pQZXJzcGVjdGl2ZSJpbiBnLnN0eWxlLEw9Ik9UcmFuc2l0aW9uImluIGcuc3R5bGUseD0hdC5MX0RJU0FCTEVfM0QmJih2fHx5fHxQfHxMKSYmIWwsdz0hdC5MX05PX1RPVUNIJiYhbCYmKG18fCJvbnRvdWNoc3RhcnQiaW4gdHx8dC5Eb2N1bWVudFRvdWNoJiZlIGluc3RhbmNlb2YgdC5Eb2N1bWVudFRvdWNoKTtvLkJyb3dzZXI9e2llOm4saWVsdDk6cyx3ZWJraXQ6cixnZWNrbzpkJiYhciYmIXQub3BlcmEmJiFuLGFuZHJvaWQ6dSxhbmRyb2lkMjM6YyxjaHJvbWU6aCxpZTNkOnYsd2Via2l0M2Q6eSxnZWNrbzNkOlAsb3BlcmEzZDpMLGFueTNkOngsbW9iaWxlOnAsbW9iaWxlV2Via2l0OnAmJnIsbW9iaWxlV2Via2l0M2Q6cCYmeSxtb2JpbGVPcGVyYTpwJiZ0Lm9wZXJhLHRvdWNoOncsbXNQb2ludGVyOl8scG9pbnRlcjptLHJldGluYTpmfX0oKSxvLlBvaW50PWZ1bmN0aW9uKHQsZSxpKXt0aGlzLng9aT9NYXRoLnJvdW5kKHQpOnQsdGhpcy55PWk/TWF0aC5yb3VuZChlKTplfSxvLlBvaW50LnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8uUG9pbnQodGhpcy54LHRoaXMueSl9LGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQoby5wb2ludCh0KSl9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LHN1YnRyYWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1YnRyYWN0KG8ucG9pbnQodCkpfSxfc3VidHJhY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LGRpdmlkZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2RpdmlkZUJ5KHQpfSxfZGl2aWRlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0aXBseUJ5KHQpfSxfbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfSxyb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCl9LF9yb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc30sZmxvb3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9mbG9vcigpfSxfZmxvb3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9LGRpc3RhbmNlVG86ZnVuY3Rpb24odCl7dD1vLnBvaW50KHQpO3ZhciBlPXQueC10aGlzLngsaT10LnktdGhpcy55O3JldHVybiBNYXRoLnNxcnQoZSplK2kqaSl9LGVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4gdD1vLnBvaW50KHQpLHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdD1vLnBvaW50KHQpLE1hdGguYWJzKHQueCk8PU1hdGguYWJzKHRoaXMueCkmJk1hdGguYWJzKHQueSk8PU1hdGguYWJzKHRoaXMueSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIlBvaW50KCIrby5VdGlsLmZvcm1hdE51bSh0aGlzLngpKyIsICIrby5VdGlsLmZvcm1hdE51bSh0aGlzLnkpKyIpIn19LG8ucG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0IGluc3RhbmNlb2Ygby5Qb2ludD90Om8uVXRpbC5pc0FycmF5KHQpP25ldyBvLlBvaW50KHRbMF0sdFsxXSk6dD09PWl8fG51bGw9PT10P3Q6bmV3IG8uUG9pbnQodCxlLG4pfSxvLkJvdW5kcz1mdW5jdGlvbih0LGUpe2lmKHQpZm9yKHZhciBpPWU/W3QsZV06dCxuPTAsbz1pLmxlbmd0aDtvPm47bisrKXRoaXMuZXh0ZW5kKGlbbl0pfSxvLkJvdW5kcy5wcm90b3R5cGU9e2V4dGVuZDpmdW5jdGlvbih0KXtyZXR1cm4gdD1vLnBvaW50KHQpLHRoaXMubWlufHx0aGlzLm1heD8odGhpcy5taW4ueD1NYXRoLm1pbih0LngsdGhpcy5taW4ueCksdGhpcy5tYXgueD1NYXRoLm1heCh0LngsdGhpcy5tYXgueCksdGhpcy5taW4ueT1NYXRoLm1pbih0LnksdGhpcy5taW4ueSksdGhpcy5tYXgueT1NYXRoLm1heCh0LnksdGhpcy5tYXgueSkpOih0aGlzLm1pbj10LmNsb25lKCksdGhpcy5tYXg9dC5jbG9uZSgpKSx0aGlzfSxnZXRDZW50ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLlBvaW50KCh0aGlzLm1pbi54K3RoaXMubWF4LngpLzIsKHRoaXMubWluLnkrdGhpcy5tYXgueSkvMix0KX0sZ2V0Qm90dG9tTGVmdDpmdW5jdGlvbigpe3JldHVybiBuZXcgby5Qb2ludCh0aGlzLm1pbi54LHRoaXMubWF4LnkpfSxnZXRUb3BSaWdodDpmdW5jdGlvbigpe3JldHVybiBuZXcgby5Qb2ludCh0aGlzLm1heC54LHRoaXMubWluLnkpfSxnZXRTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4LnN1YnRyYWN0KHRoaXMubWluKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7dmFyIGUsaTtyZXR1cm4gdD0ibnVtYmVyIj09dHlwZW9mIHRbMF18fHQgaW5zdGFuY2VvZiBvLlBvaW50P28ucG9pbnQodCk6by5ib3VuZHModCksdCBpbnN0YW5jZW9mIG8uQm91bmRzPyhlPXQubWluLGk9dC5tYXgpOmU9aT10LGUueD49dGhpcy5taW4ueCYmaS54PD10aGlzLm1heC54JiZlLnk+PXRoaXMubWluLnkmJmkueTw9dGhpcy5tYXgueX0saW50ZXJzZWN0czpmdW5jdGlvbih0KXt0PW8uYm91bmRzKHQpO3ZhciBlPXRoaXMubWluLGk9dGhpcy5tYXgsbj10Lm1pbixzPXQubWF4LGE9cy54Pj1lLngmJm4ueDw9aS54LHI9cy55Pj1lLnkmJm4ueTw9aS55O3JldHVybiBhJiZyfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5taW58fCF0aGlzLm1heCl9fSxvLmJvdW5kcz1mdW5jdGlvbih0LGUpe3JldHVybiF0fHx0IGluc3RhbmNlb2Ygby5Cb3VuZHM/dDpuZXcgby5Cb3VuZHModCxlKX0sby5UcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0LGUsaSxuKXt0aGlzLl9hPXQsdGhpcy5fYj1lLHRoaXMuX2M9aSx0aGlzLl9kPW59LG8uVHJhbnNmb3JtYXRpb24ucHJvdG90eXBlPXt0cmFuc2Zvcm06ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtKHQuY2xvbmUoKSxlKX0sX3RyYW5zZm9ybTpmdW5jdGlvbih0LGUpe3JldHVybiBlPWV8fDEsdC54PWUqKHRoaXMuX2EqdC54K3RoaXMuX2IpLHQueT1lKih0aGlzLl9jKnQueSt0aGlzLl9kKSx0fSx1bnRyYW5zZm9ybTpmdW5jdGlvbih0LGUpe3JldHVybiBlPWV8fDEsbmV3IG8uUG9pbnQoKHQueC9lLXRoaXMuX2IpL3RoaXMuX2EsKHQueS9lLXRoaXMuX2QpL3RoaXMuX2MpfX0sby5Eb21VdGlsPXtnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2UuZ2V0RWxlbWVudEJ5SWQodCk6dH0sZ2V0U3R5bGU6ZnVuY3Rpb24odCxpKXt2YXIgbj10LnN0eWxlW2ldO2lmKCFuJiZ0LmN1cnJlbnRTdHlsZSYmKG49dC5jdXJyZW50U3R5bGVbaV0pLCghbnx8ImF1dG8iPT09bikmJmUuZGVmYXVsdFZpZXcpe3ZhciBvPWUuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpO249bz9vW2ldOm51bGx9cmV0dXJuImF1dG8iPT09bj9udWxsOm59LGdldFZpZXdwb3J0T2Zmc2V0OmZ1bmN0aW9uKHQpe3ZhciBpLG49MCxzPTAsYT10LHI9ZS5ib2R5LGg9ZS5kb2N1bWVudEVsZW1lbnQ7ZG97aWYobis9YS5vZmZzZXRUb3B8fDAscys9YS5vZmZzZXRMZWZ0fHwwLG4rPXBhcnNlSW50KG8uRG9tVXRpbC5nZXRTdHlsZShhLCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCxzKz1wYXJzZUludChvLkRvbVV0aWwuZ2V0U3R5bGUoYSwiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwLGk9by5Eb21VdGlsLmdldFN0eWxlKGEsInBvc2l0aW9uIiksYS5vZmZzZXRQYXJlbnQ9PT1yJiYiYWJzb2x1dGUiPT09aSlicmVhaztpZigiZml4ZWQiPT09aSl7bis9ci5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wfHwwLHMrPXIuc2Nyb2xsTGVmdHx8aC5zY3JvbGxMZWZ0fHwwO2JyZWFrfWlmKCJyZWxhdGl2ZSI9PT1pJiYhYS5vZmZzZXRMZWZ0KXt2YXIgbD1vLkRvbVV0aWwuZ2V0U3R5bGUoYSwid2lkdGgiKSx1PW8uRG9tVXRpbC5nZXRTdHlsZShhLCJtYXgtd2lkdGgiKSxjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7KCJub25lIiE9PWx8fCJub25lIiE9PXUpJiYocys9Yy5sZWZ0K2EuY2xpZW50TGVmdCksbis9Yy50b3ArKHIuc2Nyb2xsVG9wfHxoLnNjcm9sbFRvcHx8MCk7YnJlYWt9YT1hLm9mZnNldFBhcmVudH13aGlsZShhKTthPXQ7ZG97aWYoYT09PXIpYnJlYWs7bi09YS5zY3JvbGxUb3B8fDAscy09YS5zY3JvbGxMZWZ0fHwwLGE9YS5wYXJlbnROb2RlfXdoaWxlKGEpO3JldHVybiBuZXcgby5Qb2ludChzLG4pfSxkb2N1bWVudElzTHRyOmZ1bmN0aW9uKCl7cmV0dXJuIG8uRG9tVXRpbC5fZG9jSXNMdHJDYWNoZWR8fChvLkRvbVV0aWwuX2RvY0lzTHRyQ2FjaGVkPSEwLG8uRG9tVXRpbC5fZG9jSXNMdHI9Imx0ciI9PT1vLkRvbVV0aWwuZ2V0U3R5bGUoZS5ib2R5LCJkaXJlY3Rpb24iKSksby5Eb21VdGlsLl9kb2NJc0x0cn0sY3JlYXRlOmZ1bmN0aW9uKHQsaSxuKXt2YXIgbz1lLmNyZWF0ZUVsZW1lbnQodCk7cmV0dXJuIG8uY2xhc3NOYW1lPWksbiYmbi5hcHBlbmRDaGlsZChvKSxvfSxoYXNDbGFzczpmdW5jdGlvbih0LGUpe2lmKHQuY2xhc3NMaXN0IT09aSlyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoZSk7dmFyIG49by5Eb21VdGlsLl9nZXRDbGFzcyh0KTtyZXR1cm4gbi5sZW5ndGg+MCYmbmV3IFJlZ0V4cCgiKF58XFxzKSIrZSsiKFxcc3wkKSIpLnRlc3Qobil9LGFkZENsYXNzOmZ1bmN0aW9uKHQsZSl7aWYodC5jbGFzc0xpc3QhPT1pKWZvcih2YXIgbj1vLlV0aWwuc3BsaXRXb3JkcyhlKSxzPTAsYT1uLmxlbmd0aDthPnM7cysrKXQuY2xhc3NMaXN0LmFkZChuW3NdKTtlbHNlIGlmKCFvLkRvbVV0aWwuaGFzQ2xhc3ModCxlKSl7dmFyIHI9by5Eb21VdGlsLl9nZXRDbGFzcyh0KTtvLkRvbVV0aWwuX3NldENsYXNzKHQsKHI/cisiICI6IiIpK2UpfX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCxlKXt0LmNsYXNzTGlzdCE9PWk/dC5jbGFzc0xpc3QucmVtb3ZlKGUpOm8uRG9tVXRpbC5fc2V0Q2xhc3ModCxvLlV0aWwudHJpbSgoIiAiK28uRG9tVXRpbC5fZ2V0Q2xhc3ModCkrIiAiKS5yZXBsYWNlKCIgIitlKyIgIiwiICIpKSl9LF9zZXRDbGFzczpmdW5jdGlvbih0LGUpe3QuY2xhc3NOYW1lLmJhc2VWYWw9PT1pP3QuY2xhc3NOYW1lPWU6dC5jbGFzc05hbWUuYmFzZVZhbD1lfSxfZ2V0Q2xhc3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NOYW1lLmJhc2VWYWw9PT1pP3QuY2xhc3NOYW1lOnQuY2xhc3NOYW1lLmJhc2VWYWx9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCxlKXtpZigib3BhY2l0eSJpbiB0LnN0eWxlKXQuc3R5bGUub3BhY2l0eT1lO2Vsc2UgaWYoImZpbHRlciJpbiB0LnN0eWxlKXt2YXIgaT0hMSxuPSJEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYSI7dHJ5e2k9dC5maWx0ZXJzLml0ZW0obil9Y2F0Y2gobyl7aWYoMT09PWUpcmV0dXJufWU9TWF0aC5yb3VuZCgxMDAqZSksaT8oaS5FbmFibGVkPTEwMCE9PWUsaS5PcGFjaXR5PWUpOnQuc3R5bGUuZmlsdGVyKz0iIHByb2dpZDoiK24rIihvcGFjaXR5PSIrZSsiKSJ9fSx0ZXN0UHJvcDpmdW5jdGlvbih0KXtmb3IodmFyIGk9ZS5kb2N1bWVudEVsZW1lbnQuc3R5bGUsbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl1pbiBpKXJldHVybiB0W25dO3JldHVybiExfSxnZXRUcmFuc2xhdGVTdHJpbmc6ZnVuY3Rpb24odCl7dmFyIGU9by5Ccm93c2VyLndlYmtpdDNkLGk9InRyYW5zbGF0ZSIrKGU/IjNkIjoiIikrIigiLG49KGU/IiwwIjoiIikrIikiO3JldHVybiBpK3QueCsicHgsIit0LnkrInB4IitufSxnZXRTY2FsZVN0cmluZzpmdW5jdGlvbih0LGUpe3ZhciBpPW8uRG9tVXRpbC5nZXRUcmFuc2xhdGVTdHJpbmcoZS5hZGQoZS5tdWx0aXBseUJ5KC0xKnQpKSksbj0iIHNjYWxlKCIrdCsiKSAiO3JldHVybiBpK259LHNldFBvc2l0aW9uOmZ1bmN0aW9uKHQsZSxpKXt0Ll9sZWFmbGV0X3Bvcz1lLCFpJiZvLkJyb3dzZXIuYW55M2Q/dC5zdHlsZVtvLkRvbVV0aWwuVFJBTlNGT1JNXT1vLkRvbVV0aWwuZ2V0VHJhbnNsYXRlU3RyaW5nKGUpOih0LnN0eWxlLmxlZnQ9ZS54KyJweCIsdC5zdHlsZS50b3A9ZS55KyJweCIpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fbGVhZmxldF9wb3N9fSxvLkRvbVV0aWwuVFJBTlNGT1JNPW8uRG9tVXRpbC50ZXN0UHJvcChbInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk9UcmFuc2Zvcm0iLCJNb3pUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxvLkRvbVV0aWwuVFJBTlNJVElPTj1vLkRvbVV0aWwudGVzdFByb3AoWyJ3ZWJraXRUcmFuc2l0aW9uIiwidHJhbnNpdGlvbiIsIk9UcmFuc2l0aW9uIiwiTW96VHJhbnNpdGlvbiIsIm1zVHJhbnNpdGlvbiJdKSxvLkRvbVV0aWwuVFJBTlNJVElPTl9FTkQ9IndlYmtpdFRyYW5zaXRpb24iPT09by5Eb21VdGlsLlRSQU5TSVRJT058fCJPVHJhbnNpdGlvbiI9PT1vLkRvbVV0aWwuVFJBTlNJVElPTj9vLkRvbVV0aWwuVFJBTlNJVElPTisiRW5kIjoidHJhbnNpdGlvbmVuZCIsZnVuY3Rpb24oKXtpZigib25zZWxlY3RzdGFydCJpbiBlKW8uZXh0ZW5kKG8uRG9tVXRpbCx7ZGlzYWJsZVRleHRTZWxlY3Rpb246ZnVuY3Rpb24oKXtvLkRvbUV2ZW50Lm9uKHQsInNlbGVjdHN0YXJ0IixvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KX0sZW5hYmxlVGV4dFNlbGVjdGlvbjpmdW5jdGlvbigpe28uRG9tRXZlbnQub2ZmKHQsInNlbGVjdHN0YXJ0IixvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KX19KTtlbHNle3ZhciBpPW8uRG9tVXRpbC50ZXN0UHJvcChbInVzZXJTZWxlY3QiLCJXZWJraXRVc2VyU2VsZWN0IiwiT1VzZXJTZWxlY3QiLCJNb3pVc2VyU2VsZWN0IiwibXNVc2VyU2VsZWN0Il0pO28uZXh0ZW5kKG8uRG9tVXRpbCx7ZGlzYWJsZVRleHRTZWxlY3Rpb246ZnVuY3Rpb24oKXtpZihpKXt2YXIgdD1lLmRvY3VtZW50RWxlbWVudC5zdHlsZTt0aGlzLl91c2VyU2VsZWN0PXRbaV0sdFtpXT0ibm9uZSJ9fSxlbmFibGVUZXh0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7aSYmKGUuZG9jdW1lbnRFbGVtZW50LnN0eWxlW2ldPXRoaXMuX3VzZXJTZWxlY3QsZGVsZXRlIHRoaXMuX3VzZXJTZWxlY3QpfX0pfW8uZXh0ZW5kKG8uRG9tVXRpbCx7ZGlzYWJsZUltYWdlRHJhZzpmdW5jdGlvbigpe28uRG9tRXZlbnQub24odCwiZHJhZ3N0YXJ0IixvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KX0sZW5hYmxlSW1hZ2VEcmFnOmZ1bmN0aW9uKCl7by5Eb21FdmVudC5vZmYodCwiZHJhZ3N0YXJ0IixvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KX19KX0oKSxvLkxhdExuZz1mdW5jdGlvbih0LGUsbil7aWYodD1wYXJzZUZsb2F0KHQpLGU9cGFyc2VGbG9hdChlKSxpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIExhdExuZyBvYmplY3Q6ICgiK3QrIiwgIitlKyIpIik7dGhpcy5sYXQ9dCx0aGlzLmxuZz1lLG4hPT1pJiYodGhpcy5hbHQ9cGFyc2VGbG9hdChuKSl9LG8uZXh0ZW5kKG8uTGF0TG5nLHtERUdfVE9fUkFEOk1hdGguUEkvMTgwLFJBRF9UT19ERUc6MTgwL01hdGguUEksTUFYX01BUkdJTjoxZS05fSksby5MYXRMbmcucHJvdG90eXBlPXtlcXVhbHM6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7dD1vLmxhdExuZyh0KTt2YXIgZT1NYXRoLm1heChNYXRoLmFicyh0aGlzLmxhdC10LmxhdCksTWF0aC5hYnModGhpcy5sbmctdC5sbmcpKTtyZXR1cm4gZTw9by5MYXRMbmcuTUFYX01BUkdJTn0sdG9TdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIkxhdExuZygiK28uVXRpbC5mb3JtYXROdW0odGhpcy5sYXQsdCkrIiwgIitvLlV0aWwuZm9ybWF0TnVtKHRoaXMubG5nLHQpKyIpIn0sZGlzdGFuY2VUbzpmdW5jdGlvbih0KXt0PW8ubGF0TG5nKHQpO3ZhciBlPTYzNzgxMzcsaT1vLkxhdExuZy5ERUdfVE9fUkFELG49KHQubGF0LXRoaXMubGF0KSppLHM9KHQubG5nLXRoaXMubG5nKSppLGE9dGhpcy5sYXQqaSxyPXQubGF0KmksaD1NYXRoLnNpbihuLzIpLGw9TWF0aC5zaW4ocy8yKSx1PWgqaCtsKmwqTWF0aC5jb3MoYSkqTWF0aC5jb3Mocik7cmV0dXJuIDIqZSpNYXRoLmF0YW4yKE1hdGguc3FydCh1KSxNYXRoLnNxcnQoMS11KSl9LHdyYXA6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmxuZztyZXR1cm4gdD10fHwtMTgwLGU9ZXx8MTgwLGk9KGkrZSklKGUtdCkrKHQ+aXx8aT09PWU/ZTp0KSxuZXcgby5MYXRMbmcodGhpcy5sYXQsaSl9fSxvLmxhdExuZz1mdW5jdGlvbih0LGUpe3JldHVybiB0IGluc3RhbmNlb2Ygby5MYXRMbmc/dDpvLlV0aWwuaXNBcnJheSh0KT8ibnVtYmVyIj09dHlwZW9mIHRbMF18fCJzdHJpbmciPT10eXBlb2YgdFswXT9uZXcgby5MYXRMbmcodFswXSx0WzFdLHRbMl0pOm51bGw6dD09PWl8fG51bGw9PT10P3Q6Im9iamVjdCI9PXR5cGVvZiB0JiYibGF0ImluIHQ/bmV3IG8uTGF0TG5nKHQubGF0LCJsbmciaW4gdD90LmxuZzp0Lmxvbik6ZT09PWk/bnVsbDpuZXcgby5MYXRMbmcodCxlKX0sby5MYXRMbmdCb3VuZHM9ZnVuY3Rpb24odCxlKXtpZih0KWZvcih2YXIgaT1lP1t0LGVdOnQsbj0wLG89aS5sZW5ndGg7bz5uO24rKyl0aGlzLmV4dGVuZChpW25dKX0sby5MYXRMbmdCb3VuZHMucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIHRoaXM7dmFyIGU9by5sYXRMbmcodCk7cmV0dXJuIHQ9bnVsbCE9PWU/ZTpvLmxhdExuZ0JvdW5kcyh0KSx0IGluc3RhbmNlb2Ygby5MYXRMbmc/dGhpcy5fc291dGhXZXN0fHx0aGlzLl9ub3J0aEVhc3Q/KHRoaXMuX3NvdXRoV2VzdC5sYXQ9TWF0aC5taW4odC5sYXQsdGhpcy5fc291dGhXZXN0LmxhdCksdGhpcy5fc291dGhXZXN0LmxuZz1NYXRoLm1pbih0LmxuZyx0aGlzLl9zb3V0aFdlc3QubG5nKSx0aGlzLl9ub3J0aEVhc3QubGF0PU1hdGgubWF4KHQubGF0LHRoaXMuX25vcnRoRWFzdC5sYXQpLHRoaXMuX25vcnRoRWFzdC5sbmc9TWF0aC5tYXgodC5sbmcsdGhpcy5fbm9ydGhFYXN0LmxuZykpOih0aGlzLl9zb3V0aFdlc3Q9bmV3IG8uTGF0TG5nKHQubGF0LHQubG5nKSx0aGlzLl9ub3J0aEVhc3Q9bmV3IG8uTGF0TG5nKHQubGF0LHQubG5nKSk6dCBpbnN0YW5jZW9mIG8uTGF0TG5nQm91bmRzJiYodGhpcy5leHRlbmQodC5fc291dGhXZXN0KSx0aGlzLmV4dGVuZCh0Ll9ub3J0aEVhc3QpKSx0aGlzfSxwYWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc291dGhXZXN0LGk9dGhpcy5fbm9ydGhFYXN0LG49TWF0aC5hYnMoZS5sYXQtaS5sYXQpKnQscz1NYXRoLmFicyhlLmxuZy1pLmxuZykqdDtyZXR1cm4gbmV3IG8uTGF0TG5nQm91bmRzKG5ldyBvLkxhdExuZyhlLmxhdC1uLGUubG5nLXMpLG5ldyBvLkxhdExuZyhpLmxhdCtuLGkubG5nK3MpKX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvLkxhdExuZygodGhpcy5fc291dGhXZXN0LmxhdCt0aGlzLl9ub3J0aEVhc3QubGF0KS8yLCh0aGlzLl9zb3V0aFdlc3QubG5nK3RoaXMuX25vcnRoRWFzdC5sbmcpLzIpfSxnZXRTb3V0aFdlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291dGhXZXN0fSxnZXROb3J0aEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0fSxnZXROb3J0aFdlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8uTGF0TG5nKHRoaXMuZ2V0Tm9ydGgoKSx0aGlzLmdldFdlc3QoKSl9LGdldFNvdXRoRWFzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgby5MYXRMbmcodGhpcy5nZXRTb3V0aCgpLHRoaXMuZ2V0RWFzdCgpKX0sZ2V0V2VzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3V0aFdlc3QubG5nfSxnZXRTb3V0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3V0aFdlc3QubGF0fSxnZXRFYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vcnRoRWFzdC5sbmd9LGdldE5vcnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vcnRoRWFzdC5sYXR9LGNvbnRhaW5zOmZ1bmN0aW9uKHQpe3Q9Im51bWJlciI9PXR5cGVvZiB0WzBdfHx0IGluc3RhbmNlb2Ygby5MYXRMbmc/by5sYXRMbmcodCk6by5sYXRMbmdCb3VuZHModCk7dmFyIGUsaSxuPXRoaXMuX3NvdXRoV2VzdCxzPXRoaXMuX25vcnRoRWFzdDtyZXR1cm4gdCBpbnN0YW5jZW9mIG8uTGF0TG5nQm91bmRzPyhlPXQuZ2V0U291dGhXZXN0KCksaT10LmdldE5vcnRoRWFzdCgpKTplPWk9dCxlLmxhdD49bi5sYXQmJmkubGF0PD1zLmxhdCYmZS5sbmc+PW4ubG5nJiZpLmxuZzw9cy5sbmd9LGludGVyc2VjdHM6ZnVuY3Rpb24odCl7dD1vLmxhdExuZ0JvdW5kcyh0KTt2YXIgZT10aGlzLl9zb3V0aFdlc3QsaT10aGlzLl9ub3J0aEVhc3Qsbj10LmdldFNvdXRoV2VzdCgpLHM9dC5nZXROb3J0aEVhc3QoKSxhPXMubGF0Pj1lLmxhdCYmbi5sYXQ8PWkubGF0LHI9cy5sbmc+PWUubG5nJiZuLmxuZzw9aS5sbmc7cmV0dXJuIGEmJnJ9LHRvQkJveFN0cmluZzpmdW5jdGlvbigpe3JldHVyblt0aGlzLmdldFdlc3QoKSx0aGlzLmdldFNvdXRoKCksdGhpcy5nZXRFYXN0KCksdGhpcy5nZXROb3J0aCgpXS5qb2luKCIsIil9LGVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4gdD8odD1vLmxhdExuZ0JvdW5kcyh0KSx0aGlzLl9zb3V0aFdlc3QuZXF1YWxzKHQuZ2V0U291dGhXZXN0KCkpJiZ0aGlzLl9ub3J0aEVhc3QuZXF1YWxzKHQuZ2V0Tm9ydGhFYXN0KCkpKTohMX0saXNWYWxpZDpmdW5jdGlvbigpe3JldHVybiEoIXRoaXMuX3NvdXRoV2VzdHx8IXRoaXMuX25vcnRoRWFzdCl9fSxvLmxhdExuZ0JvdW5kcz1mdW5jdGlvbih0LGUpe3JldHVybiF0fHx0IGluc3RhbmNlb2Ygby5MYXRMbmdCb3VuZHM/dDpuZXcgby5MYXRMbmdCb3VuZHModCxlKX0sby5Qcm9qZWN0aW9uPXt9LG8uUHJvamVjdGlvbi5TcGhlcmljYWxNZXJjYXRvcj17TUFYX0xBVElUVURFOjg1LjA1MTEyODc3OTgscHJvamVjdDpmdW5jdGlvbih0KXt2YXIgZT1vLkxhdExuZy5ERUdfVE9fUkFELGk9dGhpcy5NQVhfTEFUSVRVREUsbj1NYXRoLm1heChNYXRoLm1pbihpLHQubGF0KSwtaSkscz10LmxuZyplLGE9biplO3JldHVybiBhPU1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCthLzIpKSxuZXcgby5Qb2ludChzLGEpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGU9by5MYXRMbmcuUkFEX1RPX0RFRyxpPXQueCplLG49KDIqTWF0aC5hdGFuKE1hdGguZXhwKHQueSkpLU1hdGguUEkvMikqZTtyZXR1cm4gbmV3IG8uTGF0TG5nKG4saSl9fSxvLlByb2plY3Rpb24uTG9uTGF0PXtwcm9qZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5Qb2ludCh0LmxuZyx0LmxhdCl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8uTGF0TG5nKHQueSx0LngpfX0sby5DUlM9e2xhdExuZ1RvUG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnByb2plY3Rpb24ucHJvamVjdCh0KSxuPXRoaXMuc2NhbGUoZSk7cmV0dXJuIHRoaXMudHJhbnNmb3JtYXRpb24uX3RyYW5zZm9ybShpLG4pfSxwb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zY2FsZShlKSxuPXRoaXMudHJhbnNmb3JtYXRpb24udW50cmFuc2Zvcm0odCxpKTtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdChuKX0scHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnByb2plY3QodCl9LHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiAyNTYqTWF0aC5wb3coMix0KX0sZ2V0U2l6ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNjYWxlKHQpO3JldHVybiBvLnBvaW50KGUsZSl9fSxvLkNSUy5TaW1wbGU9by5leHRlbmQoe30sby5DUlMse3Byb2plY3Rpb246by5Qcm9qZWN0aW9uLkxvbkxhdCx0cmFuc2Zvcm1hdGlvbjpuZXcgby5UcmFuc2Zvcm1hdGlvbigxLDAsLTEsMCksc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsdCl9fSksby5DUlMuRVBTRzM4NTc9by5leHRlbmQoe30sby5DUlMse2NvZGU6IkVQU0c6Mzg1NyIscHJvamVjdGlvbjpvLlByb2plY3Rpb24uU3BoZXJpY2FsTWVyY2F0b3IsdHJhbnNmb3JtYXRpb246bmV3IG8uVHJhbnNmb3JtYXRpb24oLjUvTWF0aC5QSSwuNSwtLjUvTWF0aC5QSSwuNSkscHJvamVjdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb2plY3Rpb24ucHJvamVjdCh0KSxpPTYzNzgxMzc7cmV0dXJuIGUubXVsdGlwbHlCeShpKX19KSxvLkNSUy5FUFNHOTAwOTEzPW8uZXh0ZW5kKHt9LG8uQ1JTLkVQU0czODU3LHtjb2RlOiJFUFNHOjkwMDkxMyJ9KSxvLkNSUy5FUFNHNDMyNj1vLmV4dGVuZCh7fSxvLkNSUyx7Y29kZToiRVBTRzo0MzI2Iixwcm9qZWN0aW9uOm8uUHJvamVjdGlvbi5Mb25MYXQsdHJhbnNmb3JtYXRpb246bmV3IG8uVHJhbnNmb3JtYXRpb24oMS8zNjAsLjUsLTEvMzYwLC41KX0pLG8uTWFwPW8uQ2xhc3MuZXh0ZW5kKHtpbmNsdWRlczpvLk1peGluLkV2ZW50cyxvcHRpb25zOntjcnM6by5DUlMuRVBTRzM4NTcsZmFkZUFuaW1hdGlvbjpvLkRvbVV0aWwuVFJBTlNJVElPTiYmIW8uQnJvd3Nlci5hbmRyb2lkMjMsdHJhY2tSZXNpemU6ITAsbWFya2VyWm9vbUFuaW1hdGlvbjpvLkRvbVV0aWwuVFJBTlNJVElPTiYmby5Ccm93c2VyLmFueTNkfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7ZT1vLnNldE9wdGlvbnModGhpcyxlKSx0aGlzLl9pbml0Q29udGFpbmVyKHQpLHRoaXMuX2luaXRMYXlvdXQoKSx0aGlzLl9vblJlc2l6ZT1vLmJpbmQodGhpcy5fb25SZXNpemUsdGhpcyksdGhpcy5faW5pdEV2ZW50cygpLGUubWF4Qm91bmRzJiZ0aGlzLnNldE1heEJvdW5kcyhlLm1heEJvdW5kcyksZS5jZW50ZXImJmUuem9vbSE9PWkmJnRoaXMuc2V0VmlldyhvLmxhdExuZyhlLmNlbnRlciksZS56b29tLHtyZXNldDohMH0pLHRoaXMuX2hhbmRsZXJzPVtdLHRoaXMuX2xheWVycz17fSx0aGlzLl96b29tQm91bmRMYXllcnM9e30sdGhpcy5fdGlsZUxheWVyc051bT0wLHRoaXMuY2FsbEluaXRIb29rcygpLHRoaXMuX2FkZExheWVycyhlLmxheWVycyl9LHNldFZpZXc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lPT09aT90aGlzLmdldFpvb20oKTplLHRoaXMuX3Jlc2V0VmlldyhvLmxhdExuZyh0KSx0aGlzLl9saW1pdFpvb20oZSkpLHRoaXN9LHNldFpvb206ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fbG9hZGVkP3RoaXMuc2V0Vmlldyh0aGlzLmdldENlbnRlcigpLHQse3pvb206ZX0pOih0aGlzLl96b29tPXRoaXMuX2xpbWl0Wm9vbSh0KSx0aGlzKX0sem9vbUluOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2V0Wm9vbSh0aGlzLl96b29tKyh0fHwxKSxlKX0sem9vbU91dDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNldFpvb20odGhpcy5fem9vbS0odHx8MSksZSl9LHNldFpvb21Bcm91bmQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuZ2V0Wm9vbVNjYWxlKGUpLHM9dGhpcy5nZXRTaXplKCkuZGl2aWRlQnkoMiksYT10IGluc3RhbmNlb2Ygby5Qb2ludD90OnRoaXMubGF0TG5nVG9Db250YWluZXJQb2ludCh0KSxyPWEuc3VidHJhY3QocykubXVsdGlwbHlCeSgxLTEvbiksaD10aGlzLmNvbnRhaW5lclBvaW50VG9MYXRMbmcocy5hZGQocikpO3JldHVybiB0aGlzLnNldFZpZXcoaCxlLHt6b29tOml9KX0sZml0Qm91bmRzOmZ1bmN0aW9uKHQsZSl7ZT1lfHx7fSx0PXQuZ2V0Qm91bmRzP3QuZ2V0Qm91bmRzKCk6by5sYXRMbmdCb3VuZHModCk7dmFyIGk9by5wb2ludChlLnBhZGRpbmdUb3BMZWZ0fHxlLnBhZGRpbmd8fFswLDBdKSxuPW8ucG9pbnQoZS5wYWRkaW5nQm90dG9tUmlnaHR8fGUucGFkZGluZ3x8WzAsMF0pLHM9dGhpcy5nZXRCb3VuZHNab29tKHQsITEsaS5hZGQobikpO3M9Im51bWJlciI9PXR5cGVvZiBlLm1heFpvb20/TWF0aC5taW4oZS5tYXhab29tLHMpOnM7dmFyIGE9bi5zdWJ0cmFjdChpKS5kaXZpZGVCeSgyKSxyPXRoaXMucHJvamVjdCh0LmdldFNvdXRoV2VzdCgpLHMpLGg9dGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhFYXN0KCkscyksbD10aGlzLnVucHJvamVjdChyLmFkZChoKS5kaXZpZGVCeSgyKS5hZGQoYSkscyk7cmV0dXJuIHRoaXMuc2V0VmlldyhsLHMsZSl9LGZpdFdvcmxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpdEJvdW5kcyhbWy05MCwtMTgwXSxbOTAsMTgwXV0sdCl9LHBhblRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2V0Vmlldyh0LHRoaXMuX3pvb20se3BhbjplfSl9LHBhbkJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpcmUoIm1vdmVzdGFydCIpLHRoaXMuX3Jhd1BhbkJ5KG8ucG9pbnQodCkpLHRoaXMuZmlyZSgibW92ZSIpLHRoaXMuZmlyZSgibW92ZWVuZCIpfSxzZXRNYXhCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9by5sYXRMbmdCb3VuZHModCksdGhpcy5vcHRpb25zLm1heEJvdW5kcz10LHQ/KHRoaXMuX2xvYWRlZCYmdGhpcy5fcGFuSW5zaWRlTWF4Qm91bmRzKCksdGhpcy5vbigibW92ZWVuZCIsdGhpcy5fcGFuSW5zaWRlTWF4Qm91bmRzLHRoaXMpKTp0aGlzLm9mZigibW92ZWVuZCIsdGhpcy5fcGFuSW5zaWRlTWF4Qm91bmRzLHRoaXMpfSxwYW5JbnNpZGVCb3VuZHM6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldENlbnRlcigpLG49dGhpcy5fbGltaXRDZW50ZXIoaSx0aGlzLl96b29tLHQpO3JldHVybiBpLmVxdWFscyhuKT90aGlzOnRoaXMucGFuVG8obixlKX0sYWRkTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9by5zdGFtcCh0KTtyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdP3RoaXM6KHRoaXMuX2xheWVyc1tlXT10LCF0Lm9wdGlvbnN8fGlzTmFOKHQub3B0aW9ucy5tYXhab29tKSYmaXNOYU4odC5vcHRpb25zLm1pblpvb20pfHwodGhpcy5fem9vbUJvdW5kTGF5ZXJzW2VdPXQsdGhpcy5fdXBkYXRlWm9vbUxldmVscygpKSx0aGlzLm9wdGlvbnMuem9vbUFuaW1hdGlvbiYmby5UaWxlTGF5ZXImJnQgaW5zdGFuY2VvZiBvLlRpbGVMYXllciYmKHRoaXMuX3RpbGVMYXllcnNOdW0rKyx0aGlzLl90aWxlTGF5ZXJzVG9Mb2FkKyssdC5vbigibG9hZCIsdGhpcy5fb25UaWxlTGF5ZXJMb2FkLHRoaXMpKSx0aGlzLl9sb2FkZWQmJnRoaXMuX2xheWVyQWRkKHQpLHRoaXMpfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgZT1vLnN0YW1wKHQpO3JldHVybiB0aGlzLl9sYXllcnNbZV0/KHRoaXMuX2xvYWRlZCYmdC5vblJlbW92ZSh0aGlzKSxkZWxldGUgdGhpcy5fbGF5ZXJzW2VdLHRoaXMuX2xvYWRlZCYmdGhpcy5maXJlKCJsYXllcnJlbW92ZSIse2xheWVyOnR9KSx0aGlzLl96b29tQm91bmRMYXllcnNbZV0mJihkZWxldGUgdGhpcy5fem9vbUJvdW5kTGF5ZXJzW2VdLHRoaXMuX3VwZGF0ZVpvb21MZXZlbHMoKSksdGhpcy5vcHRpb25zLnpvb21BbmltYXRpb24mJm8uVGlsZUxheWVyJiZ0IGluc3RhbmNlb2Ygby5UaWxlTGF5ZXImJih0aGlzLl90aWxlTGF5ZXJzTnVtLS0sdGhpcy5fdGlsZUxheWVyc1RvTG9hZC0tLHQub2ZmKCJsb2FkIix0aGlzLl9vblRpbGVMYXllckxvYWQsdGhpcykpLHRoaXMpOnRoaXN9LGhhc0xheWVyOmZ1bmN0aW9uKHQpe3JldHVybiB0P28uc3RhbXAodClpbiB0aGlzLl9sYXllcnM6ITF9LGVhY2hMYXllcjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSBpbiB0aGlzLl9sYXllcnMpdC5jYWxsKGUsdGhpcy5fbGF5ZXJzW2ldKTtyZXR1cm4gdGhpc30saW52YWxpZGF0ZVNpemU6ZnVuY3Rpb24odCl7aWYoIXRoaXMuX2xvYWRlZClyZXR1cm4gdGhpczt0PW8uZXh0ZW5kKHthbmltYXRlOiExLHBhbjohMH0sdD09PSEwP3thbmltYXRlOiEwfTp0KTt2YXIgZT10aGlzLmdldFNpemUoKTt0aGlzLl9zaXplQ2hhbmdlZD0hMCx0aGlzLl9pbml0aWFsQ2VudGVyPW51bGw7dmFyIGk9dGhpcy5nZXRTaXplKCksbj1lLmRpdmlkZUJ5KDIpLnJvdW5kKCkscz1pLmRpdmlkZUJ5KDIpLnJvdW5kKCksYT1uLnN1YnRyYWN0KHMpO3JldHVybiBhLnh8fGEueT8odC5hbmltYXRlJiZ0LnBhbj90aGlzLnBhbkJ5KGEpOih0LnBhbiYmdGhpcy5fcmF3UGFuQnkoYSksdGhpcy5maXJlKCJtb3ZlIiksdC5kZWJvdW5jZU1vdmVlbmQ/KGNsZWFyVGltZW91dCh0aGlzLl9zaXplVGltZXIpLHRoaXMuX3NpemVUaW1lcj1zZXRUaW1lb3V0KG8uYmluZCh0aGlzLmZpcmUsdGhpcywibW92ZWVuZCIpLDIwMCkpOnRoaXMuZmlyZSgibW92ZWVuZCIpKSx0aGlzLmZpcmUoInJlc2l6ZSIse29sZFNpemU6ZSxuZXdTaXplOml9KSk6dGhpc30sYWRkSGFuZGxlcjpmdW5jdGlvbih0LGUpe2lmKCFlKXJldHVybiB0aGlzO3ZhciBpPXRoaXNbdF09bmV3IGUodGhpcyk7cmV0dXJuIHRoaXMuX2hhbmRsZXJzLnB1c2goaSksdGhpcy5vcHRpb25zW3RdJiZpLmVuYWJsZSgpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX2xvYWRlZCYmdGhpcy5maXJlKCJ1bmxvYWQiKSx0aGlzLl9pbml0RXZlbnRzKCJvZmYiKTt0cnl7ZGVsZXRlIHRoaXMuX2NvbnRhaW5lci5fbGVhZmxldH1jYXRjaCh0KXt0aGlzLl9jb250YWluZXIuX2xlYWZsZXQ9aX1yZXR1cm4gdGhpcy5fY2xlYXJQYW5lcygpLHRoaXMuX2NsZWFyQ29udHJvbFBvcyYmdGhpcy5fY2xlYXJDb250cm9sUG9zKCksdGhpcy5fY2xlYXJIYW5kbGVycygpLHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGVja0lmTG9hZGVkKCksdGhpcy5faW5pdGlhbENlbnRlciYmIXRoaXMuX21vdmVkKCk/dGhpcy5faW5pdGlhbENlbnRlcjp0aGlzLmxheWVyUG9pbnRUb0xhdExuZyh0aGlzLl9nZXRDZW50ZXJMYXllclBvaW50KCkpfSxnZXRab29tOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pvb219LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0UGl4ZWxCb3VuZHMoKSxlPXRoaXMudW5wcm9qZWN0KHQuZ2V0Qm90dG9tTGVmdCgpKSxpPXRoaXMudW5wcm9qZWN0KHQuZ2V0VG9wUmlnaHQoKSk7cmV0dXJuIG5ldyBvLkxhdExuZ0JvdW5kcyhlLGkpfSxnZXRNaW5ab29tOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5taW5ab29tPT09aT90aGlzLl9sYXllcnNNaW5ab29tPT09aT8wOnRoaXMuX2xheWVyc01pblpvb206dGhpcy5vcHRpb25zLm1pblpvb219LGdldE1heFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1heFpvb209PT1pP3RoaXMuX2xheWVyc01heFpvb209PT1pPzEvMDp0aGlzLl9sYXllcnNNYXhab29tOnRoaXMub3B0aW9ucy5tYXhab29tfSxnZXRCb3VuZHNab29tOmZ1bmN0aW9uKHQsZSxpKXt0PW8ubGF0TG5nQm91bmRzKHQpO3ZhciBuLHM9dGhpcy5nZXRNaW5ab29tKCktKGU/MTowKSxhPXRoaXMuZ2V0TWF4Wm9vbSgpLHI9dGhpcy5nZXRTaXplKCksaD10LmdldE5vcnRoV2VzdCgpLGw9dC5nZXRTb3V0aEVhc3QoKSx1PSEwO2k9by5wb2ludChpfHxbMCwwXSk7ZG8gcysrLG49dGhpcy5wcm9qZWN0KGwscykuc3VidHJhY3QodGhpcy5wcm9qZWN0KGgscykpLmFkZChpKSx1PWU/bi54PHIueHx8bi55PHIueTpyLmNvbnRhaW5zKG4pO3doaWxlKHUmJmE+PXMpO3JldHVybiB1JiZlP251bGw6ZT9zOnMtMX0sZ2V0U2l6ZTpmdW5jdGlvbigpe3JldHVybighdGhpcy5fc2l6ZXx8dGhpcy5fc2l6ZUNoYW5nZWQpJiYodGhpcy5fc2l6ZT1uZXcgby5Qb2ludCh0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGgsdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodCksdGhpcy5fc2l6ZUNoYW5nZWQ9ITEpLHRoaXMuX3NpemUuY2xvbmUoKX0sZ2V0UGl4ZWxCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRUb3BMZWZ0UG9pbnQoKTtyZXR1cm4gbmV3IG8uQm91bmRzKHQsdC5hZGQodGhpcy5nZXRTaXplKCkpKX0sZ2V0UGl4ZWxPcmlnaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hlY2tJZkxvYWRlZCgpLHRoaXMuX2luaXRpYWxUb3BMZWZ0UG9pbnR9LGdldFBhbmVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhbmVzfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxnZXRab29tU2NhbGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLmNycztyZXR1cm4gZS5zY2FsZSh0KS9lLnNjYWxlKHRoaXMuX3pvb20pfSxnZXRTY2FsZVpvb206ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3pvb20rTWF0aC5sb2codCkvTWF0aC5MTjJ9LHByb2plY3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lPT09aT90aGlzLl96b29tOmUsdGhpcy5vcHRpb25zLmNycy5sYXRMbmdUb1BvaW50KG8ubGF0TG5nKHQpLGUpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lPT09aT90aGlzLl96b29tOmUsdGhpcy5vcHRpb25zLmNycy5wb2ludFRvTGF0TG5nKG8ucG9pbnQodCksZSl9LGxheWVyUG9pbnRUb0xhdExuZzpmdW5jdGlvbih0KXt2YXIgZT1vLnBvaW50KHQpLmFkZCh0aGlzLmdldFBpeGVsT3JpZ2luKCkpO3JldHVybiB0aGlzLnVucHJvamVjdChlKX0sbGF0TG5nVG9MYXllclBvaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJvamVjdChvLmxhdExuZyh0KSkuX3JvdW5kKCk7cmV0dXJuIGUuX3N1YnRyYWN0KHRoaXMuZ2V0UGl4ZWxPcmlnaW4oKSl9LGNvbnRhaW5lclBvaW50VG9MYXllclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiBvLnBvaW50KHQpLnN1YnRyYWN0KHRoaXMuX2dldE1hcFBhbmVQb3MoKSl9LGxheWVyUG9pbnRUb0NvbnRhaW5lclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiBvLnBvaW50KHQpLmFkZCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpfSxjb250YWluZXJQb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoby5wb2ludCh0KSk7cmV0dXJuIHRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKGUpfSxsYXRMbmdUb0NvbnRhaW5lclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxheWVyUG9pbnRUb0NvbnRhaW5lclBvaW50KHRoaXMubGF0TG5nVG9MYXllclBvaW50KG8ubGF0TG5nKHQpKSl9LG1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiBvLkRvbUV2ZW50LmdldE1vdXNlUG9zaXRpb24odCx0aGlzLl9jb250YWluZXIpfSxtb3VzZUV2ZW50VG9MYXllclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KHRoaXMubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCkpfSxtb3VzZUV2ZW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0KSl9LF9pbml0Q29udGFpbmVyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NvbnRhaW5lcj1vLkRvbVV0aWwuZ2V0KHQpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiTWFwIGNvbnRhaW5lciBub3QgZm91bmQuIik7aWYoZS5fbGVhZmxldCl0aHJvdyBuZXcgRXJyb3IoIk1hcCBjb250YWluZXIgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4iKTtlLl9sZWFmbGV0PSEwfSxfaW5pdExheW91dDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRhaW5lcjtvLkRvbVV0aWwuYWRkQ2xhc3ModCwibGVhZmxldC1jb250YWluZXIiKyhvLkJyb3dzZXIudG91Y2g/IiBsZWFmbGV0LXRvdWNoIjoiIikrKG8uQnJvd3Nlci5yZXRpbmE/IiBsZWFmbGV0LXJldGluYSI6IiIpKyhvLkJyb3dzZXIuaWVsdDk/IiBsZWFmbGV0LW9sZGllIjoiIikrKHRoaXMub3B0aW9ucy5mYWRlQW5pbWF0aW9uPyIgbGVhZmxldC1mYWRlLWFuaW0iOiIiKSk7dmFyIGU9by5Eb21VdGlsLmdldFN0eWxlKHQsInBvc2l0aW9uIik7ImFic29sdXRlIiE9PWUmJiJyZWxhdGl2ZSIhPT1lJiYiZml4ZWQiIT09ZSYmKHQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksdGhpcy5faW5pdFBhbmVzKCksdGhpcy5faW5pdENvbnRyb2xQb3MmJnRoaXMuX2luaXRDb250cm9sUG9zKCl9LF9pbml0UGFuZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYW5lcz17fTt0aGlzLl9tYXBQYW5lPXQubWFwUGFuZT10aGlzLl9jcmVhdGVQYW5lKCJsZWFmbGV0LW1hcC1wYW5lIix0aGlzLl9jb250YWluZXIpLHRoaXMuX3RpbGVQYW5lPXQudGlsZVBhbmU9dGhpcy5fY3JlYXRlUGFuZSgibGVhZmxldC10aWxlLXBhbmUiLHRoaXMuX21hcFBhbmUpLHQub2JqZWN0c1BhbmU9dGhpcy5fY3JlYXRlUGFuZSgibGVhZmxldC1vYmplY3RzLXBhbmUiLHRoaXMuX21hcFBhbmUpLHQuc2hhZG93UGFuZT10aGlzLl9jcmVhdGVQYW5lKCJsZWFmbGV0LXNoYWRvdy1wYW5lIiksdC5vdmVybGF5UGFuZT10aGlzLl9jcmVhdGVQYW5lKCJsZWFmbGV0LW92ZXJsYXktcGFuZSIpLHQubWFya2VyUGFuZT10aGlzLl9jcmVhdGVQYW5lKCJsZWFmbGV0LW1hcmtlci1wYW5lIiksdC5wb3B1cFBhbmU9dGhpcy5fY3JlYXRlUGFuZSgibGVhZmxldC1wb3B1cC1wYW5lIik7dmFyIGU9IiBsZWFmbGV0LXpvb20taGlkZSI7dGhpcy5vcHRpb25zLm1hcmtlclpvb21BbmltYXRpb258fChvLkRvbVV0aWwuYWRkQ2xhc3ModC5tYXJrZXJQYW5lLGUpLG8uRG9tVXRpbC5hZGRDbGFzcyh0LnNoYWRvd1BhbmUsZSksby5Eb21VdGlsLmFkZENsYXNzKHQucG9wdXBQYW5lLGUpKX0sX2NyZWF0ZVBhbmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gby5Eb21VdGlsLmNyZWF0ZSgiZGl2Iix0LGV8fHRoaXMuX3BhbmVzLm9iamVjdHNQYW5lKX0sX2NsZWFyUGFuZXM6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fbWFwUGFuZSl9LF9hZGRMYXllcnM6ZnVuY3Rpb24odCl7dD10P28uVXRpbC5pc0FycmF5KHQpP3Q6W3RdOltdO2Zvcih2YXIgZT0wLGk9dC5sZW5ndGg7aT5lO2UrKyl0aGlzLmFkZExheWVyKHRbZV0pfSxfcmVzZXRWaWV3OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBzPXRoaXMuX3pvb20hPT1lO258fCh0aGlzLmZpcmUoIm1vdmVzdGFydCIpLHMmJnRoaXMuZmlyZSgiem9vbXN0YXJ0IikpLHRoaXMuX3pvb209ZSx0aGlzLl9pbml0aWFsQ2VudGVyPXQsdGhpcy5faW5pdGlhbFRvcExlZnRQb2ludD10aGlzLl9nZXROZXdUb3BMZWZ0UG9pbnQodCksaT90aGlzLl9pbml0aWFsVG9wTGVmdFBvaW50Ll9hZGQodGhpcy5fZ2V0TWFwUGFuZVBvcygpKTpvLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5fbWFwUGFuZSxuZXcgby5Qb2ludCgwLDApKSx0aGlzLl90aWxlTGF5ZXJzVG9Mb2FkPXRoaXMuX3RpbGVMYXllcnNOdW07dmFyIGE9IXRoaXMuX2xvYWRlZDt0aGlzLl9sb2FkZWQ9ITAsdGhpcy5maXJlKCJ2aWV3cmVzZXQiLHtoYXJkOiFpfSksYSYmKHRoaXMuZmlyZSgibG9hZCIpLHRoaXMuZWFjaExheWVyKHRoaXMuX2xheWVyQWRkLHRoaXMpKSx0aGlzLmZpcmUoIm1vdmUiKSwoc3x8bikmJnRoaXMuZmlyZSgiem9vbWVuZCIpLHRoaXMuZmlyZSgibW92ZWVuZCIse2hhcmQ6IWl9KX0sX3Jhd1BhbkJ5OmZ1bmN0aW9uKHQpe28uRG9tVXRpbC5zZXRQb3NpdGlvbih0aGlzLl9tYXBQYW5lLHRoaXMuX2dldE1hcFBhbmVQb3MoKS5zdWJ0cmFjdCh0KSl9LF9nZXRab29tU3BhbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE1heFpvb20oKS10aGlzLmdldE1pblpvb20oKX0sX3VwZGF0ZVpvb21MZXZlbHM6ZnVuY3Rpb24oKXt2YXIgdCxlPTEvMCxuPS0oMS8wKSxvPXRoaXMuX2dldFpvb21TcGFuKCk7Zm9yKHQgaW4gdGhpcy5fem9vbUJvdW5kTGF5ZXJzKXt2YXIgcz10aGlzLl96b29tQm91bmRMYXllcnNbdF07aXNOYU4ocy5vcHRpb25zLm1pblpvb20pfHwoZT1NYXRoLm1pbihlLHMub3B0aW9ucy5taW5ab29tKSksaXNOYU4ocy5vcHRpb25zLm1heFpvb20pfHwobj1NYXRoLm1heChuLHMub3B0aW9ucy5tYXhab29tKSl9dD09PWk/dGhpcy5fbGF5ZXJzTWF4Wm9vbT10aGlzLl9sYXllcnNNaW5ab29tPWk6KHRoaXMuX2xheWVyc01heFpvb209bix0aGlzLl9sYXllcnNNaW5ab29tPWUpLG8hPT10aGlzLl9nZXRab29tU3BhbigpJiZ0aGlzLmZpcmUoInpvb21sZXZlbHNjaGFuZ2UiKX0sX3Bhbkluc2lkZU1heEJvdW5kczpmdW5jdGlvbigpe3RoaXMucGFuSW5zaWRlQm91bmRzKHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpfSxfY2hlY2tJZkxvYWRlZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9sb2FkZWQpdGhyb3cgbmV3IEVycm9yKCJTZXQgbWFwIGNlbnRlciBhbmQgem9vbSBmaXJzdC4iKX0sX2luaXRFdmVudHM6ZnVuY3Rpb24oZSl7aWYoby5Eb21FdmVudCl7ZT1lfHwib24iLG8uRG9tRXZlbnRbZV0odGhpcy5fY29udGFpbmVyLCJjbGljayIsdGhpcy5fb25Nb3VzZUNsaWNrLHRoaXMpO3ZhciBpLG4scz1bImRibGNsaWNrIiwibW91c2Vkb3duIiwibW91c2V1cCIsIm1vdXNlZW50ZXIiLCJtb3VzZWxlYXZlIiwibW91c2Vtb3ZlIiwiY29udGV4dG1lbnUiXTtmb3IoaT0wLG49cy5sZW5ndGg7bj5pO2krKylvLkRvbUV2ZW50W2VdKHRoaXMuX2NvbnRhaW5lcixzW2ldLHRoaXMuX2ZpcmVNb3VzZUV2ZW50LHRoaXMpO3RoaXMub3B0aW9ucy50cmFja1Jlc2l6ZSYmby5Eb21FdmVudFtlXSh0LCJyZXNpemUiLHRoaXMuX29uUmVzaXplLHRoaXMpfX0sX29uUmVzaXplOmZ1bmN0aW9uKCl7by5VdGlsLmNhbmNlbEFuaW1GcmFtZSh0aGlzLl9yZXNpemVSZXF1ZXN0KSx0aGlzLl9yZXNpemVSZXF1ZXN0PW8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKGZ1bmN0aW9uKCl7dGhpcy5pbnZhbGlkYXRlU2l6ZSh7ZGVib3VuY2VNb3ZlZW5kOiEwfSl9LHRoaXMsITEsdGhpcy5fY29udGFpbmVyKX0sX29uTW91c2VDbGljazpmdW5jdGlvbih0KXshdGhpcy5fbG9hZGVkfHwhdC5fc2ltdWxhdGVkJiYodGhpcy5kcmFnZ2luZyYmdGhpcy5kcmFnZ2luZy5tb3ZlZCgpfHx0aGlzLmJveFpvb20mJnRoaXMuYm94Wm9vbS5tb3ZlZCgpKXx8by5Eb21FdmVudC5fc2tpcHBlZCh0KXx8KHRoaXMuZmlyZSgicHJlY2xpY2siKSx0aGlzLl9maXJlTW91c2VFdmVudCh0KSl9LF9maXJlTW91c2VFdmVudDpmdW5jdGlvbih0KXtpZih0aGlzLl9sb2FkZWQmJiFvLkRvbUV2ZW50Ll9za2lwcGVkKHQpKXt2YXIgZT10LnR5cGU7aWYoZT0ibW91c2VlbnRlciI9PT1lPyJtb3VzZW92ZXIiOiJtb3VzZWxlYXZlIj09PWU/Im1vdXNlb3V0IjplLHRoaXMuaGFzRXZlbnRMaXN0ZW5lcnMoZSkpeyJjb250ZXh0bWVudSI9PT1lJiZvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KHQpO3ZhciBpPXRoaXMubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCksbj10aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KGkpLHM9dGhpcy5sYXllclBvaW50VG9MYXRMbmcobik7dGhpcy5maXJlKGUse2xhdGxuZzpzLGxheWVyUG9pbnQ6bixjb250YWluZXJQb2ludDppLG9yaWdpbmFsRXZlbnQ6dH0pfX19LF9vblRpbGVMYXllckxvYWQ6ZnVuY3Rpb24oKXt0aGlzLl90aWxlTGF5ZXJzVG9Mb2FkLS0sdGhpcy5fdGlsZUxheWVyc051bSYmIXRoaXMuX3RpbGVMYXllcnNUb0xvYWQmJnRoaXMuZmlyZSgidGlsZWxheWVyc2xvYWQiKX0sX2NsZWFySGFuZGxlcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPXRoaXMuX2hhbmRsZXJzLmxlbmd0aDtlPnQ7dCsrKXRoaXMuX2hhbmRsZXJzW3RdLmRpc2FibGUoKX0sd2hlblJlYWR5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2xvYWRlZD90LmNhbGwoZXx8dGhpcyx0aGlzKTp0aGlzLm9uKCJsb2FkIix0LGUpLHRoaXN9LF9sYXllckFkZDpmdW5jdGlvbih0KXt0Lm9uQWRkKHRoaXMpLHRoaXMuZmlyZSgibGF5ZXJhZGQiLHtsYXllcjp0fSl9LF9nZXRNYXBQYW5lUG9zOmZ1bmN0aW9uKCl7cmV0dXJuIG8uRG9tVXRpbC5nZXRQb3NpdGlvbih0aGlzLl9tYXBQYW5lKX0sX21vdmVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TWFwUGFuZVBvcygpO3JldHVybiB0JiYhdC5lcXVhbHMoWzAsMF0pfSxfZ2V0VG9wTGVmdFBvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGl4ZWxPcmlnaW4oKS5zdWJ0cmFjdCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpfSxfZ2V0TmV3VG9wTGVmdFBvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpO3JldHVybiB0aGlzLnByb2plY3QodCxlKS5fc3VidHJhY3QoaSkuX3JvdW5kKCl9LF9sYXRMbmdUb05ld0xheWVyUG9pbnQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2dldE5ld1RvcExlZnRQb2ludChpLGUpLmFkZCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpO3JldHVybiB0aGlzLnByb2plY3QodCxlKS5fc3VidHJhY3Qobil9LF9nZXRDZW50ZXJMYXllclBvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpKX0sX2dldENlbnRlck9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXRMbmdUb0xheWVyUG9pbnQodCkuc3VidHJhY3QodGhpcy5fZ2V0Q2VudGVyTGF5ZXJQb2ludCgpKX0sX2xpbWl0Q2VudGVyOmZ1bmN0aW9uKHQsZSxpKXtpZighaSlyZXR1cm4gdDt2YXIgbj10aGlzLnByb2plY3QodCxlKSxzPXRoaXMuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLGE9bmV3IG8uQm91bmRzKG4uc3VidHJhY3Qocyksbi5hZGQocykpLHI9dGhpcy5fZ2V0Qm91bmRzT2Zmc2V0KGEsaSxlKTtyZXR1cm4gdGhpcy51bnByb2plY3Qobi5hZGQociksZSl9LF9saW1pdE9mZnNldDpmdW5jdGlvbih0LGUpe2lmKCFlKXJldHVybiB0O3ZhciBpPXRoaXMuZ2V0UGl4ZWxCb3VuZHMoKSxuPW5ldyBvLkJvdW5kcyhpLm1pbi5hZGQodCksaS5tYXguYWRkKHQpKTtyZXR1cm4gdC5hZGQodGhpcy5fZ2V0Qm91bmRzT2Zmc2V0KG4sZSkpfSxfZ2V0Qm91bmRzT2Zmc2V0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLnByb2plY3QoZS5nZXROb3J0aFdlc3QoKSxpKS5zdWJ0cmFjdCh0Lm1pbikscz10aGlzLnByb2plY3QoZS5nZXRTb3V0aEVhc3QoKSxpKS5zdWJ0cmFjdCh0Lm1heCksYT10aGlzLl9yZWJvdW5kKG4ueCwtcy54KSxyPXRoaXMuX3JlYm91bmQobi55LC1zLnkpO3JldHVybiBuZXcgby5Qb2ludChhLHIpfSxfcmVib3VuZDpmdW5jdGlvbih0LGUpe3JldHVybiB0K2U+MD9NYXRoLnJvdW5kKHQtZSkvMjpNYXRoLm1heCgwLE1hdGguY2VpbCh0KSktTWF0aC5tYXgoMCxNYXRoLmZsb29yKGUpKX0sX2xpbWl0Wm9vbTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldE1pblpvb20oKSxpPXRoaXMuZ2V0TWF4Wm9vbSgpO3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKGksdCkpfX0pLG8ubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLk1hcCh0LGUpfSxvLlByb2plY3Rpb24uTWVyY2F0b3I9e01BWF9MQVRJVFVERTo4NS4wODQwNTkxNTU2LFJfTUlOT1I6NjM1Njc1Mi4zMTQyNDUxNzksUl9NQUpPUjo2Mzc4MTM3LHByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGU9by5MYXRMbmcuREVHX1RPX1JBRCxpPXRoaXMuTUFYX0xBVElUVURFLG49TWF0aC5tYXgoTWF0aC5taW4oaSx0LmxhdCksLWkpLHM9dGhpcy5SX01BSk9SLGE9dGhpcy5SX01JTk9SLHI9dC5sbmcqZSpzLGg9biplLGw9YS9zLHU9TWF0aC5zcXJ0KDEtbCpsKSxjPXUqTWF0aC5zaW4oaCk7Yz1NYXRoLnBvdygoMS1jKS8oMStjKSwuNSp1KTt2YXIgZD1NYXRoLnRhbiguNSooLjUqTWF0aC5QSS1oKSkvYztyZXR1cm4gaD0tcypNYXRoLmxvZyhkKSxuZXcgby5Qb2ludChyLGgpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9by5MYXRMbmcuUkFEX1RPX0RFRyxuPXRoaXMuUl9NQUpPUixzPXRoaXMuUl9NSU5PUixhPXQueCppL24scj1zL24saD1NYXRoLnNxcnQoMS1yKnIpLGw9TWF0aC5leHAoLXQueS9uKSx1PU1hdGguUEkvMi0yKk1hdGguYXRhbihsKSxjPTE1LGQ9MWUtNyxwPWMsXz0uMTtNYXRoLmFicyhfKT5kJiYtLXA+MDspZT1oKk1hdGguc2luKHUpLF89TWF0aC5QSS8yLTIqTWF0aC5hdGFuKGwqTWF0aC5wb3coKDEtZSkvKDErZSksLjUqaCkpLXUsdSs9XztyZXR1cm4gbmV3IG8uTGF0TG5nKHUqaSxhKX19LG8uQ1JTLkVQU0czMzk1PW8uZXh0ZW5kKHt9LG8uQ1JTLHsKY29kZToiRVBTRzozMzk1Iixwcm9qZWN0aW9uOm8uUHJvamVjdGlvbi5NZXJjYXRvcix0cmFuc2Zvcm1hdGlvbjpmdW5jdGlvbigpe3ZhciB0PW8uUHJvamVjdGlvbi5NZXJjYXRvcixlPXQuUl9NQUpPUixpPS41LyhNYXRoLlBJKmUpO3JldHVybiBuZXcgby5UcmFuc2Zvcm1hdGlvbihpLC41LC1pLC41KX0oKX0pLG8uVGlsZUxheWVyPW8uQ2xhc3MuZXh0ZW5kKHtpbmNsdWRlczpvLk1peGluLkV2ZW50cyxvcHRpb25zOnttaW5ab29tOjAsbWF4Wm9vbToxOCx0aWxlU2l6ZToyNTYsc3ViZG9tYWluczoiYWJjIixlcnJvclRpbGVVcmw6IiIsYXR0cmlidXRpb246IiIsem9vbU9mZnNldDowLG9wYWNpdHk6MSx1bmxvYWRJbnZpc2libGVUaWxlczpvLkJyb3dzZXIubW9iaWxlLHVwZGF0ZVdoZW5JZGxlOm8uQnJvd3Nlci5tb2JpbGV9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtlPW8uc2V0T3B0aW9ucyh0aGlzLGUpLGUuZGV0ZWN0UmV0aW5hJiZvLkJyb3dzZXIucmV0aW5hJiZlLm1heFpvb20+MCYmKGUudGlsZVNpemU9TWF0aC5mbG9vcihlLnRpbGVTaXplLzIpLGUuem9vbU9mZnNldCsrLGUubWluWm9vbT4wJiZlLm1pblpvb20tLSx0aGlzLm9wdGlvbnMubWF4Wm9vbS0tKSxlLmJvdW5kcyYmKGUuYm91bmRzPW8ubGF0TG5nQm91bmRzKGUuYm91bmRzKSksdGhpcy5fdXJsPXQ7dmFyIGk9dGhpcy5vcHRpb25zLnN1YmRvbWFpbnM7InN0cmluZyI9PXR5cGVvZiBpJiYodGhpcy5vcHRpb25zLnN1YmRvbWFpbnM9aS5zcGxpdCgiIikpfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dCx0aGlzLl9hbmltYXRlZD10Ll96b29tQW5pbWF0ZWQsdGhpcy5faW5pdENvbnRhaW5lcigpLHQub24oe3ZpZXdyZXNldDp0aGlzLl9yZXNldCxtb3ZlZW5kOnRoaXMuX3VwZGF0ZX0sdGhpcyksdGhpcy5fYW5pbWF0ZWQmJnQub24oe3pvb21hbmltOnRoaXMuX2FuaW1hdGVab29tLHpvb21lbmQ6dGhpcy5fZW5kWm9vbUFuaW19LHRoaXMpLHRoaXMub3B0aW9ucy51cGRhdGVXaGVuSWRsZXx8KHRoaXMuX2xpbWl0ZWRVcGRhdGU9by5VdGlsLmxpbWl0RXhlY0J5SW50ZXJ2YWwodGhpcy5fdXBkYXRlLDE1MCx0aGlzKSx0Lm9uKCJtb3ZlIix0aGlzLl9saW1pdGVkVXBkYXRlLHRoaXMpKSx0aGlzLl9yZXNldCgpLHRoaXMuX3VwZGF0ZSgpfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRMYXllcih0aGlzKSx0aGlzfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLHQub2ZmKHt2aWV3cmVzZXQ6dGhpcy5fcmVzZXQsbW92ZWVuZDp0aGlzLl91cGRhdGV9LHRoaXMpLHRoaXMuX2FuaW1hdGVkJiZ0Lm9mZih7em9vbWFuaW06dGhpcy5fYW5pbWF0ZVpvb20sem9vbWVuZDp0aGlzLl9lbmRab29tQW5pbX0sdGhpcyksdGhpcy5vcHRpb25zLnVwZGF0ZVdoZW5JZGxlfHx0Lm9mZigibW92ZSIsdGhpcy5fbGltaXRlZFVwZGF0ZSx0aGlzKSx0aGlzLl9jb250YWluZXI9bnVsbCx0aGlzLl9tYXA9bnVsbH0sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLl9wYW5lcy50aWxlUGFuZTtyZXR1cm4gdGhpcy5fY29udGFpbmVyJiYodC5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX3NldEF1dG9aSW5kZXgodCxNYXRoLm1heCkpLHRoaXN9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLl9wYW5lcy50aWxlUGFuZTtyZXR1cm4gdGhpcy5fY29udGFpbmVyJiYodC5pbnNlcnRCZWZvcmUodGhpcy5fY29udGFpbmVyLHQuZmlyc3RDaGlsZCksdGhpcy5fc2V0QXV0b1pJbmRleCh0LE1hdGgubWluKSksdGhpc30sZ2V0QXR0cmlidXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9ufSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxzZXRPcGFjaXR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMub3BhY2l0eT10LHRoaXMuX21hcCYmdGhpcy5fdXBkYXRlT3BhY2l0eSgpLHRoaXN9LHNldFpJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnpJbmRleD10LHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXN9LHNldFVybDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl91cmw9dCxlfHx0aGlzLnJlZHJhdygpLHRoaXN9LHJlZHJhdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJih0aGlzLl9yZXNldCh7aGFyZDohMH0pLHRoaXMuX3VwZGF0ZSgpKSx0aGlzfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyJiZ0aGlzLm9wdGlvbnMuekluZGV4IT09aSYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS56SW5kZXg9dGhpcy5vcHRpb25zLnpJbmRleCl9LF9zZXRBdXRvWkluZGV4OmZ1bmN0aW9uKHQsZSl7dmFyIGksbixvLHM9dC5jaGlsZHJlbixhPS1lKDEvMCwtKDEvMCkpO2ZvcihuPTAsbz1zLmxlbmd0aDtvPm47bisrKXNbbl0hPT10aGlzLl9jb250YWluZXImJihpPXBhcnNlSW50KHNbbl0uc3R5bGUuekluZGV4LDEwKSxpc05hTihpKXx8KGE9ZShhLGkpKSk7dGhpcy5vcHRpb25zLnpJbmRleD10aGlzLl9jb250YWluZXIuc3R5bGUuekluZGV4PShpc0Zpbml0ZShhKT9hOjApK2UoMSwtMSl9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLl90aWxlcztpZihvLkJyb3dzZXIuaWVsdDkpZm9yKHQgaW4gZSlvLkRvbVV0aWwuc2V0T3BhY2l0eShlW3RdLHRoaXMub3B0aW9ucy5vcGFjaXR5KTtlbHNlIG8uRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2NvbnRhaW5lcix0aGlzLm9wdGlvbnMub3BhY2l0eSl9LF9pbml0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLl9wYW5lcy50aWxlUGFuZTtpZighdGhpcy5fY29udGFpbmVyKXtpZih0aGlzLl9jb250YWluZXI9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IiwibGVhZmxldC1sYXllciIpLHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXMuX2FuaW1hdGVkKXt2YXIgZT0ibGVhZmxldC10aWxlLWNvbnRhaW5lciI7dGhpcy5fYmdCdWZmZXI9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IixlLHRoaXMuX2NvbnRhaW5lciksdGhpcy5fdGlsZUNvbnRhaW5lcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUsdGhpcy5fY29udGFpbmVyKX1lbHNlIHRoaXMuX3RpbGVDb250YWluZXI9dGhpcy5fY29udGFpbmVyO3QuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLm9wdGlvbnMub3BhY2l0eTwxJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCl9fSxfcmVzZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuX3RpbGVzKXRoaXMuZmlyZSgidGlsZXVubG9hZCIse3RpbGU6dGhpcy5fdGlsZXNbZV19KTt0aGlzLl90aWxlcz17fSx0aGlzLl90aWxlc1RvTG9hZD0wLHRoaXMub3B0aW9ucy5yZXVzZVRpbGVzJiYodGhpcy5fdW51c2VkVGlsZXM9W10pLHRoaXMuX3RpbGVDb250YWluZXIuaW5uZXJIVE1MPSIiLHRoaXMuX2FuaW1hdGVkJiZ0JiZ0LmhhcmQmJnRoaXMuX2NsZWFyQmdCdWZmZXIoKSx0aGlzLl9pbml0Q29udGFpbmVyKCl9LF9nZXRUaWxlU2l6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxlPXQuZ2V0Wm9vbSgpK3RoaXMub3B0aW9ucy56b29tT2Zmc2V0LGk9dGhpcy5vcHRpb25zLm1heE5hdGl2ZVpvb20sbj10aGlzLm9wdGlvbnMudGlsZVNpemU7cmV0dXJuIGkmJmU+aSYmKG49TWF0aC5yb3VuZCh0LmdldFpvb21TY2FsZShlKS90LmdldFpvb21TY2FsZShpKSpuKSksbn0sX3VwZGF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX21hcCl7dmFyIHQ9dGhpcy5fbWFwLGU9dC5nZXRQaXhlbEJvdW5kcygpLGk9dC5nZXRab29tKCksbj10aGlzLl9nZXRUaWxlU2l6ZSgpO2lmKCEoaT50aGlzLm9wdGlvbnMubWF4Wm9vbXx8aTx0aGlzLm9wdGlvbnMubWluWm9vbSkpe3ZhciBzPW8uYm91bmRzKGUubWluLmRpdmlkZUJ5KG4pLl9mbG9vcigpLGUubWF4LmRpdmlkZUJ5KG4pLl9mbG9vcigpKTt0aGlzLl9hZGRUaWxlc0Zyb21DZW50ZXJPdXQocyksKHRoaXMub3B0aW9ucy51bmxvYWRJbnZpc2libGVUaWxlc3x8dGhpcy5vcHRpb25zLnJldXNlVGlsZXMpJiZ0aGlzLl9yZW1vdmVPdGhlclRpbGVzKHMpfX19LF9hZGRUaWxlc0Zyb21DZW50ZXJPdXQ6ZnVuY3Rpb24odCl7dmFyIGksbixzLGE9W10scj10LmdldENlbnRlcigpO2ZvcihpPXQubWluLnk7aTw9dC5tYXgueTtpKyspZm9yKG49dC5taW4ueDtuPD10Lm1heC54O24rKylzPW5ldyBvLlBvaW50KG4saSksdGhpcy5fdGlsZVNob3VsZEJlTG9hZGVkKHMpJiZhLnB1c2gocyk7dmFyIGg9YS5sZW5ndGg7aWYoMCE9PWgpe2Euc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LmRpc3RhbmNlVG8ociktZS5kaXN0YW5jZVRvKHIpfSk7dmFyIGw9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zm9yKHRoaXMuX3RpbGVzVG9Mb2FkfHx0aGlzLmZpcmUoImxvYWRpbmciKSx0aGlzLl90aWxlc1RvTG9hZCs9aCxuPTA7aD5uO24rKyl0aGlzLl9hZGRUaWxlKGFbbl0sbCk7dGhpcy5fdGlsZUNvbnRhaW5lci5hcHBlbmRDaGlsZChsKX19LF90aWxlU2hvdWxkQmVMb2FkZWQ6ZnVuY3Rpb24odCl7aWYodC54KyI6Iit0LnkgaW4gdGhpcy5fdGlsZXMpcmV0dXJuITE7dmFyIGU9dGhpcy5vcHRpb25zO2lmKCFlLmNvbnRpbnVvdXNXb3JsZCl7dmFyIGk9dGhpcy5fZ2V0V3JhcFRpbGVOdW0oKTtpZihlLm5vV3JhcCYmKHQueDwwfHx0Lng+PWkueCl8fHQueTwwfHx0Lnk+PWkueSlyZXR1cm4hMX1pZihlLmJvdW5kcyl7dmFyIG49dGhpcy5fZ2V0VGlsZVNpemUoKSxvPXQubXVsdGlwbHlCeShuKSxzPW8uYWRkKFtuLG5dKSxhPXRoaXMuX21hcC51bnByb2plY3Qobykscj10aGlzLl9tYXAudW5wcm9qZWN0KHMpO2lmKGUuY29udGludW91c1dvcmxkfHxlLm5vV3JhcHx8KGE9YS53cmFwKCkscj1yLndyYXAoKSksIWUuYm91bmRzLmludGVyc2VjdHMoW2Escl0pKXJldHVybiExfXJldHVybiEwfSxfcmVtb3ZlT3RoZXJUaWxlczpmdW5jdGlvbih0KXt2YXIgZSxpLG4sbztmb3IobyBpbiB0aGlzLl90aWxlcyllPW8uc3BsaXQoIjoiKSxpPXBhcnNlSW50KGVbMF0sMTApLG49cGFyc2VJbnQoZVsxXSwxMCksKGk8dC5taW4ueHx8aT50Lm1heC54fHxuPHQubWluLnl8fG4+dC5tYXgueSkmJnRoaXMuX3JlbW92ZVRpbGUobyl9LF9yZW1vdmVUaWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpbGVzW3RdO3RoaXMuZmlyZSgidGlsZXVubG9hZCIse3RpbGU6ZSx1cmw6ZS5zcmN9KSx0aGlzLm9wdGlvbnMucmV1c2VUaWxlcz8oby5Eb21VdGlsLnJlbW92ZUNsYXNzKGUsImxlYWZsZXQtdGlsZS1sb2FkZWQiKSx0aGlzLl91bnVzZWRUaWxlcy5wdXNoKGUpKTplLnBhcmVudE5vZGU9PT10aGlzLl90aWxlQ29udGFpbmVyJiZ0aGlzLl90aWxlQ29udGFpbmVyLnJlbW92ZUNoaWxkKGUpLG8uQnJvd3Nlci5hbmRyb2lkfHwoZS5vbmxvYWQ9bnVsbCxlLnNyYz1vLlV0aWwuZW1wdHlJbWFnZVVybCksZGVsZXRlIHRoaXMuX3RpbGVzW3RdfSxfYWRkVGlsZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2dldFRpbGVQb3ModCksbj10aGlzLl9nZXRUaWxlKCk7by5Eb21VdGlsLnNldFBvc2l0aW9uKG4saSxvLkJyb3dzZXIuY2hyb21lKSx0aGlzLl90aWxlc1t0LngrIjoiK3QueV09bix0aGlzLl9sb2FkVGlsZShuLHQpLG4ucGFyZW50Tm9kZSE9PXRoaXMuX3RpbGVDb250YWluZXImJmUuYXBwZW5kQ2hpbGQobil9LF9nZXRab29tRm9yVXJsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGU9dGhpcy5fbWFwLmdldFpvb20oKTtyZXR1cm4gdC56b29tUmV2ZXJzZSYmKGU9dC5tYXhab29tLWUpLGUrPXQuem9vbU9mZnNldCx0Lm1heE5hdGl2ZVpvb20/TWF0aC5taW4oZSx0Lm1heE5hdGl2ZVpvb20pOmV9LF9nZXRUaWxlUG9zOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpLGk9dGhpcy5fZ2V0VGlsZVNpemUoKTtyZXR1cm4gdC5tdWx0aXBseUJ5KGkpLnN1YnRyYWN0KGUpfSxnZXRUaWxlVXJsOmZ1bmN0aW9uKHQpe3JldHVybiBvLlV0aWwudGVtcGxhdGUodGhpcy5fdXJsLG8uZXh0ZW5kKHtzOnRoaXMuX2dldFN1YmRvbWFpbih0KSx6OnQueix4OnQueCx5OnQueX0sdGhpcy5vcHRpb25zKSl9LF9nZXRXcmFwVGlsZU51bTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5vcHRpb25zLmNycyxlPXQuZ2V0U2l6ZSh0aGlzLl9tYXAuZ2V0Wm9vbSgpKTtyZXR1cm4gZS5kaXZpZGVCeSh0aGlzLl9nZXRUaWxlU2l6ZSgpKS5fZmxvb3IoKX0sX2FkanVzdFRpbGVQb2ludDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9nZXRXcmFwVGlsZU51bSgpO3RoaXMub3B0aW9ucy5jb250aW51b3VzV29ybGR8fHRoaXMub3B0aW9ucy5ub1dyYXB8fCh0Lng9KHQueCVlLngrZS54KSVlLngpLHRoaXMub3B0aW9ucy50bXMmJih0Lnk9ZS55LXQueS0xKSx0Lno9dGhpcy5fZ2V0Wm9vbUZvclVybCgpfSxfZ2V0U3ViZG9tYWluOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguYWJzKHQueCt0LnkpJXRoaXMub3B0aW9ucy5zdWJkb21haW5zLmxlbmd0aDtyZXR1cm4gdGhpcy5vcHRpb25zLnN1YmRvbWFpbnNbZV19LF9nZXRUaWxlOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLnJldXNlVGlsZXMmJnRoaXMuX3VudXNlZFRpbGVzLmxlbmd0aD4wKXt2YXIgdD10aGlzLl91bnVzZWRUaWxlcy5wb3AoKTtyZXR1cm4gdGhpcy5fcmVzZXRUaWxlKHQpLHR9cmV0dXJuIHRoaXMuX2NyZWF0ZVRpbGUoKX0sX3Jlc2V0VGlsZTpmdW5jdGlvbigpe30sX2NyZWF0ZVRpbGU6ZnVuY3Rpb24oKXt2YXIgdD1vLkRvbVV0aWwuY3JlYXRlKCJpbWciLCJsZWFmbGV0LXRpbGUiKTtyZXR1cm4gdC5zdHlsZS53aWR0aD10LnN0eWxlLmhlaWdodD10aGlzLl9nZXRUaWxlU2l6ZSgpKyJweCIsdC5nYWxsZXJ5aW1nPSJubyIsdC5vbnNlbGVjdHN0YXJ0PXQub25tb3VzZW1vdmU9by5VdGlsLmZhbHNlRm4sby5Ccm93c2VyLmllbHQ5JiZ0aGlzLm9wdGlvbnMub3BhY2l0eSE9PWkmJm8uRG9tVXRpbC5zZXRPcGFjaXR5KHQsdGhpcy5vcHRpb25zLm9wYWNpdHkpLG8uQnJvd3Nlci5tb2JpbGVXZWJraXQzZCYmKHQuc3R5bGUuV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iKSx0fSxfbG9hZFRpbGU6ZnVuY3Rpb24odCxlKXt0Ll9sYXllcj10aGlzLHQub25sb2FkPXRoaXMuX3RpbGVPbkxvYWQsdC5vbmVycm9yPXRoaXMuX3RpbGVPbkVycm9yLHRoaXMuX2FkanVzdFRpbGVQb2ludChlKSx0LnNyYz10aGlzLmdldFRpbGVVcmwoZSksdGhpcy5maXJlKCJ0aWxlbG9hZHN0YXJ0Iix7dGlsZTp0LHVybDp0LnNyY30pfSxfdGlsZUxvYWRlZDpmdW5jdGlvbigpe3RoaXMuX3RpbGVzVG9Mb2FkLS0sdGhpcy5fYW5pbWF0ZWQmJm8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl90aWxlQ29udGFpbmVyLCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLl90aWxlc1RvTG9hZHx8KHRoaXMuZmlyZSgibG9hZCIpLHRoaXMuX2FuaW1hdGVkJiYoY2xlYXJUaW1lb3V0KHRoaXMuX2NsZWFyQmdCdWZmZXJUaW1lciksdGhpcy5fY2xlYXJCZ0J1ZmZlclRpbWVyPXNldFRpbWVvdXQoby5iaW5kKHRoaXMuX2NsZWFyQmdCdWZmZXIsdGhpcyksNTAwKSkpfSxfdGlsZU9uTG9hZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2xheWVyO3RoaXMuc3JjIT09by5VdGlsLmVtcHR5SW1hZ2VVcmwmJihvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcywibGVhZmxldC10aWxlLWxvYWRlZCIpLHQuZmlyZSgidGlsZWxvYWQiLHt0aWxlOnRoaXMsdXJsOnRoaXMuc3JjfSkpLHQuX3RpbGVMb2FkZWQoKX0sX3RpbGVPbkVycm9yOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbGF5ZXI7dC5maXJlKCJ0aWxlZXJyb3IiLHt0aWxlOnRoaXMsdXJsOnRoaXMuc3JjfSk7dmFyIGU9dC5vcHRpb25zLmVycm9yVGlsZVVybDtlJiYodGhpcy5zcmM9ZSksdC5fdGlsZUxvYWRlZCgpfX0pLG8udGlsZUxheWVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLlRpbGVMYXllcih0LGUpfSxvLlRpbGVMYXllci5XTVM9by5UaWxlTGF5ZXIuZXh0ZW5kKHtkZWZhdWx0V21zUGFyYW1zOntzZXJ2aWNlOiJXTVMiLHJlcXVlc3Q6IkdldE1hcCIsdmVyc2lvbjoiMS4xLjEiLGxheWVyczoiIixzdHlsZXM6IiIsZm9ybWF0OiJpbWFnZS9qcGVnIix0cmFuc3BhcmVudDohMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3VybD10O3ZhciBpPW8uZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdFdtc1BhcmFtcyksbj1lLnRpbGVTaXplfHx0aGlzLm9wdGlvbnMudGlsZVNpemU7ZS5kZXRlY3RSZXRpbmEmJm8uQnJvd3Nlci5yZXRpbmE/aS53aWR0aD1pLmhlaWdodD0yKm46aS53aWR0aD1pLmhlaWdodD1uO2Zvcih2YXIgcyBpbiBlKXRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShzKXx8ImNycyI9PT1zfHwoaVtzXT1lW3NdKTt0aGlzLndtc1BhcmFtcz1pLG8uc2V0T3B0aW9ucyh0aGlzLGUpfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9jcnM9dGhpcy5vcHRpb25zLmNyc3x8dC5vcHRpb25zLmNycyx0aGlzLl93bXNWZXJzaW9uPXBhcnNlRmxvYXQodGhpcy53bXNQYXJhbXMudmVyc2lvbik7dmFyIGU9dGhpcy5fd21zVmVyc2lvbj49MS4zPyJjcnMiOiJzcnMiO3RoaXMud21zUGFyYW1zW2VdPXRoaXMuX2Nycy5jb2RlLG8uVGlsZUxheWVyLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsdCl9LGdldFRpbGVVcmw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLGk9dGhpcy5vcHRpb25zLnRpbGVTaXplLG49dC5tdWx0aXBseUJ5KGkpLHM9bi5hZGQoW2ksaV0pLGE9dGhpcy5fY3JzLnByb2plY3QoZS51bnByb2plY3Qobix0LnopKSxyPXRoaXMuX2Nycy5wcm9qZWN0KGUudW5wcm9qZWN0KHMsdC56KSksaD10aGlzLl93bXNWZXJzaW9uPj0xLjMmJnRoaXMuX2Nycz09PW8uQ1JTLkVQU0c0MzI2P1tyLnksYS54LGEueSxyLnhdLmpvaW4oIiwiKTpbYS54LHIueSxyLngsYS55XS5qb2luKCIsIiksbD1vLlV0aWwudGVtcGxhdGUodGhpcy5fdXJsLHtzOnRoaXMuX2dldFN1YmRvbWFpbih0KX0pO3JldHVybiBsK28uVXRpbC5nZXRQYXJhbVN0cmluZyh0aGlzLndtc1BhcmFtcyxsLCEwKSsiJkJCT1g9IitofSxzZXRQYXJhbXM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gby5leHRlbmQodGhpcy53bXNQYXJhbXMsdCksZXx8dGhpcy5yZWRyYXcoKSx0aGlzfX0pLG8udGlsZUxheWVyLndtcz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgby5UaWxlTGF5ZXIuV01TKHQsZSl9LG8uVGlsZUxheWVyLkNhbnZhcz1vLlRpbGVMYXllci5leHRlbmQoe29wdGlvbnM6e2FzeW5jOiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe28uc2V0T3B0aW9ucyh0aGlzLHQpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9yZXNldCh7aGFyZDohMH0pLHRoaXMuX3VwZGF0ZSgpKTtmb3IodmFyIHQgaW4gdGhpcy5fdGlsZXMpdGhpcy5fcmVkcmF3VGlsZSh0aGlzLl90aWxlc1t0XSk7cmV0dXJuIHRoaXN9LF9yZWRyYXdUaWxlOmZ1bmN0aW9uKHQpe3RoaXMuZHJhd1RpbGUodCx0Ll90aWxlUG9pbnQsdGhpcy5fbWFwLl96b29tKX0sX2NyZWF0ZVRpbGU6ZnVuY3Rpb24oKXt2YXIgdD1vLkRvbVV0aWwuY3JlYXRlKCJjYW52YXMiLCJsZWFmbGV0LXRpbGUiKTtyZXR1cm4gdC53aWR0aD10LmhlaWdodD10aGlzLm9wdGlvbnMudGlsZVNpemUsdC5vbnNlbGVjdHN0YXJ0PXQub25tb3VzZW1vdmU9by5VdGlsLmZhbHNlRm4sdH0sX2xvYWRUaWxlOmZ1bmN0aW9uKHQsZSl7dC5fbGF5ZXI9dGhpcyx0Ll90aWxlUG9pbnQ9ZSx0aGlzLl9yZWRyYXdUaWxlKHQpLHRoaXMub3B0aW9ucy5hc3luY3x8dGhpcy50aWxlRHJhd24odCl9LGRyYXdUaWxlOmZ1bmN0aW9uKCl7fSx0aWxlRHJhd246ZnVuY3Rpb24odCl7dGhpcy5fdGlsZU9uTG9hZC5jYWxsKHQpfX0pLG8udGlsZUxheWVyLmNhbnZhcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8uVGlsZUxheWVyLkNhbnZhcyh0KX0sby5JbWFnZU92ZXJsYXk9by5DbGFzcy5leHRlbmQoe2luY2x1ZGVzOm8uTWl4aW4uRXZlbnRzLG9wdGlvbnM6e29wYWNpdHk6MX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5fdXJsPXQsdGhpcy5fYm91bmRzPW8ubGF0TG5nQm91bmRzKGUpLG8uc2V0T3B0aW9ucyh0aGlzLGkpfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dCx0aGlzLl9pbWFnZXx8dGhpcy5faW5pdEltYWdlKCksdC5fcGFuZXMub3ZlcmxheVBhbmUuYXBwZW5kQ2hpbGQodGhpcy5faW1hZ2UpLHQub24oInZpZXdyZXNldCIsdGhpcy5fcmVzZXQsdGhpcyksdC5vcHRpb25zLnpvb21BbmltYXRpb24mJm8uQnJvd3Nlci5hbnkzZCYmdC5vbigiem9vbWFuaW0iLHRoaXMuX2FuaW1hdGVab29tLHRoaXMpLHRoaXMuX3Jlc2V0KCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3QuZ2V0UGFuZXMoKS5vdmVybGF5UGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9pbWFnZSksdC5vZmYoInZpZXdyZXNldCIsdGhpcy5fcmVzZXQsdGhpcyksdC5vcHRpb25zLnpvb21BbmltYXRpb24mJnQub2ZmKCJ6b29tYW5pbSIsdGhpcy5fYW5pbWF0ZVpvb20sdGhpcyl9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZExheWVyKHRoaXMpLHRoaXN9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5fdXBkYXRlT3BhY2l0eSgpLHRoaXN9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbWFnZSYmdGhpcy5fbWFwLl9wYW5lcy5vdmVybGF5UGFuZS5hcHBlbmRDaGlsZCh0aGlzLl9pbWFnZSksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAuX3BhbmVzLm92ZXJsYXlQYW5lO3JldHVybiB0aGlzLl9pbWFnZSYmdC5pbnNlcnRCZWZvcmUodGhpcy5faW1hZ2UsdC5maXJzdENoaWxkKSx0aGlzfSxzZXRVcmw6ZnVuY3Rpb24odCl7dGhpcy5fdXJsPXQsdGhpcy5faW1hZ2Uuc3JjPXRoaXMuX3VybH0sZ2V0QXR0cmlidXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9ufSxfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dGhpcy5faW1hZ2U9by5Eb21VdGlsLmNyZWF0ZSgiaW1nIiwibGVhZmxldC1pbWFnZS1sYXllciIpLHRoaXMuX21hcC5vcHRpb25zLnpvb21BbmltYXRpb24mJm8uQnJvd3Nlci5hbnkzZD9vLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5faW1hZ2UsImxlYWZsZXQtem9vbS1hbmltYXRlZCIpOm8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9pbWFnZSwibGVhZmxldC16b29tLWhpZGUiKSx0aGlzLl91cGRhdGVPcGFjaXR5KCksby5leHRlbmQodGhpcy5faW1hZ2Use2dhbGxlcnlpbWc6Im5vIixvbnNlbGVjdHN0YXJ0Om8uVXRpbC5mYWxzZUZuLG9ubW91c2Vtb3ZlOm8uVXRpbC5mYWxzZUZuLG9ubG9hZDpvLmJpbmQodGhpcy5fb25JbWFnZUxvYWQsdGhpcyksc3JjOnRoaXMuX3VybH0pfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLGk9dGhpcy5faW1hZ2Usbj1lLmdldFpvb21TY2FsZSh0Lnpvb20pLHM9dGhpcy5fYm91bmRzLmdldE5vcnRoV2VzdCgpLGE9dGhpcy5fYm91bmRzLmdldFNvdXRoRWFzdCgpLHI9ZS5fbGF0TG5nVG9OZXdMYXllclBvaW50KHMsdC56b29tLHQuY2VudGVyKSxoPWUuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludChhLHQuem9vbSx0LmNlbnRlcikuX3N1YnRyYWN0KHIpLGw9ci5fYWRkKGguX211bHRpcGx5QnkoLjUqKDEtMS9uKSkpO2kuc3R5bGVbby5Eb21VdGlsLlRSQU5TRk9STV09by5Eb21VdGlsLmdldFRyYW5zbGF0ZVN0cmluZyhsKSsiIHNjYWxlKCIrbisiKSAifSxfcmVzZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbWFnZSxlPXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fYm91bmRzLmdldE5vcnRoV2VzdCgpKSxpPXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fYm91bmRzLmdldFNvdXRoRWFzdCgpKS5fc3VidHJhY3QoZSk7by5Eb21VdGlsLnNldFBvc2l0aW9uKHQsZSksdC5zdHlsZS53aWR0aD1pLngrInB4Iix0LnN0eWxlLmhlaWdodD1pLnkrInB4In0sX29uSW1hZ2VMb2FkOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJsb2FkIil9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7by5Eb21VdGlsLnNldE9wYWNpdHkodGhpcy5faW1hZ2UsdGhpcy5vcHRpb25zLm9wYWNpdHkpfX0pLG8uaW1hZ2VPdmVybGF5PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IG8uSW1hZ2VPdmVybGF5KHQsZSxpKX0sby5JY29uPW8uQ2xhc3MuZXh0ZW5kKHtvcHRpb25zOntjbGFzc05hbWU6IiJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7by5zZXRPcHRpb25zKHRoaXMsdCl9LGNyZWF0ZUljb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NyZWF0ZUljb24oImljb24iLHQpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NyZWF0ZUljb24oInNoYWRvdyIsdCl9LF9jcmVhdGVJY29uOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0SWNvblVybCh0KTtpZighaSl7aWYoImljb24iPT09dCl0aHJvdyBuZXcgRXJyb3IoImljb25Vcmwgbm90IHNldCBpbiBJY29uIG9wdGlvbnMgKHNlZSB0aGUgZG9jcykuIik7cmV0dXJuIG51bGx9dmFyIG47cmV0dXJuIG49ZSYmIklNRyI9PT1lLnRhZ05hbWU/dGhpcy5fY3JlYXRlSW1nKGksZSk6dGhpcy5fY3JlYXRlSW1nKGkpLHRoaXMuX3NldEljb25TdHlsZXMobix0KSxufSxfc2V0SWNvblN0eWxlczpmdW5jdGlvbih0LGUpe3ZhciBpLG49dGhpcy5vcHRpb25zLHM9by5wb2ludChuW2UrIlNpemUiXSk7aT0ic2hhZG93Ij09PWU/by5wb2ludChuLnNoYWRvd0FuY2hvcnx8bi5pY29uQW5jaG9yKTpvLnBvaW50KG4uaWNvbkFuY2hvciksIWkmJnMmJihpPXMuZGl2aWRlQnkoMiwhMCkpLHQuY2xhc3NOYW1lPSJsZWFmbGV0LW1hcmtlci0iK2UrIiAiK24uY2xhc3NOYW1lLGkmJih0LnN0eWxlLm1hcmdpbkxlZnQ9LWkueCsicHgiLHQuc3R5bGUubWFyZ2luVG9wPS1pLnkrInB4IikscyYmKHQuc3R5bGUud2lkdGg9cy54KyJweCIsdC5zdHlsZS5oZWlnaHQ9cy55KyJweCIpfSxfY3JlYXRlSW1nOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8ZS5jcmVhdGVFbGVtZW50KCJpbWciKSxpLnNyYz10LGl9LF9nZXRJY29uVXJsOmZ1bmN0aW9uKHQpe3JldHVybiBvLkJyb3dzZXIucmV0aW5hJiZ0aGlzLm9wdGlvbnNbdCsiUmV0aW5hVXJsIl0/dGhpcy5vcHRpb25zW3QrIlJldGluYVVybCJdOnRoaXMub3B0aW9uc1t0KyJVcmwiXX19KSxvLmljb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLkljb24odCl9LG8uSWNvbi5EZWZhdWx0PW8uSWNvbi5leHRlbmQoe29wdGlvbnM6e2ljb25TaXplOlsyNSw0MV0saWNvbkFuY2hvcjpbMTIsNDFdLHBvcHVwQW5jaG9yOlsxLC0zNF0sc2hhZG93U2l6ZTpbNDEsNDFdfSxfZ2V0SWNvblVybDpmdW5jdGlvbih0KXt2YXIgZT10KyJVcmwiO2lmKHRoaXMub3B0aW9uc1tlXSlyZXR1cm4gdGhpcy5vcHRpb25zW2VdO28uQnJvd3Nlci5yZXRpbmEmJiJpY29uIj09PXQmJih0Kz0iLTJ4Iik7dmFyIGk9by5JY29uLkRlZmF1bHQuaW1hZ2VQYXRoO2lmKCFpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgYXV0b2RldGVjdCBMLkljb24uRGVmYXVsdC5pbWFnZVBhdGgsIHNldCBpdCBtYW51YWxseS4iKTtyZXR1cm4gaSsiL21hcmtlci0iK3QrIi5wbmcifX0pLG8uSWNvbi5EZWZhdWx0LmltYWdlUGF0aD1mdW5jdGlvbigpe3ZhciB0LGksbixvLHMsYT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxyPS9bXC9eXWxlYWZsZXRbXC1cLl9dPyhbXHdcLVwuX10qKVwuanNcPz8vO2Zvcih0PTAsaT1hLmxlbmd0aDtpPnQ7dCsrKWlmKG49YVt0XS5zcmMsbz1uLm1hdGNoKHIpKXJldHVybiBzPW4uc3BsaXQocilbMF0sKHM/cysiLyI6IiIpKyJpbWFnZXMifSgpLG8uTWFya2VyPW8uQ2xhc3MuZXh0ZW5kKHtpbmNsdWRlczpvLk1peGluLkV2ZW50cyxvcHRpb25zOntpY29uOm5ldyBvLkljb24uRGVmYXVsdCx0aXRsZToiIixhbHQ6IiIsY2xpY2thYmxlOiEwLGRyYWdnYWJsZTohMSxrZXlib2FyZDohMCx6SW5kZXhPZmZzZXQ6MCxvcGFjaXR5OjEscmlzZU9uSG92ZXI6ITEscmlzZU9mZnNldDoyNTB9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtvLnNldE9wdGlvbnModGhpcyxlKSx0aGlzLl9sYXRsbmc9by5sYXRMbmcodCl9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHQub24oInZpZXdyZXNldCIsdGhpcy51cGRhdGUsdGhpcyksdGhpcy5faW5pdEljb24oKSx0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZSgiYWRkIiksdC5vcHRpb25zLnpvb21BbmltYXRpb24mJnQub3B0aW9ucy5tYXJrZXJab29tQW5pbWF0aW9uJiZ0Lm9uKCJ6b29tYW5pbSIsdGhpcy5fYW5pbWF0ZVpvb20sdGhpcyl9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZExheWVyKHRoaXMpLHRoaXN9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuZHJhZ2dpbmcmJnRoaXMuZHJhZ2dpbmcuZGlzYWJsZSgpLHRoaXMuX3JlbW92ZUljb24oKSx0aGlzLl9yZW1vdmVTaGFkb3coKSx0aGlzLmZpcmUoInJlbW92ZSIpLHQub2ZmKHt2aWV3cmVzZXQ6dGhpcy51cGRhdGUsem9vbWFuaW06dGhpcy5fYW5pbWF0ZVpvb219LHRoaXMpLHRoaXMuX21hcD1udWxsfSxnZXRMYXRMbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhdGxuZz1vLmxhdExuZyh0KSx0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZSgibW92ZSIse2xhdGxuZzp0aGlzLl9sYXRsbmd9KX0sc2V0WkluZGV4T2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuekluZGV4T2Zmc2V0PXQsdGhpcy51cGRhdGUoKSx0aGlzfSxzZXRJY29uOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuaWNvbj10LHRoaXMuX21hcCYmKHRoaXMuX2luaXRJY29uKCksdGhpcy51cGRhdGUoKSksdGhpcy5fcG9wdXAmJnRoaXMuYmluZFBvcHVwKHRoaXMuX3BvcHVwKSx0aGlzfSx1cGRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbiYmdGhpcy5fc2V0UG9zKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKS5yb3VuZCgpKSx0aGlzfSxfaW5pdEljb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsZT10aGlzLl9tYXAsaT1lLm9wdGlvbnMuem9vbUFuaW1hdGlvbiYmZS5vcHRpb25zLm1hcmtlclpvb21BbmltYXRpb24sbj1pPyJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiOiJsZWFmbGV0LXpvb20taGlkZSIscz10Lmljb24uY3JlYXRlSWNvbih0aGlzLl9pY29uKSxhPSExO3MhPT10aGlzLl9pY29uJiYodGhpcy5faWNvbiYmdGhpcy5fcmVtb3ZlSWNvbigpLGE9ITAsdC50aXRsZSYmKHMudGl0bGU9dC50aXRsZSksdC5hbHQmJihzLmFsdD10LmFsdCkpLG8uRG9tVXRpbC5hZGRDbGFzcyhzLG4pLHQua2V5Ym9hcmQmJihzLnRhYkluZGV4PSIwIiksdGhpcy5faWNvbj1zLHRoaXMuX2luaXRJbnRlcmFjdGlvbigpLHQucmlzZU9uSG92ZXImJm8uRG9tRXZlbnQub24ocywibW91c2VvdmVyIix0aGlzLl9icmluZ1RvRnJvbnQsdGhpcykub24ocywibW91c2VvdXQiLHRoaXMuX3Jlc2V0WkluZGV4LHRoaXMpO3ZhciByPXQuaWNvbi5jcmVhdGVTaGFkb3codGhpcy5fc2hhZG93KSxoPSExO3IhPT10aGlzLl9zaGFkb3cmJih0aGlzLl9yZW1vdmVTaGFkb3coKSxoPSEwKSxyJiZvLkRvbVV0aWwuYWRkQ2xhc3MocixuKSx0aGlzLl9zaGFkb3c9cix0Lm9wYWNpdHk8MSYmdGhpcy5fdXBkYXRlT3BhY2l0eSgpO3ZhciBsPXRoaXMuX21hcC5fcGFuZXM7YSYmbC5tYXJrZXJQYW5lLmFwcGVuZENoaWxkKHRoaXMuX2ljb24pLHImJmgmJmwuc2hhZG93UGFuZS5hcHBlbmRDaGlsZCh0aGlzLl9zaGFkb3cpfSxfcmVtb3ZlSWNvbjpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5yaXNlT25Ib3ZlciYmby5Eb21FdmVudC5vZmYodGhpcy5faWNvbiwibW91c2VvdmVyIix0aGlzLl9icmluZ1RvRnJvbnQpLm9mZih0aGlzLl9pY29uLCJtb3VzZW91dCIsdGhpcy5fcmVzZXRaSW5kZXgpLHRoaXMuX21hcC5fcGFuZXMubWFya2VyUGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9pY29uKSx0aGlzLl9pY29uPW51bGx9LF9yZW1vdmVTaGFkb3c6ZnVuY3Rpb24oKXt0aGlzLl9zaGFkb3cmJnRoaXMuX21hcC5fcGFuZXMuc2hhZG93UGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9zaGFkb3cpLHRoaXMuX3NoYWRvdz1udWxsfSxfc2V0UG9zOmZ1bmN0aW9uKHQpe28uRG9tVXRpbC5zZXRQb3NpdGlvbih0aGlzLl9pY29uLHQpLHRoaXMuX3NoYWRvdyYmby5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX3NoYWRvdyx0KSx0aGlzLl96SW5kZXg9dC55K3RoaXMub3B0aW9ucy56SW5kZXhPZmZzZXQsdGhpcy5fcmVzZXRaSW5kZXgoKX0sX3VwZGF0ZVpJbmRleDpmdW5jdGlvbih0KXt0aGlzLl9pY29uLnN0eWxlLnpJbmRleD10aGlzLl96SW5kZXgrdH0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpLnJvdW5kKCk7dGhpcy5fc2V0UG9zKGUpfSxfaW5pdEludGVyYWN0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmNsaWNrYWJsZSl7dmFyIHQ9dGhpcy5faWNvbixlPVsiZGJsY2xpY2siLCJtb3VzZWRvd24iLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il07by5Eb21VdGlsLmFkZENsYXNzKHQsImxlYWZsZXQtY2xpY2thYmxlIiksby5Eb21FdmVudC5vbih0LCJjbGljayIsdGhpcy5fb25Nb3VzZUNsaWNrLHRoaXMpLG8uRG9tRXZlbnQub24odCwia2V5cHJlc3MiLHRoaXMuX29uS2V5UHJlc3MsdGhpcyk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspby5Eb21FdmVudC5vbih0LGVbaV0sdGhpcy5fZmlyZU1vdXNlRXZlbnQsdGhpcyk7by5IYW5kbGVyLk1hcmtlckRyYWcmJih0aGlzLmRyYWdnaW5nPW5ldyBvLkhhbmRsZXIuTWFya2VyRHJhZyh0aGlzKSx0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlJiZ0aGlzLmRyYWdnaW5nLmVuYWJsZSgpKX19LF9vbk1vdXNlQ2xpY2s6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kcmFnZ2luZyYmdGhpcy5kcmFnZ2luZy5tb3ZlZCgpOyh0aGlzLmhhc0V2ZW50TGlzdGVuZXJzKHQudHlwZSl8fGUpJiZvLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbih0KSxlfHwodGhpcy5kcmFnZ2luZyYmdGhpcy5kcmFnZ2luZy5fZW5hYmxlZHx8IXRoaXMuX21hcC5kcmFnZ2luZ3x8IXRoaXMuX21hcC5kcmFnZ2luZy5tb3ZlZCgpKSYmdGhpcy5maXJlKHQudHlwZSx7b3JpZ2luYWxFdmVudDp0LGxhdGxuZzp0aGlzLl9sYXRsbmd9KX0sX29uS2V5UHJlc3M6ZnVuY3Rpb24odCl7MTM9PT10LmtleUNvZGUmJnRoaXMuZmlyZSgiY2xpY2siLHtvcmlnaW5hbEV2ZW50OnQsbGF0bG5nOnRoaXMuX2xhdGxuZ30pfSxfZmlyZU1vdXNlRXZlbnQ6ZnVuY3Rpb24odCl7dGhpcy5maXJlKHQudHlwZSx7b3JpZ2luYWxFdmVudDp0LGxhdGxuZzp0aGlzLl9sYXRsbmd9KSwiY29udGV4dG1lbnUiPT09dC50eXBlJiZ0aGlzLmhhc0V2ZW50TGlzdGVuZXJzKHQudHlwZSkmJm8uRG9tRXZlbnQucHJldmVudERlZmF1bHQodCksIm1vdXNlZG93biIhPT10LnR5cGU/by5Eb21FdmVudC5zdG9wUHJvcGFnYXRpb24odCk6by5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KX0sc2V0T3BhY2l0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzfSxfdXBkYXRlT3BhY2l0eTpmdW5jdGlvbigpe28uRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2ljb24sdGhpcy5vcHRpb25zLm9wYWNpdHkpLHRoaXMuX3NoYWRvdyYmby5Eb21VdGlsLnNldE9wYWNpdHkodGhpcy5fc2hhZG93LHRoaXMub3B0aW9ucy5vcGFjaXR5KX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVpJbmRleCh0aGlzLm9wdGlvbnMucmlzZU9mZnNldCl9LF9yZXNldFpJbmRleDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVpJbmRleCgwKX19KSxvLm1hcmtlcj1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgby5NYXJrZXIodCxlKX0sby5EaXZJY29uPW8uSWNvbi5leHRlbmQoe29wdGlvbnM6e2ljb25TaXplOlsxMiwxMl0sY2xhc3NOYW1lOiJsZWFmbGV0LWRpdi1pY29uIixodG1sOiExfSxjcmVhdGVJY29uOmZ1bmN0aW9uKHQpe3ZhciBpPXQmJiJESVYiPT09dC50YWdOYW1lP3Q6ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPXRoaXMub3B0aW9ucztyZXR1cm4gbi5odG1sIT09ITE/aS5pbm5lckhUTUw9bi5odG1sOmkuaW5uZXJIVE1MPSIiLG4uYmdQb3MmJihpLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbj0tbi5iZ1Bvcy54KyJweCAiKy1uLmJnUG9zLnkrInB4IiksdGhpcy5fc2V0SWNvblN0eWxlcyhpLCJpY29uIiksaX0sY3JlYXRlU2hhZG93OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fSksby5kaXZJY29uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5EaXZJY29uKHQpfSxvLk1hcC5tZXJnZU9wdGlvbnMoe2Nsb3NlUG9wdXBPbkNsaWNrOiEwfSksby5Qb3B1cD1vLkNsYXNzLmV4dGVuZCh7aW5jbHVkZXM6by5NaXhpbi5FdmVudHMsb3B0aW9uczp7bWluV2lkdGg6NTAsbWF4V2lkdGg6MzAwLGF1dG9QYW46ITAsY2xvc2VCdXR0b246ITAsb2Zmc2V0OlswLDddLGF1dG9QYW5QYWRkaW5nOls1LDVdLGtlZXBJblZpZXc6ITEsY2xhc3NOYW1lOiIiLHpvb21BbmltYXRpb246ITB9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtvLnNldE9wdGlvbnModGhpcyx0KSx0aGlzLl9zb3VyY2U9ZSx0aGlzLl9hbmltYXRlZD1vLkJyb3dzZXIuYW55M2QmJnRoaXMub3B0aW9ucy56b29tQW5pbWF0aW9uLHRoaXMuX2lzT3Blbj0hMX0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fY29udGFpbmVyfHx0aGlzLl9pbml0TGF5b3V0KCk7dmFyIGU9dC5vcHRpb25zLmZhZGVBbmltYXRpb247ZSYmby5Eb21VdGlsLnNldE9wYWNpdHkodGhpcy5fY29udGFpbmVyLDApLHQuX3BhbmVzLnBvcHVwUGFuZS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpLHQub24odGhpcy5fZ2V0RXZlbnRzKCksdGhpcyksdGhpcy51cGRhdGUoKSxlJiZvLkRvbVV0aWwuc2V0T3BhY2l0eSh0aGlzLl9jb250YWluZXIsMSksdGhpcy5maXJlKCJvcGVuIiksdC5maXJlKCJwb3B1cG9wZW4iLHtwb3B1cDp0aGlzfSksdGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2UuZmlyZSgicG9wdXBvcGVuIix7cG9wdXA6dGhpc30pfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRMYXllcih0aGlzKSx0aGlzfSxvcGVuT246ZnVuY3Rpb24odCl7cmV0dXJuIHQub3BlblBvcHVwKHRoaXMpLHRoaXN9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3QuX3BhbmVzLnBvcHVwUGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLG8uVXRpbC5mYWxzZUZuKHRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCksdC5vZmYodGhpcy5fZ2V0RXZlbnRzKCksdGhpcyksdC5vcHRpb25zLmZhZGVBbmltYXRpb24mJm8uRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2NvbnRhaW5lciwwKSx0aGlzLl9tYXA9bnVsbCx0aGlzLmZpcmUoImNsb3NlIiksdC5maXJlKCJwb3B1cGNsb3NlIix7cG9wdXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmdGhpcy5fc291cmNlLmZpcmUoInBvcHVwY2xvc2UiLHtwb3B1cDp0aGlzfSl9LGdldExhdExuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmd9LHNldExhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF0bG5nPW8ubGF0TG5nKHQpLHRoaXMuX21hcCYmKHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpcy5fYWRqdXN0UGFuKCkpLHRoaXN9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudH0sc2V0Q29udGVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29udGVudD10LHRoaXMudXBkYXRlKCksdGhpc30sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYodGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXMuX3VwZGF0ZUxheW91dCgpLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9IiIsdGhpcy5fYWRqdXN0UGFuKCkpfSxfZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3ZpZXdyZXNldDp0aGlzLl91cGRhdGVQb3NpdGlvbn07cmV0dXJuIHRoaXMuX2FuaW1hdGVkJiYodC56b29tYW5pbT10aGlzLl96b29tQW5pbWF0aW9uKSwoImNsb3NlT25DbGljayJpbiB0aGlzLm9wdGlvbnM/dGhpcy5vcHRpb25zLmNsb3NlT25DbGljazp0aGlzLl9tYXAub3B0aW9ucy5jbG9zZVBvcHVwT25DbGljaykmJih0LnByZWNsaWNrPXRoaXMuX2Nsb3NlKSx0aGlzLm9wdGlvbnMua2VlcEluVmlldyYmKHQubW92ZWVuZD10aGlzLl9hZGp1c3RQYW4pLHR9LF9jbG9zZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmdGhpcy5fbWFwLmNsb3NlUG9wdXAodGhpcyl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQsZT0ibGVhZmxldC1wb3B1cCIsaT1lKyIgIit0aGlzLm9wdGlvbnMuY2xhc3NOYW1lKyIgbGVhZmxldC16b29tLSIrKHRoaXMuX2FuaW1hdGVkPyJhbmltYXRlZCI6ImhpZGUiKSxuPXRoaXMuX2NvbnRhaW5lcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGkpO3RoaXMub3B0aW9ucy5jbG9zZUJ1dHRvbiYmKHQ9dGhpcy5fY2xvc2VCdXR0b249by5Eb21VdGlsLmNyZWF0ZSgiYSIsZSsiLWNsb3NlLWJ1dHRvbiIsbiksdC5ocmVmPSIjY2xvc2UiLHQuaW5uZXJIVE1MPSImIzIxNTsiLG8uRG9tRXZlbnQuZGlzYWJsZUNsaWNrUHJvcGFnYXRpb24odCksby5Eb21FdmVudC5vbih0LCJjbGljayIsdGhpcy5fb25DbG9zZUJ1dHRvbkNsaWNrLHRoaXMpKTt2YXIgcz10aGlzLl93cmFwcGVyPW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsZSsiLWNvbnRlbnQtd3JhcHBlciIsbik7by5Eb21FdmVudC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbihzKSx0aGlzLl9jb250ZW50Tm9kZT1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUrIi1jb250ZW50IixzKSxvLkRvbUV2ZW50LmRpc2FibGVTY3JvbGxQcm9wYWdhdGlvbih0aGlzLl9jb250ZW50Tm9kZSksby5Eb21FdmVudC5vbihzLCJjb250ZXh0bWVudSIsby5Eb21FdmVudC5zdG9wUHJvcGFnYXRpb24pLHRoaXMuX3RpcENvbnRhaW5lcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUrIi10aXAtY29udGFpbmVyIixuKSx0aGlzLl90aXA9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IixlKyItdGlwIix0aGlzLl90aXBDb250YWluZXIpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbigpe2lmKHRoaXMuX2NvbnRlbnQpe2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5fY29udGVudCl0aGlzLl9jb250ZW50Tm9kZS5pbm5lckhUTUw9dGhpcy5fY29udGVudDtlbHNle2Zvcig7dGhpcy5fY29udGVudE5vZGUuaGFzQ2hpbGROb2RlcygpOyl0aGlzLl9jb250ZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250ZW50Tm9kZS5maXJzdENoaWxkKTt0aGlzLl9jb250ZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLl9jb250ZW50KX10aGlzLmZpcmUoImNvbnRlbnR1cGRhdGUiKX19LF91cGRhdGVMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250ZW50Tm9kZSxlPXQuc3R5bGU7ZS53aWR0aD0iIixlLndoaXRlU3BhY2U9Im5vd3JhcCI7dmFyIGk9dC5vZmZzZXRXaWR0aDtpPU1hdGgubWluKGksdGhpcy5vcHRpb25zLm1heFdpZHRoKSxpPU1hdGgubWF4KGksdGhpcy5vcHRpb25zLm1pbldpZHRoKSxlLndpZHRoPWkrMSsicHgiLGUud2hpdGVTcGFjZT0iIixlLmhlaWdodD0iIjt2YXIgbj10Lm9mZnNldEhlaWdodCxzPXRoaXMub3B0aW9ucy5tYXhIZWlnaHQsYT0ibGVhZmxldC1wb3B1cC1zY3JvbGxlZCI7cyYmbj5zPyhlLmhlaWdodD1zKyJweCIsby5Eb21VdGlsLmFkZENsYXNzKHQsYSkpOm8uRG9tVXRpbC5yZW1vdmVDbGFzcyh0LGEpLHRoaXMuX2NvbnRhaW5lcldpZHRoPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aH0sX3VwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwKXt2YXIgdD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksZT10aGlzLl9hbmltYXRlZCxpPW8ucG9pbnQodGhpcy5vcHRpb25zLm9mZnNldCk7ZSYmby5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2NvbnRhaW5lcix0KSx0aGlzLl9jb250YWluZXJCb3R0b209LWkueS0oZT8wOnQueSksdGhpcy5fY29udGFpbmVyTGVmdD0tTWF0aC5yb3VuZCh0aGlzLl9jb250YWluZXJXaWR0aC8yKStpLngrKGU/MDp0LngpLHRoaXMuX2NvbnRhaW5lci5zdHlsZS5ib3R0b209dGhpcy5fY29udGFpbmVyQm90dG9tKyJweCIsdGhpcy5fY29udGFpbmVyLnN0eWxlLmxlZnQ9dGhpcy5fY29udGFpbmVyTGVmdCsicHgifX0sX3pvb21BbmltYXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlcik7by5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2NvbnRhaW5lcixlKX0sX2FkanVzdFBhbjpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5hdXRvUGFuKXt2YXIgdD10aGlzLl9tYXAsZT10aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0LGk9dGhpcy5fY29udGFpbmVyV2lkdGgsbj1uZXcgby5Qb2ludCh0aGlzLl9jb250YWluZXJMZWZ0LC1lLXRoaXMuX2NvbnRhaW5lckJvdHRvbSk7dGhpcy5fYW5pbWF0ZWQmJm4uX2FkZChvLkRvbVV0aWwuZ2V0UG9zaXRpb24odGhpcy5fY29udGFpbmVyKSk7dmFyIHM9dC5sYXllclBvaW50VG9Db250YWluZXJQb2ludChuKSxhPW8ucG9pbnQodGhpcy5vcHRpb25zLmF1dG9QYW5QYWRkaW5nKSxyPW8ucG9pbnQodGhpcy5vcHRpb25zLmF1dG9QYW5QYWRkaW5nVG9wTGVmdHx8YSksaD1vLnBvaW50KHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZ0JvdHRvbVJpZ2h0fHxhKSxsPXQuZ2V0U2l6ZSgpLHU9MCxjPTA7cy54K2kraC54PmwueCYmKHU9cy54K2ktbC54K2gueCkscy54LXUtci54PDAmJih1PXMueC1yLngpLHMueStlK2gueT5sLnkmJihjPXMueStlLWwueStoLnkpLHMueS1jLXIueTwwJiYoYz1zLnktci55KSwodXx8YykmJnQuZmlyZSgiYXV0b3BhbnN0YXJ0IikucGFuQnkoW3UsY10pfX0sX29uQ2xvc2VCdXR0b25DbGljazpmdW5jdGlvbih0KXt0aGlzLl9jbG9zZSgpLG8uRG9tRXZlbnQuc3RvcCh0KX19KSxvLnBvcHVwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLlBvcHVwKHQsZSl9LG8uTWFwLmluY2x1ZGUoe29wZW5Qb3B1cDpmdW5jdGlvbih0LGUsaSl7aWYodGhpcy5jbG9zZVBvcHVwKCksISh0IGluc3RhbmNlb2Ygby5Qb3B1cCkpe3ZhciBuPXQ7dD1uZXcgby5Qb3B1cChpKS5zZXRMYXRMbmcoZSkuc2V0Q29udGVudChuKX1yZXR1cm4gdC5faXNPcGVuPSEwLHRoaXMuX3BvcHVwPXQsdGhpcy5hZGRMYXllcih0KX0sY2xvc2VQb3B1cDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdCE9PXRoaXMuX3BvcHVwfHwodD10aGlzLl9wb3B1cCx0aGlzLl9wb3B1cD1udWxsKSx0JiYodGhpcy5yZW1vdmVMYXllcih0KSx0Ll9pc09wZW49ITEpLHRoaXN9fSksby5NYXJrZXIuaW5jbHVkZSh7b3BlblBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwJiZ0aGlzLl9tYXAmJiF0aGlzLl9tYXAuaGFzTGF5ZXIodGhpcy5fcG9wdXApJiYodGhpcy5fcG9wdXAuc2V0TGF0TG5nKHRoaXMuX2xhdGxuZyksdGhpcy5fbWFwLm9wZW5Qb3B1cCh0aGlzLl9wb3B1cCkpLHRoaXN9LGNsb3NlUG9wdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLl9jbG9zZSgpLHRoaXN9LHRvZ2dsZVBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwJiYodGhpcy5fcG9wdXAuX2lzT3Blbj90aGlzLmNsb3NlUG9wdXAoKTp0aGlzLm9wZW5Qb3B1cCgpKSx0aGlzfSxiaW5kUG9wdXA6ZnVuY3Rpb24odCxlKXt2YXIgaT1vLnBvaW50KHRoaXMub3B0aW9ucy5pY29uLm9wdGlvbnMucG9wdXBBbmNob3J8fFswLDBdKTtyZXR1cm4gaT1pLmFkZChvLlBvcHVwLnByb3RvdHlwZS5vcHRpb25zLm9mZnNldCksZSYmZS5vZmZzZXQmJihpPWkuYWRkKGUub2Zmc2V0KSksZT1vLmV4dGVuZCh7b2Zmc2V0Oml9LGUpLHRoaXMuX3BvcHVwSGFuZGxlcnNBZGRlZHx8KHRoaXMub24oImNsaWNrIix0aGlzLnRvZ2dsZVBvcHVwLHRoaXMpLm9uKCJyZW1vdmUiLHRoaXMuY2xvc2VQb3B1cCx0aGlzKS5vbigibW92ZSIsdGhpcy5fbW92ZVBvcHVwLHRoaXMpLHRoaXMuX3BvcHVwSGFuZGxlcnNBZGRlZD0hMCksdCBpbnN0YW5jZW9mIG8uUG9wdXA/KG8uc2V0T3B0aW9ucyh0LGUpLHRoaXMuX3BvcHVwPXQsdC5fc291cmNlPXRoaXMpOnRoaXMuX3BvcHVwPW5ldyBvLlBvcHVwKGUsdGhpcykuc2V0Q29udGVudCh0KSx0aGlzfSxzZXRQb3B1cENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5zZXRDb250ZW50KHQpLHRoaXN9LHVuYmluZFBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwJiYodGhpcy5fcG9wdXA9bnVsbCx0aGlzLm9mZigiY2xpY2siLHRoaXMudG9nZ2xlUG9wdXAsdGhpcykub2ZmKCJyZW1vdmUiLHRoaXMuY2xvc2VQb3B1cCx0aGlzKS5vZmYoIm1vdmUiLHRoaXMuX21vdmVQb3B1cCx0aGlzKSx0aGlzLl9wb3B1cEhhbmRsZXJzQWRkZWQ9ITEpLHRoaXN9LGdldFBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwfSxfbW92ZVBvcHVwOmZ1bmN0aW9uKHQpe3RoaXMuX3BvcHVwLnNldExhdExuZyh0LmxhdGxuZyl9fSksby5MYXllckdyb3VwPW8uQ2xhc3MuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX2xheWVycz17fTt2YXIgZSxpO2lmKHQpZm9yKGU9MCxpPXQubGVuZ3RoO2k+ZTtlKyspdGhpcy5hZGRMYXllcih0W2VdKX0sYWRkTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRMYXllcklkKHQpO3JldHVybiB0aGlzLl9sYXllcnNbZV09dCx0aGlzLl9tYXAmJnRoaXMuX21hcC5hZGRMYXllcih0KSx0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgZT10IGluIHRoaXMuX2xheWVycz90OnRoaXMuZ2V0TGF5ZXJJZCh0KTtyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9sYXllcnNbZV0mJnRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9sYXllcnNbZV0pLGRlbGV0ZSB0aGlzLl9sYXllcnNbZV0sdGhpc30saGFzTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dCBpbiB0aGlzLl9sYXllcnN8fHRoaXMuZ2V0TGF5ZXJJZCh0KWluIHRoaXMuX2xheWVyczohMX0sY2xlYXJMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIodGhpcy5yZW1vdmVMYXllcix0aGlzKSx0aGlzfSxpbnZva2U6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtmb3IoZSBpbiB0aGlzLl9sYXllcnMpaT10aGlzLl9sYXllcnNbZV0saVt0XSYmaVt0XS5hcHBseShpLG4pO3JldHVybiB0aGlzfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dCx0aGlzLmVhY2hMYXllcih0LmFkZExheWVyLHQpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLmVhY2hMYXllcih0LnJlbW92ZUxheWVyLHQpLHRoaXMuX21hcD1udWxsfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRMYXllcih0aGlzKSx0aGlzfSxlYWNoTGF5ZXI6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKXQuY2FsbChlLHRoaXMuX2xheWVyc1tpXSk7cmV0dXJuIHRoaXN9LGdldExheWVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sYXllcnNbdF19LGdldExheWVyczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLl9sYXllcnMpdC5wdXNoKHRoaXMuX2xheWVyc1tlXSk7cmV0dXJuIHR9LHNldFpJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZva2UoInNldFpJbmRleCIsdCl9LGdldExheWVySWQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8uc3RhbXAodCl9fSksby5sYXllckdyb3VwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5MYXllckdyb3VwKHQpfSxvLkZlYXR1cmVHcm91cD1vLkxheWVyR3JvdXAuZXh0ZW5kKHtpbmNsdWRlczpvLk1peGluLkV2ZW50cyxzdGF0aWNzOntFVkVOVFM6ImNsaWNrIGRibGNsaWNrIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgY29udGV4dG1lbnUgcG9wdXBvcGVuIHBvcHVwY2xvc2UifSxhZGRMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXNMYXllcih0KT90aGlzOigib24iaW4gdCYmdC5vbihvLkZlYXR1cmVHcm91cC5FVkVOVFMsdGhpcy5fcHJvcGFnYXRlRXZlbnQsdGhpcyksby5MYXllckdyb3VwLnByb3RvdHlwZS5hZGRMYXllci5jYWxsKHRoaXMsdCksdGhpcy5fcG9wdXBDb250ZW50JiZ0LmJpbmRQb3B1cCYmdC5iaW5kUG9wdXAodGhpcy5fcG9wdXBDb250ZW50LHRoaXMuX3BvcHVwT3B0aW9ucyksdGhpcy5maXJlKCJsYXllcmFkZCIse2xheWVyOnR9KSl9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhhc0xheWVyKHQpPyh0IGluIHRoaXMuX2xheWVycyYmKHQ9dGhpcy5fbGF5ZXJzW3RdKSwib2ZmImluIHQmJnQub2ZmKG8uRmVhdHVyZUdyb3VwLkVWRU5UUyx0aGlzLl9wcm9wYWdhdGVFdmVudCx0aGlzKSxvLkxheWVyR3JvdXAucHJvdG90eXBlLnJlbW92ZUxheWVyLmNhbGwodGhpcyx0KSx0aGlzLl9wb3B1cENvbnRlbnQmJnRoaXMuaW52b2tlKCJ1bmJpbmRQb3B1cCIpLHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjp0fSkpOnRoaXN9LGJpbmRQb3B1cDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9wb3B1cENvbnRlbnQ9dCx0aGlzLl9wb3B1cE9wdGlvbnM9ZSx0aGlzLmludm9rZSgiYmluZFBvcHVwIix0LGUpfSxvcGVuUG9wdXA6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuX2xheWVycyl7dGhpcy5fbGF5ZXJzW2VdLm9wZW5Qb3B1cCh0KTticmVha31yZXR1cm4gdGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52b2tlKCJzZXRTdHlsZSIsdCl9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludm9rZSgiYnJpbmdUb0Zyb250Iil9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW52b2tlKCJicmluZ1RvQmFjayIpfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgby5MYXRMbmdCb3VuZHM7cmV0dXJuIHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGUpe3QuZXh0ZW5kKGUgaW5zdGFuY2VvZiBvLk1hcmtlcj9lLmdldExhdExuZygpOmUuZ2V0Qm91bmRzKCkpfSksdH0sX3Byb3BhZ2F0ZUV2ZW50OmZ1bmN0aW9uKHQpe3Q9by5leHRlbmQoe2xheWVyOnQudGFyZ2V0LHRhcmdldDp0aGlzfSx0KSx0aGlzLmZpcmUodC50eXBlLHQpfX0pLG8uZmVhdHVyZUdyb3VwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5GZWF0dXJlR3JvdXAodCl9LG8uUGF0aD1vLkNsYXNzLmV4dGVuZCh7aW5jbHVkZXM6W28uTWl4aW4uRXZlbnRzXSxzdGF0aWNzOntDTElQX1BBRERJTkc6ZnVuY3Rpb24oKXt2YXIgZT1vLkJyb3dzZXIubW9iaWxlPzEyODA6MmUzLGk9KGUvTWF0aC5tYXgodC5vdXRlcldpZHRoLHQub3V0ZXJIZWlnaHQpLTEpLzI7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oLjUsaSkpfSgpfSxvcHRpb25zOntzdHJva2U6ITAsY29sb3I6IiMwMDMzZmYiLGRhc2hBcnJheTpudWxsLGxpbmVDYXA6bnVsbCxsaW5lSm9pbjpudWxsLHdlaWdodDo1LG9wYWNpdHk6LjUsZmlsbDohMSxmaWxsQ29sb3I6bnVsbCxmaWxsT3BhY2l0eTouMixjbGlja2FibGU6ITB9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7by5zZXRPcHRpb25zKHRoaXMsdCl9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHRoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2luaXRFbGVtZW50cygpLHRoaXMuX2luaXRFdmVudHMoKSksdGhpcy5wcm9qZWN0TGF0bG5ncygpLHRoaXMuX3VwZGF0ZVBhdGgoKSx0aGlzLl9jb250YWluZXImJnRoaXMuX21hcC5fcGF0aFJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLmZpcmUoImFkZCIpLHQub24oe3ZpZXdyZXNldDp0aGlzLnByb2plY3RMYXRsbmdzLG1vdmVlbmQ6dGhpcy5fdXBkYXRlUGF0aH0sdGhpcyl9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZExheWVyKHRoaXMpLHRoaXN9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3QuX3BhdGhSb290LnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lciksdGhpcy5maXJlKCJyZW1vdmUiKSx0aGlzLl9tYXA9bnVsbCxvLkJyb3dzZXIudm1sJiYodGhpcy5fY29udGFpbmVyPW51bGwsdGhpcy5fc3Ryb2tlPW51bGwsdGhpcy5fZmlsbD1udWxsKSx0Lm9mZih7dmlld3Jlc2V0OnRoaXMucHJvamVjdExhdGxuZ3MsbW92ZWVuZDp0aGlzLl91cGRhdGVQYXRofSx0aGlzKX0scHJvamVjdExhdGxuZ3M6ZnVuY3Rpb24oKXt9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiBvLnNldE9wdGlvbnModGhpcyx0KSx0aGlzLl9jb250YWluZXImJnRoaXMuX3VwZGF0ZVN0eWxlKCksdGhpc30scmVkcmF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmKHRoaXMucHJvamVjdExhdGxuZ3MoKSx0aGlzLl91cGRhdGVQYXRoKCkpLHRoaXN9fSksby5NYXAuaW5jbHVkZSh7X3VwZGF0ZVBhdGhWaWV3cG9ydDpmdW5jdGlvbigpe3ZhciB0PW8uUGF0aC5DTElQX1BBRERJTkcsZT10aGlzLmdldFNpemUoKSxpPW8uRG9tVXRpbC5nZXRQb3NpdGlvbih0aGlzLl9tYXBQYW5lKSxuPWkubXVsdGlwbHlCeSgtMSkuX3N1YnRyYWN0KGUubXVsdGlwbHlCeSh0KS5fcm91bmQoKSkscz1uLmFkZChlLm11bHRpcGx5QnkoMSsyKnQpLl9yb3VuZCgpKTt0aGlzLl9wYXRoVmlld3BvcnQ9bmV3IG8uQm91bmRzKG4scyl9fSksby5QYXRoLlNWR19OUz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLG8uQnJvd3Nlci5zdmc9ISghZS5jcmVhdGVFbGVtZW50TlN8fCFlLmNyZWF0ZUVsZW1lbnROUyhvLlBhdGguU1ZHX05TLCJzdmciKS5jcmVhdGVTVkdSZWN0KSxvLlBhdGg9by5QYXRoLmV4dGVuZCh7c3RhdGljczp7U1ZHOm8uQnJvd3Nlci5zdmd9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5fcGF0aFJvb3QsZT10aGlzLl9jb250YWluZXI7cmV0dXJuIGUmJnQubGFzdENoaWxkIT09ZSYmdC5hcHBlbmRDaGlsZChlKSx0aGlzfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5fcGF0aFJvb3QsZT10aGlzLl9jb250YWluZXIsaT10LmZpcnN0Q2hpbGQ7cmV0dXJuIGUmJmkhPT1lJiZ0Lmluc2VydEJlZm9yZShlLGkpLHRoaXN9LGdldFBhdGhTdHJpbmc6ZnVuY3Rpb24oKXt9LF9jcmVhdGVFbGVtZW50OmZ1bmN0aW9uKHQpe3JldHVybiBlLmNyZWF0ZUVsZW1lbnROUyhvLlBhdGguU1ZHX05TLHQpfSxfaW5pdEVsZW1lbnRzOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLl9pbml0UGF0aFJvb3QoKSx0aGlzLl9pbml0UGF0aCgpLHRoaXMuX2luaXRTdHlsZSgpfSxfaW5pdFBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXI9dGhpcy5fY3JlYXRlRWxlbWVudCgiZyIpLHRoaXMuX3BhdGg9dGhpcy5fY3JlYXRlRWxlbWVudCgicGF0aCIpLHRoaXMub3B0aW9ucy5jbGFzc05hbWUmJm8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9wYXRoLHRoaXMub3B0aW9ucy5jbGFzc05hbWUpLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9wYXRoKX0sX2luaXRTdHlsZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdHJva2UmJih0aGlzLl9wYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKSx0aGlzLl9wYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWxpbmVjYXAiLCJyb3VuZCIpKSx0aGlzLm9wdGlvbnMuZmlsbCYmdGhpcy5fcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGwtcnVsZSIsImV2ZW5vZGQiKSx0aGlzLm9wdGlvbnMucG9pbnRlckV2ZW50cyYmdGhpcy5fcGF0aC5zZXRBdHRyaWJ1dGUoInBvaW50ZXItZXZlbnRzIix0aGlzLm9wdGlvbnMucG9pbnRlckV2ZW50cyksdGhpcy5vcHRpb25zLmNsaWNrYWJsZXx8dGhpcy5vcHRpb25zLnBvaW50ZXJFdmVudHN8fHRoaXMuX3BhdGguc2V0QXR0cmlidXRlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKSx0aGlzLl91cGRhdGVTdHlsZSgpfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuc3Ryb2tlPyh0aGlzLl9wYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlIix0aGlzLm9wdGlvbnMuY29sb3IpLHRoaXMuX3BhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsdGhpcy5vcHRpb25zLm9wYWNpdHkpLHRoaXMuX3BhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLHRoaXMub3B0aW9ucy53ZWlnaHQpLHRoaXMub3B0aW9ucy5kYXNoQXJyYXk/dGhpcy5fcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNoYXJyYXkiLHRoaXMub3B0aW9ucy5kYXNoQXJyYXkpOnRoaXMuX3BhdGgucmVtb3ZlQXR0cmlidXRlKCJzdHJva2UtZGFzaGFycmF5IiksdGhpcy5vcHRpb25zLmxpbmVDYXAmJnRoaXMuX3BhdGguc2V0QXR0cmlidXRlKCJzdHJva2UtbGluZWNhcCIsdGhpcy5vcHRpb25zLmxpbmVDYXApLHRoaXMub3B0aW9ucy5saW5lSm9pbiYmdGhpcy5fcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIsdGhpcy5vcHRpb25zLmxpbmVKb2luKSk6dGhpcy5fcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsIm5vbmUiKSx0aGlzLm9wdGlvbnMuZmlsbD8odGhpcy5fcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGwiLHRoaXMub3B0aW9ucy5maWxsQ29sb3J8fHRoaXMub3B0aW9ucy5jb2xvciksdGhpcy5fcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsdGhpcy5vcHRpb25zLmZpbGxPcGFjaXR5KSk6dGhpcy5fcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGwiLCJub25lIil9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRQYXRoU3RyaW5nKCk7dHx8KHQ9Ik0wIDAiKSx0aGlzLl9wYXRoLnNldEF0dHJpYnV0ZSgiZCIsdCl9LF9pbml0RXZlbnRzOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmNsaWNrYWJsZSl7KG8uQnJvd3Nlci5zdmd8fCFvLkJyb3dzZXIudm1sKSYmby5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX3BhdGgsImxlYWZsZXQtY2xpY2thYmxlIiksby5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsImNsaWNrIix0aGlzLl9vbk1vdXNlQ2xpY2ssdGhpcyk7Zm9yKHZhciB0PVsiZGJsY2xpY2siLCJtb3VzZWRvd24iLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsIm1vdXNlbW92ZSIsImNvbnRleHRtZW51Il0sZT0wO2U8dC5sZW5ndGg7ZSsrKW8uRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLHRbZV0sdGhpcy5fZmlyZU1vdXNlRXZlbnQsdGhpcyl9fSxfb25Nb3VzZUNsaWNrOmZ1bmN0aW9uKHQpeyF0Ll9zaW11bGF0ZWQmJnRoaXMuX21hcC5kcmFnZ2luZyYmdGhpcy5fbWFwLmRyYWdnaW5nLm1vdmVkKCl8fHRoaXMuX2ZpcmVNb3VzZUV2ZW50KHQpfSxfZmlyZU1vdXNlRXZlbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy5fbWFwJiZ0aGlzLmhhc0V2ZW50TGlzdGVuZXJzKHQudHlwZSkpe3ZhciBlPXRoaXMuX21hcCxpPWUubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCksbj1lLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KGkpLHM9ZS5sYXllclBvaW50VG9MYXRMbmcobik7dGhpcy5maXJlKHQudHlwZSx7bGF0bG5nOnMsbGF5ZXJQb2ludDpuLGNvbnRhaW5lclBvaW50Omksb3JpZ2luYWxFdmVudDp0fSksImNvbnRleHRtZW51Ij09PXQudHlwZSYmby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KSwibW91c2Vtb3ZlIiE9PXQudHlwZSYmby5Eb21FdmVudC5zdG9wUHJvcGFnYXRpb24odCl9fX0pLG8uTWFwLmluY2x1ZGUoe19pbml0UGF0aFJvb3Q6ZnVuY3Rpb24oKXt0aGlzLl9wYXRoUm9vdHx8KHRoaXMuX3BhdGhSb290PW8uUGF0aC5wcm90b3R5cGUuX2NyZWF0ZUVsZW1lbnQoInN2ZyIpLHRoaXMuX3BhbmVzLm92ZXJsYXlQYW5lLmFwcGVuZENoaWxkKHRoaXMuX3BhdGhSb290KSx0aGlzLm9wdGlvbnMuem9vbUFuaW1hdGlvbiYmby5Ccm93c2VyLmFueTNkPyhvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fcGF0aFJvb3QsImxlYWZsZXQtem9vbS1hbmltYXRlZCIpLAp0aGlzLm9uKHt6b29tYW5pbTp0aGlzLl9hbmltYXRlUGF0aFpvb20sem9vbWVuZDp0aGlzLl9lbmRQYXRoWm9vbX0pKTpvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fcGF0aFJvb3QsImxlYWZsZXQtem9vbS1oaWRlIiksdGhpcy5vbigibW92ZWVuZCIsdGhpcy5fdXBkYXRlU3ZnVmlld3BvcnQpLHRoaXMuX3VwZGF0ZVN2Z1ZpZXdwb3J0KCkpfSxfYW5pbWF0ZVBhdGhab29tOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Wm9vbVNjYWxlKHQuem9vbSksaT10aGlzLl9nZXRDZW50ZXJPZmZzZXQodC5jZW50ZXIpLl9tdWx0aXBseUJ5KC1lKS5fYWRkKHRoaXMuX3BhdGhWaWV3cG9ydC5taW4pO3RoaXMuX3BhdGhSb290LnN0eWxlW28uRG9tVXRpbC5UUkFOU0ZPUk1dPW8uRG9tVXRpbC5nZXRUcmFuc2xhdGVTdHJpbmcoaSkrIiBzY2FsZSgiK2UrIikgIix0aGlzLl9wYXRoWm9vbWluZz0hMH0sX2VuZFBhdGhab29tOmZ1bmN0aW9uKCl7dGhpcy5fcGF0aFpvb21pbmc9ITF9LF91cGRhdGVTdmdWaWV3cG9ydDpmdW5jdGlvbigpe2lmKCF0aGlzLl9wYXRoWm9vbWluZyl7dGhpcy5fdXBkYXRlUGF0aFZpZXdwb3J0KCk7dmFyIHQ9dGhpcy5fcGF0aFZpZXdwb3J0LGU9dC5taW4saT10Lm1heCxuPWkueC1lLngscz1pLnktZS55LGE9dGhpcy5fcGF0aFJvb3Qscj10aGlzLl9wYW5lcy5vdmVybGF5UGFuZTtvLkJyb3dzZXIubW9iaWxlV2Via2l0JiZyLnJlbW92ZUNoaWxkKGEpLG8uRG9tVXRpbC5zZXRQb3NpdGlvbihhLGUpLGEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsbiksYS5zZXRBdHRyaWJ1dGUoImhlaWdodCIscyksYS5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLFtlLngsZS55LG4sc10uam9pbigiICIpKSxvLkJyb3dzZXIubW9iaWxlV2Via2l0JiZyLmFwcGVuZENoaWxkKGEpfX19KSxvLlBhdGguaW5jbHVkZSh7YmluZFBvcHVwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBvLlBvcHVwP3RoaXMuX3BvcHVwPXQ6KCghdGhpcy5fcG9wdXB8fGUpJiYodGhpcy5fcG9wdXA9bmV3IG8uUG9wdXAoZSx0aGlzKSksdGhpcy5fcG9wdXAuc2V0Q29udGVudCh0KSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkfHwodGhpcy5vbigiY2xpY2siLHRoaXMuX29wZW5Qb3B1cCx0aGlzKS5vbigicmVtb3ZlIix0aGlzLmNsb3NlUG9wdXAsdGhpcyksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkPSEwKSx0aGlzfSx1bmJpbmRQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cCYmKHRoaXMuX3BvcHVwPW51bGwsdGhpcy5vZmYoImNsaWNrIix0aGlzLl9vcGVuUG9wdXApLm9mZigicmVtb3ZlIix0aGlzLmNsb3NlUG9wdXApLHRoaXMuX3BvcHVwSGFuZGxlcnNBZGRlZD0hMSksdGhpc30sb3BlblBvcHVwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb3B1cCYmKHQ9dHx8dGhpcy5fbGF0bG5nfHx0aGlzLl9sYXRsbmdzW01hdGguZmxvb3IodGhpcy5fbGF0bG5ncy5sZW5ndGgvMildLHRoaXMuX29wZW5Qb3B1cCh7bGF0bG5nOnR9KSksdGhpc30sY2xvc2VQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuX2Nsb3NlKCksdGhpc30sX29wZW5Qb3B1cDpmdW5jdGlvbih0KXt0aGlzLl9wb3B1cC5zZXRMYXRMbmcodC5sYXRsbmcpLHRoaXMuX21hcC5vcGVuUG9wdXAodGhpcy5fcG9wdXApfX0pLG8uQnJvd3Nlci52bWw9IW8uQnJvd3Nlci5zdmcmJmZ1bmN0aW9uKCl7dHJ5e3ZhciB0PWUuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5pbm5lckhUTUw9Jzx2OnNoYXBlIGFkaj0iMSIvPic7dmFyIGk9dC5maXJzdENoaWxkO3JldHVybiBpLnN0eWxlLmJlaGF2aW9yPSJ1cmwoI2RlZmF1bHQjVk1MKSIsaSYmIm9iamVjdCI9PXR5cGVvZiBpLmFkan1jYXRjaChuKXtyZXR1cm4hMX19KCksby5QYXRoPW8uQnJvd3Nlci5zdmd8fCFvLkJyb3dzZXIudm1sP28uUGF0aDpvLlBhdGguZXh0ZW5kKHtzdGF0aWNzOntWTUw6ITAsQ0xJUF9QQURESU5HOi4wMn0sX2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUubmFtZXNwYWNlcy5hZGQoImx2bWwiLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIpLGZ1bmN0aW9uKHQpe3JldHVybiBlLmNyZWF0ZUVsZW1lbnQoIjxsdm1sOiIrdCsnIGNsYXNzPSJsdm1sIj4nKX19Y2F0Y2godCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmNyZWF0ZUVsZW1lbnQoIjwiK3QrJyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LmNvbTp2bWwiIGNsYXNzPSJsdm1sIj4nKX19fSgpLF9pbml0UGF0aDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRhaW5lcj10aGlzLl9jcmVhdGVFbGVtZW50KCJzaGFwZSIpO28uRG9tVXRpbC5hZGRDbGFzcyh0LCJsZWFmbGV0LXZtbC1zaGFwZSIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWU/IiAiK3RoaXMub3B0aW9ucy5jbGFzc05hbWU6IiIpKSx0aGlzLm9wdGlvbnMuY2xpY2thYmxlJiZvLkRvbVV0aWwuYWRkQ2xhc3ModCwibGVhZmxldC1jbGlja2FibGUiKSx0LmNvb3Jkc2l6ZT0iMSAxIix0aGlzLl9wYXRoPXRoaXMuX2NyZWF0ZUVsZW1lbnQoInBhdGgiKSx0LmFwcGVuZENoaWxkKHRoaXMuX3BhdGgpLHRoaXMuX21hcC5fcGF0aFJvb3QuYXBwZW5kQ2hpbGQodCl9LF9pbml0U3R5bGU6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVTdHlsZSgpfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdHJva2UsZT10aGlzLl9maWxsLGk9dGhpcy5vcHRpb25zLG49dGhpcy5fY29udGFpbmVyO24uc3Ryb2tlZD1pLnN0cm9rZSxuLmZpbGxlZD1pLmZpbGwsaS5zdHJva2U/KHR8fCh0PXRoaXMuX3N0cm9rZT10aGlzLl9jcmVhdGVFbGVtZW50KCJzdHJva2UiKSx0LmVuZGNhcD0icm91bmQiLG4uYXBwZW5kQ2hpbGQodCkpLHQud2VpZ2h0PWkud2VpZ2h0KyJweCIsdC5jb2xvcj1pLmNvbG9yLHQub3BhY2l0eT1pLm9wYWNpdHksaS5kYXNoQXJyYXk/dC5kYXNoU3R5bGU9by5VdGlsLmlzQXJyYXkoaS5kYXNoQXJyYXkpP2kuZGFzaEFycmF5LmpvaW4oIiAiKTppLmRhc2hBcnJheS5yZXBsYWNlKC8oICosICopL2csIiAiKTp0LmRhc2hTdHlsZT0iIixpLmxpbmVDYXAmJih0LmVuZGNhcD1pLmxpbmVDYXAucmVwbGFjZSgiYnV0dCIsImZsYXQiKSksaS5saW5lSm9pbiYmKHQuam9pbnN0eWxlPWkubGluZUpvaW4pKTp0JiYobi5yZW1vdmVDaGlsZCh0KSx0aGlzLl9zdHJva2U9bnVsbCksaS5maWxsPyhlfHwoZT10aGlzLl9maWxsPXRoaXMuX2NyZWF0ZUVsZW1lbnQoImZpbGwiKSxuLmFwcGVuZENoaWxkKGUpKSxlLmNvbG9yPWkuZmlsbENvbG9yfHxpLmNvbG9yLGUub3BhY2l0eT1pLmZpbGxPcGFjaXR5KTplJiYobi5yZW1vdmVDaGlsZChlKSx0aGlzLl9maWxsPW51bGwpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRhaW5lci5zdHlsZTt0LmRpc3BsYXk9Im5vbmUiLHRoaXMuX3BhdGgudj10aGlzLmdldFBhdGhTdHJpbmcoKSsiICIsdC5kaXNwbGF5PSIifX0pLG8uTWFwLmluY2x1ZGUoby5Ccm93c2VyLnN2Z3x8IW8uQnJvd3Nlci52bWw/e306e19pbml0UGF0aFJvb3Q6ZnVuY3Rpb24oKXtpZighdGhpcy5fcGF0aFJvb3Qpe3ZhciB0PXRoaXMuX3BhdGhSb290PWUuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc05hbWU9ImxlYWZsZXQtdm1sLWNvbnRhaW5lciIsdGhpcy5fcGFuZXMub3ZlcmxheVBhbmUuYXBwZW5kQ2hpbGQodCksdGhpcy5vbigibW92ZWVuZCIsdGhpcy5fdXBkYXRlUGF0aFZpZXdwb3J0KSx0aGlzLl91cGRhdGVQYXRoVmlld3BvcnQoKX19fSksby5Ccm93c2VyLmNhbnZhcz1mdW5jdGlvbigpe3JldHVybiEhZS5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0fSgpLG8uUGF0aD1vLlBhdGguU1ZHJiYhdC5MX1BSRUZFUl9DQU5WQVN8fCFvLkJyb3dzZXIuY2FudmFzP28uUGF0aDpvLlBhdGguZXh0ZW5kKHtzdGF0aWNzOntDQU5WQVM6ITAsU1ZHOiExfSxyZWRyYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiYodGhpcy5wcm9qZWN0TGF0bG5ncygpLHRoaXMuX3JlcXVlc3RVcGRhdGUoKSksdGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIG8uc2V0T3B0aW9ucyh0aGlzLHQpLHRoaXMuX2FkZExpbmVEYXNoKCksdGhpcy5fbWFwJiYodGhpcy5fdXBkYXRlU3R5bGUoKSx0aGlzLl9yZXF1ZXN0VXBkYXRlKCkpLHRoaXN9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3Qub2ZmKCJ2aWV3cmVzZXQiLHRoaXMucHJvamVjdExhdGxuZ3MsdGhpcykub2ZmKCJtb3ZlZW5kIix0aGlzLl91cGRhdGVQYXRoLHRoaXMpLHRoaXMub3B0aW9ucy5jbGlja2FibGUmJnRoaXMuX29uQ2xpY2shPT1pJiYodGhpcy5fbWFwLm9mZigiY2xpY2siLHRoaXMuX29uQ2xpY2ssdGhpcyksdGhpcy5fbWFwLm9mZigibW91c2Vtb3ZlIix0aGlzLl9vbk1vdXNlTW92ZSx0aGlzKSksdGhpcy5fcmVxdWVzdFVwZGF0ZSgpLHRoaXMuZmlyZSgicmVtb3ZlIiksdGhpcy5fbWFwPW51bGx9LF9yZXF1ZXN0VXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYhby5QYXRoLl91cGRhdGVSZXF1ZXN0JiYoby5QYXRoLl91cGRhdGVSZXF1ZXN0PW8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKHRoaXMuX2ZpcmVNYXBNb3ZlRW5kLHRoaXMuX21hcCkpfSxfZmlyZU1hcE1vdmVFbmQ6ZnVuY3Rpb24oKXtvLlBhdGguX3VwZGF0ZVJlcXVlc3Q9bnVsbCx0aGlzLmZpcmUoIm1vdmVlbmQiKX0sX2luaXRFbGVtZW50czpmdW5jdGlvbigpe3RoaXMuX21hcC5faW5pdFBhdGhSb290KCksdGhpcy5fY3R4PXRoaXMuX21hcC5fY2FudmFzQ3R4fSxfYWRkTGluZURhc2g6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuZGFzaEFycmF5JiYodGhpcy5vcHRpb25zLl9kYXNoQXJyYXk9dGhpcy5vcHRpb25zLmRhc2hBcnJheS5zcGxpdCgiLCIpLm1hcChOdW1iZXIpKX0sX3VwZGF0ZVN0eWxlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO3Quc3Ryb2tlJiYodGhpcy5fY3R4LmxpbmVXaWR0aD10LndlaWdodCx0aGlzLl9jdHguc3Ryb2tlU3R5bGU9dC5jb2xvciksdC5maWxsJiYodGhpcy5fY3R4LmZpbGxTdHlsZT10LmZpbGxDb2xvcnx8dC5jb2xvciksdC5saW5lQ2FwJiYodGhpcy5fY3R4LmxpbmVDYXA9dC5saW5lQ2FwKSx0LmxpbmVKb2luJiYodGhpcy5fY3R4LmxpbmVKb2luPXQubGluZUpvaW4pLHRoaXMuX2FkZExpbmVEYXNoKCl9LF9kcmF3UGF0aDpmdW5jdGlvbigpe3ZhciB0LGUsaSxuLHMsYTtmb3IodGhpcy5fY3R4LmJlZ2luUGF0aCgpLHRoaXMuX2N0eC5zZXRMaW5lRGFzaCh0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5fZGFzaEFycmF5fHxbXSksdD0wLGk9dGhpcy5fcGFydHMubGVuZ3RoO2k+dDt0Kyspe2ZvcihlPTAsbj10aGlzLl9wYXJ0c1t0XS5sZW5ndGg7bj5lO2UrKylzPXRoaXMuX3BhcnRzW3RdW2VdLGE9KDA9PT1lPyJtb3ZlIjoibGluZSIpKyJUbyIsdGhpcy5fY3R4W2FdKHMueCxzLnkpO3RoaXMgaW5zdGFuY2VvZiBvLlBvbHlnb24mJnRoaXMuX2N0eC5jbG9zZVBhdGgoKX19LF9jaGVja0lmRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fcGFydHMubGVuZ3RofSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe2lmKCF0aGlzLl9jaGVja0lmRW1wdHkoKSl7dmFyIHQ9dGhpcy5fY3R4LGU9dGhpcy5vcHRpb25zO3RoaXMuX2RyYXdQYXRoKCksdC5zYXZlKCksdGhpcy5fdXBkYXRlU3R5bGUoKSxlLmZpbGwmJih0Lmdsb2JhbEFscGhhPWUuZmlsbE9wYWNpdHksdC5maWxsKGUuZmlsbFJ1bGV8fCJldmVub2RkIikpLGUuc3Ryb2tlJiYodC5nbG9iYWxBbHBoYT1lLm9wYWNpdHksdC5zdHJva2UoKSksdC5yZXN0b3JlKCl9fSxfaW5pdEV2ZW50czpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5jbGlja2FibGUmJih0aGlzLl9tYXAub24oIm1vdXNlbW92ZSIsdGhpcy5fb25Nb3VzZU1vdmUsdGhpcyksdGhpcy5fbWFwLm9uKCJjbGljayBkYmxjbGljayBjb250ZXh0bWVudSIsdGhpcy5fZmlyZU1vdXNlRXZlbnQsdGhpcykpfSxfZmlyZU1vdXNlRXZlbnQ6ZnVuY3Rpb24odCl7dGhpcy5fY29udGFpbnNQb2ludCh0LmxheWVyUG9pbnQpJiZ0aGlzLmZpcmUodC50eXBlLHQpfSxfb25Nb3VzZU1vdmU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwJiYhdGhpcy5fbWFwLl9hbmltYXRpbmdab29tJiYodGhpcy5fY29udGFpbnNQb2ludCh0LmxheWVyUG9pbnQpPyh0aGlzLl9jdHguY2FudmFzLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy5fbW91c2VJbnNpZGU9ITAsdGhpcy5maXJlKCJtb3VzZW92ZXIiLHQpKTp0aGlzLl9tb3VzZUluc2lkZSYmKHRoaXMuX2N0eC5jYW52YXMuc3R5bGUuY3Vyc29yPSIiLHRoaXMuX21vdXNlSW5zaWRlPSExLHRoaXMuZmlyZSgibW91c2VvdXQiLHQpKSl9fSksby5NYXAuaW5jbHVkZShvLlBhdGguU1ZHJiYhdC5MX1BSRUZFUl9DQU5WQVN8fCFvLkJyb3dzZXIuY2FudmFzP3t9OntfaW5pdFBhdGhSb290OmZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzLl9wYXRoUm9vdDtpfHwoaT10aGlzLl9wYXRoUm9vdD1lLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGkuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0PXRoaXMuX2NhbnZhc0N0eD1pLmdldENvbnRleHQoIjJkIiksdC5saW5lQ2FwPSJyb3VuZCIsdC5saW5lSm9pbj0icm91bmQiLHRoaXMuX3BhbmVzLm92ZXJsYXlQYW5lLmFwcGVuZENoaWxkKGkpLHRoaXMub3B0aW9ucy56b29tQW5pbWF0aW9uJiYodGhpcy5fcGF0aFJvb3QuY2xhc3NOYW1lPSJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiLHRoaXMub24oInpvb21hbmltIix0aGlzLl9hbmltYXRlUGF0aFpvb20pLHRoaXMub24oInpvb21lbmQiLHRoaXMuX2VuZFBhdGhab29tKSksdGhpcy5vbigibW92ZWVuZCIsdGhpcy5fdXBkYXRlQ2FudmFzVmlld3BvcnQpLHRoaXMuX3VwZGF0ZUNhbnZhc1ZpZXdwb3J0KCkpfSxfdXBkYXRlQ2FudmFzVmlld3BvcnQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fcGF0aFpvb21pbmcpe3RoaXMuX3VwZGF0ZVBhdGhWaWV3cG9ydCgpO3ZhciB0PXRoaXMuX3BhdGhWaWV3cG9ydCxlPXQubWluLGk9dC5tYXguc3VidHJhY3QoZSksbj10aGlzLl9wYXRoUm9vdDtvLkRvbVV0aWwuc2V0UG9zaXRpb24obixlKSxuLndpZHRoPWkueCxuLmhlaWdodD1pLnksbi5nZXRDb250ZXh0KCIyZCIpLnRyYW5zbGF0ZSgtZS54LC1lLnkpfX19KSxvLkxpbmVVdGlsPXtzaW1wbGlmeTpmdW5jdGlvbih0LGUpe2lmKCFlfHwhdC5sZW5ndGgpcmV0dXJuIHQuc2xpY2UoKTt2YXIgaT1lKmU7cmV0dXJuIHQ9dGhpcy5fcmVkdWNlUG9pbnRzKHQsaSksdD10aGlzLl9zaW1wbGlmeURQKHQsaSl9LHBvaW50VG9TZWdtZW50RGlzdGFuY2U6ZnVuY3Rpb24odCxlLGkpe3JldHVybiBNYXRoLnNxcnQodGhpcy5fc3FDbG9zZXN0UG9pbnRPblNlZ21lbnQodCxlLGksITApKX0sY2xvc2VzdFBvaW50T25TZWdtZW50OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5fc3FDbG9zZXN0UG9pbnRPblNlZ21lbnQodCxlLGkpfSxfc2ltcGxpZnlEUDpmdW5jdGlvbih0LGUpe3ZhciBuPXQubGVuZ3RoLG89dHlwZW9mIFVpbnQ4QXJyYXkhPWkrIiI/VWludDhBcnJheTpBcnJheSxzPW5ldyBvKG4pO3NbMF09c1tuLTFdPTEsdGhpcy5fc2ltcGxpZnlEUFN0ZXAodCxzLGUsMCxuLTEpO3ZhciBhLHI9W107Zm9yKGE9MDtuPmE7YSsrKXNbYV0mJnIucHVzaCh0W2FdKTtyZXR1cm4gcn0sX3NpbXBsaWZ5RFBTdGVwOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIHMsYSxyLGg9MDtmb3IoYT1uKzE7by0xPj1hO2ErKylyPXRoaXMuX3NxQ2xvc2VzdFBvaW50T25TZWdtZW50KHRbYV0sdFtuXSx0W29dLCEwKSxyPmgmJihzPWEsaD1yKTtoPmkmJihlW3NdPTEsdGhpcy5fc2ltcGxpZnlEUFN0ZXAodCxlLGksbixzKSx0aGlzLl9zaW1wbGlmeURQU3RlcCh0LGUsaSxzLG8pKX0sX3JlZHVjZVBvaW50czpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bdFswXV0sbj0xLG89MCxzPXQubGVuZ3RoO3M+bjtuKyspdGhpcy5fc3FEaXN0KHRbbl0sdFtvXSk+ZSYmKGkucHVzaCh0W25dKSxvPW4pO3JldHVybiBzLTE+byYmaS5wdXNoKHRbcy0xXSksaX0sY2xpcFNlZ21lbnQ6ZnVuY3Rpb24odCxlLGksbil7dmFyIG8scyxhLHI9bj90aGlzLl9sYXN0Q29kZTp0aGlzLl9nZXRCaXRDb2RlKHQsaSksaD10aGlzLl9nZXRCaXRDb2RlKGUsaSk7Zm9yKHRoaXMuX2xhc3RDb2RlPWg7Oyl7aWYoIShyfGgpKXJldHVyblt0LGVdO2lmKHImaClyZXR1cm4hMTtvPXJ8fGgscz10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uKHQsZSxvLGkpLGE9dGhpcy5fZ2V0Qml0Q29kZShzLGkpLG89PT1yPyh0PXMscj1hKTooZT1zLGg9YSl9fSxfZ2V0RWRnZUludGVyc2VjdGlvbjpmdW5jdGlvbih0LGUsaSxuKXt2YXIgcz1lLngtdC54LGE9ZS55LXQueSxyPW4ubWluLGg9bi5tYXg7cmV0dXJuIDgmaT9uZXcgby5Qb2ludCh0LngrcyooaC55LXQueSkvYSxoLnkpOjQmaT9uZXcgby5Qb2ludCh0Lngrcyooci55LXQueSkvYSxyLnkpOjImaT9uZXcgby5Qb2ludChoLngsdC55K2EqKGgueC10LngpL3MpOjEmaT9uZXcgby5Qb2ludChyLngsdC55K2EqKHIueC10LngpL3MpOnZvaWQgMH0sX2dldEJpdENvZGU6ZnVuY3Rpb24odCxlKXt2YXIgaT0wO3JldHVybiB0Lng8ZS5taW4ueD9pfD0xOnQueD5lLm1heC54JiYoaXw9MiksdC55PGUubWluLnk/aXw9NDp0Lnk+ZS5tYXgueSYmKGl8PTgpLGl9LF9zcURpc3Q6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLngtdC54LG49ZS55LXQueTtyZXR1cm4gaSppK24qbn0sX3NxQ2xvc2VzdFBvaW50T25TZWdtZW50OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBzLGE9ZS54LHI9ZS55LGg9aS54LWEsbD1pLnktcix1PWgqaCtsKmw7cmV0dXJuIHU+MCYmKHM9KCh0LngtYSkqaCsodC55LXIpKmwpL3Uscz4xPyhhPWkueCxyPWkueSk6cz4wJiYoYSs9aCpzLHIrPWwqcykpLGg9dC54LWEsbD10LnktcixuP2gqaCtsKmw6bmV3IG8uUG9pbnQoYSxyKX19LG8uUG9seWxpbmU9by5QYXRoLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe28uUGF0aC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSksdGhpcy5fbGF0bG5ncz10aGlzLl9jb252ZXJ0TGF0TG5ncyh0KX0sb3B0aW9uczp7c21vb3RoRmFjdG9yOjEsbm9DbGlwOiExfSxwcm9qZWN0TGF0bG5nczpmdW5jdGlvbigpe3RoaXMuX29yaWdpbmFsUG9pbnRzPVtdO2Zvcih2YXIgdD0wLGU9dGhpcy5fbGF0bG5ncy5sZW5ndGg7ZT50O3QrKyl0aGlzLl9vcmlnaW5hbFBvaW50c1t0XT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZ3NbdF0pfSxnZXRQYXRoU3RyaW5nOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLl9wYXJ0cy5sZW5ndGgsaT0iIjtlPnQ7dCsrKWkrPXRoaXMuX2dldFBhdGhQYXJ0U3RyKHRoaXMuX3BhcnRzW3RdKTtyZXR1cm4gaX0sZ2V0TGF0TG5nczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmdzfSxzZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sYXRsbmdzPXRoaXMuX2NvbnZlcnRMYXRMbmdzKHQpLHRoaXMucmVkcmF3KCl9LGFkZExhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF0bG5ncy5wdXNoKG8ubGF0TG5nKHQpKSx0aGlzLnJlZHJhdygpfSxzcGxpY2VMYXRMbmdzOmZ1bmN0aW9uKCl7dmFyIHQ9W10uc3BsaWNlLmFwcGx5KHRoaXMuX2xhdGxuZ3MsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5fY29udmVydExhdExuZ3ModGhpcy5fbGF0bG5ncywhMCksdGhpcy5yZWRyYXcoKSx0fSxjbG9zZXN0TGF5ZXJQb2ludDpmdW5jdGlvbih0KXtmb3IodmFyIGUsaSxuPTEvMCxzPXRoaXMuX3BhcnRzLGE9bnVsbCxyPTAsaD1zLmxlbmd0aDtoPnI7cisrKWZvcih2YXIgbD1zW3JdLHU9MSxjPWwubGVuZ3RoO2M+dTt1Kyspe2U9bFt1LTFdLGk9bFt1XTt2YXIgZD1vLkxpbmVVdGlsLl9zcUNsb3Nlc3RQb2ludE9uU2VnbWVudCh0LGUsaSwhMCk7bj5kJiYobj1kLGE9by5MaW5lVXRpbC5fc3FDbG9zZXN0UG9pbnRPblNlZ21lbnQodCxlLGkpKX1yZXR1cm4gYSYmKGEuZGlzdGFuY2U9TWF0aC5zcXJ0KG4pKSxhfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8uTGF0TG5nQm91bmRzKHRoaXMuZ2V0TGF0TG5ncygpKX0sX2NvbnZlcnRMYXRMbmdzOmZ1bmN0aW9uKHQsZSl7dmFyIGksbixzPWU/dDpbXTtmb3IoaT0wLG49dC5sZW5ndGg7bj5pO2krKyl7aWYoby5VdGlsLmlzQXJyYXkodFtpXSkmJiJudW1iZXIiIT10eXBlb2YgdFtpXVswXSlyZXR1cm47c1tpXT1vLmxhdExuZyh0W2ldKX1yZXR1cm4gc30sX2luaXRFdmVudHM6ZnVuY3Rpb24oKXtvLlBhdGgucHJvdG90eXBlLl9pbml0RXZlbnRzLmNhbGwodGhpcyl9LF9nZXRQYXRoUGFydFN0cjpmdW5jdGlvbih0KXtmb3IodmFyIGUsaT1vLlBhdGguVk1MLG49MCxzPXQubGVuZ3RoLGE9IiI7cz5uO24rKyllPXRbbl0saSYmZS5fcm91bmQoKSxhKz0obj8iTCI6Ik0iKStlLngrIiAiK2UueTtyZXR1cm4gYX0sX2NsaXBQb2ludHM6ZnVuY3Rpb24oKXt2YXIgdCxlLGksbj10aGlzLl9vcmlnaW5hbFBvaW50cyxzPW4ubGVuZ3RoO2lmKHRoaXMub3B0aW9ucy5ub0NsaXApcmV0dXJuIHZvaWQodGhpcy5fcGFydHM9W25dKTt0aGlzLl9wYXJ0cz1bXTt2YXIgYT10aGlzLl9wYXJ0cyxyPXRoaXMuX21hcC5fcGF0aFZpZXdwb3J0LGg9by5MaW5lVXRpbDtmb3IodD0wLGU9MDtzLTE+dDt0KyspaT1oLmNsaXBTZWdtZW50KG5bdF0sblt0KzFdLHIsdCksaSYmKGFbZV09YVtlXXx8W10sYVtlXS5wdXNoKGlbMF0pLChpWzFdIT09blt0KzFdfHx0PT09cy0yKSYmKGFbZV0ucHVzaChpWzFdKSxlKyspKX0sX3NpbXBsaWZ5UG9pbnRzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3BhcnRzLGU9by5MaW5lVXRpbCxpPTAsbj10Lmxlbmd0aDtuPmk7aSsrKXRbaV09ZS5zaW1wbGlmeSh0W2ldLHRoaXMub3B0aW9ucy5zbW9vdGhGYWN0b3IpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX2NsaXBQb2ludHMoKSx0aGlzLl9zaW1wbGlmeVBvaW50cygpLG8uUGF0aC5wcm90b3R5cGUuX3VwZGF0ZVBhdGguY2FsbCh0aGlzKSl9fSksby5wb2x5bGluZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgby5Qb2x5bGluZSh0LGUpfSxvLlBvbHlVdGlsPXt9LG8uUG9seVV0aWwuY2xpcFBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgaSxuLHMsYSxyLGgsbCx1LGMsZD1bMSw0LDIsOF0scD1vLkxpbmVVdGlsO2ZvcihuPTAsbD10Lmxlbmd0aDtsPm47bisrKXRbbl0uX2NvZGU9cC5fZ2V0Qml0Q29kZSh0W25dLGUpO2ZvcihhPTA7ND5hO2ErKyl7Zm9yKHU9ZFthXSxpPVtdLG49MCxsPXQubGVuZ3RoLHM9bC0xO2w+bjtzPW4rKylyPXRbbl0saD10W3NdLHIuX2NvZGUmdT9oLl9jb2RlJnV8fChjPXAuX2dldEVkZ2VJbnRlcnNlY3Rpb24oaCxyLHUsZSksYy5fY29kZT1wLl9nZXRCaXRDb2RlKGMsZSksaS5wdXNoKGMpKTooaC5fY29kZSZ1JiYoYz1wLl9nZXRFZGdlSW50ZXJzZWN0aW9uKGgscix1LGUpLGMuX2NvZGU9cC5fZ2V0Qml0Q29kZShjLGUpLGkucHVzaChjKSksaS5wdXNoKHIpKTt0PWl9cmV0dXJuIHR9LG8uUG9seWdvbj1vLlBvbHlsaW5lLmV4dGVuZCh7b3B0aW9uczp7ZmlsbDohMH0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe28uUG9seWxpbmUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLHQsZSksdGhpcy5faW5pdFdpdGhIb2xlcyh0KX0sX2luaXRXaXRoSG9sZXM6ZnVuY3Rpb24odCl7dmFyIGUsaSxuO2lmKHQmJm8uVXRpbC5pc0FycmF5KHRbMF0pJiYibnVtYmVyIiE9dHlwZW9mIHRbMF1bMF0pZm9yKHRoaXMuX2xhdGxuZ3M9dGhpcy5fY29udmVydExhdExuZ3ModFswXSksdGhpcy5faG9sZXM9dC5zbGljZSgxKSxlPTAsaT10aGlzLl9ob2xlcy5sZW5ndGg7aT5lO2UrKyluPXRoaXMuX2hvbGVzW2VdPXRoaXMuX2NvbnZlcnRMYXRMbmdzKHRoaXMuX2hvbGVzW2VdKSxuWzBdLmVxdWFscyhuW24ubGVuZ3RoLTFdKSYmbi5wb3AoKTt0PXRoaXMuX2xhdGxuZ3MsdC5sZW5ndGg+PTImJnRbMF0uZXF1YWxzKHRbdC5sZW5ndGgtMV0pJiZ0LnBvcCgpfSxwcm9qZWN0TGF0bG5nczpmdW5jdGlvbigpe2lmKG8uUG9seWxpbmUucHJvdG90eXBlLnByb2plY3RMYXRsbmdzLmNhbGwodGhpcyksdGhpcy5faG9sZVBvaW50cz1bXSx0aGlzLl9ob2xlcyl7dmFyIHQsZSxpLG47Zm9yKHQ9MCxpPXRoaXMuX2hvbGVzLmxlbmd0aDtpPnQ7dCsrKWZvcih0aGlzLl9ob2xlUG9pbnRzW3RdPVtdLGU9MCxuPXRoaXMuX2hvbGVzW3RdLmxlbmd0aDtuPmU7ZSsrKXRoaXMuX2hvbGVQb2ludHNbdF1bZV09dGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9ob2xlc1t0XVtlXSl9fSxzZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZvLlV0aWwuaXNBcnJheSh0WzBdKSYmIm51bWJlciIhPXR5cGVvZiB0WzBdWzBdPyh0aGlzLl9pbml0V2l0aEhvbGVzKHQpLHRoaXMucmVkcmF3KCkpOm8uUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLHQpfSxfY2xpcFBvaW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX29yaWdpbmFsUG9pbnRzLGU9W107aWYodGhpcy5fcGFydHM9W3RdLmNvbmNhdCh0aGlzLl9ob2xlUG9pbnRzKSwhdGhpcy5vcHRpb25zLm5vQ2xpcCl7Zm9yKHZhciBpPTAsbj10aGlzLl9wYXJ0cy5sZW5ndGg7bj5pO2krKyl7dmFyIHM9by5Qb2x5VXRpbC5jbGlwUG9seWdvbih0aGlzLl9wYXJ0c1tpXSx0aGlzLl9tYXAuX3BhdGhWaWV3cG9ydCk7cy5sZW5ndGgmJmUucHVzaChzKX10aGlzLl9wYXJ0cz1lfX0sX2dldFBhdGhQYXJ0U3RyOmZ1bmN0aW9uKHQpe3ZhciBlPW8uUG9seWxpbmUucHJvdG90eXBlLl9nZXRQYXRoUGFydFN0ci5jYWxsKHRoaXMsdCk7cmV0dXJuIGUrKG8uQnJvd3Nlci5zdmc/InoiOiJ4Iil9fSksby5wb2x5Z29uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLlBvbHlnb24odCxlKX0sZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBvLkZlYXR1cmVHcm91cC5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxlKXt0aGlzLl9sYXllcnM9e30sdGhpcy5fb3B0aW9ucz1lLHRoaXMuc2V0TGF0TG5ncyh0KX0sc2V0TGF0TG5nczpmdW5jdGlvbihlKXt2YXIgaT0wLG49ZS5sZW5ndGg7Zm9yKHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKHQpe24+aT90LnNldExhdExuZ3MoZVtpKytdKTp0aGlzLnJlbW92ZUxheWVyKHQpfSx0aGlzKTtuPmk7KXRoaXMuYWRkTGF5ZXIobmV3IHQoZVtpKytdLHRoaXMuX29wdGlvbnMpKTtyZXR1cm4gdGhpc30sZ2V0TGF0TG5nczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbihlKXt0LnB1c2goZS5nZXRMYXRMbmdzKCkpfSksdH19KX1vLk11bHRpUG9seWxpbmU9dChvLlBvbHlsaW5lKSxvLk11bHRpUG9seWdvbj10KG8uUG9seWdvbiksby5tdWx0aVBvbHlsaW5lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLk11bHRpUG9seWxpbmUodCxlKX0sby5tdWx0aVBvbHlnb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8uTXVsdGlQb2x5Z29uKHQsZSl9fSgpLG8uUmVjdGFuZ2xlPW8uUG9seWdvbi5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtvLlBvbHlnb24ucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLHRoaXMuX2JvdW5kc1RvTGF0TG5ncyh0KSxlKX0sc2V0Qm91bmRzOmZ1bmN0aW9uKHQpe3RoaXMuc2V0TGF0TG5ncyh0aGlzLl9ib3VuZHNUb0xhdExuZ3ModCkpfSxfYm91bmRzVG9MYXRMbmdzOmZ1bmN0aW9uKHQpe3JldHVybiB0PW8ubGF0TG5nQm91bmRzKHQpLFt0LmdldFNvdXRoV2VzdCgpLHQuZ2V0Tm9ydGhXZXN0KCksdC5nZXROb3J0aEVhc3QoKSx0LmdldFNvdXRoRWFzdCgpXX19KSxvLnJlY3RhbmdsZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgby5SZWN0YW5nbGUodCxlKX0sby5DaXJjbGU9by5QYXRoLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsaSl7aWYoby5QYXRoLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxpKSxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoIkNpcmNsZSByYWRpdXMgY2Fubm90IGJlIE5hTiIpO3RoaXMuX2xhdGxuZz1vLmxhdExuZyh0KSx0aGlzLl9tUmFkaXVzPWV9LG9wdGlvbnM6e2ZpbGw6ITB9LHNldExhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF0bG5nPW8ubGF0TG5nKHQpLHRoaXMucmVkcmF3KCl9LHNldFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbVJhZGl1cz10LHRoaXMucmVkcmF3KCl9LHByb2plY3RMYXRsbmdzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TG5nUmFkaXVzKCksZT10aGlzLl9sYXRsbmcsaT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KFtlLmxhdCxlLmxuZy10XSk7dGhpcy5fcG9pbnQ9dGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludChlKSx0aGlzLl9yYWRpdXM9TWF0aC5tYXgodGhpcy5fcG9pbnQueC1pLngsMSl9LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldExuZ1JhZGl1cygpLGU9dGhpcy5fbVJhZGl1cy80MDA3NTAxNyozNjAsaT10aGlzLl9sYXRsbmc7cmV0dXJuIG5ldyBvLkxhdExuZ0JvdW5kcyhbaS5sYXQtZSxpLmxuZy10XSxbaS5sYXQrZSxpLmxuZyt0XSl9LGdldExhdExuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmd9LGdldFBhdGhTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wb2ludCxlPXRoaXMuX3JhZGl1cztyZXR1cm4gdGhpcy5fY2hlY2tJZkVtcHR5KCk/IiI6by5Ccm93c2VyLnN2Zz8iTSIrdC54KyIsIisodC55LWUpKyJBIitlKyIsIitlKyIsMCwxLDEsIisodC54LS4xKSsiLCIrKHQueS1lKSsiIHoiOih0Ll9yb3VuZCgpLGU9TWF0aC5yb3VuZChlKSwiQUwgIit0LngrIiwiK3QueSsiICIrZSsiLCIrZSsiIDAsMjM1OTI2MDAiKX0sZ2V0UmFkaXVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21SYWRpdXN9LF9nZXRMYXRSYWRpdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbVJhZGl1cy80MDA3NTAxNyozNjB9LF9nZXRMbmdSYWRpdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0TGF0UmFkaXVzKCkvTWF0aC5jb3Moby5MYXRMbmcuREVHX1RPX1JBRCp0aGlzLl9sYXRsbmcubGF0KX0sX2NoZWNrSWZFbXB0eTpmdW5jdGlvbigpe2lmKCF0aGlzLl9tYXApcmV0dXJuITE7dmFyIHQ9dGhpcy5fbWFwLl9wYXRoVmlld3BvcnQsZT10aGlzLl9yYWRpdXMsaT10aGlzLl9wb2ludDtyZXR1cm4gaS54LWU+dC5tYXgueHx8aS55LWU+dC5tYXgueXx8aS54K2U8dC5taW4ueHx8aS55K2U8dC5taW4ueX19KSxvLmNpcmNsZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5ldyBvLkNpcmNsZSh0LGUsaSl9LG8uQ2lyY2xlTWFya2VyPW8uQ2lyY2xlLmV4dGVuZCh7b3B0aW9uczp7cmFkaXVzOjEwLHdlaWdodDoyfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7by5DaXJjbGUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLHQsbnVsbCxlKSx0aGlzLl9yYWRpdXM9dGhpcy5vcHRpb25zLnJhZGl1c30scHJvamVjdExhdGxuZ3M6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyl9LF91cGRhdGVTdHlsZTpmdW5jdGlvbigpe28uQ2lyY2xlLnByb3RvdHlwZS5fdXBkYXRlU3R5bGUuY2FsbCh0aGlzKSx0aGlzLnNldFJhZGl1cyh0aGlzLm9wdGlvbnMucmFkaXVzKX0sc2V0TGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiBvLkNpcmNsZS5wcm90b3R5cGUuc2V0TGF0TG5nLmNhbGwodGhpcyx0KSx0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuX2lzT3BlbiYmdGhpcy5fcG9wdXAuc2V0TGF0TG5nKHQpLHRoaXN9LHNldFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnJhZGl1cz10aGlzLl9yYWRpdXM9dCx0aGlzLnJlZHJhdygpfSxnZXRSYWRpdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaXVzfX0pLG8uY2lyY2xlTWFya2VyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLkNpcmNsZU1hcmtlcih0LGUpfSxvLlBvbHlsaW5lLmluY2x1ZGUoby5QYXRoLkNBTlZBUz97X2NvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLHMsYSxyLGgsbCx1PXRoaXMub3B0aW9ucy53ZWlnaHQvMjtmb3Ioby5Ccm93c2VyLnRvdWNoJiYodSs9MTApLGk9MCxhPXRoaXMuX3BhcnRzLmxlbmd0aDthPmk7aSsrKWZvcihsPXRoaXMuX3BhcnRzW2ldLG49MCxyPWwubGVuZ3RoLHM9ci0xO3I+bjtzPW4rKylpZigoZXx8MCE9PW4pJiYoaD1vLkxpbmVVdGlsLnBvaW50VG9TZWdtZW50RGlzdGFuY2UodCxsW3NdLGxbbl0pLHU+PWgpKXJldHVybiEwO3JldHVybiExfX06e30pLG8uUG9seWdvbi5pbmNsdWRlKG8uUGF0aC5DQU5WQVM/e19jb250YWluc1BvaW50OmZ1bmN0aW9uKHQpe3ZhciBlLGksbixzLGEscixoLGwsdT0hMTtpZihvLlBvbHlsaW5lLnByb3RvdHlwZS5fY29udGFpbnNQb2ludC5jYWxsKHRoaXMsdCwhMCkpcmV0dXJuITA7Zm9yKHM9MCxoPXRoaXMuX3BhcnRzLmxlbmd0aDtoPnM7cysrKWZvcihlPXRoaXMuX3BhcnRzW3NdLGE9MCxsPWUubGVuZ3RoLHI9bC0xO2w+YTtyPWErKylpPWVbYV0sbj1lW3JdLGkueT50LnkhPW4ueT50LnkmJnQueDwobi54LWkueCkqKHQueS1pLnkpLyhuLnktaS55KStpLngmJih1PSF1KTtyZXR1cm4gdX19Ont9KSxvLkNpcmNsZS5pbmNsdWRlKG8uUGF0aC5DQU5WQVM/e19kcmF3UGF0aDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BvaW50O3RoaXMuX2N0eC5iZWdpblBhdGgoKSx0aGlzLl9jdHguYXJjKHQueCx0LnksdGhpcy5fcmFkaXVzLDAsMipNYXRoLlBJLCExKX0sX2NvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcG9pbnQsaT10aGlzLm9wdGlvbnMuc3Ryb2tlP3RoaXMub3B0aW9ucy53ZWlnaHQvMjowO3JldHVybiB0LmRpc3RhbmNlVG8oZSk8PXRoaXMuX3JhZGl1cytpfX06e30pLG8uQ2lyY2xlTWFya2VyLmluY2x1ZGUoby5QYXRoLkNBTlZBUz97X3VwZGF0ZVN0eWxlOmZ1bmN0aW9uKCl7by5QYXRoLnByb3RvdHlwZS5fdXBkYXRlU3R5bGUuY2FsbCh0aGlzKX19Ont9KSxvLkdlb0pTT049by5GZWF0dXJlR3JvdXAuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7by5zZXRPcHRpb25zKHRoaXMsZSksdGhpcy5fbGF5ZXJzPXt9LHQmJnRoaXMuYWRkRGF0YSh0KX0sYWRkRGF0YTpmdW5jdGlvbih0KXt2YXIgZSxpLG4scz1vLlV0aWwuaXNBcnJheSh0KT90OnQuZmVhdHVyZXM7aWYocyl7Zm9yKGU9MCxpPXMubGVuZ3RoO2k+ZTtlKyspbj1zW2VdLChuLmdlb21ldHJpZXN8fG4uZ2VvbWV0cnl8fG4uZmVhdHVyZXN8fG4uY29vcmRpbmF0ZXMpJiZ0aGlzLmFkZERhdGEoc1tlXSk7cmV0dXJuIHRoaXN9dmFyIGE9dGhpcy5vcHRpb25zO2lmKCFhLmZpbHRlcnx8YS5maWx0ZXIodCkpe3ZhciByPW8uR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIodCxhLnBvaW50VG9MYXllcixhLmNvb3Jkc1RvTGF0TG5nLGEpO3JldHVybiByLmZlYXR1cmU9by5HZW9KU09OLmFzRmVhdHVyZSh0KSxyLmRlZmF1bHRPcHRpb25zPXIub3B0aW9ucyx0aGlzLnJlc2V0U3R5bGUociksYS5vbkVhY2hGZWF0dXJlJiZhLm9uRWFjaEZlYXR1cmUodCxyKSx0aGlzLmFkZExheWVyKHIpfX0scmVzZXRTdHlsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMuc3R5bGU7ZSYmKG8uVXRpbC5leHRlbmQodC5vcHRpb25zLHQuZGVmYXVsdE9wdGlvbnMpLHRoaXMuX3NldExheWVyU3R5bGUodCxlKSl9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3RoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGUpe3RoaXMuX3NldExheWVyU3R5bGUoZSx0KX0sdGhpcyl9LF9zZXRMYXllclN0eWxlOmZ1bmN0aW9uKHQsZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihlPWUodC5mZWF0dXJlKSksdC5zZXRTdHlsZSYmdC5zZXRTdHlsZShlKX19KSxvLmV4dGVuZChvLkdlb0pTT04se2dlb21ldHJ5VG9MYXllcjpmdW5jdGlvbih0LGUsaSxuKXt2YXIgcyxhLHIsaCxsPSJGZWF0dXJlIj09PXQudHlwZT90Lmdlb21ldHJ5OnQsdT1sLmNvb3JkaW5hdGVzLGM9W107c3dpdGNoKGk9aXx8dGhpcy5jb29yZHNUb0xhdExuZyxsLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiBzPWkodSksZT9lKHQscyk6bmV3IG8uTWFya2VyKHMpO2Nhc2UiTXVsdGlQb2ludCI6Zm9yKHI9MCxoPXUubGVuZ3RoO2g+cjtyKyspcz1pKHVbcl0pLGMucHVzaChlP2UodCxzKTpuZXcgby5NYXJrZXIocykpO3JldHVybiBuZXcgby5GZWF0dXJlR3JvdXAoYyk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gYT10aGlzLmNvb3Jkc1RvTGF0TG5ncyh1LDAsaSksbmV3IG8uUG9seWxpbmUoYSxuKTtjYXNlIlBvbHlnb24iOmlmKDI9PT11Lmxlbmd0aCYmIXVbMV0ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBHZW9KU09OIG9iamVjdC4iKTtyZXR1cm4gYT10aGlzLmNvb3Jkc1RvTGF0TG5ncyh1LDEsaSksbmV3IG8uUG9seWdvbihhLG4pO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjpyZXR1cm4gYT10aGlzLmNvb3Jkc1RvTGF0TG5ncyh1LDEsaSksbmV3IG8uTXVsdGlQb2x5bGluZShhLG4pO2Nhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gYT10aGlzLmNvb3Jkc1RvTGF0TG5ncyh1LDIsaSksbmV3IG8uTXVsdGlQb2x5Z29uKGEsbik7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTAsaD1sLmdlb21ldHJpZXMubGVuZ3RoO2g+cjtyKyspYy5wdXNoKHRoaXMuZ2VvbWV0cnlUb0xheWVyKHtnZW9tZXRyeTpsLmdlb21ldHJpZXNbcl0sdHlwZToiRmVhdHVyZSIscHJvcGVydGllczp0LnByb3BlcnRpZXN9LGUsaSxuKSk7cmV0dXJuIG5ldyBvLkZlYXR1cmVHcm91cChjKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBHZW9KU09OIG9iamVjdC4iKX19LGNvb3Jkc1RvTGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5MYXRMbmcodFsxXSx0WzBdLHRbMl0pfSxjb29yZHNUb0xhdExuZ3M6ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG8scyxhPVtdO2ZvcihvPTAscz10Lmxlbmd0aDtzPm87bysrKW49ZT90aGlzLmNvb3Jkc1RvTGF0TG5ncyh0W29dLGUtMSxpKTooaXx8dGhpcy5jb29yZHNUb0xhdExuZykodFtvXSksYS5wdXNoKG4pO3JldHVybiBhfSxsYXRMbmdUb0Nvb3JkczpmdW5jdGlvbih0KXt2YXIgZT1bdC5sbmcsdC5sYXRdO3JldHVybiB0LmFsdCE9PWkmJmUucHVzaCh0LmFsdCksZX0sbGF0TG5nc1RvQ29vcmRzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPTAsbj10Lmxlbmd0aDtuPmk7aSsrKWUucHVzaChvLkdlb0pTT04ubGF0TG5nVG9Db29yZHModFtpXSkpO3JldHVybiBlfSxnZXRGZWF0dXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZmVhdHVyZT9vLmV4dGVuZCh7fSx0LmZlYXR1cmUse2dlb21ldHJ5OmV9KTpvLkdlb0pTT04uYXNGZWF0dXJlKGUpfSxhc0ZlYXR1cmU6ZnVuY3Rpb24odCl7cmV0dXJuIkZlYXR1cmUiPT09dC50eXBlP3Q6e3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e30sZ2VvbWV0cnk6dH19fSk7dmFyIGE9e3RvR2VvSlNPTjpmdW5jdGlvbigpe3JldHVybiBvLkdlb0pTT04uZ2V0RmVhdHVyZSh0aGlzLHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6by5HZW9KU09OLmxhdExuZ1RvQ29vcmRzKHRoaXMuZ2V0TGF0TG5nKCkpfSl9fTtvLk1hcmtlci5pbmNsdWRlKGEpLG8uQ2lyY2xlLmluY2x1ZGUoYSksby5DaXJjbGVNYXJrZXIuaW5jbHVkZShhKSxvLlBvbHlsaW5lLmluY2x1ZGUoe3RvR2VvSlNPTjpmdW5jdGlvbigpe3JldHVybiBvLkdlb0pTT04uZ2V0RmVhdHVyZSh0aGlzLHt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpvLkdlb0pTT04ubGF0TG5nc1RvQ29vcmRzKHRoaXMuZ2V0TGF0TG5ncygpKX0pfX0pLG8uUG9seWdvbi5pbmNsdWRlKHt0b0dlb0pTT046ZnVuY3Rpb24oKXt2YXIgdCxlLGksbj1bby5HZW9KU09OLmxhdExuZ3NUb0Nvb3Jkcyh0aGlzLmdldExhdExuZ3MoKSldO2lmKG5bMF0ucHVzaChuWzBdWzBdKSx0aGlzLl9ob2xlcylmb3IodD0wLGU9dGhpcy5faG9sZXMubGVuZ3RoO2U+dDt0KyspaT1vLkdlb0pTT04ubGF0TG5nc1RvQ29vcmRzKHRoaXMuX2hvbGVzW3RdKSxpLnB1c2goaVswXSksbi5wdXNoKGkpO3JldHVybiBvLkdlb0pTT04uZ2V0RmVhdHVyZSh0aGlzLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpufSl9fSksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbih0KXtlLnB1c2godC50b0dlb0pTT04oKS5nZW9tZXRyeS5jb29yZGluYXRlcyl9KSxvLkdlb0pTT04uZ2V0RmVhdHVyZSh0aGlzLHt0eXBlOnQsY29vcmRpbmF0ZXM6ZX0pfX1vLk11bHRpUG9seWxpbmUuaW5jbHVkZSh7dG9HZW9KU09OOnQoIk11bHRpTGluZVN0cmluZyIpfSksby5NdWx0aVBvbHlnb24uaW5jbHVkZSh7dG9HZW9KU09OOnQoIk11bHRpUG9seWdvbiIpfSksby5MYXllckdyb3VwLmluY2x1ZGUoe3RvR2VvSlNPTjpmdW5jdGlvbigpe3ZhciBlLGk9dGhpcy5mZWF0dXJlJiZ0aGlzLmZlYXR1cmUuZ2VvbWV0cnksbj1bXTtpZihpJiYiTXVsdGlQb2ludCI9PT1pLnR5cGUpcmV0dXJuIHQoIk11bHRpUG9pbnQiKS5jYWxsKHRoaXMpO3ZhciBzPWkmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09aS50eXBlO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbih0KXt0LnRvR2VvSlNPTiYmKGU9dC50b0dlb0pTT04oKSxuLnB1c2gocz9lLmdlb21ldHJ5Om8uR2VvSlNPTi5hc0ZlYXR1cmUoZSkpKX0pLHM/by5HZW9KU09OLmdldEZlYXR1cmUodGhpcyx7Z2VvbWV0cmllczpuLHR5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiJ9KTp7dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOm59fX0pfSgpLG8uZ2VvSnNvbj1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgby5HZW9KU09OKHQsZSl9LG8uRG9tRXZlbnQ9e2FkZExpc3RlbmVyOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBzLGEscixoPW8uc3RhbXAoaSksbD0iX2xlYWZsZXRfIitlK2g7cmV0dXJuIHRbbF0/dGhpczoocz1mdW5jdGlvbihlKXtyZXR1cm4gaS5jYWxsKG58fHQsZXx8by5Eb21FdmVudC5fZ2V0RXZlbnQoKSl9LG8uQnJvd3Nlci5wb2ludGVyJiYwPT09ZS5pbmRleE9mKCJ0b3VjaCIpP3RoaXMuYWRkUG9pbnRlckxpc3RlbmVyKHQsZSxzLGgpOihvLkJyb3dzZXIudG91Y2gmJiJkYmxjbGljayI9PT1lJiZ0aGlzLmFkZERvdWJsZVRhcExpc3RlbmVyJiZ0aGlzLmFkZERvdWJsZVRhcExpc3RlbmVyKHQscyxoKSwiYWRkRXZlbnRMaXN0ZW5lciJpbiB0PyJtb3VzZXdoZWVsIj09PWU/KHQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLHMsITEpLHQuYWRkRXZlbnRMaXN0ZW5lcihlLHMsITEpKToibW91c2VlbnRlciI9PT1lfHwibW91c2VsZWF2ZSI9PT1lPyhhPXMscj0ibW91c2VlbnRlciI9PT1lPyJtb3VzZW92ZXIiOiJtb3VzZW91dCIscz1mdW5jdGlvbihlKXtyZXR1cm4gby5Eb21FdmVudC5fY2hlY2tNb3VzZSh0LGUpP2EoZSk6dm9pZCAwfSx0LmFkZEV2ZW50TGlzdGVuZXIocixzLCExKSk6ImNsaWNrIj09PWUmJm8uQnJvd3Nlci5hbmRyb2lkPyhhPXMscz1mdW5jdGlvbih0KXtyZXR1cm4gby5Eb21FdmVudC5fZmlsdGVyQ2xpY2sodCxhKX0sdC5hZGRFdmVudExpc3RlbmVyKGUscywhMSkpOnQuYWRkRXZlbnRMaXN0ZW5lcihlLHMsITEpOiJhdHRhY2hFdmVudCJpbiB0JiZ0LmF0dGFjaEV2ZW50KCJvbiIrZSxzKSx0W2xdPXMsdGhpcykpfSxyZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49by5zdGFtcChpKSxzPSJfbGVhZmxldF8iK2UrbixhPXRbc107cmV0dXJuIGE/KG8uQnJvd3Nlci5wb2ludGVyJiYwPT09ZS5pbmRleE9mKCJ0b3VjaCIpP3RoaXMucmVtb3ZlUG9pbnRlckxpc3RlbmVyKHQsZSxuKTpvLkJyb3dzZXIudG91Y2gmJiJkYmxjbGljayI9PT1lJiZ0aGlzLnJlbW92ZURvdWJsZVRhcExpc3RlbmVyP3RoaXMucmVtb3ZlRG91YmxlVGFwTGlzdGVuZXIodCxuKToicmVtb3ZlRXZlbnRMaXN0ZW5lciJpbiB0PyJtb3VzZXdoZWVsIj09PWU/KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGEsITEpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGEsITEpKToibW91c2VlbnRlciI9PT1lfHwibW91c2VsZWF2ZSI9PT1lP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciI9PT1lPyJtb3VzZW92ZXIiOiJtb3VzZW91dCIsYSwhMSk6dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsYSwhMSk6ImRldGFjaEV2ZW50ImluIHQmJnQuZGV0YWNoRXZlbnQoIm9uIitlLGEpLHRbc109bnVsbCx0aGlzKTp0aGlzfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3RvcFByb3BhZ2F0aW9uP3Quc3RvcFByb3BhZ2F0aW9uKCk6dC5jYW5jZWxCdWJibGU9ITAsby5Eb21FdmVudC5fc2tpcHBlZCh0KSx0aGlzfSxkaXNhYmxlU2Nyb2xsUHJvcGFnYXRpb246ZnVuY3Rpb24odCl7dmFyIGU9by5Eb21FdmVudC5zdG9wUHJvcGFnYXRpb247cmV0dXJuIG8uRG9tRXZlbnQub24odCwibW91c2V3aGVlbCIsZSkub24odCwiTW96TW91c2VQaXhlbFNjcm9sbCIsZSl9LGRpc2FibGVDbGlja1Byb3BhZ2F0aW9uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1vLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbixpPW8uRHJhZ2dhYmxlLlNUQVJULmxlbmd0aC0xO2k+PTA7aS0tKW8uRG9tRXZlbnQub24odCxvLkRyYWdnYWJsZS5TVEFSVFtpXSxlKTtyZXR1cm4gby5Eb21FdmVudC5vbih0LCJjbGljayIsby5Eb21FdmVudC5fZmFrZVN0b3ApLm9uKHQsImRibGNsaWNrIixlKX0scHJldmVudERlZmF1bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldmVudERlZmF1bHQ/dC5wcmV2ZW50RGVmYXVsdCgpOnQucmV0dXJuVmFsdWU9ITEsdGhpc30sc3RvcDpmdW5jdGlvbih0KXtyZXR1cm4gby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KS5zdG9wUHJvcGFnYXRpb24odCl9LGdldE1vdXNlUG9zaXRpb246ZnVuY3Rpb24odCxlKXtpZighZSlyZXR1cm4gbmV3IG8uUG9pbnQodC5jbGllbnRYLHQuY2xpZW50WSk7dmFyIGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gbmV3IG8uUG9pbnQodC5jbGllbnRYLWkubGVmdC1lLmNsaWVudExlZnQsdC5jbGllbnRZLWkudG9wLWUuY2xpZW50VG9wKX0sZ2V0V2hlZWxEZWx0YTpmdW5jdGlvbih0KXt2YXIgZT0wO3JldHVybiB0LndoZWVsRGVsdGEmJihlPXQud2hlZWxEZWx0YS8xMjApLHQuZGV0YWlsJiYoZT0tdC5kZXRhaWwvMyksZX0sX3NraXBFdmVudHM6e30sX2Zha2VTdG9wOmZ1bmN0aW9uKHQpe28uRG9tRXZlbnQuX3NraXBFdmVudHNbdC50eXBlXT0hMH0sX3NraXBwZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc2tpcEV2ZW50c1t0LnR5cGVdO3JldHVybiB0aGlzLl9za2lwRXZlbnRzW3QudHlwZV09ITEsZX0sX2NoZWNrTW91c2U6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnJlbGF0ZWRUYXJnZXQ7aWYoIWkpcmV0dXJuITA7dHJ5e2Zvcig7aSYmaSE9PXQ7KWk9aS5wYXJlbnROb2RlfWNhdGNoKG4pe3JldHVybiExfXJldHVybiBpIT09dH0sX2dldEV2ZW50OmZ1bmN0aW9uKCl7dmFyIGU9dC5ldmVudDtpZighZSlmb3IodmFyIGk9YXJndW1lbnRzLmNhbGxlZS5jYWxsZXI7aSYmKGU9aS5hcmd1bWVudHNbMF0sIWV8fHQuRXZlbnQhPT1lLmNvbnN0cnVjdG9yKTspaT1pLmNhbGxlcjtyZXR1cm4gZX0sX2ZpbHRlckNsaWNrOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC50aW1lU3RhbXB8fHQub3JpZ2luYWxFdmVudC50aW1lU3RhbXAsbj1vLkRvbUV2ZW50Ll9sYXN0Q2xpY2smJmktby5Eb21FdmVudC5fbGFzdENsaWNrO3JldHVybiBuJiZuPjEwMCYmNTAwPm58fHQudGFyZ2V0Ll9zaW11bGF0ZWRDbGljayYmIXQuX3NpbXVsYXRlZD92b2lkIG8uRG9tRXZlbnQuc3RvcCh0KTooby5Eb21FdmVudC5fbGFzdENsaWNrPWksZSh0KSl9fSxvLkRvbUV2ZW50Lm9uPW8uRG9tRXZlbnQuYWRkTGlzdGVuZXIsby5Eb21FdmVudC5vZmY9by5Eb21FdmVudC5yZW1vdmVMaXN0ZW5lcixvLkRyYWdnYWJsZT1vLkNsYXNzLmV4dGVuZCh7aW5jbHVkZXM6by5NaXhpbi5FdmVudHMsc3RhdGljczp7U1RBUlQ6by5Ccm93c2VyLnRvdWNoP1sidG91Y2hzdGFydCIsIm1vdXNlZG93biJdOlsibW91c2Vkb3duIl0sRU5EOnttb3VzZWRvd246Im1vdXNldXAiLHRvdWNoc3RhcnQ6InRvdWNoZW5kIixwb2ludGVyZG93bjoidG91Y2hlbmQiLE1TUG9pbnRlckRvd246InRvdWNoZW5kIn0sTU9WRTp7bW91c2Vkb3duOiJtb3VzZW1vdmUiLHRvdWNoc3RhcnQ6InRvdWNobW92ZSIscG9pbnRlcmRvd246InRvdWNobW92ZSIsTVNQb2ludGVyRG93bjoidG91Y2htb3ZlIn19LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0PWV8fHR9LGVuYWJsZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9lbmFibGVkKXtmb3IodmFyIHQ9by5EcmFnZ2FibGUuU1RBUlQubGVuZ3RoLTE7dD49MDt0LS0pby5Eb21FdmVudC5vbih0aGlzLl9kcmFnU3RhcnRUYXJnZXQsby5EcmFnZ2FibGUuU1RBUlRbdF0sdGhpcy5fb25Eb3duLHRoaXMpO3RoaXMuX2VuYWJsZWQ9ITB9fSxkaXNhYmxlOmZ1bmN0aW9uKCl7aWYodGhpcy5fZW5hYmxlZCl7Zm9yKHZhciB0PW8uRHJhZ2dhYmxlLlNUQVJULmxlbmd0aC0xO3Q+PTA7dC0tKW8uRG9tRXZlbnQub2ZmKHRoaXMuX2RyYWdTdGFydFRhcmdldCxvLkRyYWdnYWJsZS5TVEFSVFt0XSx0aGlzLl9vbkRvd24sdGhpcyk7dGhpcy5fZW5hYmxlZD0hMSx0aGlzLl9tb3ZlZD0hMX19LF9vbkRvd246ZnVuY3Rpb24odCl7aWYodGhpcy5fbW92ZWQ9ITEsIXQuc2hpZnRLZXkmJigxPT09dC53aGljaHx8MT09PXQuYnV0dG9ufHx0LnRvdWNoZXMpJiYoby5Eb21FdmVudC5zdG9wUHJvcGFnYXRpb24odCksIW8uRHJhZ2dhYmxlLl9kaXNhYmxlZCYmKG8uRG9tVXRpbC5kaXNhYmxlSW1hZ2VEcmFnKCksby5Eb21VdGlsLmRpc2FibGVUZXh0U2VsZWN0aW9uKCksIXRoaXMuX21vdmluZykpKXt2YXIgaT10LnRvdWNoZXM/dC50b3VjaGVzWzBdOnQ7dGhpcy5fc3RhcnRQb2ludD1uZXcgby5Qb2ludChpLmNsaWVudFgsaS5jbGllbnRZKSx0aGlzLl9zdGFydFBvcz10aGlzLl9uZXdQb3M9by5Eb21VdGlsLmdldFBvc2l0aW9uKHRoaXMuX2VsZW1lbnQpLG8uRG9tRXZlbnQub24oZSxvLkRyYWdnYWJsZS5NT1ZFW3QudHlwZV0sdGhpcy5fb25Nb3ZlLHRoaXMpLm9uKGUsby5EcmFnZ2FibGUuRU5EW3QudHlwZV0sdGhpcy5fb25VcCx0aGlzKX19LF9vbk1vdmU6ZnVuY3Rpb24odCl7aWYodC50b3VjaGVzJiZ0LnRvdWNoZXMubGVuZ3RoPjEpcmV0dXJuIHZvaWQodGhpcy5fbW92ZWQ9ITApO3ZhciBpPXQudG91Y2hlcyYmMT09PXQudG91Y2hlcy5sZW5ndGg/dC50b3VjaGVzWzBdOnQsbj1uZXcgby5Qb2ludChpLmNsaWVudFgsaS5jbGllbnRZKSxzPW4uc3VidHJhY3QodGhpcy5fc3RhcnRQb2ludCk7KHMueHx8cy55KSYmKG8uQnJvd3Nlci50b3VjaCYmTWF0aC5hYnMocy54KStNYXRoLmFicyhzLnkpPDN8fChvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KHQpLHRoaXMuX21vdmVkfHwodGhpcy5maXJlKCJkcmFnc3RhcnQiKSx0aGlzLl9tb3ZlZD0hMCx0aGlzLl9zdGFydFBvcz1vLkRvbVV0aWwuZ2V0UG9zaXRpb24odGhpcy5fZWxlbWVudCkuc3VidHJhY3Qocyksby5Eb21VdGlsLmFkZENsYXNzKGUuYm9keSwibGVhZmxldC1kcmFnZ2luZyIpLHRoaXMuX2xhc3RUYXJnZXQ9dC50YXJnZXR8fHQuc3JjRWxlbWVudCxvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fbGFzdFRhcmdldCwibGVhZmxldC1kcmFnLXRhcmdldCIpKSx0aGlzLl9uZXdQb3M9dGhpcy5fc3RhcnRQb3MuYWRkKHMpLHRoaXMuX21vdmluZz0hMCxvLlV0aWwuY2FuY2VsQW5pbUZyYW1lKHRoaXMuX2FuaW1SZXF1ZXN0KSx0aGlzLl9hbmltUmVxdWVzdD1vLlV0aWwucmVxdWVzdEFuaW1GcmFtZSh0aGlzLl91cGRhdGVQb3NpdGlvbix0aGlzLCEwLHRoaXMuX2RyYWdTdGFydFRhcmdldCkpKX0sX3VwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJwcmVkcmFnIiksby5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2VsZW1lbnQsdGhpcy5fbmV3UG9zKSx0aGlzLmZpcmUoImRyYWciKX0sX29uVXA6ZnVuY3Rpb24oKXtvLkRvbVV0aWwucmVtb3ZlQ2xhc3MoZS5ib2R5LCJsZWFmbGV0LWRyYWdnaW5nIiksdGhpcy5fbGFzdFRhcmdldCYmKG8uRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9sYXN0VGFyZ2V0LCJsZWFmbGV0LWRyYWctdGFyZ2V0IiksdGhpcy5fbGFzdFRhcmdldD1udWxsKTtmb3IodmFyIHQgaW4gby5EcmFnZ2FibGUuTU9WRSlvLkRvbUV2ZW50Lm9mZihlLG8uRHJhZ2dhYmxlLk1PVkVbdF0sdGhpcy5fb25Nb3ZlKS5vZmYoZSxvLkRyYWdnYWJsZS5FTkRbdF0sdGhpcy5fb25VcCk7by5Eb21VdGlsLmVuYWJsZUltYWdlRHJhZygpLG8uRG9tVXRpbC5lbmFibGVUZXh0U2VsZWN0aW9uKCksdGhpcy5fbW92ZWQmJnRoaXMuX21vdmluZyYmKG8uVXRpbC5jYW5jZWxBbmltRnJhbWUodGhpcy5fYW5pbVJlcXVlc3QpLHRoaXMuZmlyZSgiZHJhZ2VuZCIse2Rpc3RhbmNlOnRoaXMuX25ld1Bvcy5kaXN0YW5jZVRvKHRoaXMuX3N0YXJ0UG9zKX0pKSx0aGlzLl9tb3Zpbmc9ITF9fSksby5IYW5kbGVyPW8uQ2xhc3MuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10fSxlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbmFibGVkfHwodGhpcy5fZW5hYmxlZD0hMCx0aGlzLmFkZEhvb2tzKCkpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZW5hYmxlZCYmKHRoaXMuX2VuYWJsZWQ9ITEsdGhpcy5yZW1vdmVIb29rcygpKX0sZW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fZW5hYmxlZH19KSxvLk1hcC5tZXJnZU9wdGlvbnMoe2RyYWdnaW5nOiEwLGluZXJ0aWE6IW8uQnJvd3Nlci5hbmRyb2lkMjMsaW5lcnRpYURlY2VsZXJhdGlvbjozNDAwLGluZXJ0aWFNYXhTcGVlZDoxLzAsaW5lcnRpYVRocmVzaG9sZDpvLkJyb3dzZXIudG91Y2g/MzI6MTgsZWFzZUxpbmVhcml0eTouMjUsd29ybGRDb3B5SnVtcDohMX0pLG8uTWFwLkRyYWc9by5IYW5kbGVyLmV4dGVuZCh7YWRkSG9va3M6ZnVuY3Rpb24oKXtpZighdGhpcy5fZHJhZ2dhYmxlKXt2YXIgdD10aGlzLl9tYXA7dGhpcy5fZHJhZ2dhYmxlPW5ldyBvLkRyYWdnYWJsZSh0Ll9tYXBQYW5lLHQuX2NvbnRhaW5lciksdGhpcy5fZHJhZ2dhYmxlLm9uKHtkcmFnc3RhcnQ6dGhpcy5fb25EcmFnU3RhcnQsZHJhZzp0aGlzLl9vbkRyYWcsZHJhZ2VuZDp0aGlzLl9vbkRyYWdFbmR9LHRoaXMpLHQub3B0aW9ucy53b3JsZENvcHlKdW1wJiYodGhpcy5fZHJhZ2dhYmxlLm9uKCJwcmVkcmFnIix0aGlzLl9vblByZURyYWcsdGhpcyksdC5vbigidmlld3Jlc2V0Iix0aGlzLl9vblZpZXdSZXNldCx0aGlzKSx0LndoZW5SZWFkeSh0aGlzLl9vblZpZXdSZXNldCx0aGlzKSl9dGhpcy5fZHJhZ2dhYmxlLmVuYWJsZSgpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3RoaXMuX2RyYWdnYWJsZS5kaXNhYmxlKCl9LG1vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnYWJsZSYmdGhpcy5fZHJhZ2dhYmxlLl9tb3ZlZH0sX29uRHJhZ1N0YXJ0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwO3QuX3BhbkFuaW0mJnQuX3BhbkFuaW0uc3RvcCgpLHQuZmlyZSgibW92ZXN0YXJ0IikuZmlyZSgiZHJhZ3N0YXJ0IiksdC5vcHRpb25zLmluZXJ0aWEmJih0aGlzLl9wb3NpdGlvbnM9W10sdGhpcy5fdGltZXM9W10pfSxfb25EcmFnOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwLm9wdGlvbnMuaW5lcnRpYSl7dmFyIHQ9dGhpcy5fbGFzdFRpbWU9K25ldyBEYXRlLGU9dGhpcy5fbGFzdFBvcz10aGlzLl9kcmFnZ2FibGUuX25ld1Bvczt0aGlzLl9wb3NpdGlvbnMucHVzaChlKSx0aGlzLl90aW1lcy5wdXNoKHQpLHQtdGhpcy5fdGltZXNbMF0+MjAwJiYodGhpcy5fcG9zaXRpb25zLnNoaWZ0KCksdGhpcy5fdGltZXMuc2hpZnQoKSl9dGhpcy5fbWFwLmZpcmUoIm1vdmUiKS5maXJlKCJkcmFnIil9LF9vblZpZXdSZXNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpLGU9dGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludChbMCwwXSk7dGhpcy5faW5pdGlhbFdvcmxkT2Zmc2V0PWUuc3VidHJhY3QodCkueCx0aGlzLl93b3JsZFdpZHRoPXRoaXMuX21hcC5wcm9qZWN0KFswLDE4MF0pLnh9LF9vblByZURyYWc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93b3JsZFdpZHRoLGU9TWF0aC5yb3VuZCh0LzIpLGk9dGhpcy5faW5pdGlhbFdvcmxkT2Zmc2V0LG49dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MueCxvPShuLWUraSkldCtlLWkscz0obitlK2kpJXQtZS1pLGE9TWF0aC5hYnMobytpKTxNYXRoLmFicyhzK2kpP286czt0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy54PWF9LF9vbkRyYWdFbmQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLGk9ZS5vcHRpb25zLG49K25ldyBEYXRlLXRoaXMuX2xhc3RUaW1lLHM9IWkuaW5lcnRpYXx8bj5pLmluZXJ0aWFUaHJlc2hvbGR8fCF0aGlzLl9wb3NpdGlvbnNbMF07aWYoZS5maXJlKCJkcmFnZW5kIix0KSxzKWUuZmlyZSgibW92ZWVuZCIpO2Vsc2V7dmFyIGE9dGhpcy5fbGFzdFBvcy5zdWJ0cmFjdCh0aGlzLl9wb3NpdGlvbnNbMF0pLHI9KHRoaXMuX2xhc3RUaW1lK24tdGhpcy5fdGltZXNbMF0pLzFlMyxoPWkuZWFzZUxpbmVhcml0eSxsPWEubXVsdGlwbHlCeShoL3IpLHU9bC5kaXN0YW5jZVRvKFswLDBdKSxjPU1hdGgubWluKGkuaW5lcnRpYU1heFNwZWVkLHUpLGQ9bC5tdWx0aXBseUJ5KGMvdSkscD1jLyhpLmluZXJ0aWFEZWNlbGVyYXRpb24qaCksXz1kLm11bHRpcGx5QnkoLXAvMikucm91bmQoKTtfLngmJl8ueT8oXz1lLl9saW1pdE9mZnNldChfLGUub3B0aW9ucy5tYXhCb3VuZHMpLG8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKGZ1bmN0aW9uKCl7ZS5wYW5CeShfLHtkdXJhdGlvbjpwLGVhc2VMaW5lYXJpdHk6aCxub01vdmVTdGFydDohMH0pfSkpOmUuZmlyZSgibW92ZWVuZCIpfX19KSxvLk1hcC5hZGRJbml0SG9vaygiYWRkSGFuZGxlciIsImRyYWdnaW5nIixvLk1hcC5EcmFnKSxvLk1hcC5tZXJnZU9wdGlvbnMoe2RvdWJsZUNsaWNrWm9vbTohMH0pLG8uTWFwLkRvdWJsZUNsaWNrWm9vbT1vLkhhbmRsZXIuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe3RoaXMuX21hcC5vbigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LF9vbkRvdWJsZUNsaWNrOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcCxpPWUuZ2V0Wm9vbSgpKyh0Lm9yaWdpbmFsRXZlbnQuc2hpZnRLZXk/LTE6MSk7ImNlbnRlciI9PT1lLm9wdGlvbnMuZG91YmxlQ2xpY2tab29tP2Uuc2V0Wm9vbShpKTplLnNldFpvb21Bcm91bmQodC5jb250YWluZXJQb2ludCxpKX19KSxvLk1hcC5hZGRJbml0SG9vaygiYWRkSGFuZGxlciIsImRvdWJsZUNsaWNrWm9vbSIsby5NYXAuRG91YmxlQ2xpY2tab29tKSxvLk1hcC5tZXJnZU9wdGlvbnMoe3Njcm9sbFdoZWVsWm9vbTohMH0pLG8uTWFwLlNjcm9sbFdoZWVsWm9vbT1vLkhhbmRsZXIuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub24odGhpcy5fbWFwLl9jb250YWluZXIsIm1vdXNld2hlZWwiLHRoaXMuX29uV2hlZWxTY3JvbGwsdGhpcyksby5Eb21FdmVudC5vbih0aGlzLl9tYXAuX2NvbnRhaW5lciwiTW96TW91c2VQaXhlbFNjcm9sbCIsby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCksdGhpcy5fZGVsdGE9MH0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXtvLkRvbUV2ZW50Lm9mZih0aGlzLl9tYXAuX2NvbnRhaW5lciwibW91c2V3aGVlbCIsdGhpcy5fb25XaGVlbFNjcm9sbCksby5Eb21FdmVudC5vZmYodGhpcy5fbWFwLl9jb250YWluZXIsIk1vek1vdXNlUGl4ZWxTY3JvbGwiLG8uRG9tRXZlbnQucHJldmVudERlZmF1bHQpfSxfb25XaGVlbFNjcm9sbDpmdW5jdGlvbih0KXt2YXIgZT1vLkRvbUV2ZW50LmdldFdoZWVsRGVsdGEodCk7dGhpcy5fZGVsdGErPWUsdGhpcy5fbGFzdE1vdXNlUG9zPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSx0aGlzLl9zdGFydFRpbWV8fCh0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlKTt2YXIgaT1NYXRoLm1heCg0MC0oK25ldyBEYXRlLXRoaXMuX3N0YXJ0VGltZSksMCk7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj1zZXRUaW1lb3V0KG8uYmluZCh0aGlzLl9wZXJmb3JtWm9vbSx0aGlzKSxpKSxvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KHQpLG8uRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKHQpfSxfcGVyZm9ybVpvb206ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsZT10aGlzLl9kZWx0YSxpPXQuZ2V0Wm9vbSgpO2U9ZT4wP01hdGguY2VpbChlKTpNYXRoLmZsb29yKGUpLGU9TWF0aC5tYXgoTWF0aC5taW4oZSw0KSwtNCksZT10Ll9saW1pdFpvb20oaStlKS1pLHRoaXMuX2RlbHRhPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsZSYmKCJjZW50ZXIiPT09dC5vcHRpb25zLnNjcm9sbFdoZWVsWm9vbT90LnNldFpvb20oaStlKTp0LnNldFpvb21Bcm91bmQodGhpcy5fbGFzdE1vdXNlUG9zLGkrZSkpfX0pLG8uTWFwLmFkZEluaXRIb29rKCJhZGRIYW5kbGVyIiwic2Nyb2xsV2hlZWxab29tIixvLk1hcC5TY3JvbGxXaGVlbFpvb20pLG8uZXh0ZW5kKG8uRG9tRXZlbnQse190b3VjaHN0YXJ0Om8uQnJvd3Nlci5tc1BvaW50ZXI/Ik1TUG9pbnRlckRvd24iOm8uQnJvd3Nlci5wb2ludGVyPyJwb2ludGVyZG93biI6InRvdWNoc3RhcnQiLF90b3VjaGVuZDpvLkJyb3dzZXIubXNQb2ludGVyPyJNU1BvaW50ZXJVcCI6by5Ccm93c2VyLnBvaW50ZXI/InBvaW50ZXJ1cCI6InRvdWNoZW5kIixhZGREb3VibGVUYXBMaXN0ZW5lcjpmdW5jdGlvbih0LGksbil7ZnVuY3Rpb24gcyh0KXt2YXIgZTtpZihvLkJyb3dzZXIucG9pbnRlcj8oXy5wdXNoKHQucG9pbnRlcklkKSxlPV8ubGVuZ3RoKTplPXQudG91Y2hlcy5sZW5ndGgsIShlPjEpKXt2YXIgaT1EYXRlLm5vdygpLG49aS0ocnx8aSk7aD10LnRvdWNoZXM/dC50b3VjaGVzWzBdOnQsbD1uPjAmJnU+PW4scj1pfX1mdW5jdGlvbiBhKHQpe2lmKG8uQnJvd3Nlci5wb2ludGVyKXt2YXIgZT1fLmluZGV4T2YodC5wb2ludGVySWQpO2lmKC0xPT09ZSlyZXR1cm47Xy5zcGxpY2UoZSwxKX1pZihsKXtpZihvLkJyb3dzZXIucG9pbnRlcil7dmFyIG4scz17fTtmb3IodmFyIGEgaW4gaCluPWhbYV0sImZ1bmN0aW9uIj09dHlwZW9mIG4/c1thXT1uLmJpbmQoaCk6c1thXT1uO2g9c31oLnR5cGU9ImRibGNsaWNrIixpKGgpLHI9bnVsbH19dmFyIHIsaCxsPSExLHU9MjUwLGM9Il9sZWFmbGV0XyIsZD10aGlzLl90b3VjaHN0YXJ0LHA9dGhpcy5fdG91Y2hlbmQsXz1bXTt0W2MrZCtuXT1zLHRbYytwK25dPWE7dmFyIG09by5Ccm93c2VyLnBvaW50ZXI/ZS5kb2N1bWVudEVsZW1lbnQ6dDtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKGQscywhMSksbS5hZGRFdmVudExpc3RlbmVyKHAsYSwhMSksby5Ccm93c2VyLnBvaW50ZXImJm0uYWRkRXZlbnRMaXN0ZW5lcihvLkRvbUV2ZW50LlBPSU5URVJfQ0FOQ0VMLGEsITEpLHRoaXN9LHJlbW92ZURvdWJsZVRhcExpc3RlbmVyOmZ1bmN0aW9uKHQsaSl7dmFyIG49Il9sZWFmbGV0XyI7cmV0dXJuIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl90b3VjaHN0YXJ0LHRbbit0aGlzLl90b3VjaHN0YXJ0K2ldLCExKSwoby5Ccm93c2VyLnBvaW50ZXI/ZS5kb2N1bWVudEVsZW1lbnQ6dCkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl90b3VjaGVuZCx0W24rdGhpcy5fdG91Y2hlbmQraV0sITEpLG8uQnJvd3Nlci5wb2ludGVyJiZlLmRvY3VtZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG8uRG9tRXZlbnQuUE9JTlRFUl9DQU5DRUwsdFtuK3RoaXMuX3RvdWNoZW5kK2ldLCExKSx0aGlzfX0pLG8uZXh0ZW5kKG8uRG9tRXZlbnQse1BPSU5URVJfRE9XTjpvLkJyb3dzZXIubXNQb2ludGVyPyJNU1BvaW50ZXJEb3duIjoicG9pbnRlcmRvd24iLApQT0lOVEVSX01PVkU6by5Ccm93c2VyLm1zUG9pbnRlcj8iTVNQb2ludGVyTW92ZSI6InBvaW50ZXJtb3ZlIixQT0lOVEVSX1VQOm8uQnJvd3Nlci5tc1BvaW50ZXI/Ik1TUG9pbnRlclVwIjoicG9pbnRlcnVwIixQT0lOVEVSX0NBTkNFTDpvLkJyb3dzZXIubXNQb2ludGVyPyJNU1BvaW50ZXJDYW5jZWwiOiJwb2ludGVyY2FuY2VsIixfcG9pbnRlcnM6W10sX3BvaW50ZXJEb2N1bWVudExpc3RlbmVyOiExLGFkZFBvaW50ZXJMaXN0ZW5lcjpmdW5jdGlvbih0LGUsaSxuKXtzd2l0Y2goZSl7Y2FzZSJ0b3VjaHN0YXJ0IjpyZXR1cm4gdGhpcy5hZGRQb2ludGVyTGlzdGVuZXJTdGFydCh0LGUsaSxuKTtjYXNlInRvdWNoZW5kIjpyZXR1cm4gdGhpcy5hZGRQb2ludGVyTGlzdGVuZXJFbmQodCxlLGksbik7Y2FzZSJ0b3VjaG1vdmUiOnJldHVybiB0aGlzLmFkZFBvaW50ZXJMaXN0ZW5lck1vdmUodCxlLGksbik7ZGVmYXVsdDp0aHJvdyJVbmtub3duIHRvdWNoIGV2ZW50IHR5cGUifX0sYWRkUG9pbnRlckxpc3RlbmVyU3RhcnQ6ZnVuY3Rpb24odCxpLG4scyl7dmFyIGE9Il9sZWFmbGV0XyIscj10aGlzLl9wb2ludGVycyxoPWZ1bmN0aW9uKHQpeyJtb3VzZSIhPT10LnBvaW50ZXJUeXBlJiZ0LnBvaW50ZXJUeXBlIT09dC5NU1BPSU5URVJfVFlQRV9NT1VTRSYmby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KTtmb3IodmFyIGU9ITEsaT0wO2k8ci5sZW5ndGg7aSsrKWlmKHJbaV0ucG9pbnRlcklkPT09dC5wb2ludGVySWQpe2U9ITA7YnJlYWt9ZXx8ci5wdXNoKHQpLHQudG91Y2hlcz1yLnNsaWNlKCksdC5jaGFuZ2VkVG91Y2hlcz1bdF0sbih0KX07aWYodFthKyJ0b3VjaHN0YXJ0IitzXT1oLHQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfRE9XTixoLCExKSwhdGhpcy5fcG9pbnRlckRvY3VtZW50TGlzdGVuZXIpe3ZhciBsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8ci5sZW5ndGg7ZSsrKWlmKHJbZV0ucG9pbnRlcklkPT09dC5wb2ludGVySWQpe3Iuc3BsaWNlKGUsMSk7YnJlYWt9fTtlLmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuUE9JTlRFUl9VUCxsLCExKSxlLmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuUE9JTlRFUl9DQU5DRUwsbCwhMSksdGhpcy5fcG9pbnRlckRvY3VtZW50TGlzdGVuZXI9ITB9cmV0dXJuIHRoaXN9LGFkZFBvaW50ZXJMaXN0ZW5lck1vdmU6ZnVuY3Rpb24odCxlLGksbil7ZnVuY3Rpb24gbyh0KXtpZih0LnBvaW50ZXJUeXBlIT09dC5NU1BPSU5URVJfVFlQRV9NT1VTRSYmIm1vdXNlIiE9PXQucG9pbnRlclR5cGV8fDAhPT10LmJ1dHRvbnMpe2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGFbZV0ucG9pbnRlcklkPT09dC5wb2ludGVySWQpe2FbZV09dDticmVha310LnRvdWNoZXM9YS5zbGljZSgpLHQuY2hhbmdlZFRvdWNoZXM9W3RdLGkodCl9fXZhciBzPSJfbGVhZmxldF8iLGE9dGhpcy5fcG9pbnRlcnM7cmV0dXJuIHRbcysidG91Y2htb3ZlIituXT1vLHQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfTU9WRSxvLCExKSx0aGlzfSxhZGRQb2ludGVyTGlzdGVuZXJFbmQ6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89Il9sZWFmbGV0XyIscz10aGlzLl9wb2ludGVycyxhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8cy5sZW5ndGg7ZSsrKWlmKHNbZV0ucG9pbnRlcklkPT09dC5wb2ludGVySWQpe3Muc3BsaWNlKGUsMSk7YnJlYWt9dC50b3VjaGVzPXMuc2xpY2UoKSx0LmNoYW5nZWRUb3VjaGVzPVt0XSxpKHQpfTtyZXR1cm4gdFtvKyJ0b3VjaGVuZCIrbl09YSx0LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX1VQLGEsITEpLHQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfQ0FOQ0VMLGEsITEpLHRoaXN9LHJlbW92ZVBvaW50ZXJMaXN0ZW5lcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49Il9sZWFmbGV0XyIsbz10W24rZStpXTtzd2l0Y2goZSl7Y2FzZSJ0b3VjaHN0YXJ0Ijp0LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX0RPV04sbywhMSk7YnJlYWs7Y2FzZSJ0b3VjaG1vdmUiOnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfTU9WRSxvLCExKTticmVhaztjYXNlInRvdWNoZW5kIjp0LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX1VQLG8sITEpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfQ0FOQ0VMLG8sITEpfXJldHVybiB0aGlzfX0pLG8uTWFwLm1lcmdlT3B0aW9ucyh7dG91Y2hab29tOm8uQnJvd3Nlci50b3VjaCYmIW8uQnJvd3Nlci5hbmRyb2lkMjMsYm91bmNlQXRab29tTGltaXRzOiEwfSksby5NYXAuVG91Y2hab29tPW8uSGFuZGxlci5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7by5Eb21FdmVudC5vbih0aGlzLl9tYXAuX2NvbnRhaW5lciwidG91Y2hzdGFydCIsdGhpcy5fb25Ub3VjaFN0YXJ0LHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub2ZmKHRoaXMuX21hcC5fY29udGFpbmVyLCJ0b3VjaHN0YXJ0Iix0aGlzLl9vblRvdWNoU3RhcnQsdGhpcyl9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwO2lmKHQudG91Y2hlcyYmMj09PXQudG91Y2hlcy5sZW5ndGgmJiFpLl9hbmltYXRpbmdab29tJiYhdGhpcy5fem9vbWluZyl7dmFyIG49aS5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQudG91Y2hlc1swXSkscz1pLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQodC50b3VjaGVzWzFdKSxhPWkuX2dldENlbnRlckxheWVyUG9pbnQoKTt0aGlzLl9zdGFydENlbnRlcj1uLmFkZChzKS5fZGl2aWRlQnkoMiksdGhpcy5fc3RhcnREaXN0PW4uZGlzdGFuY2VUbyhzKSx0aGlzLl9tb3ZlZD0hMSx0aGlzLl96b29taW5nPSEwLHRoaXMuX2NlbnRlck9mZnNldD1hLnN1YnRyYWN0KHRoaXMuX3N0YXJ0Q2VudGVyKSxpLl9wYW5BbmltJiZpLl9wYW5BbmltLnN0b3AoKSxvLkRvbUV2ZW50Lm9uKGUsInRvdWNobW92ZSIsdGhpcy5fb25Ub3VjaE1vdmUsdGhpcykub24oZSwidG91Y2hlbmQiLHRoaXMuX29uVG91Y2hFbmQsdGhpcyksby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KX19LF9vblRvdWNoTW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXA7aWYodC50b3VjaGVzJiYyPT09dC50b3VjaGVzLmxlbmd0aCYmdGhpcy5fem9vbWluZyl7dmFyIGk9ZS5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQudG91Y2hlc1swXSksbj1lLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQodC50b3VjaGVzWzFdKTt0aGlzLl9zY2FsZT1pLmRpc3RhbmNlVG8obikvdGhpcy5fc3RhcnREaXN0LHRoaXMuX2RlbHRhPWkuX2FkZChuKS5fZGl2aWRlQnkoMikuX3N1YnRyYWN0KHRoaXMuX3N0YXJ0Q2VudGVyKSwxIT09dGhpcy5fc2NhbGUmJihlLm9wdGlvbnMuYm91bmNlQXRab29tTGltaXRzfHwhKGUuZ2V0Wm9vbSgpPT09ZS5nZXRNaW5ab29tKCkmJnRoaXMuX3NjYWxlPDF8fGUuZ2V0Wm9vbSgpPT09ZS5nZXRNYXhab29tKCkmJnRoaXMuX3NjYWxlPjEpKSYmKHRoaXMuX21vdmVkfHwoby5Eb21VdGlsLmFkZENsYXNzKGUuX21hcFBhbmUsImxlYWZsZXQtdG91Y2hpbmciKSxlLmZpcmUoIm1vdmVzdGFydCIpLmZpcmUoInpvb21zdGFydCIpLHRoaXMuX21vdmVkPSEwKSxvLlV0aWwuY2FuY2VsQW5pbUZyYW1lKHRoaXMuX2FuaW1SZXF1ZXN0KSx0aGlzLl9hbmltUmVxdWVzdD1vLlV0aWwucmVxdWVzdEFuaW1GcmFtZSh0aGlzLl91cGRhdGVPbk1vdmUsdGhpcywhMCx0aGlzLl9tYXAuX2NvbnRhaW5lciksby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KSl9fSxfdXBkYXRlT25Nb3ZlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGU9dGhpcy5fZ2V0U2NhbGVPcmlnaW4oKSxpPXQubGF5ZXJQb2ludFRvTGF0TG5nKGUpLG49dC5nZXRTY2FsZVpvb20odGhpcy5fc2NhbGUpO3QuX2FuaW1hdGVab29tKGksbix0aGlzLl9zdGFydENlbnRlcix0aGlzLl9zY2FsZSx0aGlzLl9kZWx0YSwhMSwhMCl9LF9vblRvdWNoRW5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21vdmVkfHwhdGhpcy5fem9vbWluZylyZXR1cm4gdm9pZCh0aGlzLl96b29taW5nPSExKTt2YXIgdD10aGlzLl9tYXA7dGhpcy5fem9vbWluZz0hMSxvLkRvbVV0aWwucmVtb3ZlQ2xhc3ModC5fbWFwUGFuZSwibGVhZmxldC10b3VjaGluZyIpLG8uVXRpbC5jYW5jZWxBbmltRnJhbWUodGhpcy5fYW5pbVJlcXVlc3QpLG8uRG9tRXZlbnQub2ZmKGUsInRvdWNobW92ZSIsdGhpcy5fb25Ub3VjaE1vdmUpLm9mZihlLCJ0b3VjaGVuZCIsdGhpcy5fb25Ub3VjaEVuZCk7dmFyIGk9dGhpcy5fZ2V0U2NhbGVPcmlnaW4oKSxuPXQubGF5ZXJQb2ludFRvTGF0TG5nKGkpLHM9dC5nZXRab29tKCksYT10LmdldFNjYWxlWm9vbSh0aGlzLl9zY2FsZSktcyxyPWE+MD9NYXRoLmNlaWwoYSk6TWF0aC5mbG9vcihhKSxoPXQuX2xpbWl0Wm9vbShzK3IpLGw9dC5nZXRab29tU2NhbGUoaCkvdGhpcy5fc2NhbGU7dC5fYW5pbWF0ZVpvb20obixoLGksbCl9LF9nZXRTY2FsZU9yaWdpbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NlbnRlck9mZnNldC5zdWJ0cmFjdCh0aGlzLl9kZWx0YSkuZGl2aWRlQnkodGhpcy5fc2NhbGUpO3JldHVybiB0aGlzLl9zdGFydENlbnRlci5hZGQodCl9fSksby5NYXAuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJ0b3VjaFpvb20iLG8uTWFwLlRvdWNoWm9vbSksby5NYXAubWVyZ2VPcHRpb25zKHt0YXA6ITAsdGFwVG9sZXJhbmNlOjE1fSksby5NYXAuVGFwPW8uSGFuZGxlci5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7by5Eb21FdmVudC5vbih0aGlzLl9tYXAuX2NvbnRhaW5lciwidG91Y2hzdGFydCIsdGhpcy5fb25Eb3duLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub2ZmKHRoaXMuX21hcC5fY29udGFpbmVyLCJ0b3VjaHN0YXJ0Iix0aGlzLl9vbkRvd24sdGhpcyl9LF9vbkRvd246ZnVuY3Rpb24odCl7aWYodC50b3VjaGVzKXtpZihvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KHQpLHRoaXMuX2ZpcmVDbGljaz0hMCx0LnRvdWNoZXMubGVuZ3RoPjEpcmV0dXJuIHRoaXMuX2ZpcmVDbGljaz0hMSx2b2lkIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7dmFyIGk9dC50b3VjaGVzWzBdLG49aS50YXJnZXQ7dGhpcy5fc3RhcnRQb3M9dGhpcy5fbmV3UG9zPW5ldyBvLlBvaW50KGkuY2xpZW50WCxpLmNsaWVudFkpLG4udGFnTmFtZSYmImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJm8uRG9tVXRpbC5hZGRDbGFzcyhuLCJsZWFmbGV0LWFjdGl2ZSIpLHRoaXMuX2hvbGRUaW1lb3V0PXNldFRpbWVvdXQoby5iaW5kKGZ1bmN0aW9uKCl7dGhpcy5faXNUYXBWYWxpZCgpJiYodGhpcy5fZmlyZUNsaWNrPSExLHRoaXMuX29uVXAoKSx0aGlzLl9zaW11bGF0ZUV2ZW50KCJjb250ZXh0bWVudSIsaSkpfSx0aGlzKSwxZTMpLG8uRG9tRXZlbnQub24oZSwidG91Y2htb3ZlIix0aGlzLl9vbk1vdmUsdGhpcykub24oZSwidG91Y2hlbmQiLHRoaXMuX29uVXAsdGhpcyl9fSxfb25VcDpmdW5jdGlvbih0KXtpZihjbGVhclRpbWVvdXQodGhpcy5faG9sZFRpbWVvdXQpLG8uRG9tRXZlbnQub2ZmKGUsInRvdWNobW92ZSIsdGhpcy5fb25Nb3ZlLHRoaXMpLm9mZihlLCJ0b3VjaGVuZCIsdGhpcy5fb25VcCx0aGlzKSx0aGlzLl9maXJlQ2xpY2smJnQmJnQuY2hhbmdlZFRvdWNoZXMpe3ZhciBpPXQuY2hhbmdlZFRvdWNoZXNbMF0sbj1pLnRhcmdldDtuJiZuLnRhZ05hbWUmJiJhIj09PW4udGFnTmFtZS50b0xvd2VyQ2FzZSgpJiZvLkRvbVV0aWwucmVtb3ZlQ2xhc3MobiwibGVhZmxldC1hY3RpdmUiKSx0aGlzLl9pc1RhcFZhbGlkKCkmJnRoaXMuX3NpbXVsYXRlRXZlbnQoImNsaWNrIixpKX19LF9pc1RhcFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25ld1Bvcy5kaXN0YW5jZVRvKHRoaXMuX3N0YXJ0UG9zKTw9dGhpcy5fbWFwLm9wdGlvbnMudGFwVG9sZXJhbmNlfSxfb25Nb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXQudG91Y2hlc1swXTt0aGlzLl9uZXdQb3M9bmV3IG8uUG9pbnQoZS5jbGllbnRYLGUuY2xpZW50WSl9LF9zaW11bGF0ZUV2ZW50OmZ1bmN0aW9uKGksbil7dmFyIG89ZS5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtvLl9zaW11bGF0ZWQ9ITAsbi50YXJnZXQuX3NpbXVsYXRlZENsaWNrPSEwLG8uaW5pdE1vdXNlRXZlbnQoaSwhMCwhMCx0LDEsbi5zY3JlZW5YLG4uc2NyZWVuWSxuLmNsaWVudFgsbi5jbGllbnRZLCExLCExLCExLCExLDAsbnVsbCksbi50YXJnZXQuZGlzcGF0Y2hFdmVudChvKX19KSxvLkJyb3dzZXIudG91Y2gmJiFvLkJyb3dzZXIucG9pbnRlciYmby5NYXAuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJ0YXAiLG8uTWFwLlRhcCksby5NYXAubWVyZ2VPcHRpb25zKHtib3hab29tOiEwfSksby5NYXAuQm94Wm9vbT1vLkhhbmRsZXIuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHRoaXMuX2NvbnRhaW5lcj10Ll9jb250YWluZXIsdGhpcy5fcGFuZT10Ll9wYW5lcy5vdmVybGF5UGFuZSx0aGlzLl9tb3ZlZD0hMX0sYWRkSG9va3M6ZnVuY3Rpb24oKXtvLkRvbUV2ZW50Lm9uKHRoaXMuX2NvbnRhaW5lciwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bix0aGlzKX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXtvLkRvbUV2ZW50Lm9mZih0aGlzLl9jb250YWluZXIsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24pLHRoaXMuX21vdmVkPSExfSxtb3ZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb3ZlZH0sX29uTW91c2VEb3duOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tb3ZlZD0hMSwhdC5zaGlmdEtleXx8MSE9PXQud2hpY2gmJjEhPT10LmJ1dHRvbj8hMTooby5Eb21VdGlsLmRpc2FibGVUZXh0U2VsZWN0aW9uKCksby5Eb21VdGlsLmRpc2FibGVJbWFnZURyYWcoKSx0aGlzLl9zdGFydExheWVyUG9pbnQ9dGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQodCksdm9pZCBvLkRvbUV2ZW50Lm9uKGUsIm1vdXNlbW92ZSIsdGhpcy5fb25Nb3VzZU1vdmUsdGhpcykub24oZSwibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwLHRoaXMpLm9uKGUsImtleWRvd24iLHRoaXMuX29uS2V5RG93bix0aGlzKSl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt0aGlzLl9tb3ZlZHx8KHRoaXMuX2JveD1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLCJsZWFmbGV0LXpvb20tYm94Iix0aGlzLl9wYW5lKSxvLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5fYm94LHRoaXMuX3N0YXJ0TGF5ZXJQb2ludCksdGhpcy5fY29udGFpbmVyLnN0eWxlLmN1cnNvcj0iY3Jvc3NoYWlyIix0aGlzLl9tYXAuZmlyZSgiYm94em9vbXN0YXJ0IikpO3ZhciBlPXRoaXMuX3N0YXJ0TGF5ZXJQb2ludCxpPXRoaXMuX2JveCxuPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpLHM9bi5zdWJ0cmFjdChlKSxhPW5ldyBvLlBvaW50KE1hdGgubWluKG4ueCxlLngpLE1hdGgubWluKG4ueSxlLnkpKTtvLkRvbVV0aWwuc2V0UG9zaXRpb24oaSxhKSx0aGlzLl9tb3ZlZD0hMCxpLnN0eWxlLndpZHRoPU1hdGgubWF4KDAsTWF0aC5hYnMocy54KS00KSsicHgiLGkuc3R5bGUuaGVpZ2h0PU1hdGgubWF4KDAsTWF0aC5hYnMocy55KS00KSsicHgifSxfZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZWQmJih0aGlzLl9wYW5lLnJlbW92ZUNoaWxkKHRoaXMuX2JveCksdGhpcy5fY29udGFpbmVyLnN0eWxlLmN1cnNvcj0iIiksby5Eb21VdGlsLmVuYWJsZVRleHRTZWxlY3Rpb24oKSxvLkRvbVV0aWwuZW5hYmxlSW1hZ2VEcmFnKCksby5Eb21FdmVudC5vZmYoZSwibW91c2Vtb3ZlIix0aGlzLl9vbk1vdXNlTW92ZSkub2ZmKGUsIm1vdXNldXAiLHRoaXMuX29uTW91c2VVcCkub2ZmKGUsImtleWRvd24iLHRoaXMuX29uS2V5RG93bil9LF9vbk1vdXNlVXA6ZnVuY3Rpb24odCl7dGhpcy5fZmluaXNoKCk7dmFyIGU9dGhpcy5fbWFwLGk9ZS5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpO2lmKCF0aGlzLl9zdGFydExheWVyUG9pbnQuZXF1YWxzKGkpKXt2YXIgbj1uZXcgby5MYXRMbmdCb3VuZHMoZS5sYXllclBvaW50VG9MYXRMbmcodGhpcy5fc3RhcnRMYXllclBvaW50KSxlLmxheWVyUG9pbnRUb0xhdExuZyhpKSk7ZS5maXRCb3VuZHMobiksZS5maXJlKCJib3h6b29tZW5kIix7Ym94Wm9vbUJvdW5kczpufSl9fSxfb25LZXlEb3duOmZ1bmN0aW9uKHQpezI3PT09dC5rZXlDb2RlJiZ0aGlzLl9maW5pc2goKX19KSxvLk1hcC5hZGRJbml0SG9vaygiYWRkSGFuZGxlciIsImJveFpvb20iLG8uTWFwLkJveFpvb20pLG8uTWFwLm1lcmdlT3B0aW9ucyh7a2V5Ym9hcmQ6ITAsa2V5Ym9hcmRQYW5PZmZzZXQ6ODAsa2V5Ym9hcmRab29tT2Zmc2V0OjF9KSxvLk1hcC5LZXlib2FyZD1vLkhhbmRsZXIuZXh0ZW5kKHtrZXlDb2Rlczp7bGVmdDpbMzddLHJpZ2h0OlszOV0sZG93bjpbNDBdLHVwOlszOF0sem9vbUluOlsxODcsMTA3LDYxLDE3MV0sem9vbU91dDpbMTg5LDEwOSwxNzNdfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHRoaXMuX3NldFBhbk9mZnNldCh0Lm9wdGlvbnMua2V5Ym9hcmRQYW5PZmZzZXQpLHRoaXMuX3NldFpvb21PZmZzZXQodC5vcHRpb25zLmtleWJvYXJkWm9vbU9mZnNldCl9LGFkZEhvb2tzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLl9jb250YWluZXI7LTE9PT10LnRhYkluZGV4JiYodC50YWJJbmRleD0iMCIpLG8uRG9tRXZlbnQub24odCwiZm9jdXMiLHRoaXMuX29uRm9jdXMsdGhpcykub24odCwiYmx1ciIsdGhpcy5fb25CbHVyLHRoaXMpLm9uKHQsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24sdGhpcyksdGhpcy5fbWFwLm9uKCJmb2N1cyIsdGhpcy5fYWRkSG9va3MsdGhpcykub24oImJsdXIiLHRoaXMuX3JlbW92ZUhvb2tzLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUhvb2tzKCk7dmFyIHQ9dGhpcy5fbWFwLl9jb250YWluZXI7by5Eb21FdmVudC5vZmYodCwiZm9jdXMiLHRoaXMuX29uRm9jdXMsdGhpcykub2ZmKHQsImJsdXIiLHRoaXMuX29uQmx1cix0aGlzKS5vZmYodCwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bix0aGlzKSx0aGlzLl9tYXAub2ZmKCJmb2N1cyIsdGhpcy5fYWRkSG9va3MsdGhpcykub2ZmKCJibHVyIix0aGlzLl9yZW1vdmVIb29rcyx0aGlzKX0sX29uTW91c2VEb3duOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWQpe3ZhciBpPWUuYm9keSxuPWUuZG9jdW1lbnRFbGVtZW50LG89aS5zY3JvbGxUb3B8fG4uc2Nyb2xsVG9wLHM9aS5zY3JvbGxMZWZ0fHxuLnNjcm9sbExlZnQ7dGhpcy5fbWFwLl9jb250YWluZXIuZm9jdXMoKSx0LnNjcm9sbFRvKHMsbyl9fSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWQ9ITAsdGhpcy5fbWFwLmZpcmUoImZvY3VzIil9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkPSExLHRoaXMuX21hcC5maXJlKCJibHVyIil9LF9zZXRQYW5PZmZzZXQ6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPXRoaXMuX3BhbktleXM9e30sbz10aGlzLmtleUNvZGVzO2ZvcihlPTAsaT1vLmxlZnQubGVuZ3RoO2k+ZTtlKyspbltvLmxlZnRbZV1dPVstMSp0LDBdO2ZvcihlPTAsaT1vLnJpZ2h0Lmxlbmd0aDtpPmU7ZSsrKW5bby5yaWdodFtlXV09W3QsMF07Zm9yKGU9MCxpPW8uZG93bi5sZW5ndGg7aT5lO2UrKyluW28uZG93bltlXV09WzAsdF07Zm9yKGU9MCxpPW8udXAubGVuZ3RoO2k+ZTtlKyspbltvLnVwW2VdXT1bMCwtMSp0XX0sX3NldFpvb21PZmZzZXQ6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPXRoaXMuX3pvb21LZXlzPXt9LG89dGhpcy5rZXlDb2Rlcztmb3IoZT0wLGk9by56b29tSW4ubGVuZ3RoO2k+ZTtlKyspbltvLnpvb21JbltlXV09dDtmb3IoZT0wLGk9by56b29tT3V0Lmxlbmd0aDtpPmU7ZSsrKW5bby56b29tT3V0W2VdXT0tdH0sX2FkZEhvb2tzOmZ1bmN0aW9uKCl7by5Eb21FdmVudC5vbihlLCJrZXlkb3duIix0aGlzLl9vbktleURvd24sdGhpcyl9LF9yZW1vdmVIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub2ZmKGUsImtleWRvd24iLHRoaXMuX29uS2V5RG93bix0aGlzKX0sX29uS2V5RG93bjpmdW5jdGlvbih0KXt2YXIgZT10LmtleUNvZGUsaT10aGlzLl9tYXA7aWYoZSBpbiB0aGlzLl9wYW5LZXlzKXtpZihpLl9wYW5BbmltJiZpLl9wYW5BbmltLl9pblByb2dyZXNzKXJldHVybjtpLnBhbkJ5KHRoaXMuX3BhbktleXNbZV0pLGkub3B0aW9ucy5tYXhCb3VuZHMmJmkucGFuSW5zaWRlQm91bmRzKGkub3B0aW9ucy5tYXhCb3VuZHMpfWVsc2V7aWYoIShlIGluIHRoaXMuX3pvb21LZXlzKSlyZXR1cm47aS5zZXRab29tKGkuZ2V0Wm9vbSgpK3RoaXMuX3pvb21LZXlzW2VdKX1vLkRvbUV2ZW50LnN0b3AodCl9fSksby5NYXAuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJrZXlib2FyZCIsby5NYXAuS2V5Ym9hcmQpLG8uSGFuZGxlci5NYXJrZXJEcmFnPW8uSGFuZGxlci5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFya2VyPXR9LGFkZEhvb2tzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFya2VyLl9pY29uO3RoaXMuX2RyYWdnYWJsZXx8KHRoaXMuX2RyYWdnYWJsZT1uZXcgby5EcmFnZ2FibGUodCx0KSksdGhpcy5fZHJhZ2dhYmxlLm9uKCJkcmFnc3RhcnQiLHRoaXMuX29uRHJhZ1N0YXJ0LHRoaXMpLm9uKCJkcmFnIix0aGlzLl9vbkRyYWcsdGhpcykub24oImRyYWdlbmQiLHRoaXMuX29uRHJhZ0VuZCx0aGlzKSx0aGlzLl9kcmFnZ2FibGUuZW5hYmxlKCksby5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX21hcmtlci5faWNvbiwibGVhZmxldC1tYXJrZXItZHJhZ2dhYmxlIil9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dhYmxlLm9mZigiZHJhZ3N0YXJ0Iix0aGlzLl9vbkRyYWdTdGFydCx0aGlzKS5vZmYoImRyYWciLHRoaXMuX29uRHJhZyx0aGlzKS5vZmYoImRyYWdlbmQiLHRoaXMuX29uRHJhZ0VuZCx0aGlzKSx0aGlzLl9kcmFnZ2FibGUuZGlzYWJsZSgpLG8uRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9tYXJrZXIuX2ljb24sImxlYWZsZXQtbWFya2VyLWRyYWdnYWJsZSIpfSxtb3ZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnZ2FibGUmJnRoaXMuX2RyYWdnYWJsZS5fbW92ZWR9LF9vbkRyYWdTdGFydDpmdW5jdGlvbigpe3RoaXMuX21hcmtlci5jbG9zZVBvcHVwKCkuZmlyZSgibW92ZXN0YXJ0IikuZmlyZSgiZHJhZ3N0YXJ0Iil9LF9vbkRyYWc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXJrZXIsZT10Ll9zaGFkb3csaT1vLkRvbVV0aWwuZ2V0UG9zaXRpb24odC5faWNvbiksbj10Ll9tYXAubGF5ZXJQb2ludFRvTGF0TG5nKGkpO2UmJm8uRG9tVXRpbC5zZXRQb3NpdGlvbihlLGkpLHQuX2xhdGxuZz1uLHQuZmlyZSgibW92ZSIse2xhdGxuZzpufSkuZmlyZSgiZHJhZyIpfSxfb25EcmFnRW5kOmZ1bmN0aW9uKHQpe3RoaXMuX21hcmtlci5maXJlKCJtb3ZlZW5kIikuZmlyZSgiZHJhZ2VuZCIsdCl9fSksby5Db250cm9sPW8uQ2xhc3MuZXh0ZW5kKHtvcHRpb25zOntwb3NpdGlvbjoidG9wcmlnaHQifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe28uc2V0T3B0aW9ucyh0aGlzLHQpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb259LHNldFBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcDtyZXR1cm4gZSYmZS5yZW1vdmVDb250cm9sKHRoaXMpLHRoaXMub3B0aW9ucy5wb3NpdGlvbj10LGUmJmUuYWRkQ29udHJvbCh0aGlzKSx0aGlzfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxhZGRUbzpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dDt2YXIgZT10aGlzLl9jb250YWluZXI9dGhpcy5vbkFkZCh0KSxpPXRoaXMuZ2V0UG9zaXRpb24oKSxuPXQuX2NvbnRyb2xDb3JuZXJzW2ldO3JldHVybiBvLkRvbVV0aWwuYWRkQ2xhc3MoZSwibGVhZmxldC1jb250cm9sIiksLTEhPT1pLmluZGV4T2YoImJvdHRvbSIpP24uaW5zZXJ0QmVmb3JlKGUsbi5maXJzdENoaWxkKTpuLmFwcGVuZENoaWxkKGUpLHRoaXN9LHJlbW92ZUZyb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbigpLGk9dC5fY29udHJvbENvcm5lcnNbZV07cmV0dXJuIGkucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLl9tYXA9bnVsbCx0aGlzLm9uUmVtb3ZlJiZ0aGlzLm9uUmVtb3ZlKHQpLHRoaXN9LF9yZWZvY3VzT25NYXA6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJnRoaXMuX21hcC5nZXRDb250YWluZXIoKS5mb2N1cygpfX0pLG8uY29udHJvbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8uQ29udHJvbCh0KX0sby5NYXAuaW5jbHVkZSh7YWRkQ29udHJvbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRUbyh0aGlzKSx0aGlzfSxyZW1vdmVDb250cm9sOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlbW92ZUZyb20odGhpcyksdGhpc30sX2luaXRDb250cm9sUG9zOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LHMpe3ZhciBhPWkrdCsiICIraStzO2VbdCtzXT1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGEsbil9dmFyIGU9dGhpcy5fY29udHJvbENvcm5lcnM9e30saT0ibGVhZmxldC0iLG49dGhpcy5fY29udHJvbENvbnRhaW5lcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGkrImNvbnRyb2wtY29udGFpbmVyIix0aGlzLl9jb250YWluZXIpO3QoInRvcCIsImxlZnQiKSx0KCJ0b3AiLCJyaWdodCIpLHQoImJvdHRvbSIsImxlZnQiKSx0KCJib3R0b20iLCJyaWdodCIpfSxfY2xlYXJDb250cm9sUG9zOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRyb2xDb250YWluZXIpfX0pLG8uQ29udHJvbC5ab29tPW8uQ29udHJvbC5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOiJ0b3BsZWZ0Iix6b29tSW5UZXh0OiIrIix6b29tSW5UaXRsZToiWm9vbSBpbiIsem9vbU91dFRleHQ6Ii0iLHpvb21PdXRUaXRsZToiWm9vbSBvdXQifSxvbkFkZDpmdW5jdGlvbih0KXt2YXIgZT0ibGVhZmxldC1jb250cm9sLXpvb20iLGk9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IixlKyIgbGVhZmxldC1iYXIiKTtyZXR1cm4gdGhpcy5fbWFwPXQsdGhpcy5fem9vbUluQnV0dG9uPXRoaXMuX2NyZWF0ZUJ1dHRvbih0aGlzLm9wdGlvbnMuem9vbUluVGV4dCx0aGlzLm9wdGlvbnMuem9vbUluVGl0bGUsZSsiLWluIixpLHRoaXMuX3pvb21Jbix0aGlzKSx0aGlzLl96b29tT3V0QnV0dG9uPXRoaXMuX2NyZWF0ZUJ1dHRvbih0aGlzLm9wdGlvbnMuem9vbU91dFRleHQsdGhpcy5vcHRpb25zLnpvb21PdXRUaXRsZSxlKyItb3V0IixpLHRoaXMuX3pvb21PdXQsdGhpcyksdGhpcy5fdXBkYXRlRGlzYWJsZWQoKSx0Lm9uKCJ6b29tZW5kIHpvb21sZXZlbHNjaGFuZ2UiLHRoaXMuX3VwZGF0ZURpc2FibGVkLHRoaXMpLGl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3Qub2ZmKCJ6b29tZW5kIHpvb21sZXZlbHNjaGFuZ2UiLHRoaXMuX3VwZGF0ZURpc2FibGVkLHRoaXMpfSxfem9vbUluOmZ1bmN0aW9uKHQpe3RoaXMuX21hcC56b29tSW4odC5zaGlmdEtleT8zOjEpfSxfem9vbU91dDpmdW5jdGlvbih0KXt0aGlzLl9tYXAuem9vbU91dCh0LnNoaWZ0S2V5PzM6MSl9LF9jcmVhdGVCdXR0b246ZnVuY3Rpb24odCxlLGksbixzLGEpe3ZhciByPW8uRG9tVXRpbC5jcmVhdGUoImEiLGksbik7ci5pbm5lckhUTUw9dCxyLmhyZWY9IiMiLHIudGl0bGU9ZTt2YXIgaD1vLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbjtyZXR1cm4gby5Eb21FdmVudC5vbihyLCJjbGljayIsaCkub24ociwibW91c2Vkb3duIixoKS5vbihyLCJkYmxjbGljayIsaCkub24ociwiY2xpY2siLG8uRG9tRXZlbnQucHJldmVudERlZmF1bHQpLm9uKHIsImNsaWNrIixzLGEpLm9uKHIsImNsaWNrIix0aGlzLl9yZWZvY3VzT25NYXAsYSkscn0sX3VwZGF0ZURpc2FibGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGU9ImxlYWZsZXQtZGlzYWJsZWQiO28uRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl96b29tSW5CdXR0b24sZSksby5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX3pvb21PdXRCdXR0b24sZSksdC5fem9vbT09PXQuZ2V0TWluWm9vbSgpJiZvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fem9vbU91dEJ1dHRvbixlKSx0Ll96b29tPT09dC5nZXRNYXhab29tKCkmJm8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl96b29tSW5CdXR0b24sZSl9fSksby5NYXAubWVyZ2VPcHRpb25zKHt6b29tQ29udHJvbDohMH0pLG8uTWFwLmFkZEluaXRIb29rKGZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnpvb21Db250cm9sJiYodGhpcy56b29tQ29udHJvbD1uZXcgby5Db250cm9sLlpvb20sdGhpcy5hZGRDb250cm9sKHRoaXMuem9vbUNvbnRyb2wpKX0pLG8uY29udHJvbC56b29tPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5Db250cm9sLlpvb20odCl9LG8uQ29udHJvbC5BdHRyaWJ1dGlvbj1vLkNvbnRyb2wuZXh0ZW5kKHtvcHRpb25zOntwb3NpdGlvbjoiYm90dG9tcmlnaHQiLHByZWZpeDonPGEgaHJlZj0iaHR0cDovL2xlYWZsZXRqcy5jb20iIHRpdGxlPSJBIEpTIGxpYnJhcnkgZm9yIGludGVyYWN0aXZlIG1hcHMiPkxlYWZsZXQ8L2E+J30saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtvLnNldE9wdGlvbnModGhpcyx0KSx0aGlzLl9hdHRyaWJ1dGlvbnM9e319LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX2NvbnRhaW5lcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLCJsZWFmbGV0LWNvbnRyb2wtYXR0cmlidXRpb24iKSxvLkRvbUV2ZW50LmRpc2FibGVDbGlja1Byb3BhZ2F0aW9uKHRoaXMuX2NvbnRhaW5lcik7Zm9yKHZhciBlIGluIHQuX2xheWVycyl0Ll9sYXllcnNbZV0uZ2V0QXR0cmlidXRpb24mJnRoaXMuYWRkQXR0cmlidXRpb24odC5fbGF5ZXJzW2VdLmdldEF0dHJpYnV0aW9uKCkpO3JldHVybiB0Lm9uKCJsYXllcmFkZCIsdGhpcy5fb25MYXllckFkZCx0aGlzKS5vbigibGF5ZXJyZW1vdmUiLHRoaXMuX29uTGF5ZXJSZW1vdmUsdGhpcyksdGhpcy5fdXBkYXRlKCksdGhpcy5fY29udGFpbmVyfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZigibGF5ZXJhZGQiLHRoaXMuX29uTGF5ZXJBZGQpLm9mZigibGF5ZXJyZW1vdmUiLHRoaXMuX29uTGF5ZXJSZW1vdmUpfSxzZXRQcmVmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wcmVmaXg9dCx0aGlzLl91cGRhdGUoKSx0aGlzfSxhZGRBdHRyaWJ1dGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdD8odGhpcy5fYXR0cmlidXRpb25zW3RdfHwodGhpcy5fYXR0cmlidXRpb25zW3RdPTApLHRoaXMuX2F0dHJpYnV0aW9uc1t0XSsrLHRoaXMuX3VwZGF0ZSgpLHRoaXMpOnZvaWQgMH0scmVtb3ZlQXR0cmlidXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KHRoaXMuX2F0dHJpYnV0aW9uc1t0XSYmKHRoaXMuX2F0dHJpYnV0aW9uc1t0XS0tLHRoaXMuX3VwZGF0ZSgpKSx0aGlzKTp2b2lkIDB9LF91cGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXApe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLl9hdHRyaWJ1dGlvbnMpdGhpcy5fYXR0cmlidXRpb25zW2VdJiZ0LnB1c2goZSk7dmFyIGk9W107dGhpcy5vcHRpb25zLnByZWZpeCYmaS5wdXNoKHRoaXMub3B0aW9ucy5wcmVmaXgpLHQubGVuZ3RoJiZpLnB1c2godC5qb2luKCIsICIpKSx0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPWkuam9pbigiIHwgIil9fSxfb25MYXllckFkZDpmdW5jdGlvbih0KXt0LmxheWVyLmdldEF0dHJpYnV0aW9uJiZ0aGlzLmFkZEF0dHJpYnV0aW9uKHQubGF5ZXIuZ2V0QXR0cmlidXRpb24oKSl9LF9vbkxheWVyUmVtb3ZlOmZ1bmN0aW9uKHQpe3QubGF5ZXIuZ2V0QXR0cmlidXRpb24mJnRoaXMucmVtb3ZlQXR0cmlidXRpb24odC5sYXllci5nZXRBdHRyaWJ1dGlvbigpKX19KSxvLk1hcC5tZXJnZU9wdGlvbnMoe2F0dHJpYnV0aW9uQ29udHJvbDohMH0pLG8uTWFwLmFkZEluaXRIb29rKGZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbCYmKHRoaXMuYXR0cmlidXRpb25Db250cm9sPShuZXcgby5Db250cm9sLkF0dHJpYnV0aW9uKS5hZGRUbyh0aGlzKSl9KSxvLmNvbnRyb2wuYXR0cmlidXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLkNvbnRyb2wuQXR0cmlidXRpb24odCl9LG8uQ29udHJvbC5TY2FsZT1vLkNvbnRyb2wuZXh0ZW5kKHtvcHRpb25zOntwb3NpdGlvbjoiYm90dG9tbGVmdCIsbWF4V2lkdGg6MTAwLG1ldHJpYzohMCxpbXBlcmlhbDohMCx1cGRhdGVXaGVuSWRsZTohMX0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQ7dmFyIGU9ImxlYWZsZXQtY29udHJvbC1zY2FsZSIsaT1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUpLG49dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLl9hZGRTY2FsZXMobixlLGkpLHQub24obi51cGRhdGVXaGVuSWRsZT8ibW92ZWVuZCI6Im1vdmUiLHRoaXMuX3VwZGF0ZSx0aGlzKSx0LndoZW5SZWFkeSh0aGlzLl91cGRhdGUsdGhpcyksaX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dC5vZmYodGhpcy5vcHRpb25zLnVwZGF0ZVdoZW5JZGxlPyJtb3ZlZW5kIjoibW92ZSIsdGhpcy5fdXBkYXRlLHRoaXMpfSxfYWRkU2NhbGVzOmZ1bmN0aW9uKHQsZSxpKXt0Lm1ldHJpYyYmKHRoaXMuX21TY2FsZT1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUrIi1saW5lIixpKSksdC5pbXBlcmlhbCYmKHRoaXMuX2lTY2FsZT1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUrIi1saW5lIixpKSl9LF91cGRhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAuZ2V0Qm91bmRzKCksZT10LmdldENlbnRlcigpLmxhdCxpPTYzNzgxMzcqTWF0aC5QSSpNYXRoLmNvcyhlKk1hdGguUEkvMTgwKSxuPWkqKHQuZ2V0Tm9ydGhFYXN0KCkubG5nLXQuZ2V0U291dGhXZXN0KCkubG5nKS8xODAsbz10aGlzLl9tYXAuZ2V0U2l6ZSgpLHM9dGhpcy5vcHRpb25zLGE9MDtvLng+MCYmKGE9bioocy5tYXhXaWR0aC9vLngpKSx0aGlzLl91cGRhdGVTY2FsZXMocyxhKX0sX3VwZGF0ZVNjYWxlczpmdW5jdGlvbih0LGUpe3QubWV0cmljJiZlJiZ0aGlzLl91cGRhdGVNZXRyaWMoZSksdC5pbXBlcmlhbCYmZSYmdGhpcy5fdXBkYXRlSW1wZXJpYWwoZSl9LF91cGRhdGVNZXRyaWM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0Um91bmROdW0odCk7dGhpcy5fbVNjYWxlLnN0eWxlLndpZHRoPXRoaXMuX2dldFNjYWxlV2lkdGgoZS90KSsicHgiLHRoaXMuX21TY2FsZS5pbm5lckhUTUw9MWUzPmU/ZSsiIG0iOmUvMWUzKyIga20ifSxfdXBkYXRlSW1wZXJpYWw6ZnVuY3Rpb24odCl7dmFyIGUsaSxuLG89My4yODA4Mzk5KnQscz10aGlzLl9pU2NhbGU7bz41MjgwPyhlPW8vNTI4MCxpPXRoaXMuX2dldFJvdW5kTnVtKGUpLHMuc3R5bGUud2lkdGg9dGhpcy5fZ2V0U2NhbGVXaWR0aChpL2UpKyJweCIscy5pbm5lckhUTUw9aSsiIG1pIik6KG49dGhpcy5fZ2V0Um91bmROdW0obykscy5zdHlsZS53aWR0aD10aGlzLl9nZXRTY2FsZVdpZHRoKG4vbykrInB4IixzLmlubmVySFRNTD1uKyIgZnQiKX0sX2dldFNjYWxlV2lkdGg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodGhpcy5vcHRpb25zLm1heFdpZHRoKnQpLTEwfSxfZ2V0Um91bmROdW06ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5wb3coMTAsKE1hdGguZmxvb3IodCkrIiIpLmxlbmd0aC0xKSxpPXQvZTtyZXR1cm4gaT1pPj0xMD8xMDppPj01PzU6aT49Mz8zOmk+PTI/MjoxLGUqaX19KSxvLmNvbnRyb2wuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLkNvbnRyb2wuU2NhbGUodCl9LG8uQ29udHJvbC5MYXllcnM9by5Db250cm9sLmV4dGVuZCh7b3B0aW9uczp7Y29sbGFwc2VkOiEwLHBvc2l0aW9uOiJ0b3ByaWdodCIsYXV0b1pJbmRleDohMH0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsaSl7by5zZXRPcHRpb25zKHRoaXMsaSksdGhpcy5fbGF5ZXJzPXt9LHRoaXMuX2xhc3RaSW5kZXg9MCx0aGlzLl9oYW5kbGluZ0NsaWNrPSExO2Zvcih2YXIgbiBpbiB0KXRoaXMuX2FkZExheWVyKHRbbl0sbik7Zm9yKG4gaW4gZSl0aGlzLl9hZGRMYXllcihlW25dLG4sITApfSxvbkFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW5pdExheW91dCgpLHRoaXMuX3VwZGF0ZSgpLHQub24oImxheWVyYWRkIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpLm9uKCJsYXllcnJlbW92ZSIsdGhpcy5fb25MYXllckNoYW5nZSx0aGlzKSx0aGlzLl9jb250YWluZXJ9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3Qub2ZmKCJsYXllcmFkZCIsdGhpcy5fb25MYXllckNoYW5nZSx0aGlzKS5vZmYoImxheWVycmVtb3ZlIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpfSxhZGRCYXNlTGF5ZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fYWRkTGF5ZXIodCxlKSx0aGlzLl91cGRhdGUoKSx0aGlzfSxhZGRPdmVybGF5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2FkZExheWVyKHQsZSwhMCksdGhpcy5fdXBkYXRlKCksdGhpc30scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9by5zdGFtcCh0KTtyZXR1cm4gZGVsZXRlIHRoaXMuX2xheWVyc1tlXSx0aGlzLl91cGRhdGUoKSx0aGlzfSxfaW5pdExheW91dDpmdW5jdGlvbigpe3ZhciB0PSJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzIixlPXRoaXMuX2NvbnRhaW5lcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLHQpO2Uuc2V0QXR0cmlidXRlKCJhcmlhLWhhc3BvcHVwIiwhMCksby5Ccm93c2VyLnRvdWNoP28uRG9tRXZlbnQub24oZSwiY2xpY2siLG8uRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKTpvLkRvbUV2ZW50LmRpc2FibGVDbGlja1Byb3BhZ2F0aW9uKGUpLmRpc2FibGVTY3JvbGxQcm9wYWdhdGlvbihlKTt2YXIgaT10aGlzLl9mb3JtPW8uRG9tVXRpbC5jcmVhdGUoImZvcm0iLHQrIi1saXN0Iik7aWYodGhpcy5vcHRpb25zLmNvbGxhcHNlZCl7by5Ccm93c2VyLmFuZHJvaWR8fG8uRG9tRXZlbnQub24oZSwibW91c2VvdmVyIix0aGlzLl9leHBhbmQsdGhpcykub24oZSwibW91c2VvdXQiLHRoaXMuX2NvbGxhcHNlLHRoaXMpO3ZhciBuPXRoaXMuX2xheWVyc0xpbms9by5Eb21VdGlsLmNyZWF0ZSgiYSIsdCsiLXRvZ2dsZSIsZSk7bi5ocmVmPSIjIixuLnRpdGxlPSJMYXllcnMiLG8uQnJvd3Nlci50b3VjaD9vLkRvbUV2ZW50Lm9uKG4sImNsaWNrIixvLkRvbUV2ZW50LnN0b3ApLm9uKG4sImNsaWNrIix0aGlzLl9leHBhbmQsdGhpcyk6by5Eb21FdmVudC5vbihuLCJmb2N1cyIsdGhpcy5fZXhwYW5kLHRoaXMpLG8uRG9tRXZlbnQub24oaSwiY2xpY2siLGZ1bmN0aW9uKCl7c2V0VGltZW91dChvLmJpbmQodGhpcy5fb25JbnB1dENsaWNrLHRoaXMpLDApfSx0aGlzKSx0aGlzLl9tYXAub24oImNsaWNrIix0aGlzLl9jb2xsYXBzZSx0aGlzKX1lbHNlIHRoaXMuX2V4cGFuZCgpO3RoaXMuX2Jhc2VMYXllcnNMaXN0PW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsdCsiLWJhc2UiLGkpLHRoaXMuX3NlcGFyYXRvcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLHQrIi1zZXBhcmF0b3IiLGkpLHRoaXMuX292ZXJsYXlzTGlzdD1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLHQrIi1vdmVybGF5cyIsaSksZS5hcHBlbmRDaGlsZChpKX0sX2FkZExheWVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1vLnN0YW1wKHQpO3RoaXMuX2xheWVyc1tuXT17bGF5ZXI6dCxuYW1lOmUsb3ZlcmxheTppfSx0aGlzLm9wdGlvbnMuYXV0b1pJbmRleCYmdC5zZXRaSW5kZXgmJih0aGlzLl9sYXN0WkluZGV4KyssdC5zZXRaSW5kZXgodGhpcy5fbGFzdFpJbmRleCkpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fY29udGFpbmVyKXt0aGlzLl9iYXNlTGF5ZXJzTGlzdC5pbm5lckhUTUw9IiIsdGhpcy5fb3ZlcmxheXNMaXN0LmlubmVySFRNTD0iIjt2YXIgdCxlLGk9ITEsbj0hMTtmb3IodCBpbiB0aGlzLl9sYXllcnMpZT10aGlzLl9sYXllcnNbdF0sdGhpcy5fYWRkSXRlbShlKSxuPW58fGUub3ZlcmxheSxpPWl8fCFlLm92ZXJsYXk7dGhpcy5fc2VwYXJhdG9yLnN0eWxlLmRpc3BsYXk9biYmaT8iIjoibm9uZSJ9fSxfb25MYXllckNoYW5nZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sYXllcnNbby5zdGFtcCh0LmxheWVyKV07aWYoZSl7dGhpcy5faGFuZGxpbmdDbGlja3x8dGhpcy5fdXBkYXRlKCk7dmFyIGk9ZS5vdmVybGF5PyJsYXllcmFkZCI9PT10LnR5cGU/Im92ZXJsYXlhZGQiOiJvdmVybGF5cmVtb3ZlIjoibGF5ZXJhZGQiPT09dC50eXBlPyJiYXNlbGF5ZXJjaGFuZ2UiOm51bGw7aSYmdGhpcy5fbWFwLmZpcmUoaSxlKX19LF9jcmVhdGVSYWRpb0VsZW1lbnQ6ZnVuY3Rpb24odCxpKXt2YXIgbj0nPGlucHV0IHR5cGU9InJhZGlvIiBjbGFzcz0ibGVhZmxldC1jb250cm9sLWxheWVycy1zZWxlY3RvciIgbmFtZT0iJyt0KyciJztpJiYobis9JyBjaGVja2VkPSJjaGVja2VkIicpLG4rPSIvPiI7dmFyIG89ZS5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gby5pbm5lckhUTUw9bixvLmZpcnN0Q2hpbGR9LF9hZGRJdGVtOmZ1bmN0aW9uKHQpe3ZhciBpLG49ZS5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLHM9dGhpcy5fbWFwLmhhc0xheWVyKHQubGF5ZXIpO3Qub3ZlcmxheT8oaT1lLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS50eXBlPSJjaGVja2JveCIsaS5jbGFzc05hbWU9ImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2VsZWN0b3IiLGkuZGVmYXVsdENoZWNrZWQ9cyk6aT10aGlzLl9jcmVhdGVSYWRpb0VsZW1lbnQoImxlYWZsZXQtYmFzZS1sYXllcnMiLHMpLGkubGF5ZXJJZD1vLnN0YW1wKHQubGF5ZXIpLG8uRG9tRXZlbnQub24oaSwiY2xpY2siLHRoaXMuX29uSW5wdXRDbGljayx0aGlzKTt2YXIgYT1lLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTthLmlubmVySFRNTD0iICIrdC5uYW1lLG4uYXBwZW5kQ2hpbGQoaSksbi5hcHBlbmRDaGlsZChhKTt2YXIgcj10Lm92ZXJsYXk/dGhpcy5fb3ZlcmxheXNMaXN0OnRoaXMuX2Jhc2VMYXllcnNMaXN0O3JldHVybiByLmFwcGVuZENoaWxkKG4pLG59LF9vbklucHV0Q2xpY2s6ZnVuY3Rpb24oKXt2YXIgdCxlLGksbj10aGlzLl9mb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLG89bi5sZW5ndGg7Zm9yKHRoaXMuX2hhbmRsaW5nQ2xpY2s9ITAsdD0wO28+dDt0KyspZT1uW3RdLGk9dGhpcy5fbGF5ZXJzW2UubGF5ZXJJZF0sZS5jaGVja2VkJiYhdGhpcy5fbWFwLmhhc0xheWVyKGkubGF5ZXIpP3RoaXMuX21hcC5hZGRMYXllcihpLmxheWVyKTohZS5jaGVja2VkJiZ0aGlzLl9tYXAuaGFzTGF5ZXIoaS5sYXllcikmJnRoaXMuX21hcC5yZW1vdmVMYXllcihpLmxheWVyKTt0aGlzLl9oYW5kbGluZ0NsaWNrPSExLHRoaXMuX3JlZm9jdXNPbk1hcCgpfSxfZXhwYW5kOmZ1bmN0aW9uKCl7by5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1jb250cm9sLWxheWVycy1leHBhbmRlZCIpfSxfY29sbGFwc2U6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lPXRoaXMuX2NvbnRhaW5lci5jbGFzc05hbWUucmVwbGFjZSgiIGxlYWZsZXQtY29udHJvbC1sYXllcnMtZXhwYW5kZWQiLCIiKX19KSxvLmNvbnRyb2wubGF5ZXJzPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IG8uQ29udHJvbC5MYXllcnModCxlLGkpfSxvLlBvc0FuaW1hdGlvbj1vLkNsYXNzLmV4dGVuZCh7aW5jbHVkZXM6by5NaXhpbi5FdmVudHMscnVuOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuc3RvcCgpLHRoaXMuX2VsPXQsdGhpcy5faW5Qcm9ncmVzcz0hMCx0aGlzLl9uZXdQb3M9ZSx0aGlzLmZpcmUoInN0YXJ0IiksdC5zdHlsZVtvLkRvbVV0aWwuVFJBTlNJVElPTl09ImFsbCAiKyhpfHwuMjUpKyJzIGN1YmljLWJlemllcigwLDAsIisobnx8LjUpKyIsMSkiLG8uRG9tRXZlbnQub24odCxvLkRvbVV0aWwuVFJBTlNJVElPTl9FTkQsdGhpcy5fb25UcmFuc2l0aW9uRW5kLHRoaXMpLG8uRG9tVXRpbC5zZXRQb3NpdGlvbih0LGUpLG8uVXRpbC5mYWxzZUZuKHQub2Zmc2V0V2lkdGgpLHRoaXMuX3N0ZXBUaW1lcj1zZXRJbnRlcnZhbChvLmJpbmQodGhpcy5fb25TdGVwLHRoaXMpLDUwKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2luUHJvZ3Jlc3MmJihvLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5fZWwsdGhpcy5fZ2V0UG9zKCkpLHRoaXMuX29uVHJhbnNpdGlvbkVuZCgpLG8uVXRpbC5mYWxzZUZuKHRoaXMuX2VsLm9mZnNldFdpZHRoKSl9LF9vblN0ZXA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRQb3MoKTtyZXR1cm4gdD8odGhpcy5fZWwuX2xlYWZsZXRfcG9zPXQsdm9pZCB0aGlzLmZpcmUoInN0ZXAiKSk6dm9pZCB0aGlzLl9vblRyYW5zaXRpb25FbmQoKX0sX3RyYW5zZm9ybVJlOi8oWy0rXT8oPzpcZCpcLik/XGQrKVxEKiwgKFstK10/KD86XGQqXC4pP1xkKylcRCpcKS8sX2dldFBvczpmdW5jdGlvbigpe3ZhciBlLGksbixzPXRoaXMuX2VsLGE9dC5nZXRDb21wdXRlZFN0eWxlKHMpO2lmKG8uQnJvd3Nlci5hbnkzZCl7aWYobj1hW28uRG9tVXRpbC5UUkFOU0ZPUk1dLm1hdGNoKHRoaXMuX3RyYW5zZm9ybVJlKSwhbilyZXR1cm47ZT1wYXJzZUZsb2F0KG5bMV0pLGk9cGFyc2VGbG9hdChuWzJdKX1lbHNlIGU9cGFyc2VGbG9hdChhLmxlZnQpLGk9cGFyc2VGbG9hdChhLnRvcCk7cmV0dXJuIG5ldyBvLlBvaW50KGUsaSwhMCl9LF9vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXtvLkRvbUV2ZW50Lm9mZih0aGlzLl9lbCxvLkRvbVV0aWwuVFJBTlNJVElPTl9FTkQsdGhpcy5fb25UcmFuc2l0aW9uRW5kLHRoaXMpLHRoaXMuX2luUHJvZ3Jlc3MmJih0aGlzLl9pblByb2dyZXNzPSExLHRoaXMuX2VsLnN0eWxlW28uRG9tVXRpbC5UUkFOU0lUSU9OXT0iIix0aGlzLl9lbC5fbGVhZmxldF9wb3M9dGhpcy5fbmV3UG9zLGNsZWFySW50ZXJ2YWwodGhpcy5fc3RlcFRpbWVyKSx0aGlzLmZpcmUoInN0ZXAiKS5maXJlKCJlbmQiKSl9fSksby5NYXAuaW5jbHVkZSh7c2V0VmlldzpmdW5jdGlvbih0LGUsbil7aWYoZT1lPT09aT90aGlzLl96b29tOnRoaXMuX2xpbWl0Wm9vbShlKSx0PXRoaXMuX2xpbWl0Q2VudGVyKG8ubGF0TG5nKHQpLGUsdGhpcy5vcHRpb25zLm1heEJvdW5kcyksbj1ufHx7fSx0aGlzLl9wYW5BbmltJiZ0aGlzLl9wYW5BbmltLnN0b3AoKSx0aGlzLl9sb2FkZWQmJiFuLnJlc2V0JiZuIT09ITApe24uYW5pbWF0ZSE9PWkmJihuLnpvb209by5leHRlbmQoe2FuaW1hdGU6bi5hbmltYXRlfSxuLnpvb20pLG4ucGFuPW8uZXh0ZW5kKHthbmltYXRlOm4uYW5pbWF0ZX0sbi5wYW4pKTt2YXIgcz10aGlzLl96b29tIT09ZT90aGlzLl90cnlBbmltYXRlZFpvb20mJnRoaXMuX3RyeUFuaW1hdGVkWm9vbSh0LGUsbi56b29tKTp0aGlzLl90cnlBbmltYXRlZFBhbih0LG4ucGFuKTtpZihzKXJldHVybiBjbGVhclRpbWVvdXQodGhpcy5fc2l6ZVRpbWVyKSx0aGlzfXJldHVybiB0aGlzLl9yZXNldFZpZXcodCxlKSx0aGlzfSxwYW5CeTpmdW5jdGlvbih0LGUpe2lmKHQ9by5wb2ludCh0KS5yb3VuZCgpLGU9ZXx8e30sIXQueCYmIXQueSlyZXR1cm4gdGhpcztpZih0aGlzLl9wYW5BbmltfHwodGhpcy5fcGFuQW5pbT1uZXcgby5Qb3NBbmltYXRpb24sdGhpcy5fcGFuQW5pbS5vbih7c3RlcDp0aGlzLl9vblBhblRyYW5zaXRpb25TdGVwLGVuZDp0aGlzLl9vblBhblRyYW5zaXRpb25FbmR9LHRoaXMpKSxlLm5vTW92ZVN0YXJ0fHx0aGlzLmZpcmUoIm1vdmVzdGFydCIpLGUuYW5pbWF0ZSE9PSExKXtvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fbWFwUGFuZSwibGVhZmxldC1wYW4tYW5pbSIpO3ZhciBpPXRoaXMuX2dldE1hcFBhbmVQb3MoKS5zdWJ0cmFjdCh0KTt0aGlzLl9wYW5BbmltLnJ1bih0aGlzLl9tYXBQYW5lLGksZS5kdXJhdGlvbnx8LjI1LGUuZWFzZUxpbmVhcml0eSl9ZWxzZSB0aGlzLl9yYXdQYW5CeSh0KSx0aGlzLmZpcmUoIm1vdmUiKS5maXJlKCJtb3ZlZW5kIik7cmV0dXJuIHRoaXN9LF9vblBhblRyYW5zaXRpb25TdGVwOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJtb3ZlIil9LF9vblBhblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXtvLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fbWFwUGFuZSwibGVhZmxldC1wYW4tYW5pbSIpLHRoaXMuZmlyZSgibW92ZWVuZCIpfSxfdHJ5QW5pbWF0ZWRQYW46ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRDZW50ZXJPZmZzZXQodCkuX2Zsb29yKCk7cmV0dXJuKGUmJmUuYW5pbWF0ZSk9PT0hMHx8dGhpcy5nZXRTaXplKCkuY29udGFpbnMoaSk/KHRoaXMucGFuQnkoaSxlKSwhMCk6ITF9fSksby5Qb3NBbmltYXRpb249by5Eb21VdGlsLlRSQU5TSVRJT04/by5Qb3NBbmltYXRpb246by5Qb3NBbmltYXRpb24uZXh0ZW5kKHtydW46ZnVuY3Rpb24odCxlLGksbil7dGhpcy5zdG9wKCksdGhpcy5fZWw9dCx0aGlzLl9pblByb2dyZXNzPSEwLHRoaXMuX2R1cmF0aW9uPWl8fC4yNSx0aGlzLl9lYXNlT3V0UG93ZXI9MS9NYXRoLm1heChufHwuNSwuMiksdGhpcy5fc3RhcnRQb3M9by5Eb21VdGlsLmdldFBvc2l0aW9uKHQpLHRoaXMuX29mZnNldD1lLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9zKSx0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlLHRoaXMuZmlyZSgic3RhcnQiKSx0aGlzLl9hbmltYXRlKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9pblByb2dyZXNzJiYodGhpcy5fc3RlcCgpLHRoaXMuX2NvbXBsZXRlKCkpfSxfYW5pbWF0ZTpmdW5jdGlvbigpe3RoaXMuX2FuaW1JZD1vLlV0aWwucmVxdWVzdEFuaW1GcmFtZSh0aGlzLl9hbmltYXRlLHRoaXMpLHRoaXMuX3N0ZXAoKX0sX3N0ZXA6ZnVuY3Rpb24oKXt2YXIgdD0rbmV3IERhdGUtdGhpcy5fc3RhcnRUaW1lLGU9MWUzKnRoaXMuX2R1cmF0aW9uO2U+dD90aGlzLl9ydW5GcmFtZSh0aGlzLl9lYXNlT3V0KHQvZSkpOih0aGlzLl9ydW5GcmFtZSgxKSx0aGlzLl9jb21wbGV0ZSgpKX0sX3J1bkZyYW1lOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3N0YXJ0UG9zLmFkZCh0aGlzLl9vZmZzZXQubXVsdGlwbHlCeSh0KSk7by5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2VsLGUpLHRoaXMuZmlyZSgic3RlcCIpfSxfY29tcGxldGU6ZnVuY3Rpb24oKXtvLlV0aWwuY2FuY2VsQW5pbUZyYW1lKHRoaXMuX2FuaW1JZCksdGhpcy5faW5Qcm9ncmVzcz0hMSx0aGlzLmZpcmUoImVuZCIpfSxfZWFzZU91dDpmdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsdGhpcy5fZWFzZU91dFBvd2VyKX19KSxvLk1hcC5tZXJnZU9wdGlvbnMoe3pvb21BbmltYXRpb246ITAsem9vbUFuaW1hdGlvblRocmVzaG9sZDo0fSksby5Eb21VdGlsLlRSQU5TSVRJT04mJm8uTWFwLmFkZEluaXRIb29rKGZ1bmN0aW9uKCl7dGhpcy5fem9vbUFuaW1hdGVkPXRoaXMub3B0aW9ucy56b29tQW5pbWF0aW9uJiZvLkRvbVV0aWwuVFJBTlNJVElPTiYmby5Ccm93c2VyLmFueTNkJiYhby5Ccm93c2VyLmFuZHJvaWQyMyYmIW8uQnJvd3Nlci5tb2JpbGVPcGVyYSx0aGlzLl96b29tQW5pbWF0ZWQmJm8uRG9tRXZlbnQub24odGhpcy5fbWFwUGFuZSxvLkRvbVV0aWwuVFJBTlNJVElPTl9FTkQsdGhpcy5fY2F0Y2hUcmFuc2l0aW9uRW5kLHRoaXMpfSksby5NYXAuaW5jbHVkZShvLkRvbVV0aWwuVFJBTlNJVElPTj97X2NhdGNoVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXt0aGlzLl9hbmltYXRpbmdab29tJiZ0LnByb3BlcnR5TmFtZS5pbmRleE9mKCJ0cmFuc2Zvcm0iKT49MCYmdGhpcy5fb25ab29tVHJhbnNpdGlvbkVuZCgpfSxfbm90aGluZ1RvQW5pbWF0ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLl9jb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibGVhZmxldC16b29tLWFuaW1hdGVkIikubGVuZ3RofSxfdHJ5QW5pbWF0ZWRab29tOmZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLl9hbmltYXRpbmdab29tKXJldHVybiEwO2lmKGk9aXx8e30sIXRoaXMuX3pvb21BbmltYXRlZHx8aS5hbmltYXRlPT09ITF8fHRoaXMuX25vdGhpbmdUb0FuaW1hdGUoKXx8TWF0aC5hYnMoZS10aGlzLl96b29tKT50aGlzLm9wdGlvbnMuem9vbUFuaW1hdGlvblRocmVzaG9sZClyZXR1cm4hMTt2YXIgbj10aGlzLmdldFpvb21TY2FsZShlKSxvPXRoaXMuX2dldENlbnRlck9mZnNldCh0KS5fZGl2aWRlQnkoMS0xL24pLHM9dGhpcy5fZ2V0Q2VudGVyTGF5ZXJQb2ludCgpLl9hZGQobyk7cmV0dXJuIGkuYW5pbWF0ZT09PSEwfHx0aGlzLmdldFNpemUoKS5jb250YWlucyhvKT8odGhpcy5maXJlKCJtb3Zlc3RhcnQiKS5maXJlKCJ6b29tc3RhcnQiKSx0aGlzLl9hbmltYXRlWm9vbSh0LGUscyxuLG51bGwsITApLCEwKTohMX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQsZSxpLG4scyxhLHIpe3J8fCh0aGlzLl9hbmltYXRpbmdab29tPSEwKSxvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fbWFwUGFuZSwibGVhZmxldC16b29tLWFuaW0iKSx0aGlzLl9hbmltYXRlVG9DZW50ZXI9dCx0aGlzLl9hbmltYXRlVG9ab29tPWUsby5EcmFnZ2FibGUmJihvLkRyYWdnYWJsZS5fZGlzYWJsZWQ9ITApLG8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJ6b29tYW5pbSIse2NlbnRlcjp0LHpvb206ZSxvcmlnaW46aSxzY2FsZTpuLGRlbHRhOnMsYmFja3dhcmRzOmF9KSxzZXRUaW1lb3V0KG8uYmluZCh0aGlzLl9vblpvb21UcmFuc2l0aW9uRW5kLHRoaXMpLDI1MCl9LHRoaXMpfSxfb25ab29tVHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGluZ1pvb20mJih0aGlzLl9hbmltYXRpbmdab29tPSExLG8uRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9tYXBQYW5lLCJsZWFmbGV0LXpvb20tYW5pbSIpLG8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKGZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRWaWV3KHRoaXMuX2FuaW1hdGVUb0NlbnRlcix0aGlzLl9hbmltYXRlVG9ab29tLCEwLCEwKSxvLkRyYWdnYWJsZSYmKG8uRHJhZ2dhYmxlLl9kaXNhYmxlZD0hMSl9LHRoaXMpKX19Ont9KSxvLlRpbGVMYXllci5pbmNsdWRlKHtfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dGhpcy5fYW5pbWF0aW5nfHwodGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuX3ByZXBhcmVCZ0J1ZmZlcigpKTt2YXIgZT10aGlzLl9iZ0J1ZmZlcixpPW8uRG9tVXRpbC5UUkFOU0ZPUk0sbj10LmRlbHRhP28uRG9tVXRpbC5nZXRUcmFuc2xhdGVTdHJpbmcodC5kZWx0YSk6ZS5zdHlsZVtpXSxzPW8uRG9tVXRpbC5nZXRTY2FsZVN0cmluZyh0LnNjYWxlLHQub3JpZ2luKTtlLnN0eWxlW2ldPXQuYmFja3dhcmRzP3MrIiAiK246bisiICIrc30sX2VuZFpvb21BbmltOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGlsZUNvbnRhaW5lcixlPXRoaXMuX2JnQnVmZmVyO3Quc3R5bGUudmlzaWJpbGl0eT0iIix0LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodCksby5VdGlsLmZhbHNlRm4oZS5vZmZzZXRXaWR0aCk7dmFyIGk9dGhpcy5fbWFwLmdldFpvb20oKTsoaT50aGlzLm9wdGlvbnMubWF4Wm9vbXx8aTx0aGlzLm9wdGlvbnMubWluWm9vbSkmJnRoaXMuX2NsZWFyQmdCdWZmZXIoKSx0aGlzLl9hbmltYXRpbmc9ITF9LF9jbGVhckJnQnVmZmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwOyF0fHx0Ll9hbmltYXRpbmdab29tfHx0LnRvdWNoWm9vbS5fem9vbWluZ3x8KHRoaXMuX2JnQnVmZmVyLmlubmVySFRNTD0iIix0aGlzLl9iZ0J1ZmZlci5zdHlsZVtvLkRvbVV0aWwuVFJBTlNGT1JNXT0iIil9LF9wcmVwYXJlQmdCdWZmZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl90aWxlQ29udGFpbmVyLGU9dGhpcy5fYmdCdWZmZXIsaT10aGlzLl9nZXRMb2FkZWRUaWxlc1BlcmNlbnRhZ2UoZSksbj10aGlzLl9nZXRMb2FkZWRUaWxlc1BlcmNlbnRhZ2UodCk7cmV0dXJuIGUmJmk+LjUmJi41Pm4/KHQuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix2b2lkIHRoaXMuX3N0b3BMb2FkaW5nSW1hZ2VzKHQpKTooZS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLGUuc3R5bGVbby5Eb21VdGlsLlRSQU5TRk9STV09IiIsdGhpcy5fdGlsZUNvbnRhaW5lcj1lLGU9dGhpcy5fYmdCdWZmZXI9dCx0aGlzLl9zdG9wTG9hZGluZ0ltYWdlcyhlKSx2b2lkIGNsZWFyVGltZW91dCh0aGlzLl9jbGVhckJnQnVmZmVyVGltZXIpKX0sX2dldExvYWRlZFRpbGVzUGVyY2VudGFnZTpmdW5jdGlvbih0KXt2YXIgZSxpLG49dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIiksbz0wO2ZvcihlPTAsaT1uLmxlbmd0aDtpPmU7ZSsrKW5bZV0uY29tcGxldGUmJm8rKztyZXR1cm4gby9pfSxfc3RvcExvYWRpbmdJbWFnZXM6ZnVuY3Rpb24odCl7dmFyIGUsaSxuLHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIikpO2ZvcihlPTAsaT1zLmxlbmd0aDtpPmU7ZSsrKW49c1tlXSxuLmNvbXBsZXRlfHwobi5vbmxvYWQ9by5VdGlsLmZhbHNlRm4sbi5vbmVycm9yPW8uVXRpbC5mYWxzZUZuLG4uc3JjPW8uVXRpbC5lbXB0eUltYWdlVXJsLG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSl9fSksby5NYXAuaW5jbHVkZSh7X2RlZmF1bHRMb2NhdGVPcHRpb25zOnt3YXRjaDohMSxzZXRWaWV3OiExLG1heFpvb206MS8wLHRpbWVvdXQ6MWU0LG1heGltdW1BZ2U6MCxlbmFibGVIaWdoQWNjdXJhY3k6ITF9LGxvY2F0ZTpmdW5jdGlvbih0KXtpZih0PXRoaXMuX2xvY2F0ZU9wdGlvbnM9by5leHRlbmQodGhpcy5fZGVmYXVsdExvY2F0ZU9wdGlvbnMsdCksIW5hdmlnYXRvci5nZW9sb2NhdGlvbilyZXR1cm4gdGhpcy5faGFuZGxlR2VvbG9jYXRpb25FcnJvcih7Y29kZTowLG1lc3NhZ2U6Ikdlb2xvY2F0aW9uIG5vdCBzdXBwb3J0ZWQuIn0pLHRoaXM7dmFyIGU9by5iaW5kKHRoaXMuX2hhbmRsZUdlb2xvY2F0aW9uUmVzcG9uc2UsdGhpcyksaT1vLmJpbmQodGhpcy5faGFuZGxlR2VvbG9jYXRpb25FcnJvcix0aGlzKTtyZXR1cm4gdC53YXRjaD90aGlzLl9sb2NhdGlvbldhdGNoSWQ9bmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oZSxpLHQpOm5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZSxpLHQpLHRoaXN9LHN0b3BMb2NhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLmdlb2xvY2F0aW9uJiZuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9sb2NhdGlvbldhdGNoSWQpLHRoaXMuX2xvY2F0ZU9wdGlvbnMmJih0aGlzLl9sb2NhdGVPcHRpb25zLnNldFZpZXc9ITEpLHRoaXN9LF9oYW5kbGVHZW9sb2NhdGlvbkVycm9yOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY29kZSxpPXQubWVzc2FnZXx8KDE9PT1lPyJwZXJtaXNzaW9uIGRlbmllZCI6Mj09PWU/InBvc2l0aW9uIHVuYXZhaWxhYmxlIjoidGltZW91dCIpO3RoaXMuX2xvY2F0ZU9wdGlvbnMuc2V0VmlldyYmIXRoaXMuX2xvYWRlZCYmdGhpcy5maXRXb3JsZCgpLHRoaXMuZmlyZSgibG9jYXRpb25lcnJvciIse2NvZGU6ZSxtZXNzYWdlOiJHZW9sb2NhdGlvbiBlcnJvcjogIitpKyIuIn0pfSxfaGFuZGxlR2VvbG9jYXRpb25SZXNwb25zZTpmdW5jdGlvbih0KXt2YXIgZT10LmNvb3Jkcy5sYXRpdHVkZSxpPXQuY29vcmRzLmxvbmdpdHVkZSxuPW5ldyBvLkxhdExuZyhlLGkpLHM9MTgwKnQuY29vcmRzLmFjY3VyYWN5LzQwMDc1MDE3LGE9cy9NYXRoLmNvcyhvLkxhdExuZy5ERUdfVE9fUkFEKmUpLHI9by5sYXRMbmdCb3VuZHMoW2UtcyxpLWFdLFtlK3MsaSthXSksaD10aGlzLl9sb2NhdGVPcHRpb25zO2lmKGguc2V0Vmlldyl7dmFyIGw9TWF0aC5taW4odGhpcy5nZXRCb3VuZHNab29tKHIpLGgubWF4Wm9vbSk7dGhpcy5zZXRWaWV3KG4sbCl9dmFyIHU9e2xhdGxuZzpuLGJvdW5kczpyLHRpbWVzdGFtcDp0LnRpbWVzdGFtcH07Zm9yKHZhciBjIGluIHQuY29vcmRzKSJudW1iZXIiPT10eXBlb2YgdC5jb29yZHNbY10mJih1W2NdPXQuY29vcmRzW2NdKTt0aGlzLmZpcmUoImxvY2F0aW9uZm91bmQiLHUpfX0pfSh3aW5kb3csZG9jdW1lbnQpOw=="></script>
<link href="data:text/css;charset=utf-8,%0Aimg%2Eleaflet%2Dtile%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aborder%2Dradius%3A%200%3B%0Aborder%3A%20none%3B%0A%7D%0A%2Einfo%20%7B%0Apadding%3A%206px%208px%3B%0Afont%3A%2014px%2F16px%20Arial%2C%20Helvetica%2C%20sans%2Dserif%3B%0Abackground%3A%20white%3B%0Abackground%3A%20rgba%28255%2C255%2C255%2C0%2E8%29%3B%0Abox%2Dshadow%3A%200%200%2015px%20rgba%280%2C0%2C0%2C0%2E2%29%3B%0Aborder%2Dradius%3A%205px%3B%0A%7D%0A%2Elegend%20%7B%0Aline%2Dheight%3A%2018px%3B%0Acolor%3A%20%23555%3B%0A%7D%0A%2Elegend%20svg%20text%20%7B%0Afill%3A%20%23555%3B%0A%7D%0A%2Elegend%20svg%20line%20%7B%0Astroke%3A%20%23555%3B%0A%7D%0A%2Elegend%20i%20%7B%0Awidth%3A%2018px%3B%0Aheight%3A%2018px%3B%0Afloat%3A%20left%3B%0Amargin%2Dright%3A%208px%3B%0Aopacity%3A%200%2E7%3B%0A%7D%0A" rel="stylesheet" /> <link href="data:text/css;charset=utf-8,%2Eleaflet%2Dlabel%20%7B%0Abackground%3A%20rgb%28235%2C%20235%2C%20235%29%3B%0Abackground%3A%20rgba%28235%2C%20235%2C%20235%2C%200%2E81%29%3B%0Abackground%2Dclip%3A%20padding%2Dbox%3B%0Aborder%2Dcolor%3A%20%23777%3B%0Aborder%2Dcolor%3A%20rgba%280%2C0%2C0%2C0%2E45%29%3B%0Aborder%2Dradius%3A%204px%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dwidth%3A%204px%3B%0Acolor%3A%20%23111%3B%0Adisplay%3A%20block%3B%0Afont%3A%2012px%2F20px%20%22Helvetica%20Neue%22%2C%20Arial%2C%20Helvetica%2C%20sans%2Dserif%3B%0Afont%2Dweight%3A%20bold%3B%0Apadding%3A%201px%206px%3B%0Aposition%3A%20absolute%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0Apointer%2Devents%3A%20none%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Az%2Dindex%3A%20500%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Eleaflet%2Dclickable%20%7B%0Acursor%3A%20pointer%3B%0Apointer%2Devents%3A%20auto%3B%0A%7D%0A%2Eleaflet%2Dlabel%3Abefore%2C%0A%2Eleaflet%2Dlabel%3Aafter%20%7B%0Aborder%2Dtop%3A%206px%20solid%20transparent%3B%0Aborder%2Dbottom%3A%206px%20solid%20transparent%3B%0Aborder%2Dright%3A%206px%20solid%20transparent%3B%0Acontent%3A%20none%3B%0Aposition%3A%20absolute%3B%0Atop%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dlabel%3Abefore%20%7B%0Aborder%2Dright%3A%206px%20solid%20black%3B%0Aborder%2Dright%2Dcolor%3A%20inherit%3B%0Aleft%3A%20%2D10px%3B%0A%7D%0A%2Eleaflet%2Dlabel%3Aafter%20%7B%0Aborder%2Dleft%3A%206px%20solid%20black%3B%0Aborder%2Dleft%2Dcolor%3A%20inherit%3B%0Aright%3A%20%2D16px%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Dtop%3Aafter%2C%0A%2Eleaflet%2Dlabel%2Dtop%3Abefore%20%7B%0Aleft%3A%20%2D50%25%3B%0Aborder%2Dtop%2Dcolor%3A%20black%3B%0Aborder%2Dtop%2Dcolor%3A%20rgba%280%2C0%2C0%2C0%2E45%29%3B%0Aposition%3A%20relative%3B%0Atop%3A%2029px%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Dtop%3Abefore%20%7B%0Adisplay%3A%20none%3B%0Aborder%2Dright%2Dcolor%3A%20transparent%3B%0Aborder%2Dbottom%2Dcolor%3A%20transparent%3B%0Aborder%2Dleft%2Dcolor%3A%20transparent%3B%0Aborder%2Dtop%2Dcolor%3A%20transparent%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Dtop%3Aafter%20%7B%0Acontent%3A%20%27%20%27%3B%0Aborder%2Dright%2Dcolor%3A%20transparent%3B%0Aborder%2Dbottom%2Dcolor%3A%20transparent%3B%0Aborder%2Dleft%2Dcolor%3A%20transparent%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Dbottom%3Abefore%20%7B%0Adisplay%3A%20none%3B%0Aborder%2Dright%2Dcolor%3A%20transparent%3B%0Aborder%2Dbottom%2Dcolor%3A%20transparent%3B%0Aborder%2Dleft%2Dcolor%3A%20transparent%3B%0Aborder%2Dtop%2Dcolor%3A%20transparent%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Dbottom%3Aafter%2C%0A%2Eleaflet%2Dlabel%2Dbottom%3Abefore%20%7B%0Aleft%3A%20%2D50%25%3B%0Aborder%2Dbottom%2Dcolor%3A%20black%3B%0Aborder%2Dbottom%2Dcolor%3A%20rgba%280%2C0%2C0%2C0%2E45%29%3B%0Aposition%3A%20relative%3B%0Atop%3A%20%2D28px%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Dbottom%3Aafter%20%7B%0Aborder%2Dright%2Dcolor%3A%20transparent%3B%0Aborder%2Dtop%2Dcolor%3A%20transparent%3B%0Aborder%2Dleft%2Dcolor%3A%20transparent%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Dbottom%3Aafter%2C%0A%2Eleaflet%2Dlabel%2Dtop%3Aafter%2C%0A%2Eleaflet%2Dlabel%2Dright%3Abefore%2C%0A%2Eleaflet%2Dlabel%2Dleft%3Aafter%20%7B%0Acontent%3A%20%22%22%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Eleaflet%2Dlabel%2Dtext%2Donly%2C%0A%2Eleaflet%2Dlabel%2Eleaflet%2Dlabel%2Dtext%2Donly%3Abefore%2C%0A%2Eleaflet%2Dlabel%2Eleaflet%2Dlabel%2Dtext%2Donly%3Aafter%20%7B%0Abackground%3A%20none%3B%0Aborder%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Eleaflet%2Dlabel%2Dtext%2Donly%2Eleaflet%2Dlabel%2Dleft%20%7B%0Amargin%2Dright%3A%20%2D10px%3B%0A%7D%0A%2Eleaflet%2Dlabel%2Eleaflet%2Dlabel%2Dtext%2Donly%2Eleaflet%2Dlabel%2Dright%20%7B%0Amargin%2Dleft%3A%20%2D10px%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoKCUxlYWZsZXQubGFiZWwsIGEgcGx1Z2luIHRoYXQgYWRkcyBsYWJlbHMgdG8gbWFya2VycyBhbmQgdmVjdG9ycyBmb3IgTGVhZmxldCBwb3dlcmVkIG1hcHMuCgkoYykgMjAxMi0yMDEzLCBKYWNvYiBUb3llLCBTbWFydHJhawoKCWh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQubGFiZWwKCWh0dHA6Ly9sZWFmbGV0anMuY29tCglodHRwczovL2dpdGh1Yi5jb20vamFjb2J0b3llCiovCiFmdW5jdGlvbih0LGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsibGVhZmxldCJdLHQpOiJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmKG1vZHVsZS5leHBvcnRzPXQocmVxdWlyZSgibGVhZmxldCIpKSksInVuZGVmaW5lZCIhPXR5cGVvZiBlJiZlLkwmJihlLkxlYWZsZXRMYWJlbD10KEwpKX0oZnVuY3Rpb24odCl7dC5sYWJlbFZlcnNpb249IjAuMi40Ijt2YXIgZT10LkNsYXNzLmV4dGVuZCh7aW5jbHVkZXM6dC5NaXhpbi5FdmVudHMsX2RpcmVjdGlvbnM6WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSxvcHRpb25zOntjbGFzc05hbWU6IiIsY2xpY2thYmxlOiExLGRpcmVjdGlvbjoicmlnaHQiLG5vSGlkZTohMSxvZmZzZXQ6WzEyLC0xNV0sb3BhY2l0eToxLHRleHRzaXplOiIxMHB4Iix0ZXh0T25seTohMSxzdHlsZTpudWxsLHpvb21BbmltYXRpb246ITB9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSxpKXt0LnNldE9wdGlvbnModGhpcyxlKSx0aGlzLl9zb3VyY2U9aSx0aGlzLl9hbmltYXRlZD10LkJyb3dzZXIuYW55M2QmJnRoaXMub3B0aW9ucy56b29tQW5pbWF0aW9uLHRoaXMuX2lzT3Blbj0hMX0sX2lzT25NYXJrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291cmNlIGluc3RhbmNlb2YgdC5NYXJrZXJ9LG9uQWRkOmZ1bmN0aW9uKGUpe3RoaXMuX21hcD1lLHRoaXMuX3BhbmU9dGhpcy5vcHRpb25zLnBhbmU/ZS5fcGFuZXNbdGhpcy5vcHRpb25zLnBhbmVdOnRoaXMuX2lzT25NYXJrZXIoKT9lLl9wYW5lcy5tYXJrZXJQYW5lOmUuX3BhbmVzLnBvcHVwUGFuZSx0aGlzLl9jb250YWluZXJ8fHRoaXMuX2luaXRMYXlvdXQoKSx0aGlzLl9wYW5lLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lciksdGhpcy5faW5pdEludGVyYWN0aW9uKCksdGhpcy5fdXBkYXRlKCksdGhpcy5zZXRPcGFjaXR5KHRoaXMub3B0aW9ucy5vcGFjaXR5KSxlLm9uKCJtb3ZlZW5kIix0aGlzLl9vbk1vdmVFbmQsdGhpcykub24oInZpZXdyZXNldCIsdGhpcy5fb25WaWV3UmVzZXQsdGhpcyksdGhpcy5fYW5pbWF0ZWQmJmUub24oInpvb21hbmltIix0aGlzLl96b29tQW5pbWF0aW9uLHRoaXMpLHQuQnJvd3Nlci50b3VjaCYmIXRoaXMub3B0aW9ucy5ub0hpZGUmJih0LkRvbUV2ZW50Lm9uKHRoaXMuX2NvbnRhaW5lciwiY2xpY2siLHRoaXMuY2xvc2UsdGhpcyksZS5vbigiY2xpY2siLHRoaXMuY2xvc2UsdGhpcykpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl9wYW5lLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lciksdC5vZmYoe3pvb21hbmltOnRoaXMuX3pvb21BbmltYXRpb24sbW92ZWVuZDp0aGlzLl9vbk1vdmVFbmQsdmlld3Jlc2V0OnRoaXMuX29uVmlld1Jlc2V0fSx0aGlzKSx0aGlzLl9yZW1vdmVJbnRlcmFjdGlvbigpLHRoaXMuX21hcD1udWxsfSxzZXRMYXRMbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2xhdGxuZz10LmxhdExuZyhlKSx0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpc30sc2V0Q29udGVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHJldmlvdXNDb250ZW50PXRoaXMuX2NvbnRlbnQsdGhpcy5fY29udGVudD10LHRoaXMuX3VwZGF0ZUNvbnRlbnQoKSx0aGlzfSxjbG9zZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX21hcDtlJiYodC5Ccm93c2VyLnRvdWNoJiYhdGhpcy5vcHRpb25zLm5vSGlkZSYmKHQuRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwiY2xpY2siLHRoaXMuY2xvc2UpLGUub2ZmKCJjbGljayIsdGhpcy5jbG9zZSx0aGlzKSksZS5yZW1vdmVMYXllcih0aGlzKSl9LHVwZGF0ZVpJbmRleDpmdW5jdGlvbih0KXt0aGlzLl96SW5kZXg9dCx0aGlzLl9jb250YWluZXImJnRoaXMuX3pJbmRleCYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS56SW5kZXg9dCl9LHNldE9wYWNpdHk6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zLm9wYWNpdHk9ZSx0aGlzLl9jb250YWluZXImJnQuRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2NvbnRhaW5lcixlKX0sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9jb250YWluZXI9dC5Eb21VdGlsLmNyZWF0ZSgiZGl2IiwibGVhZmxldC1sYWJlbCAiK3RoaXMub3B0aW9ucy5jbGFzc05hbWUrIiBsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLl9jb250YWluZXIuc3R5bGUuZm9udFNpemU9dGhpcy5vcHRpb25zLnRleHRzaXplLHRoaXMub3B0aW9ucy50ZXh0T25seSYmdC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1sYWJlbC10ZXh0LW9ubHkiKSx0aGlzLm9wdGlvbnMuc3R5bGUpZm9yKHZhciBlIGluIHRoaXMub3B0aW9ucy5zdHlsZSl0aGlzLm9wdGlvbnMuc3R5bGUuaGFzT3duUHJvcGVydHkoZSkmJih0aGlzLl9jb250YWluZXIuc3R5bGVbZV09dGhpcy5vcHRpb25zLnN0eWxlW2VdKTt0aGlzLnVwZGF0ZVpJbmRleCh0aGlzLl96SW5kZXgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYodGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9IiIpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbigpe3RoaXMuX2NvbnRlbnQmJnRoaXMuX21hcCYmdGhpcy5fcHJldkNvbnRlbnQhPT10aGlzLl9jb250ZW50JiYic3RyaW5nIj09dHlwZW9mIHRoaXMuX2NvbnRlbnQmJih0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPXRoaXMuX2NvbnRlbnQsdGhpcy5fcHJldkNvbnRlbnQ9dGhpcy5fY29udGVudCx0aGlzLl9sYWJlbFdpZHRoPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCl9LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKTt0aGlzLl9zZXRQb3NpdGlvbih0KX0sX2dldEljb25IZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291cmNlLm9wdGlvbnMuaWNvbj90aGlzLl9zb3VyY2Uub3B0aW9ucy5pY29uLm9wdGlvbnMuaWNvblNpemVbMV06MH0sX3NldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMuX21hcCxuPXRoaXMuX2NvbnRhaW5lcixvPWkubGF0TG5nVG9Db250YWluZXJQb2ludChpLmdldENlbnRlcigpKSxzPWkubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQoZSksYT10aGlzLl9nZXREaXJlY3Rpb24oKSxoPXRoaXMuX2xhYmVsV2lkdGgsbD10LnBvaW50KHRoaXMub3B0aW9ucy5vZmZzZXQpLHI9bC55OyJ0b3AiPT09YT8oci09dGhpcy5faXNPbk1hcmtlcigpP3RoaXMuX2dldEljb25IZWlnaHQoKTowLGU9ZS5hZGQodC5wb2ludCgtaC8yLHIpKSk6ImJvdHRvbSI9PT1hPyhyKz10aGlzLl9pc09uTWFya2VyP3RoaXMuX2dldEljb25IZWlnaHQoKTowLGU9ZS5hZGQodC5wb2ludCgtaC8yLHIpKSk6InJpZ2h0Ij09PWF8fCJhdXRvIj09PWEmJnMueDxvLng/KGE9InJpZ2h0IixlPWUuYWRkKGwpKTooYT0ibGVmdCIsZT1lLmFkZCh0LnBvaW50KC1sLngtaCxsLnkpKSksdGhpcy5fc2V0UHJvcGVyQ2xhc3MoZSxhKSx0LkRvbVV0aWwuc2V0UG9zaXRpb24obixlKX0sX2dlbmVyYXRlTGFiZWxDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4ibGVhZmxldC1sYWJlbC0iK3R9LF9zZXRQcm9wZXJDbGFzczpmdW5jdGlvbihlLGkpe2Zvcih2YXIgbj10aGlzLl9tYXAsbz10aGlzLl9jb250YWluZXIscz1pfHx0aGlzLl9nZXREaXJlY3Rpb24oKSxhPShuLmxheWVyUG9pbnRUb0NvbnRhaW5lclBvaW50KGUpLG4ubGF0TG5nVG9Db250YWluZXJQb2ludChuLmdldENlbnRlcigpKSx0aGlzLl9nZW5lcmF0ZUxhYmVsQ2xhc3MocykpLGg9MDtoPHRoaXMuX2RpcmVjdGlvbnMubGVuZ3RoO2grKyl7dmFyIGw9dGhpcy5fZGlyZWN0aW9uc1toXTtpZihsIT09cyl7dmFyIHI9dGhpcy5fZ2VuZXJhdGVMYWJlbENsYXNzKGwpO3QuRG9tVXRpbC5yZW1vdmVDbGFzcyhvLHIpfX10LkRvbVV0aWwuYWRkQ2xhc3MobyxhKX0sX2dldERpcmVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9ufSxfem9vbUFuaW1hdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcsdC56b29tLHQuY2VudGVyKS5yb3VuZCgpO3RoaXMuX3NldFBvc2l0aW9uKGUpfSxfb25Nb3ZlRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0ZWQmJiJhdXRvIiE9PXRoaXMuX2dldERpcmVjdGlvbigpfHx0aGlzLl91cGRhdGVQb3NpdGlvbigpfSxfb25WaWV3UmVzZXQ6ZnVuY3Rpb24odCl7dCYmdC5oYXJkJiZ0aGlzLl91cGRhdGUoKX0sX2luaXRJbnRlcmFjdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5jbGlja2FibGUpe3ZhciBlPXRoaXMuX2NvbnRhaW5lcixpPVsiZGJsY2xpY2siLCJtb3VzZWRvd24iLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il07dC5Eb21VdGlsLmFkZENsYXNzKGUsImxlYWZsZXQtY2xpY2thYmxlIiksdC5Eb21FdmVudC5vbihlLCJjbGljayIsdGhpcy5fb25Nb3VzZUNsaWNrLHRoaXMpO2Zvcih2YXIgbj0wO248aS5sZW5ndGg7bisrKXQuRG9tRXZlbnQub24oZSxpW25dLHRoaXMuX2ZpcmVNb3VzZUV2ZW50LHRoaXMpfX0sX3JlbW92ZUludGVyYWN0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmNsaWNrYWJsZSl7dmFyIGU9dGhpcy5fY29udGFpbmVyLGk9WyJkYmxjbGljayIsIm1vdXNlZG93biIsIm1vdXNlb3ZlciIsIm1vdXNlb3V0IiwiY29udGV4dG1lbnUiXTt0LkRvbVV0aWwucmVtb3ZlQ2xhc3MoZSwibGVhZmxldC1jbGlja2FibGUiKSx0LkRvbUV2ZW50Lm9mZihlLCJjbGljayIsdGhpcy5fb25Nb3VzZUNsaWNrLHRoaXMpO2Zvcih2YXIgbj0wO248aS5sZW5ndGg7bisrKXQuRG9tRXZlbnQub2ZmKGUsaVtuXSx0aGlzLl9maXJlTW91c2VFdmVudCx0aGlzKX19LF9vbk1vdXNlQ2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5oYXNFdmVudExpc3RlbmVycyhlLnR5cGUpJiZ0LkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbihlKSx0aGlzLmZpcmUoZS50eXBlLHtvcmlnaW5hbEV2ZW50OmV9KX0sX2ZpcmVNb3VzZUV2ZW50OmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShlLnR5cGUse29yaWdpbmFsRXZlbnQ6ZX0pLCJjb250ZXh0bWVudSI9PT1lLnR5cGUmJnRoaXMuaGFzRXZlbnRMaXN0ZW5lcnMoZS50eXBlKSYmdC5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdChlKSwibW91c2Vkb3duIiE9PWUudHlwZT90LkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbihlKTp0LkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUpfX0pO3JldHVybiB0LkJhc2VNYXJrZXJNZXRob2RzPXtzaG93TGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbCYmdGhpcy5fbWFwJiYodGhpcy5sYWJlbC5zZXRMYXRMbmcodGhpcy5fbGF0bG5nKSx0aGlzLl9tYXAuc2hvd0xhYmVsKHRoaXMubGFiZWwpKSx0aGlzfSxoaWRlTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbCYmdGhpcy5sYWJlbC5jbG9zZSgpLHRoaXN9LHNldExhYmVsTm9IaWRlOmZ1bmN0aW9uKHQpe3RoaXMuX2xhYmVsTm9IaWRlIT09dCYmKHRoaXMuX2xhYmVsTm9IaWRlPXQsdD8odGhpcy5fcmVtb3ZlTGFiZWxSZXZlYWxIYW5kbGVycygpLHRoaXMuc2hvd0xhYmVsKCkpOih0aGlzLl9hZGRMYWJlbFJldmVhbEhhbmRsZXJzKCksdGhpcy5oaWRlTGFiZWwoKSkpfSxiaW5kTGFiZWw6ZnVuY3Rpb24oaSxuKXt2YXIgbz10aGlzLm9wdGlvbnMuaWNvbj90aGlzLm9wdGlvbnMuaWNvbi5vcHRpb25zLmxhYmVsQW5jaG9yOnRoaXMub3B0aW9ucy5sYWJlbEFuY2hvcixzPXQucG9pbnQobyl8fHQucG9pbnQoMCwwKTtyZXR1cm4gcz1zLmFkZChlLnByb3RvdHlwZS5vcHRpb25zLm9mZnNldCksbiYmbi5vZmZzZXQmJihzPXMuYWRkKG4ub2Zmc2V0KSksbj10LlV0aWwuZXh0ZW5kKHtvZmZzZXQ6c30sbiksdGhpcy5fbGFiZWxOb0hpZGU9bi5ub0hpZGUsdGhpcy5sYWJlbHx8KHRoaXMuX2xhYmVsTm9IaWRlfHx0aGlzLl9hZGRMYWJlbFJldmVhbEhhbmRsZXJzKCksdGhpcy5vbigicmVtb3ZlIix0aGlzLmhpZGVMYWJlbCx0aGlzKS5vbigibW92ZSIsdGhpcy5fbW92ZUxhYmVsLHRoaXMpLm9uKCJhZGQiLHRoaXMuX29uTWFya2VyQWRkLHRoaXMpLHRoaXMuX2hhc0xhYmVsSGFuZGxlcnM9ITApLHRoaXMubGFiZWw9bmV3IGUobix0aGlzKS5zZXRDb250ZW50KGkpLHRoaXN9LHVuYmluZExhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFiZWwmJih0aGlzLmhpZGVMYWJlbCgpLHRoaXMubGFiZWw9bnVsbCx0aGlzLl9oYXNMYWJlbEhhbmRsZXJzJiYodGhpcy5fbGFiZWxOb0hpZGV8fHRoaXMuX3JlbW92ZUxhYmVsUmV2ZWFsSGFuZGxlcnMoKSx0aGlzLm9mZigicmVtb3ZlIix0aGlzLmhpZGVMYWJlbCx0aGlzKS5vZmYoIm1vdmUiLHRoaXMuX21vdmVMYWJlbCx0aGlzKS5vZmYoImFkZCIsdGhpcy5fb25NYXJrZXJBZGQsdGhpcykpLHRoaXMuX2hhc0xhYmVsSGFuZGxlcnM9ITEpLHRoaXN9LHVwZGF0ZUxhYmVsQ29udGVudDpmdW5jdGlvbih0KXt0aGlzLmxhYmVsJiZ0aGlzLmxhYmVsLnNldENvbnRlbnQodCl9LGdldExhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFiZWx9LF9vbk1hcmtlckFkZDpmdW5jdGlvbigpe3RoaXMuX2xhYmVsTm9IaWRlJiZ0aGlzLnNob3dMYWJlbCgpfSxfYWRkTGFiZWxSZXZlYWxIYW5kbGVyczpmdW5jdGlvbigpe3RoaXMub24oIm1vdXNlb3ZlciIsdGhpcy5zaG93TGFiZWwsdGhpcykub24oIm1vdXNlb3V0Iix0aGlzLmhpZGVMYWJlbCx0aGlzKSx0LkJyb3dzZXIudG91Y2gmJnRoaXMub24oImNsaWNrIix0aGlzLnNob3dMYWJlbCx0aGlzKX0sX3JlbW92ZUxhYmVsUmV2ZWFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLm9mZigibW91c2VvdmVyIix0aGlzLnNob3dMYWJlbCx0aGlzKS5vZmYoIm1vdXNlb3V0Iix0aGlzLmhpZGVMYWJlbCx0aGlzKSx0LkJyb3dzZXIudG91Y2gmJnRoaXMub2ZmKCJjbGljayIsdGhpcy5zaG93TGFiZWwsdGhpcyl9LF9tb3ZlTGFiZWw6ZnVuY3Rpb24odCl7dGhpcy5sYWJlbC5zZXRMYXRMbmcodC5sYXRsbmcpfX0sdC5JY29uLkRlZmF1bHQubWVyZ2VPcHRpb25zKHtsYWJlbEFuY2hvcjpuZXcgdC5Qb2ludCg5LC0yMCl9KSx0Lk1hcmtlci5tZXJnZU9wdGlvbnMoe2ljb246bmV3IHQuSWNvbi5EZWZhdWx0fSksdC5NYXJrZXIuaW5jbHVkZSh0LkJhc2VNYXJrZXJNZXRob2RzKSx0Lk1hcmtlci5pbmNsdWRlKHtfb3JpZ2luYWxVcGRhdGVaSW5kZXg6dC5NYXJrZXIucHJvdG90eXBlLl91cGRhdGVaSW5kZXgsX3VwZGF0ZVpJbmRleDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl96SW5kZXgrdDt0aGlzLl9vcmlnaW5hbFVwZGF0ZVpJbmRleCh0KSx0aGlzLmxhYmVsJiZ0aGlzLmxhYmVsLnVwZGF0ZVpJbmRleChlKX0sX29yaWdpbmFsU2V0T3BhY2l0eTp0Lk1hcmtlci5wcm90b3R5cGUuc2V0T3BhY2l0eSxzZXRPcGFjaXR5OmZ1bmN0aW9uKHQsZSl7dGhpcy5vcHRpb25zLmxhYmVsSGFzU2VtaVRyYW5zcGFyZW5jeT1lLHRoaXMuX29yaWdpbmFsU2V0T3BhY2l0eSh0KX0sX29yaWdpbmFsVXBkYXRlT3BhY2l0eTp0Lk1hcmtlci5wcm90b3R5cGUuX3VwZGF0ZU9wYWNpdHksX3VwZGF0ZU9wYWNpdHk6ZnVuY3Rpb24oKXt2YXIgdD0wPT09dGhpcy5vcHRpb25zLm9wYWNpdHk/MDoxO3RoaXMuX29yaWdpbmFsVXBkYXRlT3BhY2l0eSgpLHRoaXMubGFiZWwmJnRoaXMubGFiZWwuc2V0T3BhY2l0eSh0aGlzLm9wdGlvbnMubGFiZWxIYXNTZW1pVHJhbnNwYXJlbmN5P3RoaXMub3B0aW9ucy5vcGFjaXR5OnQpfSxfb3JpZ2luYWxTZXRMYXRMbmc6dC5NYXJrZXIucHJvdG90eXBlLnNldExhdExuZyxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGFiZWwmJiF0aGlzLl9sYWJlbE5vSGlkZSYmdGhpcy5oaWRlTGFiZWwoKSx0aGlzLl9vcmlnaW5hbFNldExhdExuZyh0KX19KSx0LkNpcmNsZU1hcmtlci5tZXJnZU9wdGlvbnMoe2xhYmVsQW5jaG9yOm5ldyB0LlBvaW50KDAsMCl9KSx0LkNpcmNsZU1hcmtlci5pbmNsdWRlKHQuQmFzZU1hcmtlck1ldGhvZHMpLHQuUGF0aC5pbmNsdWRlKHtiaW5kTGFiZWw6ZnVuY3Rpb24oaSxuKXtyZXR1cm4gdGhpcy5sYWJlbCYmdGhpcy5sYWJlbC5vcHRpb25zPT09bnx8KHRoaXMubGFiZWw9bmV3IGUobix0aGlzKSksdGhpcy5sYWJlbC5zZXRDb250ZW50KGkpLHRoaXMuX3Nob3dMYWJlbEFkZGVkfHwodGhpcy5vbigibW91c2VvdmVyIix0aGlzLl9zaG93TGFiZWwsdGhpcykub24oIm1vdXNlbW92ZSIsdGhpcy5fbW92ZUxhYmVsLHRoaXMpLm9uKCJtb3VzZW91dCByZW1vdmUiLHRoaXMuX2hpZGVMYWJlbCx0aGlzKSx0LkJyb3dzZXIudG91Y2gmJnRoaXMub24oImNsaWNrIix0aGlzLl9zaG93TGFiZWwsdGhpcyksdGhpcy5fc2hvd0xhYmVsQWRkZWQ9ITApLHRoaXN9LHVuYmluZExhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFiZWwmJih0aGlzLl9oaWRlTGFiZWwoKSx0aGlzLmxhYmVsPW51bGwsdGhpcy5fc2hvd0xhYmVsQWRkZWQ9ITEsdGhpcy5vZmYoIm1vdXNlb3ZlciIsdGhpcy5fc2hvd0xhYmVsLHRoaXMpLm9mZigibW91c2Vtb3ZlIix0aGlzLl9tb3ZlTGFiZWwsdGhpcykub2ZmKCJtb3VzZW91dCByZW1vdmUiLHRoaXMuX2hpZGVMYWJlbCx0aGlzKSksdGhpc30sdXBkYXRlTGFiZWxDb250ZW50OmZ1bmN0aW9uKHQpe3RoaXMubGFiZWwmJnRoaXMubGFiZWwuc2V0Q29udGVudCh0KX0sX3Nob3dMYWJlbDpmdW5jdGlvbih0KXt0aGlzLmxhYmVsLnNldExhdExuZyh0LmxhdGxuZyksdGhpcy5fbWFwLnNob3dMYWJlbCh0aGlzLmxhYmVsKX0sX21vdmVMYWJlbDpmdW5jdGlvbih0KXt0aGlzLmxhYmVsLnNldExhdExuZyh0LmxhdGxuZyl9LF9oaWRlTGFiZWw6ZnVuY3Rpb24oKXt0aGlzLmxhYmVsLmNsb3NlKCl9fSksdC5NYXAuaW5jbHVkZSh7c2hvd0xhYmVsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZExheWVyKHQpfX0pLHQuRmVhdHVyZUdyb3VwLmluY2x1ZGUoe2NsZWFyTGF5ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5iaW5kTGFiZWwoKSx0aGlzLmVhY2hMYXllcih0aGlzLnJlbW92ZUxheWVyLHRoaXMpLHRoaXN9LGJpbmRMYWJlbDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmludm9rZSgiYmluZExhYmVsIix0LGUpfSx1bmJpbmRMYWJlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludm9rZSgiaGlkZUxhYmVsIil9LHVwZGF0ZUxhYmVsQ29udGVudDpmdW5jdGlvbih0KXt0aGlzLmludm9rZSgidXBkYXRlTGFiZWxDb250ZW50Iix0KX19KSxlfSx3aW5kb3cpOw=="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKGEpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9YSgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sYSk7ZWxzZXt2YXIgYjtiPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxiLnByb2o0PWEoKX19KGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIGEoYixjLGQpe2Z1bmN0aW9uIGUoZyxoKXtpZighY1tnXSl7aWYoIWJbZ10pe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFoJiZpKXJldHVybiBpKGcsITApO2lmKGYpcmV0dXJuIGYoZywhMCk7dmFyIGo9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZysiJyIpO3Rocm93IGouY29kZT0iTU9EVUxFX05PVF9GT1VORCIsan12YXIgaz1jW2ddPXtleHBvcnRzOnt9fTtiW2ddWzBdLmNhbGwoay5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbZ11bMV1bYV07cmV0dXJuIGUoYz9jOmEpfSxrLGsuZXhwb3J0cyxhLGIsYyxkKX1yZXR1cm4gY1tnXS5leHBvcnRzfWZvcih2YXIgZj0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxnPTA7ZzxkLmxlbmd0aDtnKyspZShkW2ddKTtyZXR1cm4gZX0oeyIuL2luY2x1ZGVkUHJvamVjdGlvbnMiOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W2EoIi4vbGliL3Byb2plY3Rpb25zL3RtZXJjIiksYSgiLi9saWIvcHJvamVjdGlvbnMvdXRtIiksYSgiLi9saWIvcHJvamVjdGlvbnMvc3RlcmVhIiksYSgiLi9saWIvcHJvamVjdGlvbnMvc3RlcmUiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9zb21lcmMiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9vbWVyYyIpLGEoIi4vbGliL3Byb2plY3Rpb25zL2xjYyIpLGEoIi4vbGliL3Byb2plY3Rpb25zL2tyb3ZhayIpLGEoIi4vbGliL3Byb2plY3Rpb25zL2Nhc3MiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9sYWVhIiksYSgiLi9saWIvcHJvamVjdGlvbnMvYWVhIiksYSgiLi9saWIvcHJvamVjdGlvbnMvZ25vbSIpLGEoIi4vbGliL3Byb2plY3Rpb25zL2NlYSIpLGEoIi4vbGliL3Byb2plY3Rpb25zL2VxYyIpLGEoIi4vbGliL3Byb2plY3Rpb25zL3BvbHkiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9uem1nIiksYSgiLi9saWIvcHJvamVjdGlvbnMvbWlsbCIpLGEoIi4vbGliL3Byb2plY3Rpb25zL3NpbnUiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9tb2xsIiksYSgiLi9saWIvcHJvamVjdGlvbnMvZXFkYyIpLGEoIi4vbGliL3Byb2plY3Rpb25zL3ZhbmRnIiksYSgiLi9saWIvcHJvamVjdGlvbnMvYWVxZCIpLGEoIi4vbGliL3Byb2plY3Rpb25zL29ydGhvIildO2IuZXhwb3J0cz1mdW5jdGlvbihwcm9qNCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3Byb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKGEpfSl9fSx7Ii4vbGliL3Byb2plY3Rpb25zL2FlYSI6NDAsIi4vbGliL3Byb2plY3Rpb25zL2FlcWQiOjQxLCIuL2xpYi9wcm9qZWN0aW9ucy9jYXNzIjo0MiwiLi9saWIvcHJvamVjdGlvbnMvY2VhIjo0MywiLi9saWIvcHJvamVjdGlvbnMvZXFjIjo0NCwiLi9saWIvcHJvamVjdGlvbnMvZXFkYyI6NDUsIi4vbGliL3Byb2plY3Rpb25zL2dub20iOjQ3LCIuL2xpYi9wcm9qZWN0aW9ucy9rcm92YWsiOjQ4LCIuL2xpYi9wcm9qZWN0aW9ucy9sYWVhIjo0OSwiLi9saWIvcHJvamVjdGlvbnMvbGNjIjo1MCwiLi9saWIvcHJvamVjdGlvbnMvbWlsbCI6NTMsIi4vbGliL3Byb2plY3Rpb25zL21vbGwiOjU0LCIuL2xpYi9wcm9qZWN0aW9ucy9uem1nIjo1NSwiLi9saWIvcHJvamVjdGlvbnMvb21lcmMiOjU2LCIuL2xpYi9wcm9qZWN0aW9ucy9vcnRobyI6NTcsIi4vbGliL3Byb2plY3Rpb25zL3BvbHkiOjU4LCIuL2xpYi9wcm9qZWN0aW9ucy9zaW51Ijo1OSwiLi9saWIvcHJvamVjdGlvbnMvc29tZXJjIjo2MCwiLi9saWIvcHJvamVjdGlvbnMvc3RlcmUiOjYxLCIuL2xpYi9wcm9qZWN0aW9ucy9zdGVyZWEiOjYyLCIuL2xpYi9wcm9qZWN0aW9ucy90bWVyYyI6NjMsIi4vbGliL3Byb2plY3Rpb25zL3V0bSI6NjQsIi4vbGliL3Byb2plY3Rpb25zL3ZhbmRnIjo2NX1dLDE6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBQb2ludChhLGIsYyl7aWYoISh0aGlzIGluc3RhbmNlb2YgUG9pbnQpKXJldHVybiBuZXcgUG9pbnQoYSxiLGMpO2lmKEFycmF5LmlzQXJyYXkoYSkpdGhpcy54PWFbMF0sdGhpcy55PWFbMV0sdGhpcy56PWFbMl18fDA7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGEpdGhpcy54PWEueCx0aGlzLnk9YS55LHRoaXMuej1hLnp8fDA7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGEmJiJ1bmRlZmluZWQiPT10eXBlb2YgYil7dmFyIGQ9YS5zcGxpdCgiLCIpO3RoaXMueD1wYXJzZUZsb2F0KGRbMF0sMTApLHRoaXMueT1wYXJzZUZsb2F0KGRbMV0sMTApLHRoaXMuej1wYXJzZUZsb2F0KGRbMl0sMTApfHwwfWVsc2UgdGhpcy54PWEsdGhpcy55PWIsdGhpcy56PWN8fDA7Y29uc29sZS53YXJuKCJwcm9qNC5Qb2ludCB3aWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzLCB1c2UgcHJvajQudG9Qb2ludCIpfXZhciBkPWEoIm1ncnMiKTtQb2ludC5mcm9tTUdSUz1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFBvaW50KGQudG9Qb2ludChhKSl9LFBvaW50LnByb3RvdHlwZS50b01HUlM9ZnVuY3Rpb24oYSl7cmV0dXJuIGQuZm9yd2FyZChbdGhpcy54LHRoaXMueV0sYSl9LGIuZXhwb3J0cz1Qb2ludH0se21ncnM6Njh9XSwyOltmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gUHJvamVjdGlvbihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFByb2plY3Rpb24pKXJldHVybiBuZXcgUHJvamVjdGlvbihhKTtiPWJ8fGZ1bmN0aW9uKGEpe2lmKGEpdGhyb3cgYX07dmFyIGM9ZChhKTtpZigib2JqZWN0IiE9dHlwZW9mIGMpcmV0dXJuIHZvaWQgYihhKTt2YXIgZj1nKGMpLGg9UHJvamVjdGlvbi5wcm9qZWN0aW9ucy5nZXQoZi5wcm9qTmFtZSk7aD8oZSh0aGlzLGYpLGUodGhpcyxoKSx0aGlzLmluaXQoKSxiKG51bGwsdGhpcykpOmIoYSl9dmFyIGQ9YSgiLi9wYXJzZUNvZGUiKSxlPWEoIi4vZXh0ZW5kIiksZj1hKCIuL3Byb2plY3Rpb25zIiksZz1hKCIuL2Rlcml2ZUNvbnN0YW50cyIpO1Byb2plY3Rpb24ucHJvamVjdGlvbnM9ZixQcm9qZWN0aW9uLnByb2plY3Rpb25zLnN0YXJ0KCksYi5leHBvcnRzPVByb2plY3Rpb259LHsiLi9kZXJpdmVDb25zdGFudHMiOjMzLCIuL2V4dGVuZCI6MzQsIi4vcGFyc2VDb2RlIjozNywiLi9wcm9qZWN0aW9ucyI6Mzl9XSwzOltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1jLngsaD1jLnksaT1jLnp8fDA7Zm9yKGY9MDszPmY7ZisrKWlmKCFifHwyIT09Znx8dm9pZCAwIT09Yy56KXN3aXRjaCgwPT09Zj8oZD1nLGU9IngiKToxPT09Zj8oZD1oLGU9InkiKTooZD1pLGU9InoiKSxhLmF4aXNbZl0pe2Nhc2UiZSI6Y1tlXT1kO2JyZWFrO2Nhc2UidyI6Y1tlXT0tZDticmVhaztjYXNlIm4iOmNbZV09ZDticmVhaztjYXNlInMiOmNbZV09LWQ7YnJlYWs7Y2FzZSJ1Ijp2b2lkIDAhPT1jW2VdJiYoYy56PWQpO2JyZWFrO2Nhc2UiZCI6dm9pZCAwIT09Y1tlXSYmKGMuej0tZCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbH1yZXR1cm4gY319LHt9XSw0OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TWF0aC5QSS8yLGU9YSgiLi9zaWduIik7Yi5leHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyhhKTxkP2E6YS1lKGEpKk1hdGguUEl9fSx7Ii4vc2lnbiI6MjF9XSw1OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MipNYXRoLlBJLGU9My4xNDE1OTI2NTM1OSxmPWEoIi4vc2lnbiIpO2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hYnMoYSk8PWU/YTphLWYoYSkqZH19LHsiLi9zaWduIjoyMX1dLDY6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKGEpPjEmJihhPWE+MT8xOi0xKSxNYXRoLmFzaW4oYSl9fSx7fV0sNzpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gMS0uMjUqYSooMSthLzE2KigzKzEuMjUqYSkpfX0se31dLDg6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuLjM3NSphKigxKy4yNSphKigxKy40Njg3NSphKSl9fSx7fV0sOTpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4uMDU4NTkzNzUqYSphKigxKy43NSphKX19LHt9XSwxMDpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gYSphKmEqKDM1LzMwNzIpfX0se31dLDExOltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iKmM7cmV0dXJuIGEvTWF0aC5zcXJ0KDEtZCpkKX19LHt9XSwxMjpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7Zj1hL2I7Zm9yKHZhciBoPTA7MTU+aDtoKyspaWYoZz0oYS0oYipmLWMqTWF0aC5zaW4oMipmKStkKk1hdGguc2luKDQqZiktZSpNYXRoLnNpbig2KmYpKSkvKGItMipjKk1hdGguY29zKDIqZikrNCpkKk1hdGguY29zKDQqZiktNiplKk1hdGguY29zKDYqZikpLGYrPWcsTWF0aC5hYnMoZyk8PTFlLTEwKXJldHVybiBmO3JldHVybiBOYU59fSx7fV0sMTM6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLlBJLzI7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM9MS0oMS1hKmEpLygyKmEpKk1hdGgubG9nKCgxLWEpLygxK2EpKTtpZihNYXRoLmFicyhNYXRoLmFicyhiKS1jKTwxZS02KXJldHVybiAwPmI/LTEqZDpkO2Zvcih2YXIgZSxmLGcsaCxpPU1hdGguYXNpbiguNSpiKSxqPTA7MzA+ajtqKyspaWYoZj1NYXRoLnNpbihpKSxnPU1hdGguY29zKGkpLGg9YSpmLGU9TWF0aC5wb3coMS1oKmgsMikvKDIqZykqKGIvKDEtYSphKS1mLygxLWgqaCkrLjUvYSpNYXRoLmxvZygoMS1oKS8oMStoKSkpLGkrPWUsTWF0aC5hYnMoZSk8PTFlLTEwKXJldHVybiBpO3JldHVybiBOYU59fSx7fV0sMTQ6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gYSplLWIqTWF0aC5zaW4oMiplKStjKk1hdGguc2luKDQqZSktZCpNYXRoLnNpbig2KmUpfX0se31dLDE1OltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hKmI7cmV0dXJuIGMvTWF0aC5zcXJ0KDEtZCpkKX19LHt9XSwxNjpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU1hdGguUEkvMjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZSxmPS41KmEsZz1kLTIqTWF0aC5hdGFuKGIpLGg9MDsxNT49aDtoKyspaWYoYz1hKk1hdGguc2luKGcpLGU9ZC0yKk1hdGguYXRhbihiKk1hdGgucG93KCgxLWMpLygxK2MpLGYpKS1nLGcrPWUsTWF0aC5hYnMoZSk8PTFlLTEwKXJldHVybiBnO3JldHVybi05OTk5fX0se31dLDE3OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MSxlPS4yNSxmPS4wNDY4NzUsZz0uMDE5NTMxMjUsaD0uMDEwNjgxMTUyMzQzNzUsaT0uNzUsaj0uNDY4NzUsaz0uMDEzMDIwODMzMzMzMzMzMzM0LGw9LjAwNzEyMDc2ODIyOTE2NjY2NyxtPS4zNjQ1ODMzMzMzMzMzMzMzLG49LjAwNTY5NjYxNDU4MzMzMzMzMyxvPS4zMDc2MTcxODc1O2IuZXhwb3J0cz1mdW5jdGlvbihhKXt2YXIgYj1bXTtiWzBdPWQtYSooZSthKihmK2EqKGcrYSpoKSkpLGJbMV09YSooaS1hKihmK2EqKGcrYSpoKSkpO3ZhciBjPWEqYTtyZXR1cm4gYlsyXT1jKihqLWEqKGsrYSpsKSksYyo9YSxiWzNdPWMqKG0tYSpuKSxiWzRdPWMqYSpvLGJ9fSx7fV0sMTg6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuL3BqX21sZm4iKSxlPTFlLTEwLGY9MjA7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGc9MS8oMS1iKSxoPWEsaT1mO2k7LS1pKXt2YXIgaj1NYXRoLnNpbihoKSxrPTEtYipqKmo7aWYoaz0oZChoLGosTWF0aC5jb3MoaCksYyktYSkqKGsqTWF0aC5zcXJ0KGspKSpnLGgtPWssTWF0aC5hYnMoayk8ZSlyZXR1cm4gaH1yZXR1cm4gaH19LHsiLi9wal9tbGZuIjoxOX1dLDE5OltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjKj1iLGIqPWIsZFswXSphLWMqKGRbMV0rYiooZFsyXStiKihkWzNdK2IqZFs0XSkpKX19LHt9XSwyMDpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBhPjFlLTc/KGM9YSpiLCgxLWEqYSkqKGIvKDEtYypjKS0uNS9hKk1hdGgubG9nKCgxLWMpLygxK2MpKSkpOjIqYn19LHt9XSwyMTpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gMD5hPy0xOjF9fSx7fV0sMjI6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5wb3coKDEtYSkvKDErYSksYil9fSx7fV0sMjM6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9e3g6YVswXSx5OmFbMV19O3JldHVybiBhLmxlbmd0aD4yJiYoYi56PWFbMl0pLGEubGVuZ3RoPjMmJihiLm09YVszXSksYn19LHt9XSwyNDpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU1hdGguUEkvMjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPWEqYyxmPS41KmE7cmV0dXJuIGU9TWF0aC5wb3coKDEtZSkvKDErZSksZiksTWF0aC50YW4oLjUqKGQtYikpL2V9fSx7fV0sMjU6W2Z1bmN0aW9uKGEsYixjKXtjLndnczg0PXt0b3dnczg0OiIwLDAsMCIsZWxsaXBzZToiV0dTODQiLGRhdHVtTmFtZToiV0dTODQifSxjLmNoMTkwMz17dG93Z3M4NDoiNjc0LjM3NCwxNS4wNTYsNDA1LjM0NiIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6InN3aXNzIn0sYy5nZ3JzODc9e3Rvd2dzODQ6Ii0xOTkuODcsNzQuNzksMjQ2LjYyIixlbGxpcHNlOiJHUlM4MCIsZGF0dW1OYW1lOiJHcmVla19HZW9kZXRpY19SZWZlcmVuY2VfU3lzdGVtXzE5ODcifSxjLm5hZDgzPXt0b3dnczg0OiIwLDAsMCIsZWxsaXBzZToiR1JTODAiLGRhdHVtTmFtZToiTm9ydGhfQW1lcmljYW5fRGF0dW1fMTk4MyJ9LGMubmFkMjc9e25hZGdyaWRzOiJAY29udXMsQGFsYXNrYSxAbnR2Ml8wLmdzYixAbnR2MV9jYW4uZGF0IixlbGxpcHNlOiJjbHJrNjYiLGRhdHVtTmFtZToiTm9ydGhfQW1lcmljYW5fRGF0dW1fMTkyNyJ9LGMucG90c2RhbT17dG93Z3M4NDoiNjA2LjAsMjMuMCw0MTMuMCIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6IlBvdHNkYW0gUmF1ZW5iZXJnIDE5NTAgREhETiJ9LGMuY2FydGhhZ2U9e3Rvd2dzODQ6Ii0yNjMuMCw2LjAsNDMxLjAiLGVsbGlwc2U6ImNsYXJrODAiLGRhdHVtTmFtZToiQ2FydGhhZ2UgMTkzNCBUdW5pc2lhIn0sYy5oZXJtYW5uc2tvZ2VsPXt0b3dnczg0OiI2NTMuMCwtMjEyLjAsNDQ5LjAiLGVsbGlwc2U6ImJlc3NlbCIsZGF0dW1OYW1lOiJIZXJtYW5uc2tvZ2VsIn0sYy5pcmU2NT17dG93Z3M4NDoiNDgyLjUzMCwtMTMwLjU5Niw1NjQuNTU3LC0xLjA0MiwtMC4yMTQsLTAuNjMxLDguMTUiLGVsbGlwc2U6Im1vZF9haXJ5IixkYXR1bU5hbWU6IklyZWxhbmQgMTk2NSJ9LGMucmFzc2FkaXJhbj17dG93Z3M4NDoiLTEzMy42MywtMTU3LjUsLTE1OC42MiIsZWxsaXBzZToiaW50bCIsZGF0dW1OYW1lOiJSYXNzYWRpcmFuIn0sYy5uemdkNDk9e3Rvd2dzODQ6IjU5LjQ3LC01LjA0LDE4Ny40NCwwLjQ3LC0wLjEsMS4wMjQsLTQuNTk5MyIsZWxsaXBzZToiaW50bCIsZGF0dW1OYW1lOiJOZXcgWmVhbGFuZCBHZW9kZXRpYyBEYXR1bSAxOTQ5In0sYy5vc2diMzY9e3Rvd2dzODQ6IjQ0Ni40NDgsLTEyNS4xNTcsNTQyLjA2MCwwLjE1MDIsMC4yNDcwLDAuODQyMSwtMjAuNDg5NCIsZWxsaXBzZToiYWlyeSIsZGF0dW1OYW1lOiJBaXJ5IDE4MzAifSxjLnNfanRzaz17dG93Z3M4NDoiNTg5LDc2LDQ4MCIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6IlMtSlRTSyAoRmVycm8pIn0sYy5iZWR1YXJhbT17dG93Z3M4NDoiLTEwNiwtODcsMTg4IixlbGxpcHNlOiJjbHJrODAiLGRhdHVtTmFtZToiQmVkdWFyYW0ifSxjLmd1bnVuZ19zZWdhcmE9e3Rvd2dzODQ6Ii00MDMsNjg0LDQxIixlbGxpcHNlOiJiZXNzZWwiLGRhdHVtTmFtZToiR3VudW5nIFNlZ2FyYSBKYWthcnRhIn0sYy5ybmI3Mj17dG93Z3M4NDoiMTA2Ljg2OSwtNTIuMjk3OCwxMDMuNzI0LC0wLjMzNjU3LDAuNDU2OTU1LC0xLjg0MjE4LDEiLGVsbGlwc2U6ImludGwiLGRhdHVtTmFtZToiUmVzZWF1IE5hdGlvbmFsIEJlbGdlIDE5NzIifX0se31dLDI2OltmdW5jdGlvbihhLGIsYyl7Yy5NRVJJVD17YTo2Mzc4MTM3LHJmOjI5OC4yNTcsZWxsaXBzZU5hbWU6Ik1FUklUIDE5ODMifSxjLlNHUzg1PXthOjYzNzgxMzYscmY6Mjk4LjI1NyxlbGxpcHNlTmFtZToiU292aWV0IEdlb2RldGljIFN5c3RlbSA4NSJ9LGMuR1JTODA9e2E6NjM3ODEzNyxyZjoyOTguMjU3MjIyMTAxLGVsbGlwc2VOYW1lOiJHUlMgMTk4MChJVUdHLCAxOTgwKSJ9LGMuSUFVNzY9e2E6NjM3ODE0MCxyZjoyOTguMjU3LGVsbGlwc2VOYW1lOiJJQVUgMTk3NiJ9LGMuYWlyeT17YTo2Mzc3NTYzLjM5NixiOjYzNTYyNTYuOTEsZWxsaXBzZU5hbWU6IkFpcnkgMTgzMCJ9LGMuQVBMND17YTo2Mzc4MTM3LHJmOjI5OC4yNSxlbGxpcHNlTmFtZToiQXBwbC4gUGh5c2ljcy4gMTk2NSJ9LGMuTldMOUQ9e2E6NjM3ODE0NSxyZjoyOTguMjUsZWxsaXBzZU5hbWU6Ik5hdmFsIFdlYXBvbnMgTGFiLiwgMTk2NSJ9LGMubW9kX2Fpcnk9e2E6NjM3NzM0MC4xODksYjo2MzU2MDM0LjQ0NixlbGxpcHNlTmFtZToiTW9kaWZpZWQgQWlyeSJ9LGMuYW5kcmFlPXthOjYzNzcxMDQuNDMscmY6MzAwLGVsbGlwc2VOYW1lOiJBbmRyYWUgMTg3NiAoRGVuLiwgSWNsbmQuKSJ9LGMuYXVzdF9TQT17YTo2Mzc4MTYwLHJmOjI5OC4yNSxlbGxpcHNlTmFtZToiQXVzdHJhbGlhbiBOYXRsICYgUy4gQW1lci4gMTk2OSJ9LGMuR1JTNjc9e2E6NjM3ODE2MCxyZjoyOTguMjQ3MTY3NDI3LGVsbGlwc2VOYW1lOiJHUlMgNjcoSVVHRyAxOTY3KSJ9LGMuYmVzc2VsPXthOjYzNzczOTcuMTU1LHJmOjI5OS4xNTI4MTI4LGVsbGlwc2VOYW1lOiJCZXNzZWwgMTg0MSJ9LGMuYmVzc19uYW09e2E6NjM3NzQ4My44NjUscmY6Mjk5LjE1MjgxMjgsZWxsaXBzZU5hbWU6IkJlc3NlbCAxODQxIChOYW1pYmlhKSJ9LGMuY2xyazY2PXthOjYzNzgyMDYuNCxiOjYzNTY1ODMuOCxlbGxpcHNlTmFtZToiQ2xhcmtlIDE4NjYifSxjLmNscms4MD17YTo2Mzc4MjQ5LjE0NSxyZjoyOTMuNDY2MyxlbGxpcHNlTmFtZToiQ2xhcmtlIDE4ODAgbW9kLiJ9LGMuY2xyazU4PXthOjYzNzgyOTMuNjQ1MjA4NzU5LHJmOjI5NC4yNjA2NzYzNjkyNjU0LGVsbGlwc2VOYW1lOiJDbGFya2UgMTg1OCJ9LGMuQ1BNPXthOjYzNzU3MzguNyxyZjozMzQuMjksZWxsaXBzZU5hbWU6IkNvbW0uIGRlcyBQb2lkcyBldCBNZXN1cmVzIDE3OTkifSxjLmRlbG1icj17YTo2Mzc2NDI4LHJmOjMxMS41LGVsbGlwc2VOYW1lOiJEZWxhbWJyZSAxODEwIChCZWxnaXVtKSJ9LGMuZW5nZWxpcz17YTo2Mzc4MTM2LjA1LHJmOjI5OC4yNTY2LGVsbGlwc2VOYW1lOiJFbmdlbGlzIDE5ODUifSxjLmV2cnN0MzA9e2E6NjM3NzI3Ni4zNDUscmY6MzAwLjgwMTcsZWxsaXBzZU5hbWU6IkV2ZXJlc3QgMTgzMCJ9LGMuZXZyc3Q0OD17YTo2Mzc3MzA0LjA2MyxyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAxOTQ4In0sYy5ldnJzdDU2PXthOjYzNzczMDEuMjQzLHJmOjMwMC44MDE3LGVsbGlwc2VOYW1lOiJFdmVyZXN0IDE5NTYifSxjLmV2cnN0Njk9e2E6NjM3NzI5NS42NjQscmY6MzAwLjgwMTcsZWxsaXBzZU5hbWU6IkV2ZXJlc3QgMTk2OSJ9LGMuZXZyc3RTUz17YTo2Mzc3Mjk4LjU1NixyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAoU2FiYWggJiBTYXJhd2FrKSJ9LGMuZnNjaHI2MD17YTo2Mzc4MTY2LHJmOjI5OC4zLGVsbGlwc2VOYW1lOiJGaXNjaGVyIChNZXJjdXJ5IERhdHVtKSAxOTYwIn0sYy5mc2NocjYwbT17YTo2Mzc4MTU1LHJmOjI5OC4zLGVsbGlwc2VOYW1lOiJGaXNjaGVyIDE5NjAifSxjLmZzY2hyNjg9e2E6NjM3ODE1MCxyZjoyOTguMyxlbGxpcHNlTmFtZToiRmlzY2hlciAxOTY4In0sYy5oZWxtZXJ0PXthOjYzNzgyMDAscmY6Mjk4LjMsZWxsaXBzZU5hbWU6IkhlbG1lcnQgMTkwNiJ9LGMuaG91Z2g9e2E6NjM3ODI3MCxyZjoyOTcsZWxsaXBzZU5hbWU6IkhvdWdoIn0sYy5pbnRsPXthOjYzNzgzODgscmY6Mjk3LGVsbGlwc2VOYW1lOiJJbnRlcm5hdGlvbmFsIDE5MDkgKEhheWZvcmQpIn0sYy5rYXVsYT17YTo2Mzc4MTYzLHJmOjI5OC4yNCxlbGxpcHNlTmFtZToiS2F1bGEgMTk2MSJ9LGMubGVyY2g9e2E6NjM3ODEzOSxyZjoyOTguMjU3LGVsbGlwc2VOYW1lOiJMZXJjaCAxOTc5In0sYy5tcHJ0cz17YTo2Mzk3MzAwLHJmOjE5MSxlbGxpcHNlTmFtZToiTWF1cGVydGl1cyAxNzM4In0sYy5uZXdfaW50bD17YTo2Mzc4MTU3LjUsYjo2MzU2NzcyLjIsZWxsaXBzZU5hbWU6Ik5ldyBJbnRlcm5hdGlvbmFsIDE5NjcifSxjLnBsZXNzaXM9e2E6NjM3NjUyMyxyZjo2MzU1ODYzLGVsbGlwc2VOYW1lOiJQbGVzc2lzIDE4MTcgKEZyYW5jZSkifSxjLmtyYXNzPXthOjYzNzgyNDUscmY6Mjk4LjMsZWxsaXBzZU5hbWU6IktyYXNzb3Zza3ksIDE5NDIifSxjLlNFYXNpYT17YTo2Mzc4MTU1LGI6NjM1Njc3My4zMjA1LGVsbGlwc2VOYW1lOiJTb3V0aGVhc3QgQXNpYSJ9LGMud2FsYmVjaz17YTo2Mzc2ODk2LGI6NjM1NTgzNC44NDY3LGVsbGlwc2VOYW1lOiJXYWxiZWNrIn0sYy5XR1M2MD17YTo2Mzc4MTY1LHJmOjI5OC4zLGVsbGlwc2VOYW1lOiJXR1MgNjAifSxjLldHUzY2PXthOjYzNzgxNDUscmY6Mjk4LjI1LGVsbGlwc2VOYW1lOiJXR1MgNjYifSxjLldHUzc9e2E6NjM3ODEzNSxyZjoyOTguMjYsZWxsaXBzZU5hbWU6IldHUyA3MiJ9LGMuV0dTODQ9e2E6NjM3ODEzNyxyZjoyOTguMjU3MjIzNTYzLGVsbGlwc2VOYW1lOiJXR1MgODQifSxjLnNwaGVyZT17YTo2MzcwOTk3LGI6NjM3MDk5NyxlbGxpcHNlTmFtZToiTm9ybWFsIFNwaGVyZSAocj02MzcwOTk3KSJ9fSx7fV0sMjc6W2Z1bmN0aW9uKGEsYixjKXtjLmdyZWVud2ljaD0wLGMubGlzYm9uPS05LjEzMTkwNjExMTExMSxjLnBhcmlzPTIuMzM3MjI5MTY2NjY3LGMuYm9nb3RhPS03NC4wODA5MTY2NjY2NjcsYy5tYWRyaWQ9LTMuNjg3OTM4ODg4ODg5LGMucm9tZT0xMi40NTIzMzMzMzMzMzMsYy5iZXJuPTcuNDM5NTgzMzMzMzMzLGMuamFrYXJ0YT0xMDYuODA3NzE5NDQ0NDQ0LGMuZmVycm89LTE3LjY2NjY2NjY2NjY2NyxjLmJydXNzZWxzPTQuMzY3OTc1LGMuc3RvY2tob2xtPTE4LjA1ODI3Nzc3Nzc3OCxjLmF0aGVucz0yMy43MTYzMzc1LGMub3Nsbz0xMC43MjI5MTY2NjY2Njd9LHt9XSwyODpbZnVuY3Rpb24oYSxiLGMpe2MuZnQ9e3RvX21ldGVyOi4zMDQ4fSxjWyJ1cy1mdCJdPXt0b19tZXRlcjoxMjAwLzM5Mzd9fSx7fV0sMjk6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEsYixjKXt2YXIgZDtyZXR1cm4gQXJyYXkuaXNBcnJheShjKT8oZD1nKGEsYixjKSwzPT09Yy5sZW5ndGg/W2QueCxkLnksZC56XTpbZC54LGQueV0pOmcoYSxiLGMpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBmP2E6YS5vUHJvaj9hLm9Qcm9qOmYoYSl9ZnVuY3Rpb24gcHJvajQoYSxiLGMpe2E9ZShhKTt2YXIgZixnPSExO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYj8oYj1hLGE9aCxnPSEwKTooInVuZGVmaW5lZCIhPXR5cGVvZiBiLnh8fEFycmF5LmlzQXJyYXkoYikpJiYoYz1iLGI9YSxhPWgsZz0hMCksYj1lKGIpLGM/ZChhLGIsYyk6KGY9e2ZvcndhcmQ6ZnVuY3Rpb24oYyl7cmV0dXJuIGQoYSxiLGMpfSxpbnZlcnNlOmZ1bmN0aW9uKGMpe3JldHVybiBkKGIsYSxjKX19LGcmJihmLm9Qcm9qPWIpLGYpfXZhciBmPWEoIi4vUHJvaiIpLGc9YSgiLi90cmFuc2Zvcm0iKSxoPWYoIldHUzg0Iik7Yi5leHBvcnRzPXByb2o0fSx7Ii4vUHJvaiI6MiwiLi90cmFuc2Zvcm0iOjY2fV0sMzA6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLlBJLzIsZT0xLGY9MixnPTMsaD00LGk9NSxqPTQ4NDgxMzY4MTEwOTUzNmUtMjAsaz0xLjAwMjYsbD0uMzgyNjgzNDMyMzY1MDg5OCxtPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbT8odGhpcy5kYXR1bV90eXBlPWgsdm9pZChhJiYoYS5kYXR1bUNvZGUmJiJub25lIj09PWEuZGF0dW1Db2RlJiYodGhpcy5kYXR1bV90eXBlPWkpLGEuZGF0dW1fcGFyYW1zJiYodGhpcy5kYXR1bV9wYXJhbXM9YS5kYXR1bV9wYXJhbXMubWFwKHBhcnNlRmxvYXQpLDA9PT10aGlzLmRhdHVtX3BhcmFtc1swXSYmMD09PXRoaXMuZGF0dW1fcGFyYW1zWzFdJiYwPT09dGhpcy5kYXR1bV9wYXJhbXNbMl18fCh0aGlzLmRhdHVtX3R5cGU9ZSksdGhpcy5kYXR1bV9wYXJhbXMubGVuZ3RoPjMmJigwPT09dGhpcy5kYXR1bV9wYXJhbXNbM10mJjA9PT10aGlzLmRhdHVtX3BhcmFtc1s0XSYmMD09PXRoaXMuZGF0dW1fcGFyYW1zWzVdJiYwPT09dGhpcy5kYXR1bV9wYXJhbXNbNl18fCh0aGlzLmRhdHVtX3R5cGU9Zix0aGlzLmRhdHVtX3BhcmFtc1szXSo9aix0aGlzLmRhdHVtX3BhcmFtc1s0XSo9aix0aGlzLmRhdHVtX3BhcmFtc1s1XSo9aix0aGlzLmRhdHVtX3BhcmFtc1s2XT10aGlzLmRhdHVtX3BhcmFtc1s2XS8xZTYrMSkpKSx0aGlzLmRhdHVtX3R5cGU9YS5ncmlkcz9nOnRoaXMuZGF0dW1fdHlwZSx0aGlzLmE9YS5hLHRoaXMuYj1hLmIsdGhpcy5lcz1hLmVzLHRoaXMuZXAyPWEuZXAyLHRoaXMuZGF0dW1fdHlwZT09PWcmJih0aGlzLmdyaWRzPWEuZ3JpZHMpKSkpOm5ldyBtKGEpfTttLnByb3RvdHlwZT17Y29tcGFyZV9kYXR1bXM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0dW1fdHlwZSE9PWEuZGF0dW1fdHlwZT8hMTp0aGlzLmEhPT1hLmF8fE1hdGguYWJzKHRoaXMuZXMtYS5lcyk+NWUtMTE/ITE6dGhpcy5kYXR1bV90eXBlPT09ZT90aGlzLmRhdHVtX3BhcmFtc1swXT09PWEuZGF0dW1fcGFyYW1zWzBdJiZ0aGlzLmRhdHVtX3BhcmFtc1sxXT09PWEuZGF0dW1fcGFyYW1zWzFdJiZ0aGlzLmRhdHVtX3BhcmFtc1syXT09PWEuZGF0dW1fcGFyYW1zWzJdOnRoaXMuZGF0dW1fdHlwZT09PWY/dGhpcy5kYXR1bV9wYXJhbXNbMF09PT1hLmRhdHVtX3BhcmFtc1swXSYmdGhpcy5kYXR1bV9wYXJhbXNbMV09PT1hLmRhdHVtX3BhcmFtc1sxXSYmdGhpcy5kYXR1bV9wYXJhbXNbMl09PT1hLmRhdHVtX3BhcmFtc1syXSYmdGhpcy5kYXR1bV9wYXJhbXNbM109PT1hLmRhdHVtX3BhcmFtc1szXSYmdGhpcy5kYXR1bV9wYXJhbXNbNF09PT1hLmRhdHVtX3BhcmFtc1s0XSYmdGhpcy5kYXR1bV9wYXJhbXNbNV09PT1hLmRhdHVtX3BhcmFtc1s1XSYmdGhpcy5kYXR1bV9wYXJhbXNbNl09PT1hLmRhdHVtX3BhcmFtc1s2XTp0aGlzLmRhdHVtX3R5cGU9PT1nfHxhLmRhdHVtX3R5cGU9PT1nP3RoaXMubmFkZ3JpZHM9PT1hLm5hZGdyaWRzOiEwfSxnZW9kZXRpY190b19nZW9jZW50cmljOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZSxmLGcsaCxpLGo9YS54LGs9YS55LGw9YS56P2EuejowLG09MDtpZigtZD5rJiZrPi0xLjAwMSpkKWs9LWQ7ZWxzZSBpZihrPmQmJjEuMDAxKmQ+aylrPWQ7ZWxzZSBpZigtZD5rfHxrPmQpcmV0dXJuIG51bGw7cmV0dXJuIGo+TWF0aC5QSSYmKGotPTIqTWF0aC5QSSksZz1NYXRoLnNpbihrKSxpPU1hdGguY29zKGspLGg9ZypnLGY9dGhpcy5hL01hdGguc3FydCgxLXRoaXMuZXMqaCksYj0oZitsKSppKk1hdGguY29zKGopLGM9KGYrbCkqaSpNYXRoLnNpbihqKSxlPShmKigxLXRoaXMuZXMpK2wpKmcsYS54PWIsYS55PWMsYS56PWUsbX0sZ2VvY2VudHJpY190b19nZW9kZXRpYzpmdW5jdGlvbihhKXt2YXIgYixjLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQ9MWUtMTIsdT10KnQsdj0zMCx3PWEueCx4PWEueSx5PWEuej9hLno6MDtpZihvPSExLGI9TWF0aC5zcXJ0KHcqdyt4KngpLGM9TWF0aC5zcXJ0KHcqdyt4KngreSp5KSxiL3RoaXMuYTx0KXtpZihvPSEwLHE9MCxjL3RoaXMuYTx0KXJldHVybiByPWQsdm9pZChzPS10aGlzLmIpfWVsc2UgcT1NYXRoLmF0YW4yKHgsdyk7ZT15L2MsZj1iL2MsZz0xL01hdGguc3FydCgxLXRoaXMuZXMqKDItdGhpcy5lcykqZipmKSxqPWYqKDEtdGhpcy5lcykqZyxrPWUqZyxwPTA7ZG8gcCsrLGk9dGhpcy5hL01hdGguc3FydCgxLXRoaXMuZXMqayprKSxzPWIqait5KmstaSooMS10aGlzLmVzKmsqayksaD10aGlzLmVzKmkvKGkrcyksZz0xL01hdGguc3FydCgxLWgqKDItaCkqZipmKSxsPWYqKDEtaCkqZyxtPWUqZyxuPW0qai1sKmssaj1sLGs9bTt3aGlsZShuKm4+dSYmdj5wKTtyZXR1cm4gcj1NYXRoLmF0YW4obS9NYXRoLmFicyhsKSksYS54PXEsYS55PXIsYS56PXMsYX0sZ2VvY2VudHJpY190b19nZW9kZXRpY19ub25pdGVyOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZSxmLGcsaCxpLGosbSxuLG8scCxxLHIscyx0LHUsdj1hLngsdz1hLnkseD1hLno/YS56OjA7aWYodj1wYXJzZUZsb2F0KHYpLHc9cGFyc2VGbG9hdCh3KSx4PXBhcnNlRmxvYXQoeCksdT0hMSwwIT09diliPU1hdGguYXRhbjIodyx2KTtlbHNlIGlmKHc+MCliPWQ7ZWxzZSBpZigwPncpYj0tZDtlbHNlIGlmKHU9ITAsYj0wLHg+MCljPWQ7ZWxzZXtpZighKDA+eCkpcmV0dXJuIGM9ZCx2b2lkKGU9LXRoaXMuYik7Yz0tZH1yZXR1cm4gZz12KnYrdyp3LGY9TWF0aC5zcXJ0KGcpLGg9eCprLGo9TWF0aC5zcXJ0KGgqaCtnKSxuPWgvaixwPWYvaixvPW4qbipuLGk9eCt0aGlzLmIqdGhpcy5lcDIqbyx0PWYtdGhpcy5hKnRoaXMuZXMqcCpwKnAsbT1NYXRoLnNxcnQoaSppK3QqdCkscT1pL20scj10L20scz10aGlzLmEvTWF0aC5zcXJ0KDEtdGhpcy5lcypxKnEpLGU9cj49bD9mL3ItczotbD49cj9mLy1yLXM6eC9xK3MqKHRoaXMuZXMtMSksdT09PSExJiYoYz1NYXRoLmF0YW4ocS9yKSksYS54PWIsYS55PWMsYS56PWUsYX0sZ2VvY2VudHJpY190b193Z3M4NDpmdW5jdGlvbihhKXtpZih0aGlzLmRhdHVtX3R5cGU9PT1lKWEueCs9dGhpcy5kYXR1bV9wYXJhbXNbMF0sYS55Kz10aGlzLmRhdHVtX3BhcmFtc1sxXSxhLnorPXRoaXMuZGF0dW1fcGFyYW1zWzJdO2Vsc2UgaWYodGhpcy5kYXR1bV90eXBlPT09Zil7dmFyIGI9dGhpcy5kYXR1bV9wYXJhbXNbMF0sYz10aGlzLmRhdHVtX3BhcmFtc1sxXSxkPXRoaXMuZGF0dW1fcGFyYW1zWzJdLGc9dGhpcy5kYXR1bV9wYXJhbXNbM10saD10aGlzLmRhdHVtX3BhcmFtc1s0XSxpPXRoaXMuZGF0dW1fcGFyYW1zWzVdLGo9dGhpcy5kYXR1bV9wYXJhbXNbNl0saz1qKihhLngtaSphLnkraCphLnopK2IsbD1qKihpKmEueCthLnktZyphLnopK2MsbT1qKigtaCphLngrZyphLnkrYS56KStkO2EueD1rLGEueT1sLGEuej1tfX0sZ2VvY2VudHJpY19mcm9tX3dnczg0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuZGF0dW1fdHlwZT09PWUpYS54LT10aGlzLmRhdHVtX3BhcmFtc1swXSxhLnktPXRoaXMuZGF0dW1fcGFyYW1zWzFdLGEuei09dGhpcy5kYXR1bV9wYXJhbXNbMl07ZWxzZSBpZih0aGlzLmRhdHVtX3R5cGU9PT1mKXt2YXIgYj10aGlzLmRhdHVtX3BhcmFtc1swXSxjPXRoaXMuZGF0dW1fcGFyYW1zWzFdLGQ9dGhpcy5kYXR1bV9wYXJhbXNbMl0sZz10aGlzLmRhdHVtX3BhcmFtc1szXSxoPXRoaXMuZGF0dW1fcGFyYW1zWzRdLGk9dGhpcy5kYXR1bV9wYXJhbXNbNV0saj10aGlzLmRhdHVtX3BhcmFtc1s2XSxrPShhLngtYikvaixsPShhLnktYykvaixtPShhLnotZCkvajthLng9aytpKmwtaCptLGEueT0taSprK2wrZyptLGEuej1oKmstZypsK219fX0sYi5leHBvcnRzPW19LHt9XSwzMTpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTEsZT0yLGY9MyxnPTUsaD02Mzc4MTM3LGk9LjAwNjY5NDM3OTk5MDE0MTMxNjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGooYSl7cmV0dXJuIGE9PT1kfHxhPT09ZX12YXIgayxsLG07aWYoYS5jb21wYXJlX2RhdHVtcyhiKSlyZXR1cm4gYztpZihhLmRhdHVtX3R5cGU9PT1nfHxiLmRhdHVtX3R5cGU9PT1nKXJldHVybiBjO3ZhciBuPWEuYSxvPWEuZXMscD1iLmEscT1iLmVzLHI9YS5kYXR1bV90eXBlO2lmKHI9PT1mKWlmKDA9PT10aGlzLmFwcGx5X2dyaWRzaGlmdChhLDAsYykpYS5hPWgsYS5lcz1pO2Vsc2V7aWYoIWEuZGF0dW1fcGFyYW1zKXJldHVybiBhLmE9bixhLmVzPWEuZXMsYztmb3Ioaz0xLGw9MCxtPWEuZGF0dW1fcGFyYW1zLmxlbmd0aDttPmw7bCsrKWsqPWEuZGF0dW1fcGFyYW1zW2xdO2lmKDA9PT1rKXJldHVybiBhLmE9bixhLmVzPWEuZXMsYztyPWEuZGF0dW1fcGFyYW1zLmxlbmd0aD4zP2U6ZH1yZXR1cm4gYi5kYXR1bV90eXBlPT09ZiYmKGIuYT1oLGIuZXM9aSksKGEuZXMhPT1iLmVzfHxhLmEhPT1iLmF8fGoocil8fGooYi5kYXR1bV90eXBlKSkmJihhLmdlb2RldGljX3RvX2dlb2NlbnRyaWMoYyksaihhLmRhdHVtX3R5cGUpJiZhLmdlb2NlbnRyaWNfdG9fd2dzODQoYyksaihiLmRhdHVtX3R5cGUpJiZiLmdlb2NlbnRyaWNfZnJvbV93Z3M4NChjKSxiLmdlb2NlbnRyaWNfdG9fZ2VvZGV0aWMoYykpLGIuZGF0dW1fdHlwZT09PWYmJnRoaXMuYXBwbHlfZ3JpZHNoaWZ0KGIsMSxjKSxhLmE9bixhLmVzPW8sYi5hPXAsYi5lcz1xLGN9fSx7fV0sMzI6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBiPXRoaXM7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBjPWFyZ3VtZW50c1sxXTsic3RyaW5nIj09dHlwZW9mIGM/IisiPT09Yy5jaGFyQXQoMCk/ZFthXT1mKGFyZ3VtZW50c1sxXSk6ZFthXT1nKGFyZ3VtZW50c1sxXSk6ZFthXT1jfWVsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKEFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe0FycmF5LmlzQXJyYXkoYSk/ZC5hcHBseShiLGEpOmQoYSl9KTtpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGEgaW4gZClyZXR1cm4gZFthXX1lbHNlIkVQU0ciaW4gYT9kWyJFUFNHOiIrYS5FUFNHXT1hOiJFU1JJImluIGE/ZFsiRVNSSToiK2EuRVNSSV09YToiSUFVMjAwMCJpbiBhP2RbIklBVTIwMDA6IithLklBVTIwMDBdPWE6Y29uc29sZS5sb2coYSk7cmV0dXJufX12YXIgZT1hKCIuL2dsb2JhbCIpLGY9YSgiLi9wcm9qU3RyaW5nIiksZz1hKCIuL3drdCIpO2UoZCksYi5leHBvcnRzPWR9LHsiLi9nbG9iYWwiOjM1LCIuL3Byb2pTdHJpbmciOjM4LCIuL3drdCI6Njd9XSwzMzpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4vY29uc3RhbnRzL0RhdHVtIiksZT1hKCIuL2NvbnN0YW50cy9FbGxpcHNvaWQiKSxmPWEoIi4vZXh0ZW5kIiksZz1hKCIuL2RhdHVtIiksaD0xZS0xMCxpPS4xNjY2NjY2NjY2NjY2NjY2NixqPS4wNDcyMjIyMjIyMjIyMjIyMixrPS4wMjIxNTYwODQ2NTYwODQ2NTU7Yi5leHBvcnRzPWZ1bmN0aW9uKGEpe2lmKGEuZGF0dW1Db2RlJiYibm9uZSIhPT1hLmRhdHVtQ29kZSl7dmFyIGI9ZFthLmRhdHVtQ29kZV07YiYmKGEuZGF0dW1fcGFyYW1zPWIudG93Z3M4ND9iLnRvd2dzODQuc3BsaXQoIiwiKTpudWxsLGEuZWxscHM9Yi5lbGxpcHNlLGEuZGF0dW1OYW1lPWIuZGF0dW1OYW1lP2IuZGF0dW1OYW1lOmEuZGF0dW1Db2RlKX1pZighYS5hKXt2YXIgYz1lW2EuZWxscHNdP2VbYS5lbGxwc106ZS5XR1M4NDtmKGEsYyl9cmV0dXJuIGEucmYmJiFhLmImJihhLmI9KDEtMS9hLnJmKSphLmEpLCgwPT09YS5yZnx8TWF0aC5hYnMoYS5hLWEuYik8aCkmJihhLnNwaGVyZT0hMCxhLmI9YS5hKSxhLmEyPWEuYSphLmEsYS5iMj1hLmIqYS5iLGEuZXM9KGEuYTItYS5iMikvYS5hMixhLmU9TWF0aC5zcXJ0KGEuZXMpLGEuUl9BJiYoYS5hKj0xLWEuZXMqKGkrYS5lcyooaithLmVzKmspKSxhLmEyPWEuYSphLmEsYS5iMj1hLmIqYS5iLGEuZXM9MCksYS5lcDI9KGEuYTItYS5iMikvYS5iMixhLmswfHwoYS5rMD0xKSxhLmF4aXN8fChhLmF4aXM9ImVudSIpLGEuZGF0dW18fChhLmRhdHVtPWcoYSkpLGF9fSx7Ii4vY29uc3RhbnRzL0RhdHVtIjoyNSwiLi9jb25zdGFudHMvRWxsaXBzb2lkIjoyNiwiLi9kYXR1bSI6MzAsIi4vZXh0ZW5kIjozNH1dLDM0OltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7YT1hfHx7fTt2YXIgYyxkO2lmKCFiKXJldHVybiBhO2ZvcihkIGluIGIpYz1iW2RdLHZvaWQgMCE9PWMmJihhW2RdPWMpO3JldHVybiBhfX0se31dLDM1OltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEpe2EoIkVQU0c6NDMyNiIsIit0aXRsZT1XR1MgODQgKGxvbmcvbGF0KSArcHJvaj1sb25nbGF0ICtlbGxwcz1XR1M4NCArZGF0dW09V0dTODQgK3VuaXRzPWRlZ3JlZXMiKSxhKCJFUFNHOjQyNjkiLCIrdGl0bGU9TkFEODMgKGxvbmcvbGF0KSArcHJvaj1sb25nbGF0ICthPTYzNzgxMzcuMCArYj02MzU2NzUyLjMxNDE0MDM2ICtlbGxwcz1HUlM4MCArZGF0dW09TkFEODMgK3VuaXRzPWRlZ3JlZXMiKSxhKCJFUFNHOjM4NTciLCIrdGl0bGU9V0dTIDg0IC8gUHNldWRvLU1lcmNhdG9yICtwcm9qPW1lcmMgK2E9NjM3ODEzNyArYj02Mzc4MTM3ICtsYXRfdHM9MC4wICtsb25fMD0wLjAgK3hfMD0wLjAgK3lfMD0wICtrPTEuMCArdW5pdHM9bSArbmFkZ3JpZHM9QG51bGwgK25vX2RlZnMiKSxhLldHUzg0PWFbIkVQU0c6NDMyNiJdLGFbIkVQU0c6Mzc4NSJdPWFbIkVQU0c6Mzg1NyJdLGEuR09PR0xFPWFbIkVQU0c6Mzg1NyJdLGFbIkVQU0c6OTAwOTEzIl09YVsiRVBTRzozODU3Il0sYVsiRVBTRzoxMDIxMTMiXT1hWyJFUFNHOjM4NTciXX19LHt9XSwzNjpbZnVuY3Rpb24oYSxiLGMpe3ZhciBwcm9qND1hKCIuL2NvcmUiKTtwcm9qNC5kZWZhdWx0RGF0dW09IldHUzg0Iixwcm9qNC5Qcm9qPWEoIi4vUHJvaiIpLHByb2o0LldHUzg0PW5ldyBwcm9qNC5Qcm9qKCJXR1M4NCIpLHByb2o0LlBvaW50PWEoIi4vUG9pbnQiKSxwcm9qNC50b1BvaW50PWEoIi4vY29tbW9uL3RvUG9pbnQiKSxwcm9qNC5kZWZzPWEoIi4vZGVmcyIpLHByb2o0LnRyYW5zZm9ybT1hKCIuL3RyYW5zZm9ybSIpLHByb2o0Lm1ncnM9YSgibWdycyIpLHByb2o0LnZlcnNpb249YSgiLi4vcGFja2FnZS5qc29uIikudmVyc2lvbixhKCIuL2luY2x1ZGVkUHJvamVjdGlvbnMiKShwcm9qNCksYi5leHBvcnRzPXByb2o0fSx7Ii4uL3BhY2thZ2UuanNvbiI6NjksIi4vUG9pbnQiOjEsIi4vUHJvaiI6MiwiLi9jb21tb24vdG9Qb2ludCI6MjMsIi4vY29yZSI6MjksIi4vZGVmcyI6MzIsIi4vaW5jbHVkZWRQcm9qZWN0aW9ucyI6Ii4vaW5jbHVkZWRQcm9qZWN0aW9ucyIsIi4vdHJhbnNmb3JtIjo2NixtZ3JzOjY4fV0sMzc6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYX1mdW5jdGlvbiBlKGEpe3JldHVybiBhIGluIGl9ZnVuY3Rpb24gZihhKXt2YXIgYj1bIkdFT0dDUyIsIkdFT0NDUyIsIlBST0pDUyIsIkxPQ0FMX0NTIl07cmV0dXJuIGIucmVkdWNlKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGIrMSthLmluZGV4T2YoYyl9LDApfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIisiPT09YVswXX1mdW5jdGlvbiBoKGEpe3JldHVybiBkKGEpP2UoYSk/aVthXTpmKGEpP2ooYSk6ZyhhKT9rKGEpOnZvaWQgMDphfXZhciBpPWEoIi4vZGVmcyIpLGo9YSgiLi93a3QiKSxrPWEoIi4vcHJvalN0cmluZyIpO2IuZXhwb3J0cz1ofSx7Ii4vZGVmcyI6MzIsIi4vcHJvalN0cmluZyI6MzgsIi4vd2t0Ijo2N31dLDM4OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9LjAxNzQ1MzI5MjUxOTk0MzI5NSxlPWEoIi4vY29uc3RhbnRzL1ByaW1lTWVyaWRpYW4iKSxmPWEoIi4vY29uc3RhbnRzL3VuaXRzIik7Yi5leHBvcnRzPWZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9e307YS5zcGxpdCgiKyIpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuc3BsaXQoIj0iKTtiLnB1c2goITApLGNbYlswXS50b0xvd2VyQ2FzZSgpXT1iWzFdfSk7dmFyIGcsaCxpLGo9e3Byb2o6InByb2pOYW1lIixkYXR1bToiZGF0dW1Db2RlIixyZjpmdW5jdGlvbihhKXtiLnJmPXBhcnNlRmxvYXQoYSl9LGxhdF8wOmZ1bmN0aW9uKGEpe2IubGF0MD1hKmR9LGxhdF8xOmZ1bmN0aW9uKGEpe2IubGF0MT1hKmR9LGxhdF8yOmZ1bmN0aW9uKGEpe2IubGF0Mj1hKmR9LGxhdF90czpmdW5jdGlvbihhKXtiLmxhdF90cz1hKmR9LGxvbl8wOmZ1bmN0aW9uKGEpe2IubG9uZzA9YSpkfSxsb25fMTpmdW5jdGlvbihhKXtiLmxvbmcxPWEqZH0sbG9uXzI6ZnVuY3Rpb24oYSl7Yi5sb25nMj1hKmR9LGFscGhhOmZ1bmN0aW9uKGEpe2IuYWxwaGE9cGFyc2VGbG9hdChhKSpkfSxsb25jOmZ1bmN0aW9uKGEpe2IubG9uZ2M9YSpkfSx4XzA6ZnVuY3Rpb24oYSl7Yi54MD1wYXJzZUZsb2F0KGEpfSx5XzA6ZnVuY3Rpb24oYSl7Yi55MD1wYXJzZUZsb2F0KGEpfSxrXzA6ZnVuY3Rpb24oYSl7Yi5rMD1wYXJzZUZsb2F0KGEpfSxrOmZ1bmN0aW9uKGEpe2IuazA9cGFyc2VGbG9hdChhKX0sYTpmdW5jdGlvbihhKXtiLmE9cGFyc2VGbG9hdChhKX0sYjpmdW5jdGlvbihhKXtiLmI9cGFyc2VGbG9hdChhKX0scl9hOmZ1bmN0aW9uKCl7Yi5SX0E9ITB9LHpvbmU6ZnVuY3Rpb24oYSl7Yi56b25lPXBhcnNlSW50KGEsMTApfSxzb3V0aDpmdW5jdGlvbigpe2IudXRtU291dGg9ITB9LHRvd2dzODQ6ZnVuY3Rpb24oYSl7Yi5kYXR1bV9wYXJhbXM9YS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gcGFyc2VGbG9hdChhKX0pfSx0b19tZXRlcjpmdW5jdGlvbihhKXtiLnRvX21ldGVyPXBhcnNlRmxvYXQoYSl9LHVuaXRzOmZ1bmN0aW9uKGEpe2IudW5pdHM9YSxmW2FdJiYoYi50b19tZXRlcj1mW2FdLnRvX21ldGVyKX0sZnJvbV9ncmVlbndpY2g6ZnVuY3Rpb24oYSl7Yi5mcm9tX2dyZWVud2ljaD1hKmR9LHBtOmZ1bmN0aW9uKGEpe2IuZnJvbV9ncmVlbndpY2g9KGVbYV0/ZVthXTpwYXJzZUZsb2F0KGEpKSpkfSxuYWRncmlkczpmdW5jdGlvbihhKXsiQG51bGwiPT09YT9iLmRhdHVtQ29kZT0ibm9uZSI6Yi5uYWRncmlkcz1hfSxheGlzOmZ1bmN0aW9uKGEpe3ZhciBjPSJld25zdWQiOzM9PT1hLmxlbmd0aCYmLTEhPT1jLmluZGV4T2YoYS5zdWJzdHIoMCwxKSkmJi0xIT09Yy5pbmRleE9mKGEuc3Vic3RyKDEsMSkpJiYtMSE9PWMuaW5kZXhPZihhLnN1YnN0cigyLDEpKSYmKGIuYXhpcz1hKX19O2ZvcihnIGluIGMpaD1jW2ddLGcgaW4gaj8oaT1qW2ddLCJmdW5jdGlvbiI9PXR5cGVvZiBpP2koaCk6YltpXT1oKTpiW2ddPWg7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiLmRhdHVtQ29kZSYmIldHUzg0IiE9PWIuZGF0dW1Db2RlJiYoYi5kYXR1bUNvZGU9Yi5kYXR1bUNvZGUudG9Mb3dlckNhc2UoKSksYn19LHsiLi9jb25zdGFudHMvUHJpbWVNZXJpZGlhbiI6MjcsIi4vY29uc3RhbnRzL3VuaXRzIjoyOH1dLDM5OltmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhLGIpe3ZhciBjPWcubGVuZ3RoO3JldHVybiBhLm5hbWVzPyhnW2NdPWEsYS5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2ZbYS50b0xvd2VyQ2FzZSgpXT1jfSksdGhpcyk6KGNvbnNvbGUubG9nKGIpLCEwKX12YXIgZT1bYSgiLi9wcm9qZWN0aW9ucy9tZXJjIiksYSgiLi9wcm9qZWN0aW9ucy9sb25nbGF0IildLGY9e30sZz1bXTtjLmFkZD1kLGMuZ2V0PWZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3ZhciBiPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGZbYl0mJmdbZltiXV0/Z1tmW2JdXTp2b2lkIDB9LGMuc3RhcnQ9ZnVuY3Rpb24oKXtlLmZvckVhY2goZCl9fSx7Ii4vcHJvamVjdGlvbnMvbG9uZ2xhdCI6NTEsIi4vcHJvamVjdGlvbnMvbWVyYyI6NTJ9XSw0MDpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTFlLTEwLGU9YSgiLi4vY29tbW9uL21zZm56IiksZj1hKCIuLi9jb21tb24vcXNmbnoiKSxnPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksaD1hKCIuLi9jb21tb24vYXNpbnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXtNYXRoLmFicyh0aGlzLmxhdDErdGhpcy5sYXQyKTxkfHwodGhpcy50ZW1wPXRoaXMuYi90aGlzLmEsdGhpcy5lcz0xLU1hdGgucG93KHRoaXMudGVtcCwyKSx0aGlzLmUzPU1hdGguc3FydCh0aGlzLmVzKSx0aGlzLnNpbl9wbz1NYXRoLnNpbih0aGlzLmxhdDEpLHRoaXMuY29zX3BvPU1hdGguY29zKHRoaXMubGF0MSksdGhpcy50MT10aGlzLnNpbl9wbyx0aGlzLmNvbj10aGlzLnNpbl9wbyx0aGlzLm1zMT1lKHRoaXMuZTMsdGhpcy5zaW5fcG8sdGhpcy5jb3NfcG8pLHRoaXMucXMxPWYodGhpcy5lMyx0aGlzLnNpbl9wbyx0aGlzLmNvc19wbyksdGhpcy5zaW5fcG89TWF0aC5zaW4odGhpcy5sYXQyKSx0aGlzLmNvc19wbz1NYXRoLmNvcyh0aGlzLmxhdDIpLHRoaXMudDI9dGhpcy5zaW5fcG8sdGhpcy5tczI9ZSh0aGlzLmUzLHRoaXMuc2luX3BvLHRoaXMuY29zX3BvKSx0aGlzLnFzMj1mKHRoaXMuZTMsdGhpcy5zaW5fcG8sdGhpcy5jb3NfcG8pLHRoaXMuc2luX3BvPU1hdGguc2luKHRoaXMubGF0MCksdGhpcy5jb3NfcG89TWF0aC5jb3ModGhpcy5sYXQwKSx0aGlzLnQzPXRoaXMuc2luX3BvLHRoaXMucXMwPWYodGhpcy5lMyx0aGlzLnNpbl9wbyx0aGlzLmNvc19wbyksTWF0aC5hYnModGhpcy5sYXQxLXRoaXMubGF0Mik+ZD90aGlzLm5zMD0odGhpcy5tczEqdGhpcy5tczEtdGhpcy5tczIqdGhpcy5tczIpLyh0aGlzLnFzMi10aGlzLnFzMSk6dGhpcy5uczA9dGhpcy5jb24sdGhpcy5jPXRoaXMubXMxKnRoaXMubXMxK3RoaXMubnMwKnRoaXMucXMxLHRoaXMucmg9dGhpcy5hKk1hdGguc3FydCh0aGlzLmMtdGhpcy5uczAqdGhpcy5xczApL3RoaXMubnMwKX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiPWEueCxjPWEueTt0aGlzLnNpbl9waGk9TWF0aC5zaW4oYyksdGhpcy5jb3NfcGhpPU1hdGguY29zKGMpO3ZhciBkPWYodGhpcy5lMyx0aGlzLnNpbl9waGksdGhpcy5jb3NfcGhpKSxlPXRoaXMuYSpNYXRoLnNxcnQodGhpcy5jLXRoaXMubnMwKmQpL3RoaXMubnMwLGg9dGhpcy5uczAqZyhiLXRoaXMubG9uZzApLGk9ZSpNYXRoLnNpbihoKSt0aGlzLngwLGo9dGhpcy5yaC1lKk1hdGguY29zKGgpK3RoaXMueTA7cmV0dXJuIGEueD1pLGEueT1qLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGg7cmV0dXJuIGEueC09dGhpcy54MCxhLnk9dGhpcy5yaC1hLnkrdGhpcy55MCx0aGlzLm5zMD49MD8oYj1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSxkPTEpOihiPS1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSxkPS0xKSxlPTAsMCE9PWImJihlPU1hdGguYXRhbjIoZCphLngsZCphLnkpKSxkPWIqdGhpcy5uczAvdGhpcy5hLHRoaXMuc3BoZXJlP2g9TWF0aC5hc2luKCh0aGlzLmMtZCpkKS8oMip0aGlzLm5zMCkpOihjPSh0aGlzLmMtZCpkKS90aGlzLm5zMCxoPXRoaXMucGhpMXoodGhpcy5lMyxjKSksZj1nKGUvdGhpcy5uczArdGhpcy5sb25nMCksYS54PWYsYS55PWgsYX0sYy5waGkxej1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGksaj1oKC41KmIpO2lmKGQ+YSlyZXR1cm4gajtmb3IodmFyIGs9YSphLGw9MTsyNT49bDtsKyspaWYoYz1NYXRoLnNpbihqKSxlPU1hdGguY29zKGopLGY9YSpjLGc9MS1mKmYsaT0uNSpnKmcvZSooYi8oMS1rKS1jL2crLjUvYSpNYXRoLmxvZygoMS1mKS8oMStmKSkpLGorPWksTWF0aC5hYnMoaSk8PTFlLTcpcmV0dXJuIGo7cmV0dXJuIG51bGx9LGMubmFtZXM9WyJBbGJlcnNfQ29uaWNfRXF1YWxfQXJlYSIsIkFsYmVycyIsImFlYSJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vYXNpbnoiOjYsIi4uL2NvbW1vbi9tc2ZueiI6MTUsIi4uL2NvbW1vbi9xc2ZueiI6MjB9XSw0MTpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksZT1NYXRoLlBJLzIsZj0xZS0xMCxnPWEoIi4uL2NvbW1vbi9tbGZuIiksaD1hKCIuLi9jb21tb24vZTBmbiIpLGk9YSgiLi4vY29tbW9uL2UxZm4iKSxqPWEoIi4uL2NvbW1vbi9lMmZuIiksaz1hKCIuLi9jb21tb24vZTNmbiIpLGw9YSgiLi4vY29tbW9uL2dOIiksbT1hKCIuLi9jb21tb24vYXNpbnoiKSxuPWEoIi4uL2NvbW1vbi9pbWxmbiIpO2MuaW5pdD1mdW5jdGlvbigpe3RoaXMuc2luX3AxMj1NYXRoLnNpbih0aGlzLmxhdDApLHRoaXMuY29zX3AxMj1NYXRoLmNvcyh0aGlzLmxhdDApfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxtLG4sbyxwLHEscixzLHQsdSx2LHcseCx5LHosQSxCLEMsRCxFLEYsRyxIPWEueCxJPWEueSxKPU1hdGguc2luKGEueSksSz1NYXRoLmNvcyhhLnkpLEw9ZChILXRoaXMubG9uZzApO3JldHVybiB0aGlzLnNwaGVyZT9NYXRoLmFicyh0aGlzLnNpbl9wMTItMSk8PWY/KGEueD10aGlzLngwK3RoaXMuYSooZS1JKSpNYXRoLnNpbihMKSxhLnk9dGhpcy55MC10aGlzLmEqKGUtSSkqTWF0aC5jb3MoTCksYSk6TWF0aC5hYnModGhpcy5zaW5fcDEyKzEpPD1mPyhhLng9dGhpcy54MCt0aGlzLmEqKGUrSSkqTWF0aC5zaW4oTCksYS55PXRoaXMueTArdGhpcy5hKihlK0kpKk1hdGguY29zKEwpLGEpOihCPXRoaXMuc2luX3AxMipKK3RoaXMuY29zX3AxMipLKk1hdGguY29zKEwpLHo9TWF0aC5hY29zKEIpLEE9ei9NYXRoLnNpbih6KSxhLng9dGhpcy54MCt0aGlzLmEqQSpLKk1hdGguc2luKEwpLGEueT10aGlzLnkwK3RoaXMuYSpBKih0aGlzLmNvc19wMTIqSi10aGlzLnNpbl9wMTIqSypNYXRoLmNvcyhMKSksYSk6KGI9aCh0aGlzLmVzKSxjPWkodGhpcy5lcyksbT1qKHRoaXMuZXMpLG49ayh0aGlzLmVzKSxNYXRoLmFicyh0aGlzLnNpbl9wMTItMSk8PWY/KG89dGhpcy5hKmcoYixjLG0sbixlKSxwPXRoaXMuYSpnKGIsYyxtLG4sSSksYS54PXRoaXMueDArKG8tcCkqTWF0aC5zaW4oTCksYS55PXRoaXMueTAtKG8tcCkqTWF0aC5jb3MoTCksYSk6TWF0aC5hYnModGhpcy5zaW5fcDEyKzEpPD1mPyhvPXRoaXMuYSpnKGIsYyxtLG4sZSkscD10aGlzLmEqZyhiLGMsbSxuLEkpLGEueD10aGlzLngwKyhvK3ApKk1hdGguc2luKEwpLGEueT10aGlzLnkwKyhvK3ApKk1hdGguY29zKEwpLGEpOihxPUovSyxyPWwodGhpcy5hLHRoaXMuZSx0aGlzLnNpbl9wMTIpLHM9bCh0aGlzLmEsdGhpcy5lLEopLHQ9TWF0aC5hdGFuKCgxLXRoaXMuZXMpKnErdGhpcy5lcypyKnRoaXMuc2luX3AxMi8ocypLKSksdT1NYXRoLmF0YW4yKE1hdGguc2luKEwpLHRoaXMuY29zX3AxMipNYXRoLnRhbih0KS10aGlzLnNpbl9wMTIqTWF0aC5jb3MoTCkpLEM9MD09PXU/TWF0aC5hc2luKHRoaXMuY29zX3AxMipNYXRoLnNpbih0KS10aGlzLnNpbl9wMTIqTWF0aC5jb3ModCkpOk1hdGguYWJzKE1hdGguYWJzKHUpLU1hdGguUEkpPD1mPy1NYXRoLmFzaW4odGhpcy5jb3NfcDEyKk1hdGguc2luKHQpLXRoaXMuc2luX3AxMipNYXRoLmNvcyh0KSk6TWF0aC5hc2luKE1hdGguc2luKEwpKk1hdGguY29zKHQpL01hdGguc2luKHUpKSx2PXRoaXMuZSp0aGlzLnNpbl9wMTIvTWF0aC5zcXJ0KDEtdGhpcy5lcyksdz10aGlzLmUqdGhpcy5jb3NfcDEyKk1hdGguY29zKHUpL01hdGguc3FydCgxLXRoaXMuZXMpLHg9dip3LHk9dyp3LEQ9QypDLEU9RCpDLEY9RSpDLEc9RipDLHo9cipDKigxLUQqeSooMS15KS82K0UvOCp4KigxLTIqeSkrRi8xMjAqKHkqKDQtNyp5KS0zKnYqdiooMS03KnkpKS1HLzQ4KngpLGEueD10aGlzLngwK3oqTWF0aC5zaW4odSksYS55PXRoaXMueTAreipNYXRoLmNvcyh1KSxhKSl9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXthLngtPXRoaXMueDAsYS55LT10aGlzLnkwO3ZhciBiLGMsbyxwLHEscixzLHQsdSx2LHcseCx5LHosQSxCLEMsRCxFLEYsRyxILEk7aWYodGhpcy5zcGhlcmUpe2lmKGI9TWF0aC5zcXJ0KGEueCphLngrYS55KmEueSksYj4yKmUqdGhpcy5hKXJldHVybjtyZXR1cm4gYz1iL3RoaXMuYSxvPU1hdGguc2luKGMpLHA9TWF0aC5jb3MoYykscT10aGlzLmxvbmcwLE1hdGguYWJzKGIpPD1mP3I9dGhpcy5sYXQwOihyPW0ocCp0aGlzLnNpbl9wMTIrYS55Km8qdGhpcy5jb3NfcDEyL2IpLHM9TWF0aC5hYnModGhpcy5sYXQwKS1lLHE9ZChNYXRoLmFicyhzKTw9Zj90aGlzLmxhdDA+PTA/dGhpcy5sb25nMCtNYXRoLmF0YW4yKGEueCwtYS55KTp0aGlzLmxvbmcwLU1hdGguYXRhbjIoLWEueCxhLnkpOnRoaXMubG9uZzArTWF0aC5hdGFuMihhLngqbyxiKnRoaXMuY29zX3AxMipwLWEueSp0aGlzLnNpbl9wMTIqbykpKSxhLng9cSxhLnk9cixhfXJldHVybiB0PWgodGhpcy5lcyksdT1pKHRoaXMuZXMpLHY9aih0aGlzLmVzKSx3PWsodGhpcy5lcyksTWF0aC5hYnModGhpcy5zaW5fcDEyLTEpPD1mPyh4PXRoaXMuYSpnKHQsdSx2LHcsZSksYj1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSx5PXgtYixyPW4oeS90aGlzLmEsdCx1LHYsdykscT1kKHRoaXMubG9uZzArTWF0aC5hdGFuMihhLngsLTEqYS55KSksYS54PXEsYS55PXIsYSk6TWF0aC5hYnModGhpcy5zaW5fcDEyKzEpPD1mPyh4PXRoaXMuYSpnKHQsdSx2LHcsZSksYj1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSx5PWIteCxyPW4oeS90aGlzLmEsdCx1LHYsdykscT1kKHRoaXMubG9uZzArTWF0aC5hdGFuMihhLngsYS55KSksYS54PXEsYS55PXIsYSk6KGI9TWF0aC5zcXJ0KGEueCphLngrYS55KmEueSksQj1NYXRoLmF0YW4yKGEueCxhLnkpLHo9bCh0aGlzLmEsdGhpcy5lLHRoaXMuc2luX3AxMiksQz1NYXRoLmNvcyhCKSxEPXRoaXMuZSp0aGlzLmNvc19wMTIqQyxFPS1EKkQvKDEtdGhpcy5lcyksRj0zKnRoaXMuZXMqKDEtRSkqdGhpcy5zaW5fcDEyKnRoaXMuY29zX3AxMipDLygxLXRoaXMuZXMpLEc9Yi96LEg9Ry1FKigxK0UpKk1hdGgucG93KEcsMykvNi1GKigxKzMqRSkqTWF0aC5wb3coRyw0KS8yNCxJPTEtRSpIKkgvMi1HKkgqSCpILzYsQT1NYXRoLmFzaW4odGhpcy5zaW5fcDEyKk1hdGguY29zKEgpK3RoaXMuY29zX3AxMipNYXRoLnNpbihIKSpDKSxxPWQodGhpcy5sb25nMCtNYXRoLmFzaW4oTWF0aC5zaW4oQikqTWF0aC5zaW4oSCkvTWF0aC5jb3MoQSkpKSxyPU1hdGguYXRhbigoMS10aGlzLmVzKkkqdGhpcy5zaW5fcDEyL01hdGguc2luKEEpKSpNYXRoLnRhbihBKS8oMS10aGlzLmVzKSksYS54PXEsYS55PXIsYSl9LGMubmFtZXM9WyJBemltdXRoYWxfRXF1aWRpc3RhbnQiLCJhZXFkIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9hc2lueiI6NiwiLi4vY29tbW9uL2UwZm4iOjcsIi4uL2NvbW1vbi9lMWZuIjo4LCIuLi9jb21tb24vZTJmbiI6OSwiLi4vY29tbW9uL2UzZm4iOjEwLCIuLi9jb21tb24vZ04iOjExLCIuLi9jb21tb24vaW1sZm4iOjEyLCIuLi9jb21tb24vbWxmbiI6MTR9XSw0MjpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9tbGZuIiksZT1hKCIuLi9jb21tb24vZTBmbiIpLGY9YSgiLi4vY29tbW9uL2UxZm4iKSxnPWEoIi4uL2NvbW1vbi9lMmZuIiksaD1hKCIuLi9jb21tb24vZTNmbiIpLGk9YSgiLi4vY29tbW9uL2dOIiksaj1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGs9YSgiLi4vY29tbW9uL2FkanVzdF9sYXQiKSxsPWEoIi4uL2NvbW1vbi9pbWxmbiIpLG09TWF0aC5QSS8yLG49MWUtMTA7Yy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5zcGhlcmV8fCh0aGlzLmUwPWUodGhpcy5lcyksdGhpcy5lMT1mKHRoaXMuZXMpLHRoaXMuZTI9Zyh0aGlzLmVzKSx0aGlzLmUzPWgodGhpcy5lcyksdGhpcy5tbDA9dGhpcy5hKmQodGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyx0aGlzLmxhdDApKX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZT1hLngsZj1hLnk7aWYoZT1qKGUtdGhpcy5sb25nMCksdGhpcy5zcGhlcmUpYj10aGlzLmEqTWF0aC5hc2luKE1hdGguY29zKGYpKk1hdGguc2luKGUpKSxjPXRoaXMuYSooTWF0aC5hdGFuMihNYXRoLnRhbihmKSxNYXRoLmNvcyhlKSktdGhpcy5sYXQwKTtlbHNle3ZhciBnPU1hdGguc2luKGYpLGg9TWF0aC5jb3MoZiksaz1pKHRoaXMuYSx0aGlzLmUsZyksbD1NYXRoLnRhbihmKSpNYXRoLnRhbihmKSxtPWUqTWF0aC5jb3MoZiksbj1tKm0sbz10aGlzLmVzKmgqaC8oMS10aGlzLmVzKSxwPXRoaXMuYSpkKHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsZik7Yj1rKm0qKDEtbipsKigxLzYtKDgtbCs4Km8pKm4vMTIwKSksYz1wLXRoaXMubWwwK2sqZy9oKm4qKC41Kyg1LWwrNipvKSpuLzI0KX1yZXR1cm4gYS54PWIrdGhpcy54MCxhLnk9Yyt0aGlzLnkwLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXthLngtPXRoaXMueDAsYS55LT10aGlzLnkwO3ZhciBiLGMsZD1hLngvdGhpcy5hLGU9YS55L3RoaXMuYTtpZih0aGlzLnNwaGVyZSl7dmFyIGY9ZSt0aGlzLmxhdDA7Yj1NYXRoLmFzaW4oTWF0aC5zaW4oZikqTWF0aC5jb3MoZCkpLGM9TWF0aC5hdGFuMihNYXRoLnRhbihkKSxNYXRoLmNvcyhmKSl9ZWxzZXt2YXIgZz10aGlzLm1sMC90aGlzLmErZSxoPWwoZyx0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKTtpZihNYXRoLmFicyhNYXRoLmFicyhoKS1tKTw9bilyZXR1cm4gYS54PXRoaXMubG9uZzAsYS55PW0sMD5lJiYoYS55Kj0tMSksYTt2YXIgbz1pKHRoaXMuYSx0aGlzLmUsTWF0aC5zaW4oaCkpLHA9bypvKm8vdGhpcy5hL3RoaXMuYSooMS10aGlzLmVzKSxxPU1hdGgucG93KE1hdGgudGFuKGgpLDIpLHI9ZCp0aGlzLmEvbyxzPXIqcjtiPWgtbypNYXRoLnRhbihoKS9wKnIqciooLjUtKDErMypxKSpyKnIvMjQpLGM9ciooMS1zKihxLzMrKDErMypxKSpxKnMvMTUpKS9NYXRoLmNvcyhoKX1yZXR1cm4gYS54PWooYyt0aGlzLmxvbmcwKSxhLnk9ayhiKSxhfSxjLm5hbWVzPVsiQ2Fzc2luaSIsIkNhc3NpbmlfU29sZG5lciIsImNhc3MiXX0seyIuLi9jb21tb24vYWRqdXN0X2xhdCI6NCwiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9lMGZuIjo3LCIuLi9jb21tb24vZTFmbiI6OCwiLi4vY29tbW9uL2UyZm4iOjksIi4uL2NvbW1vbi9lM2ZuIjoxMCwiLi4vY29tbW9uL2dOIjoxMSwiLi4vY29tbW9uL2ltbGZuIjoxMiwiLi4vY29tbW9uL21sZm4iOjE0fV0sNDM6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGU9YSgiLi4vY29tbW9uL3FzZm56IiksZj1hKCIuLi9jb21tb24vbXNmbnoiKSxnPWEoIi4uL2NvbW1vbi9pcXNmbnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnNwaGVyZXx8KHRoaXMuazA9Zih0aGlzLmUsTWF0aC5zaW4odGhpcy5sYXRfdHMpLE1hdGguY29zKHRoaXMubGF0X3RzKSkpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxmPWEueCxnPWEueSxoPWQoZi10aGlzLmxvbmcwKTtpZih0aGlzLnNwaGVyZSliPXRoaXMueDArdGhpcy5hKmgqTWF0aC5jb3ModGhpcy5sYXRfdHMpLGM9dGhpcy55MCt0aGlzLmEqTWF0aC5zaW4oZykvTWF0aC5jb3ModGhpcy5sYXRfdHMpO2Vsc2V7dmFyIGk9ZSh0aGlzLmUsTWF0aC5zaW4oZykpO2I9dGhpcy54MCt0aGlzLmEqdGhpcy5rMCpoLGM9dGhpcy55MCt0aGlzLmEqaSouNS90aGlzLmswfXJldHVybiBhLng9YixhLnk9YyxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7YS54LT10aGlzLngwLGEueS09dGhpcy55MDt2YXIgYixjO3JldHVybiB0aGlzLnNwaGVyZT8oYj1kKHRoaXMubG9uZzArYS54L3RoaXMuYS9NYXRoLmNvcyh0aGlzLmxhdF90cykpLGM9TWF0aC5hc2luKGEueS90aGlzLmEqTWF0aC5jb3ModGhpcy5sYXRfdHMpKSk6KGM9Zyh0aGlzLmUsMiphLnkqdGhpcy5rMC90aGlzLmEpLGI9ZCh0aGlzLmxvbmcwK2EueC8odGhpcy5hKnRoaXMuazApKSksYS54PWIsYS55PWMsYX0sYy5uYW1lcz1bImNlYSJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vaXFzZm56IjoxMywiLi4vY29tbW9uL21zZm56IjoxNSwiLi4vY29tbW9uL3FzZm56IjoyMH1dLDQ0OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKSxlPWEoIi4uL2NvbW1vbi9hZGp1c3RfbGF0Iik7Yy5pbml0PWZ1bmN0aW9uKCl7dGhpcy54MD10aGlzLngwfHwwLHRoaXMueTA9dGhpcy55MHx8MCx0aGlzLmxhdDA9dGhpcy5sYXQwfHwwLHRoaXMubG9uZzA9dGhpcy5sb25nMHx8MCx0aGlzLmxhdF90cz10aGlzLmxhdF90c3x8MCx0aGlzLnRpdGxlPXRoaXMudGl0bGV8fCJFcXVpZGlzdGFudCBDeWxpbmRyaWNhbCAoUGxhdGUgQ2FycmUpIix0aGlzLnJjPU1hdGguY29zKHRoaXMubGF0X3RzKX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiPWEueCxjPWEueSxmPWQoYi10aGlzLmxvbmcwKSxnPWUoYy10aGlzLmxhdDApO3JldHVybiBhLng9dGhpcy54MCt0aGlzLmEqZip0aGlzLnJjLGEueT10aGlzLnkwK3RoaXMuYSpnLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYj1hLngsYz1hLnk7cmV0dXJuIGEueD1kKHRoaXMubG9uZzArKGItdGhpcy54MCkvKHRoaXMuYSp0aGlzLnJjKSksYS55PWUodGhpcy5sYXQwKyhjLXRoaXMueTApL3RoaXMuYSksYX0sYy5uYW1lcz1bIkVxdWlyZWN0YW5ndWxhciIsIkVxdWlkaXN0YW50X0N5bGluZHJpY2FsIiwiZXFjIl19LHsiLi4vY29tbW9uL2FkanVzdF9sYXQiOjQsIi4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1fV0sNDU6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vZTBmbiIpLGU9YSgiLi4vY29tbW9uL2UxZm4iKSxmPWEoIi4uL2NvbW1vbi9lMmZuIiksZz1hKCIuLi9jb21tb24vZTNmbiIpLGg9YSgiLi4vY29tbW9uL21zZm56IiksaT1hKCIuLi9jb21tb24vbWxmbiIpLGo9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKSxrPWEoIi4uL2NvbW1vbi9hZGp1c3RfbGF0IiksbD1hKCIuLi9jb21tb24vaW1sZm4iKSxtPTFlLTEwO2MuaW5pdD1mdW5jdGlvbigpe01hdGguYWJzKHRoaXMubGF0MSt0aGlzLmxhdDIpPG18fCh0aGlzLmxhdDI9dGhpcy5sYXQyfHx0aGlzLmxhdDEsdGhpcy50ZW1wPXRoaXMuYi90aGlzLmEsdGhpcy5lcz0xLU1hdGgucG93KHRoaXMudGVtcCwyKSx0aGlzLmU9TWF0aC5zcXJ0KHRoaXMuZXMpLHRoaXMuZTA9ZCh0aGlzLmVzKSx0aGlzLmUxPWUodGhpcy5lcyksdGhpcy5lMj1mKHRoaXMuZXMpLHRoaXMuZTM9Zyh0aGlzLmVzKSx0aGlzLnNpbnBoaT1NYXRoLnNpbih0aGlzLmxhdDEpLHRoaXMuY29zcGhpPU1hdGguY29zKHRoaXMubGF0MSksdGhpcy5tczE9aCh0aGlzLmUsdGhpcy5zaW5waGksdGhpcy5jb3NwaGkpLHRoaXMubWwxPWkodGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyx0aGlzLmxhdDEpLE1hdGguYWJzKHRoaXMubGF0MS10aGlzLmxhdDIpPG0/dGhpcy5ucz10aGlzLnNpbnBoaToodGhpcy5zaW5waGk9TWF0aC5zaW4odGhpcy5sYXQyKSx0aGlzLmNvc3BoaT1NYXRoLmNvcyh0aGlzLmxhdDIpLHRoaXMubXMyPWgodGhpcy5lLHRoaXMuc2lucGhpLHRoaXMuY29zcGhpKSx0aGlzLm1sMj1pKHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsdGhpcy5sYXQyKSx0aGlzLm5zPSh0aGlzLm1zMS10aGlzLm1zMikvKHRoaXMubWwyLXRoaXMubWwxKSksdGhpcy5nPXRoaXMubWwxK3RoaXMubXMxL3RoaXMubnMsdGhpcy5tbDA9aSh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLHRoaXMubGF0MCksdGhpcy5yaD10aGlzLmEqKHRoaXMuZy10aGlzLm1sMCkpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1hLngsZD1hLnk7aWYodGhpcy5zcGhlcmUpYj10aGlzLmEqKHRoaXMuZy1kKTtlbHNle3ZhciBlPWkodGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyxkKTtiPXRoaXMuYSoodGhpcy5nLWUpfXZhciBmPXRoaXMubnMqaihjLXRoaXMubG9uZzApLGc9dGhpcy54MCtiKk1hdGguc2luKGYpLGg9dGhpcy55MCt0aGlzLnJoLWIqTWF0aC5jb3MoZik7cmV0dXJuIGEueD1nLGEueT1oLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXthLngtPXRoaXMueDAsYS55PXRoaXMucmgtYS55K3RoaXMueTA7dmFyIGIsYyxkLGU7dGhpcy5ucz49MD8oYz1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSwKYj0xKTooYz0tTWF0aC5zcXJ0KGEueCphLngrYS55KmEueSksYj0tMSk7dmFyIGY9MDtpZigwIT09YyYmKGY9TWF0aC5hdGFuMihiKmEueCxiKmEueSkpLHRoaXMuc3BoZXJlKXJldHVybiBlPWoodGhpcy5sb25nMCtmL3RoaXMubnMpLGQ9ayh0aGlzLmctYy90aGlzLmEpLGEueD1lLGEueT1kLGE7dmFyIGc9dGhpcy5nLWMvdGhpcy5hO3JldHVybiBkPWwoZyx0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKSxlPWoodGhpcy5sb25nMCtmL3RoaXMubnMpLGEueD1lLGEueT1kLGF9LGMubmFtZXM9WyJFcXVpZGlzdGFudF9Db25pYyIsImVxZGMiXX0seyIuLi9jb21tb24vYWRqdXN0X2xhdCI6NCwiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9lMGZuIjo3LCIuLi9jb21tb24vZTFmbiI6OCwiLi4vY29tbW9uL2UyZm4iOjksIi4uL2NvbW1vbi9lM2ZuIjoxMCwiLi4vY29tbW9uL2ltbGZuIjoxMiwiLi4vY29tbW9uL21sZm4iOjE0LCIuLi9jb21tb24vbXNmbnoiOjE1fV0sNDY6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLlBJLzQsZT1hKCIuLi9jb21tb24vc3JhdCIpLGY9TWF0aC5QSS8yLGc9MjA7Yy5pbml0PWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5zaW4odGhpcy5sYXQwKSxiPU1hdGguY29zKHRoaXMubGF0MCk7Yio9Yix0aGlzLnJjPU1hdGguc3FydCgxLXRoaXMuZXMpLygxLXRoaXMuZXMqYSphKSx0aGlzLkM9TWF0aC5zcXJ0KDErdGhpcy5lcypiKmIvKDEtdGhpcy5lcykpLHRoaXMucGhpYzA9TWF0aC5hc2luKGEvdGhpcy5DKSx0aGlzLnJhdGV4cD0uNSp0aGlzLkMqdGhpcy5lLHRoaXMuSz1NYXRoLnRhbiguNSp0aGlzLnBoaWMwK2QpLyhNYXRoLnBvdyhNYXRoLnRhbiguNSp0aGlzLmxhdDArZCksdGhpcy5DKSplKHRoaXMuZSphLHRoaXMucmF0ZXhwKSl9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLngsYz1hLnk7cmV0dXJuIGEueT0yKk1hdGguYXRhbih0aGlzLksqTWF0aC5wb3coTWF0aC50YW4oLjUqYytkKSx0aGlzLkMpKmUodGhpcy5lKk1hdGguc2luKGMpLHRoaXMucmF0ZXhwKSktZixhLng9dGhpcy5DKmIsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0xZS0xNCxjPWEueC90aGlzLkMsaD1hLnksaT1NYXRoLnBvdyhNYXRoLnRhbiguNSpoK2QpL3RoaXMuSywxL3RoaXMuQyksaj1nO2o+MCYmKGg9MipNYXRoLmF0YW4oaSplKHRoaXMuZSpNYXRoLnNpbihhLnkpLC0uNSp0aGlzLmUpKS1mLCEoTWF0aC5hYnMoaC1hLnkpPGIpKTstLWopYS55PWg7cmV0dXJuIGo/KGEueD1jLGEueT1oLGEpOm51bGx9LGMubmFtZXM9WyJnYXVzcyJdfSx7Ii4uL2NvbW1vbi9zcmF0IjoyMn1dLDQ3OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKSxlPTFlLTEwLGY9YSgiLi4vY29tbW9uL2FzaW56Iik7Yy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5zaW5fcDE0PU1hdGguc2luKHRoaXMubGF0MCksdGhpcy5jb3NfcDE0PU1hdGguY29zKHRoaXMubGF0MCksdGhpcy5pbmZpbml0eV9kaXN0PTFlMyp0aGlzLmEsdGhpcy5yYz0xfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxmLGcsaCxpLGosayxsPWEueCxtPWEueTtyZXR1cm4gZj1kKGwtdGhpcy5sb25nMCksYj1NYXRoLnNpbihtKSxjPU1hdGguY29zKG0pLGc9TWF0aC5jb3MoZiksaT10aGlzLnNpbl9wMTQqYit0aGlzLmNvc19wMTQqYypnLGg9MSxpPjB8fE1hdGguYWJzKGkpPD1lPyhqPXRoaXMueDArdGhpcy5hKmgqYypNYXRoLnNpbihmKS9pLGs9dGhpcy55MCt0aGlzLmEqaCoodGhpcy5jb3NfcDE0KmItdGhpcy5zaW5fcDE0KmMqZykvaSk6KGo9dGhpcy54MCt0aGlzLmluZmluaXR5X2Rpc3QqYypNYXRoLnNpbihmKSxrPXRoaXMueTArdGhpcy5pbmZpbml0eV9kaXN0Kih0aGlzLmNvc19wMTQqYi10aGlzLnNpbl9wMTQqYypnKSksYS54PWosYS55PWssYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZSxnLGgsaTtyZXR1cm4gYS54PShhLngtdGhpcy54MCkvdGhpcy5hLGEueT0oYS55LXRoaXMueTApL3RoaXMuYSxhLngvPXRoaXMuazAsYS55Lz10aGlzLmswLChiPU1hdGguc3FydChhLngqYS54K2EueSphLnkpKT8oZz1NYXRoLmF0YW4yKGIsdGhpcy5yYyksYz1NYXRoLnNpbihnKSxlPU1hdGguY29zKGcpLGk9ZihlKnRoaXMuc2luX3AxNCthLnkqYyp0aGlzLmNvc19wMTQvYiksaD1NYXRoLmF0YW4yKGEueCpjLGIqdGhpcy5jb3NfcDE0KmUtYS55KnRoaXMuc2luX3AxNCpjKSxoPWQodGhpcy5sb25nMCtoKSk6KGk9dGhpcy5waGljMCxoPTApLGEueD1oLGEueT1pLGF9LGMubmFtZXM9WyJnbm9tIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9hc2lueiI6Nn1dLDQ4OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKTtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmE9NjM3NzM5Ny4xNTUsdGhpcy5lcz0uMDA2Njc0MzcyMjMwNjE0LHRoaXMuZT1NYXRoLnNxcnQodGhpcy5lcyksdGhpcy5sYXQwfHwodGhpcy5sYXQwPS44NjM5Mzc5Nzk3MzcxOTMpLHRoaXMubG9uZzB8fCh0aGlzLmxvbmcwPS40MzM0MjM0MzA5MTE5MjUxKSx0aGlzLmswfHwodGhpcy5rMD0uOTk5OSksdGhpcy5zNDU9Ljc4NTM5ODE2MzM5NzQ0OCx0aGlzLnM5MD0yKnRoaXMuczQ1LHRoaXMuZmkwPXRoaXMubGF0MCx0aGlzLmUyPXRoaXMuZXMsdGhpcy5lPU1hdGguc3FydCh0aGlzLmUyKSx0aGlzLmFsZmE9TWF0aC5zcXJ0KDErdGhpcy5lMipNYXRoLnBvdyhNYXRoLmNvcyh0aGlzLmZpMCksNCkvKDEtdGhpcy5lMikpLHRoaXMudXE9MS4wNDIxNjg1NjM4MDQ3NCx0aGlzLnUwPU1hdGguYXNpbihNYXRoLnNpbih0aGlzLmZpMCkvdGhpcy5hbGZhKSx0aGlzLmc9TWF0aC5wb3coKDErdGhpcy5lKk1hdGguc2luKHRoaXMuZmkwKSkvKDEtdGhpcy5lKk1hdGguc2luKHRoaXMuZmkwKSksdGhpcy5hbGZhKnRoaXMuZS8yKSx0aGlzLms9TWF0aC50YW4odGhpcy51MC8yK3RoaXMuczQ1KS9NYXRoLnBvdyhNYXRoLnRhbih0aGlzLmZpMC8yK3RoaXMuczQ1KSx0aGlzLmFsZmEpKnRoaXMuZyx0aGlzLmsxPXRoaXMuazAsdGhpcy5uMD10aGlzLmEqTWF0aC5zcXJ0KDEtdGhpcy5lMikvKDEtdGhpcy5lMipNYXRoLnBvdyhNYXRoLnNpbih0aGlzLmZpMCksMikpLHRoaXMuczA9MS4zNzAwODM0NjI4MTU1NSx0aGlzLm49TWF0aC5zaW4odGhpcy5zMCksdGhpcy5ybzA9dGhpcy5rMSp0aGlzLm4wL01hdGgudGFuKHRoaXMuczApLHRoaXMuYWQ9dGhpcy5zOTAtdGhpcy51cX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZSxmLGcsaCxpLGo9YS54LGs9YS55LGw9ZChqLXRoaXMubG9uZzApO3JldHVybiBiPU1hdGgucG93KCgxK3RoaXMuZSpNYXRoLnNpbihrKSkvKDEtdGhpcy5lKk1hdGguc2luKGspKSx0aGlzLmFsZmEqdGhpcy5lLzIpLGM9MiooTWF0aC5hdGFuKHRoaXMuaypNYXRoLnBvdyhNYXRoLnRhbihrLzIrdGhpcy5zNDUpLHRoaXMuYWxmYSkvYiktdGhpcy5zNDUpLGU9LWwqdGhpcy5hbGZhLGY9TWF0aC5hc2luKE1hdGguY29zKHRoaXMuYWQpKk1hdGguc2luKGMpK01hdGguc2luKHRoaXMuYWQpKk1hdGguY29zKGMpKk1hdGguY29zKGUpKSxnPU1hdGguYXNpbihNYXRoLmNvcyhjKSpNYXRoLnNpbihlKS9NYXRoLmNvcyhmKSksaD10aGlzLm4qZyxpPXRoaXMucm8wKk1hdGgucG93KE1hdGgudGFuKHRoaXMuczAvMit0aGlzLnM0NSksdGhpcy5uKS9NYXRoLnBvdyhNYXRoLnRhbihmLzIrdGhpcy5zNDUpLHRoaXMubiksYS55PWkqTWF0aC5jb3MoaCkvMSxhLng9aSpNYXRoLnNpbihoKS8xLHRoaXMuY3plY2h8fChhLnkqPS0xLGEueCo9LTEpLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGo9YS54O2EueD1hLnksYS55PWosdGhpcy5jemVjaHx8KGEueSo9LTEsYS54Kj0tMSksZz1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSxmPU1hdGguYXRhbjIoYS55LGEueCksZT1mL01hdGguc2luKHRoaXMuczApLGQ9MiooTWF0aC5hdGFuKE1hdGgucG93KHRoaXMucm8wL2csMS90aGlzLm4pKk1hdGgudGFuKHRoaXMuczAvMit0aGlzLnM0NSkpLXRoaXMuczQ1KSxiPU1hdGguYXNpbihNYXRoLmNvcyh0aGlzLmFkKSpNYXRoLnNpbihkKS1NYXRoLnNpbih0aGlzLmFkKSpNYXRoLmNvcyhkKSpNYXRoLmNvcyhlKSksYz1NYXRoLmFzaW4oTWF0aC5jb3MoZCkqTWF0aC5zaW4oZSkvTWF0aC5jb3MoYikpLGEueD10aGlzLmxvbmcwLWMvdGhpcy5hbGZhLGg9YixpPTA7dmFyIGs9MDtkbyBhLnk9MiooTWF0aC5hdGFuKE1hdGgucG93KHRoaXMuaywtMS90aGlzLmFsZmEpKk1hdGgucG93KE1hdGgudGFuKGIvMit0aGlzLnM0NSksMS90aGlzLmFsZmEpKk1hdGgucG93KCgxK3RoaXMuZSpNYXRoLnNpbihoKSkvKDEtdGhpcy5lKk1hdGguc2luKGgpKSx0aGlzLmUvMikpLXRoaXMuczQ1KSxNYXRoLmFicyhoLWEueSk8MWUtMTAmJihpPTEpLGg9YS55LGsrPTE7d2hpbGUoMD09PWkmJjE1PmspO3JldHVybiBrPj0xNT9udWxsOmF9LGMubmFtZXM9WyJLcm92YWsiLCJrcm92YWsiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NX1dLDQ5OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TWF0aC5QSS8yLGU9TWF0aC5QSS80LGY9MWUtMTAsZz1hKCIuLi9jb21tb24vcXNmbnoiKSxoPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIik7Yy5TX1BPTEU9MSxjLk5fUE9MRT0yLGMuRVFVSVQ9MyxjLk9CTElRPTQsYy5pbml0PWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5hYnModGhpcy5sYXQwKTtpZihNYXRoLmFicyhhLWQpPGY/dGhpcy5tb2RlPXRoaXMubGF0MDwwP3RoaXMuU19QT0xFOnRoaXMuTl9QT0xFOk1hdGguYWJzKGEpPGY/dGhpcy5tb2RlPXRoaXMuRVFVSVQ6dGhpcy5tb2RlPXRoaXMuT0JMSVEsdGhpcy5lcz4wKXt2YXIgYjtzd2l0Y2godGhpcy5xcD1nKHRoaXMuZSwxKSx0aGlzLm1tZj0uNS8oMS10aGlzLmVzKSx0aGlzLmFwYT10aGlzLmF1dGhzZXQodGhpcy5lcyksdGhpcy5tb2RlKXtjYXNlIHRoaXMuTl9QT0xFOnRoaXMuZGQ9MTticmVhaztjYXNlIHRoaXMuU19QT0xFOnRoaXMuZGQ9MTticmVhaztjYXNlIHRoaXMuRVFVSVQ6dGhpcy5ycT1NYXRoLnNxcnQoLjUqdGhpcy5xcCksdGhpcy5kZD0xL3RoaXMucnEsdGhpcy54bWY9MSx0aGlzLnltZj0uNSp0aGlzLnFwO2JyZWFrO2Nhc2UgdGhpcy5PQkxJUTp0aGlzLnJxPU1hdGguc3FydCguNSp0aGlzLnFwKSxiPU1hdGguc2luKHRoaXMubGF0MCksdGhpcy5zaW5iMT1nKHRoaXMuZSxiKS90aGlzLnFwLHRoaXMuY29zYjE9TWF0aC5zcXJ0KDEtdGhpcy5zaW5iMSp0aGlzLnNpbmIxKSx0aGlzLmRkPU1hdGguY29zKHRoaXMubGF0MCkvKE1hdGguc3FydCgxLXRoaXMuZXMqYipiKSp0aGlzLnJxKnRoaXMuY29zYjEpLHRoaXMueW1mPSh0aGlzLnhtZj10aGlzLnJxKS90aGlzLmRkLHRoaXMueG1mKj10aGlzLmRkfX1lbHNlIHRoaXMubW9kZT09PXRoaXMuT0JMSVEmJih0aGlzLnNpbnBoMD1NYXRoLnNpbih0aGlzLmxhdDApLHRoaXMuY29zcGgwPU1hdGguY29zKHRoaXMubGF0MCkpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxpLGosayxsLG0sbixvLHAscT1hLngscj1hLnk7aWYocT1oKHEtdGhpcy5sb25nMCksdGhpcy5zcGhlcmUpe2lmKGs9TWF0aC5zaW4ocikscD1NYXRoLmNvcyhyKSxpPU1hdGguY29zKHEpLHRoaXMubW9kZT09PXRoaXMuT0JMSVF8fHRoaXMubW9kZT09PXRoaXMuRVFVSVQpe2lmKGM9dGhpcy5tb2RlPT09dGhpcy5FUVVJVD8xK3AqaToxK3RoaXMuc2lucGgwKmsrdGhpcy5jb3NwaDAqcCppLGY+PWMpcmV0dXJuIG51bGw7Yz1NYXRoLnNxcnQoMi9jKSxiPWMqcCpNYXRoLnNpbihxKSxjKj10aGlzLm1vZGU9PT10aGlzLkVRVUlUP2s6dGhpcy5jb3NwaDAqay10aGlzLnNpbnBoMCpwKml9ZWxzZSBpZih0aGlzLm1vZGU9PT10aGlzLk5fUE9MRXx8dGhpcy5tb2RlPT09dGhpcy5TX1BPTEUpe2lmKHRoaXMubW9kZT09PXRoaXMuTl9QT0xFJiYoaT0taSksTWF0aC5hYnMocit0aGlzLnBoaTApPGYpcmV0dXJuIG51bGw7Yz1lLS41KnIsYz0yKih0aGlzLm1vZGU9PT10aGlzLlNfUE9MRT9NYXRoLmNvcyhjKTpNYXRoLnNpbihjKSksYj1jKk1hdGguc2luKHEpLGMqPWl9fWVsc2V7c3dpdGNoKG09MCxuPTAsbz0wLGk9TWF0aC5jb3MocSksaj1NYXRoLnNpbihxKSxrPU1hdGguc2luKHIpLGw9Zyh0aGlzLmUsayksdGhpcy5tb2RlIT09dGhpcy5PQkxJUSYmdGhpcy5tb2RlIT09dGhpcy5FUVVJVHx8KG09bC90aGlzLnFwLG49TWF0aC5zcXJ0KDEtbSptKSksdGhpcy5tb2RlKXtjYXNlIHRoaXMuT0JMSVE6bz0xK3RoaXMuc2luYjEqbSt0aGlzLmNvc2IxKm4qaTticmVhaztjYXNlIHRoaXMuRVFVSVQ6bz0xK24qaTticmVhaztjYXNlIHRoaXMuTl9QT0xFOm89ZCtyLGw9dGhpcy5xcC1sO2JyZWFrO2Nhc2UgdGhpcy5TX1BPTEU6bz1yLWQsbD10aGlzLnFwK2x9aWYoTWF0aC5hYnMobyk8ZilyZXR1cm4gbnVsbDtzd2l0Y2godGhpcy5tb2RlKXtjYXNlIHRoaXMuT0JMSVE6Y2FzZSB0aGlzLkVRVUlUOm89TWF0aC5zcXJ0KDIvbyksYz10aGlzLm1vZGU9PT10aGlzLk9CTElRP3RoaXMueW1mKm8qKHRoaXMuY29zYjEqbS10aGlzLnNpbmIxKm4qaSk6KG89TWF0aC5zcXJ0KDIvKDErbippKSkpKm0qdGhpcy55bWYsYj10aGlzLnhtZipvKm4qajticmVhaztjYXNlIHRoaXMuTl9QT0xFOmNhc2UgdGhpcy5TX1BPTEU6bD49MD8oYj0obz1NYXRoLnNxcnQobCkpKmosYz1pKih0aGlzLm1vZGU9PT10aGlzLlNfUE9MRT9vOi1vKSk6Yj1jPTB9fXJldHVybiBhLng9dGhpcy5hKmIrdGhpcy54MCxhLnk9dGhpcy5hKmMrdGhpcy55MCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7YS54LT10aGlzLngwLGEueS09dGhpcy55MDt2YXIgYixjLGUsZyxpLGosayxsPWEueC90aGlzLmEsbT1hLnkvdGhpcy5hO2lmKHRoaXMuc3BoZXJlKXt2YXIgbixvPTAscD0wO2lmKG49TWF0aC5zcXJ0KGwqbCttKm0pLGM9LjUqbixjPjEpcmV0dXJuIG51bGw7c3dpdGNoKGM9MipNYXRoLmFzaW4oYyksdGhpcy5tb2RlIT09dGhpcy5PQkxJUSYmdGhpcy5tb2RlIT09dGhpcy5FUVVJVHx8KHA9TWF0aC5zaW4oYyksbz1NYXRoLmNvcyhjKSksdGhpcy5tb2RlKXtjYXNlIHRoaXMuRVFVSVQ6Yz1NYXRoLmFicyhuKTw9Zj8wOk1hdGguYXNpbihtKnAvbiksbCo9cCxtPW8qbjticmVhaztjYXNlIHRoaXMuT0JMSVE6Yz1NYXRoLmFicyhuKTw9Zj90aGlzLnBoaTA6TWF0aC5hc2luKG8qdGhpcy5zaW5waDArbSpwKnRoaXMuY29zcGgwL24pLGwqPXAqdGhpcy5jb3NwaDAsbT0oby1NYXRoLnNpbihjKSp0aGlzLnNpbnBoMCkqbjticmVhaztjYXNlIHRoaXMuTl9QT0xFOm09LW0sYz1kLWM7YnJlYWs7Y2FzZSB0aGlzLlNfUE9MRTpjLT1kfWI9MCE9PW18fHRoaXMubW9kZSE9PXRoaXMuRVFVSVQmJnRoaXMubW9kZSE9PXRoaXMuT0JMSVE/TWF0aC5hdGFuMihsLG0pOjB9ZWxzZXtpZihrPTAsdGhpcy5tb2RlPT09dGhpcy5PQkxJUXx8dGhpcy5tb2RlPT09dGhpcy5FUVVJVCl7aWYobC89dGhpcy5kZCxtKj10aGlzLmRkLGo9TWF0aC5zcXJ0KGwqbCttKm0pLGY+ailyZXR1cm4gYS54PTAsYS55PXRoaXMucGhpMCxhO2c9MipNYXRoLmFzaW4oLjUqai90aGlzLnJxKSxlPU1hdGguY29zKGcpLGwqPWc9TWF0aC5zaW4oZyksdGhpcy5tb2RlPT09dGhpcy5PQkxJUT8oaz1lKnRoaXMuc2luYjErbSpnKnRoaXMuY29zYjEvaixpPXRoaXMucXAqayxtPWoqdGhpcy5jb3NiMSplLW0qdGhpcy5zaW5iMSpnKTooaz1tKmcvaixpPXRoaXMucXAqayxtPWoqZSl9ZWxzZSBpZih0aGlzLm1vZGU9PT10aGlzLk5fUE9MRXx8dGhpcy5tb2RlPT09dGhpcy5TX1BPTEUpe2lmKHRoaXMubW9kZT09PXRoaXMuTl9QT0xFJiYobT0tbSksaT1sKmwrbSptLCFpKXJldHVybiBhLng9MCxhLnk9dGhpcy5waGkwLGE7az0xLWkvdGhpcy5xcCx0aGlzLm1vZGU9PT10aGlzLlNfUE9MRSYmKGs9LWspfWI9TWF0aC5hdGFuMihsLG0pLGM9dGhpcy5hdXRobGF0KE1hdGguYXNpbihrKSx0aGlzLmFwYSl9cmV0dXJuIGEueD1oKHRoaXMubG9uZzArYiksYS55PWMsYX0sYy5QMDA9LjMzMzMzMzMzMzMzMzMzMzMsYy5QMDE9LjE3MjIyMjIyMjIyMjIyMjIyLGMuUDAyPS4xMDI1NzkzNjUwNzkzNjUwOCxjLlAxMD0uMDYzODg4ODg4ODg4ODg4ODgsYy5QMTE9LjA2NjQwMjExNjQwMjExNjQsYy5QMjA9LjAxNjQxNTAxMjk0MjE5MTU0MyxjLmF1dGhzZXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtyZXR1cm4gY1swXT1hKnRoaXMuUDAwLGI9YSphLGNbMF0rPWIqdGhpcy5QMDEsY1sxXT1iKnRoaXMuUDEwLGIqPWEsY1swXSs9Yip0aGlzLlAwMixjWzFdKz1iKnRoaXMuUDExLGNbMl09Yip0aGlzLlAyMCxjfSxjLmF1dGhsYXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hK2E7cmV0dXJuIGErYlswXSpNYXRoLnNpbihjKStiWzFdKk1hdGguc2luKGMrYykrYlsyXSpNYXRoLnNpbihjK2MrYyl9LGMubmFtZXM9WyJMYW1iZXJ0IEF6aW11dGhhbCBFcXVhbCBBcmVhIiwiTGFtYmVydF9BemltdXRoYWxfRXF1YWxfQXJlYSIsImxhZWEiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL3FzZm56IjoyMH1dLDUwOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MWUtMTAsZT1hKCIuLi9jb21tb24vbXNmbnoiKSxmPWEoIi4uL2NvbW1vbi90c2ZueiIpLGc9TWF0aC5QSS8yLGg9YSgiLi4vY29tbW9uL3NpZ24iKSxpPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksaj1hKCIuLi9jb21tb24vcGhpMnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLmxhdDJ8fCh0aGlzLmxhdDI9dGhpcy5sYXQxKSx0aGlzLmswfHwodGhpcy5rMD0xKSx0aGlzLngwPXRoaXMueDB8fDAsdGhpcy55MD10aGlzLnkwfHwwLCEoTWF0aC5hYnModGhpcy5sYXQxK3RoaXMubGF0Mik8ZCkpe3ZhciBhPXRoaXMuYi90aGlzLmE7dGhpcy5lPU1hdGguc3FydCgxLWEqYSk7dmFyIGI9TWF0aC5zaW4odGhpcy5sYXQxKSxjPU1hdGguY29zKHRoaXMubGF0MSksZz1lKHRoaXMuZSxiLGMpLGg9Zih0aGlzLmUsdGhpcy5sYXQxLGIpLGk9TWF0aC5zaW4odGhpcy5sYXQyKSxqPU1hdGguY29zKHRoaXMubGF0Miksaz1lKHRoaXMuZSxpLGopLGw9Zih0aGlzLmUsdGhpcy5sYXQyLGkpLG09Zih0aGlzLmUsdGhpcy5sYXQwLE1hdGguc2luKHRoaXMubGF0MCkpO01hdGguYWJzKHRoaXMubGF0MS10aGlzLmxhdDIpPmQ/dGhpcy5ucz1NYXRoLmxvZyhnL2spL01hdGgubG9nKGgvbCk6dGhpcy5ucz1iLGlzTmFOKHRoaXMubnMpJiYodGhpcy5ucz1iKSx0aGlzLmYwPWcvKHRoaXMubnMqTWF0aC5wb3coaCx0aGlzLm5zKSksdGhpcy5yaD10aGlzLmEqdGhpcy5mMCpNYXRoLnBvdyhtLHRoaXMubnMpLHRoaXMudGl0bGV8fCh0aGlzLnRpdGxlPSJMYW1iZXJ0IENvbmZvcm1hbCBDb25pYyIpfX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiPWEueCxjPWEueTtNYXRoLmFicygyKk1hdGguYWJzKGMpLU1hdGguUEkpPD1kJiYoYz1oKGMpKihnLTIqZCkpO3ZhciBlLGosaz1NYXRoLmFicyhNYXRoLmFicyhjKS1nKTtpZihrPmQpZT1mKHRoaXMuZSxjLE1hdGguc2luKGMpKSxqPXRoaXMuYSp0aGlzLmYwKk1hdGgucG93KGUsdGhpcy5ucyk7ZWxzZXtpZihrPWMqdGhpcy5ucywwPj1rKXJldHVybiBudWxsO2o9MH12YXIgbD10aGlzLm5zKmkoYi10aGlzLmxvbmcwKTtyZXR1cm4gYS54PXRoaXMuazAqKGoqTWF0aC5zaW4obCkpK3RoaXMueDAsYS55PXRoaXMuazAqKHRoaXMucmgtaipNYXRoLmNvcyhsKSkrdGhpcy55MCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixoPShhLngtdGhpcy54MCkvdGhpcy5rMCxrPXRoaXMucmgtKGEueS10aGlzLnkwKS90aGlzLmswO3RoaXMubnM+MD8oYj1NYXRoLnNxcnQoaCpoK2sqayksYz0xKTooYj0tTWF0aC5zcXJ0KGgqaCtrKmspLGM9LTEpO3ZhciBsPTA7aWYoMCE9PWImJihsPU1hdGguYXRhbjIoYypoLGMqaykpLDAhPT1ifHx0aGlzLm5zPjApe2lmKGM9MS90aGlzLm5zLGQ9TWF0aC5wb3coYi8odGhpcy5hKnRoaXMuZjApLGMpLGU9aih0aGlzLmUsZCksLTk5OTk9PT1lKXJldHVybiBudWxsfWVsc2UgZT0tZztyZXR1cm4gZj1pKGwvdGhpcy5ucyt0aGlzLmxvbmcwKSxhLng9ZixhLnk9ZSxhfSxjLm5hbWVzPVsiTGFtYmVydCBUYW5nZW50aWFsIENvbmZvcm1hbCBDb25pYyBQcm9qZWN0aW9uIiwiTGFtYmVydF9Db25mb3JtYWxfQ29uaWMiLCJMYW1iZXJ0X0NvbmZvcm1hbF9Db25pY18yU1AiLCJsY2MiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL21zZm56IjoxNSwiLi4vY29tbW9uL3BoaTJ6IjoxNiwiLi4vY29tbW9uL3NpZ24iOjIxLCIuLi9jb21tb24vdHNmbnoiOjI0fV0sNTE6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhfWMuaW5pdD1mdW5jdGlvbigpe30sYy5mb3J3YXJkPWQsYy5pbnZlcnNlPWQsYy5uYW1lcz1bImxvbmdsYXQiLCJpZGVudGl0eSJdfSx7fV0sNTI6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vbXNmbnoiKSxlPU1hdGguUEkvMixmPTFlLTEwLGc9NTcuMjk1Nzc5NTEzMDgyMzIsaD1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGk9TWF0aC5QSS80LGo9YSgiLi4vY29tbW9uL3RzZm56Iiksaz1hKCIuLi9jb21tb24vcGhpMnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmIvdGhpcy5hO3RoaXMuZXM9MS1hKmEsIngwImluIHRoaXN8fCh0aGlzLngwPTApLCJ5MCJpbiB0aGlzfHwodGhpcy55MD0wKSx0aGlzLmU9TWF0aC5zcXJ0KHRoaXMuZXMpLHRoaXMubGF0X3RzP3RoaXMuc3BoZXJlP3RoaXMuazA9TWF0aC5jb3ModGhpcy5sYXRfdHMpOnRoaXMuazA9ZCh0aGlzLmUsTWF0aC5zaW4odGhpcy5sYXRfdHMpLE1hdGguY29zKHRoaXMubGF0X3RzKSk6dGhpcy5rMHx8KHRoaXMuaz90aGlzLmswPXRoaXMuazp0aGlzLmswPTEpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS54LGM9YS55O2lmKGMqZz45MCYmLTkwPmMqZyYmYipnPjE4MCYmLTE4MD5iKmcpcmV0dXJuIG51bGw7dmFyIGQsaztpZihNYXRoLmFicyhNYXRoLmFicyhjKS1lKTw9ZilyZXR1cm4gbnVsbDtpZih0aGlzLnNwaGVyZSlkPXRoaXMueDArdGhpcy5hKnRoaXMuazAqaChiLXRoaXMubG9uZzApLGs9dGhpcy55MCt0aGlzLmEqdGhpcy5rMCpNYXRoLmxvZyhNYXRoLnRhbihpKy41KmMpKTtlbHNle3ZhciBsPU1hdGguc2luKGMpLG09aih0aGlzLmUsYyxsKTtkPXRoaXMueDArdGhpcy5hKnRoaXMuazAqaChiLXRoaXMubG9uZzApLGs9dGhpcy55MC10aGlzLmEqdGhpcy5rMCpNYXRoLmxvZyhtKX1yZXR1cm4gYS54PWQsYS55PWssYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1hLngtdGhpcy54MCxmPWEueS10aGlzLnkwO2lmKHRoaXMuc3BoZXJlKWM9ZS0yKk1hdGguYXRhbihNYXRoLmV4cCgtZi8odGhpcy5hKnRoaXMuazApKSk7ZWxzZXt2YXIgZz1NYXRoLmV4cCgtZi8odGhpcy5hKnRoaXMuazApKTtpZihjPWsodGhpcy5lLGcpLC05OTk5PT09YylyZXR1cm4gbnVsbH1yZXR1cm4gYj1oKHRoaXMubG9uZzArZC8odGhpcy5hKnRoaXMuazApKSxhLng9YixhLnk9YyxhfSxjLm5hbWVzPVsiTWVyY2F0b3IiLCJQb3B1bGFyIFZpc3VhbGlzYXRpb24gUHNldWRvIE1lcmNhdG9yIiwiTWVyY2F0b3JfMVNQIiwiTWVyY2F0b3JfQXV4aWxpYXJ5X1NwaGVyZSIsIm1lcmMiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL21zZm56IjoxNSwiLi4vY29tbW9uL3BoaTJ6IjoxNiwiLi4vY29tbW9uL3RzZm56IjoyNH1dLDUzOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKTtjLmluaXQ9ZnVuY3Rpb24oKXt9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLngsYz1hLnksZT1kKGItdGhpcy5sb25nMCksZj10aGlzLngwK3RoaXMuYSplLGc9dGhpcy55MCt0aGlzLmEqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K2MvMi41KSkqMS4yNTtyZXR1cm4gYS54PWYsYS55PWcsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe2EueC09dGhpcy54MCxhLnktPXRoaXMueTA7dmFyIGI9ZCh0aGlzLmxvbmcwK2EueC90aGlzLmEpLGM9Mi41KihNYXRoLmF0YW4oTWF0aC5leHAoLjgqYS55L3RoaXMuYSkpLU1hdGguUEkvNCk7cmV0dXJuIGEueD1iLGEueT1jLGF9LGMubmFtZXM9WyJNaWxsZXJfQ3lsaW5kcmljYWwiLCJtaWxsIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjV9XSw1NDpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksZT0xZS0xMDtjLmluaXQ9ZnVuY3Rpb24oKXt9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXtmb3IodmFyIGI9YS54LGM9YS55LGY9ZChiLXRoaXMubG9uZzApLGc9YyxoPU1hdGguUEkqTWF0aC5zaW4oYyksaT0wOyEwO2krKyl7dmFyIGo9LShnK01hdGguc2luKGcpLWgpLygxK01hdGguY29zKGcpKTtpZihnKz1qLE1hdGguYWJzKGopPGUpYnJlYWt9Zy89MixNYXRoLlBJLzItTWF0aC5hYnMoYyk8ZSYmKGY9MCk7dmFyIGs9LjkwMDMxNjMxNjE1OCp0aGlzLmEqZipNYXRoLmNvcyhnKSt0aGlzLngwLGw9MS40MTQyMTM1NjIzNzMxKnRoaXMuYSpNYXRoLnNpbihnKSt0aGlzLnkwO3JldHVybiBhLng9ayxhLnk9bCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYzthLngtPXRoaXMueDAsYS55LT10aGlzLnkwLGM9YS55LygxLjQxNDIxMzU2MjM3MzEqdGhpcy5hKSxNYXRoLmFicyhjKT4uOTk5OTk5OTk5OTk5JiYoYz0uOTk5OTk5OTk5OTk5KSxiPU1hdGguYXNpbihjKTt2YXIgZT1kKHRoaXMubG9uZzArYS54LyguOTAwMzE2MzE2MTU4KnRoaXMuYSpNYXRoLmNvcyhiKSkpO2U8LU1hdGguUEkmJihlPS1NYXRoLlBJKSxlPk1hdGguUEkmJihlPU1hdGguUEkpLGM9KDIqYitNYXRoLnNpbigyKmIpKS9NYXRoLlBJLE1hdGguYWJzKGMpPjEmJihjPTEpO3ZhciBmPU1hdGguYXNpbihjKTtyZXR1cm4gYS54PWUsYS55PWYsYX0sYy5uYW1lcz1bIk1vbGx3ZWlkZSIsIm1vbGwiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NX1dLDU1OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9NDg0ODEzNjgxMTA5NTM2ZS0yMDtjLml0ZXJhdGlvbnM9MSxjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLkE9W10sdGhpcy5BWzFdPS42Mzk5MTc1MDczLHRoaXMuQVsyXT0tLjEzNTg3OTc2MTMsdGhpcy5BWzNdPS4wNjMyOTQ0MDksdGhpcy5BWzRdPS0uMDI1MjY4NTMsdGhpcy5BWzVdPS4wMTE3ODc5LHRoaXMuQVs2XT0tLjAwNTUxNjEsdGhpcy5BWzddPS4wMDI2OTA2LHRoaXMuQVs4XT0tLjAwMTMzMyx0aGlzLkFbOV09NjdlLTUsdGhpcy5BWzEwXT0tMzRlLTUsdGhpcy5CX3JlPVtdLHRoaXMuQl9pbT1bXSx0aGlzLkJfcmVbMV09Ljc1NTc4NTMyMjgsdGhpcy5CX2ltWzFdPTAsdGhpcy5CX3JlWzJdPS4yNDkyMDQ2NDYsdGhpcy5CX2ltWzJdPS4wMDMzNzE1MDcsdGhpcy5CX3JlWzNdPS0uMDAxNTQxNzM5LHRoaXMuQl9pbVszXT0uMDQxMDU4NTYsdGhpcy5CX3JlWzRdPS0uMTAxNjI5MDcsdGhpcy5CX2ltWzRdPS4wMTcyNzYwOSx0aGlzLkJfcmVbNV09LS4yNjYyMzQ4OSx0aGlzLkJfaW1bNV09LS4zNjI0OTIxOCx0aGlzLkJfcmVbNl09LS42ODcwOTgzLHRoaXMuQl9pbVs2XT0tMS4xNjUxOTY3LHRoaXMuQ19yZT1bXSx0aGlzLkNfaW09W10sdGhpcy5DX3JlWzFdPTEuMzIzMTI3MDQzOSx0aGlzLkNfaW1bMV09MCx0aGlzLkNfcmVbMl09LS41NzcyNDU3ODksdGhpcy5DX2ltWzJdPS0uMDA3ODA5NTk4LHRoaXMuQ19yZVszXT0uNTA4MzA3NTEzLHRoaXMuQ19pbVszXT0tLjExMjIwODk1Mix0aGlzLkNfcmVbNF09LS4xNTA5NDc2Mix0aGlzLkNfaW1bNF09LjE4MjAwNjAyLHRoaXMuQ19yZVs1XT0xLjAxNDE4MTc5LHRoaXMuQ19pbVs1XT0xLjY0NDk3Njk2LHRoaXMuQ19yZVs2XT0xLjk2NjA1NDksdGhpcy5DX2ltWzZdPTIuNTEyNzY0NSx0aGlzLkQ9W10sdGhpcy5EWzFdPTEuNTYyNzAxNDI0Myx0aGlzLkRbMl09LjUxODU0MDYzOTgsdGhpcy5EWzNdPS0uMDMzMzMwOTgsdGhpcy5EWzRdPS0uMTA1MjkwNix0aGlzLkRbNV09LS4wMzY4NTk0LHRoaXMuRFs2XT0uMDA3MzE3LHRoaXMuRFs3XT0uMDEyMix0aGlzLkRbOF09LjAwMzk0LHRoaXMuRFs5XT0tLjAwMTN9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjPWEueCxlPWEueSxmPWUtdGhpcy5sYXQwLGc9Yy10aGlzLmxvbmcwLGg9Zi9kKjFlLTUsaT1nLGo9MSxrPTA7Zm9yKGI9MTsxMD49YjtiKyspaio9aCxrKz10aGlzLkFbYl0qajt2YXIgbCxtLG49ayxvPWkscD0xLHE9MCxyPTAscz0wO2ZvcihiPTE7Nj49YjtiKyspbD1wKm4tcSpvLG09cSpuK3AqbyxwPWwscT1tLHI9cit0aGlzLkJfcmVbYl0qcC10aGlzLkJfaW1bYl0qcSxzPXMrdGhpcy5CX2ltW2JdKnArdGhpcy5CX3JlW2JdKnE7cmV0dXJuIGEueD1zKnRoaXMuYSt0aGlzLngwLGEueT1yKnRoaXMuYSt0aGlzLnkwLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYixjLGUsZj1hLngsZz1hLnksaD1mLXRoaXMueDAsaT1nLXRoaXMueTAsaj1pL3RoaXMuYSxrPWgvdGhpcy5hLGw9MSxtPTAsbj0wLG89MDtmb3IoYj0xOzY+PWI7YisrKWM9bCpqLW0qayxlPW0qaitsKmssbD1jLG09ZSxuPW4rdGhpcy5DX3JlW2JdKmwtdGhpcy5DX2ltW2JdKm0sbz1vK3RoaXMuQ19pbVtiXSpsK3RoaXMuQ19yZVtiXSptO2Zvcih2YXIgcD0wO3A8dGhpcy5pdGVyYXRpb25zO3ArKyl7dmFyIHEscixzPW4sdD1vLHU9aix2PWs7Zm9yKGI9Mjs2Pj1iO2IrKylxPXMqbi10Km8scj10Km4rcypvLHM9cSx0PXIsdSs9KGItMSkqKHRoaXMuQl9yZVtiXSpzLXRoaXMuQl9pbVtiXSp0KSx2Kz0oYi0xKSoodGhpcy5CX2ltW2JdKnMrdGhpcy5CX3JlW2JdKnQpO3M9MSx0PTA7dmFyIHc9dGhpcy5CX3JlWzFdLHg9dGhpcy5CX2ltWzFdO2ZvcihiPTI7Nj49YjtiKyspcT1zKm4tdCpvLHI9dCpuK3MqbyxzPXEsdD1yLHcrPWIqKHRoaXMuQl9yZVtiXSpzLXRoaXMuQl9pbVtiXSp0KSx4Kz1iKih0aGlzLkJfaW1bYl0qcyt0aGlzLkJfcmVbYl0qdCk7dmFyIHk9dyp3K3gqeDtuPSh1Kncrdip4KS95LG89KHYqdy11KngpL3l9dmFyIHo9bixBPW8sQj0xLEM9MDtmb3IoYj0xOzk+PWI7YisrKUIqPXosQys9dGhpcy5EW2JdKkI7dmFyIEQ9dGhpcy5sYXQwK0MqZCoxZTUsRT10aGlzLmxvbmcwK0E7cmV0dXJuIGEueD1FLGEueT1ELGF9LGMubmFtZXM9WyJOZXdfWmVhbGFuZF9NYXBfR3JpZCIsIm56bWciXX0se31dLDU2OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL3RzZm56IiksZT1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGY9YSgiLi4vY29tbW9uL3BoaTJ6IiksZz1NYXRoLlBJLzIsaD1NYXRoLlBJLzQsaT0xZS0xMDtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLm5vX29mZj10aGlzLm5vX29mZnx8ITEsdGhpcy5ub19yb3Q9dGhpcy5ub19yb3R8fCExLGlzTmFOKHRoaXMuazApJiYodGhpcy5rMD0xKTt2YXIgYT1NYXRoLnNpbih0aGlzLmxhdDApLGI9TWF0aC5jb3ModGhpcy5sYXQwKSxjPXRoaXMuZSphO3RoaXMuYmw9TWF0aC5zcXJ0KDErdGhpcy5lcy8oMS10aGlzLmVzKSpNYXRoLnBvdyhiLDQpKSx0aGlzLmFsPXRoaXMuYSp0aGlzLmJsKnRoaXMuazAqTWF0aC5zcXJ0KDEtdGhpcy5lcykvKDEtYypjKTt2YXIgZj1kKHRoaXMuZSx0aGlzLmxhdDAsYSksZz10aGlzLmJsL2IqTWF0aC5zcXJ0KCgxLXRoaXMuZXMpLygxLWMqYykpOzE+ZypnJiYoZz0xKTt2YXIgaCxpO2lmKGlzTmFOKHRoaXMubG9uZ2MpKXt2YXIgaj1kKHRoaXMuZSx0aGlzLmxhdDEsTWF0aC5zaW4odGhpcy5sYXQxKSksaz1kKHRoaXMuZSx0aGlzLmxhdDIsTWF0aC5zaW4odGhpcy5sYXQyKSk7dGhpcy5sYXQwPj0wP3RoaXMuZWw9KGcrTWF0aC5zcXJ0KGcqZy0xKSkqTWF0aC5wb3coZix0aGlzLmJsKTp0aGlzLmVsPShnLU1hdGguc3FydChnKmctMSkpKk1hdGgucG93KGYsdGhpcy5ibCk7dmFyIGw9TWF0aC5wb3coaix0aGlzLmJsKSxtPU1hdGgucG93KGssdGhpcy5ibCk7aD10aGlzLmVsL2wsaT0uNSooaC0xL2gpO3ZhciBuPSh0aGlzLmVsKnRoaXMuZWwtbSpsKS8odGhpcy5lbCp0aGlzLmVsK20qbCksbz0obS1sKS8obStsKSxwPWUodGhpcy5sb25nMS10aGlzLmxvbmcyKTt0aGlzLmxvbmcwPS41Kih0aGlzLmxvbmcxK3RoaXMubG9uZzIpLU1hdGguYXRhbihuKk1hdGgudGFuKC41KnRoaXMuYmwqcCkvbykvdGhpcy5ibCx0aGlzLmxvbmcwPWUodGhpcy5sb25nMCk7dmFyIHE9ZSh0aGlzLmxvbmcxLXRoaXMubG9uZzApO3RoaXMuZ2FtbWEwPU1hdGguYXRhbihNYXRoLnNpbih0aGlzLmJsKnEpL2kpLHRoaXMuYWxwaGE9TWF0aC5hc2luKGcqTWF0aC5zaW4odGhpcy5nYW1tYTApKX1lbHNlIGg9dGhpcy5sYXQwPj0wP2crTWF0aC5zcXJ0KGcqZy0xKTpnLU1hdGguc3FydChnKmctMSksdGhpcy5lbD1oKk1hdGgucG93KGYsdGhpcy5ibCksaT0uNSooaC0xL2gpLHRoaXMuZ2FtbWEwPU1hdGguYXNpbihNYXRoLnNpbih0aGlzLmFscGhhKS9nKSx0aGlzLmxvbmcwPXRoaXMubG9uZ2MtTWF0aC5hc2luKGkqTWF0aC50YW4odGhpcy5nYW1tYTApKS90aGlzLmJsO3RoaXMubm9fb2ZmP3RoaXMudWM9MDp0aGlzLmxhdDA+PTA/dGhpcy51Yz10aGlzLmFsL3RoaXMuYmwqTWF0aC5hdGFuMihNYXRoLnNxcnQoZypnLTEpLE1hdGguY29zKHRoaXMuYWxwaGEpKTp0aGlzLnVjPS0xKnRoaXMuYWwvdGhpcy5ibCpNYXRoLmF0YW4yKE1hdGguc3FydChnKmctMSksTWF0aC5jb3ModGhpcy5hbHBoYSkpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxmLGo9YS54LGs9YS55LGw9ZShqLXRoaXMubG9uZzApO2lmKE1hdGguYWJzKE1hdGguYWJzKGspLWcpPD1pKWY9az4wPy0xOjEsYz10aGlzLmFsL3RoaXMuYmwqTWF0aC5sb2coTWF0aC50YW4oaCtmKnRoaXMuZ2FtbWEwKi41KSksYj0tMSpmKmcqdGhpcy5hbC90aGlzLmJsO2Vsc2V7dmFyIG09ZCh0aGlzLmUsayxNYXRoLnNpbihrKSksbj10aGlzLmVsL01hdGgucG93KG0sdGhpcy5ibCksbz0uNSoobi0xL24pLHA9LjUqKG4rMS9uKSxxPU1hdGguc2luKHRoaXMuYmwqbCkscj0obypNYXRoLnNpbih0aGlzLmdhbW1hMCktcSpNYXRoLmNvcyh0aGlzLmdhbW1hMCkpL3A7Yz1NYXRoLmFicyhNYXRoLmFicyhyKS0xKTw9aT9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6LjUqdGhpcy5hbCpNYXRoLmxvZygoMS1yKS8oMStyKSkvdGhpcy5ibCxiPU1hdGguYWJzKE1hdGguY29zKHRoaXMuYmwqbCkpPD1pP3RoaXMuYWwqdGhpcy5ibCpsOnRoaXMuYWwqTWF0aC5hdGFuMihvKk1hdGguY29zKHRoaXMuZ2FtbWEwKStxKk1hdGguc2luKHRoaXMuZ2FtbWEwKSxNYXRoLmNvcyh0aGlzLmJsKmwpKS90aGlzLmJsfXJldHVybiB0aGlzLm5vX3JvdD8oYS54PXRoaXMueDArYixhLnk9dGhpcy55MCtjKTooYi09dGhpcy51YyxhLng9dGhpcy54MCtjKk1hdGguY29zKHRoaXMuYWxwaGEpK2IqTWF0aC5zaW4odGhpcy5hbHBoYSksYS55PXRoaXMueTArYipNYXRoLmNvcyh0aGlzLmFscGhhKS1jKk1hdGguc2luKHRoaXMuYWxwaGEpKSxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYzt0aGlzLm5vX3JvdD8oYz1hLnktdGhpcy55MCxiPWEueC10aGlzLngwKTooYz0oYS54LXRoaXMueDApKk1hdGguY29zKHRoaXMuYWxwaGEpLShhLnktdGhpcy55MCkqTWF0aC5zaW4odGhpcy5hbHBoYSksYj0oYS55LXRoaXMueTApKk1hdGguY29zKHRoaXMuYWxwaGEpKyhhLngtdGhpcy54MCkqTWF0aC5zaW4odGhpcy5hbHBoYSksYis9dGhpcy51Yyk7dmFyIGQ9TWF0aC5leHAoLTEqdGhpcy5ibCpjL3RoaXMuYWwpLGg9LjUqKGQtMS9kKSxqPS41KihkKzEvZCksaz1NYXRoLnNpbih0aGlzLmJsKmIvdGhpcy5hbCksbD0oaypNYXRoLmNvcyh0aGlzLmdhbW1hMCkraCpNYXRoLnNpbih0aGlzLmdhbW1hMCkpL2osbT1NYXRoLnBvdyh0aGlzLmVsL01hdGguc3FydCgoMStsKS8oMS1sKSksMS90aGlzLmJsKTtyZXR1cm4gTWF0aC5hYnMobC0xKTxpPyhhLng9dGhpcy5sb25nMCxhLnk9Zyk6TWF0aC5hYnMobCsxKTxpPyhhLng9dGhpcy5sb25nMCxhLnk9LTEqZyk6KGEueT1mKHRoaXMuZSxtKSxhLng9ZSh0aGlzLmxvbmcwLU1hdGguYXRhbjIoaCpNYXRoLmNvcyh0aGlzLmdhbW1hMCktaypNYXRoLnNpbih0aGlzLmdhbW1hMCksTWF0aC5jb3ModGhpcy5ibCpiL3RoaXMuYWwpKS90aGlzLmJsKSksYX0sYy5uYW1lcz1bIkhvdGluZV9PYmxpcXVlX01lcmNhdG9yIiwiSG90aW5lIE9ibGlxdWUgTWVyY2F0b3IiLCJIb3RpbmVfT2JsaXF1ZV9NZXJjYXRvcl9BemltdXRoX05hdHVyYWxfT3JpZ2luIiwiSG90aW5lX09ibGlxdWVfTWVyY2F0b3JfQXppbXV0aF9DZW50ZXIiLCJvbWVyYyJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vcGhpMnoiOjE2LCIuLi9jb21tb24vdHNmbnoiOjI0fV0sNTc6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGU9MWUtMTAsZj1hKCIuLi9jb21tb24vYXNpbnoiKSxnPU1hdGguUEkvMjtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnNpbl9wMTQ9TWF0aC5zaW4odGhpcy5sYXQwKSx0aGlzLmNvc19wMTQ9TWF0aC5jb3ModGhpcy5sYXQwKX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZixnLGgsaSxqLGssbD1hLngsbT1hLnk7cmV0dXJuIGY9ZChsLXRoaXMubG9uZzApLGI9TWF0aC5zaW4obSksYz1NYXRoLmNvcyhtKSxnPU1hdGguY29zKGYpLGk9dGhpcy5zaW5fcDE0KmIrdGhpcy5jb3NfcDE0KmMqZyxoPTEsKGk+MHx8TWF0aC5hYnMoaSk8PWUpJiYoaj10aGlzLmEqaCpjKk1hdGguc2luKGYpLGs9dGhpcy55MCt0aGlzLmEqaCoodGhpcy5jb3NfcDE0KmItdGhpcy5zaW5fcDE0KmMqZykpLGEueD1qLGEueT1rLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYixjLGgsaSxqLGssbDtyZXR1cm4gYS54LT10aGlzLngwLGEueS09dGhpcy55MCxiPU1hdGguc3FydChhLngqYS54K2EueSphLnkpLGM9ZihiL3RoaXMuYSksaD1NYXRoLnNpbihjKSxpPU1hdGguY29zKGMpLGs9dGhpcy5sb25nMCxNYXRoLmFicyhiKTw9ZT8obD10aGlzLmxhdDAsYS54PWssYS55PWwsYSk6KGw9ZihpKnRoaXMuc2luX3AxNCthLnkqaCp0aGlzLmNvc19wMTQvYiksaj1NYXRoLmFicyh0aGlzLmxhdDApLWcsTWF0aC5hYnMoaik8PWU/KGs9ZCh0aGlzLmxhdDA+PTA/dGhpcy5sb25nMCtNYXRoLmF0YW4yKGEueCwtYS55KTp0aGlzLmxvbmcwLU1hdGguYXRhbjIoLWEueCxhLnkpKSxhLng9ayxhLnk9bCxhKTooaz1kKHRoaXMubG9uZzArTWF0aC5hdGFuMihhLngqaCxiKnRoaXMuY29zX3AxNCppLWEueSp0aGlzLnNpbl9wMTQqaCkpLGEueD1rLGEueT1sLGEpKX0sYy5uYW1lcz1bIm9ydGhvIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9hc2lueiI6Nn1dLDU4OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2UwZm4iKSxlPWEoIi4uL2NvbW1vbi9lMWZuIiksZj1hKCIuLi9jb21tb24vZTJmbiIpLGc9YSgiLi4vY29tbW9uL2UzZm4iKSxoPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksaT1hKCIuLi9jb21tb24vYWRqdXN0X2xhdCIpLGo9YSgiLi4vY29tbW9uL21sZm4iKSxrPTFlLTEwLGw9YSgiLi4vY29tbW9uL2dOIiksbT0yMDtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnRlbXA9dGhpcy5iL3RoaXMuYSx0aGlzLmVzPTEtTWF0aC5wb3codGhpcy50ZW1wLDIpLHRoaXMuZT1NYXRoLnNxcnQodGhpcy5lcyksdGhpcy5lMD1kKHRoaXMuZXMpLHRoaXMuZTE9ZSh0aGlzLmVzKSx0aGlzLmUyPWYodGhpcy5lcyksdGhpcy5lMz1nKHRoaXMuZXMpLHRoaXMubWwwPXRoaXMuYSpqKHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsdGhpcy5sYXQwKX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPWEueCxmPWEueSxnPWgoZS10aGlzLmxvbmcwKTtpZihkPWcqTWF0aC5zaW4oZiksdGhpcy5zcGhlcmUpTWF0aC5hYnMoZik8PWs/KGI9dGhpcy5hKmcsYz0tMSp0aGlzLmEqdGhpcy5sYXQwKTooYj10aGlzLmEqTWF0aC5zaW4oZCkvTWF0aC50YW4oZiksYz10aGlzLmEqKGkoZi10aGlzLmxhdDApKygxLU1hdGguY29zKGQpKS9NYXRoLnRhbihmKSkpO2Vsc2UgaWYoTWF0aC5hYnMoZik8PWspYj10aGlzLmEqZyxjPS0xKnRoaXMubWwwO2Vsc2V7dmFyIG09bCh0aGlzLmEsdGhpcy5lLE1hdGguc2luKGYpKS9NYXRoLnRhbihmKTtiPW0qTWF0aC5zaW4oZCksYz10aGlzLmEqaih0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLGYpLXRoaXMubWwwK20qKDEtTWF0aC5jb3MoZCkpfXJldHVybiBhLng9Yit0aGlzLngwLGEueT1jK3RoaXMueTAsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxpLGwsbjtpZihkPWEueC10aGlzLngwLGU9YS55LXRoaXMueTAsdGhpcy5zcGhlcmUpaWYoTWF0aC5hYnMoZSt0aGlzLmEqdGhpcy5sYXQwKTw9ayliPWgoZC90aGlzLmErdGhpcy5sb25nMCksYz0wO2Vsc2V7Zz10aGlzLmxhdDArZS90aGlzLmEsaT1kKmQvdGhpcy5hL3RoaXMuYStnKmcsbD1nO3ZhciBvO2ZvcihmPW07ZjstLWYpaWYobz1NYXRoLnRhbihsKSxuPS0xKihnKihsKm8rMSktbC0uNSoobCpsK2kpKm8pLygobC1nKS9vLTEpLGwrPW4sTWF0aC5hYnMobik8PWspe2M9bDticmVha31iPWgodGhpcy5sb25nMCtNYXRoLmFzaW4oZCpNYXRoLnRhbihsKS90aGlzLmEpL01hdGguc2luKGMpKX1lbHNlIGlmKE1hdGguYWJzKGUrdGhpcy5tbDApPD1rKWM9MCxiPWgodGhpcy5sb25nMCtkL3RoaXMuYSk7ZWxzZXtnPSh0aGlzLm1sMCtlKS90aGlzLmEsaT1kKmQvdGhpcy5hL3RoaXMuYStnKmcsbD1nO3ZhciBwLHEscixzLHQ7Zm9yKGY9bTtmOy0tZilpZih0PXRoaXMuZSpNYXRoLnNpbihsKSxwPU1hdGguc3FydCgxLXQqdCkqTWF0aC50YW4obCkscT10aGlzLmEqaih0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLGwpLHI9dGhpcy5lMC0yKnRoaXMuZTEqTWF0aC5jb3MoMipsKSs0KnRoaXMuZTIqTWF0aC5jb3MoNCpsKS02KnRoaXMuZTMqTWF0aC5jb3MoNipsKSxzPXEvdGhpcy5hLG49KGcqKHAqcysxKS1zLS41KnAqKHMqcytpKSkvKHRoaXMuZXMqTWF0aC5zaW4oMipsKSoocypzK2ktMipnKnMpLyg0KnApKyhnLXMpKihwKnItMi9NYXRoLnNpbigyKmwpKS1yKSxsLT1uLE1hdGguYWJzKG4pPD1rKXtjPWw7YnJlYWt9cD1NYXRoLnNxcnQoMS10aGlzLmVzKk1hdGgucG93KE1hdGguc2luKGMpLDIpKSpNYXRoLnRhbihjKSxiPWgodGhpcy5sb25nMCtNYXRoLmFzaW4oZCpwL3RoaXMuYSkvTWF0aC5zaW4oYykpfXJldHVybiBhLng9YixhLnk9YyxhfSxjLm5hbWVzPVsiUG9seWNvbmljIiwicG9seSJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbGF0Ijo0LCIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL2UwZm4iOjcsIi4uL2NvbW1vbi9lMWZuIjo4LCIuLi9jb21tb24vZTJmbiI6OSwiLi4vY29tbW9uL2UzZm4iOjEwLCIuLi9jb21tb24vZ04iOjExLCIuLi9jb21tb24vbWxmbiI6MTR9XSw1OTpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksZT1hKCIuLi9jb21tb24vYWRqdXN0X2xhdCIpLGY9YSgiLi4vY29tbW9uL3BqX2VuZm4iKSxnPTIwLGg9YSgiLi4vY29tbW9uL3BqX21sZm4iKSxpPWEoIi4uL2NvbW1vbi9wal9pbnZfbWxmbiIpLGo9TWF0aC5QSS8yLGs9MWUtMTAsbD1hKCIuLi9jb21tb24vYXNpbnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnNwaGVyZT8odGhpcy5uPTEsdGhpcy5tPTAsdGhpcy5lcz0wLHRoaXMuQ195PU1hdGguc3FydCgodGhpcy5tKzEpL3RoaXMubiksdGhpcy5DX3g9dGhpcy5DX3kvKHRoaXMubSsxKSk6dGhpcy5lbj1mKHRoaXMuZXMpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxlPWEueCxmPWEueTtpZihlPWQoZS10aGlzLmxvbmcwKSx0aGlzLnNwaGVyZSl7aWYodGhpcy5tKWZvcih2YXIgaT10aGlzLm4qTWF0aC5zaW4oZiksaj1nO2o7LS1qKXt2YXIgbD0odGhpcy5tKmYrTWF0aC5zaW4oZiktaSkvKHRoaXMubStNYXRoLmNvcyhmKSk7aWYoZi09bCxNYXRoLmFicyhsKTxrKWJyZWFrfWVsc2UgZj0xIT09dGhpcy5uP01hdGguYXNpbih0aGlzLm4qTWF0aC5zaW4oZikpOmY7Yj10aGlzLmEqdGhpcy5DX3gqZSoodGhpcy5tK01hdGguY29zKGYpKSxjPXRoaXMuYSp0aGlzLkNfeSpmfWVsc2V7dmFyIG09TWF0aC5zaW4oZiksbj1NYXRoLmNvcyhmKTtjPXRoaXMuYSpoKGYsbSxuLHRoaXMuZW4pLGI9dGhpcy5hKmUqbi9NYXRoLnNxcnQoMS10aGlzLmVzKm0qbSl9cmV0dXJuIGEueD1iLGEueT1jLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYixjLGYsZztyZXR1cm4gYS54LT10aGlzLngwLGY9YS54L3RoaXMuYSxhLnktPXRoaXMueTAsYj1hLnkvdGhpcy5hLHRoaXMuc3BoZXJlPyhiLz10aGlzLkNfeSxmLz10aGlzLkNfeCoodGhpcy5tK01hdGguY29zKGIpKSx0aGlzLm0/Yj1sKCh0aGlzLm0qYitNYXRoLnNpbihiKSkvdGhpcy5uKToxIT09dGhpcy5uJiYoYj1sKE1hdGguc2luKGIpL3RoaXMubikpLGY9ZChmK3RoaXMubG9uZzApLGI9ZShiKSk6KGI9aShhLnkvdGhpcy5hLHRoaXMuZXMsdGhpcy5lbiksZz1NYXRoLmFicyhiKSxqPmc/KGc9TWF0aC5zaW4oYiksYz10aGlzLmxvbmcwK2EueCpNYXRoLnNxcnQoMS10aGlzLmVzKmcqZykvKHRoaXMuYSpNYXRoLmNvcyhiKSksZj1kKGMpKTpqPmctayYmKGY9dGhpcy5sb25nMCkpLGEueD1mLGEueT1iLGF9LGMubmFtZXM9WyJTaW51c29pZGFsIiwic2ludSJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbGF0Ijo0LCIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL2FzaW56Ijo2LCIuLi9jb21tb24vcGpfZW5mbiI6MTcsIi4uL2NvbW1vbi9wal9pbnZfbWxmbiI6MTgsIi4uL2NvbW1vbi9wal9tbGZuIjoxOX1dLDYwOltmdW5jdGlvbihhLGIsYyl7Yy5pbml0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sYXQwO3RoaXMubGFtYmRhMD10aGlzLmxvbmcwO3ZhciBiPU1hdGguc2luKGEpLGM9dGhpcy5hLGQ9dGhpcy5yZixlPTEvZCxmPTIqZS1NYXRoLnBvdyhlLDIpLGc9dGhpcy5lPU1hdGguc3FydChmKTt0aGlzLlI9dGhpcy5rMCpjKk1hdGguc3FydCgxLWYpLygxLWYqTWF0aC5wb3coYiwyKSksdGhpcy5hbHBoYT1NYXRoLnNxcnQoMStmLygxLWYpKk1hdGgucG93KE1hdGguY29zKGEpLDQpKSx0aGlzLmIwPU1hdGguYXNpbihiL3RoaXMuYWxwaGEpO3ZhciBoPU1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCt0aGlzLmIwLzIpKSxpPU1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCthLzIpKSxqPU1hdGgubG9nKCgxK2cqYikvKDEtZypiKSk7dGhpcy5LPWgtdGhpcy5hbHBoYSppK3RoaXMuYWxwaGEqZy8yKmp9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1NYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJLzQtYS55LzIpKSxjPXRoaXMuZS8yKk1hdGgubG9nKCgxK3RoaXMuZSpNYXRoLnNpbihhLnkpKS8oMS10aGlzLmUqTWF0aC5zaW4oYS55KSkpLGQ9LXRoaXMuYWxwaGEqKGIrYykrdGhpcy5LLGU9MiooTWF0aC5hdGFuKE1hdGguZXhwKGQpKS1NYXRoLlBJLzQpLGY9dGhpcy5hbHBoYSooYS54LXRoaXMubGFtYmRhMCksZz1NYXRoLmF0YW4oTWF0aC5zaW4oZikvKE1hdGguc2luKHRoaXMuYjApKk1hdGgudGFuKGUpK01hdGguY29zKHRoaXMuYjApKk1hdGguY29zKGYpKSksaD1NYXRoLmFzaW4oTWF0aC5jb3ModGhpcy5iMCkqTWF0aC5zaW4oZSktTWF0aC5zaW4odGhpcy5iMCkqTWF0aC5jb3MoZSkqTWF0aC5jb3MoZikpO3JldHVybiBhLnk9dGhpcy5SLzIqTWF0aC5sb2coKDErTWF0aC5zaW4oaCkpLygxLU1hdGguc2luKGgpKSkrdGhpcy55MCxhLng9dGhpcy5SKmcrdGhpcy54MCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWEueC10aGlzLngwLGM9YS55LXRoaXMueTAsZD1iL3RoaXMuUixlPTIqKE1hdGguYXRhbihNYXRoLmV4cChjL3RoaXMuUikpLU1hdGguUEkvNCksZj1NYXRoLmFzaW4oTWF0aC5jb3ModGhpcy5iMCkqTWF0aC5zaW4oZSkrTWF0aC5zaW4odGhpcy5iMCkqTWF0aC5jb3MoZSkqTWF0aC5jb3MoZCkpLGc9TWF0aC5hdGFuKE1hdGguc2luKGQpLyhNYXRoLmNvcyh0aGlzLmIwKSpNYXRoLmNvcyhkKS1NYXRoLnNpbih0aGlzLmIwKSpNYXRoLnRhbihlKSkpLGg9dGhpcy5sYW1iZGEwK2cvdGhpcy5hbHBoYSxpPTAsaj1mLGs9LTFlMyxsPTA7TWF0aC5hYnMoai1rKT4xZS03Oyl7aWYoKytsPjIwKXJldHVybjtpPTEvdGhpcy5hbHBoYSooTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K2YvMikpLXRoaXMuSykrdGhpcy5lKk1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCtNYXRoLmFzaW4odGhpcy5lKk1hdGguc2luKGopKS8yKSksaz1qLGo9MipNYXRoLmF0YW4oTWF0aC5leHAoaSkpLU1hdGguUEkvMn1yZXR1cm4gYS54PWgsYS55PWosYX0sYy5uYW1lcz1bInNvbWVyYyJdfSx7fV0sNjE6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLlBJLzIsZT0xZS0xMCxmPWEoIi4uL2NvbW1vbi9zaWduIiksZz1hKCIuLi9jb21tb24vbXNmbnoiKSxoPWEoIi4uL2NvbW1vbi90c2ZueiIpLGk9YSgiLi4vY29tbW9uL3BoaTJ6Iiksaj1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpO2Muc3Nmbl89ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiKj1jLE1hdGgudGFuKC41KihkK2EpKSpNYXRoLnBvdygoMS1iKS8oMStiKSwuNSpjKX0sYy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5jb3NsYXQwPU1hdGguY29zKHRoaXMubGF0MCksdGhpcy5zaW5sYXQwPU1hdGguc2luKHRoaXMubGF0MCksdGhpcy5zcGhlcmU/MT09PXRoaXMuazAmJiFpc05hTih0aGlzLmxhdF90cykmJk1hdGguYWJzKHRoaXMuY29zbGF0MCk8PWUmJih0aGlzLmswPS41KigxK2YodGhpcy5sYXQwKSpNYXRoLnNpbih0aGlzLmxhdF90cykpKTooTWF0aC5hYnModGhpcy5jb3NsYXQwKTw9ZSYmKHRoaXMubGF0MD4wP3RoaXMuY29uPTE6dGhpcy5jb249LTEpLHRoaXMuY29ucz1NYXRoLnNxcnQoTWF0aC5wb3coMSt0aGlzLmUsMSt0aGlzLmUpKk1hdGgucG93KDEtdGhpcy5lLDEtdGhpcy5lKSksMT09PXRoaXMuazAmJiFpc05hTih0aGlzLmxhdF90cykmJk1hdGguYWJzKHRoaXMuY29zbGF0MCk8PWUmJih0aGlzLmswPS41KnRoaXMuY29ucypnKHRoaXMuZSxNYXRoLnNpbih0aGlzLmxhdF90cyksTWF0aC5jb3ModGhpcy5sYXRfdHMpKS9oKHRoaXMuZSx0aGlzLmNvbip0aGlzLmxhdF90cyx0aGlzLmNvbipNYXRoLnNpbih0aGlzLmxhdF90cykpKSx0aGlzLm1zMT1nKHRoaXMuZSx0aGlzLnNpbmxhdDAsdGhpcy5jb3NsYXQwKSx0aGlzLlgwPTIqTWF0aC5hdGFuKHRoaXMuc3Nmbl8odGhpcy5sYXQwLHRoaXMuc2lubGF0MCx0aGlzLmUpKS1kLHRoaXMuY29zWDA9TWF0aC5jb3ModGhpcy5YMCksdGhpcy5zaW5YMD1NYXRoLnNpbih0aGlzLlgwKSl9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjLGYsZyxpLGssbD1hLngsbT1hLnksbj1NYXRoLnNpbihtKSxvPU1hdGguY29zKG0pLHA9aihsLXRoaXMubG9uZzApO3JldHVybiBNYXRoLmFicyhNYXRoLmFicyhsLXRoaXMubG9uZzApLU1hdGguUEkpPD1lJiZNYXRoLmFicyhtK3RoaXMubGF0MCk8PWU/KGEueD1OYU4sYS55PU5hTixhKTp0aGlzLnNwaGVyZT8oYj0yKnRoaXMuazAvKDErdGhpcy5zaW5sYXQwKm4rdGhpcy5jb3NsYXQwKm8qTWF0aC5jb3MocCkpLGEueD10aGlzLmEqYipvKk1hdGguc2luKHApK3RoaXMueDAsYS55PXRoaXMuYSpiKih0aGlzLmNvc2xhdDAqbi10aGlzLnNpbmxhdDAqbypNYXRoLmNvcyhwKSkrdGhpcy55MCxhKTooYz0yKk1hdGguYXRhbih0aGlzLnNzZm5fKG0sbix0aGlzLmUpKS1kLGc9TWF0aC5jb3MoYyksZj1NYXRoLnNpbihjKSxNYXRoLmFicyh0aGlzLmNvc2xhdDApPD1lPyhpPWgodGhpcy5lLG0qdGhpcy5jb24sdGhpcy5jb24qbiksaz0yKnRoaXMuYSp0aGlzLmswKmkvdGhpcy5jb25zLGEueD10aGlzLngwK2sqTWF0aC5zaW4obC10aGlzLmxvbmcwKSxhLnk9dGhpcy55MC10aGlzLmNvbiprKk1hdGguY29zKGwtdGhpcy5sb25nMCksYSk6KE1hdGguYWJzKHRoaXMuc2lubGF0MCk8ZT8oYj0yKnRoaXMuYSp0aGlzLmswLygxK2cqTWF0aC5jb3MocCkpLGEueT1iKmYpOihiPTIqdGhpcy5hKnRoaXMuazAqdGhpcy5tczEvKHRoaXMuY29zWDAqKDErdGhpcy5zaW5YMCpmK3RoaXMuY29zWDAqZypNYXRoLmNvcyhwKSkpLGEueT1iKih0aGlzLmNvc1gwKmYtdGhpcy5zaW5YMCpnKk1hdGguY29zKHApKSt0aGlzLnkwKSxhLng9YipnKk1hdGguc2luKHApK3RoaXMueDAsYSkpfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7YS54LT10aGlzLngwLGEueS09dGhpcy55MDt2YXIgYixjLGYsZyxoLGs9TWF0aC5zcXJ0KGEueCphLngrYS55KmEueSk7aWYodGhpcy5zcGhlcmUpe3ZhciBsPTIqTWF0aC5hdGFuKGsvKC41KnRoaXMuYSp0aGlzLmswKSk7cmV0dXJuIGI9dGhpcy5sb25nMCxjPXRoaXMubGF0MCxlPj1rPyhhLng9YixhLnk9YyxhKTooYz1NYXRoLmFzaW4oTWF0aC5jb3MobCkqdGhpcy5zaW5sYXQwK2EueSpNYXRoLnNpbihsKSp0aGlzLmNvc2xhdDAvayksYj1qKE1hdGguYWJzKHRoaXMuY29zbGF0MCk8ZT90aGlzLmxhdDA+MD90aGlzLmxvbmcwK01hdGguYXRhbjIoYS54LC0xKmEueSk6dGhpcy5sb25nMCtNYXRoLmF0YW4yKGEueCxhLnkpOnRoaXMubG9uZzArTWF0aC5hdGFuMihhLngqTWF0aC5zaW4obCksayp0aGlzLmNvc2xhdDAqTWF0aC5jb3MobCktYS55KnRoaXMuc2lubGF0MCpNYXRoLnNpbihsKSkpLGEueD1iLGEueT1jLGEpfWlmKE1hdGguYWJzKHRoaXMuY29zbGF0MCk8PWUpe2lmKGU+PWspcmV0dXJuIGM9dGhpcy5sYXQwLGI9dGhpcy5sb25nMCxhLng9YixhLnk9YyxhO2EueCo9dGhpcy5jb24sYS55Kj10aGlzLmNvbixmPWsqdGhpcy5jb25zLygyKnRoaXMuYSp0aGlzLmswKSxjPXRoaXMuY29uKmkodGhpcy5lLGYpLGI9dGhpcy5jb24qaih0aGlzLmNvbip0aGlzLmxvbmcwK01hdGguYXRhbjIoYS54LC0xKmEueSkpfWVsc2UgZz0yKk1hdGguYXRhbihrKnRoaXMuY29zWDAvKDIqdGhpcy5hKnRoaXMuazAqdGhpcy5tczEpKSxiPXRoaXMubG9uZzAsZT49az9oPXRoaXMuWDA6KGg9TWF0aC5hc2luKE1hdGguY29zKGcpKnRoaXMuc2luWDArYS55Kk1hdGguc2luKGcpKnRoaXMuY29zWDAvayksYj1qKHRoaXMubG9uZzArTWF0aC5hdGFuMihhLngqTWF0aC5zaW4oZyksayp0aGlzLmNvc1gwKk1hdGguY29zKGcpLWEueSp0aGlzLnNpblgwKk1hdGguc2luKGcpKSkpLGM9LTEqaSh0aGlzLmUsTWF0aC50YW4oLjUqKGQraCkpKTtyZXR1cm4gYS54PWIsYS55PWMsYX0sYy5uYW1lcz1bInN0ZXJlIiwiU3RlcmVvZ3JhcGhpY19Tb3V0aF9Qb2xlIiwiUG9sYXIgU3RlcmVvZ3JhcGhpYyAodmFyaWFudCBCKSJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vbXNmbnoiOjE1LCIuLi9jb21tb24vcGhpMnoiOjE2LCIuLi9jb21tb24vc2lnbiI6MjEsIi4uL2NvbW1vbi90c2ZueiI6MjR9XSw2MjpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4vZ2F1c3MiKSxlPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIik7Yy5pbml0PWZ1bmN0aW9uKCl7ZC5pbml0LmFwcGx5KHRoaXMpLHRoaXMucmMmJih0aGlzLnNpbmMwPU1hdGguc2luKHRoaXMucGhpYzApLHRoaXMuY29zYzA9TWF0aC5jb3ModGhpcy5waGljMCksdGhpcy5SMj0yKnRoaXMucmMsdGhpcy50aXRsZXx8KHRoaXMudGl0bGU9Ik9ibGlxdWUgU3RlcmVvZ3JhcGhpYyBBbHRlcm5hdGl2ZSIpKX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZixnO3JldHVybiBhLng9ZShhLngtdGhpcy5sb25nMCksZC5mb3J3YXJkLmFwcGx5KHRoaXMsW2FdKSxiPU1hdGguc2luKGEueSksYz1NYXRoLmNvcyhhLnkpLGY9TWF0aC5jb3MoYS54KSxnPXRoaXMuazAqdGhpcy5SMi8oMSt0aGlzLnNpbmMwKmIrdGhpcy5jb3NjMCpjKmYpLGEueD1nKmMqTWF0aC5zaW4oYS54KSxhLnk9ZyoodGhpcy5jb3NjMCpiLXRoaXMuc2luYzAqYypmKSxhLng9dGhpcy5hKmEueCt0aGlzLngwLGEueT10aGlzLmEqYS55K3RoaXMueTAsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZixnLGg7aWYoYS54PShhLngtdGhpcy54MCkvdGhpcy5hLGEueT0oYS55LXRoaXMueTApL3RoaXMuYSxhLngvPXRoaXMuazAsYS55Lz10aGlzLmswLGg9TWF0aC5zcXJ0KGEueCphLngrYS55KmEueSkpe3ZhciBpPTIqTWF0aC5hdGFuMihoLHRoaXMuUjIpO2I9TWF0aC5zaW4oaSksYz1NYXRoLmNvcyhpKSxnPU1hdGguYXNpbihjKnRoaXMuc2luYzArYS55KmIqdGhpcy5jb3NjMC9oKSxmPU1hdGguYXRhbjIoYS54KmIsaCp0aGlzLmNvc2MwKmMtYS55KnRoaXMuc2luYzAqYil9ZWxzZSBnPXRoaXMucGhpYzAsZj0wO3JldHVybiBhLng9ZixhLnk9ZyxkLmludmVyc2UuYXBwbHkodGhpcyxbYV0pLGEueD1lKGEueCt0aGlzLmxvbmcwKSxhfSxjLm5hbWVzPVsiU3RlcmVvZ3JhcGhpY19Ob3J0aF9Qb2xlIiwiT2JsaXF1ZV9TdGVyZW9ncmFwaGljIiwiUG9sYXJfU3RlcmVvZ3JhcGhpYyIsInN0ZXJlYSIsIk9ibGlxdWUgU3RlcmVvZ3JhcGhpYyBBbHRlcm5hdGl2ZSJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuL2dhdXNzIjo0Nn1dLDYzOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2UwZm4iKSxlPWEoIi4uL2NvbW1vbi9lMWZuIiksZj1hKCIuLi9jb21tb24vZTJmbiIpLGc9YSgiLi4vY29tbW9uL2UzZm4iKSxoPWEoIi4uL2NvbW1vbi9tbGZuIiksaT1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGo9TWF0aC5QSS8yLGs9MWUtMTAsbD1hKCIuLi9jb21tb24vc2lnbiIpLG09YSgiLi4vY29tbW9uL2FzaW56Iik7Yy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5lMD1kKHRoaXMuZXMpLHRoaXMuZTE9ZSh0aGlzLmVzKSx0aGlzLmUyPWYodGhpcy5lcyksdGhpcy5lMz1nKHRoaXMuZXMpLHRoaXMubWwwPXRoaXMuYSpoKHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsdGhpcy5sYXQwKX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPWEueCxmPWEueSxnPWkoZS10aGlzLmxvbmcwKSxqPU1hdGguc2luKGYpLGs9TWF0aC5jb3MoZik7aWYodGhpcy5zcGhlcmUpe3ZhciBsPWsqTWF0aC5zaW4oZyk7aWYoTWF0aC5hYnMoTWF0aC5hYnMobCktMSk8MWUtMTApcmV0dXJuIDkzO2M9LjUqdGhpcy5hKnRoaXMuazAqTWF0aC5sb2coKDErbCkvKDEtbCkpLGI9TWF0aC5hY29zKGsqTWF0aC5jb3MoZykvTWF0aC5zcXJ0KDEtbCpsKSksMD5mJiYoYj0tYiksZD10aGlzLmEqdGhpcy5rMCooYi10aGlzLmxhdDApfWVsc2V7dmFyIG09aypnLG49TWF0aC5wb3cobSwyKSxvPXRoaXMuZXAyKk1hdGgucG93KGssMikscD1NYXRoLnRhbihmKSxxPU1hdGgucG93KHAsMik7Yj0xLXRoaXMuZXMqTWF0aC5wb3coaiwyKTt2YXIgcj10aGlzLmEvTWF0aC5zcXJ0KGIpLHM9dGhpcy5hKmgodGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyxmKTtjPXRoaXMuazAqciptKigxK24vNiooMS1xK28rbi8yMCooNS0xOCpxK01hdGgucG93KHEsMikrNzIqby01OCp0aGlzLmVwMikpKSt0aGlzLngwLGQ9dGhpcy5rMCoocy10aGlzLm1sMCtyKnAqKG4qKC41K24vMjQqKDUtcSs5Km8rNCpNYXRoLnBvdyhvLDIpK24vMzAqKDYxLTU4KnErTWF0aC5wb3cocSwyKSs2MDAqby0zMzAqdGhpcy5lcDIpKSkpKSt0aGlzLnkwfXJldHVybiBhLng9YyxhLnk9ZCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9NjtpZih0aGlzLnNwaGVyZSl7dmFyIG49TWF0aC5leHAoYS54Lyh0aGlzLmEqdGhpcy5rMCkpLG89LjUqKG4tMS9uKSxwPXRoaXMubGF0MCthLnkvKHRoaXMuYSp0aGlzLmswKSxxPU1hdGguY29zKHApO2I9TWF0aC5zcXJ0KCgxLXEqcSkvKDErbypvKSksZj1tKGIpLDA+cCYmKGY9LWYpLGc9MD09PW8mJjA9PT1xP3RoaXMubG9uZzA6aShNYXRoLmF0YW4yKG8scSkrdGhpcy5sb25nMCl9ZWxzZXt2YXIgcj1hLngtdGhpcy54MCxzPWEueS10aGlzLnkwO2ZvcihiPSh0aGlzLm1sMCtzL3RoaXMuazApL3RoaXMuYSxjPWIsZT0wOyEwJiYoZD0oYit0aGlzLmUxKk1hdGguc2luKDIqYyktdGhpcy5lMipNYXRoLnNpbig0KmMpK3RoaXMuZTMqTWF0aC5zaW4oNipjKSkvdGhpcy5lMC1jLGMrPWQsIShNYXRoLmFicyhkKTw9aykpO2UrKylpZihlPj1oKXJldHVybiA5NTtpZihNYXRoLmFicyhjKTxqKXt2YXIgdD1NYXRoLnNpbihjKSx1PU1hdGguY29zKGMpLHY9TWF0aC50YW4oYyksdz10aGlzLmVwMipNYXRoLnBvdyh1LDIpLHg9TWF0aC5wb3codywyKSx5PU1hdGgucG93KHYsMiksej1NYXRoLnBvdyh5LDIpO2I9MS10aGlzLmVzKk1hdGgucG93KHQsMik7dmFyIEE9dGhpcy5hL01hdGguc3FydChiKSxCPUEqKDEtdGhpcy5lcykvYixDPXIvKEEqdGhpcy5rMCksRD1NYXRoLnBvdyhDLDIpO2Y9Yy1BKnYqRC9CKiguNS1ELzI0Kig1KzMqeSsxMCp3LTQqeC05KnRoaXMuZXAyLUQvMzAqKDYxKzkwKnkrMjk4KncrNDUqei0yNTIqdGhpcy5lcDItMyp4KSkpLGc9aSh0aGlzLmxvbmcwK0MqKDEtRC82KigxKzIqeSt3LUQvMjAqKDUtMip3KzI4KnktMyp4KzgqdGhpcy5lcDIrMjQqeikpKS91KX1lbHNlIGY9aipsKHMpLGc9dGhpcy5sb25nMH1yZXR1cm4gYS54PWcsYS55PWYsYX0sYy5uYW1lcz1bIlRyYW5zdmVyc2VfTWVyY2F0b3IiLCJUcmFuc3ZlcnNlIE1lcmNhdG9yIiwidG1lcmMiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL2FzaW56Ijo2LCIuLi9jb21tb24vZTBmbiI6NywiLi4vY29tbW9uL2UxZm4iOjgsIi4uL2NvbW1vbi9lMmZuIjo5LCIuLi9jb21tb24vZTNmbiI6MTAsIi4uL2NvbW1vbi9tbGZuIjoxNCwiLi4vY29tbW9uL3NpZ24iOjIxfV0sNjQ6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD0uMDE3NDUzMjkyNTE5OTQzMjk1LGU9YSgiLi90bWVyYyIpO2MuZGVwZW5kc09uPSJ0bWVyYyIsYy5pbml0PWZ1bmN0aW9uKCl7dGhpcy56b25lJiYodGhpcy5sYXQwPTAsdGhpcy5sb25nMD0oNipNYXRoLmFicyh0aGlzLnpvbmUpLTE4MykqZCx0aGlzLngwPTVlNSx0aGlzLnkwPXRoaXMudXRtU291dGg/MWU3OjAsdGhpcy5rMD0uOTk5NixlLmluaXQuYXBwbHkodGhpcyksdGhpcy5mb3J3YXJkPWUuZm9yd2FyZCx0aGlzLmludmVyc2U9ZS5pbnZlcnNlKX0sYy5uYW1lcz1bIlVuaXZlcnNhbCBUcmFuc3ZlcnNlIE1lcmNhdG9yIFN5c3RlbSIsInV0bSJdfSx7Ii4vdG1lcmMiOjYzfV0sNjU6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGU9TWF0aC5QSS8yLGY9MWUtMTAsZz1hKCIuLi9jb21tb24vYXNpbnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLlI9dGhpcy5hfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxoPWEueCxpPWEueSxqPWQoaC10aGlzLmxvbmcwKTtNYXRoLmFicyhpKTw9ZiYmKGI9dGhpcy54MCt0aGlzLlIqaixjPXRoaXMueTApO3ZhciBrPWcoMipNYXRoLmFicyhpL01hdGguUEkpKTsoTWF0aC5hYnMoaik8PWZ8fE1hdGguYWJzKE1hdGguYWJzKGkpLWUpPD1mKSYmKGI9dGhpcy54MCxjPWk+PTA/dGhpcy55MCtNYXRoLlBJKnRoaXMuUipNYXRoLnRhbiguNSprKTp0aGlzLnkwK01hdGguUEkqdGhpcy5SKi1NYXRoLnRhbiguNSprKSk7dmFyIGw9LjUqTWF0aC5hYnMoTWF0aC5QSS9qLWovTWF0aC5QSSksbT1sKmwsbj1NYXRoLnNpbihrKSxvPU1hdGguY29zKGspLHA9by8obitvLTEpLHE9cCpwLHI9cCooMi9uLTEpLHM9cipyLHQ9TWF0aC5QSSp0aGlzLlIqKGwqKHAtcykrTWF0aC5zcXJ0KG0qKHAtcykqKHAtcyktKHMrbSkqKHEtcykpKS8ocyttKTswPmomJih0PS10KSxiPXRoaXMueDArdDt2YXIgdT1tK3A7cmV0dXJuIHQ9TWF0aC5QSSp0aGlzLlIqKHIqdS1sKk1hdGguc3FydCgocyttKSoobSsxKS11KnUpKS8ocyttKSxjPWk+PTA/dGhpcy55MCt0OnRoaXMueTAtdCxhLng9YixhLnk9YyxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYyxlLGcsaCxpLGosayxsLG0sbixvLHA7cmV0dXJuIGEueC09dGhpcy54MCxhLnktPXRoaXMueTAsbj1NYXRoLlBJKnRoaXMuUixlPWEueC9uLGc9YS55L24saD1lKmUrZypnLGk9LU1hdGguYWJzKGcpKigxK2gpLApqPWktMipnKmcrZSplLGs9LTIqaSsxKzIqZypnK2gqaCxwPWcqZy9rKygyKmoqaipqL2svay9rLTkqaSpqL2svaykvMjcsbD0oaS1qKmovMy9rKS9rLG09MipNYXRoLnNxcnQoLWwvMyksbj0zKnAvbC9tLE1hdGguYWJzKG4pPjEmJihuPW4+PTA/MTotMSksbz1NYXRoLmFjb3MobikvMyxjPWEueT49MD8oLW0qTWF0aC5jb3MobytNYXRoLlBJLzMpLWovMy9rKSpNYXRoLlBJOi0oLW0qTWF0aC5jb3MobytNYXRoLlBJLzMpLWovMy9rKSpNYXRoLlBJLGI9TWF0aC5hYnMoZSk8Zj90aGlzLmxvbmcwOmQodGhpcy5sb25nMCtNYXRoLlBJKihoLTErTWF0aC5zcXJ0KDErMiooZSplLWcqZykraCpoKSkvMi9lKSxhLng9YixhLnk9YyxhfSxjLm5hbWVzPVsiVmFuX2Rlcl9HcmludGVuX0kiLCJWYW5EZXJHcmludGVuIiwidmFuZGciXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL2FzaW56Ijo2fV0sNjY6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD0uMDE3NDUzMjkyNTE5OTQzMjk1LGU9NTcuMjk1Nzc5NTEzMDgyMzIsZj0xLGc9MixoPWEoIi4vZGF0dW1fdHJhbnNmb3JtIiksaT1hKCIuL2FkanVzdF9heGlzIiksaj1hKCIuL1Byb2oiKSxrPWEoIi4vY29tbW9uL3RvUG9pbnQiKTtiLmV4cG9ydHM9ZnVuY3Rpb24gbChhLGIsYyl7ZnVuY3Rpb24gbShhLGIpe3JldHVybihhLmRhdHVtLmRhdHVtX3R5cGU9PT1mfHxhLmRhdHVtLmRhdHVtX3R5cGU9PT1nKSYmIldHUzg0IiE9PWIuZGF0dW1Db2RlfXZhciBuO3JldHVybiBBcnJheS5pc0FycmF5KGMpJiYoYz1rKGMpKSxhLmRhdHVtJiZiLmRhdHVtJiYobShhLGIpfHxtKGIsYSkpJiYobj1uZXcgaigiV0dTODQiKSxsKGEsbixjKSxhPW4pLCJlbnUiIT09YS5heGlzJiZpKGEsITEsYyksImxvbmdsYXQiPT09YS5wcm9qTmFtZT8oYy54Kj1kLGMueSo9ZCk6KGEudG9fbWV0ZXImJihjLngqPWEudG9fbWV0ZXIsYy55Kj1hLnRvX21ldGVyKSxhLmludmVyc2UoYykpLGEuZnJvbV9ncmVlbndpY2gmJihjLngrPWEuZnJvbV9ncmVlbndpY2gpLGM9aChhLmRhdHVtLGIuZGF0dW0sYyksYi5mcm9tX2dyZWVud2ljaCYmKGMueC09Yi5mcm9tX2dyZWVud2ljaCksImxvbmdsYXQiPT09Yi5wcm9qTmFtZT8oYy54Kj1lLGMueSo9ZSk6KGIuZm9yd2FyZChjKSxiLnRvX21ldGVyJiYoYy54Lz1iLnRvX21ldGVyLGMueS89Yi50b19tZXRlcikpLCJlbnUiIT09Yi5heGlzJiZpKGIsITAsYyksY319LHsiLi9Qcm9qIjoyLCIuL2FkanVzdF9heGlzIjozLCIuL2NvbW1vbi90b1BvaW50IjoyMywiLi9kYXR1bV90cmFuc2Zvcm0iOjMxfV0sNjc6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEsYixjKXthW2JdPWMubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O3JldHVybiBlKGEsYiksYn0pLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBqKGEsYil9LHt9KX1mdW5jdGlvbiBlKGEsYil7dmFyIGM7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSk/KGM9YS5zaGlmdCgpLCJQQVJBTUVURVIiPT09YyYmKGM9YS5zaGlmdCgpKSwxPT09YS5sZW5ndGg/QXJyYXkuaXNBcnJheShhWzBdKT8oYltjXT17fSxlKGFbMF0sYltjXSkpOmJbY109YVswXTphLmxlbmd0aD8iVE9XR1M4NCI9PT1jP2JbY109YTooYltjXT17fSxbIlVOSVQiLCJQUklNRU0iLCJWRVJUX0RBVFVNIl0uaW5kZXhPZihjKT4tMT8oYltjXT17bmFtZTphWzBdLnRvTG93ZXJDYXNlKCksY29udmVydDphWzFdfSwzPT09YS5sZW5ndGgmJihiW2NdLmF1dGg9YVsyXSkpOiJTUEhFUk9JRCI9PT1jPyhiW2NdPXtuYW1lOmFbMF0sYTphWzFdLHJmOmFbMl19LDQ9PT1hLmxlbmd0aCYmKGJbY10uYXV0aD1hWzNdKSk6WyJHRU9HQ1MiLCJHRU9DQ1MiLCJEQVRVTSIsIlZFUlRfQ1MiLCJDT01QRF9DUyIsIkxPQ0FMX0NTIiwiRklUVEVEX0NTIiwiTE9DQUxfREFUVU0iXS5pbmRleE9mKGMpPi0xPyhhWzBdPVsibmFtZSIsYVswXV0sZChiLGMsYSkpOmEuZXZlcnkoZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSl9KT9kKGIsYyxhKTplKGEsYltjXSkpOmJbY109ITAsdm9pZCAwKTp2b2lkKGJbYV09ITApfWZ1bmN0aW9uIGYoYSxiKXt2YXIgYz1iWzBdLGQ9YlsxXTshKGMgaW4gYSkmJmQgaW4gYSYmKGFbY109YVtkXSwzPT09Yi5sZW5ndGgmJihhW2NdPWJbMl0oYVtjXSkpKX1mdW5jdGlvbiBnKGEpe3JldHVybiBhKml9ZnVuY3Rpb24gaChhKXtmdW5jdGlvbiBiKGIpe3ZhciBjPWEudG9fbWV0ZXJ8fDE7cmV0dXJuIHBhcnNlRmxvYXQoYiwxMCkqY30iR0VPR0NTIj09PWEudHlwZT9hLnByb2pOYW1lPSJsb25nbGF0IjoiTE9DQUxfQ1MiPT09YS50eXBlPyhhLnByb2pOYW1lPSJpZGVudGl0eSIsYS5sb2NhbD0hMCk6Im9iamVjdCI9PXR5cGVvZiBhLlBST0pFQ1RJT04/YS5wcm9qTmFtZT1PYmplY3Qua2V5cyhhLlBST0pFQ1RJT04pWzBdOmEucHJvak5hbWU9YS5QUk9KRUNUSU9OLGEuVU5JVCYmKGEudW5pdHM9YS5VTklULm5hbWUudG9Mb3dlckNhc2UoKSwibWV0cmUiPT09YS51bml0cyYmKGEudW5pdHM9Im1ldGVyIiksYS5VTklULmNvbnZlcnQmJigiR0VPR0NTIj09PWEudHlwZT9hLkRBVFVNJiZhLkRBVFVNLlNQSEVST0lEJiYoYS50b19tZXRlcj1wYXJzZUZsb2F0KGEuVU5JVC5jb252ZXJ0LDEwKSphLkRBVFVNLlNQSEVST0lELmEpOmEudG9fbWV0ZXI9cGFyc2VGbG9hdChhLlVOSVQuY29udmVydCwxMCkpKSxhLkdFT0dDUyYmKGEuR0VPR0NTLkRBVFVNP2EuZGF0dW1Db2RlPWEuR0VPR0NTLkRBVFVNLm5hbWUudG9Mb3dlckNhc2UoKTphLmRhdHVtQ29kZT1hLkdFT0dDUy5uYW1lLnRvTG93ZXJDYXNlKCksImRfIj09PWEuZGF0dW1Db2RlLnNsaWNlKDAsMikmJihhLmRhdHVtQ29kZT1hLmRhdHVtQ29kZS5zbGljZSgyKSksIm5ld196ZWFsYW5kX2dlb2RldGljX2RhdHVtXzE5NDkiIT09YS5kYXR1bUNvZGUmJiJuZXdfemVhbGFuZF8xOTQ5IiE9PWEuZGF0dW1Db2RlfHwoYS5kYXR1bUNvZGU9Im56Z2Q0OSIpLCJ3Z3NfMTk4NCI9PT1hLmRhdHVtQ29kZSYmKCJNZXJjYXRvcl9BdXhpbGlhcnlfU3BoZXJlIj09PWEuUFJPSkVDVElPTiYmKGEuc3BoZXJlPSEwKSxhLmRhdHVtQ29kZT0id2dzODQiKSwiX2ZlcnJvIj09PWEuZGF0dW1Db2RlLnNsaWNlKC02KSYmKGEuZGF0dW1Db2RlPWEuZGF0dW1Db2RlLnNsaWNlKDAsLTYpKSwiX2pha2FydGEiPT09YS5kYXR1bUNvZGUuc2xpY2UoLTgpJiYoYS5kYXR1bUNvZGU9YS5kYXR1bUNvZGUuc2xpY2UoMCwtOCkpLH5hLmRhdHVtQ29kZS5pbmRleE9mKCJiZWxnZSIpJiYoYS5kYXR1bUNvZGU9InJuYjcyIiksYS5HRU9HQ1MuREFUVU0mJmEuR0VPR0NTLkRBVFVNLlNQSEVST0lEJiYoYS5lbGxwcz1hLkdFT0dDUy5EQVRVTS5TUEhFUk9JRC5uYW1lLnJlcGxhY2UoIl8xOSIsIiIpLnJlcGxhY2UoL1tDY11sYXJrZVxfMTgvLCJjbHJrIiksImludGVybmF0aW9uYWwiPT09YS5lbGxwcy50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsMTMpJiYoYS5lbGxwcz0iaW50bCIpLGEuYT1hLkdFT0dDUy5EQVRVTS5TUEhFUk9JRC5hLGEucmY9cGFyc2VGbG9hdChhLkdFT0dDUy5EQVRVTS5TUEhFUk9JRC5yZiwxMCkpLH5hLmRhdHVtQ29kZS5pbmRleE9mKCJvc2diXzE5MzYiKSYmKGEuZGF0dW1Db2RlPSJvc2diMzYiKSksYS5iJiYhaXNGaW5pdGUoYS5iKSYmKGEuYj1hLmEpO3ZhciBjPWZ1bmN0aW9uKGIpe3JldHVybiBmKGEsYil9LGQ9W1sic3RhbmRhcmRfcGFyYWxsZWxfMSIsIlN0YW5kYXJkX1BhcmFsbGVsXzEiXSxbInN0YW5kYXJkX3BhcmFsbGVsXzIiLCJTdGFuZGFyZF9QYXJhbGxlbF8yIl0sWyJmYWxzZV9lYXN0aW5nIiwiRmFsc2VfRWFzdGluZyJdLFsiZmFsc2Vfbm9ydGhpbmciLCJGYWxzZV9Ob3J0aGluZyJdLFsiY2VudHJhbF9tZXJpZGlhbiIsIkNlbnRyYWxfTWVyaWRpYW4iXSxbImxhdGl0dWRlX29mX29yaWdpbiIsIkxhdGl0dWRlX09mX09yaWdpbiJdLFsibGF0aXR1ZGVfb2Zfb3JpZ2luIiwiQ2VudHJhbF9QYXJhbGxlbCJdLFsic2NhbGVfZmFjdG9yIiwiU2NhbGVfRmFjdG9yIl0sWyJrMCIsInNjYWxlX2ZhY3RvciJdLFsibGF0aXR1ZGVfb2ZfY2VudGVyIiwiTGF0aXR1ZGVfb2ZfY2VudGVyIl0sWyJsYXQwIiwibGF0aXR1ZGVfb2ZfY2VudGVyIixnXSxbImxvbmdpdHVkZV9vZl9jZW50ZXIiLCJMb25naXR1ZGVfT2ZfQ2VudGVyIl0sWyJsb25nYyIsImxvbmdpdHVkZV9vZl9jZW50ZXIiLGddLFsieDAiLCJmYWxzZV9lYXN0aW5nIixiXSxbInkwIiwiZmFsc2Vfbm9ydGhpbmciLGJdLFsibG9uZzAiLCJjZW50cmFsX21lcmlkaWFuIixnXSxbImxhdDAiLCJsYXRpdHVkZV9vZl9vcmlnaW4iLGddLFsibGF0MCIsInN0YW5kYXJkX3BhcmFsbGVsXzEiLGddLFsibGF0MSIsInN0YW5kYXJkX3BhcmFsbGVsXzEiLGddLFsibGF0MiIsInN0YW5kYXJkX3BhcmFsbGVsXzIiLGddLFsiYWxwaGEiLCJhemltdXRoIixnXSxbInNyc0NvZGUiLCJuYW1lIl1dO2QuZm9yRWFjaChjKSxhLmxvbmcwfHwhYS5sb25nY3x8IkFsYmVyc19Db25pY19FcXVhbF9BcmVhIiE9PWEucHJvak5hbWUmJiJMYW1iZXJ0X0F6aW11dGhhbF9FcXVhbF9BcmVhIiE9PWEucHJvak5hbWV8fChhLmxvbmcwPWEubG9uZ2MpLGEubGF0X3RzfHwhYS5sYXQxfHwiU3RlcmVvZ3JhcGhpY19Tb3V0aF9Qb2xlIiE9PWEucHJvak5hbWUmJiJQb2xhciBTdGVyZW9ncmFwaGljICh2YXJpYW50IEIpIiE9PWEucHJvak5hbWV8fChhLmxhdDA9ZyhhLmxhdDE+MD85MDotOTApLGEubGF0X3RzPWEubGF0MSl9dmFyIGk9LjAxNzQ1MzI5MjUxOTk0MzI5NSxqPWEoIi4vZXh0ZW5kIik7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM9SlNPTi5wYXJzZSgoIiwiK2EpLnJlcGxhY2UoL1xzKlwsXHMqKFtBLVpfMC05XSs/KShcWykvZywnLFsiJDEiLCcpLnNsaWNlKDEpLnJlcGxhY2UoL1xzKlwsXHMqKFtBLVpfMC05XSs/KVxdL2csJywiJDEiXScpLnJlcGxhY2UoLyxcWyJWRVJUQ1MiLisvLCIiKSksZD1jLnNoaWZ0KCksZj1jLnNoaWZ0KCk7Yy51bnNoaWZ0KFsibmFtZSIsZl0pLGMudW5zaGlmdChbInR5cGUiLGRdKSxjLnVuc2hpZnQoIm91dHB1dCIpO3ZhciBnPXt9O3JldHVybiBlKGMsZyksaChnLm91dHB1dCksaihiLGcub3V0cHV0KX19LHsiLi9leHRlbmQiOjM0fV0sNjg6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhKihNYXRoLlBJLzE4MCl9ZnVuY3Rpb24gZShhKXtyZXR1cm4gMTgwKihhL01hdGguUEkpfWZ1bmN0aW9uIGYoYSl7dmFyIGIsYyxlLGYsZyxpLGosayxsLG09YS5sYXQsbj1hLmxvbixvPTYzNzgxMzcscD0uMDA2Njk0MzgscT0uOTk5NixyPWQobSkscz1kKG4pO2w9TWF0aC5mbG9vcigobisxODApLzYpKzEsMTgwPT09biYmKGw9NjApLG0+PTU2JiY2ND5tJiZuPj0zJiYxMj5uJiYobD0zMiksbT49NzImJjg0Pm0mJihuPj0wJiY5Pm4/bD0zMTpuPj05JiYyMT5uP2w9MzM6bj49MjEmJjMzPm4/bD0zNTpuPj0zMyYmNDI+biYmKGw9MzcpKSxiPTYqKGwtMSktMTgwKzMsaz1kKGIpLGM9cC8oMS1wKSxlPW8vTWF0aC5zcXJ0KDEtcCpNYXRoLnNpbihyKSpNYXRoLnNpbihyKSksZj1NYXRoLnRhbihyKSpNYXRoLnRhbihyKSxnPWMqTWF0aC5jb3MocikqTWF0aC5jb3MociksaT1NYXRoLmNvcyhyKSoocy1rKSxqPW8qKCgxLXAvNC0zKnAqcC82NC01KnAqcCpwLzI1Nikqci0oMypwLzgrMypwKnAvMzIrNDUqcCpwKnAvMTAyNCkqTWF0aC5zaW4oMipyKSsoMTUqcCpwLzI1Nis0NSpwKnAqcC8xMDI0KSpNYXRoLnNpbig0KnIpLTM1KnAqcCpwLzMwNzIqTWF0aC5zaW4oNipyKSk7dmFyIHQ9cSplKihpKygxLWYrZykqaSppKmkvNisoNS0xOCpmK2YqZis3MipnLTU4KmMpKmkqaSppKmkqaS8xMjApKzVlNSx1PXEqKGorZSpNYXRoLnRhbihyKSooaSppLzIrKDUtZis5KmcrNCpnKmcpKmkqaSppKmkvMjQrKDYxLTU4KmYrZipmKzYwMCpnLTMzMCpjKSppKmkqaSppKmkqaS83MjApKTtyZXR1cm4gMD5tJiYodSs9MWU3KSx7bm9ydGhpbmc6TWF0aC5yb3VuZCh1KSxlYXN0aW5nOk1hdGgucm91bmQodCksem9uZU51bWJlcjpsLHpvbmVMZXR0ZXI6aChtKX19ZnVuY3Rpb24gZyhhKXt2YXIgYj1hLm5vcnRoaW5nLGM9YS5lYXN0aW5nLGQ9YS56b25lTGV0dGVyLGY9YS56b25lTnVtYmVyO2lmKDA+Znx8Zj42MClyZXR1cm4gbnVsbDt2YXIgaCxpLGosayxsLG0sbixvLHAscSxyPS45OTk2LHM9NjM3ODEzNyx0PS4wMDY2OTQzOCx1PSgxLU1hdGguc3FydCgxLXQpKS8oMStNYXRoLnNxcnQoMS10KSksdj1jLTVlNSx3PWI7Ik4iPmQmJih3LT0xZTcpLG89NiooZi0xKS0xODArMyxoPXQvKDEtdCksbj13L3IscD1uLyhzKigxLXQvNC0zKnQqdC82NC01KnQqdCp0LzI1NikpLHE9cCsoMyp1LzItMjcqdSp1KnUvMzIpKk1hdGguc2luKDIqcCkrKDIxKnUqdS8xNi01NSp1KnUqdSp1LzMyKSpNYXRoLnNpbig0KnApKzE1MSp1KnUqdS85NipNYXRoLnNpbig2KnApLGk9cy9NYXRoLnNxcnQoMS10Kk1hdGguc2luKHEpKk1hdGguc2luKHEpKSxqPU1hdGgudGFuKHEpKk1hdGgudGFuKHEpLGs9aCpNYXRoLmNvcyhxKSpNYXRoLmNvcyhxKSxsPXMqKDEtdCkvTWF0aC5wb3coMS10Kk1hdGguc2luKHEpKk1hdGguc2luKHEpLDEuNSksbT12LyhpKnIpO3ZhciB4PXEtaSpNYXRoLnRhbihxKS9sKihtKm0vMi0oNSszKmorMTAqay00Kmsqay05KmgpKm0qbSptKm0vMjQrKDYxKzkwKmorMjk4KmsrNDUqaipqLTI1MipoLTMqayprKSptKm0qbSptKm0qbS83MjApO3g9ZSh4KTt2YXIgeT0obS0oMSsyKmoraykqbSptKm0vNisoNS0yKmsrMjgqai0zKmsqays4KmgrMjQqaipqKSptKm0qbSptKm0vMTIwKS9NYXRoLmNvcyhxKTt5PW8rZSh5KTt2YXIgejtpZihhLmFjY3VyYWN5KXt2YXIgQT1nKHtub3J0aGluZzphLm5vcnRoaW5nK2EuYWNjdXJhY3ksZWFzdGluZzphLmVhc3RpbmcrYS5hY2N1cmFjeSx6b25lTGV0dGVyOmEuem9uZUxldHRlcix6b25lTnVtYmVyOmEuem9uZU51bWJlcn0pO3o9e3RvcDpBLmxhdCxyaWdodDpBLmxvbixib3R0b206eCxsZWZ0Onl9fWVsc2Ugej17bGF0OngsbG9uOnl9O3JldHVybiB6fWZ1bmN0aW9uIGgoYSl7dmFyIGI9IloiO3JldHVybiA4ND49YSYmYT49NzI/Yj0iWCI6NzI+YSYmYT49NjQ/Yj0iVyI6NjQ+YSYmYT49NTY/Yj0iViI6NTY+YSYmYT49NDg/Yj0iVSI6NDg+YSYmYT49NDA/Yj0iVCI6NDA+YSYmYT49MzI/Yj0iUyI6MzI+YSYmYT49MjQ/Yj0iUiI6MjQ+YSYmYT49MTY/Yj0iUSI6MTY+YSYmYT49OD9iPSJQIjo4PmEmJmE+PTA/Yj0iTiI6MD5hJiZhPj0tOD9iPSJNIjotOD5hJiZhPj0tMTY/Yj0iTCI6LTE2PmEmJmE+PS0yND9iPSJLIjotMjQ+YSYmYT49LTMyP2I9IkoiOi0zMj5hJiZhPj0tNDA/Yj0iSCI6LTQwPmEmJmE+PS00OD9iPSJHIjotNDg+YSYmYT49LTU2P2I9IkYiOi01Nj5hJiZhPj0tNjQ/Yj0iRSI6LTY0PmEmJmE+PS03Mj9iPSJEIjotNzI+YSYmYT49LTgwJiYoYj0iQyIpLGJ9ZnVuY3Rpb24gaShhLGIpe3ZhciBjPSIwMDAwMCIrYS5lYXN0aW5nLGQ9IjAwMDAwIithLm5vcnRoaW5nO3JldHVybiBhLnpvbmVOdW1iZXIrYS56b25lTGV0dGVyK2ooYS5lYXN0aW5nLGEubm9ydGhpbmcsYS56b25lTnVtYmVyKStjLnN1YnN0cihjLmxlbmd0aC01LGIpK2Quc3Vic3RyKGQubGVuZ3RoLTUsYil9ZnVuY3Rpb24gaihhLGIsYyl7dmFyIGQ9ayhjKSxlPU1hdGguZmxvb3IoYS8xZTUpLGY9TWF0aC5mbG9vcihiLzFlNSklMjA7cmV0dXJuIGwoZSxmLGQpfWZ1bmN0aW9uIGsoYSl7dmFyIGI9YSVxO3JldHVybiAwPT09YiYmKGI9cSksYn1mdW5jdGlvbiBsKGEsYixjKXt2YXIgZD1jLTEsZT1yLmNoYXJDb2RlQXQoZCksZj1zLmNoYXJDb2RlQXQoZCksZz1lK2EtMSxoPWYrYixpPSExO2c+eCYmKGc9Zy14K3QtMSxpPSEwKSwoZz09PXV8fHU+ZSYmZz51fHwoZz51fHx1PmUpJiZpKSYmZysrLChnPT09dnx8dj5lJiZnPnZ8fChnPnZ8fHY+ZSkmJmkpJiYoZysrLGc9PT11JiZnKyspLGc+eCYmKGc9Zy14K3QtMSksaD53PyhoPWgtdyt0LTEsaT0hMCk6aT0hMSwoaD09PXV8fHU+ZiYmaD51fHwoaD51fHx1PmYpJiZpKSYmaCsrLChoPT09dnx8dj5mJiZoPnZ8fChoPnZ8fHY+ZikmJmkpJiYoaCsrLGg9PT11JiZoKyspLGg+dyYmKGg9aC13K3QtMSk7dmFyIGo9U3RyaW5nLmZyb21DaGFyQ29kZShnKStTdHJpbmcuZnJvbUNoYXJDb2RlKGgpO3JldHVybiBqfWZ1bmN0aW9uIG0oYSl7aWYoYSYmMD09PWEubGVuZ3RoKXRocm93Ik1HUlNQb2ludCBjb3ZlcnRpbmcgZnJvbSBub3RoaW5nIjtmb3IodmFyIGIsYz1hLmxlbmd0aCxkPW51bGwsZT0iIixmPTA7IS9bQS1aXS8udGVzdChiPWEuY2hhckF0KGYpKTspe2lmKGY+PTIpdGhyb3ciTUdSU1BvaW50IGJhZCBjb252ZXJzaW9uIGZyb206ICIrYTtlKz1iLGYrK312YXIgZz1wYXJzZUludChlLDEwKTtpZigwPT09Znx8ZiszPmMpdGhyb3ciTUdSU1BvaW50IGJhZCBjb252ZXJzaW9uIGZyb206ICIrYTt2YXIgaD1hLmNoYXJBdChmKyspO2lmKCJBIj49aHx8IkIiPT09aHx8IlkiPT09aHx8aD49IloifHwiSSI9PT1ofHwiTyI9PT1oKXRocm93Ik1HUlNQb2ludCB6b25lIGxldHRlciAiK2grIiBub3QgaGFuZGxlZDogIithO2Q9YS5zdWJzdHJpbmcoZixmKz0yKTtmb3IodmFyIGk9ayhnKSxqPW4oZC5jaGFyQXQoMCksaSksbD1vKGQuY2hhckF0KDEpLGkpO2w8cChoKTspbCs9MmU2O3ZhciBtPWMtZjtpZihtJTIhPT0wKXRocm93Ik1HUlNQb2ludCBoYXMgdG8gaGF2ZSBhbiBldmVuIG51bWJlciBcbm9mIGRpZ2l0cyBhZnRlciB0aGUgem9uZSBsZXR0ZXIgYW5kIHR3byAxMDBrbSBsZXR0ZXJzIC0gZnJvbnQgXG5oYWxmIGZvciBlYXN0aW5nIG1ldGVycywgc2Vjb25kIGhhbGYgZm9yIFxubm9ydGhpbmcgbWV0ZXJzIithO3ZhciBxLHIscyx0LHUsdj1tLzIsdz0wLHg9MDtyZXR1cm4gdj4wJiYocT0xZTUvTWF0aC5wb3coMTAsdikscj1hLnN1YnN0cmluZyhmLGYrdiksdz1wYXJzZUZsb2F0KHIpKnEscz1hLnN1YnN0cmluZyhmK3YpLHg9cGFyc2VGbG9hdChzKSpxKSx0PXcraix1PXgrbCx7ZWFzdGluZzp0LG5vcnRoaW5nOnUsem9uZUxldHRlcjpoLHpvbmVOdW1iZXI6ZyxhY2N1cmFjeTpxfX1mdW5jdGlvbiBuKGEsYil7Zm9yKHZhciBjPXIuY2hhckNvZGVBdChiLTEpLGQ9MWU1LGU9ITE7YyE9PWEuY2hhckNvZGVBdCgwKTspe2lmKGMrKyxjPT09dSYmYysrLGM9PT12JiZjKyssYz54KXtpZihlKXRocm93IkJhZCBjaGFyYWN0ZXI6ICIrYTtjPXQsZT0hMH1kKz0xZTV9cmV0dXJuIGR9ZnVuY3Rpb24gbyhhLGIpe2lmKGE+IlYiKXRocm93Ik1HUlNQb2ludCBnaXZlbiBpbnZhbGlkIE5vcnRoaW5nICIrYTtmb3IodmFyIGM9cy5jaGFyQ29kZUF0KGItMSksZD0wLGU9ITE7YyE9PWEuY2hhckNvZGVBdCgwKTspe2lmKGMrKyxjPT09dSYmYysrLGM9PT12JiZjKyssYz53KXtpZihlKXRocm93IkJhZCBjaGFyYWN0ZXI6ICIrYTtjPXQsZT0hMH1kKz0xZTV9cmV0dXJuIGR9ZnVuY3Rpb24gcChhKXt2YXIgYjtzd2l0Y2goYSl7Y2FzZSJDIjpiPTExZTU7YnJlYWs7Y2FzZSJEIjpiPTJlNjticmVhaztjYXNlIkUiOmI9MjhlNTticmVhaztjYXNlIkYiOmI9MzdlNTticmVhaztjYXNlIkciOmI9NDZlNTticmVhaztjYXNlIkgiOmI9NTVlNTticmVhaztjYXNlIkoiOmI9NjRlNTticmVhaztjYXNlIksiOmI9NzNlNTticmVhaztjYXNlIkwiOmI9ODJlNTticmVhaztjYXNlIk0iOmI9OTFlNTticmVhaztjYXNlIk4iOmI9MDticmVhaztjYXNlIlAiOmI9OGU1O2JyZWFrO2Nhc2UiUSI6Yj0xN2U1O2JyZWFrO2Nhc2UiUiI6Yj0yNmU1O2JyZWFrO2Nhc2UiUyI6Yj0zNWU1O2JyZWFrO2Nhc2UiVCI6Yj00NGU1O2JyZWFrO2Nhc2UiVSI6Yj01M2U1O2JyZWFrO2Nhc2UiViI6Yj02MmU1O2JyZWFrO2Nhc2UiVyI6Yj03ZTY7YnJlYWs7Y2FzZSJYIjpiPTc5ZTU7YnJlYWs7ZGVmYXVsdDpiPS0xfWlmKGI+PTApcmV0dXJuIGI7dGhyb3ciSW52YWxpZCB6b25lIGxldHRlcjogIithfXZhciBxPTYscj0iQUpTQUpTIixzPSJBRkFGQUYiLHQ9NjUsdT03Myx2PTc5LHc9ODYseD05MDtjLmZvcndhcmQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1ifHw1LGkoZih7bGF0OmFbMV0sbG9uOmFbMF19KSxiKX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiPWcobShhLnRvVXBwZXJDYXNlKCkpKTtyZXR1cm4gYi5sYXQmJmIubG9uP1tiLmxvbixiLmxhdCxiLmxvbixiLmxhdF06W2IubGVmdCxiLmJvdHRvbSxiLnJpZ2h0LGIudG9wXX0sYy50b1BvaW50PWZ1bmN0aW9uKGEpe3ZhciBiPWcobShhLnRvVXBwZXJDYXNlKCkpKTtyZXR1cm4gYi5sYXQmJmIubG9uP1tiLmxvbixiLmxhdF06WyhiLmxlZnQrYi5yaWdodCkvMiwoYi50b3ArYi5ib3R0b20pLzJdfX0se31dLDY5OltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPXtuYW1lOiJwcm9qNCIsdmVyc2lvbjoiMi4zLjE1IixkZXNjcmlwdGlvbjoiUHJvajRqcyBpcyBhIEphdmFTY3JpcHQgbGlicmFyeSB0byB0cmFuc2Zvcm0gcG9pbnQgY29vcmRpbmF0ZXMgZnJvbSBvbmUgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gYW5vdGhlciwgaW5jbHVkaW5nIGRhdHVtIHRyYW5zZm9ybWF0aW9ucy4iLG1haW46ImxpYi9pbmRleC5qcyIsZGlyZWN0b3JpZXM6e3Rlc3Q6InRlc3QiLGRvYzoiZG9jcyJ9LHNjcmlwdHM6e3Rlc3Q6Ii4vbm9kZV9tb2R1bGVzL2lzdGFuYnVsL2xpYi9jbGkuanMgdGVzdCAuL25vZGVfbW9kdWxlcy9tb2NoYS9iaW4vX21vY2hhIHRlc3QvdGVzdC5qcyJ9LHJlcG9zaXRvcnk6e3R5cGU6ImdpdCIsdXJsOiJnaXQ6Ly9naXRodWIuY29tL3Byb2o0anMvcHJvajRqcy5naXQifSxhdXRob3I6IiIsbGljZW5zZToiTUlUIixqYW06e21haW46ImRpc3QvcHJvajQuanMiLGluY2x1ZGU6WyJkaXN0L3Byb2o0LmpzIiwiUkVBRE1FLm1kIiwiQVVUSE9SUyIsIkxJQ0VOU0UubWQiXX0sZGV2RGVwZW5kZW5jaWVzOnsiZ3J1bnQtY2xpIjoifjAuMS4xMyIsZ3J1bnQ6In4wLjQuMiIsImdydW50LWNvbnRyaWItY29ubmVjdCI6In4wLjYuMCIsImdydW50LWNvbnRyaWItanNoaW50IjoifjAuOC4wIixjaGFpOiJ+MS44LjEiLG1vY2hhOiJ+MS4xNy4xIiwiZ3J1bnQtbW9jaGEtcGhhbnRvbWpzIjoifjAuNC4wIixicm93c2VyaWZ5OiJ+MTIuMC4xIiwiZ3J1bnQtYnJvd3NlcmlmeSI6In40LjAuMSIsImdydW50LWNvbnRyaWItdWdsaWZ5IjoifjAuMTEuMSIsY3VybDoiZ2l0Oi8vZ2l0aHViLmNvbS9jdWpvanMvY3VybC5naXQiLGlzdGFuYnVsOiJ+MC4yLjQiLHRpbjoifjAuNC4wIn0sZGVwZW5kZW5jaWVzOnttZ3JzOiJ+MC4wLjIifX19LHt9XX0se30sWzM2XSkoMzYpfSk7"></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIChmYWN0b3J5KSB7DQoJdmFyIEwsIHByb2o0Ow0KCWlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsNCgkJLy8gQU1EDQoJCWRlZmluZShbJ2xlYWZsZXQnLCAncHJvajQnXSwgZmFjdG9yeSk7DQoJfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICJvYmplY3QiKSB7DQoJCS8vIE5vZGUvQ29tbW9uSlMNCgkJTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTsNCgkJcHJvajQgPSByZXF1aXJlKCdwcm9qNCcpOw0KCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoTCwgcHJvajQpOw0KCX0gZWxzZSB7DQoJCS8vIEJyb3dzZXIgZ2xvYmFscw0KCQlpZiAodHlwZW9mIHdpbmRvdy5MID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LnByb2o0ID09PSAndW5kZWZpbmVkJykNCgkJCXRocm93ICdMZWFmbGV0IGFuZCBwcm9qNCBtdXN0IGJlIGxvYWRlZCBmaXJzdCc7DQoJCWZhY3Rvcnkod2luZG93LkwsIHdpbmRvdy5wcm9qNCk7DQoJfQ0KfShmdW5jdGlvbiAoTCwgcHJvajQpIHsNCg0KCUwuUHJvaiA9IHt9Ow0KDQoJTC5Qcm9qLl9pc1Byb2o0T2JqID0gZnVuY3Rpb24oYSkgew0KCQlyZXR1cm4gKHR5cGVvZiBhLmludmVyc2UgIT09ICd1bmRlZmluZWQnICYmDQoJCQl0eXBlb2YgYS5mb3J3YXJkICE9PSAndW5kZWZpbmVkJyk7DQoJfTsNCg0KCUwuUHJvai5TY2FsZURlcGVuZGFudFRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24oc2NhbGVUcmFuc2Zvcm1zKSB7DQoJCXRoaXMuc2NhbGVUcmFuc2Zvcm1zID0gc2NhbGVUcmFuc2Zvcm1zOw0KCX07DQoNCglMLlByb2ouU2NhbGVEZXBlbmRhbnRUcmFuc2Zvcm1hdGlvbi5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24ocG9pbnQsIHNjYWxlKSB7DQoJCXJldHVybiB0aGlzLnNjYWxlVHJhbnNmb3Jtc1tzY2FsZV0udHJhbnNmb3JtKHBvaW50LCBzY2FsZSk7DQoJfTsNCg0KCUwuUHJvai5TY2FsZURlcGVuZGFudFRyYW5zZm9ybWF0aW9uLnByb3RvdHlwZS51bnRyYW5zZm9ybSA9IGZ1bmN0aW9uKHBvaW50LCBzY2FsZSkgew0KCQlyZXR1cm4gdGhpcy5zY2FsZVRyYW5zZm9ybXNbc2NhbGVdLnVudHJhbnNmb3JtKHBvaW50LCBzY2FsZSk7DQoJfTsNCg0KCUwuUHJvai5Qcm9qZWN0aW9uID0gTC5DbGFzcy5leHRlbmQoew0KCQlpbml0aWFsaXplOiBmdW5jdGlvbihhLCBkZWYpIHsNCgkJCWlmIChMLlByb2ouX2lzUHJvajRPYmooYSkpIHsNCgkJCQl0aGlzLl9wcm9qID0gYTsNCgkJCX0gZWxzZSB7DQoJCQkJdmFyIGNvZGUgPSBhOw0KCQkJCWlmIChkZWYpIHsNCgkJCQkJcHJvajQuZGVmcyhjb2RlLCBkZWYpOw0KCQkJCX0gZWxzZSBpZiAocHJvajQuZGVmc1tjb2RlXSA9PT0gdW5kZWZpbmVkKSB7DQoJCQkJCXZhciB1cm4gPSBjb2RlLnNwbGl0KCc6Jyk7DQoJCQkJCWlmICh1cm4ubGVuZ3RoID4gMykgew0KCQkJCQkJY29kZSA9IHVyblt1cm4ubGVuZ3RoIC0gM10gKyAnOicgKyB1cm5bdXJuLmxlbmd0aCAtIDFdOw0KCQkJCQl9DQoJCQkJCWlmIChwcm9qNC5kZWZzW2NvZGVdID09PSB1bmRlZmluZWQpIHsNCgkJCQkJCXRocm93ICdObyBwcm9qZWN0aW9uIGRlZmluaXRpb24gZm9yIGNvZGUgJyArIGNvZGU7DQoJCQkJCX0NCgkJCQl9DQoJCQkJdGhpcy5fcHJvaiA9IHByb2o0KGNvZGUpOw0KCQkJfQ0KCQl9LA0KDQoJCXByb2plY3Q6IGZ1bmN0aW9uIChsYXRsbmcpIHsNCgkJCXZhciBwb2ludCA9IHRoaXMuX3Byb2ouZm9yd2FyZChbbGF0bG5nLmxuZywgbGF0bG5nLmxhdF0pOw0KCQkJcmV0dXJuIG5ldyBMLlBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7DQoJCX0sDQoNCgkJdW5wcm9qZWN0OiBmdW5jdGlvbiAocG9pbnQsIHVuYm91bmRlZCkgew0KCQkJdmFyIHBvaW50MiA9IHRoaXMuX3Byb2ouaW52ZXJzZShbcG9pbnQueCwgcG9pbnQueV0pOw0KCQkJcmV0dXJuIG5ldyBMLkxhdExuZyhwb2ludDJbMV0sIHBvaW50MlswXSwgdW5ib3VuZGVkKTsNCgkJfQ0KCX0pOw0KDQoJTC5Qcm9qLkNSUyA9IEwuQ2xhc3MuZXh0ZW5kKHsNCgkJaW5jbHVkZXM6IEwuQ1JTLA0KDQoJCW9wdGlvbnM6IHsNCgkJCXRyYW5zZm9ybWF0aW9uOiBuZXcgTC5UcmFuc2Zvcm1hdGlvbigxLCAwLCAtMSwgMCkNCgkJfSwNCg0KCQlpbml0aWFsaXplOiBmdW5jdGlvbihhLCBiLCBjKSB7DQoJCQl2YXIgY29kZSwgcHJvaiwgZGVmLCBvcHRpb25zOw0KDQoJCQlpZiAoTC5Qcm9qLl9pc1Byb2o0T2JqKGEpKSB7DQoJCQkJcHJvaiA9IGE7DQoJCQkJY29kZSA9IHByb2ouc3JzQ29kZTsNCgkJCQlvcHRpb25zID0gYiB8fCB7fTsNCg0KCQkJCXRoaXMucHJvamVjdGlvbiA9IG5ldyBMLlByb2ouUHJvamVjdGlvbihwcm9qKTsNCgkJCX0gZWxzZSB7DQoJCQkJY29kZSA9IGE7DQoJCQkJZGVmID0gYjsNCgkJCQlvcHRpb25zID0gYyB8fCB7fTsNCgkJCQl0aGlzLnByb2plY3Rpb24gPSBuZXcgTC5Qcm9qLlByb2plY3Rpb24oY29kZSwgZGVmKTsNCgkJCX0NCg0KCQkJTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7DQoJCQl0aGlzLmNvZGUgPSBjb2RlOw0KCQkJdGhpcy50cmFuc2Zvcm1hdGlvbiA9IHRoaXMub3B0aW9ucy50cmFuc2Zvcm1hdGlvbjsNCg0KCQkJaWYgKHRoaXMub3B0aW9ucy5vcmlnaW4pIHsNCgkJCQl0aGlzLnRyYW5zZm9ybWF0aW9uID0NCgkJCQkJbmV3IEwuVHJhbnNmb3JtYXRpb24oMSwgLXRoaXMub3B0aW9ucy5vcmlnaW5bMF0sDQoJCQkJCQktMSwgdGhpcy5vcHRpb25zLm9yaWdpblsxXSk7DQoJCQl9DQoNCgkJCWlmICh0aGlzLm9wdGlvbnMuc2NhbGVzKSB7DQoJCQkJdGhpcy5fc2NhbGVzID0gdGhpcy5vcHRpb25zLnNjYWxlczsNCgkJCX0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnJlc29sdXRpb25zKSB7DQoJCQkJdGhpcy5fc2NhbGVzID0gW107DQoJCQkJZm9yICh2YXIgaSA9IHRoaXMub3B0aW9ucy5yZXNvbHV0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCQlpZiAodGhpcy5vcHRpb25zLnJlc29sdXRpb25zW2ldKSB7DQoJCQkJCQl0aGlzLl9zY2FsZXNbaV0gPSAxIC8gdGhpcy5vcHRpb25zLnJlc29sdXRpb25zW2ldOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KDQoJCXNjYWxlOiBmdW5jdGlvbih6b29tKSB7DQoJCQl2YXIgaVpvb20gPSBNYXRoLmZsb29yKHpvb20pLA0KCQkJCWJhc2VTY2FsZSwNCgkJCQluZXh0U2NhbGUsDQoJCQkJc2NhbGVEaWZmLA0KCQkJCXpEaWZmOw0KCQkJaWYgKHpvb20gPT09IGlab29tKSB7DQoJCQkJcmV0dXJuIHRoaXMuX3NjYWxlc1t6b29tXTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gTm9uLWludGVnZXIgem9vbSwgaW50ZXJwb2xhdGUNCgkJCQliYXNlU2NhbGUgPSB0aGlzLl9zY2FsZXNbaVpvb21dOw0KCQkJCW5leHRTY2FsZSA9IHRoaXMuX3NjYWxlc1tpWm9vbSArIDFdOw0KCQkJCXNjYWxlRGlmZiA9IG5leHRTY2FsZSAtIGJhc2VTY2FsZTsNCgkJCQl6RGlmZiA9ICh6b29tIC0gaVpvb20pOw0KCQkJCXJldHVybiBiYXNlU2NhbGUgKyBzY2FsZURpZmYgKiB6RGlmZjsNCgkJCX0NCgkJfSwNCg0KCQlnZXRTaXplOiBmdW5jdGlvbih6b29tKSB7DQoJCQl2YXIgYiA9IHRoaXMub3B0aW9ucy5ib3VuZHMsDQoJCQkgICAgcywNCgkJCSAgICBtaW4sDQoJCQkgICAgbWF4Ow0KDQoJCQlpZiAoYikgew0KCQkJCXMgPSB0aGlzLnNjYWxlKHpvb20pOw0KCQkJCW1pbiA9IHRoaXMudHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGIubWluLCBzKTsNCgkJCQltYXggPSB0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShiLm1heCwgcyk7DQoJCQkJcmV0dXJuIEwucG9pbnQoTWF0aC5hYnMobWF4LnggLSBtaW4ueCksIE1hdGguYWJzKG1heC55IC0gbWluLnkpKTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBMZWFmbGV0IDwgMC43DQoJCQkJcyA9IDI1NiAqIE1hdGgucG93KDIsIHpvb20pOw0KCQkJCXJldHVybiBMLnBvaW50KHMsIHMpOw0KCQkJfQ0KCQl9DQoJfSk7DQoNCglMLlByb2ouQ1JTLlRNUyA9IEwuUHJvai5DUlMuZXh0ZW5kKHsNCgkJb3B0aW9uczogew0KCQkJdGlsZVNpemU6IDI1Ng0KCQl9LA0KDQoJCWluaXRpYWxpemU6IGZ1bmN0aW9uKGEsIGIsIGMsIGQpIHsNCgkJCXZhciBjb2RlLA0KCQkJCWRlZiwNCgkJCQlwcm9qLA0KCQkJCXByb2plY3RlZEJvdW5kcywNCgkJCQlvcHRpb25zOw0KDQoJCQlpZiAoTC5Qcm9qLl9pc1Byb2o0T2JqKGEpKSB7DQoJCQkJcHJvaiA9IGE7DQoJCQkJcHJvamVjdGVkQm91bmRzID0gYjsNCgkJCQlvcHRpb25zID0gYyB8fCB7fTsNCgkJCQlvcHRpb25zLm9yaWdpbiA9IFtwcm9qZWN0ZWRCb3VuZHNbMF0sIHByb2plY3RlZEJvdW5kc1szXV07DQoJCQkJTC5Qcm9qLkNSUy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHByb2osIG9wdGlvbnMpOw0KCQkJfSBlbHNlIHsNCgkJCQljb2RlID0gYTsNCgkJCQlkZWYgPSBiOw0KCQkJCXByb2plY3RlZEJvdW5kcyA9IGM7DQoJCQkJb3B0aW9ucyA9IGQgfHwge307DQoJCQkJb3B0aW9ucy5vcmlnaW4gPSBbcHJvamVjdGVkQm91bmRzWzBdLCBwcm9qZWN0ZWRCb3VuZHNbM11dOw0KCQkJCUwuUHJvai5DUlMucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBjb2RlLCBkZWYsIG9wdGlvbnMpOw0KCQkJfQ0KDQoJCQl0aGlzLnByb2plY3RlZEJvdW5kcyA9IHByb2plY3RlZEJvdW5kczsNCg0KCQkJdGhpcy5fc2l6ZXMgPSB0aGlzLl9jYWxjdWxhdGVTaXplcygpOw0KCQl9LA0KDQoJCV9jYWxjdWxhdGVTaXplczogZnVuY3Rpb24oKSB7DQoJCQl2YXIgc2l6ZXMgPSBbXSwNCgkJCSAgICBjcnNCb3VuZHMgPSB0aGlzLnByb2plY3RlZEJvdW5kcywNCgkJCSAgICBwcm9qZWN0ZWRUaWxlU2l6ZSwNCgkJCSAgICBpLA0KCQkJICAgIHgsDQoJCQkgICAgeTsNCgkJCWZvciAoaSA9IHRoaXMuX3NjYWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KCQkJCWlmICh0aGlzLl9zY2FsZXNbaV0pIHsNCgkJCQkJcHJvamVjdGVkVGlsZVNpemUgPSB0aGlzLm9wdGlvbnMudGlsZVNpemUgLyB0aGlzLl9zY2FsZXNbaV07DQoJCQkJCS8vIHRvIHByZXZlbnQgdmVyeSBzbWFsbCByb3VuZGluZyBlcnJvcnMgZnJvbSBjYXVzaW5nIHVzIHRvIHJvdW5kIHVwLA0KCQkJCQkvLyBjdXQgYW55IGRlY2ltYWxzIGFmdGVyIDNyZCBiZWZvcmUgcm91bmRpbmcgdXAuDQoJCQkJCXggPSBNYXRoLmNlaWwocGFyc2VGbG9hdCgoY3JzQm91bmRzWzJdIC0gY3JzQm91bmRzWzBdKSAvIHByb2plY3RlZFRpbGVTaXplKS50b1ByZWNpc2lvbigzKSkgKg0KCQkJCQkgICAgcHJvamVjdGVkVGlsZVNpemUgKiB0aGlzLl9zY2FsZXNbaV07DQoJCQkJCXkgPSBNYXRoLmNlaWwocGFyc2VGbG9hdCgoY3JzQm91bmRzWzNdIC0gY3JzQm91bmRzWzFdKSAvIHByb2plY3RlZFRpbGVTaXplKS50b1ByZWNpc2lvbigzKSkgKg0KCQkJCQkgICAgcHJvamVjdGVkVGlsZVNpemUgKiB0aGlzLl9zY2FsZXNbaV07DQoJCQkJCXNpemVzW2ldID0gTC5wb2ludCh4LCB5KTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiBzaXplczsNCgkJfSwNCg0KCQlnZXRTaXplOiBmdW5jdGlvbih6b29tKSB7DQoJCQlyZXR1cm4gdGhpcy5fc2l6ZXNbem9vbV07DQoJCX0NCgl9KTsNCg0KCUwuUHJvai5UaWxlTGF5ZXIgPSB7fTsNCg0KCS8vIE5vdGU6IGRlcHJlY2F0ZWQgYW5kIG5vdCBuZWNlc3Nhcnkgc2luY2UgMC43LCB3aWxsIGJlIHJlbW92ZWQNCglMLlByb2ouVGlsZUxheWVyLlRNUyA9IEwuVGlsZUxheWVyLmV4dGVuZCh7DQoJCW9wdGlvbnM6IHsNCgkJCWNvbnRpbnVvdXNXb3JsZDogdHJ1ZQ0KCQl9LA0KDQoJCWluaXRpYWxpemU6IGZ1bmN0aW9uKHVybFRlbXBsYXRlLCBjcnMsIG9wdGlvbnMpIHsNCgkJCXZhciBib3VuZHNNYXRjaGVzR3JpZCA9IHRydWUsDQoJCQkJc2NhbGVUcmFuc2Zvcm1zLA0KCQkJCXVwcGVyWSwNCgkJCQljcnNCb3VuZHMsDQoJCQkJaTsNCg0KCQkJaWYgKCEoY3JzIGluc3RhbmNlb2YgTC5Qcm9qLkNSUy5UTVMpKSB7DQoJCQkJdGhyb3cgJ0NSUyBpcyBub3QgTC5Qcm9qLkNSUy5UTVMuJzsNCgkJCX0NCg0KCQkJTC5UaWxlTGF5ZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCB1cmxUZW1wbGF0ZSwgb3B0aW9ucyk7DQoJCQkvLyBFbmFibGluZyB0bXMgd2lsbCBjYXVzZSBMZWFmbGV0IHRvIGFsc28gdHJ5IHRvIGRvIFRNUywgd2hpY2ggd2lsbA0KCQkJLy8gYnJlYWsgKGF0IGxlYXN0IHByaW9yIHRvIDAuNy4wKS4gQWN0aXZlbHkgZGlzYWJsZSBpdCwgdG8gcHJldmVudA0KCQkJLy8gd2VsbC1tZWFuaW5nIHVzZXJzIGZyb20gc2hvb3RpbmcgdGhlbXNlbHZlcyBpbiB0aGUgZm9vdC4NCgkJCXRoaXMub3B0aW9ucy50bXMgPSBmYWxzZTsNCgkJCXRoaXMuY3JzID0gY3JzOw0KCQkJY3JzQm91bmRzID0gdGhpcy5jcnMucHJvamVjdGVkQm91bmRzOw0KDQoJCQkvLyBWZXJpZnkgZ3JpZCBhbGlnbm1lbnQNCgkJCWZvciAoaSA9IHRoaXMub3B0aW9ucy5taW5ab29tOyBpIDwgdGhpcy5vcHRpb25zLm1heFpvb20gJiYgYm91bmRzTWF0Y2hlc0dyaWQ7IGkrKykgew0KCQkJCXZhciBncmlkSGVpZ2h0ID0gKGNyc0JvdW5kc1szXSAtIGNyc0JvdW5kc1sxXSkgLw0KCQkJCQl0aGlzLl9wcm9qZWN0ZWRUaWxlU2l6ZShpKTsNCgkJCQlib3VuZHNNYXRjaGVzR3JpZCA9IE1hdGguYWJzKGdyaWRIZWlnaHQgLSBNYXRoLnJvdW5kKGdyaWRIZWlnaHQpKSA+IDFlLTM7DQoJCQl9DQoNCgkJCWlmICghYm91bmRzTWF0Y2hlc0dyaWQpIHsNCgkJCQlzY2FsZVRyYW5zZm9ybXMgPSB7fTsNCgkJCQlmb3IgKGkgPSB0aGlzLm9wdGlvbnMubWluWm9vbTsgaSA8IHRoaXMub3B0aW9ucy5tYXhab29tOyBpKyspIHsNCgkJCQkJdXBwZXJZID0gY3JzQm91bmRzWzFdICsgTWF0aC5jZWlsKChjcnNCb3VuZHNbM10gLSBjcnNCb3VuZHNbMV0pIC8NCgkJCQkJCXRoaXMuX3Byb2plY3RlZFRpbGVTaXplKGkpKSAqIHRoaXMuX3Byb2plY3RlZFRpbGVTaXplKGkpOw0KCQkJCQlzY2FsZVRyYW5zZm9ybXNbdGhpcy5jcnMuc2NhbGUoaSldID0gbmV3IEwuVHJhbnNmb3JtYXRpb24oMSwgLWNyc0JvdW5kc1swXSwgLTEsIHVwcGVyWSk7DQoJCQkJfQ0KDQoJCQkJdGhpcy5jcnMgPSBuZXcgTC5Qcm9qLkNSUy5UTVModGhpcy5jcnMucHJvamVjdGlvbi5fcHJvaiwgY3JzQm91bmRzLCB0aGlzLmNycy5vcHRpb25zKTsNCgkJCQl0aGlzLmNycy50cmFuc2Zvcm1hdGlvbiA9IG5ldyBMLlByb2ouU2NhbGVEZXBlbmRhbnRUcmFuc2Zvcm1hdGlvbihzY2FsZVRyYW5zZm9ybXMpOw0KCQkJfQ0KCQl9LA0KDQoJCWdldFRpbGVVcmw6IGZ1bmN0aW9uKHRpbGVQb2ludCkgew0KCQkJdmFyIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpLA0KCQkJCWdyaWRIZWlnaHQgPSBNYXRoLmNlaWwoDQoJCQkJKHRoaXMuY3JzLnByb2plY3RlZEJvdW5kc1szXSAtIHRoaXMuY3JzLnByb2plY3RlZEJvdW5kc1sxXSkgLw0KCQkJCXRoaXMuX3Byb2plY3RlZFRpbGVTaXplKHpvb20pKTsNCg0KCQkJcmV0dXJuIEwuVXRpbC50ZW1wbGF0ZSh0aGlzLl91cmwsIEwuVXRpbC5leHRlbmQoew0KCQkJCXM6IHRoaXMuX2dldFN1YmRvbWFpbih0aWxlUG9pbnQpLA0KCQkJCXo6IHRoaXMuX2dldFpvb21Gb3JVcmwoKSwNCgkJCQl4OiB0aWxlUG9pbnQueCwNCgkJCQl5OiBncmlkSGVpZ2h0IC0gdGlsZVBvaW50LnkgLSAxDQoJCQl9LCB0aGlzLm9wdGlvbnMpKTsNCgkJfSwNCg0KCQlfcHJvamVjdGVkVGlsZVNpemU6IGZ1bmN0aW9uKHpvb20pIHsNCgkJCXJldHVybiAodGhpcy5vcHRpb25zLnRpbGVTaXplIC8gdGhpcy5jcnMuc2NhbGUoem9vbSkpOw0KCQl9DQoJfSk7DQoNCglMLlByb2ouR2VvSlNPTiA9IEwuR2VvSlNPTi5leHRlbmQoew0KCQlpbml0aWFsaXplOiBmdW5jdGlvbihnZW9qc29uLCBvcHRpb25zKSB7DQoJCQl0aGlzLl9jYWxsTGV2ZWwgPSAwOw0KCQkJTC5HZW9KU09OLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbnVsbCwgb3B0aW9ucyk7DQoJCQlpZiAoZ2VvanNvbikgew0KCQkJCXRoaXMuYWRkRGF0YShnZW9qc29uKTsNCgkJCX0NCgkJfSwNCg0KCQlhZGREYXRhOiBmdW5jdGlvbihnZW9qc29uKSB7DQoJCQl2YXIgY3JzOw0KDQoJCQlpZiAoZ2VvanNvbikgew0KCQkJCWlmIChnZW9qc29uLmNycyAmJiBnZW9qc29uLmNycy50eXBlID09PSAnbmFtZScpIHsNCgkJCQkJY3JzID0gbmV3IEwuUHJvai5DUlMoZ2VvanNvbi5jcnMucHJvcGVydGllcy5uYW1lKTsNCgkJCQl9IGVsc2UgaWYgKGdlb2pzb24uY3JzICYmIGdlb2pzb24uY3JzLnR5cGUpIHsNCgkJCQkJY3JzID0gbmV3IEwuUHJvai5DUlMoZ2VvanNvbi5jcnMudHlwZSArICc6JyArIGdlb2pzb24uY3JzLnByb3BlcnRpZXMuY29kZSk7DQoJCQkJfQ0KDQoJCQkJaWYgKGNycyAhPT0gdW5kZWZpbmVkKSB7DQoJCQkJCXRoaXMub3B0aW9ucy5jb29yZHNUb0xhdExuZyA9IGZ1bmN0aW9uKGNvb3Jkcykgew0KCQkJCQkJdmFyIHBvaW50ID0gTC5wb2ludChjb29yZHNbMF0sIGNvb3Jkc1sxXSk7DQoJCQkJCQlyZXR1cm4gY3JzLnByb2plY3Rpb24udW5wcm9qZWN0KHBvaW50KTsNCgkJCQkJfTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIEJhc2UgY2xhc3MnIGFkZERhdGEgbWlnaHQgY2FsbCB1cyByZWN1cnNpdmVseSwgYnV0DQoJCQkvLyBDUlMgc2hvdWxkbid0IGJlIGNsZWFyZWQgaW4gdGhhdCBjYXNlLCBzaW5jZSBDUlMgYXBwbGllcw0KCQkJLy8gdG8gdGhlIHdob2xlIEdlb0pTT04sIGlubHVkaW5nIHN1Yi1mZWF0dXJlcy4NCgkJCXRoaXMuX2NhbGxMZXZlbCsrOw0KCQkJdHJ5IHsNCgkJCQlMLkdlb0pTT04ucHJvdG90eXBlLmFkZERhdGEuY2FsbCh0aGlzLCBnZW9qc29uKTsNCgkJCX0gZmluYWxseSB7DQoJCQkJdGhpcy5fY2FsbExldmVsLS07DQoJCQkJaWYgKHRoaXMuX2NhbGxMZXZlbCA9PT0gMCkgew0KCQkJCQlkZWxldGUgdGhpcy5vcHRpb25zLmNvb3Jkc1RvTGF0TG5nOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0pOw0KDQoJTC5Qcm9qLmdlb0pzb24gPSBmdW5jdGlvbihnZW9qc29uLCBvcHRpb25zKSB7DQoJCXJldHVybiBuZXcgTC5Qcm9qLkdlb0pTT04oZ2VvanNvbiwgb3B0aW9ucyk7DQoJfTsNCg0KCUwuUHJvai5JbWFnZU92ZXJsYXkgPSBMLkltYWdlT3ZlcmxheS5leHRlbmQoew0KCQlpbml0aWFsaXplOiBmdW5jdGlvbih1cmwsIGJvdW5kcywgb3B0aW9ucykgew0KCQkJTC5JbWFnZU92ZXJsYXkucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCB1cmwsIG51bGwsIG9wdGlvbnMpOw0KCQkJdGhpcy5fcHJvakJvdW5kcyA9IGJvdW5kczsNCgkJfSwNCg0KCQkvKiBEYW5nZXIgYWhlYWQ6IG92ZXJyaWRpbmcgaW50ZXJuYWwgbWV0aG9kcyBpbiBMZWFmbGV0Lg0KCQkgICBJJ3ZlIGRlY2lkZWQgdG8gZG8gdGhpcyByYXRoZXIgdGhhbiBtYWtpbmcgYSBjb3B5IG9mIEwuSW1hZ2VPdmVybGF5DQoJCSAgIGFuZCBtYWtpbmcgdmVyeSB0aW55IG1vZGlmaWNhdGlvbnMgdG8gaXQuIEZ1dHVyZSB3aWxsIHRlbGwgaWYgdGhpcw0KCQkgICB3YXMgd2lzZSBvciBub3QuICovDQoJCV9hbmltYXRlWm9vbTogZnVuY3Rpb24gKGUpIHsNCgkJCXZhciBub3J0aHdlc3QgPSBMLnBvaW50KHRoaXMuX3Byb2pCb3VuZHMubWluLngsIHRoaXMuX3Byb2pCb3VuZHMubWF4LnkpLA0KCQkJCXNvdXRoZWFzdCA9ICBMLnBvaW50KHRoaXMuX3Byb2pCb3VuZHMubWF4LngsIHRoaXMuX3Byb2pCb3VuZHMubWluLnkpLA0KCQkJCXRvcExlZnQgPSB0aGlzLl9wcm9qZWN0ZWRUb05ld0xheWVyUG9pbnQobm9ydGh3ZXN0LCBlLnpvb20sIGUuY2VudGVyKSwNCgkJCSAgICBzaXplID0gdGhpcy5fcHJvamVjdGVkVG9OZXdMYXllclBvaW50KHNvdXRoZWFzdCwgZS56b29tLCBlLmNlbnRlcikuc3VidHJhY3QodG9wTGVmdCksDQoJCQkgICAgb3JpZ2luID0gdG9wTGVmdC5hZGQoc2l6ZS5fbXVsdGlwbHlCeSgoMSAtIDEgLyBlLnNjYWxlKSAvIDIpKTsNCg0KCQkJdGhpcy5faW1hZ2Uuc3R5bGVbTC5Eb21VdGlsLlRSQU5TRk9STV0gPQ0KCQkgICAgICAgIEwuRG9tVXRpbC5nZXRUcmFuc2xhdGVTdHJpbmcob3JpZ2luKSArICcgc2NhbGUoJyArIHRoaXMuX21hcC5nZXRab29tU2NhbGUoZS56b29tKSArICcpICc7DQoJCX0sDQoNCgkJX3Jlc2V0OiBmdW5jdGlvbigpIHsNCgkJCXZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKSwNCgkJCQlwaXhlbE9yaWdpbiA9IHRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpLA0KCQkJCWJvdW5kcyA9IEwuYm91bmRzKHRoaXMuX3RyYW5zZm9ybSh0aGlzLl9wcm9qQm91bmRzLm1pbiwgem9vbSkuX3N1YnRyYWN0KHBpeGVsT3JpZ2luKSwNCgkJCQkJdGhpcy5fdHJhbnNmb3JtKHRoaXMuX3Byb2pCb3VuZHMubWF4LCB6b29tKS5fc3VidHJhY3QocGl4ZWxPcmlnaW4pKSwNCgkJCQlzaXplID0gYm91bmRzLmdldFNpemUoKSwNCgkJCQlpbWFnZSA9IHRoaXMuX2ltYWdlOw0KDQoJCQlMLkRvbVV0aWwuc2V0UG9zaXRpb24oaW1hZ2UsIGJvdW5kcy5taW4pOw0KCQkJaW1hZ2Uuc3R5bGUud2lkdGggID0gc2l6ZS54ICsgJ3B4JzsNCgkJCWltYWdlLnN0eWxlLmhlaWdodCA9IHNpemUueSArICdweCc7DQoJCX0sDQoNCgkJX3Byb2plY3RlZFRvTmV3TGF5ZXJQb2ludDogZnVuY3Rpb24gKHBvaW50LCBuZXdab29tLCBuZXdDZW50ZXIpIHsNCgkJCXZhciB0b3BMZWZ0ID0gdGhpcy5fbWFwLl9nZXROZXdUb3BMZWZ0UG9pbnQobmV3Q2VudGVyLCBuZXdab29tKS5hZGQodGhpcy5fbWFwLl9nZXRNYXBQYW5lUG9zKCkpOw0KCQkJcmV0dXJuIHRoaXMuX3RyYW5zZm9ybShwb2ludCwgbmV3Wm9vbSkuX3N1YnRyYWN0KHRvcExlZnQpOw0KCQl9LA0KDQoJCV90cmFuc2Zvcm06IGZ1bmN0aW9uKHAsIHpvb20pIHsNCgkJCXZhciBjcnMgPSB0aGlzLl9tYXAub3B0aW9ucy5jcnMsDQoJCQkJdHJhbnNmb3JtYXRpb24gPSBjcnMudHJhbnNmb3JtYXRpb24sDQoJCQkJc2NhbGUgPSBjcnMuc2NhbGUoem9vbSk7DQoJCQlyZXR1cm4gdHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKHAsIHNjYWxlKTsNCgkJfQ0KCX0pOw0KDQoJTC5Qcm9qLmltYWdlT3ZlcmxheSA9IGZ1bmN0aW9uKHVybCwgYm91bmRzLCBvcHRpb25zKSB7DQoJCXJldHVybiBuZXcgTC5Qcm9qLkltYWdlT3ZlcmxheSh1cmwsIGJvdW5kcywgb3B0aW9ucyk7DQoJfTsNCg0KCWlmICh0eXBlb2YgTC5DUlMgIT09ICd1bmRlZmluZWQnKSB7DQoJCS8vIFRoaXMgaXMgbGVmdCBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQ0KCQlMLkNSUy5wcm9qNGpzID0gKGZ1bmN0aW9uICgpIHsNCgkJCXJldHVybiBmdW5jdGlvbiAoY29kZSwgZGVmLCB0cmFuc2Zvcm1hdGlvbiwgb3B0aW9ucykgew0KCQkJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9Ow0KCQkJCWlmICh0cmFuc2Zvcm1hdGlvbikgew0KCQkJCQlvcHRpb25zLnRyYW5zZm9ybWF0aW9uID0gdHJhbnNmb3JtYXRpb247DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIG5ldyBMLlByb2ouQ1JTKGNvZGUsIGRlZiwgb3B0aW9ucyk7DQoJCQl9Ow0KCQl9KCkpOw0KCX0NCg0KCXJldHVybiBMLlByb2o7DQp9KSk7DQo="></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKCnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpOwoKdmFyIF91dGlsID0gcmVxdWlyZSgiLi91dGlsIik7CgpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KCnZhciBDbHVzdGVyTGF5ZXJTdG9yZSA9IGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBDbHVzdGVyTGF5ZXJTdG9yZShncm91cCkgewogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsdXN0ZXJMYXllclN0b3JlKTsKCiAgICB0aGlzLl9sYXllcnMgPSB7fTsKICAgIHRoaXMuX2dyb3VwID0gZ3JvdXA7CiAgfQoKICBfY3JlYXRlQ2xhc3MoQ2x1c3RlckxheWVyU3RvcmUsIFt7CiAgICBrZXk6ICJhZGQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGFkZChsYXllciwgaWQpIHsKICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gInVuZGVmaW5lZCIgJiYgaWQgIT09IG51bGwpIHsKICAgICAgICBpZiAodGhpcy5fbGF5ZXJzW2lkXSkgewogICAgICAgICAgdGhpcy5fZ3JvdXAucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2lkXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2xheWVyc1tpZF0gPSBsYXllcjsKICAgICAgfQogICAgICB0aGlzLl9ncm91cC5hZGRMYXllcihsYXllcik7CiAgICB9CiAgfSwgewogICAga2V5OiAicmVtb3ZlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUoaWQpIHsKICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gInVuZGVmaW5lZCIgfHwgaWQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlkID0gKDAsIF91dGlsLmFzQXJyYXkpKGlkKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRbaV1dKSB7CiAgICAgICAgICB0aGlzLl9ncm91cC5yZW1vdmVMYXllcih0aGlzLl9sYXllcnNbaWRbaV1dKTsKICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllcnNbaWRbaV1dOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogImNsZWFyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgdGhpcy5fbGF5ZXJzID0ge307CiAgICAgIHRoaXMuX2dyb3VwLmNsZWFyTGF5ZXJzKCk7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gQ2x1c3RlckxheWVyU3RvcmU7Cn0oKTsKCmV4cG9ydHMuZGVmYXVsdCA9IENsdXN0ZXJMYXllclN0b3JlOwoKCn0seyIuL3V0aWwiOjE1fV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKCnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpOwoKZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9Cgp2YXIgQ29udHJvbFN0b3JlID0gZnVuY3Rpb24gKCkgewogIGZ1bmN0aW9uIENvbnRyb2xTdG9yZShtYXApIHsKICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb250cm9sU3RvcmUpOwoKICAgIHRoaXMuX2NvbnRyb2xzTm9JZCA9IFtdOwogICAgdGhpcy5fY29udHJvbHNCeUlkID0ge307CiAgICB0aGlzLl9tYXAgPSBtYXA7CiAgfQoKICBfY3JlYXRlQ2xhc3MoQ29udHJvbFN0b3JlLCBbewogICAga2V5OiAiYWRkIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQoY29udHJvbCwgaWQsIGh0bWwpIHsKICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gInVuZGVmaW5lZCIgJiYgaWQgIT09IG51bGwpIHsKICAgICAgICBpZiAodGhpcy5fY29udHJvbHNCeUlkW2lkXSkgewogICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUNvbnRyb2wodGhpcy5fY29udHJvbHNCeUlkW2lkXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NvbnRyb2xzQnlJZFtpZF0gPSBjb250cm9sOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX2NvbnRyb2xzTm9JZC5wdXNoKGNvbnRyb2wpOwogICAgICB9CiAgICAgIHRoaXMuX21hcC5hZGRDb250cm9sKGNvbnRyb2wpOwogICAgfQogIH0sIHsKICAgIGtleTogInJlbW92ZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKGlkKSB7CiAgICAgIGlmICh0aGlzLl9jb250cm9sc0J5SWRbaWRdKSB7CiAgICAgICAgdmFyIGNvbnRyb2wgPSB0aGlzLl9jb250cm9sc0J5SWRbaWRdOwogICAgICAgIHRoaXMuX21hcC5yZW1vdmVDb250cm9sKGNvbnRyb2wpOwogICAgICAgIGRlbGV0ZSB0aGlzLl9jb250cm9sc0J5SWRbaWRdOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAiY2xlYXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2NvbnRyb2xzTm9JZC5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjb250cm9sID0gdGhpcy5fY29udHJvbHNOb0lkW2ldOwogICAgICAgIHRoaXMuX21hcC5yZW1vdmVDb250cm9sKGNvbnRyb2wpOwogICAgICB9CiAgICAgIHRoaXMuX2NvbnRyb2xzTm9JZCA9IFtdOwoKICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuX2NvbnRyb2xzQnlJZCkgewogICAgICAgIHZhciBfY29udHJvbCA9IHRoaXMuX2NvbnRyb2xzQnlJZFtrZXldOwogICAgICAgIHRoaXMuX21hcC5yZW1vdmVDb250cm9sKF9jb250cm9sKTsKICAgICAgfQogICAgICB0aGlzLl9jb250cm9sc0J5SWQgPSB7fTsKICAgIH0KICB9XSk7CgogIHJldHVybiBDb250cm9sU3RvcmU7Cn0oKTsKCmV4cG9ydHMuZGVmYXVsdCA9IENvbnRyb2xTdG9yZTsKCgp9LHt9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmdldENSUyA9IGdldENSUzsKCnZhciBfbGVhZmxldCA9IHJlcXVpcmUoIi4vZ2xvYmFsL2xlYWZsZXQiKTsKCnZhciBfbGVhZmxldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sZWFmbGV0KTsKCnZhciBfcHJvajRsZWFmbGV0ID0gcmVxdWlyZSgiLi9nbG9iYWwvcHJvajRsZWFmbGV0Iik7Cgp2YXIgX3Byb2o0bGVhZmxldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9qNGxlYWZsZXQpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBpbnN0YW5jaWF0ZSBhIElDUlMgaW5zdGFuY2UuCmZ1bmN0aW9uIGdldENSUyhjcnNPcHRpb25zKSB7CiAgdmFyIGNycyA9IF9sZWFmbGV0Mi5kZWZhdWx0LkNSUy5FUFNHMzg1NzsgLy8gRGVmYXVsdCBTcGhlcmljYWwgTWVyY2F0b3IKCiAgc3dpdGNoIChjcnNPcHRpb25zLmNyc0NsYXNzKSB7CiAgICBjYXNlICJMLkNSUy5FUFNHMzg1NyI6CiAgICAgIGNycyA9IF9sZWFmbGV0Mi5kZWZhdWx0LkNSUy5FUFNHMzg1NzsKICAgICAgYnJlYWs7CiAgICBjYXNlICJMLkNSUy5FUFNHNDMyNiI6CiAgICAgIGNycyA9IF9sZWFmbGV0Mi5kZWZhdWx0LkNSUy5FUFNHNDMyNjsKICAgICAgYnJlYWs7CiAgICBjYXNlICJMLkNSUy5FUFNHMzM5NSI6CiAgICAgIGNycyA9IF9sZWFmbGV0Mi5kZWZhdWx0LkNSUy5FUFNHMzM5NTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJMLkNSUy5TaW1wbGUiOgogICAgICBjcnMgPSBfbGVhZmxldDIuZGVmYXVsdC5DUlMuU2ltcGxlOwogICAgICBicmVhazsKICAgIGNhc2UgIkwuUHJvai5DUlMiOgogICAgICBpZiAoY3JzT3B0aW9ucy5vcHRpb25zICYmIGNyc09wdGlvbnMub3B0aW9ucy5ib3VuZHMpIHsKICAgICAgICBjcnNPcHRpb25zLm9wdGlvbnMuYm91bmRzID0gX2xlYWZsZXQyLmRlZmF1bHQuYm91bmRzKGNyc09wdGlvbnMub3B0aW9ucy5ib3VuZHMpOwogICAgICB9CiAgICAgIGlmIChjcnNPcHRpb25zLm9wdGlvbnMgJiYgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uKSB7CiAgICAgICAgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uID0gbmV3IF9sZWFmbGV0Mi5kZWZhdWx0LlRyYW5zZm9ybWF0aW9uKGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblswXSwgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uWzFdLCBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb25bMl0sIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblszXSk7CiAgICAgIH0KICAgICAgY3JzID0gbmV3IF9wcm9qNGxlYWZsZXQyLmRlZmF1bHQuQ1JTKGNyc09wdGlvbnMuY29kZSwgY3JzT3B0aW9ucy5wcm9qNGRlZiwgY3JzT3B0aW9ucy5vcHRpb25zKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJMLlByb2ouQ1JTLlRNUyI6CiAgICAgIGlmIChjcnNPcHRpb25zLm9wdGlvbnMgJiYgY3JzT3B0aW9ucy5vcHRpb25zLmJvdW5kcykgewogICAgICAgIGNyc09wdGlvbnMub3B0aW9ucy5ib3VuZHMgPSBfbGVhZmxldDIuZGVmYXVsdC5ib3VuZHMoY3JzT3B0aW9ucy5vcHRpb25zLmJvdW5kcyk7CiAgICAgIH0KICAgICAgaWYgKGNyc09wdGlvbnMub3B0aW9ucyAmJiBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb24pIHsKICAgICAgICBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb24gPSBfbGVhZmxldDIuZGVmYXVsdC5UcmFuc2Zvcm1hdGlvbihjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb25bMF0sIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblsxXSwgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uWzJdLCBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb25bM10pOwogICAgICB9CiAgICAgIGNycyA9IG5ldyBfcHJvajRsZWFmbGV0Mi5kZWZhdWx0LkNSUy5UTVMoY3JzT3B0aW9ucy5jb2RlLCBjcnNPcHRpb25zLnByb2o0ZGVmLCBjcnNPcHRpb25zLnByb2plY3RlZEJvdW5kcywgY3JzT3B0aW9ucy5vcHRpb25zKTsKICAgICAgYnJlYWs7CiAgfQogIHJldHVybiBjcnM7Cn0KCgp9LHsiLi9nbG9iYWwvbGVhZmxldCI6OCwiLi9nbG9iYWwvcHJvajRsZWFmbGV0Ijo5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKCnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsgfTsKCnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpOwoKdmFyIF91dGlsID0gcmVxdWlyZSgiLi91dGlsIik7CgpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KCnZhciBEYXRhRnJhbWUgPSBmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gRGF0YUZyYW1lKCkgewogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERhdGFGcmFtZSk7CgogICAgdGhpcy5jb2x1bW5zID0gW107CiAgICB0aGlzLmNvbG5hbWVzID0gW107CiAgICB0aGlzLmNvbHN0cmljdCA9IFtdOwoKICAgIHRoaXMuZWZmZWN0aXZlTGVuZ3RoID0gMDsKICAgIHRoaXMuY29saW5kaWNlcyA9IHt9OwogIH0KCiAgX2NyZWF0ZUNsYXNzKERhdGFGcmFtZSwgW3sKICAgIGtleTogIl91cGRhdGVDYWNoZWRQcm9wZXJ0aWVzIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlQ2FjaGVkUHJvcGVydGllcygpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgIHRoaXMuZWZmZWN0aXZlTGVuZ3RoID0gMDsKICAgICAgdGhpcy5jb2xpbmRpY2VzID0ge307CgogICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uLCBpKSB7CiAgICAgICAgX3RoaXMuZWZmZWN0aXZlTGVuZ3RoID0gTWF0aC5tYXgoX3RoaXMuZWZmZWN0aXZlTGVuZ3RoLCBjb2x1bW4ubGVuZ3RoKTsKICAgICAgICBfdGhpcy5jb2xpbmRpY2VzW190aGlzLmNvbG5hbWVzW2ldXSA9IGk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogIl9jb2xJbmRleCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gX2NvbEluZGV4KGNvbG5hbWUpIHsKICAgICAgdmFyIGluZGV4ID0gdGhpcy5jb2xpbmRpY2VzW2NvbG5hbWVdOwogICAgICBpZiAodHlwZW9mIGluZGV4ID09PSAidW5kZWZpbmVkIikgcmV0dXJuIC0xOwogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgfSwgewogICAga2V5OiAiY29sIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjb2wobmFtZSwgdmFsdWVzLCBzdHJpY3QpIHsKICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAic3RyaW5nIikgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbHVtbiBuYW1lIFwiIiArIG5hbWUgKyAiXCIiKTsKCiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2NvbEluZGV4KG5hbWUpOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtlbHNlIHJldHVybiAoMCwgX3V0aWwucmVjeWNsZSkodGhpcy5jb2x1bW5zW2luZGV4XSwgdGhpcy5lZmZlY3RpdmVMZW5ndGgpOwogICAgICB9CgogICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgaW5kZXggPSB0aGlzLmNvbG5hbWVzLmxlbmd0aDsKICAgICAgICB0aGlzLmNvbG5hbWVzLnB1c2gobmFtZSk7CiAgICAgIH0KICAgICAgdGhpcy5jb2x1bW5zW2luZGV4XSA9ICgwLCBfdXRpbC5hc0FycmF5KSh2YWx1ZXMpOwogICAgICB0aGlzLmNvbHN0cmljdFtpbmRleF0gPSAhIXN0cmljdDsKCiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHN0cmljdG5lc3MgKGVuc3VyZSBsZW5ndGhzIG1hdGNoIHVwIHdpdGggb3RoZXIgc3RyaWN0cykKCiAgICAgIHRoaXMuX3VwZGF0ZUNhY2hlZFByb3BlcnRpZXMoKTsKCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH0sIHsKICAgIGtleTogImNiaW5kIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjYmluZChvYmosIHN0cmljdCkgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgICAgIHZhciBjb2xkYXRhID0gb2JqW25hbWVdOwogICAgICAgIF90aGlzMi5jb2wobmFtZSwgY29sZGF0YSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldChyb3csIGNvbCwgbWlzc2luZ09LKSB7CiAgICAgIHZhciBfdGhpczMgPSB0aGlzOwoKICAgICAgaWYgKHJvdyA+IHRoaXMuZWZmZWN0aXZlTGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoIlJvdyBhcmd1bWVudCB3YXMgb3V0IG9mIGJvdW5kczogIiArIHJvdyArICIgPiAiICsgdGhpcy5lZmZlY3RpdmVMZW5ndGgpOwoKICAgICAgdmFyIGNvbEluZGV4ID0gLTE7CiAgICAgIGlmICh0eXBlb2YgY29sID09PSAidW5kZWZpbmVkIikgewogICAgICAgIHZhciBfcmV0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIHJvd0RhdGEgPSB7fTsKICAgICAgICAgIF90aGlzMy5jb2xuYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lLCBpKSB7CiAgICAgICAgICAgIHJvd0RhdGFbbmFtZV0gPSBfdGhpczMuY29sdW1uc1tpXVtyb3cgJSBfdGhpczMuY29sdW1uc1tpXS5sZW5ndGhdOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB2OiByb3dEYXRhCiAgICAgICAgICB9OwogICAgICAgIH0oKTsKCiAgICAgICAgaWYgKCh0eXBlb2YgX3JldCA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2YoX3JldCkpID09PSAib2JqZWN0IikgcmV0dXJuIF9yZXQudjsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29sID09PSAic3RyaW5nIikgewogICAgICAgIGNvbEluZGV4ID0gdGhpcy5fY29sSW5kZXgoY29sKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29sID09PSAibnVtYmVyIikgewogICAgICAgIGNvbEluZGV4ID0gY29sOwogICAgICB9CiAgICAgIGlmIChjb2xJbmRleCA8IDAgfHwgY29sSW5kZXggPiB0aGlzLmNvbHVtbnMubGVuZ3RoKSB7CiAgICAgICAgaWYgKG1pc3NpbmdPSykgcmV0dXJuIHZvaWQgMDtlbHNlIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb2x1bW4gaW5kZXg6ICIgKyBjb2wpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5jb2x1bW5zW2NvbEluZGV4XVtyb3cgJSB0aGlzLmNvbHVtbnNbY29sSW5kZXhdLmxlbmd0aF07CiAgICB9CiAgfSwgewogICAga2V5OiAibnJvdyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gbnJvdygpIHsKICAgICAgcmV0dXJuIHRoaXMuZWZmZWN0aXZlTGVuZ3RoOwogICAgfQogIH1dKTsKCiAgcmV0dXJuIERhdGFGcmFtZTsKfSgpOwoKZXhwb3J0cy5kZWZhdWx0ID0gRGF0YUZyYW1lOwoKCn0seyIuL3V0aWwiOjE1fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCnZhciBfbGVhZmxldCA9IHJlcXVpcmUoIi4vZ2xvYmFsL2xlYWZsZXQiKTsKCnZhciBfbGVhZmxldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sZWFmbGV0KTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9CgovLyBJbiBSTWFya2Rvd24ncyBzZWxmLWNvbnRhaW5lZCBtb2RlLCB3ZSBkb24ndCBoYXZlIGEgd2F5IHRvIGNhcnJ5IGFyb3VuZCB0aGUKLy8gaW1hZ2VzIHRoYXQgTGVhZmxldCBuZWVkcyBidXQgZG9lc24ndCBsb2FkIGludG8gdGhlIHBhZ2UuIEluc3RlYWQsIHdlJ2xsIHNldAovLyBkYXRhIFVSSXMgZm9yIHRoZSBkZWZhdWx0IG1hcmtlciwgYW5kIGxldCBhbnkgb3RoZXJzIGJlIGxvYWRlZCB2aWEgQ0ROLgppZiAodHlwZW9mIF9sZWFmbGV0Mi5kZWZhdWx0Lkljb24uRGVmYXVsdC5pbWFnZVBhdGggPT09ICJ1bmRlZmluZWQiKSB7CiAgX2xlYWZsZXQyLmRlZmF1bHQuSWNvbi5EZWZhdWx0LmltYWdlUGF0aCA9ICJodHRwOi8vY2RuLmxlYWZsZXRqcy5jb20vbGVhZmxldC0wLjcuMy9pbWFnZXMiOwoKICBpZiAoX2xlYWZsZXQyLmRlZmF1bHQuQnJvd3Nlci5yZXRpbmEpIHsKICAgIF9sZWFmbGV0Mi5kZWZhdWx0Lkljb24uRGVmYXVsdC5wcm90b3R5cGUub3B0aW9ucy5pY29uVXJsID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRElBQUFCU0NBWUFBQUFXeTRmckFBQVBpRWxFUVZSNDJ0MWJDVkNVNXhrbWJhYnRaSkpPTytsMG1oZ1QweVFlMFdYWmd6MjU3ME5COEk2SjZVemFUQm9PUlJGRXJ1VkdEaFdVUFJBUVJGRlJFRG5WeEN0RUJSYjI0REJORTNXYWFhdHBrbWx1bzRtK2ZkOXY5OTlvbEdWQkR1M09QTGorLy9zKzcvVzkzL2Y5Ly82L0V3QTQvVDlnM0FsRk9VZWVVR1IydU1xek95SmsyUjJ4MHF5T0Ftbm1rUzNTckNQclpKbEhsc3F6anlwY3M0OU9YMUpmLy9QN0toRDg4NUEwdTEwbXkyb3ZRc2N2eWJJNndFRjhpdkk3cEZudEFWNnFrdzlQV1NCSzFiRW5aUmx0bTJXWjdSOGg0RmJJMFZHMzNHUGdYWGdDQXJhK0E0RUluOEtUNEpIL0ZpZ29pSi9JSXo2VFpiVlZLTExhbjV1MFFFU3Fsa2NrV1czcDBzeTJieERBZ1p3TzEzVER5dG9CK05QZTkremlsZDJERUZHdUI3L05wekRvZHJpRjU1bzBvN1hJUlhYb054TWFpQ1NqOVZVMDlDOEVFTnh5ajBDNHRodGVyaDJFVit2ZXV3T3I2czdEeTNzc29POTNrM2xsenhCRTZQVGdrWGNNT0Y3RUo5S010cWpSOUpGRFFuTlY5YitRcWxxcUVFQ1FaN1RCZ3UxbllkWHVJWGdWbmVTd1l0Y2dSRmIxUTFpRkdVTEx6UkNzTTkwR09yWmdoeGtpS3Z0aGVjMGdyTHBGbHhDdTZjS2gxdzZjSFVTYmN0UGh4OFlsRUVsdTQrTlNWZk5wQkJBQ3RweUdsYnNHbUJPRWxSaE1CRG9mZ2s0R29iT2pRWEM1Q1JaaVVDL1ZEdG40cUxyQkpaM0EyY05nK25FNFAzMVBnU0RCYkltcTVVTkplak1RRnFpN2NDaWNaM2laQlRBQVFWb1RCSTRES0tDVkdCREhINm5yQlJsV3hXcjdzbGpWSWhsVElETFZvUmtTMWVIL1NOSVBnenl6RlJaVjlObkcrK0xxUWN5b0dRTFFnZkZFSUZZcGN1ZUF6YzZTU2lNT3RUWWdIOUNYcitXcFRieFJCZUtscW45VWt0WmtSb0FDWjVQbE84MVlnZk1NNFJYOUVLQXhUU2pDZHZUakVMUFlXMTdkRDhyc2RpQmZFQmNsU1kyUE94UUlIbmxJa25yb0VBSms2VTJ3cE1MSVNGL2FOUVNoV0FWL3RXbFNFSUsyVnFCTnNyMjAwZ1J5R21Mb2t5UzE4Y1RkRnRBN0FuRk5iY3hBQUNHTXJRdERMQWpxQlQrMWNWSkJOc2syK2JCUTF3T2NYNUsweHMxMkE4R3l6WFJOYWZnZUFZRmIzbUVrckJJNEkvbVdHVWVOUUkxbHlwMlBvTzlqNGFES2NINEViZTBFOGczeGd5eWxjYzZ3Z2JpbU5qU1NvRnRXSzFzVHFMUmgyQk0rU09nSWZER0xKTDhJRzNaWmpVWC9WaXl2R1lMRk93ZFpuL2xqWUk3eXpzZWU0VGpjc1YvSVIzRnFRK3RkQXhFbk5TakZ5UWVCRUs3cGdSVm9kRW5WSVBoc056cUVZSzBabHVGc1JucTNZakgyMktKeUE2ejR5VG1TcFo1emxIOFJUdldrdDFDckI4NVBZVXFqengyQnVHNnNQeWZlZUFBOHNqdHdwaGhpQ0ZTYndYdWIwUzdJU1BpT0Fadk80aDA0OHhTZkJNK2NEcERpZUNaT2dnU3o2SkhkQnY1RkozQ042TFBKUjFRTWdPOTIwNGgyYUFMZ2REeHpqbHA0a3c4WWFIS3lCU0pKUGlnV2I2d0hRaVJtYnhrS0wwUURYa2hnRDk0WXhHS3NHc2tUUWt2ZnhWbmxJSEJjQk5ma2Vneml3QjNIQW5IRHVHeW5SWGNwL3V0WFpoclJIaVdNNUNQTGpiZHdIVkRZQWhGdDNKOHJUdG9QYnBrdFNEckU0SU5aOGl3MTJrVVlFcFBzNGtvemVPVzBBM0VRSW92YlljZnhJVGo3OTh2d3hiZlg0T3IxSDhCNDZST283ZndidktZOWJwTnp5MmhtaVNPT3lNckJFZTJSVDV4Lzd0akh4Q0ZLMmwvNFl5QkorOTVIUUFCbWliS3pFSnZSczlSZ0Y0RnFFNU1sZUdTM0F1bUxOKzZENGxZamZJZU9EL2U1ZVJPZzdzejdvRWc3d0hSazZZM1lpLzJNSndUN2JDUzc1QnZKQnVHc1N2cUlEMWdnYUh5ZWFBTWVRRVJneWFqQmczQkc4U2d4REFzdkpGeFVPY0JrZzdkME1sM1hqZnVoQ3l2ZzZPZml4MStBbDZxQjZmcHVlb3R4c2NrRmg1QTkyK1FieWRIdzR2eW1HSnhFRytyV2lSTDNnb0pXY1N3dndiUEVDTzViRGNNaVJHTm1jaFM0YTFJOWtQNjJEaE9NOXRQYWQ0bnBFaGFVZFRQT3NQSit1N2JKTjg1UHBhcUo2WW9UNnhLY1JJbDFwUWp3eEl1a3hYaHlJWTU3TjFTd2g3RHlBU2JybTM4TVNIZFJVU3RjKy80R2pPVVRWMzJhY2JobE5qTk82cFdSN0ZQVGs2eFgzbEdtSzB5czB6cmhuMFpod2g3d0szaWJuVnlnNndlM0xRYTdXRlF4eUdTcGlxUmJlL284alBYVGUrRUs0eERqRUNIT3hkWVJZYzgrK1VoeWZnWEhtYTV3L1o1bUorSDYzVDNDaE4zWTZPL2d1TWN4ajhOR2ljTERnWXlRM0NLY25zVWJNQnVvYTdqNDhaZ0QrZXJxZGN6cWJzWVRwdWxqM0xTdTJQT0JmQ1E1OHBuMEVIMU93b1RhZnd2WDErSlYyVm1JeEV3SGxKbEJzZGt3TEh5Mm1aamNnakk5a0o0WW5iaDYvWHU0bDA5WWZoUGpDc1NKZzdocEliYm5nLzkyTTVNam4wa1BjZGxKR0YvN0pRSkNTcnNnQXNlZUh6b3FMKzRiRm5TZTVFSkt6Z0hwZWFUc2czdjlyQ3J0WUZ6K2hTY1pkekFHWXM4SFg4NEg5Sm4wS0FZblFmeXVJUVQ0WTVtbzBha2lNaFFlRGg0NHRFZ3VYR2NFMGlQODQ1TXZ4eHpFalJzM1FaNVV4M2hDdG5VeGJxcTZQUi84Y1JkQWN1U3oxWWZ6R0VoTm0yQmREZmprdncwTGNUWUtva0NLK29hRkFvbElqaURGQllsMDIvb3VqRG1RQzFjK1p4ekMrQm9JcDJ0MzVIWEhQckRuQS9sSWN1UXo2U0tPT0FuV1Zxc1JiSHNjamlkRE5mMGdSV0Y3Q05YMk0xbDNWVE9RYm1wZDU1Z0RxVDAxeERoa21CVGlKTWhHc0IraXNkclBiR2U2d3JVMTVSakl6a1FFeUhCM0dxWWJZQ0FpU2VId0NNQm1JN21BWWl3dDZnclg3UVQ5aDVkSEhjUS9QL3NLbEVtN0dZZDM3bEhHR2FMdXQydGJpckQ1aVQ2VHJpQ3VLc1ZKc0xyQ3d5V3VpaDJZai91bk1DMlZGbGZzZ3I1aG9keHNaSElFWlZvVGtQNzg3QVB3N1RYSFp5L2FjLzI1ckozcFNwUDI0dFJyWm55ZVcwMTJiYnRaYlM5QWVmS1orYjZtTXRqSlM2VjZHUC96T1Izd0srcGtRbjdiekhiSkNDUkRzcUZsQnB6K2RqSENWN2Eyd01Vci94MHhpTSsrdWdwcnE0NWJuRmhiaGROb0YrTUtMT3QzMkM3NVN2cUliN3hVTzMvRmRyLzh1TXFETG1zcXdVM1ZpcEgyUXpBMmszaFRyMTFJQ25xWkhNbjdGK0hDRklmWlFRNUpmRFZVdlcxbXp2NzA4L1YzMTZGVi93RjRKZTloc2dTdjNHT01ZejcxSmc2YmtlelMwQ041TjFXTGhTT3Vzc1cyalJlc3Juek5aWFVGbTVQblcwbmwyQ2NpVkxRSGViSEJKaDlVMGcxUzNHWVFENGVRakgyUVdIMEMwdXR3MTVEWEFFSXliRDBueG9Vc1lQTVptejRONTlIWUUrSzBTenlDMk1vM2JJSHc0elRUK0t0MzNFU0FYL0ZaQ01Xb3ZVdE1JTXp2SFJGS0pBOUcrVkFHdko3SVBzS0dDM0hkRFlJNHFud3poSlFabVE1bDJBT0RjTVNXYjZtSjZmZ1duK0g0YnN4Yld6WDl0bXQybDlYbDdmelljcHdKR2hsNU1JNVhFU29MOGthR0tCOVhXd3c4eE9vWUlYQnJEM2h2T2duSzlCYkVZZHlwSHNjdFNCY0dZTGJKK0ZNdmJ1cHoyQWFuSjAxdUFQTFZKYWI4OEIwM0gxeGlkS0g4V0IwVENDcTFLTkVNNFlnUkRtN0ZSbHlzK204TDZHNmdKTG1Qa3B1cXhoSlUwc3Q4SkY4Rk1lVitkd1RpcEZMOXpEbEdld21CMXdZZHpKaC9xUmxjY250SERjcWV2QkN2Nk5CWjN4SXorQ0dQNXhZVEtJb01JTVp6bytVVElBSzNXUktnVUxVQitlZ2NyVHMvN0EwNlhwUTIwVGxhaStPNG1tMERLTHVTQWdQd2tXZ3FJY09ra0MrQk9CUmRWbGNDK2NpTDBrVU5HNGpvZGQzdm5LTTEzeUhBSy84VUJHNm5UQnJCT1VjL3BmREJSWko4OGNnOUR1UWJMMXJ6eGR3M3l4NjFleFBiT1Vhemk0UmQ4VnFZTWhCSXd5dW5GNXl6OVZNQ1VWNnZ4UStFQ0pjSDhzMDVTbE15NHQxNDV4aTFqQWtqZkl1N0dJRVN4ellQU2FjQzFHZmtnM2ZoR2JENmRkTWxWdnVDUXovMG9IQWZLY2xTbWlBQUswSk43NXpkQy9PeTlKTUthbkt5VHhCdk9HQUpKRWJkNGZBdlZyeG85VXVreE1mWndidTRod1dpS0RMQ1hDU2ZUTkFVVGJhOUNzNXgxU0Q0T0J3SW00cWpOUU9rS0UxdUJIK2FRa3NzVlptYnFaOFVDTEF2eVM1Qm5MRGYyaHZhRTZQK01aUWZwWW5nc3VCZDJBMStXN0VxQlVaNE1VTS9LWEF2TWpHYkh2bTIzZ0NYYUkxeVREOVBvN0tleldCSkI4RVhwMEFDRDBzK0o2Tm5Ra0d6SkdkUGxGREhCZEkrNXQvWitkR2FRQzRiSHB2T2dnK3V6bkpjSUdlcmVpWVV5a0lqcytXVzIybXJCaTlXTGJxbkp4OXdsdWdrSWxIaWZ2QkdjZ0xOS0xQUTRFU0ErcEN6STRqZnd5MkFqZmY4Q0FkdVd6eTRyTGpubldFR3FGZG1wZmRNQ0tnYVpFT1pjNXFyeGczbldNMjhjWG1vaGhldFBjcXFzbjR2ZUcwMk1jekRtV1ZtV3MrNHdqbXIxOFl2V0ZmTEJWSTNiazhIdWJ4WjVzcFZSWkhUeVF6SnNTb3ZvUEh4aEFLclFkeUtyRk5jRUQvd284cG5qdXZ6V3JnSGF5SnlJWTViejJJVHcxeWNKcDlQN1I0WDhMRENISy9MMmwwc0VINjB0bXJjSHp6alJldDR0TTloVmNrK3hRektOeG5HTFJEcU8rS1VaWjdncW5IZFpZMW14b1E4UVVmamxZd0kxdGFDQnk1WUJLcktjeW5kOXdUcU53dWZFZmhycXExN0tvMTZ3aDRGcFBGSzQ1WnRLRE5PZ25zaFpqRGZBSDlNN3I0bnlQT05qRXVhL2haWGphdjhOelRUSnZUaFRGNlVwcEp0RitKcXdBMk5FMTVVNmVGWmRHZ3NtSnZSeXppVWVCWElYN1BUMmh1YXpSUCtsS2tnYXZzemVNMThqVzBvVmNmQnJZQ3FZb1JuTjNhUEdsdzFpTU0xN2FpMUd0cXZuZC9RL0g1U252dkY3ZjEybGprY3owcHNVbVdCcFNvejBMblJnS3BCdWdxNkw4Q3V4U2tRZGU2a1BjQXNXcU43QW8xK3l6YVVhY2RBc2NrSTBqd0RQSlBVNVRCbWJPeGkvVVc2NHBRT3JqYys1LzFWL2R0SmZSSWJydzBLV0ZWV1YrSHc2R05EWkU2YUhwN2UwT1VRNXFUcm1ZNDhydy80c1JXVzNvalNwazM2SStXem83WS83aHlsK1pKdFhWSTdXSis0NWhyZ2FjejI5QTMyUVRJU3JDRHBpSkxidVdwOE9pdWg4akdZaW9mOGVUSHFERXRWS2tDR21aVlpxekk5c2NzdVNJWmtaWFRmS25ZSHQ4Tk5tTEszRmFReHBiOUdKejVqVmNITWNsV2hyRCtWZUhmUXNKTGtXcW9oVEdybHFuRlo5THJ1a1NsOTdZSVhwVTVrVmNITVN2REtUcHBuaE5tWThXa0pYWGNGblNNWlNZNmUzY08xcnVLeFUvNytDR1VTbmJuQ3RpNGJXakhiT0F2bEdPQXBkUHJKOWJlRGp0RTVraEZzYU9hcThkSHpNYVcvdkMvZTZLR01XbTRmbFlNa3U0Y05uVm1wUGVqOHVkdEExYUJ6cmxsNDdSR2pzL2FHK3ZYNzV0VWt5aWhsMWxLVlpuREZySXV5KzJBYU92OUV2QVgwblk3Uk9aZUVKcTRhRitnM3pQdnFIU3Rlak9Zdmx2R3VBMUZtTnh0Q00xUDE4QWNNZ2pBTHY5TXhZV2FYOVdjQmt0V3V1dTllRnFQTTRtYnZBemJFRWc1aDl0SHBMSU90UCtnN0hlTW5OSExWZUcvSmt2RjdZV3hjMzNqRHFxeTBaaG9FS292ek0xUDBEUFNkanRGdkc1WlZYTFAwdm4xOXozS3JWVHZJSEYzZllISGVDdnJ1SE4vQWJkTk4zUE82OSsxN2lMZ3pqclJ1eDhFbC9Td0lNZzBNOVAzSEc5SHFzUHYraFVyckpYRXZjemorQUFiUngrQWNYODhGMHYxQXZCbktBbmxURzhSbG41LzZMdUxIVzUvem9yVCtEMHdnMXFxOHk1eGZ1ODhDU3lDbkg1aDNkVy9aR1h2ZTh1T01aUldQMG5vOGNJRlk3K1lmc3dVUnJUMzZRTDA5ZmZzTXBwSFllZ1cvUDdDQldIdmxNT0dCZTUvOWp0ZGpZN1I4d2tUYitSOW1lWkE2bjJvSldBQUFBQUJKUlU1RXJrSmdnZz09IjsKICB9IGVsc2UgewogICAgX2xlYWZsZXQyLmRlZmF1bHQuSWNvbi5EZWZhdWx0LnByb3RvdHlwZS5vcHRpb25zLmljb25VcmwgPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCa0FBQUFwQ0FZQUFBREFrNExPQUFBR21rbEVRVlJZdzdWWGVVeVRaeGp2Tm5mRUxGdXlJek9hYmVybU1aRWVRQy9PY2xrTzQ5Q3BPSFhPTEpsL0NBVVJ1WWJRaTNLTGdFaGJyaFoxYUR3bWFvR3FLSUk2b2RBVG1IL3NjREZiZEM3THZGcU9DYytlOTVzMlZHNTBYL0xMbS9mNC9aN25lWS9uZTE4YUFOQ21BcjVFL3haZjF1RE9rVGNHY1dSNmhsOTI0N3RUNVU3WTZTTnZXc0tUNjNQNThxYmZlTEpHOE01cWNnVGtucnZ2cmREYnNUN01sK3R2ODJYNnZWeEpFMzNhUm1nU3lZdGNXVk1xWDk3WXYySnZXMzlVaFJFMkh1eUJMK3QrZ0sxMTE2bHkwNkVlV0ZObEFtSHhsUUUwT01pVjZtUUNTY3VzS1JsaFMzUUxlVkpkbDErMjNoNWRZNEZOQjN0aHJiWWJvcXB0RUZscGhUQzFoU3BKbmJSdnhQNE5XZ3NFNUp5ejg2UU5OaS81cVNVVEd1RmsxZ3U1NHROOXd1SzJ3YzNvK1djMTNSQ21zb0J3RXF6R2Nac3hzdkNTeS85d0pLZjdVV2YxbUVZOEpXZmV3YzY3VVVvRGJEalFDK0ZxSzRRcUxWTUdHUjlkMnd1ckt6cUJrM25xSVQvOXpMeFJSamdaOWJxUWd1YitEZG9lQ0MwM1E4aiswUWhGaEJIUi9lUDNVL3pDbG43VXUraGloSjErYkJOZmZMSXZta3lQMGdwQlpXWVhoS3Vzc0s2bUJ6NUhUNk0xTnFwY3ArbUJDUFhvc1lRZnJla0d2cmpld2Q1OS9HdktDRTdUYksvMDQvWlY1UVpZVldtRHdIMW1GM3hhMlEzcmEzREJDNXZCVDFvUDdQVGo0QzArQ2NMOGM3QzJDdGVqcWh1Q251SVFIYUtIenZjUmZacG55bEZmWHNZSngzcE5Md2hLelJBd0FoRXFHMFNwdXNCSGZBS2t4dzN3NDYyN01QaG9DSDc5OHo3czBabkJKL01FSmJaU2JYUGhFUjJpaDdwMm9rL3pTajJjRUpEZDRDQWUrNVdZbkJDZ1IydXJ1eUV3NnpSb1c2L0RXSi9PZUFQOHBkL0JHdHpPWktwRzhva2UwU1g2R01tUms2R0ZseUFjNTlLMzJPVEVpbklMUkpSY2hhaDhIUXdORDhONDM1WjlaMEZZMUVxdHhVZyswU082UkovbW1YejRWdVMrRHB4WEMzZ1htWndJTDdkQlNINHpLRTUwd0VTZjhxd1ZnclAxRUlsVE81SlA5SWd1MGFleGRoMjhGMWxtQUVHSkdmaDdqRTZFbHlNNVJ3L0ZEY1lKaldoYmVpQllvWU5JcGMyRlQvU0lMaXZwMEYxaXBEV2s0QklFbzJWdW9kRUpVaWZoYmlsdG5OQklYUFVGQ01wdGh0QXlxd3MvQlBsRUYvVmJhSXhFcmR4UHBoc1U3cmNDcDhEb2hDK0d2QklQSlMvdFcyanR2VG1tQWV1Tk84Qk5PWVFlRzhHLzJPekNKM3Erc29ZQjVpNk5oTWFLcjE3RlNhbDdHSUhoZXVWM3VTQ1k4cVlWdUVtMWNPenFkV3I3a3UvUjBCRG9UVCtEVCtvaENNNi9DQ3ZLTEtPNFJJK2RYUGVBdWFNcWtzYUtyWjdMM0ZFNUZJRmJrSWNlZU9aMk9jSE82d0loVGtObzBmZmdqUkd4RXFvZ1hIWVVQSGZXQUMvbEFEcHdHY0xSWTNhZUs0L29SR0NLWWNaWFBWb2VYL2tlbFZZWThkVUdmOFY1RUJSYmdKWFQ1UUlQaFA5ZVBKaTQyOEpLT2lFWWhZWEZCcW91Mkd1aCtwL21FQjEvUmZNdzZyWTdjeGNqVHJuZUkxRnJEeXV6VVNSbTltaXdFSng4RS9nVW1xbHl2SEdrbmVpd0VyUjIxRjN0Tk9LNVRmMHlYYVQrTzdEZ0N2QUxUVUJYZE00WWhDL0lhd1BVKzJQZHVxTXZ1YVI2ZW94U3dVazc1Z2dxc1lKN1ZpY3Nud0dJa1pCU1hLT1V3dzczV0dYeXFQK0oyL2I5YytnaTFZQWcveHB3Y2szZ0p1dWNOcmg1SnZEUHZRcjBXRlhmMHBpeXQ4ZjgvV0kwaFY0cFJ4eGtRWmRKRGZESk5PQW1NMEFnOGp5VDZoejBXR1hXdVA5NFloMmpjZmptWEFHdkhDTXNsUmltREhZdUh1RHN5MlF0SHVJYXZ6bmhiWVVScTVSNTdLcHpCQlJaS1BKaThlUWc0OGg0ajhTRGRvd2lmZElyRVZkVStnYk82UU52UlJ0NFpCdGhVYVpoVW5qbFlPYk5hZ1Yza2VvZXJ1M3JVN3JjdWNlcVUxbUpCeHkrQldaWWxORUJIKzBlSDR2UmlCK09ZeWJVMmhuYmxZbFR2a0hpbk00bTU0WW54U3lhWllTRjZSM2p3Z1A3dWRLTEdJWDZyL2xiTmE5TjZ5NU1GeW5qV0R0ckhkNzVadlRZQVBPLzZSZ0Ywazc2bVFsYTNGR3E3ZE8rY0g4c0tuMFZvN25EbGx3QWhxd0xQa3hySHdXbUhKT28rQUtKNHJhYjVPZ3JNN3JWdThlV2IyUHUwRGg0ZURnWG9PZnZwN1k3UWVxa25SbXZjVEJFeXE5bS9IUVFTQ1N6NkxIcTN6MHl6c055U1JmTVMyNTN3bDJLeVJEYmNaUGNmSktqWm1TRU9qY3h5aStZOGRVT3RzSUVINlIyd055a2RxcmtZSjBSVjkySDBXNThwa2ZRazdjS2V2c0xLMTBQeThTZE1HZlhOWEFUWStwUGJ5SlIvRVQ2bjluSWZ6dE50WllSVjlYbmlRdTlJQTJ2T1ZneTRpcjdHQ0xWbW1kK3pqa0gwZUFGOVBvNks2MXBtQ1hIeFU1ckhNWWQxZnRjM293andSU1ZSekxqS3ZxWkV0eTZjUlVEN2pHcWlPZHU1SEc2TWRIak5jTllHcWZEbTVZUnpMQkJDQ0RsLzJiazhhOGdkYnFjZndFQ3U2MkZnL0hyZ2dBQUFBQkpSVTVFcmtKZ2dnPT0iOwogIH0KfQoKCn0seyIuL2dsb2JhbC9sZWFmbGV0Ijo4fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmRlZmF1bHQgPSBnbG9iYWwuSFRNTFdpZGdldHM7CgoKfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCn0se31dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0cy5kZWZhdWx0ID0gZ2xvYmFsLmpRdWVyeTsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7fV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmRlZmF1bHQgPSBnbG9iYWwuTDsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmRlZmF1bHQgPSBnbG9iYWwuTC5Qcm9qOwoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHt9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmRlZmF1bHQgPSBnbG9iYWwuU2hpbnk7CgoKfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCn0se31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKdmFyIF9qcXVlcnkgPSByZXF1aXJlKCIuL2dsb2JhbC9qcXVlcnkiKTsKCnZhciBfanF1ZXJ5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2pxdWVyeSk7Cgp2YXIgX2xlYWZsZXQgPSByZXF1aXJlKCIuL2dsb2JhbC9sZWFmbGV0Iik7Cgp2YXIgX2xlYWZsZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbGVhZmxldCk7Cgp2YXIgX3NoaW55ID0gcmVxdWlyZSgiLi9nbG9iYWwvc2hpbnkiKTsKCnZhciBfc2hpbnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hpbnkpOwoKdmFyIF9odG1sd2lkZ2V0cyA9IHJlcXVpcmUoIi4vZ2xvYmFsL2h0bWx3aWRnZXRzIik7Cgp2YXIgX2h0bWx3aWRnZXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h0bWx3aWRnZXRzKTsKCnZhciBfdXRpbCA9IHJlcXVpcmUoIi4vdXRpbCIpOwoKdmFyIF9jcnNfdXRpbHMgPSByZXF1aXJlKCIuL2Nyc191dGlscyIpOwoKdmFyIF9jb250cm9sU3RvcmUgPSByZXF1aXJlKCIuL2NvbnRyb2wtc3RvcmUiKTsKCnZhciBfY29udHJvbFN0b3JlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnRyb2xTdG9yZSk7Cgp2YXIgX2xheWVyTWFuYWdlciA9IHJlcXVpcmUoIi4vbGF5ZXItbWFuYWdlciIpOwoKdmFyIF9sYXllck1hbmFnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbGF5ZXJNYW5hZ2VyKTsKCnZhciBfbWV0aG9kcyA9IHJlcXVpcmUoIi4vbWV0aG9kcyIpOwoKdmFyIF9tZXRob2RzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21ldGhvZHMpOwoKcmVxdWlyZSgiLi9maXh1cC1kZWZhdWx0LWljb24iKTsKCnZhciBfZGF0YWZyYW1lID0gcmVxdWlyZSgiLi9kYXRhZnJhbWUiKTsKCnZhciBfZGF0YWZyYW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RhdGFmcmFtZSk7Cgp2YXIgX2NsdXN0ZXJMYXllclN0b3JlID0gcmVxdWlyZSgiLi9jbHVzdGVyLWxheWVyLXN0b3JlIik7Cgp2YXIgX2NsdXN0ZXJMYXllclN0b3JlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsdXN0ZXJMYXllclN0b3JlKTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9Cgp3aW5kb3cuTGVhZmxldFdpZGdldCA9IHt9Owp3aW5kb3cuTGVhZmxldFdpZGdldC51dGlscyA9IHt9Owp2YXIgbWV0aG9kcyA9IHdpbmRvdy5MZWFmbGV0V2lkZ2V0Lm1ldGhvZHMgPSBfanF1ZXJ5Mi5kZWZhdWx0LmV4dGVuZCh7fSwgX21ldGhvZHMyLmRlZmF1bHQpOwp3aW5kb3cuTGVhZmxldFdpZGdldC5EYXRhRnJhbWUgPSBfZGF0YWZyYW1lMi5kZWZhdWx0Owp3aW5kb3cuTGVhZmxldFdpZGdldC5DbHVzdGVyTGF5ZXJTdG9yZSA9IF9jbHVzdGVyTGF5ZXJTdG9yZTIuZGVmYXVsdDsKd2luZG93LkxlYWZsZXRXaWRnZXQudXRpbHMuZ2V0Q1JTID0gX2Nyc191dGlscy5nZXRDUlM7CgovLyBTZW5kIHVwZGF0ZWQgYm91bmRzIGJhY2sgdG8gYXBwLiBUYWtlcyBhIGxlYWZsZXQgZXZlbnQgb2JqZWN0IGFzIGlucHV0LgpmdW5jdGlvbiB1cGRhdGVCb3VuZHMobWFwKSB7CiAgdmFyIGlkID0gbWFwLmdldENvbnRhaW5lcigpLmlkOwogIHZhciBib3VuZHMgPSBtYXAuZ2V0Qm91bmRzKCk7CgogIF9zaGlueTIuZGVmYXVsdC5vbklucHV0Q2hhbmdlKGlkICsgIl9ib3VuZHMiLCB7CiAgICBub3J0aDogYm91bmRzLmdldE5vcnRoRWFzdCgpLmxhdCwKICAgIGVhc3Q6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sbmcsCiAgICBzb3V0aDogYm91bmRzLmdldFNvdXRoV2VzdCgpLmxhdCwKICAgIHdlc3Q6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcKICB9KTsKICBfc2hpbnkyLmRlZmF1bHQub25JbnB1dENoYW5nZShpZCArICJfY2VudGVyIiwgewogICAgbG5nOiBtYXAuZ2V0Q2VudGVyKCkubG5nLAogICAgbGF0OiBtYXAuZ2V0Q2VudGVyKCkubGF0CiAgfSk7CiAgX3NoaW55Mi5kZWZhdWx0Lm9uSW5wdXRDaGFuZ2UoaWQgKyAiX3pvb20iLCBtYXAuZ2V0Wm9vbSgpKTsKfQoKZnVuY3Rpb24gcHJldmVudFVuaW50ZW5kZWRab29tT25TY3JvbGwobWFwKSB7CiAgLy8gUHJldmVudCB1bndhbnRlZCBzY3JvbGwgY2FwdHVyaW5nLiBTaW1pbGFyIGluIHB1cnBvc2UgdG8KICAvLyBodHRwczovL2dpdGh1Yi5jb20vQ2xpZmZDbG91ZC9MZWFmbGV0LlNsZWVwIGJ1dCB3aXRoIGEKICAvLyBkaWZmZXJlbnQgc2V0IG9mIGhldXJpc3RpY3MuCgogIC8vIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgd2hlbiBhIG1vdXNld2hlZWwvRE9NTW91c2VTY3JvbGwKICAvLyBldmVudCBpcyBzZWVuLCB3ZSBkaXNhYmxlIHNjcm9sbCB3aGVlbCB6b29taW5nIHVudGlsIHRoZQogIC8vIHVzZXIgbW92ZXMgdGhlaXIgbW91c2UgY3Vyc29yIG9yIGNsaWNrcyBvbiB0aGUgbWFwLiBUaGlzCiAgLy8gaXMgc2xpZ2h0bHkgdHJpY2tpZXIgdGhhbiBqdXN0IGxpc3RlbmluZyBmb3IgbW91c2Vtb3ZlLAogIC8vIGJlY2F1c2UgbW91c2Vtb3ZlIGlzIGZpcmVkIHdoZW4gdGhlIHBhZ2UgaXMgc2Nyb2xsZWQsCiAgLy8gZXZlbiBpZiB0aGUgdXNlciBkaWQgbm90IHBoeXNpY2FsbHkgbW92ZSB0aGUgbW91c2UuIFdlCiAgLy8gaGFuZGxlIHRoaXMgYnkgZXhhbWluaW5nIHRoZSBtb3VzZW1vdmUgZXZlbnQncyBzY3JlZW5YCiAgLy8gYW5kIHNjcmVlblkgcHJvcGVydGllczsgaWYgdGhleSBjaGFuZ2UsIHdlIGtub3cgaXQncyBhCiAgLy8gInRydWUiIG1vdmUuCgogIC8vIGxhc3RTY3JlZW4gY2FuIG5ldmVyIGJlIG51bGwsIGJ1dCBpdHMgeCBhbmQgeSBjYW4uCiAgdmFyIGxhc3RTY3JlZW4gPSB7IHg6IG51bGwsIHk6IG51bGwgfTsKICAoMCwgX2pxdWVyeTIuZGVmYXVsdCkoZG9jdW1lbnQpLm9uKCJtb3VzZXdoZWVsIERPTU1vdXNlU2Nyb2xsIiwgIioiLCBmdW5jdGlvbiAoZSkgewogICAgLy8gRGlzYWJsZSB6b29taW5nICh1bnRpbCB0aGUgbW91c2UgbW92ZXMgb3IgY2xpY2spCiAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmRpc2FibGUoKTsKICAgIC8vIEFueSBtb3VzZW1vdmUgZXZlbnRzIGF0IHRoaXMgc2NyZWVuIHBvc2l0aW9uIHdpbGwgYmUgaWdub3JlZC4KICAgIGxhc3RTY3JlZW4gPSB7IHg6IGUub3JpZ2luYWxFdmVudC5zY3JlZW5YLCB5OiBlLm9yaWdpbmFsRXZlbnQuc2NyZWVuWSB9OwogIH0pOwogICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShkb2N1bWVudCkub24oIm1vdXNlbW92ZSIsICIqIiwgZnVuY3Rpb24gKGUpIHsKICAgIC8vIERpZCB0aGUgbW91c2UgcmVhbGx5IG1vdmU/CiAgICBpZiAobGFzdFNjcmVlbi54ICE9PSBudWxsICYmIGUuc2NyZWVuWCAhPT0gbGFzdFNjcmVlbi54IHx8IGUuc2NyZWVuWSAhPT0gbGFzdFNjcmVlbi55KSB7CiAgICAgIC8vIEl0IHJlYWxseSBtb3ZlZC4gRW5hYmxlIHpvb21pbmcuCiAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7CiAgICAgIGxhc3RTY3JlZW4gPSB7IHg6IG51bGwsIHk6IG51bGwgfTsKICAgIH0KICB9KTsKICAoMCwgX2pxdWVyeTIuZGVmYXVsdCkoZG9jdW1lbnQpLm9uKCJtb3VzZWRvd24iLCAiLmxlYWZsZXQiLCBmdW5jdGlvbiAoZSkgewogICAgLy8gQ2xpY2tpbmcgYWx3YXlzIGVuYWJsZXMgem9vbWluZy4KICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7CiAgICBsYXN0U2NyZWVuID0geyB4OiBudWxsLCB5OiBudWxsIH07CiAgfSk7Cn0KCl9odG1sd2lkZ2V0czIuZGVmYXVsdC53aWRnZXQoewoKICBuYW1lOiAibGVhZmxldCIsCiAgdHlwZTogIm91dHB1dCIsCiAgZmFjdG9yeTogZnVuY3Rpb24gZmFjdG9yeShlbCwgd2lkdGgsIGhlaWdodCkgewoKICAgIHZhciBtYXAgPSBudWxsOwoKICAgIHJldHVybiB7CgogICAgICAvLyB3ZSBuZWVkIHRvIHN0b3JlIG91ciBtYXAgaW4gb3VyIHJldHVybmVkIG9iamVjdC4KICAgICAgZ2V0TWFwOiBmdW5jdGlvbiBnZXRNYXAoKSB7CiAgICAgICAgcmV0dXJuIG1hcDsKICAgICAgfSwKCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbiByZW5kZXJWYWx1ZShkYXRhKSB7CgogICAgICAgIC8vIENyZWF0ZSBhbiBhcHByb3ByaWF0ZSBDUlMgT2JqZWN0IGlmIHNwZWNpZmllZAoKICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLm9wdGlvbnMgJiYgZGF0YS5vcHRpb25zLmNycykgewogICAgICAgICAgZGF0YS5vcHRpb25zLmNycyA9ICgwLCBfY3JzX3V0aWxzLmdldENSUykoZGF0YS5vcHRpb25zLmNycyk7CiAgICAgICAgfQoKICAgICAgICAvLyBBcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vbGVhZmxldC9wdWxsLzI5NCNkaXNjdXNzaW9uX3I3OTU4NDgxMAogICAgICAgIGlmIChtYXApIHsKICAgICAgICAgIG1hcC5yZW1vdmUoKTsKICAgICAgICAgIG1hcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSgpOyAvLyB1bmRlZmluZSBtYXAKICAgICAgICB9CgogICAgICAgIGlmIChkYXRhLm9wdGlvbnMubWFwRmFjdG9yeSAmJiB0eXBlb2YgZGF0YS5vcHRpb25zLm1hcEZhY3RvcnkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIG1hcCA9IGRhdGEub3B0aW9ucy5tYXBGYWN0b3J5KGVsLCBkYXRhLm9wdGlvbnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXAgPSBfbGVhZmxldDIuZGVmYXVsdC5tYXAoZWwsIGRhdGEub3B0aW9ucyk7CiAgICAgICAgfQoKICAgICAgICBwcmV2ZW50VW5pbnRlbmRlZFpvb21PblNjcm9sbChtYXApOwoKICAgICAgICAvLyBTdG9yZSBzb21lIHN0YXRlIGluIHRoZSBtYXAgb2JqZWN0CiAgICAgICAgbWFwLmxlYWZsZXRyID0gewogICAgICAgICAgLy8gSGFzIHRoZSBtYXAgZXZlciByZW5kZXJlZCBzdWNjZXNzZnVsbHk/CiAgICAgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCiAgICAgICAgICAvLyBEYXRhIHRvIGJlIHJlbmRlcmVkIHdoZW4gcmVzaXplIGlzIGNhbGxlZCB3aXRoIGFyZWEgIT0gMAogICAgICAgICAgcGVuZGluZ1JlbmRlckRhdGE6IG51bGwKICAgICAgICB9OwoKICAgICAgICAvLyBDaGVjayBpZiB0aGUgbWFwIGlzIHJlbmRlcmVkIHN0YXRpY2FsbHkgKG5vIG91dHB1dCBiaW5kaW5nKQogICAgICAgIGlmIChfaHRtbHdpZGdldHMyLmRlZmF1bHQuc2hpbnlNb2RlICYmIC9cYnNoaW55LWJvdW5kLW91dHB1dFxiLy50ZXN0KGVsLmNsYXNzTmFtZSkpIHsKICAgICAgICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICBtYXAuaWQgPSBlbC5pZDsKCiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBtYXAgb24gdGhlIGVsZW1lbnQgc28gd2UgY2FuIGZpbmQgaXQgbGF0ZXIgYnkgSUQKICAgICAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGVsKS5kYXRhKCJsZWFmbGV0LW1hcCIsIG1hcCk7CgogICAgICAgICAgICAvLyBXaGVuIHRoZSBtYXAgaXMgY2xpY2tlZCwgc2VuZCB0aGUgY29vcmRpbmF0ZXMgYmFjayB0byB0aGUgYXBwCiAgICAgICAgICAgIG1hcC5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIF9zaGlueTIuZGVmYXVsdC5vbklucHV0Q2hhbmdlKG1hcC5pZCArICJfY2xpY2siLCB7CiAgICAgICAgICAgICAgICBsYXQ6IGUubGF0bG5nLmxhdCwKICAgICAgICAgICAgICAgIGxuZzogZS5sYXRsbmcubG5nLAogICAgICAgICAgICAgICAgIi5ub25jZSI6IE1hdGgucmFuZG9tKCkgLy8gRm9yY2UgcmVhY3Rpdml0eSBpZiBsYXQvbG5nIGhhc24ndCBjaGFuZ2VkCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdmFyIGdyb3VwVGltZXJJZCA9IG51bGw7CgogICAgICAgICAgICBtYXAub24oIm1vdmVlbmQiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhlLnRhcmdldCk7CiAgICAgICAgICAgIH0pLm9uKCJsYXllcmFkZCBsYXllcnJlbW92ZSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgLy8gSWYgdGhlIGxheWVyIHRoYXQncyBjb21pbmcgb3IgZ29pbmcgaXMgYSBncm91cCB3ZSBjcmVhdGVkLCB0ZWxsCiAgICAgICAgICAgICAgLy8gdGhlIHNlcnZlci4KICAgICAgICAgICAgICBpZiAobWFwLmxheWVyTWFuYWdlci5nZXRHcm91cE5hbWVGcm9tTGF5ZXJHcm91cChlLmxheWVyKSkgewogICAgICAgICAgICAgICAgLy8gQnV0IHRvIGF2b2lkIGNoYXR0aW5lc3MsIGNvYWxlc2NlIGV2ZW50cwogICAgICAgICAgICAgICAgaWYgKGdyb3VwVGltZXJJZCkgewogICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZ3JvdXBUaW1lcklkKTsKICAgICAgICAgICAgICAgICAgZ3JvdXBUaW1lcklkID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyb3VwVGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICBncm91cFRpbWVySWQgPSBudWxsOwogICAgICAgICAgICAgICAgICBfc2hpbnkyLmRlZmF1bHQub25JbnB1dENoYW5nZShtYXAuaWQgKyAiX2dyb3VwcyIsIG1hcC5sYXllck1hbmFnZXIuZ2V0VmlzaWJsZUdyb3VwcygpKTsKICAgICAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZG9SZW5kZXJWYWx1ZShkYXRhLCBtYXApOwogICAgICB9LAogICAgICBkb1JlbmRlclZhbHVlOiBmdW5jdGlvbiBkb1JlbmRlclZhbHVlKGRhdGEsIG1hcCkgewogICAgICAgIC8vIExlYWZsZXQgZG9lcyBub3QgYmVoYXZlIHdlbGwgd2hlbiB5b3Ugc2V0IHVwIGEgYnVuY2ggb2YgbGF5ZXJzIHdoZW4KICAgICAgICAvLyB0aGUgbWFwIGlzIG5vdCB2aXNpYmxlICh3aWR0aC9oZWlnaHQgPT0gMCkuIFBvcHVwcyBnZXQgbWlzYWxpZ25lZAogICAgICAgIC8vIHJlbGF0aXZlIHRvIHRoZWlyIG93bmluZyBtYXJrZXJzLCBhbmQgdGhlIGZpdEJvdW5kcyBjYWxjdWxhdGlvbnMKICAgICAgICAvLyBhcmUgb2ZmLiBUaGVyZWZvcmUgd2Ugd2FpdCB1bnRpbCB0aGUgbWFwIGlzIGFjdHVhbGx5IHNob3dpbmcgdG8KICAgICAgICAvLyByZW5kZXIgdGhlIHZhbHVlICh3ZSByZWx5IG9uIHRoZSByZXNpemUoKSBjYWxsYmFjayBiZWluZyBpbnZva2VkCiAgICAgICAgLy8gYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUpLgogICAgICAgIC8vCiAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGFuIGlzc3VlIHdpdGggbGVhZmxldFByb3h5KCkgY2FsbHMgYmVpbmcgbWFkZSB3aGlsZQogICAgICAgIC8vIHRoZSBtYXAgaXMgbm90IGJlaW5nIHZpZXdlZC0tbm90IHN1cmUgd2hhdCB0aGUgcmlnaHQgc29sdXRpb24gaXMKICAgICAgICAvLyB0aGVyZS4KICAgICAgICBpZiAoZWwub2Zmc2V0V2lkdGggPT09IDAgfHwgZWwub2Zmc2V0SGVpZ2h0ID09PSAwKSB7CiAgICAgICAgICBtYXAubGVhZmxldHIucGVuZGluZ1JlbmRlckRhdGEgPSBkYXRhOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBtYXAubGVhZmxldHIucGVuZGluZ1JlbmRlckRhdGEgPSBudWxsOwoKICAgICAgICAvLyBNZXJnZSBkYXRhIG9wdGlvbnMgaW50byBkZWZhdWx0cwogICAgICAgIHZhciBvcHRpb25zID0gX2pxdWVyeTIuZGVmYXVsdC5leHRlbmQoeyB6b29tVG9MaW1pdHM6ICJhbHdheXMiIH0sIGRhdGEub3B0aW9ucyk7CgogICAgICAgIGlmICghbWFwLmxheWVyTWFuYWdlcikgewogICAgICAgICAgbWFwLmNvbnRyb2xzID0gbmV3IF9jb250cm9sU3RvcmUyLmRlZmF1bHQobWFwKTsKICAgICAgICAgIG1hcC5sYXllck1hbmFnZXIgPSBuZXcgX2xheWVyTWFuYWdlcjIuZGVmYXVsdChtYXApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXAuY29udHJvbHMuY2xlYXIoKTsKICAgICAgICAgIG1hcC5sYXllck1hbmFnZXIuY2xlYXIoKTsKICAgICAgICB9CgogICAgICAgIHZhciBleHBsaWNpdFZpZXcgPSBmYWxzZTsKICAgICAgICBpZiAoZGF0YS5zZXRWaWV3KSB7CiAgICAgICAgICBleHBsaWNpdFZpZXcgPSB0cnVlOwogICAgICAgICAgbWFwLnNldFZpZXcuYXBwbHkobWFwLCBkYXRhLnNldFZpZXcpOwogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5maXRCb3VuZHMpIHsKICAgICAgICAgIGV4cGxpY2l0VmlldyA9IHRydWU7CiAgICAgICAgICBtZXRob2RzLmZpdEJvdW5kcy5hcHBseShtYXAsIGRhdGEuZml0Qm91bmRzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEub3B0aW9ucy5jZW50ZXIpIHsKICAgICAgICAgIGV4cGxpY2l0VmlldyA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHpvb21Ub0xpbWl0cyBvcHRpb24gc2F5cyB0aGF0IHRoZSBtYXAgc2hvdWxkIGJlCiAgICAgICAgLy8gem9vbWVkIHRvIG1hcCBlbGVtZW50cy4KICAgICAgICBmdW5jdGlvbiBuZWVkc1pvb20oKSB7CiAgICAgICAgICByZXR1cm4gb3B0aW9ucy56b29tVG9MaW1pdHMgPT09ICJhbHdheXMiIHx8IG9wdGlvbnMuem9vbVRvTGltaXRzID09PSAiZmlyc3QiICYmICFtYXAubGVhZmxldHIuaGFzUmVuZGVyZWQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWV4cGxpY2l0VmlldyAmJiBuZWVkc1pvb20oKSAmJiAhbWFwLmdldFpvb20oKSkgewogICAgICAgICAgaWYgKGRhdGEubGltaXRzICYmICFfanF1ZXJ5Mi5kZWZhdWx0LmlzRW1wdHlPYmplY3QoZGF0YS5saW1pdHMpKSB7CiAgICAgICAgICAgIC8vIFVzZSB0aGUgbmF0dXJhbCBsaW1pdHMgb2Ygd2hhdCdzIGJlaW5nIGRyYXduIG9uIHRoZSBtYXAKICAgICAgICAgICAgLy8gSWYgdGhlIHNpemUgb2YgdGhlIGJvdW5kaW5nIGJveCBpcyAwLCBsZWFmbGV0IGdldHMgYWxsIHdlaXJkCiAgICAgICAgICAgIHZhciBwYWQgPSAwLjAwNjsKICAgICAgICAgICAgaWYgKGRhdGEubGltaXRzLmxhdFswXSA9PT0gZGF0YS5saW1pdHMubGF0WzFdKSB7CiAgICAgICAgICAgICAgZGF0YS5saW1pdHMubGF0WzBdID0gZGF0YS5saW1pdHMubGF0WzBdIC0gcGFkOwogICAgICAgICAgICAgIGRhdGEubGltaXRzLmxhdFsxXSA9IGRhdGEubGltaXRzLmxhdFsxXSArIHBhZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YS5saW1pdHMubG5nWzBdID09PSBkYXRhLmxpbWl0cy5sbmdbMV0pIHsKICAgICAgICAgICAgICBkYXRhLmxpbWl0cy5sbmdbMF0gPSBkYXRhLmxpbWl0cy5sbmdbMF0gLSBwYWQ7CiAgICAgICAgICAgICAgZGF0YS5saW1pdHMubG5nWzFdID0gZGF0YS5saW1pdHMubG5nWzFdICsgcGFkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hcC5maXRCb3VuZHMoW1tkYXRhLmxpbWl0cy5sYXRbMF0sIGRhdGEubGltaXRzLmxuZ1swXV0sIFtkYXRhLmxpbWl0cy5sYXRbMV0sIGRhdGEubGltaXRzLmxuZ1sxXV1dKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1hcC5maXRXb3JsZCgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuY2FsbHMgJiYgaSA8IGRhdGEuY2FsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBjYWxsID0gZGF0YS5jYWxsc1tpXTsKICAgICAgICAgIGlmIChtZXRob2RzW2NhbGwubWV0aG9kXSkgbWV0aG9kc1tjYWxsLm1ldGhvZF0uYXBwbHkobWFwLCBjYWxsLmFyZ3MpO2Vsc2UgKDAsIF91dGlsLmxvZykoIlVua25vd24gbWV0aG9kICIgKyBjYWxsLm1ldGhvZCk7CiAgICAgICAgfQoKICAgICAgICBtYXAubGVhZmxldHIuaGFzUmVuZGVyZWQgPSB0cnVlOwoKICAgICAgICBpZiAoX2h0bWx3aWRnZXRzMi5kZWZhdWx0LnNoaW55TW9kZSkgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhtYXApOwogICAgICAgICAgfSwgMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICByZXNpemU6IGZ1bmN0aW9uIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgaWYgKG1hcCkgewogICAgICAgICAgbWFwLmludmFsaWRhdGVTaXplKCk7CiAgICAgICAgICBpZiAobWFwLmxlYWZsZXRyLnBlbmRpbmdSZW5kZXJEYXRhKSB7CiAgICAgICAgICAgIHRoaXMuZG9SZW5kZXJWYWx1ZShtYXAubGVhZmxldHIucGVuZGluZ1JlbmRlckRhdGEsIG1hcCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgppZiAoX2h0bWx3aWRnZXRzMi5kZWZhdWx0LnNoaW55TW9kZSkgewogIF9zaGlueTIuZGVmYXVsdC5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigibGVhZmxldC1jYWxscyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICB2YXIgaWQgPSBkYXRhLmlkOwogICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgdmFyIG1hcCA9IGVsID8gKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGVsKS5kYXRhKCJsZWFmbGV0LW1hcCIpIDogbnVsbDsKICAgIGlmICghbWFwKSB7CiAgICAgICgwLCBfdXRpbC5sb2cpKCJDb3VsZG4ndCBmaW5kIG1hcCB3aXRoIGlkICIgKyBpZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuY2FsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNhbGwgPSBkYXRhLmNhbGxzW2ldOwogICAgICBpZiAoY2FsbC5kZXBlbmRlbmNpZXMpIHsKICAgICAgICBfc2hpbnkyLmRlZmF1bHQucmVuZGVyRGVwZW5kZW5jaWVzKGNhbGwuZGVwZW5kZW5jaWVzKTsKICAgICAgfQogICAgICBpZiAobWV0aG9kc1tjYWxsLm1ldGhvZF0pIG1ldGhvZHNbY2FsbC5tZXRob2RdLmFwcGx5KG1hcCwgY2FsbC5hcmdzKTtlbHNlICgwLCBfdXRpbC5sb2cpKCJVbmtub3duIG1ldGhvZCAiICsgY2FsbC5tZXRob2QpOwogICAgfQogIH0pOwp9CgoKfSx7Ii4vY2x1c3Rlci1sYXllci1zdG9yZSI6MSwiLi9jb250cm9sLXN0b3JlIjoyLCIuL2Nyc191dGlscyI6MywiLi9kYXRhZnJhbWUiOjQsIi4vZml4dXAtZGVmYXVsdC1pY29uIjo1LCIuL2dsb2JhbC9odG1sd2lkZ2V0cyI6NiwiLi9nbG9iYWwvanF1ZXJ5Ijo3LCIuL2dsb2JhbC9sZWFmbGV0Ijo4LCIuL2dsb2JhbC9zaGlueSI6MTAsIi4vbGF5ZXItbWFuYWdlciI6MTIsIi4vbWV0aG9kcyI6MTMsIi4vdXRpbCI6MTV9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwoKdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7Cgp2YXIgX2pxdWVyeSA9IHJlcXVpcmUoIi4vZ2xvYmFsL2pxdWVyeSIpOwoKdmFyIF9qcXVlcnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfanF1ZXJ5KTsKCnZhciBfbGVhZmxldCA9IHJlcXVpcmUoIi4vZ2xvYmFsL2xlYWZsZXQiKTsKCnZhciBfbGVhZmxldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sZWFmbGV0KTsKCnZhciBfdXRpbCA9IHJlcXVpcmUoIi4vdXRpbCIpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKdmFyIExheWVyTWFuYWdlciA9IGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBMYXllck1hbmFnZXIobWFwKSB7CiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGF5ZXJNYW5hZ2VyKTsKCiAgICB0aGlzLl9tYXAgPSBtYXA7CgogICAgLy8gQkVHSU4gbGF5ZXIgaW5kaWNlcwoKICAgIC8vIHs8Z3JvdXBuYW1lPjogezxzdGFtcD46IGxheWVyfX0KICAgIHRoaXMuX2J5R3JvdXAgPSB7fTsKICAgIC8vIHs8Y2F0ZWdvcnlOYW1lPjogezxzdGFtcD46IGxheWVyfX0KICAgIHRoaXMuX2J5Q2F0ZWdvcnkgPSB7fTsKICAgIC8vIHs8Y2F0ZWdvcnlOYW1lX2xheWVySWQ+OiBsYXllcn0KICAgIHRoaXMuX2J5TGF5ZXJJZCA9IHt9OwogICAgLy8gezxzdGFtcD46IHsKICAgIC8vICAgICAgICAgICAgICJncm91cCI6IDxncm91cG5hbWU+LAogICAgLy8gICAgICAgICAgICAgImxheWVySWQiOiA8bGF5ZXJJZD4sCiAgICAvLyAgICAgICAgICAgICAiY2F0ZWdvcnkiOiA8Y2F0ZWdvcnk+LAogICAgLy8gICAgICAgICAgICAgImNvbnRhaW5lciI6IDxjb250YWluZXI+CiAgICAvLyAgICAgICAgICAgfQogICAgLy8gfQogICAgdGhpcy5fYnlTdGFtcCA9IHt9OwogICAgLy8gezxjcm9zc3RhbGtHcm91cE5hbWU+OiB7PGtleT46IFs8c3RhbXA+LCA8c3RhbXA+LCAuLi5dLCAuLi59fQogICAgdGhpcy5fYnlDcm9zc3RhbGtHcm91cCA9IHt9OwoKICAgIC8vIEVORCBsYXllciBpbmRpY2VzCgogICAgLy8gezxjYXRlZ29yeU5hbWU+OiBMLmxheWVyR3JvdXB9CiAgICB0aGlzLl9jYXRlZ29yeUNvbnRhaW5lcnMgPSB7fTsKICAgIC8vIHs8Z3JvdXBOYW1lPjogTC5sYXllckdyb3VwfQogICAgdGhpcy5fZ3JvdXBDb250YWluZXJzID0ge307CiAgfQoKICBfY3JlYXRlQ2xhc3MoTGF5ZXJNYW5hZ2VyLCBbewogICAga2V5OiAiYWRkTGF5ZXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGFkZExheWVyKGxheWVyLCBjYXRlZ29yeSwgbGF5ZXJJZCwgZ3JvdXAsIGN0R3JvdXAsIGN0S2V5KSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAvLyBXYXMgYSBncm91cCBwcm92aWRlZD8KICAgICAgdmFyIGhhc0lkID0gdHlwZW9mIGxheWVySWQgPT09ICJzdHJpbmciOwogICAgICB2YXIgZ3JvdXBlZCA9IHR5cGVvZiBncm91cCA9PT0gInN0cmluZyI7CgogICAgICB2YXIgc3RhbXAgPSBfbGVhZmxldDIuZGVmYXVsdC5VdGlsLnN0YW1wKGxheWVyKTsKCiAgICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgZGVmYXVsdCBsYXllciBncm91cCB0byBhZGQgdGhlIGxheWVyIHRvLgogICAgICAvLyBXZSBtYXkgb3ZlcndyaXRlIHRoaXMgbGV0IGJlZm9yZSB1c2luZyBpdCAoaS5lLiBpZiBhIGdyb3VwIGlzIGFzc2lnbmVkKS4KICAgICAgLy8gVGhpcyBvbmUgbGluZXIgY3JlYXRlcyB0aGUgX2NhdGVnb3J5Q29udGFpbmVyc1tjYXRlZ29yeV0gZW50cnkgaWYgaXQKICAgICAgLy8gZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fY2F0ZWdvcnlDb250YWluZXJzW2NhdGVnb3J5XSA9IHRoaXMuX2NhdGVnb3J5Q29udGFpbmVyc1tjYXRlZ29yeV0gfHwgX2xlYWZsZXQyLmRlZmF1bHQubGF5ZXJHcm91cCgpLmFkZFRvKHRoaXMuX21hcCk7CgogICAgICB2YXIgb2xkTGF5ZXIgPSBudWxsOwogICAgICBpZiAoaGFzSWQpIHsKICAgICAgICAvLyBGaXJzdCwgcmVtb3ZlIGFueSBsYXllciB3aXRoIHRoZSBzYW1lIGNhdGVnb3J5IGFuZCBsYXllcklkCiAgICAgICAgdmFyIHByZWZpeGVkTGF5ZXJJZCA9IHRoaXMuX2xheWVySWRLZXkoY2F0ZWdvcnksIGxheWVySWQpOwogICAgICAgIG9sZExheWVyID0gdGhpcy5fYnlMYXllcklkW3ByZWZpeGVkTGF5ZXJJZF07CiAgICAgICAgaWYgKG9sZExheWVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVMYXllcihvbGRMYXllcik7CiAgICAgICAgfQoKICAgICAgICAvLyBVcGRhdGUgbGF5ZXJJZCBpbmRleAogICAgICAgIHRoaXMuX2J5TGF5ZXJJZFtwcmVmaXhlZExheWVySWRdID0gbGF5ZXI7CiAgICAgIH0KCiAgICAgIC8vIFVwZGF0ZSBncm91cCBpbmRleAogICAgICBpZiAoZ3JvdXBlZCkgewogICAgICAgIHRoaXMuX2J5R3JvdXBbZ3JvdXBdID0gdGhpcy5fYnlHcm91cFtncm91cF0gfHwge307CiAgICAgICAgdGhpcy5fYnlHcm91cFtncm91cF1bc3RhbXBdID0gbGF5ZXI7CgogICAgICAgIC8vIFNpbmNlIGEgZ3JvdXAgaXMgYXNzaWduZWQsIGRvbid0IGFkZCB0aGUgbGF5ZXIgdG8gdGhlIGNhdGVnb3J5J3MgbGF5ZXIKICAgICAgICAvLyBncm91cDsgaW5zdGVhZCwgdXNlIHRoZSBncm91cCdzIGxheWVyIGdyb3VwLgogICAgICAgIC8vIFRoaXMgb25lIGxpbmVyIGNyZWF0ZXMgdGhlIF9ncm91cENvbnRhaW5lcnNbZ3JvdXBdIGVudHJ5IGlmIGl0IGRvZXNuJ3QKICAgICAgICAvLyBhbHJlYWR5IGV4aXN0LgogICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0TGF5ZXJHcm91cChncm91cCwgdHJ1ZSk7CiAgICAgIH0KCiAgICAgIC8vIFVwZGF0ZSBjYXRlZ29yeSBpbmRleAogICAgICB0aGlzLl9ieUNhdGVnb3J5W2NhdGVnb3J5XSA9IHRoaXMuX2J5Q2F0ZWdvcnlbY2F0ZWdvcnldIHx8IHt9OwogICAgICB0aGlzLl9ieUNhdGVnb3J5W2NhdGVnb3J5XVtzdGFtcF0gPSBsYXllcjsKCiAgICAgIC8vIFVwZGF0ZSBzdGFtcCBpbmRleAogICAgICB2YXIgbGF5ZXJJbmZvID0gdGhpcy5fYnlTdGFtcFtzdGFtcF0gPSB7CiAgICAgICAgbGF5ZXI6IGxheWVyLAogICAgICAgIGdyb3VwOiBncm91cCwKICAgICAgICBjdEdyb3VwOiBjdEdyb3VwLAogICAgICAgIGN0S2V5OiBjdEtleSwKICAgICAgICBsYXllcklkOiBsYXllcklkLAogICAgICAgIGNhdGVnb3J5OiBjYXRlZ29yeSwKICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lciwKICAgICAgICBoaWRkZW46IGZhbHNlCiAgICAgIH07CgogICAgICAvLyBVcGRhdGUgY3Jvc3N0YWxrIGdyb3VwIGluZGV4CiAgICAgIGlmIChjdEdyb3VwKSB7CiAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmIChsYXllci5zZXRTdHlsZSkgewogICAgICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhpcyBpbmZvIHNvIHdlIGtub3cgd2hhdCB0byBzZXQgb3BhY2l0eSB0byBsYXRlcgogICAgICAgICAgICBsYXllci5vcHRpb25zLm9yaWdPcGFjaXR5ID0gdHlwZW9mIGxheWVyLm9wdGlvbnMub3BhY2l0eSAhPT0gInVuZGVmaW5lZCIgPyBsYXllci5vcHRpb25zLm9wYWNpdHkgOiAwLjU7CiAgICAgICAgICAgIGxheWVyLm9wdGlvbnMub3JpZ0ZpbGxPcGFjaXR5ID0gdHlwZW9mIGxheWVyLm9wdGlvbnMuZmlsbE9wYWNpdHkgIT09ICJ1bmRlZmluZWQiID8gbGF5ZXIub3B0aW9ucy5maWxsT3BhY2l0eSA6IDAuMjsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgY3RnID0gX3RoaXMuX2J5Q3Jvc3N0YWxrR3JvdXBbY3RHcm91cF07CiAgICAgICAgICBpZiAoIWN0ZykgewogICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGN0ZyA9IF90aGlzLl9ieUNyb3NzdGFsa0dyb3VwW2N0R3JvdXBdID0ge307CiAgICAgICAgICAgICAgdmFyIGNyb3NzdGFsayA9IGdsb2JhbC5jcm9zc3RhbGs7CgogICAgICAgICAgICAgIHZhciBoYW5kbGVGaWx0ZXIgPSBmdW5jdGlvbiBoYW5kbGVGaWx0ZXIoZSkgewogICAgICAgICAgICAgICAgaWYgKCFlLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgIHZhciBncm91cEtleXMgPSBPYmplY3Qua2V5cyhjdGcpOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwS2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBncm91cEtleXNbaV07CiAgICAgICAgICAgICAgICAgICAgdmFyIF9sYXllckluZm8gPSBfdGhpcy5fYnlTdGFtcFtjdGdba2V5XV07CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3NldFZpc2liaWxpdHkoX2xheWVySW5mbywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZEtleXMgPSB7fTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGUudmFsdWUubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRLZXlzW2UudmFsdWVbX2ldXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdmFyIF9ncm91cEtleXMgPSBPYmplY3Qua2V5cyhjdGcpOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBfZ3JvdXBLZXlzLmxlbmd0aDsgX2kyKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX2tleSA9IF9ncm91cEtleXNbX2kyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgX2xheWVySW5mbzIgPSBfdGhpcy5fYnlTdGFtcFtjdGdbX2tleV1dOwogICAgICAgICAgICAgICAgICAgIF90aGlzLl9zZXRWaXNpYmlsaXR5KF9sYXllckluZm8yLCBzZWxlY3RlZEtleXNbX2dyb3VwS2V5c1tfaTJdXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHZhciBmaWx0ZXJIYW5kbGUgPSBuZXcgY3Jvc3N0YWxrLkZpbHRlckhhbmRsZShjdEdyb3VwKTsKICAgICAgICAgICAgICBmaWx0ZXJIYW5kbGUub24oImNoYW5nZSIsIGhhbmRsZUZpbHRlcik7CgogICAgICAgICAgICAgIHZhciBoYW5kbGVTZWxlY3Rpb24gPSBmdW5jdGlvbiBoYW5kbGVTZWxlY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFlLnZhbHVlIHx8ICFlLnZhbHVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICB2YXIgZ3JvdXBLZXlzID0gT2JqZWN0LmtleXMoY3RnKTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cEtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ3JvdXBLZXlzW2ldOwogICAgICAgICAgICAgICAgICAgIHZhciBfbGF5ZXJJbmZvMyA9IF90aGlzLl9ieVN0YW1wW2N0Z1trZXldXTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc2V0T3BhY2l0eShfbGF5ZXJJbmZvMywgMS4wKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkS2V5cyA9IHt9OwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBlLnZhbHVlLmxlbmd0aDsgX2kzKyspIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEtleXNbZS52YWx1ZVtfaTNdXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdmFyIF9ncm91cEtleXMyID0gT2JqZWN0LmtleXMoY3RnKTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgX2dyb3VwS2V5czIubGVuZ3RoOyBfaTQrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBfa2V5MiA9IF9ncm91cEtleXMyW19pNF07CiAgICAgICAgICAgICAgICAgICAgdmFyIF9sYXllckluZm80ID0gX3RoaXMuX2J5U3RhbXBbY3RnW19rZXkyXV07CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3NldE9wYWNpdHkoX2xheWVySW5mbzQsIHNlbGVjdGVkS2V5c1tfZ3JvdXBLZXlzMltfaTRdXSA/IDEuMCA6IDAuMik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHZhciBzZWxIYW5kbGUgPSBuZXcgY3Jvc3N0YWxrLlNlbGVjdGlvbkhhbmRsZShjdEdyb3VwKTsKICAgICAgICAgICAgICBzZWxIYW5kbGUub24oImNoYW5nZSIsIGhhbmRsZVNlbGVjdGlvbik7CgogICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaGFuZGxlRmlsdGVyKHsgdmFsdWU6IGZpbHRlckhhbmRsZS5maWx0ZXJlZEtleXMgfSk7CiAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3Rpb24oeyB2YWx1ZTogc2VsSGFuZGxlLnZhbHVlIH0pOwogICAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKCFjdGdbY3RLZXldKSBjdGdbY3RLZXldID0gW107CiAgICAgICAgICBjdGdbY3RLZXldLnB1c2goc3RhbXApOwogICAgICAgIH0pKCk7CiAgICAgIH0KCiAgICAgIC8vIEFkZCB0byBjb250YWluZXIKICAgICAgaWYgKCFsYXllckluZm8uaGlkZGVuKSBjb250YWluZXIuYWRkTGF5ZXIobGF5ZXIpOwoKICAgICAgcmV0dXJuIG9sZExheWVyOwogICAgfQogIH0sIHsKICAgIGtleTogImJydXNoIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBicnVzaChib3VuZHMsIGV4dHJhSW5mbykgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi8KCiAgICAgIC8vIEZvciBlYWNoIENyb3NzdGFsayBncm91cC4uLgogICAgICBPYmplY3Qua2V5cyh0aGlzLl9ieUNyb3NzdGFsa0dyb3VwKS5mb3JFYWNoKGZ1bmN0aW9uIChjdEdyb3VwTmFtZSkgewogICAgICAgIHZhciBjdGcgPSBfdGhpczIuX2J5Q3Jvc3N0YWxrR3JvdXBbY3RHcm91cE5hbWVdOwogICAgICAgIHZhciBzZWxlY3Rpb24gPSBbXTsKICAgICAgICAvLyAuLi5pdGVyYXRlIG92ZXIgZWFjaCBDcm9zc3RhbGsga2V5IChlYWNoIG9mIHdoaWNoIG1heSBoYXZlIG11bHRpcGxlCiAgICAgICAgLy8gbGF5ZXJzKS4uLgogICAgICAgIE9iamVjdC5rZXlzKGN0ZykuZm9yRWFjaChmdW5jdGlvbiAoY3RLZXkpIHsKICAgICAgICAgIC8vIC4uLmFuZCBmb3IgZWFjaCBsYXllci4uLgogICAgICAgICAgY3RnW2N0S2V5XS5mb3JFYWNoKGZ1bmN0aW9uIChzdGFtcCkgewogICAgICAgICAgICB2YXIgbGF5ZXJJbmZvID0gX3RoaXMyLl9ieVN0YW1wW3N0YW1wXTsKICAgICAgICAgICAgLy8gLi4uaWYgaXQncyBzb21ldGhpbmcgd2l0aCBhIHBvaW50Li4uCiAgICAgICAgICAgIGlmIChsYXllckluZm8ubGF5ZXIuZ2V0TGF0TG5nKSB7CiAgICAgICAgICAgICAgLy8gLi4uIGFuZCBpdCdzIGluc2lkZSB0aGUgc2VsZWN0aW9uIGJvdW5kcy4uLgogICAgICAgICAgICAgIC8vIFRPRE86IFVzZSBwaXhlbCBjb250YWlubWVudCwgbm90IGxhdC9sbmcgY29udGFpbm1lbnQKICAgICAgICAgICAgICBpZiAoYm91bmRzLmNvbnRhaW5zKGxheWVySW5mby5sYXllci5nZXRMYXRMbmcoKSkpIHsKICAgICAgICAgICAgICAgIC8vIC4uLmFkZCB0aGUga2V5IHRvIHRoZSBzZWxlY3Rpb24uCiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ucHVzaChjdEtleSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICBuZXcgZ2xvYmFsLmNyb3NzdGFsay5TZWxlY3Rpb25IYW5kbGUoY3RHcm91cE5hbWUpLnNldChzZWxlY3Rpb24sIGV4dHJhSW5mbyk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogInVuYnJ1c2giLAogICAgdmFsdWU6IGZ1bmN0aW9uIHVuYnJ1c2goZXh0cmFJbmZvKSB7CiAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2J5Q3Jvc3N0YWxrR3JvdXApLmZvckVhY2goZnVuY3Rpb24gKGN0R3JvdXBOYW1lKSB7CiAgICAgICAgbmV3IGdsb2JhbC5jcm9zc3RhbGsuU2VsZWN0aW9uSGFuZGxlKGN0R3JvdXBOYW1lKS5jbGVhcihleHRyYUluZm8pOwogICAgICB9KTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJfc2V0VmlzaWJpbGl0eSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gX3NldFZpc2liaWxpdHkobGF5ZXJJbmZvLCB2aXNpYmxlKSB7CiAgICAgIGlmIChsYXllckluZm8uaGlkZGVuIF4gdmlzaWJsZSkgewogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmICh2aXNpYmxlKSB7CiAgICAgICAgbGF5ZXJJbmZvLmNvbnRhaW5lci5hZGRMYXllcihsYXllckluZm8ubGF5ZXIpOwogICAgICAgIGxheWVySW5mby5oaWRkZW4gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYXllckluZm8uY29udGFpbmVyLnJlbW92ZUxheWVyKGxheWVySW5mby5sYXllcik7CiAgICAgICAgbGF5ZXJJbmZvLmhpZGRlbiA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9LCB7CiAgICBrZXk6ICJfc2V0T3BhY2l0eSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gX3NldE9wYWNpdHkobGF5ZXJJbmZvLCBvcGFjaXR5KSB7CiAgICAgIGlmIChsYXllckluZm8ubGF5ZXIuc2V0T3BhY2l0eSkgewogICAgICAgIGxheWVySW5mby5sYXllci5zZXRPcGFjaXR5KG9wYWNpdHkpOwogICAgICB9IGVsc2UgaWYgKGxheWVySW5mby5sYXllci5zZXRTdHlsZSkgewogICAgICAgIGxheWVySW5mby5sYXllci5zZXRTdHlsZSh7CiAgICAgICAgICBvcGFjaXR5OiBvcGFjaXR5ICogbGF5ZXJJbmZvLmxheWVyLm9wdGlvbnMub3JpZ09wYWNpdHksCiAgICAgICAgICBmaWxsT3BhY2l0eTogb3BhY2l0eSAqIGxheWVySW5mby5sYXllci5vcHRpb25zLm9yaWdGaWxsT3BhY2l0eQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0TGF5ZXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldExheWVyKGNhdGVnb3J5LCBsYXllcklkKSB7CiAgICAgIHJldHVybiB0aGlzLl9ieUxheWVySWRbdGhpcy5fbGF5ZXJJZEtleShjYXRlZ29yeSwgbGF5ZXJJZCldOwogICAgfQogIH0sIHsKICAgIGtleTogInJlbW92ZUxheWVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVMYXllcihjYXRlZ29yeSwgbGF5ZXJJZHMpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgICAvLyBGaW5kIGxheWVyIGluZm8KICAgICAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKCgwLCBfdXRpbC5hc0FycmF5KShsYXllcklkcyksIGZ1bmN0aW9uIChpLCBsYXllcklkKSB7CiAgICAgICAgdmFyIGxheWVyID0gX3RoaXMzLl9ieUxheWVySWRbX3RoaXMzLl9sYXllcklkS2V5KGNhdGVnb3J5LCBsYXllcklkKV07CiAgICAgICAgaWYgKGxheWVyKSB7CiAgICAgICAgICBfdGhpczMuX3JlbW92ZUxheWVyKGxheWVyKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogImNsZWFyTGF5ZXJzIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhckxheWVycyhjYXRlZ29yeSkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKCiAgICAgIC8vIEZpbmQgYWxsIGxheWVycyBpbiBfYnlDYXRlZ29yeVtjYXRlZ29yeV0KICAgICAgdmFyIGNhdFRhYmxlID0gdGhpcy5fYnlDYXRlZ29yeVtjYXRlZ29yeV07CiAgICAgIGlmICghY2F0VGFibGUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIFJlbW92ZSBhbGwgbGF5ZXJzLiBNYWtlIGNvcHkgb2Yga2V5cyB0byBhdm9pZCBtdXRhdGluZyB0aGUgY29sbGVjdGlvbgogICAgICAvLyBiZWhpbmQgdGhlIGl0ZXJhdG9yIHlvdSdyZSBhY2Nlc3NpbmcuCiAgICAgIHZhciBzdGFtcHMgPSBbXTsKICAgICAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKGNhdFRhYmxlLCBmdW5jdGlvbiAoaywgdikgewogICAgICAgIHN0YW1wcy5wdXNoKGspOwogICAgICB9KTsKICAgICAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKHN0YW1wcywgZnVuY3Rpb24gKGksIHN0YW1wKSB7CiAgICAgICAgX3RoaXM0Ll9yZW1vdmVMYXllcihzdGFtcCk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogImdldExheWVyR3JvdXAiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldExheWVyR3JvdXAoZ3JvdXAsIGVuc3VyZUV4aXN0cykgewogICAgICB2YXIgZyA9IHRoaXMuX2dyb3VwQ29udGFpbmVyc1tncm91cF07CiAgICAgIGlmIChlbnN1cmVFeGlzdHMgJiYgIWcpIHsKICAgICAgICB0aGlzLl9ieUdyb3VwW2dyb3VwXSA9IHRoaXMuX2J5R3JvdXBbZ3JvdXBdIHx8IHt9OwogICAgICAgIGcgPSB0aGlzLl9ncm91cENvbnRhaW5lcnNbZ3JvdXBdID0gX2xlYWZsZXQyLmRlZmF1bHQuZmVhdHVyZUdyb3VwKCk7CiAgICAgICAgZy5ncm91cG5hbWUgPSBncm91cDsKICAgICAgICBnLmFkZFRvKHRoaXMuX21hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGc7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0R3JvdXBOYW1lRnJvbUxheWVyR3JvdXAiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldEdyb3VwTmFtZUZyb21MYXllckdyb3VwKGxheWVyR3JvdXApIHsKICAgICAgcmV0dXJuIGxheWVyR3JvdXAuZ3JvdXBuYW1lOwogICAgfQogIH0sIHsKICAgIGtleTogImdldFZpc2libGVHcm91cHMiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZpc2libGVHcm91cHMoKSB7CiAgICAgIHZhciBfdGhpczUgPSB0aGlzOwoKICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2godGhpcy5fZ3JvdXBDb250YWluZXJzLCBmdW5jdGlvbiAoaywgdikgewogICAgICAgIGlmIChfdGhpczUuX21hcC5oYXNMYXllcih2KSkgewogICAgICAgICAgcmVzdWx0LnB1c2goayk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXRBbGxHcm91cE5hbWVzIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxHcm91cE5hbWVzKCkgewogICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgIF9qcXVlcnkyLmRlZmF1bHQuZWFjaCh0aGlzLl9ncm91cENvbnRhaW5lcnMsIGZ1bmN0aW9uIChrLCB2KSB7CiAgICAgICAgcmVzdWx0LnB1c2goayk7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0sIHsKICAgIGtleTogImNsZWFyR3JvdXAiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyR3JvdXAoZ3JvdXApIHsKICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CgogICAgICAvLyBGaW5kIGFsbCBsYXllcnMgaW4gX2J5R3JvdXBbZ3JvdXBdCiAgICAgIHZhciBncm91cFRhYmxlID0gdGhpcy5fYnlHcm91cFtncm91cF07CiAgICAgIGlmICghZ3JvdXBUYWJsZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLy8gUmVtb3ZlIGFsbCBsYXllcnMuIE1ha2UgY29weSBvZiBrZXlzIHRvIGF2b2lkIG11dGF0aW5nIHRoZSBjb2xsZWN0aW9uCiAgICAgIC8vIGJlaGluZCB0aGUgaXRlcmF0b3IgeW91J3JlIGFjY2Vzc2luZy4KICAgICAgdmFyIHN0YW1wcyA9IFtdOwogICAgICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2goZ3JvdXBUYWJsZSwgZnVuY3Rpb24gKGssIHYpIHsKICAgICAgICBzdGFtcHMucHVzaChrKTsKICAgICAgfSk7CiAgICAgIF9qcXVlcnkyLmRlZmF1bHQuZWFjaChzdGFtcHMsIGZ1bmN0aW9uIChpLCBzdGFtcCkgewogICAgICAgIF90aGlzNi5fcmVtb3ZlTGF5ZXIoc3RhbXApOwogICAgICB9KTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJjbGVhciIsCiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7CiAgICAgIGZ1bmN0aW9uIGNsZWFyTGF5ZXJHcm91cChrZXksIGxheWVyR3JvdXApIHsKICAgICAgICBsYXllckdyb3VwLmNsZWFyTGF5ZXJzKCk7CiAgICAgIH0KICAgICAgLy8gQ2xlYXIgYWxsIGluZGljZXMgYW5kIGxheWVyR3JvdXBzCiAgICAgIHRoaXMuX2J5R3JvdXAgPSB7fTsKICAgICAgdGhpcy5fYnlDYXRlZ29yeSA9IHt9OwogICAgICB0aGlzLl9ieUxheWVySWQgPSB7fTsKICAgICAgdGhpcy5fYnlTdGFtcCA9IHt9OwogICAgICB0aGlzLl9ieUNyb3NzdGFsa0dyb3VwID0ge307CiAgICAgIF9qcXVlcnkyLmRlZmF1bHQuZWFjaCh0aGlzLl9jYXRlZ29yeUNvbnRhaW5lcnMsIGNsZWFyTGF5ZXJHcm91cCk7CiAgICAgIHRoaXMuX2NhdGVnb3J5Q29udGFpbmVycyA9IHt9OwogICAgICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2godGhpcy5fZ3JvdXBDb250YWluZXJzLCBjbGVhckxheWVyR3JvdXApOwogICAgICB0aGlzLl9ncm91cENvbnRhaW5lcnMgPSB7fTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJfcmVtb3ZlTGF5ZXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIF9yZW1vdmVMYXllcihsYXllcikgewogICAgICB2YXIgc3RhbXAgPSB2b2lkIDA7CiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgc3RhbXAgPSBsYXllcjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGFtcCA9IF9sZWFmbGV0Mi5kZWZhdWx0LlV0aWwuc3RhbXAobGF5ZXIpOwogICAgICB9CgogICAgICB2YXIgbGF5ZXJJbmZvID0gdGhpcy5fYnlTdGFtcFtzdGFtcF07CiAgICAgIGlmICghbGF5ZXJJbmZvKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBsYXllckluZm8uY29udGFpbmVyLnJlbW92ZUxheWVyKHN0YW1wKTsKICAgICAgaWYgKHR5cGVvZiBsYXllckluZm8uZ3JvdXAgPT09ICJzdHJpbmciKSB7CiAgICAgICAgZGVsZXRlIHRoaXMuX2J5R3JvdXBbbGF5ZXJJbmZvLmdyb3VwXVtzdGFtcF07CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBsYXllckluZm8ubGF5ZXJJZCA9PT0gInN0cmluZyIpIHsKICAgICAgICBkZWxldGUgdGhpcy5fYnlMYXllcklkW3RoaXMuX2xheWVySWRLZXkobGF5ZXJJbmZvLmNhdGVnb3J5LCBsYXllckluZm8ubGF5ZXJJZCldOwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzLl9ieUNhdGVnb3J5W2xheWVySW5mby5jYXRlZ29yeV1bc3RhbXBdOwogICAgICBkZWxldGUgdGhpcy5fYnlTdGFtcFtzdGFtcF07CiAgICAgIGlmIChsYXllckluZm8uY3RHcm91cCkgewogICAgICAgIHZhciBjdEdyb3VwID0gdGhpcy5fYnlDcm9zc3RhbGtHcm91cFtsYXllckluZm8uY3RHcm91cF07CiAgICAgICAgdmFyIGxheWVyc0ZvcktleSA9IGN0R3JvdXBbbGF5ZXJJbmZvLmN0S2V5XTsKICAgICAgICB2YXIgaWR4ID0gbGF5ZXJzRm9yS2V5ID8gbGF5ZXJzRm9yS2V5LmluZGV4T2Yoc3RhbXApIDogLTE7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBpZiAobGF5ZXJzRm9yS2V5Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBkZWxldGUgY3RHcm91cFtsYXllckluZm8uY3RLZXldOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGF5ZXJzRm9yS2V5LnNwbGljZShpZHgsIDEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogIl9sYXllcklkS2V5IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBfbGF5ZXJJZEtleShjYXRlZ29yeSwgbGF5ZXJJZCkgewogICAgICByZXR1cm4gY2F0ZWdvcnkgKyAiXG4iICsgbGF5ZXJJZDsKICAgIH0KICB9XSk7CgogIHJldHVybiBMYXllck1hbmFnZXI7Cn0oKTsKCmV4cG9ydHMuZGVmYXVsdCA9IExheWVyTWFuYWdlcjsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7Ii4vZ2xvYmFsL2pxdWVyeSI6NywiLi9nbG9iYWwvbGVhZmxldCI6OCwiLi91dGlsIjoxNX1dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKGZ1bmN0aW9uIChnbG9iYWwpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7Cgp2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07Cgp2YXIgX2pxdWVyeSA9IHJlcXVpcmUoIi4vZ2xvYmFsL2pxdWVyeSIpOwoKdmFyIF9qcXVlcnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfanF1ZXJ5KTsKCnZhciBfbGVhZmxldCA9IHJlcXVpcmUoIi4vZ2xvYmFsL2xlYWZsZXQiKTsKCnZhciBfbGVhZmxldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sZWFmbGV0KTsKCnZhciBfc2hpbnkgPSByZXF1aXJlKCIuL2dsb2JhbC9zaGlueSIpOwoKdmFyIF9zaGlueTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zaGlueSk7Cgp2YXIgX2h0bWx3aWRnZXRzID0gcmVxdWlyZSgiLi9nbG9iYWwvaHRtbHdpZGdldHMiKTsKCnZhciBfaHRtbHdpZGdldHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHRtbHdpZGdldHMpOwoKdmFyIF91dGlsID0gcmVxdWlyZSgiLi91dGlsIik7Cgp2YXIgX2Nyc191dGlscyA9IHJlcXVpcmUoIi4vY3JzX3V0aWxzIik7Cgp2YXIgX2RhdGFmcmFtZSA9IHJlcXVpcmUoIi4vZGF0YWZyYW1lIik7Cgp2YXIgX2RhdGFmcmFtZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kYXRhZnJhbWUpOwoKdmFyIF9jbHVzdGVyTGF5ZXJTdG9yZSA9IHJlcXVpcmUoIi4vY2x1c3Rlci1sYXllci1zdG9yZSIpOwoKdmFyIF9jbHVzdGVyTGF5ZXJTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbHVzdGVyTGF5ZXJTdG9yZSk7Cgp2YXIgX21pcG1hcHBlciA9IHJlcXVpcmUoIi4vbWlwbWFwcGVyIik7Cgp2YXIgX21pcG1hcHBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9taXBtYXBwZXIpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KCnZhciBtZXRob2RzID0ge307CmV4cG9ydHMuZGVmYXVsdCA9IG1ldGhvZHM7CgoKZnVuY3Rpb24gbW91c2VIYW5kbGVyKG1hcElkLCBsYXllcklkLCBncm91cCwgZXZlbnROYW1lLCBleHRyYUluZm8pIHsKICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgIGlmICghX2h0bWx3aWRnZXRzMi5kZWZhdWx0LnNoaW55TW9kZSkgcmV0dXJuOwoKICAgIHZhciBldmVudEluZm8gPSBfanF1ZXJ5Mi5kZWZhdWx0LmV4dGVuZCh7CiAgICAgIGlkOiBsYXllcklkLAogICAgICAiLm5vbmNlIjogTWF0aC5yYW5kb20oKSAvLyBmb3JjZSByZWFjdGl2aXR5CiAgICB9LCBncm91cCAhPT0gbnVsbCA/IHsgZ3JvdXA6IGdyb3VwIH0gOiBudWxsLCBlLnRhcmdldC5nZXRMYXRMbmcgPyBlLnRhcmdldC5nZXRMYXRMbmcoKSA6IGUubGF0bG5nLCBleHRyYUluZm8pOwoKICAgIF9zaGlueTIuZGVmYXVsdC5vbklucHV0Q2hhbmdlKG1hcElkICsgIl8iICsgZXZlbnROYW1lLCBldmVudEluZm8pOwogIH07Cn0KCm1ldGhvZHMubW91c2VIYW5kbGVyID0gbW91c2VIYW5kbGVyOwoKbWV0aG9kcy5jbGVhckdyb3VwID0gZnVuY3Rpb24gKGdyb3VwKSB7CiAgdmFyIF90aGlzID0gdGhpczsKCiAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKCgwLCBfdXRpbC5hc0FycmF5KShncm91cCksIGZ1bmN0aW9uIChpLCB2KSB7CiAgICBfdGhpcy5sYXllck1hbmFnZXIuY2xlYXJHcm91cCh2KTsKICB9KTsKfTsKCm1ldGhvZHMuc2V0VmlldyA9IGZ1bmN0aW9uIChjZW50ZXIsIHpvb20sIG9wdGlvbnMpIHsKICB0aGlzLnNldFZpZXcoY2VudGVyLCB6b29tLCBvcHRpb25zKTsKfTsKCm1ldGhvZHMuZml0Qm91bmRzID0gZnVuY3Rpb24gKGxhdDEsIGxuZzEsIGxhdDIsIGxuZzIpIHsKICB0aGlzLmZpdEJvdW5kcyhbW2xhdDEsIGxuZzFdLCBbbGF0MiwgbG5nMl1dKTsKfTsKCm1ldGhvZHMuc2V0TWF4Qm91bmRzID0gZnVuY3Rpb24gKGxhdDEsIGxuZzEsIGxhdDIsIGxuZzIpIHsKICB0aGlzLnNldE1heEJvdW5kcyhbW2xhdDEsIGxuZzFdLCBbbGF0MiwgbG5nMl1dKTsKfTsKCm1ldGhvZHMuYWRkUG9wdXBzID0gZnVuY3Rpb24gKGxhdCwgbG5nLCBwb3B1cCwgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMpIHsKICB2YXIgX3RoaXMyID0gdGhpczsKCiAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jb2woImxhdCIsIGxhdCkuY29sKCJsbmciLCBsbmcpLmNvbCgicG9wdXAiLCBwb3B1cCkuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jYmluZChvcHRpb25zKTsKCiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkgewogICAgaWYgKF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGRmLmdldChpLCAibGF0IikpICYmIF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGRmLmdldChpLCAibG5nIikpKSB7CiAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHBvcHVwID0gX2xlYWZsZXQyLmRlZmF1bHQucG9wdXAoZGYuZ2V0KGkpKS5zZXRMYXRMbmcoW2RmLmdldChpLCAibGF0IiksIGRmLmdldChpLCAibG5nIildKS5zZXRDb250ZW50KGRmLmdldChpLCAicG9wdXAiKSk7CiAgICAgICAgdmFyIHRoaXNJZCA9IGRmLmdldChpLCAibGF5ZXJJZCIpOwogICAgICAgIHZhciB0aGlzR3JvdXAgPSBkZi5nZXQoaSwgImdyb3VwIik7CiAgICAgICAgdGhpcy5sYXllck1hbmFnZXIuYWRkTGF5ZXIocG9wdXAsICJwb3B1cCIsIHRoaXNJZCwgdGhpc0dyb3VwKTsKICAgICAgfSkuY2FsbChfdGhpczIpOwogICAgfQogIH07CgogIGZvciAodmFyIGkgPSAwOyBpIDwgZGYubnJvdygpOyBpKyspIHsKICAgIF9sb29wKGkpOwogIH0KfTsKCm1ldGhvZHMucmVtb3ZlUG9wdXAgPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJwb3B1cCIsIGxheWVySWQpOwp9OwoKbWV0aG9kcy5jbGVhclBvcHVwcyA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLmxheWVyTWFuYWdlci5jbGVhckxheWVycygicG9wdXAiKTsKfTsKCm1ldGhvZHMuYWRkVGlsZXMgPSBmdW5jdGlvbiAodXJsVGVtcGxhdGUsIGxheWVySWQsIGdyb3VwLCBvcHRpb25zKSB7CiAgdGhpcy5sYXllck1hbmFnZXIuYWRkTGF5ZXIoX2xlYWZsZXQyLmRlZmF1bHQudGlsZUxheWVyKHVybFRlbXBsYXRlLCBvcHRpb25zKSwgInRpbGUiLCBsYXllcklkLCBncm91cCk7Cn07CgptZXRob2RzLnJlbW92ZVRpbGVzID0gZnVuY3Rpb24gKGxheWVySWQpIHsKICB0aGlzLmxheWVyTWFuYWdlci5yZW1vdmVMYXllcigidGlsZSIsIGxheWVySWQpOwp9OwoKbWV0aG9kcy5jbGVhclRpbGVzID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJ0aWxlIik7Cn07CgptZXRob2RzLmFkZFdNU1RpbGVzID0gZnVuY3Rpb24gKGJhc2VVcmwsIGxheWVySWQsIGdyb3VwLCBvcHRpb25zKSB7CiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jcnMpIHsKICAgIG9wdGlvbnMuY3JzID0gKDAsIF9jcnNfdXRpbHMuZ2V0Q1JTKShvcHRpb25zLmNycyk7CiAgfQogIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKF9sZWFmbGV0Mi5kZWZhdWx0LnRpbGVMYXllci53bXMoYmFzZVVybCwgb3B0aW9ucyksICJ0aWxlIiwgbGF5ZXJJZCwgZ3JvdXApOwp9OwoKLy8gR2l2ZW46Ci8vICAge2RhdGE6IFsiYSIsICJiIiwgImMiXSwgaW5kZXg6IFswLCAxLCAwLCAyXX0KLy8gcmV0dXJuczoKLy8gICBbImEiLCAiYiIsICJhIiwgImMiXQpmdW5jdGlvbiB1bnBhY2tTdHJpbmdzKGljb25zZXQpIHsKICBpZiAoIWljb25zZXQpIHsKICAgIHJldHVybiBpY29uc2V0OwogIH0KICBpZiAodHlwZW9mIGljb25zZXQuaW5kZXggPT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXR1cm4gaWNvbnNldDsKICB9CgogIGljb25zZXQuZGF0YSA9ICgwLCBfdXRpbC5hc0FycmF5KShpY29uc2V0LmRhdGEpOwogIGljb25zZXQuaW5kZXggPSAoMCwgX3V0aWwuYXNBcnJheSkoaWNvbnNldC5pbmRleCk7CgogIHJldHVybiBfanF1ZXJ5Mi5kZWZhdWx0Lm1hcChpY29uc2V0LmluZGV4LCBmdW5jdGlvbiAoZSwgaSkgewogICAgcmV0dXJuIGljb25zZXQuZGF0YVtlXTsKICB9KTsKfQoKZnVuY3Rpb24gYWRkTWFya2VycyhtYXAsIGRmLCBncm91cCwgY2x1c3Rlck9wdGlvbnMsIGNsdXN0ZXJJZCwgbWFya2VyRnVuYykgewogIChmdW5jdGlvbiAoKSB7CiAgICB2YXIgX3RoaXMzID0gdGhpczsKCiAgICB2YXIgY2x1c3Rlckdyb3VwID0gdGhpcy5sYXllck1hbmFnZXIuZ2V0TGF5ZXIoImNsdXN0ZXIiLCBjbHVzdGVySWQpLAogICAgICAgIGNsdXN0ZXIgPSBjbHVzdGVyT3B0aW9ucyAhPT0gbnVsbDsKICAgIGlmIChjbHVzdGVyICYmICFjbHVzdGVyR3JvdXApIHsKICAgICAgY2x1c3Rlckdyb3VwID0gX2xlYWZsZXQyLmRlZmF1bHQubWFya2VyQ2x1c3Rlckdyb3VwLmxheWVyU3VwcG9ydChjbHVzdGVyT3B0aW9ucyk7CiAgICAgIGlmIChjbHVzdGVyT3B0aW9ucy5mcmVlemVBdFpvb20pIHsKICAgICAgICB2YXIgZnJlZXplQXRab29tID0gY2x1c3Rlck9wdGlvbnMuZnJlZXplQXRab29tOwogICAgICAgIGRlbGV0ZSBjbHVzdGVyT3B0aW9ucy5mcmVlemVBdFpvb207CiAgICAgICAgY2x1c3Rlckdyb3VwLmZyZWV6ZUF0Wm9vbShmcmVlemVBdFpvb20pOwogICAgICB9CiAgICAgIGNsdXN0ZXJHcm91cC5jbHVzdGVyTGF5ZXJTdG9yZSA9IG5ldyBfY2x1c3RlckxheWVyU3RvcmUyLmRlZmF1bHQoY2x1c3Rlckdyb3VwKTsKICAgIH0KICAgIHZhciBleHRyYUluZm8gPSBjbHVzdGVyID8geyBjbHVzdGVySWQ6IGNsdXN0ZXJJZCB9IDoge307CgogICAgdmFyIF9sb29wMiA9IGZ1bmN0aW9uIF9sb29wMihpKSB7CiAgICAgIGlmIChfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhkZi5nZXQoaSwgImxhdCIpKSAmJiBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhkZi5nZXQoaSwgImxuZyIpKSkgewogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgbWFya2VyID0gbWFya2VyRnVuYyhkZiwgaSk7CiAgICAgICAgICB2YXIgdGhpc0lkID0gZGYuZ2V0KGksICJsYXllcklkIik7CiAgICAgICAgICB2YXIgdGhpc0dyb3VwID0gY2x1c3RlciA/IG51bGwgOiBkZi5nZXQoaSwgImdyb3VwIik7CiAgICAgICAgICBpZiAoY2x1c3RlcikgewogICAgICAgICAgICBjbHVzdGVyR3JvdXAuY2x1c3RlckxheWVyU3RvcmUuYWRkKG1hcmtlciwgdGhpc0lkKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKG1hcmtlciwgIm1hcmtlciIsIHRoaXNJZCwgdGhpc0dyb3VwLCBkZi5nZXQoaSwgImN0R3JvdXAiLCB0cnVlKSwgZGYuZ2V0KGksICJjdEtleSIsIHRydWUpKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwb3B1cCA9IGRmLmdldChpLCAicG9wdXAiKTsKICAgICAgICAgIHZhciBwb3B1cE9wdGlvbnMgPSBkZi5nZXQoaSwgInBvcHVwT3B0aW9ucyIpOwogICAgICAgICAgaWYgKHBvcHVwICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChwb3B1cE9wdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICBtYXJrZXIuYmluZFBvcHVwKHBvcHVwLCBwb3B1cE9wdGlvbnMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1hcmtlci5iaW5kUG9wdXAocG9wdXApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbGFiZWwgPSBkZi5nZXQoaSwgImxhYmVsIik7CiAgICAgICAgICB2YXIgbGFiZWxPcHRpb25zID0gZGYuZ2V0KGksICJsYWJlbE9wdGlvbnMiKTsKICAgICAgICAgIGlmIChsYWJlbCAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAobGFiZWxPcHRpb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgaWYgKGxhYmVsT3B0aW9ucy5ub0hpZGUpIHsKICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kTGFiZWwobGFiZWwsIGxhYmVsT3B0aW9ucykuc2hvd0xhYmVsKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kTGFiZWwobGFiZWwsIGxhYmVsT3B0aW9ucyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1hcmtlci5iaW5kTGFiZWwobGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBtYXJrZXIub24oImNsaWNrIiwgbW91c2VIYW5kbGVyKHRoaXMuaWQsIHRoaXNJZCwgdGhpc0dyb3VwLCAibWFya2VyX2NsaWNrIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgICAgICBtYXJrZXIub24oIm1vdXNlb3ZlciIsIG1vdXNlSGFuZGxlcih0aGlzLmlkLCB0aGlzSWQsIHRoaXNHcm91cCwgIm1hcmtlcl9tb3VzZW92ZXIiLCBleHRyYUluZm8pLCB0aGlzKTsKICAgICAgICAgIG1hcmtlci5vbigibW91c2VvdXQiLCBtb3VzZUhhbmRsZXIodGhpcy5pZCwgdGhpc0lkLCB0aGlzR3JvdXAsICJtYXJrZXJfbW91c2VvdXQiLCBleHRyYUluZm8pLCB0aGlzKTsKICAgICAgICB9KS5jYWxsKF90aGlzMyk7CiAgICAgIH0KICAgIH07CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZi5ucm93KCk7IGkrKykgewogICAgICBfbG9vcDIoaSk7CiAgICB9CgogICAgaWYgKGNsdXN0ZXIpIHsKICAgICAgdGhpcy5sYXllck1hbmFnZXIuYWRkTGF5ZXIoY2x1c3Rlckdyb3VwLCAiY2x1c3RlciIsIGNsdXN0ZXJJZCwgZ3JvdXApOwogICAgfQogIH0pLmNhbGwobWFwKTsKfQoKbWV0aG9kcy5hZGRHZW5lcmljTWFya2VycyA9IGFkZE1hcmtlcnM7CgptZXRob2RzLmFkZE1hcmtlcnMgPSBmdW5jdGlvbiAobGF0LCBsbmcsIGljb24sIGxheWVySWQsIGdyb3VwLCBvcHRpb25zLCBwb3B1cCwgcG9wdXBPcHRpb25zLCBjbHVzdGVyT3B0aW9ucywgY2x1c3RlcklkLCBsYWJlbCwgbGFiZWxPcHRpb25zLCBjcm9zc3RhbGtPcHRpb25zKSB7CiAgdmFyIGljb25kZiA9IHZvaWQgMDsKICB2YXIgZ2V0SWNvbiA9IHZvaWQgMDsKCiAgaWYgKGljb24pIHsKICAgIC8vIFVucGFjayBpY29ucwogICAgaWNvbi5pY29uVXJsID0gdW5wYWNrU3RyaW5ncyhpY29uLmljb25VcmwpOwogICAgaWNvbi5pY29uUmV0aW5hVXJsID0gdW5wYWNrU3RyaW5ncyhpY29uLmljb25SZXRpbmFVcmwpOwogICAgaWNvbi5zaGFkb3dVcmwgPSB1bnBhY2tTdHJpbmdzKGljb24uc2hhZG93VXJsKTsKICAgIGljb24uc2hhZG93UmV0aW5hVXJsID0gdW5wYWNrU3RyaW5ncyhpY29uLnNoYWRvd1JldGluYVVybCk7CgogICAgLy8gVGhpcyBjYmluZHMgdGhlIGljb24gVVJMcyBhbmQgYW55IG90aGVyIGljb24gb3B0aW9uczsgdGhleSdyZSBhbGwKICAgIC8vIHByZXNlbnQgb24gdGhlIGljb24gb2JqZWN0LgogICAgaWNvbmRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jYmluZChpY29uKTsKCiAgICAvLyBDb25zdHJ1Y3RzIGFuIGljb24gZnJvbSBhIHNwZWNpZmllZCByb3cgb2YgdGhlIGljb24gZGF0YWZyYW1lLgogICAgZ2V0SWNvbiA9IGZ1bmN0aW9uIGdldEljb24oaSkgewogICAgICB2YXIgb3B0cyA9IGljb25kZi5nZXQoaSk7CiAgICAgIGlmICghb3B0cy5pY29uVXJsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfbGVhZmxldDIuZGVmYXVsdC5JY29uLkRlZmF1bHQoKTsKICAgICAgfQoKICAgICAgLy8gQ29tcG9zaXRlIG9wdGlvbnMgKGxpa2UgcG9pbnRzIG9yIHNpemVzKSBhcmUgcGFzc2VkIGZyb20gUiB3aXRoIGVhY2gKICAgICAgLy8gaW5kaXZpZHVhbCBjb21wb25lbnQgYXMgaXRzIG93biBvcHRpb24uIFdlIG5lZWQgdG8gY29tYmluZSB0aGVtIG5vdwogICAgICAvLyBpbnRvIHRoZWlyIGNvbXBvc2l0ZSBmb3JtLgogICAgICBpZiAob3B0cy5pY29uV2lkdGgpIHsKICAgICAgICBvcHRzLmljb25TaXplID0gW29wdHMuaWNvbldpZHRoLCBvcHRzLmljb25IZWlnaHRdOwogICAgICB9CiAgICAgIGlmIChvcHRzLnNoYWRvd1dpZHRoKSB7CiAgICAgICAgb3B0cy5zaGFkb3dTaXplID0gW29wdHMuc2hhZG93V2lkdGgsIG9wdHMuc2hhZG93SGVpZ2h0XTsKICAgICAgfQogICAgICBpZiAob3B0cy5pY29uQW5jaG9yWCkgewogICAgICAgIG9wdHMuaWNvbkFuY2hvciA9IFtvcHRzLmljb25BbmNob3JYLCBvcHRzLmljb25BbmNob3JZXTsKICAgICAgfQogICAgICBpZiAob3B0cy5zaGFkb3dBbmNob3JYKSB7CiAgICAgICAgb3B0cy5zaGFkb3dBbmNob3IgPSBbb3B0cy5zaGFkb3dBbmNob3JYLCBvcHRzLnNoYWRvd0FuY2hvclldOwogICAgICB9CiAgICAgIGlmIChvcHRzLnBvcHVwQW5jaG9yWCkgewogICAgICAgIG9wdHMucG9wdXBBbmNob3IgPSBbb3B0cy5wb3B1cEFuY2hvclgsIG9wdHMucG9wdXBBbmNob3JZXTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBfbGVhZmxldDIuZGVmYXVsdC5JY29uKG9wdHMpOwogICAgfTsKICB9CgogIGlmICghKF9qcXVlcnkyLmRlZmF1bHQuaXNFbXB0eU9iamVjdChsYXQpIHx8IF9qcXVlcnkyLmRlZmF1bHQuaXNFbXB0eU9iamVjdChsbmcpKSB8fCBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhsYXQpICYmIF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGxuZykpIHsKCiAgICB2YXIgZGYgPSBuZXcgX2RhdGFmcmFtZTIuZGVmYXVsdCgpLmNvbCgibGF0IiwgbGF0KS5jb2woImxuZyIsIGxuZykuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jYmluZChvcHRpb25zKS5jYmluZChjcm9zc3RhbGtPcHRpb25zIHx8IHt9KTsKCiAgICBpZiAoaWNvbikgaWNvbmRmLmVmZmVjdGl2ZUxlbmd0aCA9IGRmLm5yb3coKTsKCiAgICBhZGRNYXJrZXJzKHRoaXMsIGRmLCBncm91cCwgY2x1c3Rlck9wdGlvbnMsIGNsdXN0ZXJJZCwgZnVuY3Rpb24gKGRmLCBpKSB7CiAgICAgIHZhciBvcHRpb25zID0gZGYuZ2V0KGkpOwogICAgICBpZiAoaWNvbikgb3B0aW9ucy5pY29uID0gZ2V0SWNvbihpKTsKICAgICAgcmV0dXJuIF9sZWFmbGV0Mi5kZWZhdWx0Lm1hcmtlcihbZGYuZ2V0KGksICJsYXQiKSwgZGYuZ2V0KGksICJsbmciKV0sIG9wdGlvbnMpOwogICAgfSk7CiAgfQp9OwoKbWV0aG9kcy5hZGRBd2Vzb21lTWFya2VycyA9IGZ1bmN0aW9uIChsYXQsIGxuZywgaWNvbiwgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMsIHBvcHVwLCBwb3B1cE9wdGlvbnMsIGNsdXN0ZXJPcHRpb25zLCBjbHVzdGVySWQsIGxhYmVsLCBsYWJlbE9wdGlvbnMsIGNyb3NzdGFsa09wdGlvbnMpIHsKICB2YXIgaWNvbmRmID0gdm9pZCAwOwogIHZhciBnZXRJY29uID0gdm9pZCAwOwogIGlmIChpY29uKSB7CgogICAgLy8gVGhpcyBjYmluZHMgdGhlIGljb24gVVJMcyBhbmQgYW55IG90aGVyIGljb24gb3B0aW9uczsgdGhleSdyZSBhbGwKICAgIC8vIHByZXNlbnQgb24gdGhlIGljb24gb2JqZWN0LgogICAgaWNvbmRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jYmluZChpY29uKTsKCiAgICAvLyBDb25zdHJ1Y3RzIGFuIGljb24gZnJvbSBhIHNwZWNpZmllZCByb3cgb2YgdGhlIGljb24gZGF0YWZyYW1lLgogICAgZ2V0SWNvbiA9IGZ1bmN0aW9uIGdldEljb24oaSkgewogICAgICB2YXIgb3B0cyA9IGljb25kZi5nZXQoaSk7CiAgICAgIGlmICghb3B0cykgewogICAgICAgIHJldHVybiBuZXcgX2xlYWZsZXQyLmRlZmF1bHQuQXdlc29tZU1hcmtlcnMuaWNvbigpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zcXVhcmVNYXJrZXIpIHsKICAgICAgICBvcHRzLmNsYXNzTmFtZSA9ICJhd2Vzb21lLW1hcmtlciBhd2Vzb21lLW1hcmtlci1zcXVhcmUiOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgX2xlYWZsZXQyLmRlZmF1bHQuQXdlc29tZU1hcmtlcnMuaWNvbihvcHRzKTsKICAgIH07CiAgfQoKICBpZiAoIShfanF1ZXJ5Mi5kZWZhdWx0LmlzRW1wdHlPYmplY3QobGF0KSB8fCBfanF1ZXJ5Mi5kZWZhdWx0LmlzRW1wdHlPYmplY3QobG5nKSkgfHwgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMobGF0KSAmJiBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhsbmcpKSB7CgogICAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jb2woImxhdCIsIGxhdCkuY29sKCJsbmciLCBsbmcpLmNvbCgibGF5ZXJJZCIsIGxheWVySWQpLmNvbCgiZ3JvdXAiLCBncm91cCkuY29sKCJwb3B1cCIsIHBvcHVwKS5jb2woInBvcHVwT3B0aW9ucyIsIHBvcHVwT3B0aW9ucykuY29sKCJsYWJlbCIsIGxhYmVsKS5jb2woImxhYmVsT3B0aW9ucyIsIGxhYmVsT3B0aW9ucykuY2JpbmQob3B0aW9ucykuY2JpbmQoY3Jvc3N0YWxrT3B0aW9ucyB8fCB7fSk7CgogICAgaWYgKGljb24pIGljb25kZi5lZmZlY3RpdmVMZW5ndGggPSBkZi5ucm93KCk7CgogICAgYWRkTWFya2Vycyh0aGlzLCBkZiwgZ3JvdXAsIGNsdXN0ZXJPcHRpb25zLCBjbHVzdGVySWQsIGZ1bmN0aW9uIChkZiwgaSkgewogICAgICB2YXIgb3B0aW9ucyA9IGRmLmdldChpKTsKICAgICAgaWYgKGljb24pIG9wdGlvbnMuaWNvbiA9IGdldEljb24oaSk7CiAgICAgIHJldHVybiBfbGVhZmxldDIuZGVmYXVsdC5tYXJrZXIoW2RmLmdldChpLCAibGF0IiksIGRmLmdldChpLCAibG5nIildLCBvcHRpb25zKTsKICAgIH0pOwogIH0KfTsKCmZ1bmN0aW9uIGFkZExheWVycyhtYXAsIGNhdGVnb3J5LCBkZiwgbGF5ZXJGdW5jKSB7CiAgdmFyIF9sb29wMyA9IGZ1bmN0aW9uIF9sb29wMyhpKSB7CiAgICAoZnVuY3Rpb24gKCkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKCiAgICAgIHZhciBsYXllciA9IGxheWVyRnVuYyhkZiwgaSk7CiAgICAgIGlmICghX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGxheWVyKSkgewogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgdGhpc0lkID0gZGYuZ2V0KGksICJsYXllcklkIik7CiAgICAgICAgICB2YXIgdGhpc0dyb3VwID0gZGYuZ2V0KGksICJncm91cCIpOwogICAgICAgICAgX3RoaXM0LmxheWVyTWFuYWdlci5hZGRMYXllcihsYXllciwgY2F0ZWdvcnksIHRoaXNJZCwgdGhpc0dyb3VwLCBkZi5nZXQoaSwgImN0R3JvdXAiLCB0cnVlKSwgZGYuZ2V0KGksICJjdEtleSIsIHRydWUpKTsKICAgICAgICAgIGlmIChsYXllci5iaW5kUG9wdXApIHsKICAgICAgICAgICAgdmFyIHBvcHVwID0gZGYuZ2V0KGksICJwb3B1cCIpOwogICAgICAgICAgICB2YXIgcG9wdXBPcHRpb25zID0gZGYuZ2V0KGksICJwb3B1cE9wdGlvbnMiKTsKICAgICAgICAgICAgaWYgKHBvcHVwICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgaWYgKHBvcHVwT3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHBvcHVwLCBwb3B1cE9wdGlvbnMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsYXllci5iaW5kUG9wdXAocG9wdXApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGxheWVyLmJpbmRMYWJlbCkgewogICAgICAgICAgICB2YXIgbGFiZWwgPSBkZi5nZXQoaSwgImxhYmVsIik7CiAgICAgICAgICAgIHZhciBsYWJlbE9wdGlvbnMgPSBkZi5nZXQoaSwgImxhYmVsT3B0aW9ucyIpOwogICAgICAgICAgICBpZiAobGFiZWwgIT09IG51bGwpIHsKICAgICAgICAgICAgICBpZiAobGFiZWxPcHRpb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsYXllci5iaW5kTGFiZWwobGFiZWwsIGxhYmVsT3B0aW9ucyk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxheWVyLmJpbmRMYWJlbChsYWJlbCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBsYXllci5vbigiY2xpY2siLCBtb3VzZUhhbmRsZXIoX3RoaXM0LmlkLCB0aGlzSWQsIHRoaXNHcm91cCwgY2F0ZWdvcnkgKyAiX2NsaWNrIiksIF90aGlzNCk7CiAgICAgICAgICBsYXllci5vbigibW91c2VvdmVyIiwgbW91c2VIYW5kbGVyKF90aGlzNC5pZCwgdGhpc0lkLCB0aGlzR3JvdXAsIGNhdGVnb3J5ICsgIl9tb3VzZW92ZXIiKSwgX3RoaXM0KTsKICAgICAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIG1vdXNlSGFuZGxlcihfdGhpczQuaWQsIHRoaXNJZCwgdGhpc0dyb3VwLCBjYXRlZ29yeSArICJfbW91c2VvdXQiKSwgX3RoaXM0KTsKICAgICAgICAgIHZhciBoaWdobGlnaHRTdHlsZSA9IGRmLmdldChpLCAiaGlnaGxpZ2h0T3B0aW9ucyIpOwoKICAgICAgICAgIGlmICghX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGhpZ2hsaWdodFN0eWxlKSkgewogICAgICAgICAgICAoZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICB2YXIgZGVmYXVsdFN0eWxlID0ge307CiAgICAgICAgICAgICAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKGhpZ2hsaWdodFN0eWxlLCBmdW5jdGlvbiAoaywgdikgewogICAgICAgICAgICAgICAgaWYgKGsgIT0gImJyaW5nVG9Gcm9udCIgJiYgayAhPSAic2VuZFRvQmFjayIpIHsKICAgICAgICAgICAgICAgICAgaWYgKGRmLmdldChpLCBrKSkgewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdHlsZVtrXSA9IGRmLmdldChpLCBrKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBsYXllci5vbigibW91c2VvdmVyIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoaGlnaGxpZ2h0U3R5bGUpOwogICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFN0eWxlLmJyaW5nVG9Gcm9udCkgewogICAgICAgICAgICAgICAgICB0aGlzLmJyaW5nVG9Gcm9udCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlKGRlZmF1bHRTdHlsZSk7CiAgICAgICAgICAgICAgICBpZiAoaGlnaGxpZ2h0U3R5bGUuc2VuZFRvQmFjaykgewogICAgICAgICAgICAgICAgICB0aGlzLmJyaW5nVG9CYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICB9CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgfSkuY2FsbChtYXApOwogIH07CgogIGZvciAodmFyIGkgPSAwOyBpIDwgZGYubnJvdygpOyBpKyspIHsKICAgIF9sb29wMyhpKTsKICB9Cn0KCm1ldGhvZHMuYWRkR2VuZXJpY0xheWVycyA9IGFkZExheWVyczsKCm1ldGhvZHMuYWRkQ2lyY2xlcyA9IGZ1bmN0aW9uIChsYXQsIGxuZywgcmFkaXVzLCBsYXllcklkLCBncm91cCwgb3B0aW9ucywgcG9wdXAsIHBvcHVwT3B0aW9ucywgbGFiZWwsIGxhYmVsT3B0aW9ucywgaGlnaGxpZ2h0T3B0aW9ucywgY3Jvc3N0YWxrT3B0aW9ucykgewogIGlmICghKF9qcXVlcnkyLmRlZmF1bHQuaXNFbXB0eU9iamVjdChsYXQpIHx8IF9qcXVlcnkyLmRlZmF1bHQuaXNFbXB0eU9iamVjdChsbmcpKSB8fCBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhsYXQpICYmIF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGxuZykpIHsKICAgIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMi5kZWZhdWx0KCkuY29sKCJsYXQiLCBsYXQpLmNvbCgibG5nIiwgbG5nKS5jb2woInJhZGl1cyIsIHJhZGl1cykuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKS5jYmluZChjcm9zc3RhbGtPcHRpb25zIHx8IHt9KTsKCiAgICBhZGRMYXllcnModGhpcywgInNoYXBlIiwgZGYsIGZ1bmN0aW9uIChkZiwgaSkgewogICAgICBpZiAoX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJsYXQiKSkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJsbmciKSkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJyYWRpdXMiKSkpIHsKICAgICAgICByZXR1cm4gX2xlYWZsZXQyLmRlZmF1bHQuY2lyY2xlKFtkZi5nZXQoaSwgImxhdCIpLCBkZi5nZXQoaSwgImxuZyIpXSwgZGYuZ2V0KGksICJyYWRpdXMiKSwgZGYuZ2V0KGkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfSk7CiAgfQp9OwoKbWV0aG9kcy5hZGRDaXJjbGVNYXJrZXJzID0gZnVuY3Rpb24gKGxhdCwgbG5nLCByYWRpdXMsIGxheWVySWQsIGdyb3VwLCBvcHRpb25zLCBjbHVzdGVyT3B0aW9ucywgY2x1c3RlcklkLCBwb3B1cCwgcG9wdXBPcHRpb25zLCBsYWJlbCwgbGFiZWxPcHRpb25zLCBjcm9zc3RhbGtPcHRpb25zKSB7CiAgaWYgKCEoX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGxhdCkgfHwgX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGxuZykpIHx8IF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGxhdCkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMobG5nKSkgewogICAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jb2woImxhdCIsIGxhdCkuY29sKCJsbmciLCBsbmcpLmNvbCgicmFkaXVzIiwgcmFkaXVzKS5jb2woImxheWVySWQiLCBsYXllcklkKS5jb2woImdyb3VwIiwgZ3JvdXApLmNvbCgicG9wdXAiLCBwb3B1cCkuY29sKCJwb3B1cE9wdGlvbnMiLCBwb3B1cE9wdGlvbnMpLmNvbCgibGFiZWwiLCBsYWJlbCkuY29sKCJsYWJlbE9wdGlvbnMiLCBsYWJlbE9wdGlvbnMpLmNiaW5kKGNyb3NzdGFsa09wdGlvbnMgfHwge30pLmNiaW5kKG9wdGlvbnMpOwoKICAgIGFkZE1hcmtlcnModGhpcywgZGYsIGdyb3VwLCBjbHVzdGVyT3B0aW9ucywgY2x1c3RlcklkLCBmdW5jdGlvbiAoZGYsIGkpIHsKICAgICAgcmV0dXJuIF9sZWFmbGV0Mi5kZWZhdWx0LmNpcmNsZU1hcmtlcihbZGYuZ2V0KGksICJsYXQiKSwgZGYuZ2V0KGksICJsbmciKV0sIGRmLmdldChpKSk7CiAgICB9KTsKICB9Cn07CgovKgogKiBAcGFyYW0gbGF0IEFycmF5IG9mIGFycmF5cyBvZiBsYXRpdHVkZSBjb29yZGluYXRlcyBmb3IgcG9seWxpbmVzCiAqIEBwYXJhbSBsbmcgQXJyYXkgb2YgYXJyYXlzIG9mIGxvbmdpdHVkZSBjb29yZGluYXRlcyBmb3IgcG9seWxpbmVzCiAqLwptZXRob2RzLmFkZFBvbHlsaW5lcyA9IGZ1bmN0aW9uIChwb2x5Z29ucywgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMsIHBvcHVwLCBwb3B1cE9wdGlvbnMsIGxhYmVsLCBsYWJlbE9wdGlvbnMsIGhpZ2hsaWdodE9wdGlvbnMpIHsKICBpZiAocG9seWdvbnMubGVuZ3RoID4gMCkgewogICAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jb2woInNoYXBlcyIsIHBvbHlnb25zKS5jb2woImxheWVySWQiLCBsYXllcklkKS5jb2woImdyb3VwIiwgZ3JvdXApLmNvbCgicG9wdXAiLCBwb3B1cCkuY29sKCJwb3B1cE9wdGlvbnMiLCBwb3B1cE9wdGlvbnMpLmNvbCgibGFiZWwiLCBsYWJlbCkuY29sKCJsYWJlbE9wdGlvbnMiLCBsYWJlbE9wdGlvbnMpLmNvbCgiaGlnaGxpZ2h0T3B0aW9ucyIsIGhpZ2hsaWdodE9wdGlvbnMpLmNiaW5kKG9wdGlvbnMpOwoKICAgIGFkZExheWVycyh0aGlzLCAic2hhcGUiLCBkZiwgZnVuY3Rpb24gKGRmLCBpKSB7CiAgICAgIHZhciBzaGFwZXMgPSBkZi5nZXQoaSwgInNoYXBlcyIpOwogICAgICBzaGFwZXMgPSBzaGFwZXMubWFwKGZ1bmN0aW9uIChzaGFwZSkgewogICAgICAgIHJldHVybiBfaHRtbHdpZGdldHMyLmRlZmF1bHQuZGF0YWZyYW1lVG9EMyhzaGFwZVswXSk7CiAgICAgIH0pOwogICAgICBpZiAoc2hhcGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICByZXR1cm4gX2xlYWZsZXQyLmRlZmF1bHQubXVsdGlQb2x5bGluZShzaGFwZXMsIGRmLmdldChpKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIF9sZWFmbGV0Mi5kZWZhdWx0LnBvbHlsaW5lKHNoYXBlc1swXSwgZGYuZ2V0KGkpKTsKICAgICAgfQogICAgfSk7CiAgfQp9OwoKbWV0aG9kcy5yZW1vdmVNYXJrZXIgPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJtYXJrZXIiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJNYXJrZXJzID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJtYXJrZXIiKTsKfTsKCm1ldGhvZHMucmVtb3ZlTWFya2VyQ2x1c3RlciA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoImNsdXN0ZXIiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMucmVtb3ZlTWFya2VyRnJvbUNsdXN0ZXIgPSBmdW5jdGlvbiAobGF5ZXJJZCwgY2x1c3RlcklkKSB7CiAgdmFyIGNsdXN0ZXIgPSB0aGlzLmxheWVyTWFuYWdlci5nZXRMYXllcigiY2x1c3RlciIsIGNsdXN0ZXJJZCk7CiAgaWYgKCFjbHVzdGVyKSByZXR1cm47CiAgY2x1c3Rlci5jbHVzdGVyTGF5ZXJTdG9yZS5yZW1vdmUobGF5ZXJJZCk7Cn07CgptZXRob2RzLmNsZWFyTWFya2VyQ2x1c3RlcnMgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5sYXllck1hbmFnZXIuY2xlYXJMYXllcnMoImNsdXN0ZXIiKTsKfTsKCm1ldGhvZHMucmVtb3ZlU2hhcGUgPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJzaGFwZSIsIGxheWVySWQpOwp9OwoKbWV0aG9kcy5jbGVhclNoYXBlcyA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLmxheWVyTWFuYWdlci5jbGVhckxheWVycygic2hhcGUiKTsKfTsKCm1ldGhvZHMuYWRkUmVjdGFuZ2xlcyA9IGZ1bmN0aW9uIChsYXQxLCBsbmcxLCBsYXQyLCBsbmcyLCBsYXllcklkLCBncm91cCwgb3B0aW9ucywgcG9wdXAsIHBvcHVwT3B0aW9ucywgbGFiZWwsIGxhYmVsT3B0aW9ucywgaGlnaGxpZ2h0T3B0aW9ucykgewogIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMi5kZWZhdWx0KCkuY29sKCJsYXQxIiwgbGF0MSkuY29sKCJsbmcxIiwgbG5nMSkuY29sKCJsYXQyIiwgbGF0MikuY29sKCJsbmcyIiwgbG5nMikuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKTsKCiAgYWRkTGF5ZXJzKHRoaXMsICJzaGFwZSIsIGRmLCBmdW5jdGlvbiAoZGYsIGkpIHsKICAgIGlmIChfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhkZi5nZXQoaSwgImxhdDEiKSkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJsbmcxIikpICYmIF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGRmLmdldChpLCAibGF0MiIpKSAmJiBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhkZi5nZXQoaSwgImxuZzIiKSkpIHsKICAgICAgcmV0dXJuIF9sZWFmbGV0Mi5kZWZhdWx0LnJlY3RhbmdsZShbW2RmLmdldChpLCAibGF0MSIpLCBkZi5nZXQoaSwgImxuZzEiKV0sIFtkZi5nZXQoaSwgImxhdDIiKSwgZGYuZ2V0KGksICJsbmcyIildXSwgZGYuZ2V0KGkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0pOwp9OwoKLyoKICogQHBhcmFtIGxhdCBBcnJheSBvZiBhcnJheXMgb2YgbGF0aXR1ZGUgY29vcmRpbmF0ZXMgZm9yIHBvbHlnb25zCiAqIEBwYXJhbSBsbmcgQXJyYXkgb2YgYXJyYXlzIG9mIGxvbmdpdHVkZSBjb29yZGluYXRlcyBmb3IgcG9seWdvbnMKICovCm1ldGhvZHMuYWRkUG9seWdvbnMgPSBmdW5jdGlvbiAocG9seWdvbnMsIGxheWVySWQsIGdyb3VwLCBvcHRpb25zLCBwb3B1cCwgcG9wdXBPcHRpb25zLCBsYWJlbCwgbGFiZWxPcHRpb25zLCBoaWdobGlnaHRPcHRpb25zKSB7CiAgaWYgKHBvbHlnb25zLmxlbmd0aCA+IDApIHsKICAgIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMi5kZWZhdWx0KCkuY29sKCJzaGFwZXMiLCBwb2x5Z29ucykuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKTsKCiAgICBhZGRMYXllcnModGhpcywgInNoYXBlIiwgZGYsIGZ1bmN0aW9uIChkZiwgaSkgewogICAgICAvLyBUaGlzIGNvZGUgdXNlZCB0byB1c2UgTC5tdWx0aVBvbHlnb24sIGJ1dCB0aGF0IGNhdXNlZAogICAgICAvLyBkb3VibGUtY2xpY2sgb24gYSBtdWx0aXBvbHlnb24gdG8gZmFpbCB0byB6b29tIGluIG9uIHRoZQogICAgICAvLyBtYXAuIFN1cnByaXNpbmdseSwgcHV0dGluZyBhbGwgdGhlIHJpbmdzIGluIGEgc2luZ2xlCiAgICAgIC8vIHBvbHlnb24gc2VlbXMgdG8gc3RpbGwgd29yazsgY29tcGxpY2F0ZWQgbXVsdGlwb2x5Z29ucwogICAgICAvLyBhcmUgc3RpbGwgcmVuZGVyZWQgY29ycmVjdGx5LgogICAgICB2YXIgc2hhcGVzID0gZGYuZ2V0KGksICJzaGFwZXMiKS5tYXAoZnVuY3Rpb24gKHBvbHlnb24pIHsKICAgICAgICByZXR1cm4gcG9seWdvbi5tYXAoX2h0bWx3aWRnZXRzMi5kZWZhdWx0LmRhdGFmcmFtZVRvRDMpOwogICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgdmFsKSB7CiAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQodmFsKTsKICAgICAgfSwgW10pOwogICAgICByZXR1cm4gX2xlYWZsZXQyLmRlZmF1bHQucG9seWdvbihzaGFwZXMsIGRmLmdldChpKSk7CiAgICB9KTsKICB9Cn07CgptZXRob2RzLmFkZEdlb0pTT04gPSBmdW5jdGlvbiAoZGF0YSwgbGF5ZXJJZCwgZ3JvdXAsIHN0eWxlKSB7CiAgLy8gVGhpcyB0aW1lLCBzZWxmIGlzIGFjdHVhbGx5IG5lZWRlZCBiZWNhdXNlIHRoZSBjYWxsYmFja3MgYmVsb3cgbmVlZAogIC8vIHRvIGFjY2VzcyBib3RoIHRoZSBpbm5lciBhbmQgb3V0ZXIgc2Vuc2VzIG9mICJ0aGlzIgogIHZhciBzZWxmID0gdGhpczsKICBpZiAodHlwZW9mIGRhdGEgPT09ICJzdHJpbmciKSB7CiAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTsKICB9CgogIHZhciBnbG9iYWxTdHlsZSA9IF9qcXVlcnkyLmRlZmF1bHQuZXh0ZW5kKHt9LCBzdHlsZSwgZGF0YS5zdHlsZSB8fCB7fSk7CgogIHZhciBnamxheWVyID0gX2xlYWZsZXQyLmRlZmF1bHQuZ2VvSnNvbihkYXRhLCB7CiAgICBzdHlsZTogZnVuY3Rpb24gc3R5bGUoZmVhdHVyZSkgewogICAgICBpZiAoZmVhdHVyZS5zdHlsZSB8fCBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpIHsKICAgICAgICByZXR1cm4gX2pxdWVyeTIuZGVmYXVsdC5leHRlbmQoe30sIGdsb2JhbFN0eWxlLCBmZWF0dXJlLnN0eWxlLCBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBnbG9iYWxTdHlsZTsKICAgICAgfQogICAgfSwKICAgIG9uRWFjaEZlYXR1cmU6IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgdmFyIGV4dHJhSW5mbyA9IHsKICAgICAgICBmZWF0dXJlSWQ6IGZlYXR1cmUuaWQsCiAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzCiAgICAgIH07CiAgICAgIHZhciBwb3B1cCA9IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cDsKICAgICAgaWYgKHR5cGVvZiBwb3B1cCAhPT0gInVuZGVmaW5lZCIgJiYgcG9wdXAgIT09IG51bGwpIGxheWVyLmJpbmRQb3B1cChwb3B1cCk7CiAgICAgIGxheWVyLm9uKCJjbGljayIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgImdlb2pzb25fY2xpY2siLCBleHRyYUluZm8pLCB0aGlzKTsKICAgICAgbGF5ZXIub24oIm1vdXNlb3ZlciIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgImdlb2pzb25fbW91c2VvdmVyIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgImdlb2pzb25fbW91c2VvdXQiLCBleHRyYUluZm8pLCB0aGlzKTsKICAgIH0KICB9KTsKICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihnamxheWVyLCAiZ2VvanNvbiIsIGxheWVySWQsIGdyb3VwKTsKfTsKCm1ldGhvZHMucmVtb3ZlR2VvSlNPTiA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoImdlb2pzb24iLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJHZW9KU09OID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJnZW9qc29uIik7Cn07CgptZXRob2RzLmFkZFRvcG9KU09OID0gZnVuY3Rpb24gKGRhdGEsIGxheWVySWQsIGdyb3VwLCBzdHlsZSkgewogIC8vIFRoaXMgdGltZSwgc2VsZiBpcyBhY3R1YWxseSBuZWVkZWQgYmVjYXVzZSB0aGUgY2FsbGJhY2tzIGJlbG93IG5lZWQKICAvLyB0byBhY2Nlc3MgYm90aCB0aGUgaW5uZXIgYW5kIG91dGVyIHNlbnNlcyBvZiAidGhpcyIKICB2YXIgc2VsZiA9IHRoaXM7CiAgaWYgKHR5cGVvZiBkYXRhID09PSAic3RyaW5nIikgewogICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7CiAgfQoKICB2YXIgZ2xvYmFsU3R5bGUgPSBfanF1ZXJ5Mi5kZWZhdWx0LmV4dGVuZCh7fSwgc3R5bGUsIGRhdGEuc3R5bGUgfHwge30pOwoKICB2YXIgZ2psYXllciA9IF9sZWFmbGV0Mi5kZWZhdWx0Lmdlb0pzb24obnVsbCwgewogICAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKGZlYXR1cmUpIHsKICAgICAgaWYgKGZlYXR1cmUuc3R5bGUgfHwgZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKSB7CiAgICAgICAgcmV0dXJuIF9qcXVlcnkyLmRlZmF1bHQuZXh0ZW5kKHt9LCBnbG9iYWxTdHlsZSwgZmVhdHVyZS5zdHlsZSwgZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZ2xvYmFsU3R5bGU7CiAgICAgIH0KICAgIH0sCiAgICBvbkVhY2hGZWF0dXJlOiBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgIHZhciBleHRyYUluZm8gPSB7CiAgICAgICAgZmVhdHVyZUlkOiBmZWF0dXJlLmlkLAogICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcwogICAgICB9OwogICAgICB2YXIgcG9wdXAgPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7CiAgICAgIGlmICh0eXBlb2YgcG9wdXAgIT09ICJ1bmRlZmluZWQiICYmIHBvcHVwICE9PSBudWxsKSBsYXllci5iaW5kUG9wdXAocG9wdXApOwogICAgICBsYXllci5vbigiY2xpY2siLCBtb3VzZUhhbmRsZXIoc2VsZi5pZCwgbGF5ZXJJZCwgZ3JvdXAsICJ0b3BvanNvbl9jbGljayIsIGV4dHJhSW5mbyksIHRoaXMpOwogICAgICBsYXllci5vbigibW91c2VvdmVyIiwgbW91c2VIYW5kbGVyKHNlbGYuaWQsIGxheWVySWQsIGdyb3VwLCAidG9wb2pzb25fbW91c2VvdmVyIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgInRvcG9qc29uX21vdXNlb3V0IiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICB9CiAgfSk7CiAgZ2xvYmFsLm9tbml2b3JlLnRvcG9qc29uLnBhcnNlKGRhdGEsIG51bGwsIGdqbGF5ZXIpOwogIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKGdqbGF5ZXIsICJ0b3BvanNvbiIsIGxheWVySWQsIGdyb3VwKTsKfTsKCm1ldGhvZHMucmVtb3ZlVG9wb0pTT04gPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJ0b3BvanNvbiIsIGxheWVySWQpOwp9OwoKbWV0aG9kcy5jbGVhclRvcG9KU09OID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJ0b3BvanNvbiIpOwp9OwoKbWV0aG9kcy5hZGRDb250cm9sID0gZnVuY3Rpb24gKGh0bWwsIHBvc2l0aW9uLCBsYXllcklkLCBjbGFzc2VzKSB7CiAgZnVuY3Rpb24gb25BZGQobWFwKSB7CiAgICB2YXIgZGl2ID0gX2xlYWZsZXQyLmRlZmF1bHQuRG9tVXRpbC5jcmVhdGUoImRpdiIsIGNsYXNzZXMpOwogICAgaWYgKHR5cGVvZiBsYXllcklkICE9PSAidW5kZWZpbmVkIiAmJiBsYXllcklkICE9PSBudWxsKSB7CiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoImlkIiwgbGF5ZXJJZCk7CiAgICB9CiAgICB0aGlzLl9kaXYgPSBkaXY7CgogICAgLy8gSXQncyBwb3NzaWJsZSBmb3Igd2luZG93LlNoaW55IHRvIGJlIHRydWUgYnV0IFNoaW55LmluaXRpYWxpemVJbnB1dHMgdG8KICAgIC8vIG5vdCBiZSwgd2hlbiBhIHN0YXRpYyBsZWFmbGV0IHdpZGdldCBpcyBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBzaGlueQogICAgLy8gVUkgZGlyZWN0bHkgKG5vdCB0aHJvdWdoIGxlYWZsZXRPdXRwdXQgb3IgdWlPdXRwdXQpLiBJbiB0aGlzIGNhc2Ugd2UKICAgIC8vIGRvbid0IGRvIHRoZSBub3JtYWwgU2hpbnkgc3R1ZmYgYXMgdGhhdCB3aWxsIGFsbCBoYXBwZW4gd2hlbiBTaGlueQogICAgLy8gaXRzZWxmIGxvYWRzIGFuZCBiaW5kcyB0aGUgZW50aXJlIGRvYy4KCiAgICBpZiAod2luZG93LlNoaW55ICYmIF9zaGlueTIuZGVmYXVsdC5pbml0aWFsaXplSW5wdXRzKSB7CiAgICAgIF9zaGlueTIuZGVmYXVsdC5yZW5kZXJIdG1sKGh0bWwsIHRoaXMuX2Rpdik7CiAgICAgIF9zaGlueTIuZGVmYXVsdC5pbml0aWFsaXplSW5wdXRzKHRoaXMuX2Rpdik7CiAgICAgIF9zaGlueTIuZGVmYXVsdC5iaW5kQWxsKHRoaXMuX2Rpdik7CiAgICB9IGVsc2UgewogICAgICB0aGlzLl9kaXYuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KCiAgICByZXR1cm4gdGhpcy5fZGl2OwogIH0KICBmdW5jdGlvbiBvblJlbW92ZShtYXApIHsKICAgIGlmICh3aW5kb3cuU2hpbnkgJiYgX3NoaW55Mi5kZWZhdWx0LnVuYmluZEFsbCkgewogICAgICBfc2hpbnkyLmRlZmF1bHQudW5iaW5kQWxsKHRoaXMuX2Rpdik7CiAgICB9CiAgfQogIHZhciBDb250cm9sID0gX2xlYWZsZXQyLmRlZmF1bHQuQ29udHJvbC5leHRlbmQoewogICAgb3B0aW9uczogeyBwb3NpdGlvbjogcG9zaXRpb24gfSwKICAgIG9uQWRkOiBvbkFkZCwKICAgIG9uUmVtb3ZlOiBvblJlbW92ZQogIH0pOwogIHRoaXMuY29udHJvbHMuYWRkKG5ldyBDb250cm9sKCksIGxheWVySWQsIGh0bWwpOwp9OwoKbWV0aG9kcy5hZGRDdXN0b21Db250cm9sID0gZnVuY3Rpb24gKGNvbnRyb2wsIGxheWVySWQpIHsKICB0aGlzLmNvbnRyb2xzLmFkZChjb250cm9sLCBsYXllcklkKTsKfTsKCm1ldGhvZHMucmVtb3ZlQ29udHJvbCA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5jb250cm9scy5yZW1vdmUobGF5ZXJJZCk7Cn07CgptZXRob2RzLmNsZWFyQ29udHJvbHMgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5jb250cm9scy5jbGVhcigpOwp9OwoKbWV0aG9kcy5hZGRMZWdlbmQgPSBmdW5jdGlvbiAob3B0aW9ucykgewogIHZhciBsZWdlbmQgPSBfbGVhZmxldDIuZGVmYXVsdC5jb250cm9sKHsgcG9zaXRpb246IG9wdGlvbnMucG9zaXRpb24gfSk7CiAgdmFyIGdyYWRTcGFuID0gdm9pZCAwOwoKICBsZWdlbmQub25BZGQgPSBmdW5jdGlvbiAobWFwKSB7CiAgICB2YXIgZGl2ID0gX2xlYWZsZXQyLmRlZmF1bHQuRG9tVXRpbC5jcmVhdGUoImRpdiIsIG9wdGlvbnMuY2xhc3NOYW1lKSwKICAgICAgICBjb2xvcnMgPSBvcHRpb25zLmNvbG9ycywKICAgICAgICBsYWJlbHMgPSBvcHRpb25zLmxhYmVscywKICAgICAgICBsZWdlbmRIVE1MID0gIiI7CiAgICBpZiAob3B0aW9ucy50eXBlID09PSAibnVtZXJpYyIpIHsKICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyAjIEZvcm1hdHRpbmcgY29uc3RhbnRzLgogICAgICAgIHZhciBzaW5nbGVCaW5IZWlnaHQgPSAyMDsgLy8gVGhlIGRpc3RhbmNlIGJldHdlZW4gdGljayBtYXJrcywgaW4gcHgKICAgICAgICB2YXIgdk1hcmdpbiA9IDg7IC8vIElmIDFzdCB0aWNrIG1hcmsgc3RhcnRzIGF0IHRvcCBvZiBncmFkaWVudCwgaG93CiAgICAgICAgLy8gbWFueSBleHRyYSBweCBhcmUgbmVlZGVkIGZvciB0aGUgdG9wIGhhbGYgb2YgdGhlCiAgICAgICAgLy8gMXN0IGxhYmVsPyAoZGl0dG8gZm9yIGxhc3QgdGljayBtYXJrL2xhYmVsKQogICAgICAgIHZhciB0aWNrV2lkdGggPSA0OyAvLyBIb3cgd2lkZSBzaG91bGQgdGljayBtYXJrcyBiZSwgaW4gcHg/CiAgICAgICAgdmFyIGxhYmVsUGFkZGluZyA9IDY7IC8vIEhvdyBtdWNoIGRpc3RhbmNlIHRvIHJlc2VydmUgZm9yIHRpY2sgbWFyaz8KICAgICAgICAvLyAoTXVzdCBiZSA+PSB0aWNrV2lkdGgpCgogICAgICAgIC8vICMgRGVyaXZlZCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMuCgogICAgICAgIC8vIFdoYXQncyB0aGUgaGVpZ2h0IG9mIGEgc2luZ2xlIGJpbiwgaW4gcGVyY2VudGFnZSAob2YgZ3JhZGllbnQgaGVpZ2h0KT8KICAgICAgICAvLyBJdCBtaWdodCBub3QganVzdCBiZSAxLyhuLTEpLCBpZiB0aGUgZ3JhZGllbnQgZXh0ZW5kcyBwYXN0IHRoZSB0aWNrCiAgICAgICAgLy8gbWFya3MgKHdoaWNoIGNhbiBiZSB0aGUgY2FzZSBmb3IgcHJldHR5IGN1dCBwb2ludHMpLgogICAgICAgIHZhciBzaW5nbGVCaW5QY3QgPSAob3B0aW9ucy5leHRyYS5wX24gLSBvcHRpb25zLmV4dHJhLnBfMSkgLyAobGFiZWxzLmxlbmd0aCAtIDEpOwogICAgICAgIC8vIEVhY2ggYmluIGlzIGBzaW5nbGVCaW5IZWlnaHRgIGhpZ2guIEhvdyB0YWxsIGlzIHRoZSBncmFkaWVudD8KICAgICAgICB2YXIgdG90YWxIZWlnaHQgPSAxIC8gc2luZ2xlQmluUGN0ICogc2luZ2xlQmluSGVpZ2h0ICsgMTsKICAgICAgICAvLyBIb3cgZmFyIHNob3VsZCB0aGUgZmlyc3QgdGljayBiZSBzaGlmdGVkIGRvd24sIHJlbGF0aXZlIHRvIHRoZSB0b3AKICAgICAgICAvLyBvZiB0aGUgZ3JhZGllbnQ/CiAgICAgICAgdmFyIHRpY2tPZmZzZXQgPSBzaW5nbGVCaW5IZWlnaHQgLyBzaW5nbGVCaW5QY3QgKiBvcHRpb25zLmV4dHJhLnBfMTsKCiAgICAgICAgZ3JhZFNwYW4gPSAoMCwgX2pxdWVyeTIuZGVmYXVsdCkoIjxzcGFuLz4iKS5jc3MoewogICAgICAgICAgImJhY2tncm91bmQiOiAibGluZWFyLWdyYWRpZW50KCIgKyBjb2xvcnMgKyAiKSIsCiAgICAgICAgICAib3BhY2l0eSI6IG9wdGlvbnMub3BhY2l0eSwKICAgICAgICAgICJoZWlnaHQiOiB0b3RhbEhlaWdodCArICJweCIsCiAgICAgICAgICAid2lkdGgiOiAiMThweCIsCiAgICAgICAgICAiZGlzcGxheSI6ICJibG9jayIsCiAgICAgICAgICAibWFyZ2luLXRvcCI6IHZNYXJnaW4gKyAicHgiCiAgICAgICAgfSk7CiAgICAgICAgdmFyIGxlZnREaXYgPSAoMCwgX2pxdWVyeTIuZGVmYXVsdCkoIjxkaXYvPiIpLmNzcygiZmxvYXQiLCAibGVmdCIpLAogICAgICAgICAgICByaWdodERpdiA9ICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KSgiPGRpdi8+IikuY3NzKCJmbG9hdCIsICJsZWZ0Iik7CiAgICAgICAgbGVmdERpdi5hcHBlbmQoZ3JhZFNwYW4pOwogICAgICAgICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShkaXYpLmFwcGVuZChsZWZ0RGl2KS5hcHBlbmQocmlnaHREaXYpLmFwcGVuZCgoMCwgX2pxdWVyeTIuZGVmYXVsdCkoIjxiciBjbGVhcj1cImJvdGhcIi8+IikpOwoKICAgICAgICAvLyBIYXZlIHRvIGF0dGFjaCB0aGUgZGl2IHRvIHRoZSBib2R5IGF0IHRoaXMgZWFybHkgcG9pbnQsIHNvIHRoYXQgdGhlCiAgICAgICAgLy8gc3ZnIHRleHQgZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCkgYWN0dWFsbHkgd29ya3MsIGJlbG93LgogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKCiAgICAgICAgdmFyIG5zID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjsKICAgICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zLCAic3ZnIik7CiAgICAgICAgcmlnaHREaXYuYXBwZW5kKHN2Zyk7CiAgICAgICAgdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobnMsICJnIik7CiAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGcpLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoMCwgIiArIHZNYXJnaW4gKyAiKSIpOwogICAgICAgIHN2Zy5hcHBlbmRDaGlsZChnKTsKCiAgICAgICAgLy8gbWF4IGxhYmVsIHdpZHRoIG5lZWRlZCB0byBzZXQgd2lkdGggb2Ygc3ZnLCBhbmQgcmlnaHQtanVzdGlmeSB0ZXh0CiAgICAgICAgdmFyIG1heExibFdpZHRoID0gMDsKCiAgICAgICAgLy8gQ3JlYXRlIHRpY2sgbWFya3MgYW5kIGxhYmVscwogICAgICAgIF9qcXVlcnkyLmRlZmF1bHQuZWFjaChsYWJlbHMsIGZ1bmN0aW9uIChpLCBsYWJlbCkgewogICAgICAgICAgdmFyIHkgPSB0aWNrT2Zmc2V0ICsgaSAqIHNpbmdsZUJpbkhlaWdodCArIDAuNTsKCiAgICAgICAgICB2YXIgdGhpc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zLCAidGV4dCIpOwogICAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKHRoaXNMYWJlbCkudGV4dChsYWJlbHNbaV0pLmF0dHIoInkiLCB5KS5hdHRyKCJkeCIsIGxhYmVsUGFkZGluZykuYXR0cigiZHkiLCAiMC41ZXgiKTsKICAgICAgICAgIGcuYXBwZW5kQ2hpbGQodGhpc0xhYmVsKTsKICAgICAgICAgIG1heExibFdpZHRoID0gTWF0aC5tYXgobWF4TGJsV2lkdGgsIHRoaXNMYWJlbC5nZXRDb21wdXRlZFRleHRMZW5ndGgoKSk7CgogICAgICAgICAgdmFyIHRoaXNUaWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zLCAibGluZSIpOwogICAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKHRoaXNUaWNrKS5hdHRyKCJ4MSIsIDApLmF0dHIoIngyIiwgdGlja1dpZHRoKS5hdHRyKCJ5MSIsIHkpLmF0dHIoInkyIiwgeSkuYXR0cigic3Ryb2tlLXdpZHRoIiwgMSk7CiAgICAgICAgICBnLmFwcGVuZENoaWxkKHRoaXNUaWNrKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyB0aGUgbWF4IGxhYmVsIHdpZHRoLCB3ZSBjYW4gcmlnaHQtanVzdGlmeQogICAgICAgICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShzdmcpLmZpbmQoInRleHQiKS5hdHRyKCJkeCIsIGxhYmVsUGFkZGluZyArIG1heExibFdpZHRoKS5hdHRyKCJ0ZXh0LWFuY2hvciIsICJlbmQiKTsKICAgICAgICAvLyBGaW5hbCBzaXplIGZvciA8c3ZnPgogICAgICAgICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShzdmcpLmNzcyh7CiAgICAgICAgICB3aWR0aDogbWF4TGJsV2lkdGggKyBsYWJlbFBhZGRpbmcgKyAicHgiLAogICAgICAgICAgaGVpZ2h0OiB0b3RhbEhlaWdodCArIHZNYXJnaW4gKiAyICsgInB4IgogICAgICAgIH0pOwoKICAgICAgICBpZiAob3B0aW9ucy5uYV9jb2xvcikgewogICAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGRpdikuYXBwZW5kKCI8ZGl2PjxpIHN0eWxlPVwiYmFja2dyb3VuZDoiICsgb3B0aW9ucy5uYV9jb2xvciArICJcIj48L2k+ICIgKyBvcHRpb25zLm5hX2xhYmVsICsgIjwvZGl2PiIpOwogICAgICAgIH0KICAgICAgfSkoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChvcHRpb25zLm5hX2NvbG9yKSB7CiAgICAgICAgY29sb3JzLnB1c2gob3B0aW9ucy5uYV9jb2xvcik7CiAgICAgICAgbGFiZWxzLnB1c2gob3B0aW9ucy5uYV9sYWJlbCk7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZWdlbmRIVE1MICs9ICI8aSBzdHlsZT1cImJhY2tncm91bmQ6IiArIGNvbG9yc1tpXSArICI7b3BhY2l0eToiICsgb3B0aW9ucy5vcGFjaXR5ICsgIlwiPjwvaT4gIiArIGxhYmVsc1tpXSArICI8YnIgY2xlYXI9J2JvdGgnLz4iOwogICAgICB9CiAgICAgIGRpdi5pbm5lckhUTUwgPSBsZWdlbmRIVE1MOwogICAgfQogICAgaWYgKG9wdGlvbnMudGl0bGUpICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShkaXYpLnByZXBlbmQoIjxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjNweFwiPjxzdHJvbmc+IiArIG9wdGlvbnMudGl0bGUgKyAiPC9zdHJvbmc+PC9kaXY+Iik7CiAgICByZXR1cm4gZGl2OwogIH07CgogIHRoaXMuY29udHJvbHMuYWRkKGxlZ2VuZCwgb3B0aW9ucy5sYXllcklkKTsKfTsKCm1ldGhvZHMuYWRkTGF5ZXJzQ29udHJvbCA9IGZ1bmN0aW9uIChiYXNlR3JvdXBzLCBvdmVybGF5R3JvdXBzLCBvcHRpb25zKSB7CiAgdmFyIF90aGlzNSA9IHRoaXM7CgogIC8vIE9ubHkgYWxsb3cgb25lIGxheWVycyBjb250cm9sIGF0IGEgdGltZQogIG1ldGhvZHMucmVtb3ZlTGF5ZXJzQ29udHJvbC5jYWxsKHRoaXMpOwoKICB2YXIgZmlyc3RMYXllciA9IHRydWU7CiAgdmFyIGJhc2UgPSB7fTsKICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2goKDAsIF91dGlsLmFzQXJyYXkpKGJhc2VHcm91cHMpLCBmdW5jdGlvbiAoaSwgZykgewogICAgdmFyIGxheWVyID0gX3RoaXM1LmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGcsIHRydWUpOwogICAgaWYgKGxheWVyKSB7CiAgICAgIGJhc2VbZ10gPSBsYXllcjsKCiAgICAgIC8vIENoZWNrIGlmID4xIGJhc2UgbGF5ZXJzIGFyZSB2aXNpYmxlOyBpZiBzbywgaGlkZSBhbGwgYnV0IHRoZSBmaXJzdCBvbmUKICAgICAgaWYgKF90aGlzNS5oYXNMYXllcihsYXllcikpIHsKICAgICAgICBpZiAoZmlyc3RMYXllcikgewogICAgICAgICAgZmlyc3RMYXllciA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdGhpczUucmVtb3ZlTGF5ZXIobGF5ZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0pOwogIHZhciBvdmVybGF5ID0ge307CiAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKCgwLCBfdXRpbC5hc0FycmF5KShvdmVybGF5R3JvdXBzKSwgZnVuY3Rpb24gKGksIGcpIHsKICAgIHZhciBsYXllciA9IF90aGlzNS5sYXllck1hbmFnZXIuZ2V0TGF5ZXJHcm91cChnLCB0cnVlKTsKICAgIGlmIChsYXllcikgewogICAgICBvdmVybGF5W2ddID0gbGF5ZXI7CiAgICB9CiAgfSk7CgogIHZhciBsYXllcnNDb250cm9sID0gX2xlYWZsZXQyLmRlZmF1bHQuY29udHJvbC5sYXllcnMoYmFzZSwgb3ZlcmxheSwgb3B0aW9ucykuYWRkVG8odGhpcyk7CiAgdGhpcy5jdXJyZW50TGF5ZXJzQ29udHJvbCA9IGxheWVyc0NvbnRyb2w7Cn07CgptZXRob2RzLnJlbW92ZUxheWVyc0NvbnRyb2wgPSBmdW5jdGlvbiAoKSB7CiAgaWYgKHRoaXMuY3VycmVudExheWVyc0NvbnRyb2wpIHsKICAgIHRoaXMuY3VycmVudExheWVyc0NvbnRyb2wucmVtb3ZlRnJvbSh0aGlzKTsKICAgIHRoaXMuY3VycmVudExheWVyc0NvbnRyb2wgPSBudWxsOwogIH0KfTsKCm1ldGhvZHMuYWRkU2NhbGVCYXIgPSBmdW5jdGlvbiAob3B0aW9ucykgewoKICAvLyBPbmx5IGFsbG93IG9uZSBzY2FsZSBiYXIgYXQgYSB0aW1lCiAgbWV0aG9kcy5yZW1vdmVTY2FsZUJhci5jYWxsKHRoaXMpOwoKICB2YXIgc2NhbGVCYXIgPSBfbGVhZmxldDIuZGVmYXVsdC5jb250cm9sLnNjYWxlKG9wdGlvbnMpLmFkZFRvKHRoaXMpOwogIHRoaXMuY3VycmVudFNjYWxlQmFyID0gc2NhbGVCYXI7Cn07CgptZXRob2RzLnJlbW92ZVNjYWxlQmFyID0gZnVuY3Rpb24gKCkgewogIGlmICh0aGlzLmN1cnJlbnRTY2FsZUJhcikgewogICAgdGhpcy5jdXJyZW50U2NhbGVCYXIucmVtb3ZlRnJvbSh0aGlzKTsKICAgIHRoaXMuY3VycmVudFNjYWxlQmFyID0gbnVsbDsKICB9Cn07CgptZXRob2RzLmhpZGVHcm91cCA9IGZ1bmN0aW9uIChncm91cCkgewogIHZhciBfdGhpczYgPSB0aGlzOwoKICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2goKDAsIF91dGlsLmFzQXJyYXkpKGdyb3VwKSwgZnVuY3Rpb24gKGksIGcpIHsKICAgIHZhciBsYXllciA9IF90aGlzNi5sYXllck1hbmFnZXIuZ2V0TGF5ZXJHcm91cChnLCB0cnVlKTsKICAgIGlmIChsYXllcikgewogICAgICBfdGhpczYucmVtb3ZlTGF5ZXIobGF5ZXIpOwogICAgfQogIH0pOwp9OwoKbWV0aG9kcy5zaG93R3JvdXAgPSBmdW5jdGlvbiAoZ3JvdXApIHsKICB2YXIgX3RoaXM3ID0gdGhpczsKCiAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKCgwLCBfdXRpbC5hc0FycmF5KShncm91cCksIGZ1bmN0aW9uIChpLCBnKSB7CiAgICB2YXIgbGF5ZXIgPSBfdGhpczcubGF5ZXJNYW5hZ2VyLmdldExheWVyR3JvdXAoZywgdHJ1ZSk7CiAgICBpZiAobGF5ZXIpIHsKICAgICAgX3RoaXM3LmFkZExheWVyKGxheWVyKTsKICAgIH0KICB9KTsKfTsKCmZ1bmN0aW9uIHNldHVwU2hvd0hpZGVHcm91cHNPblpvb20obWFwKSB7CiAgaWYgKG1hcC5sZWFmbGV0ci5faGFzSW5pdGlhbGl6ZWRTaG93SGlkZUdyb3VwcykgewogICAgcmV0dXJuOwogIH0KICBtYXAubGVhZmxldHIuX2hhc0luaXRpYWxpemVkU2hvd0hpZGVHcm91cHMgPSB0cnVlOwoKICBmdW5jdGlvbiBzZXRWaXNpYmlsaXR5KGxheWVyLCB2aXNpYmxlKSB7CiAgICBpZiAodmlzaWJsZSAhPT0gbWFwLmhhc0xheWVyKGxheWVyKSkgewogICAgICBpZiAodmlzaWJsZSkgbWFwLmFkZExheWVyKGxheWVyKTtlbHNlIG1hcC5yZW1vdmVMYXllcihsYXllcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzaG93SGlkZUdyb3Vwc09uWm9vbSgpIHsKICAgIGlmICghbWFwLmxheWVyTWFuYWdlcikgcmV0dXJuOwoKICAgIHZhciB6b29tID0gbWFwLmdldFpvb20oKTsKICAgIG1hcC5sYXllck1hbmFnZXIuZ2V0QWxsR3JvdXBOYW1lcygpLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7CiAgICAgIHZhciBsYXllciA9IG1hcC5sYXllck1hbmFnZXIuZ2V0TGF5ZXJHcm91cChncm91cCwgZmFsc2UpOwogICAgICBpZiAobGF5ZXIgJiYgdHlwZW9mIGxheWVyLnpvb21MZXZlbHMgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgc2V0VmlzaWJpbGl0eShsYXllciwgbGF5ZXIuem9vbUxldmVscyA9PT0gdHJ1ZSB8fCBsYXllci56b29tTGV2ZWxzLmluZGV4T2Yoem9vbSkgPj0gMCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgbWFwLnNob3dIaWRlR3JvdXBzT25ab29tID0gc2hvd0hpZGVHcm91cHNPblpvb207CiAgbWFwLm9uKCJ6b29tZW5kIiwgc2hvd0hpZGVHcm91cHNPblpvb20pOwp9CgptZXRob2RzLnNldEdyb3VwT3B0aW9ucyA9IGZ1bmN0aW9uIChncm91cCwgb3B0aW9ucykgewogIHZhciBfdGhpczggPSB0aGlzOwoKICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2goKDAsIF91dGlsLmFzQXJyYXkpKGdyb3VwKSwgZnVuY3Rpb24gKGksIGcpIHsKICAgIHZhciBsYXllciA9IF90aGlzOC5sYXllck1hbmFnZXIuZ2V0TGF5ZXJHcm91cChnLCB0cnVlKTsKICAgIC8vIFRoaXMgc2xpZ2h0bHkgdG9ydHVyZWQgY2hlY2sgaXMgYmVjYXVzZSAwIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHpvb21MZXZlbHMKICAgIGlmICh0eXBlb2Ygb3B0aW9ucy56b29tTGV2ZWxzICE9PSAidW5kZWZpbmVkIiAmJiBvcHRpb25zLnpvb21MZXZlbHMgIT09IG51bGwpIHsKICAgICAgbGF5ZXIuem9vbUxldmVscyA9ICgwLCBfdXRpbC5hc0FycmF5KShvcHRpb25zLnpvb21MZXZlbHMpOwogICAgfQogIH0pOwoKICBzZXR1cFNob3dIaWRlR3JvdXBzT25ab29tKHRoaXMpOwogIHRoaXMuc2hvd0hpZGVHcm91cHNPblpvb20oKTsKfTsKCm1ldGhvZHMuYWRkUmFzdGVySW1hZ2UgPSBmdW5jdGlvbiAodXJpLCBib3VuZHMsIG9wYWNpdHksIGF0dHJpYnV0aW9uLCBsYXllcklkLCBncm91cCkgewogIC8vIHVyaSBpcyBhIGRhdGEgVVJJIGNvbnRhaW5pbmcgYW4gaW1hZ2UuIFdlIHdhbnQgdG8gcGFpbnQgdGhpcyBpbWFnZSBhcyBhCiAgLy8gbGF5ZXIgYXQgKHRvcC1sZWZ0KSBib3VuZHNbMF0gdG8gKGJvdHRvbS1yaWdodCkgYm91bmRzWzFdLgoKICAvLyBXZSBjYW4ndCBzaW1wbHkgdXNlIEltYWdlT3ZlcmxheSwgYXMgaXQgdXNlcyBiaWxpbmVhciBzY2FsaW5nIHdoaWNoIGxvb2tzCiAgLy8gYXdmdWwgYXMgeW91IHpvb20gaW4gKGFuZCBzb21ldGltZXMgc2hpZnRzIHBvc2l0aW9ucyBvciBkaXNhcHBlYXJzKS4KICAvLyBJbnN0ZWFkLCB3ZSdsbCB1c2UgYSBUaWxlTGF5ZXIuQ2FudmFzIHRvIGRyYXcgcGllY2VzIG9mIHRoZSBpbWFnZS4KCiAgLy8gRmlyc3QsIHNvbWUgaGVscGVyIGZ1bmN0aW9ucy4KCiAgLy8gZGVncmVlMnRpbGUgY29udmVydHMgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYW5kIHpvb20gdG8geCBhbmQgeSB0aWxlCiAgLy8gbnVtYmVycy4gVGhlIHRpbGUgbnVtYmVycyByZXR1cm5lZCBjYW4gYmUgbm9uLWludGVncmFsLCBhcyB0aGVyZSdzIG5vCiAgLy8gcmVhc29uIHRvIGV4cGVjdCB0aGF0IHRoZSBsYXQvbG5nIGlucHV0cyBhcmUgZXhhY3RseSBvbiB0aGUgYm9yZGVyIG9mIHR3bwogIC8vIHRpbGVzLgogIC8vCiAgLy8gV2UnbGwgdXNlIHRoaXMgdG8gY29udmVydCB0aGUgYm91bmRzIHdlIGdvdCBmcm9tIHRoZSBzZXJ2ZXIsIGludG8gY29vcmRzCiAgLy8gaW4gdGlsZS1zcGFjZSBhdCBhIGdpdmVuIHpvb20gbGV2ZWwuIE5vdGUgdGhhdCBvbmNlIHdlIGRvIHRoZSBjb252ZXJzaW9uLAogIC8vIHdlIGRvbid0IHRvIGRvIGFueSBtb3JlIHRyaWdvbm9tZXRyeSB0byBjb252ZXJ0IGJldHdlZW4gcGl4ZWwgY29vcmRpbmF0ZXMKICAvLyBhbmQgdGlsZSBjb29yZGluYXRlczsgdGhlIHNvdXJjZSBpbWFnZSBwaXhlbCBjb29yZHMsIGRlc3RpbmF0aW9uIGNhbnZhcwogIC8vIHBpeGVsIGNvb3JkcywgYW5kIHRpbGUgY29vcmRzIGFsbCBjYW4gYmUgc2NhbGVkIGxpbmVhcmx5LgogIGZ1bmN0aW9uIGRlZ3JlZTJ0aWxlKGxhdCwgbG5nLCB6b29tKSB7CiAgICAvLyBTZWUgaHR0cDovL3dpa2kub3BlbnN0cmVldG1hcC5vcmcvd2lraS9TbGlwcHlfbWFwX3RpbGVuYW1lcwogICAgdmFyIGxhdFJhZCA9IGxhdCAqIE1hdGguUEkgLyAxODA7CiAgICB2YXIgbiA9IE1hdGgucG93KDIsIHpvb20pOwogICAgdmFyIHggPSAobG5nICsgMTgwKSAvIDM2MCAqIG47CiAgICB2YXIgeSA9ICgxIC0gTWF0aC5sb2coTWF0aC50YW4obGF0UmFkKSArIDEgLyBNYXRoLmNvcyhsYXRSYWQpKSAvIE1hdGguUEkpIC8gMiAqIG47CiAgICByZXR1cm4geyB4OiB4LCB5OiB5IH07CiAgfQoKICAvLyBHaXZlbiBhIHJhbmdlIFtmcm9tLHRvKSBhbmQgZWl0aGVyIG9uZSBvciB0d28gbnVtYmVycywgcmV0dXJucyB0cnVlIGlmCiAgLy8gdGhlcmUgaXMgYW55IG92ZXJsYXAgYmV0d2VlbiBbeCx4MSkgYW5kIHRoZSByYW5nZS0tb3IgaWYgeDEgaXMgb21pdHRlZCwKICAvLyB0aGVuIHJldHVybnMgdHJ1ZSBpZiB4IGlzIHdpdGhpbiBbZnJvbSx0bykuCiAgZnVuY3Rpb24gb3ZlcmxhcChmcm9tLCB0bywgeCwgLyogb3B0aW9uYWwgKi94MSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgeDEgPSB4OwogICAgcmV0dXJuIHggPCB0byAmJiB4MSA+PSBmcm9tOwogIH0KCiAgZnVuY3Rpb24gZ2V0Q2FudmFzU21vb3RoaW5nUHJvcGVydHkoY3R4KSB7CiAgICB2YXIgY2FuZGlkYXRlcyA9IFsiaW1hZ2VTbW9vdGhpbmdFbmFibGVkIiwgIm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCIsICJ3ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQiLCAibXNJbWFnZVNtb290aGluZ0VuYWJsZWQiXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodHlwZW9mIGN0eFtjYW5kaWRhdGVzW2ldXSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICByZXR1cm4gY2FuZGlkYXRlc1tpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBPdXIgZ2VuZXJhbCBzdHJhdGVneSBpcyB0bzoKICAvLyAxLiBMb2FkIHRoZSBkYXRhIFVSSSBpbiBhbiBJbWFnZSgpIG9iamVjdCwgc28gd2UgY2FuIGdldCBpdHMgcGl4ZWwKICAvLyAgICBkaW1lbnNpb25zIGFuZCB0aGUgdW5kZXJseWluZyBpbWFnZSBkYXRhLiAoV2UgY291bGQgaGF2ZSBkb25lIHRoaXMKICAvLyAgICBieSBub3QgZW5jb2RpbmcgYXMgUE5HIGF0IGFsbCBidXQganVzdCBzZW5kIGFuIGFycmF5IG9mIFJHQkEgdmFsdWVzCiAgLy8gICAgZnJvbSB0aGUgc2VydmVyLCBidXQgdGhhdCB3b3VsZCBpbmZsYXRlIHRoZSBKU09OIHRvbyBtdWNoLikKICAvLyAyLiBDcmVhdGUgYSBoaWRkZW4gY2FudmFzIHRoYXQgd2UgdXNlIGp1c3QgdG8gZXh0cmFjdCB0aGUgaW1hZ2UgZGF0YQogIC8vICAgIGZyb20gdGhlIEltYWdlICh1c2luZyBDb250ZXh0MkQuZ2V0SW1hZ2VEYXRhKCkpLgogIC8vIDMuIENyZWF0ZSBhIFRpbGVMYXllci5DYW52YXMgYW5kIGFkZCBpdCB0byB0aGUgbWFwLgoKICAvLyBXZSB3YW50IHRvIHN5bmNocm9ub3VzbHkgY3JlYXRlIGFuZCBhdHRhY2ggdGhlIFRpbGVMYXllci5DYW52YXMgKHNvIGFuCiAgLy8gaW1tZWRpYXRlIGNhbGwgdG8gY2xlYXJSYXN0ZXJzKCkgd2lsbCBiZSByZXNwZWN0ZWQsIGZvciBleGFtcGxlKSwgYnV0CiAgLy8gSW1hZ2UgbG9hZHMgaXRzIGRhdGEgYXN5bmNocm9ub3VzbHkuIEZvcnR1bmF0ZWx5IHdlIGNhbiByZXNvbHZlIHRoaXMKICAvLyBieSBwdXR0aW5nIFRpbGVMYXllci5DYW52YXMgaW50byBhc3luYyBtb2RlLCB3aGljaCB3aWxsIGxldCB1cyBjcmVhdGUKICAvLyBhbmQgYXR0YWNoIHRoZSBsYXllciBidXQgaGF2ZSBpdCB3YWl0IHVudGlsIHRoZSBpbWFnZSBpcyBsb2FkZWQgYmVmb3JlCiAgLy8gaXQgYWN0dWFsbHkgZHJhd3MgYW55dGhpbmcuCgogIC8vIFRoZXNlIGFyZSB0aGUgdmFyaWFibGVzIHRoYXQgd2Ugd2lsbCBwb3B1bGF0ZSBvbmNlIHRoZSBpbWFnZSBpcyBsb2FkZWQuCiAgdmFyIGltZ0RhdGEgPSBudWxsOyAvLyAxZCByb3ctbWFqb3IgYXJyYXksIGZvdXIgWzAtMjU1XSBpbnRlZ2VycyBwZXIgcGl4ZWwKICB2YXIgaW1nRGF0YU1pcE1hcHBlciA9IG51bGw7CiAgdmFyIHcgPSBudWxsOyAvLyBpbWFnZSB3aWR0aCBpbiBwaXhlbHMKICB2YXIgaCA9IG51bGw7IC8vIGltYWdlIGhlaWdodCBpbiBwaXhlbHMKCiAgLy8gV2UnbGwgdXNlIHRoaXMgYXJyYXkgdG8gc3RvcmUgY2FsbGJhY2tzIHRoYXQgbmVlZCB0byBiZSBpbnZva2VkIG9uY2UKICAvLyBpbWdEYXRhLCB3LCBhbmQgaCBoYXZlIGJlZW4gcmVzb2x2ZWQuCiAgdmFyIGltZ0RhdGFDYWxsYmFja3MgPSBbXTsKCiAgLy8gQ29uc3VtZXJzIG9mIGltZ0RhdGEsIHcsIGFuZCBoIGNhbiBjYWxsIHRoaXMgdG8gYmUgbm90aWZpZWQgd2hlbiBkYXRhCiAgLy8gaXMgYXZhaWxhYmxlLiBVbmxpa2UgbW9zdCBhc3luYy9wcm9taXNlLWJhc2VkIEFQSXMsIHRoZSBjYWxsYmFjayB3aWxsCiAgLy8gYmUgaW52b2tlZCBpbW1lZGlhdGVseS9zeW5jaHJvbm91c2x5IGlmIHRoZSBkYXRhIGlzIGFscmVhZHkgYXZhaWxhYmxlLgogIGZ1bmN0aW9uIGdldEltYWdlRGF0YShjYWxsYmFjaykgewogICAgaWYgKGltZ0RhdGEgIT0gbnVsbCkgewogICAgICBjYWxsYmFjayhpbWdEYXRhLCB3LCBoLCBpbWdEYXRhTWlwTWFwcGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGltZ0RhdGFDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICB9CiAgfQoKICB2YXIgaW1nID0gbmV3IEltYWdlKCk7CiAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgIC8vIFNhdmUgc2l6ZQogICAgdyA9IGltZy53aWR0aDsKICAgIGggPSBpbWcuaGVpZ2h0OwoKICAgIC8vIENyZWF0ZSBhIGR1bW15IGNhbnZhcyB0byBleHRyYWN0IHRoZSBpbWFnZSBkYXRhCiAgICB2YXIgaW1nRGF0YUNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgaW1nRGF0YUNhbnZhcy53aWR0aCA9IHc7CiAgICBpbWdEYXRhQ2FudmFzLmhlaWdodCA9IGg7CiAgICBpbWdEYXRhQ2FudmFzLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZ0RhdGFDYW52YXMpOwoKICAgIHZhciBpbWdEYXRhQ3R4ID0gaW1nRGF0YUNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgaW1nRGF0YUN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTsKCiAgICAvLyBTYXZlIHRoZSBpbWFnZSBkYXRhLgogICAgaW1nRGF0YSA9IGltZ0RhdGFDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7CiAgICBpbWdEYXRhTWlwTWFwcGVyID0gbmV3IF9taXBtYXBwZXIyLmRlZmF1bHQoaW1nKTsKCiAgICAvLyBEb25lIHdpdGggdGhlIGNhbnZhcywgcmVtb3ZlIGl0IGZyb20gdGhlIHBhZ2Ugc28gaXQgY2FuIGJlIGdjJ2QuCiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGltZ0RhdGFDYW52YXMpOwoKICAgIC8vIEFsZXJ0IGFueSBnZXRJbWFnZURhdGEgY2FsbGVycyB3aG8gYXJlIHdhaXRpbmcuCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGltZ0RhdGFDYWxsYmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgaW1nRGF0YUNhbGxiYWNrc1tpXShpbWdEYXRhLCB3LCBoLCBpbWdEYXRhTWlwTWFwcGVyKTsKICAgIH0KICAgIGltZ0RhdGFDYWxsYmFja3MgPSBbXTsKICB9OwogIGltZy5zcmMgPSB1cmk7CgogIHZhciBjYW52YXNUaWxlcyA9IF9sZWFmbGV0Mi5kZWZhdWx0LnRpbGVMYXllci5jYW52YXMoewogICAgb3BhY2l0eTogb3BhY2l0eSwKICAgIGF0dHJpYnV0aW9uOiBhdHRyaWJ1dGlvbiwKICAgIGRldGVjdFJldGluYTogdHJ1ZSwKICAgIGFzeW5jOiB0cnVlCiAgfSk7CgogIGNhbnZhc1RpbGVzLmRyYXdUaWxlID0gZnVuY3Rpb24gKGNhbnZhcywgdGlsZVBvaW50LCB6b29tKSB7CiAgICBnZXRJbWFnZURhdGEoZnVuY3Rpb24gKGltZ0RhdGEsIHcsIGgsIG1pcG1hcHBlcikgewogICAgICB0cnkgewogICAgICAgIHZhciBfcmV0NyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIFRoZSBDb250ZXh0MkQgd2UnbGwgYmVpbmcgZHJhd2luZyBvbnRvLiBJdCdzIGFsd2F5cyAyNTZ4MjU2LgogICAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwoKICAgICAgICAgIC8vIENvbnZlcnQgb3VyIGltYWdlIGRhdGEncyB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0IGxvY2F0aW9ucyBpbnRvCiAgICAgICAgICAvLyB4L3kgdGlsZSBjb29yZGluYXRlcy4gVGhpcyBpcyBlc3NlbnRpYWxseSBkb2luZyBhIHNwaGVyaWNhbCBtZXJjYXRvcgogICAgICAgICAgLy8gcHJvamVjdGlvbiwgdGhlbiBtdWx0aXBseWluZyBieSAyXnpvb20uCiAgICAgICAgICB2YXIgdG9wTGVmdCA9IGRlZ3JlZTJ0aWxlKGJvdW5kc1swXVswXSwgYm91bmRzWzBdWzFdLCB6b29tKTsKICAgICAgICAgIHZhciBib3R0b21SaWdodCA9IGRlZ3JlZTJ0aWxlKGJvdW5kc1sxXVswXSwgYm91bmRzWzFdWzFdLCB6b29tKTsKICAgICAgICAgIC8vIFRoZSBzaXplIG9mIHRoZSBpbWFnZSBpbiB4L3kgdGlsZSBjb29yZGluYXRlcy4KICAgICAgICAgIHZhciBleHRlbnQgPSB7IHg6IGJvdHRvbVJpZ2h0LnggLSB0b3BMZWZ0LngsIHk6IGJvdHRvbVJpZ2h0LnkgLSB0b3BMZWZ0LnkgfTsKCiAgICAgICAgICAvLyBTaG9ydCBjaXJjdWl0IGlmIHRpbGUgaXMgdG90YWxseSBkaXNqb2ludCBmcm9tIGltYWdlLgogICAgICAgICAgaWYgKCFvdmVybGFwKHRpbGVQb2ludC54LCB0aWxlUG9pbnQueCArIDEsIHRvcExlZnQueCwgYm90dG9tUmlnaHQueCkpIHJldHVybiB7CiAgICAgICAgICAgICAgdjogdm9pZCAwCiAgICAgICAgICAgIH07CiAgICAgICAgICBpZiAoIW92ZXJsYXAodGlsZVBvaW50LnksIHRpbGVQb2ludC55ICsgMSwgdG9wTGVmdC55LCBib3R0b21SaWdodC55KSkgcmV0dXJuIHsKICAgICAgICAgICAgICB2OiB2b2lkIDAKICAgICAgICAgICAgfTsKCiAgICAgICAgICAvLyBUaGUgbGluZWFyIHJlc29sdXRpb24gb2YgdGhlIHRpbGUgd2UncmUgZHJhd2luZyBpcyBhbHdheXMgMjU2cHggcGVyIHRpbGUgdW5pdC4KICAgICAgICAgIC8vIElmIHRoZSBsaW5lYXIgcmVzb2x1dGlvbiAoaW4gZWl0aGVyIGRpcmVjdGlvbikgb2YgdGhlIGltYWdlIGlzIGxlc3MgdGhhbiAyNTZweAogICAgICAgICAgLy8gcGVyIHRpbGUgdW5pdCwgdGhlbiB1c2UgbmVhcmVzdCBuZWlnaGJvcjsgb3RoZXJ3aXNlLCB1c2UgdGhlIGNhbnZhcydzIGJ1aWx0LWluCiAgICAgICAgICAvLyBzY2FsaW5nLgogICAgICAgICAgdmFyIGltZ1JlcyA9IHsKICAgICAgICAgICAgeDogdyAvIGV4dGVudC54LAogICAgICAgICAgICB5OiBoIC8gZXh0ZW50LnkKICAgICAgICAgIH07CgogICAgICAgICAgLy8gV2UgY2FuIGRvIHRoZSBhY3R1YWwgZHJhd2luZyBpbiBvbmUgb2YgdGhyZWUgd2F5czoKICAgICAgICAgIC8vIC0gQ2FsbCBkcmF3SW1hZ2UoKS4gVGhpcyBpcyBlYXN5IGFuZCBmYXN0LCBhbmQgcmVzdWx0cyBpbiBzbW9vdGgKICAgICAgICAgIC8vICAgaW50ZXJwb2xhdGlvbiAoYmlsaW5lYXI/KS4gVGhpcyBpcyB3aGF0IHdlIHdhbnQgd2hlbiB3ZSBhcmUKICAgICAgICAgIC8vICAgcmVkdWNpbmcgdGhlIGltYWdlIGZyb20gaXRzIG5hdGl2ZSBzaXplLgogICAgICAgICAgLy8gLSBDYWxsIGRyYXdJbWFnZSgpIHdpdGggaW1hZ2VTbW9vdGhpbmdFbmFibGVkPWZhbHNlLiBUaGlzIGlzIGVhc3kKICAgICAgICAgIC8vICAgYW5kIGZhc3QgYW5kIGdpdmVzIHVzIG5lYXJlc3QtbmVpZ2hib3IgaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgd2hhdAogICAgICAgICAgLy8gICB3ZSB3YW50IHdoZW4gZW5sYXJnaW5nIHRoZSBpbWFnZS4gSG93ZXZlciwgaXQncyB1bnN1cHBvcnRlZCBvbiBtYW55CiAgICAgICAgICAvLyAgIGJyb3dzZXJzIChpbmNsdWRpbmcgUXRXZWJraXQpLgogICAgICAgICAgLy8gLSBEbyBhIG1hbnVhbCBuZWFyZXN0LW5laWdoYm9yIGludGVycG9sYXRpb24uIFRoaXMgaXMgd2hhdCB3ZSdsbCBmYWxsCiAgICAgICAgICAvLyAgIGJhY2sgdG8gd2hlbiBlbmxhcmdpbmcsIGFuZCBpbWFnZVNtb290aGluZ0VuYWJsZWQgaXNuJ3Qgc3VwcG9ydGVkLgogICAgICAgICAgLy8gICBJbiB0aGVvcnkgaXQncyBzbG93ZXIsIGJ1dCBzdGlsbCBwcmV0dHkgZmFzdCBvbiBteSBtYWNoaW5lLCBhbmQgdGhlCiAgICAgICAgICAvLyAgIHJlc3VsdHMgbG9vayB0aGUgc2FtZSBBRkFJQ1QuCgogICAgICAgICAgLy8gSXMgaW1hZ2VTbW9vdGhpbmdFbmFibGVkIHN1cHBvcnRlZD8gSWYgc28sIHdlIGNhbiBsZXQgY2FudmFzIGRvCiAgICAgICAgICAvLyBuZWFyZXN0LW5laWdoYm9yIGludGVycG9sYXRpb24gZm9yIHVzLgogICAgICAgICAgdmFyIHNtb290aGluZ1Byb3BlcnR5ID0gZ2V0Q2FudmFzU21vb3RoaW5nUHJvcGVydHkoY3R4KTsKCiAgICAgICAgICBpZiAoc21vb3RoaW5nUHJvcGVydHkgfHwgaW1nUmVzLnggPj0gMjU2ICYmIGltZ1Jlcy55ID49IDI1NikgewogICAgICAgICAgICAvLyBVc2UgYnVpbHQtaW4gc2NhbGluZwoKICAgICAgICAgICAgLy8gVHVybiBvZmYgYW50aS1hbGlhc2luZyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgaWYgKHNtb290aGluZ1Byb3BlcnR5KSB7CiAgICAgICAgICAgICAgY3R4W3Ntb290aGluZ1Byb3BlcnR5XSA9IGltZ1Jlcy54ID49IDI1NiAmJiBpbWdSZXMueSA+PSAyNTY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERvbid0IG5lY2Vzc2FyaWx5IGRyYXcgd2l0aCB0aGUgZnVsbC1zaXplIGltYWdlOyBpZiB3ZSdyZQogICAgICAgICAgICAvLyBkb3duc2NhbGluZywgdXNlIHRoZSBtaXBtYXBwZXIgdG8gZ2V0IGEgcHJlLWRvd25zY2FsZWQgaW1hZ2UKICAgICAgICAgICAgLy8gKHNlZSBjb21tZW50cyBvbiBNaXBtYXBwZXIgY2xhc3MgZm9yIHdoeSB0aGlzIG1hdHRlcnMpLgogICAgICAgICAgICBtaXBtYXBwZXIuZ2V0QnlTaXplKGV4dGVudC54ICogMjU2LCBleHRlbnQueSAqIDI1NiwgZnVuY3Rpb24gKG1pcCkgewogICAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgaW1hZ2Ugd2lsbCBnbyBvZmYgdGhlIGVkZ2Ugb2YgdGhlIGNhbnZhcy0tCiAgICAgICAgICAgICAgLy8gdGhhdCdzIE9LLCB0aGUgY2FudmFzIHNob3VsZCBjbGlwIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShtaXAsCiAgICAgICAgICAgICAgLy8gQ29udmVydCBhYnMgdGlsZSBjb29yZHMgdG8gcmVsIHRpbGUgY29vcmRzLCB0aGVuICoyNTYgdG8gY29udmVydAogICAgICAgICAgICAgIC8vIHRvIHJlbCBwaXhlbCBjb29yZHMKICAgICAgICAgICAgICAodG9wTGVmdC54IC0gdGlsZVBvaW50LngpICogMjU2LCAodG9wTGVmdC55IC0gdGlsZVBvaW50LnkpICogMjU2LAogICAgICAgICAgICAgIC8vIEFsd2F5cyBkcmF3IHRoZSB3aG9sZSB0aGluZyBhbmQgbGV0IGNhbnZhcyBjbGlwOyBzbyB3ZSBjYW4ganVzdAogICAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBzaXplIGluIHRpbGUgY29vcmRzIHN0cmFpZ2h0IHRvIHBpeGVscwogICAgICAgICAgICAgIGV4dGVudC54ICogMjU2LCBleHRlbnQueSAqIDI1Nik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gVXNlIG1hbnVhbCBuZWFyZXN0LW5laWdoYm9yIGludGVycG9sYXRpb24KCiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc291cmNlIGltYWdlIHBpeGVsIGNvb3JkaW5hdGVzIHRoYXQgY29ycmVzcG9uZCB3aXRoCiAgICAgICAgICAgIC8vIHRoZSB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0IG9mIHRoaXMgdGlsZS4gKElmIHRoZSBzb3VyY2UgaW1hZ2UKICAgICAgICAgICAgLy8gb25seSBwYXJ0aWFsbHkgb3ZlcmxhcHMgdGhlIHRpbGUsIHdlIHVzZSBtYXgvbWluIHRvIGxpbWl0IHRoZQogICAgICAgICAgICAvLyBzb3VyY2VTdGFydC9FbmQgdG8gb25seSByZWZsZWN0IHRoZSBvdmVybGFwcGluZyBwb3J0aW9uLikKICAgICAgICAgICAgdmFyIHNvdXJjZVN0YXJ0ID0gewogICAgICAgICAgICAgIHg6IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKHRpbGVQb2ludC54IC0gdG9wTGVmdC54KSAqIGltZ1Jlcy54KSksCiAgICAgICAgICAgICAgeTogTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigodGlsZVBvaW50LnkgLSB0b3BMZWZ0LnkpICogaW1nUmVzLnkpKQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgc291cmNlRW5kID0gewogICAgICAgICAgICAgIHg6IE1hdGgubWluKHcsIE1hdGguY2VpbCgodGlsZVBvaW50LnggKyAxIC0gdG9wTGVmdC54KSAqIGltZ1Jlcy54KSksCiAgICAgICAgICAgICAgeTogTWF0aC5taW4oaCwgTWF0aC5jZWlsKCh0aWxlUG9pbnQueSArIDEgLSB0b3BMZWZ0LnkpICogaW1nUmVzLnkpKQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gVGhlIHNpemUsIGluIGRlc3QgcGl4ZWxzLCB0aGF0IGVhY2ggc291cmNlIHBpeGVsIHNob3VsZCBvY2N1cHkuCiAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW4gMSAoZS5nLiBpZiB4IGFuZCB5IHJlc29sdXRpb24KICAgICAgICAgICAgLy8gYXJlIHZlcnkgZGlmZmVyZW50KS4KICAgICAgICAgICAgdmFyIHBpeGVsU2l6ZSA9IHsKICAgICAgICAgICAgICB4OiAyNTYgLyBpbWdSZXMueCwKICAgICAgICAgICAgICB5OiAyNTYgLyBpbWdSZXMueQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gRm9yIGVhY2ggcGl4ZWwgaW4gdGhlIHNvdXJjZSBpbWFnZSB0aGF0IG92ZXJsYXBzIHRoZSB0aWxlLi4uCiAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IHNvdXJjZVN0YXJ0Lnk7IHJvdyA8IHNvdXJjZUVuZC55OyByb3crKykgewogICAgICAgICAgICAgIGZvciAodmFyIGNvbCA9IHNvdXJjZVN0YXJ0Lng7IGNvbCA8IHNvdXJjZUVuZC54OyBjb2wrKykgewogICAgICAgICAgICAgICAgLy8gLi4uZXh0cmFjdCB0aGUgcGl4ZWwgZGF0YS4uLgogICAgICAgICAgICAgICAgdmFyIGkgPSAocm93ICogdyArIGNvbCkgKiA0OwogICAgICAgICAgICAgICAgdmFyIHIgPSBpbWdEYXRhW2ldOwogICAgICAgICAgICAgICAgdmFyIGcgPSBpbWdEYXRhW2kgKyAxXTsKICAgICAgICAgICAgICAgIHZhciBiID0gaW1nRGF0YVtpICsgMl07CiAgICAgICAgICAgICAgICB2YXIgYSA9IGltZ0RhdGFbaSArIDNdOwogICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKCIgKyBbciwgZywgYiwgYSAvIDI1NV0uam9pbigiLCIpICsgIikiOwoKICAgICAgICAgICAgICAgIC8vIC4uLmNhbGN1bGF0ZSB0aGUgY29ycmVzcG9uZGluZyBwaXhlbCBjb29yZCBpbiB0aGUgZGVzdCBpbWFnZQogICAgICAgICAgICAgICAgLy8gd2hlcmUgaXQgc2hvdWxkIGJlIGRyYXduLi4uCiAgICAgICAgICAgICAgICB2YXIgcGl4ZWxQb3MgPSB7CiAgICAgICAgICAgICAgICAgIHg6IChjb2wgLyBpbWdSZXMueCArIHRvcExlZnQueCAtIHRpbGVQb2ludC54KSAqIDI1NiwKICAgICAgICAgICAgICAgICAgeTogKHJvdyAvIGltZ1Jlcy55ICsgdG9wTGVmdC55IC0gdGlsZVBvaW50LnkpICogMjU2CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIC4uLmFuZCBkcmF3IGEgcmVjdGFuZ2xlIHRoZXJlLgogICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KE1hdGgucm91bmQocGl4ZWxQb3MueCksIE1hdGgucm91bmQocGl4ZWxQb3MueSksCiAgICAgICAgICAgICAgICAvLyBMb29rcyBjcmF6eSwgYnV0IHRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgcm91bmRpbmcgZnJvbQogICAgICAgICAgICAgICAgLy8gY2F1c2luZyBvdmVybGFwIGJldHdlZW4gdGhpcyByZWN0IGFuZCBpdHMgbmVpZ2hib3JzLiBUaGUKICAgICAgICAgICAgICAgIC8vIG1pbnVlbmQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXh0IHBpeGVsLCB3aGlsZSB0aGUKICAgICAgICAgICAgICAgIC8vIHN1YnRyYWhlbmQgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHBpeGVsICh0byB0dXJuIGFuCiAgICAgICAgICAgICAgICAvLyBhYnNvbHV0ZSBjb29yZGluYXRlIHRvIGEgd2lkdGgvaGVpZ2h0KS4gWWVzLCBJIGhhZCB0byBsb29rCiAgICAgICAgICAgICAgICAvLyB1cCBtaW51ZW5kIGFuZCBzdWJ0cmFoZW5kLgogICAgICAgICAgICAgICAgTWF0aC5yb3VuZChwaXhlbFBvcy54ICsgcGl4ZWxTaXplLngpIC0gTWF0aC5yb3VuZChwaXhlbFBvcy54KSwgTWF0aC5yb3VuZChwaXhlbFBvcy55ICsgcGl4ZWxTaXplLnkpIC0gTWF0aC5yb3VuZChwaXhlbFBvcy55KSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSgpOwoKICAgICAgICBpZiAoKHR5cGVvZiBfcmV0NyA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2YoX3JldDcpKSA9PT0gIm9iamVjdCIpIHJldHVybiBfcmV0Ny52OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGNhbnZhc1RpbGVzLnRpbGVEcmF3bihjYW52YXMpOwogICAgICB9CiAgICB9KTsKICB9OwoKICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihjYW52YXNUaWxlcywgImltYWdlIiwgbGF5ZXJJZCwgZ3JvdXApOwp9OwoKbWV0aG9kcy5yZW1vdmVJbWFnZSA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoImltYWdlIiwgbGF5ZXJJZCk7Cn07CgptZXRob2RzLmNsZWFySW1hZ2VzID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJpbWFnZSIpOwp9OwoKbWV0aG9kcy5hZGRNZWFzdXJlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAvLyBpZiBhIG1lYXN1cmVDb250cm9sIGFscmVhZHkgZXhpc3RzLCB0aGVuIHJlbW92ZSBpdCBhbmQKICAvLyAgIHJlcGxhY2Ugd2l0aCBhIG5ldyBvbmUKICBpZiAodGhpcy5tZWFzdXJlQ29udHJvbCkgewogICAgdGhpcy5tZWFzdXJlQ29udHJvbC5yZW1vdmVGcm9tKHRoaXMpOwogIH0KICB0aGlzLm1lYXN1cmVDb250cm9sID0gX2xlYWZsZXQyLmRlZmF1bHQuY29udHJvbC5tZWFzdXJlKG9wdGlvbnMpOwogIHRoaXMubWVhc3VyZUNvbnRyb2wuYWRkVG8odGhpcyk7Cn07CgptZXRob2RzLnJlbW92ZU1lYXN1cmUgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5tZWFzdXJlQ29udHJvbC5yZW1vdmVGcm9tKHRoaXMpOwogIGRlbGV0ZSB0aGlzLm1lYXN1cmVDb250cm9sOwp9OwoKbWV0aG9kcy5hZGRTZWxlY3QgPSBmdW5jdGlvbiAoY3RHcm91cCkgewogIHZhciBfdGhpczkgPSB0aGlzOwoKICBtZXRob2RzLnJlbW92ZVNlbGVjdC5jYWxsKHRoaXMpOwoKICB0aGlzLl9zZWxlY3RCdXR0b24gPSBfbGVhZmxldDIuZGVmYXVsdC5lYXN5QnV0dG9uKHsKICAgIHN0YXRlczogW3sKICAgICAgc3RhdGVOYW1lOiAic2VsZWN0LWluYWN0aXZlIiwKICAgICAgaWNvbjogImlvbi1xci1zY2FubmVyIiwKICAgICAgdGl0bGU6ICJNYWtlIGEgc2VsZWN0aW9uIiwKICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhidG4sIG1hcCkgewogICAgICAgIGJ0bi5zdGF0ZSgic2VsZWN0LWFjdGl2ZSIpOwogICAgICAgIF90aGlzOS5fbG9jYXRpb25GaWx0ZXIgPSBuZXcgX2xlYWZsZXQyLmRlZmF1bHQuTG9jYXRpb25GaWx0ZXIyKCk7CgogICAgICAgIGlmIChjdEdyb3VwKSB7CiAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uSGFuZGxlID0gbmV3IGdsb2JhbC5jcm9zc3RhbGsuU2VsZWN0aW9uSGFuZGxlKGN0R3JvdXApOwogICAgICAgICAgICBzZWxlY3Rpb25IYW5kbGUub24oImNoYW5nZSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgaWYgKGUuc2VuZGVyICE9PSBzZWxlY3Rpb25IYW5kbGUpIHsKICAgICAgICAgICAgICAgIGlmIChfdGhpczkuX2xvY2F0aW9uRmlsdGVyKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzOS5fbG9jYXRpb25GaWx0ZXIuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICBidG4uc3RhdGUoInNlbGVjdC1pbmFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihlKSB7CiAgICAgICAgICAgICAgX3RoaXM5LmxheWVyTWFuYWdlci5icnVzaChfdGhpczkuX2xvY2F0aW9uRmlsdGVyLmdldEJvdW5kcygpLCB7IHNlbmRlcjogc2VsZWN0aW9uSGFuZGxlIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBfdGhpczkuX2xvY2F0aW9uRmlsdGVyLm9uKCJlbmFibGVkIiwgaGFuZGxlcik7CiAgICAgICAgICAgIF90aGlzOS5fbG9jYXRpb25GaWx0ZXIub24oImNoYW5nZSIsIGhhbmRsZXIpOwogICAgICAgICAgICBfdGhpczkuX2xvY2F0aW9uRmlsdGVyLm9uKCJkaXNhYmxlZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBzZWxlY3Rpb25IYW5kbGUuY2xvc2UoKTsKICAgICAgICAgICAgICBfdGhpczkuX2xvY2F0aW9uRmlsdGVyID0gbnVsbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSgpOwogICAgICAgIH0KCiAgICAgICAgX3RoaXM5Ll9sb2NhdGlvbkZpbHRlci5hZGRUbyhtYXApOwogICAgICB9CiAgICB9LCB7CiAgICAgIHN0YXRlTmFtZTogInNlbGVjdC1hY3RpdmUiLAogICAgICBpY29uOiAiaW9uLWNsb3NlLXJvdW5kIiwKICAgICAgdGl0bGU6ICJEaXNtaXNzIHNlbGVjdGlvbiIsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soYnRuLCBtYXApIHsKICAgICAgICBidG4uc3RhdGUoInNlbGVjdC1pbmFjdGl2ZSIpOwogICAgICAgIF90aGlzOS5fbG9jYXRpb25GaWx0ZXIuZGlzYWJsZSgpOwogICAgICAgIC8vIElmIGV4cGxpY2l0bHkgZGlzbWlzc2VkLCBjbGVhciB0aGUgY3Jvc3N0YWxrIHNlbGVjdGlvbnMKICAgICAgICBfdGhpczkubGF5ZXJNYW5hZ2VyLnVuYnJ1c2goKTsKICAgICAgfQogICAgfV0KICB9KTsKCiAgdGhpcy5fc2VsZWN0QnV0dG9uLmFkZFRvKHRoaXMpOwp9OwoKbWV0aG9kcy5yZW1vdmVTZWxlY3QgPSBmdW5jdGlvbiAoKSB7CiAgaWYgKHRoaXMuX2xvY2F0aW9uRmlsdGVyKSB7CiAgICB0aGlzLl9sb2NhdGlvbkZpbHRlci5kaXNhYmxlKCk7CiAgfQoKICBpZiAodGhpcy5fc2VsZWN0QnV0dG9uKSB7CiAgICB0aGlzLnJlbW92ZUNvbnRyb2wodGhpcy5fc2VsZWN0QnV0dG9uKTsKICAgIHRoaXMuX3NlbGVjdEJ1dHRvbiA9IG51bGw7CiAgfQp9OwoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHsiLi9jbHVzdGVyLWxheWVyLXN0b3JlIjoxLCIuL2Nyc191dGlscyI6MywiLi9kYXRhZnJhbWUiOjQsIi4vZ2xvYmFsL2h0bWx3aWRnZXRzIjo2LCIuL2dsb2JhbC9qcXVlcnkiOjcsIi4vZ2xvYmFsL2xlYWZsZXQiOjgsIi4vZ2xvYmFsL3NoaW55IjoxMCwiLi9taXBtYXBwZXIiOjE0LCIuL3V0aWwiOjE1fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7Cgp2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTsKCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKLy8gVGhpcyBjbGFzcyBzaW11bGF0ZXMgYSBtaXBtYXAsIHdoaWNoIHNocmlua3MgaW1hZ2VzIGJ5IHBvd2VycyBvZiB0d28uIFRoaXMKLy8gc3RlcHdpc2UgcmVkdWN0aW9uIHJlc3VsdHMgaW4gInBpeGVsLXBlcmZlY3QgZG93bnNjYWxpbmciICh3aGVyZSBldmVyeQovLyBwaXhlbCBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgaGFzIHNvbWUgY29udHJpYnV0aW9uIHRvIHRoZSBkb3duc2NhbGVkIGltYWdlKQovLyBhcyBvcHBvc2VkIHRvIGEgc2luZ2xlLXN0ZXAgZG93bnNjYWxpbmcgd2hpY2ggd2lsbCBkaXNjYXJkIGEgbG90IG9mIGRhdGEKLy8gKGFuZCB3aXRoIHNwYXJzZSBpbWFnZXMgYXQgc21hbGwgc2NhbGVzIGNhbiBnaXZlIHZlcnkgc3VycHJpc2luZyByZXN1bHRzKS4KCnZhciBNaXBtYXBwZXIgPSBmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gTWlwbWFwcGVyKGltZykgewogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1pcG1hcHBlcik7CgogICAgdGhpcy5fbGF5ZXJzID0gW2ltZ107CiAgfQoKICAvLyBUaGUgdmFyaW91cyBmdW5jdGlvbnMgb24gdGhpcyBjbGFzcyB0YWtlIGEgY2FsbGJhY2sgZnVuY3Rpb24gQlVUIE1BWSBPUiBNQVkKICAvLyBOT1QgYWN0dWFsbHkgYmVoYXZlIGFzeW5jaHJvbm91c2x5LgoKCiAgX2NyZWF0ZUNsYXNzKE1pcG1hcHBlciwgW3sKICAgIGtleTogImdldEJ5U2l6ZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QnlTaXplKGRlc2lyZWRXaWR0aCwgZGVzaXJlZEhlaWdodCwgY2FsbGJhY2spIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgIHZhciBpID0gMDsKICAgICAgdmFyIGxhc3RJbWcgPSB0aGlzLl9sYXllcnNbMF07CiAgICAgIHZhciB0ZXN0TmV4dCA9IGZ1bmN0aW9uIHRlc3ROZXh0KCkgewogICAgICAgIF90aGlzLmdldEJ5SW5kZXgoaSwgZnVuY3Rpb24gKGltZykgewogICAgICAgICAgLy8gSWYgY3VycmVudCBpbWFnZSBpcyBpbnZhbGlkIChpLmUuIHRvbyBzbWFsbCB0byBiZSByZW5kZXJlZCkgb3IKICAgICAgICAgIC8vIGl0J3Mgc21hbGxlciB0aGFuIHdoYXQgd2Ugd2FudGVkLCByZXR1cm4gdGhlIGxhc3Qga25vd24gZ29vZCBpbWFnZS4KICAgICAgICAgIGlmICghaW1nIHx8IGltZy53aWR0aCA8IGRlc2lyZWRXaWR0aCB8fCBpbWcuaGVpZ2h0IDwgZGVzaXJlZEhlaWdodCkgewogICAgICAgICAgICBjYWxsYmFjayhsYXN0SW1nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGFzdEltZyA9IGltZzsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB0ZXN0TmV4dCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIHRlc3ROZXh0KCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0QnlJbmRleCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QnlJbmRleChpLCBjYWxsYmFjaykgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgIGlmICh0aGlzLl9sYXllcnNbaV0pIHsKICAgICAgICBjYWxsYmFjayh0aGlzLl9sYXllcnNbaV0pOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdGhpcy5nZXRCeUluZGV4KGkgLSAxLCBmdW5jdGlvbiAocHJldkltZykgewogICAgICAgIGlmICghcHJldkltZykgewogICAgICAgICAgLy8gcHJldkltZyBjb3VsZCBub3QgYmUgY2FsY3VsYXRlZCAodG9vIHNtYWxsLCBwb3NzaWJseSkKICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocHJldkltZy53aWR0aCA8IDIgfHwgcHJldkltZy5oZWlnaHQgPCAyKSB7CiAgICAgICAgICAvLyBDYW4ndCByZWR1Y2UgdGhpcyBpbWFnZSBhbnkgZnVydGhlcgogICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIElmIHJlZHVjZSBldmVyIGJlY29tZXMgdHJ1bHkgYXN5bmNocm9ub3VzLCB3ZSBzaG91bGQgc3R1ZmYgYSBwcm9taXNlIG9yCiAgICAgICAgLy8gc29tZXRoaW5nIGludG8gdGhpcy5fbGF5ZXJzW2ldIGJlZm9yZSBjYWxsaW5nIHRoaXMucmVkdWNlKCksIHRvIHByZXZlbnQKICAgICAgICAvLyByZWR1bmRhbnQgcmVkdWNlIG9wZXJhdGlvbnMgZnJvbSBoYXBwZW5pbmcuCiAgICAgICAgX3RoaXMyLnJlZHVjZShwcmV2SW1nLCBmdW5jdGlvbiAocmVkdWNlZEltZykgewogICAgICAgICAgX3RoaXMyLl9sYXllcnNbaV0gPSByZWR1Y2VkSW1nOwogICAgICAgICAgY2FsbGJhY2socmVkdWNlZEltZyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogInJlZHVjZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gcmVkdWNlKGltZywgY2FsbGJhY2spIHsKICAgICAgdmFyIGltZ0RhdGFDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgICAgaW1nRGF0YUNhbnZhcy53aWR0aCA9IE1hdGguY2VpbChpbWcud2lkdGggLyAyKTsKICAgICAgaW1nRGF0YUNhbnZhcy5oZWlnaHQgPSBNYXRoLmNlaWwoaW1nLmhlaWdodCAvIDIpOwogICAgICBpbWdEYXRhQ2FudmFzLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW1nRGF0YUNhbnZhcyk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGltZ0RhdGFDdHggPSBpbWdEYXRhQ2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgaW1nRGF0YUN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGggLyAyLCBpbWcuaGVpZ2h0IC8gMik7CiAgICAgICAgY2FsbGJhY2soaW1nRGF0YUNhbnZhcyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpbWdEYXRhQ2FudmFzKTsKICAgICAgfQogICAgfQogIH1dKTsKCiAgcmV0dXJuIE1pcG1hcHBlcjsKfSgpOwoKZXhwb3J0cy5kZWZhdWx0ID0gTWlwbWFwcGVyOwoKCn0se31dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmxvZyA9IGxvZzsKZXhwb3J0cy5yZWN5Y2xlID0gcmVjeWNsZTsKZXhwb3J0cy5hc0FycmF5ID0gYXNBcnJheTsKZnVuY3Rpb24gbG9nKG1lc3NhZ2UpIHsKICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovCiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS5sb2cpIGNvbnNvbGUubG9nKG1lc3NhZ2UpOwogIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqLwp9CgpmdW5jdGlvbiByZWN5Y2xlKHZhbHVlcywgbGVuZ3RoLCBpblBsYWNlKSB7CiAgaWYgKGxlbmd0aCA9PT0gMCAmJiAhaW5QbGFjZSkgcmV0dXJuIFtdOwoKICBpZiAoISh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkpIHsKICAgIGlmIChpblBsYWNlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FuJ3QgZG8gaW4tcGxhY2UgcmVjeWNsaW5nIG9mIGEgbm9uLUFycmF5IHZhbHVlIik7CiAgICB9CiAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICB9CiAgaWYgKHR5cGVvZiBsZW5ndGggPT09ICJ1bmRlZmluZWQiKSBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoOwoKICB2YXIgZGVzdCA9IGluUGxhY2UgPyB2YWx1ZXMgOiBbXTsKICB2YXIgb3JpZ0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7CiAgd2hpbGUgKGRlc3QubGVuZ3RoIDwgbGVuZ3RoKSB7CiAgICBkZXN0LnB1c2godmFsdWVzW2Rlc3QubGVuZ3RoICUgb3JpZ0xlbmd0aF0pOwogIH0KICBpZiAoZGVzdC5sZW5ndGggPiBsZW5ndGgpIHsKICAgIGRlc3Quc3BsaWNlKGxlbmd0aCwgZGVzdC5sZW5ndGggLSBsZW5ndGgpOwogIH0KICByZXR1cm4gZGVzdDsKfQoKZnVuY3Rpb24gYXNBcnJheSh2YWx1ZSkgewogIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gdmFsdWU7ZWxzZSByZXR1cm4gW3ZhbHVlXTsKfQoKCn0se31dfSx7fSxbMTFdKTsK"></script>
<link href="data:text/css;charset=utf-8,%2Ejqstooltip%20%7B%0A%2Dwebkit%2Dbox%2Dsizing%3A%20content%2Dbox%3B%0A%2Dmoz%2Dbox%2Dsizing%3A%20content%2Dbox%3B%0Abox%2Dsizing%3A%20content%2Dbox%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoqDQoqDQoqIGpxdWVyeS5zcGFya2xpbmUuanMNCioNCiogdkBWRVJTSU9OQA0KKiAoYykgU3BsdW5rLCBJbmMNCiogQ29udGFjdDogR2FyZXRoIFdhdHRzIChnYXJldGhAc3BsdW5rLmNvbSkNCiogaHR0cDovL29tbmlwb3RlbnQubmV0L2pxdWVyeS5zcGFya2xpbmUvDQoqDQoqIEdlbmVyYXRlcyBpbmxpbmUgc3BhcmtsaW5lIGNoYXJ0cyBmcm9tIGRhdGEgc3VwcGxpZWQgZWl0aGVyIHRvIHRoZSBtZXRob2QNCiogb3IgaW5saW5lIGluIEhUTUwNCioNCiogQ29tcGF0aWJsZSB3aXRoIEludGVybmV0IEV4cGxvcmVyIDYuMCsgYW5kIG1vZGVybiBicm93c2VycyBlcXVpcHBlZCB3aXRoIHRoZSBjYW52YXMgdGFnDQoqIChGaXJlZm94IDIuMCssIFNhZmFyaSwgT3BlcmEsIGV0YykNCioNCiogTGljZW5zZTogTmV3IEJTRCBMaWNlbnNlDQoqDQoqIENvcHlyaWdodCAoYykgMjAxMiwgU3BsdW5rIEluYy4NCiogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCioNCiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwNCiogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KKg0KKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQoqICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQoqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiogICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KKiAgICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCiogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBTcGx1bmsgSW5jIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkNCiogICAgICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dA0KKiAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQoqDQoqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZDQoqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUw0KKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVA0KKiBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UDQoqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQoqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCiogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCioNCioNCiogVXNhZ2U6DQoqICAkKHNlbGVjdG9yKS5zcGFya2xpbmUodmFsdWVzLCBvcHRpb25zKQ0KKg0KKiBJZiB2YWx1ZXMgaXMgdW5kZWZpbmVkIG9yIHNldCB0byAnaHRtbCcgdGhlbiB0aGUgZGF0YSB2YWx1ZXMgYXJlIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhZzoNCiogICA8cD5TcGFya2xpbmU6IDxzcGFuIGNsYXNzPSJzcGFya2xpbmUiPjEsNCw2LDYsOCw1LDMsNTwvc3Bhbj48L3A+DQoqICAgJCgnLnNwYXJrbGluZScpLnNwYXJrbGluZSgpOw0KKiBUaGVyZSBtdXN0IGJlIG5vIHNwYWNlcyBpbiB0aGUgZW5jbG9zZWQgZGF0YSBzZXQNCioNCiogT3RoZXJ3aXNlIHZhbHVlcyBtdXN0IGJlIGFuIGFycmF5IG9mIG51bWJlcnMgb3IgbnVsbCB2YWx1ZXMNCiogICAgPHA+U3BhcmtsaW5lOiA8c3BhbiBpZD0ic3BhcmtsaW5lMSI+VGhpcyB0ZXh0IHJlcGxhY2VkIGlmIHRoZSBicm93c2VyIGlzIGNvbXBhdGlibGU8L3NwYW4+PC9wPg0KKiAgICAkKCcjc3BhcmtsaW5lMScpLnNwYXJrbGluZShbMSw0LDYsNiw4LDUsMyw1XSkNCiogICAgJCgnI3NwYXJrbGluZTInKS5zcGFya2xpbmUoWzEsNCw2LG51bGwsbnVsbCw1LDMsNV0pDQoqDQoqIFZhbHVlcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW4gYW4gSFRNTCBjb21tZW50LCBvciBhcyBhIHZhbHVlcyBhdHRyaWJ1dGU6DQoqICAgIDxwPlNwYXJrbGluZTogPHNwYW4gY2xhc3M9InNwYXJrbGluZSI+PCEtLTEsNCw2LDYsOCw1LDMsNSAtLT48L3NwYW4+PC9wPg0KKiAgICA8cD5TcGFya2xpbmU6IDxzcGFuIGNsYXNzPSJzcGFya2xpbmUiIHZhbHVlcz0iMSw0LDYsNiw4LDUsMyw1Ij48L3NwYW4+PC9wPg0KKiAgICAkKCcuc3BhcmtsaW5lJykuc3BhcmtsaW5lKCk7DQoqDQoqIEZvciBsaW5lIGNoYXJ0cywgeCB2YWx1ZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkOg0KKiAgIDxwPlNwYXJrbGluZTogPHNwYW4gY2xhc3M9InNwYXJrbGluZSI+MToxLDIuNzo0LDMuNDo2LDU6Niw2OjgsOC43OjUsOTozLDEwOjU8L3NwYW4+PC9wPg0KKiAgICAkKCcjc3BhcmtsaW5lMScpLnNwYXJrbGluZShbIFsxLDFdLCBbMi43LDRdLCBbMy40LDZdLCBbNSw2XSwgWzYsOF0sIFs4LjcsNV0sIFs5LDNdLCBbMTAsNV0gXSkNCioNCiogQnkgZGVmYXVsdCwgb3B0aW9ucyBzaG91bGQgYmUgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHNwYXJrbGluZSBmdW5jdGlvbjoNCiogICAkKCcuc3BhcmtsaW5lJykuc3BhcmtsaW5lKFsxLDIsMyw0XSwge3R5cGU6ICdiYXInfSkNCioNCiogT3B0aW9ucyBjYW4gYWxzbyBiZSBzZXQgYnkgcGFzc2luZyB0aGVtIG9uIHRoZSB0YWcgaXRzZWxmLiAgVGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgdGhvdWdoDQoqIGFzIHRoZXJlJ3MgYSBzbGlnaHQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQ6DQoqICAgJCgnLnNwYXJrbGluZScpLnNwYXJrbGluZShbMSwyLDMsNF0sIHtlbmFibGVUYWdPcHRpb25zOiB0cnVlfSkNCiogICA8cD5TcGFya2xpbmU6IDxzcGFuIGNsYXNzPSJzcGFya2xpbmUiIHNwYXJrVHlwZT0iYmFyIiBzcGFya0JhckNvbG9yPSJyZWQiPmxvYWRpbmc8L3NwYW4+PC9wPg0KKiBQcmVmaXggYWxsIG9wdGlvbnMgc3VwcGxpZWQgYXMgdGFnIGF0dHJpYnV0ZSB3aXRoICJzcGFyayIgKGNvbmZpZ3VyYWJsZSBieSBzZXR0aW5nIHRhZ09wdGlvbnNQcmVmaXgpDQoqDQoqIFN1cHBvcnRlZCBvcHRpb25zOg0KKiAgIGxpbmVDb2xvciAtIENvbG9yIG9mIHRoZSBsaW5lIHVzZWQgZm9yIHRoZSBjaGFydA0KKiAgIGZpbGxDb2xvciAtIENvbG9yIHVzZWQgdG8gZmlsbCBpbiB0aGUgY2hhcnQgLSBTZXQgdG8gJycgb3IgZmFsc2UgZm9yIGEgdHJhbnNwYXJlbnQgY2hhcnQNCiogICB3aWR0aCAtIFdpZHRoIG9mIHRoZSBjaGFydCAtIERlZmF1bHRzIHRvIDMgdGltZXMgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gcGl4ZWxzDQoqICAgaGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjaGFydCAtIERlZmF1bHRzIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5pbmcgZWxlbWVudA0KKiAgIGNoYXJ0UmFuZ2VNaW4gLSBTcGVjaWZ5IHRoZSBtaW5pbXVtIHZhbHVlIHRvIHVzZSBmb3IgdGhlIFkgcmFuZ2Ugb2YgdGhlIGNoYXJ0IC0gRGVmYXVsdHMgdG8gdGhlIG1pbmltdW0gdmFsdWUgc3VwcGxpZWQNCiogICBjaGFydFJhbmdlTWF4IC0gU3BlY2lmeSB0aGUgbWF4aW11bSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBZIHJhbmdlIG9mIHRoZSBjaGFydCAtIERlZmF1bHRzIHRvIHRoZSBtYXhpbXVtIHZhbHVlIHN1cHBsaWVkDQoqICAgY2hhcnRSYW5nZUNsaXAgLSBDbGlwIG91dCBvZiByYW5nZSB2YWx1ZXMgdG8gdGhlIG1heC9taW4gc3BlY2lmaWVkIGJ5IGNoYXJ0UmFuZ2VNaW4gYW5kIGNoYXJ0UmFuZ2VNYXgNCiogICBjaGFydFJhbmdlTWluWCAtIFNwZWNpZnkgdGhlIG1pbmltdW0gdmFsdWUgdG8gdXNlIGZvciB0aGUgWCByYW5nZSBvZiB0aGUgY2hhcnQgLSBEZWZhdWx0cyB0byB0aGUgbWluaW11bSB2YWx1ZSBzdXBwbGllZA0KKiAgIGNoYXJ0UmFuZ2VNYXhYIC0gU3BlY2lmeSB0aGUgbWF4aW11bSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBYIHJhbmdlIG9mIHRoZSBjaGFydCAtIERlZmF1bHRzIHRvIHRoZSBtYXhpbXVtIHZhbHVlIHN1cHBsaWVkDQoqICAgY29tcG9zaXRlIC0gSWYgdHJ1ZSB0aGVuIGRvbid0IGVyYXNlIGFueSBleGlzdGluZyBjaGFydCBhdHRhY2hlZCB0byB0aGUgdGFnLCBidXQgZHJhdw0KKiAgICAgICAgICAgYW5vdGhlciBjaGFydCBvdmVyIHRoZSB0b3AgLSBOb3RlIHRoYXQgd2lkdGggYW5kIGhlaWdodCBhcmUgaWdub3JlZCBpZiBhbg0KKiAgICAgICAgICAgZXhpc3RpbmcgY2hhcnQgaXMgZGV0ZWN0ZWQuDQoqICAgdGFnVmFsdWVzQXR0cmlidXRlIC0gTmFtZSBvZiB0YWcgYXR0cmlidXRlIHRvIGNoZWNrIGZvciBkYXRhIHZhbHVlcyAtIERlZmF1bHRzIHRvICd2YWx1ZXMnDQoqICAgZW5hYmxlVGFnT3B0aW9ucyAtIFdoZXRoZXIgdG8gY2hlY2sgdGFncyBmb3Igc3BhcmtsaW5lIG9wdGlvbnMNCiogICB0YWdPcHRpb25zUHJlZml4IC0gUHJlZml4IHVzZWQgZm9yIG9wdGlvbnMgc3VwcGxpZWQgYXMgdGFnIGF0dHJpYnV0ZXMgLSBEZWZhdWx0cyB0byAnc3BhcmsnDQoqICAgZGlzYWJsZUhpZGRlbkNoZWNrIC0gSWYgc2V0IHRvIHRydWUsIHRoZW4gdGhlIHBsdWdpbiB3aWxsIGFzc3VtZSB0aGF0IGNoYXJ0cyB3aWxsIG5ldmVyIGJlIGRyYXduIGludG8gYQ0KKiAgICAgICAgICAgaGlkZGVuIGRvbSBlbGVtZW50LCBhdm9pZGluZyBhIGJyb3dzZXIgcmVmbG93DQoqICAgZGlzYWJsZUludGVyYWN0aW9uIC0gSWYgc2V0IHRvIHRydWUgdGhlbiBhbGwgbW91c2VvdmVyL2NsaWNrIGludGVyYWN0aW9uIGJlaGF2aW91ciB3aWxsIGJlIGRpc2FibGVkLA0KKiAgICAgICBtYWtpbmcgdGhlIHBsdWdpbiBwZXJmb3JtIG11Y2ggbGlrZSBpdCBkaWQgaW4gMS54DQoqICAgZGlzYWJsZVRvb2x0aXBzIC0gSWYgc2V0IHRvIHRydWUgdGhlbiB0b29sdGlwcyB3aWxsIGJlIGRpc2FibGVkIC0gRGVmYXVsdHMgdG8gZmFsc2UgKHRvb2x0aXBzIGVuYWJsZWQpDQoqICAgZGlzYWJsZUhpZ2hsaWdodCAtIElmIHNldCB0byB0cnVlIHRoZW4gaGlnaGxpZ2h0aW5nIG9mIHNlbGVjdGVkIGNoYXJ0IGVsZW1lbnRzIG9uIG1vdXNlb3ZlciB3aWxsIGJlIGRpc2FibGVkDQoqICAgICAgICAgICBkZWZhdWx0cyB0byBmYWxzZSAoaGlnaGxpZ2h0cyBlbmFibGVkKQ0KKiAgIGhpZ2hsaWdodExpZ2h0ZW4gLSBGYWN0b3IgdG8gbGlnaHRlbi9kYXJrZW4gaGlnaGxpZ2h0ZWQgY2hhcnQgdmFsdWVzIGJ5IC0gRGVmYXVsdHMgdG8gMS40IGZvciBhIDQwJSBpbmNyZWFzZQ0KKiAgIHRvb2x0aXBDb250YWluZXIgLSBTcGVjaWZ5IHdoaWNoIERPTSBlbGVtZW50IHRoZSB0b29sdGlwIHNob3VsZCBiZSByZW5kZXJlZCBpbnRvIC0gZGVmYXVsdHMgdG8gZG9jdW1lbnQuYm9keQ0KKiAgIHRvb2x0aXBDbGFzc25hbWUgLSBPcHRpb25hbCBDU1MgY2xhc3NuYW1lIHRvIGFwcGx5IHRvIHRvb2x0aXBzIC0gSWYgbm90IHNwZWNpZmllZCB0aGVuIGEgZGVmYXVsdCBzdHlsZSB3aWxsIGJlIGFwcGxpZWQNCiogICB0b29sdGlwT2Zmc2V0WCAtIEhvdyBtYW55IHBpeGVscyBhd2F5IGZyb20gdGhlIG1vdXNlIHBvaW50ZXIgdG8gcmVuZGVyIHRoZSB0b29sdGlwIG9uIHRoZSBYIGF4aXMNCiogICB0b29sdGlwT2Zmc2V0WSAtIEhvdyBtYW55IHBpeGVscyBhd2F5IGZyb20gdGhlIG1vdXNlIHBvaW50ZXIgdG8gcmVuZGVyIHRoZSB0b29sdGlwIG9uIHRoZSByIGF4aXMNCiogICB0b29sdGlwRm9ybWF0dGVyICAtIE9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgSFRNTCBkaXNwbGF5ZWQgaW4gdGhlIHRvb2x0aXANCiogICAgICAgICAgIGNhbGxiYWNrIGlzIGdpdmVuIGFyZ3VtZW50cyBvZiAoc3BhcmtsaW5lLCBvcHRpb25zLCBmaWVsZHMpDQoqICAgdG9vbHRpcENoYXJ0VGl0bGUgLSBJZiBzcGVjaWZpZWQgdGhlbiB0aGUgdG9vbHRpcCB1c2VzIHRoZSBzdHJpbmcgc3BlY2lmaWVkIGJ5IHRoaXMgc2V0dGluZyBhcyBhIHRpdGxlDQoqICAgdG9vbHRpcEZvcm1hdCAtIEEgZm9ybWF0IHN0cmluZyBvciBTUEZvcm1hdCBvYmplY3QgIChvciBhbiBhcnJheSB0aGVyZW9mIGZvciBtdWx0aXBsZSBlbnRyaWVzKQ0KKiAgICAgICAgICAgdG8gY29udHJvbCB0aGUgZm9ybWF0IG9mIHRoZSB0b29sdGlwDQoqICAgdG9vbHRpcFByZWZpeCAtIEEgc3RyaW5nIHRvIHByZXBlbmQgdG8gZWFjaCBmaWVsZCBkaXNwbGF5ZWQgaW4gYSB0b29sdGlwDQoqICAgdG9vbHRpcFN1ZmZpeCAtIEEgc3RyaW5nIHRvIGFwcGVuZCB0byBlYWNoIGZpZWxkIGRpc3BsYXllZCBpbiBhIHRvb2x0aXANCiogICB0b29sdGlwUHJlZml4QmluTGFiZWxzIC0gQW4gYXJyYXkgb2YgQmluIExhYmVscyBmb3IgZWFjaCBvZmZzZXQgdmFsdWUgdG8gYWRkIGFzIHRoZSBzdGFydA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdG9vbHRpcCBwcmVmaXguICBFeGFtcGxlOg0KKiAgICAgICAgdmFyIGdpYW50c19nYW1lX3Jlc3VsdHMgPSBbMSwtMSwxLC0xLC0xLC0xLDEsMSwxLC0xLDEsLTEsLTEsMSwxLDEsMSwxLDEsMV0sDQoqICAgICAgICAgICAgZ2lhbnRzX2dhbWVfZGF0ZXMgID0gWyI5LzMwIiwgIjEwLzEiLCAiMTAvMiIsICIxMC8zIiwgIjEwLzYiLCAiMTAvNyIsICIxMC85IiwgIjEwLzEwIiwgIjEwLzExIiwgIjEwLzE0IiwgIjEwLzE1IiwNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwLzE3IiwgIjEwLzE4IiwgIjEwLzE5IiwgIjEwLzIxIiwgIjEwLzIyIiwgIjEwLzI0IiwgIjEwLzI1IiwgIjEwLzI3IiwgIjEwLzI4Il07DQoqICAgICAgICAkKCcjZ2lhbnRzJykuc3BhcmtsaW5lKGdpYW50c19yZXN1bHRzLCB7dHlwZTogJ3RyaXN0YXRlJywgdG9vbHRpcFByZWZpeEJpbkxhYmVsczogZ2lhbnRzX2RhdGVzLCB0b29sdGlwUHJlZml4OiAnIC0gJ307DQoqICAgdG9vbHRpcFN1ZmZpeEJpbkxhYmVscyAtIEFuIGFycmF5IG9mIEJpbiBMYWJlbHMgZm9yIGVhY2ggb2Zmc2V0IHZhbHVlIHRvIGFkZCBhcyB0aGUgZW5kDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0b29sdGlwIHN1ZmZpeC4NCiogICB0b29sdGlwU2tpcE51bGwgLSBJZiB0cnVlIHRoZW4gbnVsbCB2YWx1ZXMgd2lsbCBub3QgaGF2ZSBhIHRvb2x0aXAgZGlzcGxheWVkIChkZWZhdWx0cyB0byB0cnVlKQ0KKiAgIHRvb2x0aXBWYWx1ZUxvb2t1cHMgLSBBbiBvYmplY3Qgb3IgcmFuZ2UgbWFwIHRvIG1hcCBmaWVsZCB2YWx1ZXMgdG8gdG9vbHRpcCBzdHJpbmdzDQoqICAgICAgICAgICAgICAgICAgICAgICAgIChlZy4gdG8gbWFwIC0xIHRvICJMb3N0IiwgMCB0byAiRHJhdyIsIGFuZCAxIHRvICJXaW4iKQ0KKiAgIHRvb2xUaXBQb3NpdGlvbiAtIERpc3BsYXkgdG9vbHRpcCB0byB0aGUgJ2xlZnQnIG9yICdyaWdodCcgb2YgdGhlIG1vdXNlIC0gRGVmYXVsdHMgdG8gInJpZ2h0Ig0KKiAgIG51bWJlckZvcm1hdHRlciAtIE9wdGlvbmFsIGNhbGxiYWNrIGZvciBmb3JtYXR0aW5nIG51bWJlcnMgaW4gdG9vbHRpcHMNCiogICBudW1iZXJEaWdpdEdyb3VwU2VwIC0gQ2hhcmFjdGVyIHRvIHVzZSBmb3IgZ3JvdXAgc2VwYXJhdG9yIGluIG51bWJlcnMgIjEsMjM0IiAtIERlZmF1bHRzIHRvICIsIg0KKiAgIG51bWJlckRlY2ltYWxNYXJrIC0gQ2hhcmFjdGVyIHRvIHVzZSBmb3IgdGhlIGRlY2ltYWwgcG9pbnQgd2hlbiBmb3JtYXR0aW5nIG51bWJlcnMgLSBEZWZhdWx0cyB0byAiLiINCiogICBudW1iZXJEaWdpdEdyb3VwQ291bnQgLSBOdW1iZXIgb2YgZGlnaXRzIGJldHdlZW4gZ3JvdXAgc2VwYXJhdG9yIC0gRGVmYXVsdHMgdG8gMw0KKg0KKiBUaGVyZSBhcmUgOCB0eXBlcyBvZiBzcGFya2xpbmUsIHNlbGVjdGVkIGJ5IHN1cHBseWluZyBhICJ0eXBlIiBvcHRpb24gb2YgJ2xpbmUnIChkZWZhdWx0KSwNCiogJ2JhcicsICd0cmlzdGF0ZScsICdidWxsZXQnLCAnZGlzY3JldGUnLCAncGllJywgJ2JveCcgb3IgJ3N0YWNrJw0KKiAgICBsaW5lIC0gTGluZSBjaGFydC4gIE9wdGlvbnM6DQoqICAgICAgIHNwb3RDb2xvciAtIFNldCB0byAnJyB0byBub3QgZW5kIGVhY2ggbGluZSBpbiBhIGNpcmN1bGFyIHNwb3QNCiogICAgICAgbWluU3BvdENvbG9yIC0gSWYgc2V0LCBjb2xvciBvZiBzcG90IGF0IG1pbmltdW0gdmFsdWUNCiogICAgICAgbWF4U3BvdENvbG9yIC0gSWYgc2V0LCBjb2xvciBvZiBzcG90IGF0IG1heGltdW0gdmFsdWUNCiogICAgICAgc3BvdFJhZGl1cyAtIFJhZGl1cyBpbiBwaXhlbHMNCiogICAgICAgbGluZVdpZHRoIC0gV2lkdGggb2YgbGluZSBpbiBwaXhlbHMNCiogICAgICAgbm9ybWFsUmFuZ2VNaW4NCiogICAgICAgbm9ybWFsUmFuZ2VNYXggLSBJZiBzZXQgZHJhd3MgYSBmaWxsZWQgaG9yaXpvbnRhbCBiYXIgYmV0d2VlbiB0aGVzZSB0d28gdmFsdWVzIG1hcmtpbmcgdGhlICJub3JtYWwiDQoqICAgICAgICAgICAgICAgICAgICAgICAgb3IgZXhwZWN0ZWQgcmFuZ2Ugb2YgdmFsdWVzDQoqICAgICAgIG5vcm1hbFJhbmdlQ29sb3IgLSBDb2xvciB0byB1c2UgZm9yIHRoZSBhYm92ZSBiYXINCiogICAgICAgZHJhd05vcm1hbE9uVG9wIC0gRHJhdyB0aGUgbm9ybWFsIHJhbmdlIGFib3ZlIHRoZSBjaGFydCBmaWxsIGNvbG9yIGlmIHRydWUNCiogICAgICAgZGVmYXVsdFBpeGVsc1BlclZhbHVlIC0gRGVmYXVsdHMgdG8gMyBwaXhlbHMgb2Ygd2lkdGggZm9yIGVhY2ggdmFsdWUgaW4gdGhlIGNoYXJ0DQoqICAgICAgIGhpZ2hsaWdodFNwb3RDb2xvciAtIFRoZSBjb2xvciB0byB1c2UgZm9yIGRyYXdpbmcgYSBoaWdobGlnaHQgc3BvdCBvbiBtb3VzZW92ZXIgLSBTZXQgdG8gbnVsbCB0byBkaXNhYmxlDQoqICAgICAgIGhpZ2hsaWdodExpbmVDb2xvciAtIFRoZSBjb2xvciB0byB1c2UgZm9yIGRyYXdpbmcgYSBoaWdobGlnaHQgbGluZSBvbiBtb3VzZW92ZXIgLSBTZXQgdG8gbnVsbCB0byBkaXNhYmxlDQoqICAgICAgIHZhbHVlU3BvdHMgLSBTcGVjaWZ5IHdoaWNoIHBvaW50cyB0byBkcmF3IHNwb3RzIG9uLCBhbmQgaW4gd2hpY2ggY29sb3IuICBBY2NlcHRzIGEgcmFuZ2UgbWFwDQoqDQoqICAgYmFyIC0gQmFyIGNoYXJ0LiAgT3B0aW9uczoNCiogICAgICAgYmFyQ29sb3IgLSBDb2xvciBvZiBiYXJzIGZvciBwb3NpdGl2ZSB2YWx1ZXMNCiogICAgICAgbmVnQmFyQ29sb3IgLSBDb2xvciBvZiBiYXJzIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiogICAgICAgemVyb0NvbG9yIC0gQ29sb3Igb2YgYmFycyB3aXRoIHplcm8gdmFsdWVzDQoqICAgICAgIG51bGxDb2xvciAtIENvbG9yIG9mIGJhcnMgd2l0aCBudWxsIHZhbHVlcyAtIERlZmF1bHRzIHRvIG9taXR0aW5nIHRoZSBiYXIgZW50aXJlbHkNCiogICAgICAgYmFyV2lkdGggLSBXaWR0aCBvZiBiYXJzIGluIHBpeGVscw0KKiAgICAgICBjb2xvck1hcCAtIE9wdGlvbmFsIG1hcHBpbmcgb2YgdmFsdWVzIHRvIGNvbG9ycyB0byBvdmVycmlkZSB0aGUgKkJhckNvbG9yIHZhbHVlcyBhYm92ZQ0KKiAgICAgICAgICAgICAgICAgIGNhbiBiZSBhbiBBcnJheSBvZiB2YWx1ZXMgdG8gY29udHJvbCB0aGUgY29sb3Igb2YgaW5kaXZpZHVhbCBiYXJzIG9yIGEgcmFuZ2UgbWFwDQoqICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSBjb2xvcnMgZm9yIGluZGl2aWR1YWwgcmFuZ2VzIG9mIHZhbHVlcw0KKiAgICAgICBiYXJTcGFjaW5nIC0gR2FwIGJldHdlZW4gYmFycyBpbiBwaXhlbHMNCiogICAgICAgemVyb0F4aXMgLSBDZW50ZXJzIHRoZSB5LWF4aXMgYXJvdW5kIHplcm8gaWYgdHJ1ZQ0KKg0KKiAgIHRyaXN0YXRlIC0gQ2hhcnRzIHZhbHVlcyBvZiB3aW4gKD4wKSwgbG9zZSAoPDApIG9yIGRyYXcgKD0wKQ0KKiAgICAgICBwb3NCYXJDb2xvciAtIENvbG9yIG9mIHdpbiB2YWx1ZXMNCiogICAgICAgbmVnQmFyQ29sb3IgLSBDb2xvciBvZiBsb3NlIHZhbHVlcw0KKiAgICAgICB6ZXJvQmFyQ29sb3IgLSBDb2xvciBvZiBkcmF3IHZhbHVlcw0KKiAgICAgICBiYXJXaWR0aCAtIFdpZHRoIG9mIGJhcnMgaW4gcGl4ZWxzDQoqICAgICAgIGJhclNwYWNpbmcgLSBHYXAgYmV0d2VlbiBiYXJzIGluIHBpeGVscw0KKiAgICAgICBjb2xvck1hcCAtIE9wdGlvbmFsIG1hcHBpbmcgb2YgdmFsdWVzIHRvIGNvbG9ycyB0byBvdmVycmlkZSB0aGUgKkJhckNvbG9yIHZhbHVlcyBhYm92ZQ0KKiAgICAgICAgICAgICAgICAgIGNhbiBiZSBhbiBBcnJheSBvZiB2YWx1ZXMgdG8gY29udHJvbCB0aGUgY29sb3Igb2YgaW5kaXZpZHVhbCBiYXJzIG9yIGEgcmFuZ2UgbWFwDQoqICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSBjb2xvcnMgZm9yIGluZGl2aWR1YWwgcmFuZ2VzIG9mIHZhbHVlcw0KKg0KKiAgIGRpc2NyZXRlIC0gT3B0aW9uczoNCiogICAgICAgbGluZUhlaWdodCAtIEhlaWdodCBvZiBlYWNoIGxpbmUgaW4gcGl4ZWxzIC0gRGVmYXVsdHMgdG8gMzAlIG9mIHRoZSBncmFwaCBoZWlnaHQNCiogICAgICAgdGhlc2hvbGRWYWx1ZSAtIFZhbHVlcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGRyYXduIHVzaW5nIHRocmVzaG9sZENvbG9yIGluc3RlYWQgb2YgbGluZUNvbG9yDQoqICAgICAgIHRocmVzaG9sZENvbG9yDQoqDQoqICAgYnVsbGV0IC0gVmFsdWVzIGZvciBidWxsZXQgZ3JhcGhzIG1zdXQgYmUgaW4gdGhlIG9yZGVyOiB0YXJnZXQsIHBlcmZvcm1hbmNlLCByYW5nZTEsIHJhbmdlMiwgcmFuZ2UzLCAuLi4NCiogICAgICAgb3B0aW9uczoNCiogICAgICAgdGFyZ2V0Q29sb3IgLSBUaGUgY29sb3Igb2YgdGhlIHZlcnRpY2FsIHRhcmdldCBtYXJrZXINCiogICAgICAgdGFyZ2V0V2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRhcmdldCBtYXJrZXIgaW4gcGl4ZWxzDQoqICAgICAgIHBlcmZvcm1hbmNlQ29sb3IgLSBUaGUgY29sb3Igb2YgdGhlIHBlcmZvcm1hbmNlIG1lYXN1cmUgaG9yaXpvbnRhbCBiYXINCiogICAgICAgcmFuZ2VDb2xvcnMgLSBDb2xvcnMgdG8gdXNlIGZvciBlYWNoIHF1YWxpdGF0aXZlIHJhbmdlIGJhY2tncm91bmQgY29sb3INCioNCiogICBwaWUgLSBQaWUgY2hhcnQuIE9wdGlvbnM6DQoqICAgICAgIHNsaWNlQ29sb3JzIC0gQW4gYXJyYXkgb2YgY29sb3JzIHRvIHVzZSBmb3IgcGllIHNsaWNlcw0KKiAgICAgICBvZmZzZXQgLSBBbmdsZSBpbiBkZWdyZWVzIHRvIG9mZnNldCB0aGUgZmlyc3Qgc2xpY2UgLSBUcnkgLTkwIG9yICs5MA0KKiAgICAgICBib3JkZXJXaWR0aCAtIFdpZHRoIG9mIGJvcmRlciB0byBkcmF3IGFyb3VuZCB0aGUgcGllIGNoYXJ0LCBpbiBwaXhlbHMgLSBEZWZhdWx0cyB0byAwIChubyBib3JkZXIpDQoqICAgICAgIGJvcmRlckNvbG9yIC0gQ29sb3IgdG8gdXNlIGZvciB0aGUgcGllIGNoYXJ0IGJvcmRlciAtIERlZmF1bHRzIHRvICMwMDANCiogICBzdGFjayAtIEhvcml6b250YWwgc3RhY2sgY2hhcnQuIE9wdGlvbnM6DQoqICAgICAgIHNsaWNlQ29sb3JzIC0gQW4gYXJyYXkgb2YgY29sb3JzIHRvIHVzZSBmb3IgcGllIHNsaWNlcw0KKg0KKiAgIGJveCAtIEJveCBwbG90LiBPcHRpb25zOg0KKiAgICAgICByYXcgLSBTZXQgdG8gdHJ1ZSB0byBzdXBwbHkgcHJlLWNvbXB1dGVkIHBsb3QgcG9pbnRzIGFzIHZhbHVlcw0KKiAgICAgICAgICAgICB2YWx1ZXMgc2hvdWxkIGJlOiBsb3dfb3V0bGllciwgbG93X3doaXNrZXIsIHExLCBtZWRpYW4sIHEzLCBoaWdoX3doaXNrZXIsIGhpZ2hfb3V0bGllcg0KKiAgICAgICAgICAgICBXaGVuIHNldCB0byBmYWxzZSB5b3UgY2FuIHN1cHBseSBhbnkgbnVtYmVyIG9mIHZhbHVlcyBhbmQgdGhlIGJveCBwbG90IHdpbGwNCiogICAgICAgICAgICAgYmUgY29tcHV0ZWQgZm9yIHlvdS4gIERlZmF1bHQgaXMgZmFsc2UuDQoqICAgICAgIHNob3dPdXRsaWVycyAtIFNldCB0byB0cnVlIChkZWZhdWx0KSB0byBkaXNwbGF5IG91dGxpZXJzIGFzIGNpcmNsZXMNCiogICAgICAgb3V0bGllcklRUiAtIEludGVycXVhcnRpbGUgcmFuZ2UgdXNlZCB0byBkZXRlcm1pbmUgb3V0bGllcnMuICBEZWZhdWx0IDEuNQ0KKiAgICAgICBib3hMaW5lQ29sb3IgLSBPdXRsaW5lIGNvbG9yIG9mIHRoZSBib3gNCiogICAgICAgYm94RmlsbENvbG9yIC0gRmlsbCBjb2xvciBmb3IgdGhlIGJveA0KKiAgICAgICB3aGlza2VyQ29sb3IgLSBMaW5lIGNvbG9yIHVzZWQgZm9yIHdoaXNrZXJzDQoqICAgICAgIG91dGxpZXJMaW5lQ29sb3IgLSBPdXRsaW5lIGNvbG9yIG9mIG91dGxpZXIgY2lyY2xlcw0KKiAgICAgICBvdXRsaWVyRmlsbENvbG9yIC0gRmlsbCBjb2xvciBvZiB0aGUgb3V0bGllciBjaXJjbGVzDQoqICAgICAgIHNwb3RSYWRpdXMgLSBSYWRpdXMgb2Ygb3V0bGllciBjaXJjbGVzDQoqICAgICAgIG1lZGlhbkNvbG9yIC0gTGluZSBjb2xvciBvZiB0aGUgbWVkaWFuIGxpbmUNCiogICAgICAgdGFyZ2V0IC0gRHJhdyBhIHRhcmdldCBjcm9zcyBoYWlyIGF0IHRoZSBzdXBwbGllZCB2YWx1ZSAoZGVmYXVsdCB1bmRlZmluZWQpDQoqDQoqDQoqDQoqICAgRXhhbXBsZXM6DQoqICAgJCgnI3NwYXJrbGluZTEnKS5zcGFya2xpbmUobXl2YWx1ZXMsIHsgbGluZUNvbG9yOiAnI2YwMCcsIGZpbGxDb2xvcjogZmFsc2UgfSk7DQoqICAgJCgnLmJhcnNwYXJrcycpLnNwYXJrbGluZSgnaHRtbCcsIHsgdHlwZTonYmFyJywgaGVpZ2h0Oic0MHB4JywgYmFyV2lkdGg6NSB9KTsNCiogICAkKCcjdHJpc3RhdGUnKS5zcGFya2xpbmUoWzEsMSwtMSwxLDAsMCwtMV0sIHsgdHlwZTondHJpc3RhdGUnIH0pOg0KKiAgICQoJyNkaXNjcmV0ZScpLnNwYXJrbGluZShbMSwzLDQsNSw1LDMsNCw1XSwgeyB0eXBlOidkaXNjcmV0ZScgfSk7DQoqICAgJCgnI2J1bGxldCcpLnNwYXJrbGluZShbMTAsMTIsMTIsOSw3XSwgeyB0eXBlOididWxsZXQnIH0pOw0KKiAgICQoJyNwaWUnKS5zcGFya2xpbmUoWzEsMSwyXSwgeyB0eXBlOidwaWUnIH0pOw0KKi8NCg0KLypqc2xpbnQgcmVnZXhwOiB0cnVlLCBicm93c2VyOiB0cnVlLCBqcXVlcnk6IHRydWUsIHdoaXRlOiB0cnVlLCBub21lbjogZmFsc2UsIHBsdXNwbHVzOiBmYWxzZSwgbWF4ZXJyOiA1MDAsIGluZGVudDogNCAqLw0KDQooZnVuY3Rpb24oZG9jdW1lbnQsIE1hdGgsIHVuZGVmaW5lZCkgeyAvLyBwZXJmb3JtYW5jZS9taW5pZmllZC1zaXplIG9wdGltaXphdGlvbg0KKGZ1bmN0aW9uKGZhY3RvcnkpIHsNCiAgICBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsNCiAgICAgICAgZGVmaW5lKCdqcXVlcnkuc3BhcmtsaW5lJywgWydqcXVlcnknXSwgZmFjdG9yeSk7DQogICAgfSBlbHNlIGlmIChqUXVlcnkgJiYgIWpRdWVyeS5mbi5zcGFya2xpbmUpIHsNCiAgICAgICAgZmFjdG9yeShqUXVlcnkpOw0KICAgIH0NCn0NCihmdW5jdGlvbigkKSB7DQogICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgLy8gQ1VTVE9NIE1PRDogbWVkaWFuIHZhciBhZGRlZA0KICAgIHZhciBVTlNFVF9PUFRJT04gPSB7fSwNCiAgICAgICAgZ2V0RGVmYXVsdHMsIGNyZWF0ZUNsYXNzLCBTUEZvcm1hdCwgY2xpcHZhbCwgbWVkaWFuLCBxdWFydGlsZSwgbm9ybWFsaXplVmFsdWUsIG5vcm1hbGl6ZVZhbHVlcywNCiAgICAgICAgcmVtb3ZlLCBpc051bWJlciwgYWxsLCBzdW0sIGFkZENTUywgZW5zdXJlQXJyYXksIGZvcm1hdE51bWJlciwgUmFuZ2VNYXAsDQogICAgICAgIE1vdXNlSGFuZGxlciwgVG9vbHRpcCwgYmFySGlnaGxpZ2h0TWl4aW4sDQogICAgICAgIGxpbmUsIGJhciwgdHJpc3RhdGUsIGRpc2NyZXRlLCBidWxsZXQsIHBpZSwgc3RhY2ssIGJveCwgdGltZWxpbmUsIGRlZmF1bHRTdHlsZXMsIGluaXRTdHlsZXMsDQogICAgICAgIFZTaGFwZSwgVkNhbnZhc19iYXNlLCBWQ2FudmFzX2NhbnZhcywgVkNhbnZhc192bWwsIHBlbmRpbmcsIHNoYXBlQ291bnQgPSAwOw0KDQoNCiAgICAvKioNCiAgICAgKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MNCiAgICAgKi8NCiAgICBnZXREZWZhdWx0cyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIC8vIFNldHRpbmdzIGNvbW1vbiB0byBtb3N0L2FsbCBjaGFydCB0eXBlcw0KICAgICAgICAgICAgY29tbW9uOiB7DQogICAgICAgICAgICAgICAgdHlwZTogJ2xpbmUnLA0KICAgICAgICAgICAgICAgIGxpbmVDb2xvcjogJyMwMGYnLA0KICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJyNjZGYnLA0KICAgICAgICAgICAgICAgIGRlZmF1bHRQaXhlbHNQZXJWYWx1ZTogMywNCiAgICAgICAgICAgICAgICB3aWR0aDogJ2F1dG8nLA0KICAgICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLA0KICAgICAgICAgICAgICAgIGNvbXBvc2l0ZTogZmFsc2UsDQogICAgICAgICAgICAgICAgdGFnVmFsdWVzQXR0cmlidXRlOiAndmFsdWVzJywNCiAgICAgICAgICAgICAgICB0YWdPcHRpb25zUHJlZml4OiAnc3BhcmsnLA0KICAgICAgICAgICAgICAgIGVuYWJsZVRhZ09wdGlvbnM6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGVuYWJsZUhpZ2hsaWdodDogdHJ1ZSwNCiAgICAgICAgICAgICAgICBoaWdobGlnaHRMaWdodGVuOiAxLjQsDQogICAgICAgICAgICAgICAgdG9vbHRpcFNraXBOdWxsOiB0cnVlLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBQcmVmaXg6ICcnLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBTdWZmaXg6ICcnLA0KICAgICAgICAgICAgICAgIGRpc2FibGVIaWRkZW5DaGVjazogZmFsc2UsDQogICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0dGVyOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBudW1iZXJEaWdpdEdyb3VwQ291bnQ6IDMsDQogICAgICAgICAgICAgICAgbnVtYmVyRGlnaXRHcm91cFNlcDogJywnLA0KICAgICAgICAgICAgICAgIG51bWJlckRlY2ltYWxNYXJrOiAnLicsDQogICAgICAgICAgICAgICAgZGlzYWJsZVRvb2x0aXBzOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBkaXNhYmxlSW50ZXJhY3Rpb246IGZhbHNlDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIGxpbmUgY2hhcnRzDQogICAgICAgICAgICBsaW5lOiB7DQogICAgICAgICAgICAgICAgc3BvdENvbG9yOiAnI2Y4MCcsDQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0U3BvdENvbG9yOiAnIzVmNScsDQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0TGluZUNvbG9yOiAnI2YyMicsDQogICAgICAgICAgICAgICAgcmVmTGluZUNvbG9yOiAnI2YyMicsDQogICAgICAgICAgICAgICAgLy8gcmVmTGluZVg6IG51bGwsDQogICAgICAgICAgICAgICAgLy8gcmVmTGluZVk6IG51bGwsDQogICAgICAgICAgICAgICAgc3BvdFJhZGl1czogMS41LA0KICAgICAgICAgICAgICAgIG1pblNwb3RDb2xvcjogJyNmODAnLA0KICAgICAgICAgICAgICAgIG1heFNwb3RDb2xvcjogJyNmODAnLA0KICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogMSwNCiAgICAgICAgICAgICAgICBub3JtYWxSYW5nZU1pbjogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIG5vcm1hbFJhbmdlTWF4OiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgbm9ybWFsUmFuZ2VDb2xvcjogJyNjY2MnLA0KICAgICAgICAgICAgICAgIGRyYXdOb3JtYWxPblRvcDogZmFsc2UsDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1pbjogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIGNoYXJ0UmFuZ2VNYXg6IHVuZGVmaW5lZCwNCiAgICAgICAgICAgICAgICBjaGFydFJhbmdlTWluWDogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIGNoYXJ0UmFuZ2VNYXhYOiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdDogbmV3IFNQRm9ybWF0KCc8c3BhbiBzdHlsZT0iY29sb3I6IHt7Y29sb3J9fSI+JiM5Njc5Ozwvc3Bhbj4ge3twcmVmaXh9fXt7eX19e3tzdWZmaXh9fScpDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIGJhciBjaGFydHMNCiAgICAgICAgICAgIGJhcjogew0KICAgICAgICAgICAgICAgIGJhckNvbG9yOiAnIzMzNjZjYycsDQogICAgICAgICAgICAgICAgbmVnQmFyQ29sb3I6ICcjZjQ0JywNCiAgICAgICAgICAgICAgICBzdGFja2VkQmFyQ29sb3I6IFsnIzMzNjZjYycsICcjZGMzOTEyJywgJyNmZjk5MDAnLCAnIzEwOTYxOCcsICcjNjZhYTAwJywNCiAgICAgICAgICAgICAgICAgICAgJyNkZDQ0NzcnLCAnIzAwOTljNicsICcjOTkwMDk5J10sDQogICAgICAgICAgICAgICAgemVyb0NvbG9yOiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgbnVsbENvbG9yOiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgemVyb0F4aXM6IHRydWUsDQogICAgICAgICAgICAgICAgYmFyV2lkdGg6IDQsDQogICAgICAgICAgICAgICAgYmFyU3BhY2luZzogMSwNCiAgICAgICAgICAgICAgICBjaGFydFJhbmdlTWF4OiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1pbjogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIGNoYXJ0UmFuZ2VDbGlwOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBjb2xvck1hcDogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBGb3JtYXQ6IG5ldyBTUEZvcm1hdCgnPHNwYW4gc3R5bGU9ImNvbG9yOiB7e2NvbG9yfX0iPiYjOTY3OTs8L3NwYW4+IHt7cHJlZml4fX17e3ZhbHVlfX17e3N1ZmZpeH19JykNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAvLyBEZWZhdWx0cyBmb3IgdGltZWxpbmUgY2hhcnRzDQogICAgICAgICAgICB0aW1lbGluZTogew0KICAgICAgICAgICAgICAgIHdpZHRoOiAxMjAsDQogICAgICAgICAgICAgICAgaGVpZ2h0OiAzLA0KICAgICAgICAgICAgICAgIGxpbmVDb2xvcjogJyM2NzkyYzYnLA0KICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJyNiYWQ3ZmInLA0KICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcsIC8vIG9yICd2ZXJ0aWNhbCcNCiAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgbWludXRlcyB0byBtb2R1bGF0ZSB0aW1lIG1hcmtlcnMgZnJvbSBiZWdpbiBvcHRpb24NCiAgICAgICAgICAgICAgICB0aW1lTWFya0ludGVydmFsOiAwLA0KICAgICAgICAgICAgICAgIC8vIG1pbmltdW0gZGF0ZS90aW1lIHRvIHNob3cgaW4gdGltZWxpbmUNCiAgICAgICAgICAgICAgICBiZWdpbjogbmV3IERhdGUoMjAwMCwgMSwgMSwgMCwgMCksDQogICAgICAgICAgICAgICAgLy8gbWF4aW11bSBkYXRlL3RpbWUgdG8gc2hvdyBpbiB0aW1lbGluZQ0KICAgICAgICAgICAgICAgIGZpbmlzaDogbmV3IERhdGUoMjAwMCwgMSwgMSwgMjMsIDU5KSwNCiAgICAgICAgICAgICAgICAvLyBhbGxvdyB1c2VyIHRvIHByb3ZpZGUgdGhlaXIgb3duIGRhdGUgcGFyc2luZyBhYmlsaXRpZXMNCiAgICAgICAgICAgICAgICAvLyBkYXRhIG11c3QgcHJvdmlkZSBiZWdpbiwgZmluaXNoLCB0aXRsZSBhbmQgY29sb3IgaGFzaCBvYmplY3QNCiAgICAgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4ge2JlZ2luOiBuZXcgRGF0ZShkYXRhLmJlZ2luKSwgZmluaXNoOiBuZXcgRGF0ZShkYXRhLmZpbmlzaCksIHRpdGxlOiBkYXRhLnRpdGxlLCBjb2xvcjogZGF0YS5jb2xvcn07IH0sDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdDogbmV3IFNQRm9ybWF0KCc8c3BhbiBzdHlsZT0iY29sb3I6IHt7Y29sb3J9fSI+JiM5Njc5Ozwvc3Bhbj4ge3t0aXRsZX19OiB7e2JlZ2lufX0gLyB7e2ZpbmlzaH19JykNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAvLyBEZWZhdWx0cyBmb3IgdHJpc3RhdGUgY2hhcnRzDQogICAgICAgICAgICB0cmlzdGF0ZTogew0KICAgICAgICAgICAgICAgIGJhcldpZHRoOiA0LA0KICAgICAgICAgICAgICAgIGJhclNwYWNpbmc6IDEsDQogICAgICAgICAgICAgICAgcG9zQmFyQ29sb3I6ICcjNmY2JywNCiAgICAgICAgICAgICAgICBuZWdCYXJDb2xvcjogJyNmNDQnLA0KICAgICAgICAgICAgICAgIHplcm9CYXJDb2xvcjogJyM5OTknLA0KICAgICAgICAgICAgICAgIGNvbG9yTWFwOiB7fSwNCiAgICAgICAgICAgICAgICB0b29sdGlwRm9ybWF0OiBuZXcgU1BGb3JtYXQoJzxzcGFuIHN0eWxlPSJjb2xvcjoge3tjb2xvcn19Ij4mIzk2Nzk7PC9zcGFuPiB7e3ByZWZpeH19e3t2YWx1ZTptYXB9fXt7c3VmZml4fX0nKSwNCiAgICAgICAgICAgICAgICB0b29sdGlwVmFsdWVMb29rdXBzOiB7IG1hcDogeyAnLTEnOiAnTG9zcycsICcwJzogJ0RyYXcnLCAnMSc6ICdXaW4nIH0gfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIC8vIERlZmF1bHRzIGZvciBkaXNjcmV0ZSBjaGFydHMNCiAgICAgICAgICAgIGRpc2NyZXRlOiB7DQogICAgICAgICAgICAgICAgbGluZUhlaWdodDogJ2F1dG8nLA0KICAgICAgICAgICAgICAgIHRocmVzaG9sZENvbG9yOiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdGhyZXNob2xkVmFsdWU6IDAsDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1heDogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIGNoYXJ0UmFuZ2VNaW46IHVuZGVmaW5lZCwNCiAgICAgICAgICAgICAgICBjaGFydFJhbmdlQ2xpcDogZmFsc2UsDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdDogbmV3IFNQRm9ybWF0KCd7e3ByZWZpeH19e3t2YWx1ZX19e3tzdWZmaXh9fScpDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIGJ1bGxldCBjaGFydHMNCiAgICAgICAgICAgIGJ1bGxldDogew0KICAgICAgICAgICAgICAgIHRhcmdldENvbG9yOiAnI2YzMycsDQogICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGg6IDMsIC8vIHdpZHRoIG9mIHRoZSB0YXJnZXQgYmFyIGluIHBpeGVscw0KICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlQ29sb3I6ICcjMzNmJywNCiAgICAgICAgICAgICAgICByYW5nZUNvbG9yczogWycjZDNkYWZlJywgJyNhOGI2ZmYnLCAnIzdmOTRmZiddLA0KICAgICAgICAgICAgICAgIGJhc2U6IHVuZGVmaW5lZCwgLy8gc2V0IHRoaXMgdG8gYSBudW1iZXIgdG8gY2hhbmdlIHRoZSBiYXNlIHN0YXJ0IG51bWJlcg0KICAgICAgICAgICAgICAgIHRvb2x0aXBGb3JtYXQ6IG5ldyBTUEZvcm1hdCgne3tmaWVsZGtleTpmaWVsZHN9fSAtIHt7dmFsdWV9fScpLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBWYWx1ZUxvb2t1cHM6IHsgZmllbGRzOiB7cjogJ1JhbmdlJywgcDogJ1BlcmZvcm1hbmNlJywgdDogJ1RhcmdldCd9IH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAvLyBEZWZhdWx0cyBmb3IgcGllIGNoYXJ0cw0KICAgICAgICAgICAgcGllOiB7DQogICAgICAgICAgICAgICAgb2Zmc2V0OiAwLA0KICAgICAgICAgICAgICAgIHNsaWNlQ29sb3JzOiBbJyMzMzY2Y2MnLCAnI2RjMzkxMicsICcjZmY5OTAwJywgJyMxMDk2MTgnLCAnIzY2YWEwMCcsDQogICAgICAgICAgICAgICAgICAgICcjZGQ0NDc3JywgJyMwMDk5YzYnLCAnIzk5MDA5OSddLA0KICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiAwLA0KICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAnIzAwMCcsDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdDogbmV3IFNQRm9ybWF0KCc8c3BhbiBzdHlsZT0iY29sb3I6IHt7Y29sb3J9fSI+JiM5Njc5Ozwvc3Bhbj4ge3twcmVmaXh9fXt7dmFsdWV9fSAoe3twZXJjZW50LjF9fSUpe3tzdWZmaXh9fScpDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIHN0YWNrIGNoYXJ0cw0KICAgICAgICAgICAgc3RhY2s6IHsNCiAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsDQogICAgICAgICAgICAgICAgc2xpY2VDb2xvcnM6IFsnIzMzNjZjYycsICcjZGMzOTEyJywgJyNmZjk5MDAnLCAnIzEwOTYxOCcsICcjNjZhYTAwJywNCiAgICAgICAgICAgICAgICAgICAgJyNkZDQ0NzcnLCAnIzAwOTljNicsICcjOTkwMDk5J10sDQogICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDAsDQogICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICcjMDAwJywNCiAgICAgICAgICAgICAgICB0b29sdGlwRm9ybWF0OiBuZXcgU1BGb3JtYXQoJzxzcGFuIHN0eWxlPSJjb2xvcjoge3tjb2xvcn19Ij4mIzk2Nzk7PC9zcGFuPiB7e3ZhbHVlfX0gKHt7cGVyY2VudC4xfX0lKScpDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgLy8gRGVmYXVsdHMgZm9yIGJveCBwbG90cw0KICAgICAgICAgICAgYm94OiB7DQogICAgICAgICAgICAgICAgcmF3OiBmYWxzZSwNCiAgICAgICAgICAgICAgICBib3hMaW5lQ29sb3I6ICcjMDAwJywNCiAgICAgICAgICAgICAgICBib3hGaWxsQ29sb3I6ICcjY2RmJywNCiAgICAgICAgICAgICAgICB3aGlza2VyQ29sb3I6ICcjMDAwJywNCiAgICAgICAgICAgICAgICBvdXRsaWVyTGluZUNvbG9yOiAnIzMzMycsDQogICAgICAgICAgICAgICAgb3V0bGllckZpbGxDb2xvcjogJyNmZmYnLA0KICAgICAgICAgICAgICAgIG1lZGlhbkNvbG9yOiAnI2YwMCcsDQogICAgICAgICAgICAgICAgc2hvd091dGxpZXJzOiB0cnVlLA0KICAgICAgICAgICAgICAgIG91dGxpZXJJUVI6IDEuNSwNCiAgICAgICAgICAgICAgICBzcG90UmFkaXVzOiAxLjUsDQogICAgICAgICAgICAgICAgdGFyZ2V0OiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdGFyZ2V0Q29sb3I6ICcjNGEyJywNCiAgICAgICAgICAgICAgICBjaGFydFJhbmdlTWF4OiB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1pbjogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIHRvb2x0aXBGb3JtYXQ6IG5ldyBTUEZvcm1hdCgne3tmaWVsZDpmaWVsZHN9fToge3t2YWx1ZX19JyksDQogICAgICAgICAgICAgICAgdG9vbHRpcEZvcm1hdEZpZWxkbGlzdEtleTogJ2ZpZWxkJywNCiAgICAgICAgICAgICAgICB0b29sdGlwVmFsdWVMb29rdXBzOiB7IGZpZWxkczogeyBscTogJ0xvd2VyIFF1YXJ0aWxlJywgbWVkOiAnTWVkaWFuJywNCiAgICAgICAgICAgICAgICAgICAgdXE6ICdVcHBlciBRdWFydGlsZScsIGxvOiAnTGVmdCBPdXRsaWVyJywgcm86ICdSaWdodCBPdXRsaWVyJywNCiAgICAgICAgICAgICAgICAgICAgbHc6ICdMZWZ0IFdoaXNrZXInLCBydzogJ1JpZ2h0IFdoaXNrZXInfSB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfTsNCg0KICAgIC8vIEJvb3RzdHJhcCBhZGRzIGJveC1zaXppbmcgdGhhdCBtZXNzZXMgd2l0aCBhbGlnbm1lbnQgaW4gdGhlIHRvb2x0aXAuDQogICAgdmFyIGJveF9zaXppbmcgPSAnLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveCAhaW1wb3J0YW50OycgKw0KICAgICAgICAgICctbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7JyArDQogICAgICAgICAgJ2JveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7JzsNCg0KICAgIC8vIFlvdSBjYW4gaGF2ZSB0b29sdGlwcyB1c2UgYSBjc3MgY2xhc3Mgb3RoZXIgdGhhbiBqcXN0b29sdGlwIGJ5IHNwZWNpZnlpbmcgdG9vbHRpcENsYXNzbmFtZQ0KICAgIGRlZmF1bHRTdHlsZXMgPSAnLmpxc3Rvb2x0aXAgeyAnICsNCiAgICAgICAgICAgICdwb3NpdGlvbjogYWJzb2x1dGU7JyArDQogICAgICAgICAgICAnbGVmdDogMHB4OycgKw0KICAgICAgICAgICAgJ3RvcDogMHB4OycgKw0KICAgICAgICAgICAgJ3Zpc2liaWxpdHk6IGhpZGRlbjsnICsNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCkgdHJhbnNwYXJlbnQ7JyArDQogICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjYpOycgKw0KICAgICAgICAgICAgJ2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jOTkwMDAwMDAsIGVuZENvbG9yc3RyPSM5OTAwMDAwMCk7JyArDQogICAgICAgICAgICAnLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM5OTAwMDAwMCwgZW5kQ29sb3JzdHI9Izk5MDAwMDAwKSI7JyArDQogICAgICAgICAgICAnY29sb3I6IHdoaXRlOycgKw0KICAgICAgICAgICAgJ2ZvbnQ6IDEwcHggYXJpYWwsIHNhbiBzZXJpZjsnICsNCiAgICAgICAgICAgICd0ZXh0LWFsaWduOiBsZWZ0OycgKw0KICAgICAgICAgICAgJ3doaXRlLXNwYWNlOiBub3dyYXA7JyArDQogICAgICAgICAgICAncGFkZGluZzogNXB4OycgKw0KICAgICAgICAgICAgJ2JvcmRlcjogMXB4IHNvbGlkIHdoaXRlOycgKw0KICAgICAgICAgICAgJ3otaW5kZXg6IDEwMDAwOycgKw0KICAgICAgICAgICAgYm94X3NpemluZyArDQogICAgICAgICAgICAnfScgKw0KICAgICAgICAgICAgJy5qcXNmaWVsZCB7ICcgKw0KICAgICAgICAgICAgJ2NvbG9yOiB3aGl0ZTsnICsNCiAgICAgICAgICAgICdmb250OiAxMHB4IGFyaWFsLCBzYW4gc2VyaWY7JyArDQogICAgICAgICAgICAndGV4dC1hbGlnbjogbGVmdDsnICsNCiAgICAgICAgICAgICd9JyArDQogICAgICAgICAgICAnLmpxc3Rvb2x0aXA6YmVmb3JlLCAuanFzdG9vbHRpcDphZnRlciB7ICcgKw0KICAgICAgICAgICAgYm94X3NpemluZyArDQogICAgICAgICAgICAnfSc7DQoNCiAgICAvKioNCiAgICAgKiBVdGlsaXRpZXMNCiAgICAgKi8NCg0KICAgIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKC8qIFtiYXNlY2xhc3MsIFttaXhpbiwgLi4uXV0sIGRlZmluaXRpb24gKi8pIHsNCiAgICAgICAgdmFyIENsYXNzLCBhcmdzOw0KICAgICAgICBDbGFzcyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB9Ow0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbMF0pIHsNCiAgICAgICAgICAgICAgICBDbGFzcy5wcm90b3R5cGUgPSAkLmV4dGVuZChuZXcgYXJndW1lbnRzWzBdKCksIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0pOw0KICAgICAgICAgICAgICAgIENsYXNzLl9zdXBlciA9IGFyZ3VtZW50c1swXS5wcm90b3R5cGU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIENsYXNzLnByb3RvdHlwZSA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsNCiAgICAgICAgICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxLCAtMSk7DQogICAgICAgICAgICAgICAgYXJncy51bnNoaWZ0KENsYXNzLnByb3RvdHlwZSk7DQogICAgICAgICAgICAgICAgJC5leHRlbmQuYXBwbHkoJCwgYXJncyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBDbGFzcy5wcm90b3R5cGUgPSBhcmd1bWVudHNbMF07DQogICAgICAgIH0NCiAgICAgICAgQ2xhc3MucHJvdG90eXBlLmNscyA9IENsYXNzOw0KICAgICAgICByZXR1cm4gQ2xhc3M7DQogICAgfTsNCg0KICAgIC8qKg0KICAgICAqIFdyYXBzIGEgZm9ybWF0IHN0cmluZyBmb3IgdG9vbHRpcHMNCiAgICAgKiB7e3h9fQ0KICAgICAqIHt7eC4yfQ0KICAgICAqIHt7eDptb250aHN9fQ0KICAgICAqLw0KICAgICQuU1BGb3JtYXRDbGFzcyA9IFNQRm9ybWF0ID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBmcmU6IC9ce1x7KFtcdy5dKz8pKDooLis/KSk/XH1cfS9nLA0KICAgICAgICBwcmVjcmU6IC8oXHcrKVwuKFxkKykvLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChmb3JtYXQsIGZjbGFzcykgew0KICAgICAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7DQogICAgICAgICAgICB0aGlzLmZjbGFzcyA9IGZjbGFzczsNCiAgICAgICAgfSwNCg0KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChmaWVsZHNldCwgbG9va3Vwcywgb3B0aW9ucykgew0KICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLA0KICAgICAgICAgICAgICAgIGZpZWxkcyA9IGZpZWxkc2V0LA0KICAgICAgICAgICAgICAgIG1hdGNoLCB0b2tlbiwgbG9va3Vwa2V5LCBmaWVsZHZhbHVlLCBwcmVjOw0KDQogICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQucmVwbGFjZSh0aGlzLmZyZSwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHZhciBsb29rdXA7DQogICAgICAgICAgICAgICAgdG9rZW4gPSBhcmd1bWVudHNbMV07DQogICAgICAgICAgICAgICAgbG9va3Vwa2V5ID0gYXJndW1lbnRzWzNdOw0KICAgICAgICAgICAgICAgIG1hdGNoID0gc2VsZi5wcmVjcmUuZXhlYyh0b2tlbik7DQogICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICAgICAgICAgIHByZWMgPSBtYXRjaFsyXTsNCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBtYXRjaFsxXTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBwcmVjID0gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZpZWxkdmFsdWUgPSBmaWVsZHNbdG9rZW5dOw0KICAgICAgICAgICAgICAgIGlmIChmaWVsZHZhbHVlID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobG9va3Vwa2V5ICYmIGxvb2t1cHMgJiYgbG9va3Vwc1tsb29rdXBrZXldKSB7DQogICAgICAgICAgICAgICAgICAgIGxvb2t1cCA9IGxvb2t1cHNbbG9va3Vwa2V5XTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2t1cC5nZXQpIHsgLy8gUmFuZ2VNYXANCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXBzW2xvb2t1cGtleV0uZ2V0KGZpZWxkdmFsdWUpIHx8IGZpZWxkdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9va3Vwc1tsb29rdXBrZXldW2ZpZWxkdmFsdWVdIHx8IGZpZWxkdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZpZWxkdmFsdWUpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnbnVtYmVyRm9ybWF0dGVyJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkdmFsdWUgPSBvcHRpb25zLmdldCgnbnVtYmVyRm9ybWF0dGVyJykoZmllbGR2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHZhbHVlID0gZm9ybWF0TnVtYmVyKGZpZWxkdmFsdWUsIHByZWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ251bWJlckRpZ2l0R3JvdXBDb3VudCcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdudW1iZXJEaWdpdEdyb3VwU2VwJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ251bWJlckRlY2ltYWxNYXJrJykpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHZhbHVlOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIC8vIGNvbnZlbmllbmNlIG1ldGhvZCB0byBhdm9pZCBuZWVkaW5nIHRoZSBuZXcgb3BlcmF0b3INCiAgICAkLnNwZm9ybWF0ID0gZnVuY3Rpb24gKGZvcm1hdCwgZmNsYXNzKSB7DQogICAgICAgIHJldHVybiBuZXcgU1BGb3JtYXQoZm9ybWF0LCBmY2xhc3MpOw0KICAgIH07DQoNCiAgICBjbGlwdmFsID0gZnVuY3Rpb24gKHZhbCwgbWluLCBtYXgpIHsNCiAgICAgICAgaWYgKHZhbCA8IG1pbikgew0KICAgICAgICAgICAgcmV0dXJuIG1pbjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodmFsID4gbWF4KSB7DQogICAgICAgICAgICByZXR1cm4gbWF4Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiB2YWw7DQogICAgfTsNCg0KICAgIC8vIENVU1RPTSBNT0Q6IGNvbXBsZXRlbHkgbmV3IG1lZGlhbiBmdW5jdGlvbg0KICAgIG1lZGlhbiA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsNCiAgICAgICAgdmFyIHJldCwgaWR4Ow0KICAgICAgICBpZiAoMCA9PT0gdmFsdWVzLmxlbmd0aCAlIDIpIHsNCiAgICAgICAgICAgIHZhciB2MSwgdjI7DQogICAgICAgICAgICBpZHggPSB2YWx1ZXMubGVuZ3RoIC8gMjsNCiAgICAgICAgICAgIHYxID0gdmFsdWVzW2lkeCAtIDFdOw0KICAgICAgICAgICAgdjIgPSB2YWx1ZXNbaWR4XTsNCiAgICAgICAgICAgIHJldCA9ICh2MSArIHYyKSAvIDI7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBpZHggPSBwYXJzZUludCh2YWx1ZXMubGVuZ3RoIC8gMik7DQogICAgICAgICAgICByZXQgPSB2YWx1ZXNbaWR4XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7IA0KICAgICAgICAgICAgbTogcmV0LCANCiAgICAgICAgICAgIGlkeDogaWR4IA0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICAvLyBDVVNUT00gTU9EOiBjb21wbGV0ZWx5IHJld3JpdHRlbiBxdWFydGlsZSBmdW5jdGlvbg0KICAgIHF1YXJ0aWxlID0gZnVuY3Rpb24gKHZhbHVlcywgcSkgew0KICAgICAgICB2YXIgcmV0LCBtLCBtZWQ7DQogICAgICAgIG0gPSBtZWRpYW4odmFsdWVzKTsNCg0KICAgICAgICBpZiAocSA9PT0gMikgew0KICAgICAgICAgICAgcmV0ID0gbS5tOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdmFyIGFyciA9IFtdOw0KICAgICAgICAgICAgbWVkID0gbS5tOw0KDQogICAgICAgICAgICBpZiAobWVkICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpzaGludCBpZ25vcmU6bGluZQ0KICAgICAgICAgICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgICAgICAgICBpZiAocSA9PT0gMSkgew0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IG0uaWR4KSB7DQogICAgICAgICAgICAgICAgICAgICAgYXJyW2ldID0gdmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgICAgICAgIGkrKzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpDQogICAgICAgICAgICAgICAgICAgICAgYXJyID0gWyB2YWx1ZXNbMF0gXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAocSA9PT0gMykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IHZhbHVlcy5sZW5ndGggLSAxOw0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA+IG0uaWR4KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhcnJbaV0gPSB2YWx1ZXNbal07DQogICAgICAgICAgICAgICAgICAgICAgICBpKys7DQogICAgICAgICAgICAgICAgICAgICAgICBqLS07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKQ0KICAgICAgICAgICAgICAgICAgICAgIGFyciA9IFsgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSBdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG0gPSBtZWRpYW4oYXJyKTsNCiAgICAgICAgICAgIHJldCA9IG0ubTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmV0Ow0KICAgIH07DQoNCiAgICBub3JtYWxpemVWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsNCiAgICAgICAgdmFyIG5mOw0KICAgICAgICBzd2l0Y2ggKHZhbCkgew0KICAgICAgICBjYXNlICd1bmRlZmluZWQnOg0KICAgICAgICAgICAgdmFsID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ251bGwnOg0KICAgICAgICAgICAgdmFsID0gbnVsbDsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICd0cnVlJzoNCiAgICAgICAgICAgIHZhbCA9IHRydWU7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnZmFsc2UnOg0KICAgICAgICAgICAgdmFsID0gZmFsc2U7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIG5mID0gcGFyc2VGbG9hdCh2YWwpOw0KICAgICAgICAgICAgaWYgKHZhbCA9PSBuZikgew0KICAgICAgICAgICAgICAgIHZhbCA9IG5mOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB2YWw7DQogICAgfTsNCg0KICAgIG5vcm1hbGl6ZVZhbHVlcyA9IGZ1bmN0aW9uICh2YWxzKSB7DQogICAgICAgIHZhciBpLCByZXN1bHQgPSBbXTsNCiAgICAgICAgZm9yIChpID0gdmFscy5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHNbaV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCg0KICAgIHJlbW92ZSA9IGZ1bmN0aW9uICh2YWxzLCBmaWx0ZXIpIHsNCiAgICAgICAgdmFyIGksIHZsLCByZXN1bHQgPSBbXTsNCiAgICAgICAgZm9yIChpID0gMCwgdmwgPSB2YWxzLmxlbmd0aDsgaSA8IHZsOyBpKyspIHsNCiAgICAgICAgICAgIGlmICh2YWxzW2ldICE9PSBmaWx0ZXIpIHsNCiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh2YWxzW2ldKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH07DQoNCiAgICBpc051bWJlciA9IGZ1bmN0aW9uIChudW0pIHsNCiAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG51bSkpICYmIGlzRmluaXRlKG51bSk7DQogICAgfTsNCg0KICAgIGZvcm1hdE51bWJlciA9IGZ1bmN0aW9uIChudW0sIHByZWMsIGdyb3Vwc2l6ZSwgZ3JvdXBzZXAsIGRlY3NlcCkgew0KICAgICAgICB2YXIgcCwgaTsNCiAgICAgICAgbnVtID0gKHByZWMgPT09IGZhbHNlID8gcGFyc2VGbG9hdChudW0pLnRvU3RyaW5nKCkgOiBudW0udG9GaXhlZChwcmVjKSkuc3BsaXQoJycpOw0KICAgICAgICBwID0gKHAgPSAkLmluQXJyYXkoJy4nLCBudW0pKSA8IDAgPyBudW0ubGVuZ3RoIDogcDsNCiAgICAgICAgaWYgKHAgPCBudW0ubGVuZ3RoKSB7DQogICAgICAgICAgICBudW1bcF0gPSBkZWNzZXA7DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpID0gcCAtIGdyb3Vwc2l6ZTsgaSA+IDA7IGkgLT0gZ3JvdXBzaXplKSB7DQogICAgICAgICAgICBudW0uc3BsaWNlKGksIDAsIGdyb3Vwc2VwKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVtLmpvaW4oJycpOw0KICAgIH07DQoNCiAgICAvLyBkZXRlcm1pbmUgaWYgYWxsIHZhbHVlcyBvZiBhbiBhcnJheSBtYXRjaCBhIHZhbHVlDQogICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBhcnJheSBpcyBlbXB0eQ0KICAgIGFsbCA9IGZ1bmN0aW9uICh2YWwsIGFyciwgaWdub3JlTnVsbCkgew0KICAgICAgICB2YXIgaTsNCiAgICAgICAgZm9yIChpID0gYXJyLmxlbmd0aDsgaS0tOyApIHsNCiAgICAgICAgICAgIGlmIChpZ25vcmVOdWxsICYmIGFycltpXSA9PT0gbnVsbCkgY29udGludWU7DQogICAgICAgICAgICBpZiAoYXJyW2ldICE9PSB2YWwpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfTsNCg0KICAgIC8vIHN1bXMgdGhlIG51bWVyaWMgdmFsdWVzIGluIGFuIGFycmF5LCBpZ25vcmluZyBvdGhlciB2YWx1ZXMNCiAgICBzdW0gPSBmdW5jdGlvbiAodmFscykgew0KICAgICAgICB2YXIgdG90YWwgPSAwLCBpOw0KICAgICAgICBmb3IgKGkgPSB2YWxzLmxlbmd0aDsgaS0tOykgew0KICAgICAgICAgICAgdG90YWwgKz0gdHlwZW9mIHZhbHNbaV0gPT09ICdudW1iZXInID8gdmFsc1tpXSA6IDA7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRvdGFsOw0KICAgIH07DQoNCiAgICBlbnN1cmVBcnJheSA9IGZ1bmN0aW9uICh2YWwpIHsNCiAgICAgICAgcmV0dXJuICQuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07DQogICAgfTsNCg0KICAgIC8vIGh0dHA6Ly9wYXVsaXJpc2guY29tLzIwMDgvYm9va21hcmtsZXQtaW5qZWN0LW5ldy1jc3MtcnVsZXMvDQogICAgYWRkQ1NTID0gZnVuY3Rpb24gKGNzcykgew0KICAgICAgICB2YXIgdGFnLCBpZWZhaWw7DQogICAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQoKS5jc3NUZXh0ID0gY3NzOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAvLyBJRSA8PSA5IG1heGVzIG91dCBhdCAzMSBzdHlsZXNoZWV0czsgaW5qZWN0IGludG8gcGFnZSBpbnN0ZWFkLg0KICAgICAgICAgICAgICAgIGllZmFpbCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICAgICAgdGFnLnR5cGUgPSAndGV4dC9jc3MnOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHRhZyk7DQogICAgICAgIGlmIChpZWZhaWwpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LnN0eWxlU2hlZXRzW2RvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCAtIDFdLmNzc1RleHQgPSBjc3M7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0YWdbKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UgPT0gJ3N0cmluZycpIC8qIHdlYmtpdCBvbmx5ICovID8gJ2lubmVyVGV4dCcgOiAnaW5uZXJIVE1MJ10gPSBjc3M7DQogICAgICAgIH0NCiAgICB9Ow0KDQoNCiAgICAvLyBQcm92aWRlIGEgY3Jvc3MtYnJvd3NlciBpbnRlcmZhY2UgdG8gYSBmZXcgc2ltcGxlIGRyYXdpbmcgcHJpbWl0aXZlcw0KICAgICQuZm4uc2ltcGxlZHJhdyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCB1c2VFeGlzdGluZywgaW50ZXJhY3QpIHsNCiAgICAgICAgdmFyIHRhcmdldCwgbWhhbmRsZXI7DQogICAgICAgIGlmICh1c2VFeGlzdGluZyAmJiAodGFyZ2V0ID0gdGhpcy5kYXRhKCdfanFzX3ZjYW52YXMnKSkpIHsNCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJC5mbi5zcGFya2xpbmUuY2FudmFzID09PSBmYWxzZSkgew0KICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQgbmVpdGhlciBDYW52YXMgbm9yIFZNTCBhcmUgYXZhaWxhYmxlDQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0gZWxzZSBpZiAoJC5mbi5zcGFya2xpbmUuY2FudmFzID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgIC8vIE5vIGZ1bmN0aW9uIGRlZmluZWQgeWV0IC0tIG5lZWQgdG8gc2VlIGlmIHdlIHN1cHBvcnQgQ2FudmFzIG9yIFZNTA0KICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7DQogICAgICAgICAgICBpZiAoISEoZWwuZ2V0Q29udGV4dCAmJiBlbC5nZXRDb250ZXh0KCcyZCcpKSkgew0KICAgICAgICAgICAgICAgIC8vIENhbnZhcyBpcyBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAkLmZuLnNwYXJrbGluZS5jYW52YXMgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0LCB0YXJnZXQsIGludGVyYWN0KSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVkNhbnZhc19jYW52YXMod2lkdGgsIGhlaWdodCwgdGFyZ2V0LCBpbnRlcmFjdCk7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubmFtZXNwYWNlcyAmJiAhZG9jdW1lbnQubmFtZXNwYWNlcy52KSB7DQogICAgICAgICAgICAgICAgLy8gVk1MIGlzIGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgIGRvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCd2JywgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJywgJyNkZWZhdWx0I1ZNTCcpOw0KICAgICAgICAgICAgICAgICQuZm4uc3BhcmtsaW5lLmNhbnZhcyA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQsIHRhcmdldCwgaW50ZXJhY3QpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWQ2FudmFzX3ZtbCh3aWR0aCwgaGVpZ2h0LCB0YXJnZXQpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgQ2FudmFzIG5vciBWTUwgYXJlIGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgICQuZm4uc3BhcmtsaW5lLmNhbnZhcyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICB3aWR0aCA9ICQodGhpcykuaW5uZXJXaWR0aCgpOw0KICAgICAgICB9DQogICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgaGVpZ2h0ID0gJCh0aGlzKS5pbm5lckhlaWdodCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgdGFyZ2V0ID0gJC5mbi5zcGFya2xpbmUuY2FudmFzKHdpZHRoLCBoZWlnaHQsIHRoaXMsIGludGVyYWN0KTsNCg0KICAgICAgICBtaGFuZGxlciA9ICQodGhpcykuZGF0YSgnX2pxc19taGFuZGxlcicpOw0KICAgICAgICBpZiAobWhhbmRsZXIpIHsNCiAgICAgICAgICAgIG1oYW5kbGVyLnJlZ2lzdGVyQ2FudmFzKHRhcmdldCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRhcmdldDsNCiAgICB9Ow0KDQogICAgJC5mbi5jbGVhcmRyYXcgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLmRhdGEoJ19qcXNfdmNhbnZhcycpOw0KICAgICAgICBpZiAodGFyZ2V0KSB7DQogICAgICAgICAgICB0YXJnZXQucmVzZXQoKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCg0KICAgICQuUmFuZ2VNYXBDbGFzcyA9IFJhbmdlTWFwID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBpbml0OiBmdW5jdGlvbiAobWFwKSB7DQogICAgICAgICAgICB2YXIga2V5LCByYW5nZSwgcmFuZ2VsaXN0ID0gW107DQogICAgICAgICAgICBmb3IgKGtleSBpbiBtYXApIHsNCiAgICAgICAgICAgICAgICBpZiAobWFwLmhhc093blByb3BlcnR5KGtleSkgJiYgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LmluZGV4T2YoJzonKSA+IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlID0ga2V5LnNwbGl0KCc6Jyk7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlWzBdID0gcmFuZ2VbMF0ubGVuZ3RoID09PSAwID8gLUluZmluaXR5IDogcGFyc2VGbG9hdChyYW5nZVswXSk7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlWzFdID0gcmFuZ2VbMV0ubGVuZ3RoID09PSAwID8gSW5maW5pdHkgOiBwYXJzZUZsb2F0KHJhbmdlWzFdKTsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VbMl0gPSBtYXBba2V5XTsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VsaXN0LnB1c2gocmFuZ2UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubWFwID0gbWFwOw0KICAgICAgICAgICAgdGhpcy5yYW5nZWxpc3QgPSByYW5nZWxpc3QgfHwgZmFsc2U7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0OiBmdW5jdGlvbiAodmFsdWUpIHsNCiAgICAgICAgICAgIHZhciByYW5nZWxpc3QgPSB0aGlzLnJhbmdlbGlzdCwNCiAgICAgICAgICAgICAgICBpLCByYW5nZSwgcmVzdWx0Ow0KICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB0aGlzLm1hcFt2YWx1ZV0pICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJhbmdlbGlzdCkgew0KICAgICAgICAgICAgICAgIGZvciAoaSA9IHJhbmdlbGlzdC5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZWxpc3RbaV07DQogICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZVswXSA8PSB2YWx1ZSAmJiByYW5nZVsxXSA+PSB2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlWzJdOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24NCiAgICAkLnJhbmdlX21hcCA9IGZ1bmN0aW9uKG1hcCkgew0KICAgICAgICByZXR1cm4gbmV3IFJhbmdlTWFwKG1hcCk7DQogICAgfTsNCg0KDQogICAgTW91c2VIYW5kbGVyID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBpbml0OiBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHsNCiAgICAgICAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgICAgICAgIHRoaXMuJGVsID0gJGVsOw0KICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VYID0gMDsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VZID0gMDsNCiAgICAgICAgICAgIHRoaXMuZWwgPSBlbDsNCiAgICAgICAgICAgIHRoaXMuc3BsaXN0ID0gW107DQogICAgICAgICAgICB0aGlzLnRvb2x0aXAgPSBudWxsOw0KICAgICAgICAgICAgdGhpcy5vdmVyID0gZmFsc2U7DQogICAgICAgICAgICB0aGlzLmRpc3BsYXlUb29sdGlwcyA9ICFvcHRpb25zLmdldCgnZGlzYWJsZVRvb2x0aXBzJyk7DQogICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEVuYWJsZWQgPSAhb3B0aW9ucy5nZXQoJ2Rpc2FibGVIaWdobGlnaHQnKTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZWdpc3RlclNwYXJrbGluZTogZnVuY3Rpb24gKHNwKSB7DQogICAgICAgICAgICB0aGlzLnNwbGlzdC5wdXNoKHNwKTsNCiAgICAgICAgICAgIGlmICh0aGlzLm92ZXIpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICByZWdpc3RlckNhbnZhczogZnVuY3Rpb24gKGNhbnZhcykgew0KICAgICAgICAgICAgdmFyICRjYW52YXMgPSAkKGNhbnZhcy5jYW52YXMpOw0KICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7DQogICAgICAgICAgICB0aGlzLiRjYW52YXMgPSAkY2FudmFzOw0KICAgICAgICAgICAgJGNhbnZhcy5tb3VzZWVudGVyKCQucHJveHkodGhpcy5tb3VzZWVudGVyLCB0aGlzKSk7DQogICAgICAgICAgICAkY2FudmFzLm1vdXNlbGVhdmUoJC5wcm94eSh0aGlzLm1vdXNlbGVhdmUsIHRoaXMpKTsNCiAgICAgICAgICAgICRjYW52YXMuY2xpY2soJC5wcm94eSh0aGlzLm1vdXNlY2xpY2ssIHRoaXMpKTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZXNldDogZnVuY3Rpb24gKHJlbW92ZVRvb2x0aXApIHsNCiAgICAgICAgICAgIHRoaXMuc3BsaXN0ID0gW107DQogICAgICAgICAgICBpZiAodGhpcy50b29sdGlwICYmIHJlbW92ZVRvb2x0aXApIHsNCiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIG1vdXNlY2xpY2s6IGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICB2YXIgY2xpY2tFdmVudCA9ICQuRXZlbnQoJ3NwYXJrbGluZUNsaWNrJyk7DQogICAgICAgICAgICBjbGlja0V2ZW50Lm9yaWdpbmFsRXZlbnQgPSBlOw0KICAgICAgICAgICAgY2xpY2tFdmVudC5zcGFya2xpbmVzID0gdGhpcy5zcGxpc3Q7DQogICAgICAgICAgICB0aGlzLiRlbC50cmlnZ2VyKGNsaWNrRXZlbnQpOw0KICAgICAgICB9LA0KDQogICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnVuYmluZCgnbW91c2Vtb3ZlLmpxcycpOw0KICAgICAgICAgICAgJChkb2N1bWVudC5ib2R5KS5iaW5kKCdtb3VzZW1vdmUuanFzJywgJC5wcm94eSh0aGlzLm1vdXNlbW92ZSwgdGhpcykpOw0KICAgICAgICAgICAgdGhpcy5vdmVyID0gdHJ1ZTsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VYID0gZS5wYWdlWDsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VZID0gZS5wYWdlWTsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudEVsID0gZS50YXJnZXQ7DQogICAgICAgICAgICBpZiAoIXRoaXMudG9vbHRpcCAmJiB0aGlzLmRpc3BsYXlUb29sdGlwcykgew0KICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMub3B0aW9ucyk7DQogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGUucGFnZVgsIGUucGFnZVkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgbW91c2VsZWF2ZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgJChkb2N1bWVudC5ib2R5KS51bmJpbmQoJ21vdXNlbW92ZS5qcXMnKTsNCiAgICAgICAgICAgIHZhciBzcGxpc3QgPSB0aGlzLnNwbGlzdCwNCiAgICAgICAgICAgICAgICAgc3Bjb3VudCA9IHNwbGlzdC5sZW5ndGgsDQogICAgICAgICAgICAgICAgIG5lZWRzUmVmcmVzaCA9IGZhbHNlLA0KICAgICAgICAgICAgICAgICBzcCwgaTsNCiAgICAgICAgICAgIHRoaXMub3ZlciA9IGZhbHNlOw0KICAgICAgICAgICAgdGhpcy5jdXJyZW50RWwgPSBudWxsOw0KDQogICAgICAgICAgICBpZiAodGhpcy50b29sdGlwKSB7DQogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IG51bGw7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGNvdW50OyBpKyspIHsNCiAgICAgICAgICAgICAgICBzcCA9IHNwbGlzdFtpXTsNCiAgICAgICAgICAgICAgICBpZiAoc3AuY2xlYXJSZWdpb25IaWdobGlnaHQoKSkgew0KICAgICAgICAgICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKG5lZWRzUmVmcmVzaCkgew0KICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlbmRlcigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIG1vdXNlbW92ZTogZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VYID0gZS5wYWdlWDsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VZID0gZS5wYWdlWTsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudEVsID0gZS50YXJnZXQ7DQogICAgICAgICAgICBpZiAodGhpcy50b29sdGlwKSB7DQogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnVwZGF0ZVBvc2l0aW9uKGUucGFnZVgsIGUucGFnZVkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgdXBkYXRlRGlzcGxheTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHNwbGlzdCA9IHRoaXMuc3BsaXN0LA0KICAgICAgICAgICAgICAgICBzcGNvdW50ID0gc3BsaXN0Lmxlbmd0aCwNCiAgICAgICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gZmFsc2UsDQogICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuJGNhbnZhcy5vZmZzZXQoKSwNCiAgICAgICAgICAgICAgICAgbG9jYWxYID0gTWF0aC5yb3VuZCh0aGlzLmN1cnJlbnRQYWdlWCAtIG9mZnNldC5sZWZ0KSwNCiAgICAgICAgICAgICAgICAgbG9jYWxZID0gTWF0aC5yb3VuZCh0aGlzLmN1cnJlbnRQYWdlWSAtIG9mZnNldC50b3ApLA0KICAgICAgICAgICAgICAgICB0b29sdGlwaHRtbCwgc3AsIGksIHJlc3VsdCwgY2hhbmdlRXZlbnQ7DQogICAgICAgICAgICAvLyBsb2NhbFgvbG9jYWxZIGZpeCBpc3N1ZSAjNTAgd2l0aCBHb29nbGUgQ2hyb21lDQogICAgICAgICAgICAvLyBhbmQgc3VicGl4ZWwgcmVuZGVyaW5nDQoNCiAgICAgICAgICAgIGlmICghdGhpcy5vdmVyKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwY291bnQ7IGkrKykgew0KICAgICAgICAgICAgICAgIHNwID0gc3BsaXN0W2ldOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNwLnNldFJlZ2lvbkhpZ2hsaWdodCh0aGlzLmN1cnJlbnRFbCwgbG9jYWxYLCBsb2NhbFkpOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsNCiAgICAgICAgICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobmVlZHNSZWZyZXNoKSB7DQogICAgICAgICAgICAgICAgY2hhbmdlRXZlbnQgPSAkLkV2ZW50KCdzcGFya2xpbmVSZWdpb25DaGFuZ2UnKTsNCiAgICAgICAgICAgICAgICBjaGFuZ2VFdmVudC5zcGFya2xpbmVzID0gdGhpcy5zcGxpc3Q7DQogICAgICAgICAgICAgICAgdGhpcy4kZWwudHJpZ2dlcihjaGFuZ2VFdmVudCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9vbHRpcCkgew0KICAgICAgICAgICAgICAgICAgICB0b29sdGlwaHRtbCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3Bjb3VudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzcCA9IHNwbGlzdFtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBodG1sICs9IHNwLmdldEN1cnJlbnRSZWdpb25Ub29sdGlwKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldENvbnRlbnQodG9vbHRpcGh0bWwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZUhpZ2hsaWdodCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW5kZXIoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7DQogICAgICAgICAgICAgICAgdGhpcy5tb3VzZWxlYXZlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KDQogICAgVG9vbHRpcCA9IGNyZWF0ZUNsYXNzKHsNCiAgICAgICAgc2l6ZVN0eWxlOiAncG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50OycgKw0KICAgICAgICAgICAgJ2Rpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7JyArDQogICAgICAgICAgICAndmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7JyArDQogICAgICAgICAgICAnZmxvYXQ6IGxlZnQgIWltcG9ydGFudDsnLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRpb25zKSB7DQogICAgICAgICAgICB2YXIgdG9vbHRpcENsYXNzbmFtZSA9IG9wdGlvbnMuZ2V0KCd0b29sdGlwQ2xhc3NuYW1lJywgJ2pxc3Rvb2x0aXAnKSwNCiAgICAgICAgICAgICAgICBzaXpldGlwU3R5bGUgPSB0aGlzLnNpemVTdHlsZSwNCiAgICAgICAgICAgICAgICBvZmZzZXQ7DQogICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuZ2V0KCd0b29sdGlwQ29udGFpbmVyJykgfHwgZG9jdW1lbnQuYm9keTsNCiAgICAgICAgICAgIHRoaXMudG9vbHRpcE9mZnNldFggPSBvcHRpb25zLmdldCgndG9vbHRpcE9mZnNldFgnLCAxMCk7DQogICAgICAgICAgICB0aGlzLnRvb2x0aXBPZmZzZXRZID0gb3B0aW9ucy5nZXQoJ3Rvb2x0aXBPZmZzZXRZJywgMTIpOw0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5T25MZWZ0ICA9IG9wdGlvbnMuZ2V0KCd0b29sVGlwUG9zaXRpb24nKSA9PT0gJ2xlZnQnOw0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBwcmV2aW91cyBsaW5nZXJpbmcgdG9vbHRpcA0KICAgICAgICAgICAgJCgnI2pxc3NpemV0aXAnKS5yZW1vdmUoKTsNCiAgICAgICAgICAgICQoJyNqcXN0b29sdGlwJykucmVtb3ZlKCk7DQogICAgICAgICAgICB0aGlzLnNpemV0aXAgPSAkKCc8ZGl2Lz4nLCB7DQogICAgICAgICAgICAgICAgaWQ6ICdqcXNzaXpldGlwJywNCiAgICAgICAgICAgICAgICBzdHlsZTogc2l6ZXRpcFN0eWxlLA0KICAgICAgICAgICAgICAgICdjbGFzcyc6IHRvb2x0aXBDbGFzc25hbWUNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdGhpcy50b29sdGlwID0gJCgnPGRpdi8+Jywgew0KICAgICAgICAgICAgICAgIGlkOiAnanFzdG9vbHRpcCcsDQogICAgICAgICAgICAgICAgJ2NsYXNzJzogdG9vbHRpcENsYXNzbmFtZQ0KICAgICAgICAgICAgfSkuYXBwZW5kVG8odGhpcy5jb250YWluZXIpOw0KICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIGNvbnRhaW5lcidzIGxvY2F0aW9uDQogICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnRvb2x0aXAub2Zmc2V0KCk7DQogICAgICAgICAgICB0aGlzLm9mZnNldExlZnQgPSBvZmZzZXQubGVmdDsNCiAgICAgICAgICAgIHRoaXMub2Zmc2V0VG9wID0gb2Zmc2V0LnRvcDsNCiAgICAgICAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgICAgICQod2luZG93KS51bmJpbmQoJ3Jlc2l6ZS5qcXMgc2Nyb2xsLmpxcycpOw0KICAgICAgICAgICAgJCh3aW5kb3cpLmJpbmQoJ3Jlc2l6ZS5qcXMgc2Nyb2xsLmpxcycsICQucHJveHkodGhpcy51cGRhdGVXaW5kb3dEaW1zLCB0aGlzKSk7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZVdpbmRvd0RpbXMoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICB1cGRhdGVXaW5kb3dEaW1zOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKTsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGVmdCA9ICQod2luZG93KS5zY3JvbGxMZWZ0KCk7DQogICAgICAgICAgICB0aGlzLnNjcm9sbFJpZ2h0ID0gdGhpcy5zY3JvbGxMZWZ0ICsgJCh3aW5kb3cpLndpZHRoKCk7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24gKGNvbnRlbnQpIHsNCiAgICAgICAgICAgIHRoaXMuc2l6ZXRpcC5odG1sKGNvbnRlbnQpLmFwcGVuZFRvKHRoaXMuY29udGFpbmVyKTsNCiAgICAgICAgICAgIHZhciBscGFkZGluZyA9IHBhcnNlSW50KHRoaXMuc2l6ZXRpcC5jc3MoJ3BhZGRpbmctbGVmdCcpLCAxMCk7DQogICAgICAgICAgICB2YXIgcnBhZGRpbmcgPSBwYXJzZUludCh0aGlzLnNpemV0aXAuY3NzKCdwYWRkaW5nLXJpZ2h0JyksIDEwKTsNCiAgICAgICAgICAgIHRoaXMucGFkZGluZyA9IGxwYWRkaW5nICsgcnBhZGRpbmcgKyAxOw0KICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuc2l6ZXRpcC53aWR0aCgpICsgMTsNCiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zaXpldGlwLmhlaWdodCgpOw0KICAgICAgICAgICAgdGhpcy5zaXpldGlwLnJlbW92ZSgpOw0KICAgICAgICB9LA0KDQogICAgICAgIHNldENvbnRlbnQ6IGZ1bmN0aW9uIChjb250ZW50KSB7DQogICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpOw0KICAgICAgICAgICAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmdldFNpemUoY29udGVudCk7DQogICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChjb250ZW50KQ0KICAgICAgICAgICAgICAgIC5jc3Moew0KICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiB0aGlzLndpZHRoLA0KICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogdGhpcy5oZWlnaHQsDQogICAgICAgICAgICAgICAgICAgICd2aXNpYmlsaXR5JzogJ3Zpc2libGUnDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBpZiAodGhpcy5oaWRkZW4pIHsNCiAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICB1cGRhdGVQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHkpIHsNCiAgICAgICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb3VzZXggPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHggPSB0aGlzLm1vdXNleCAtIHRoaXMub2Zmc2V0TGVmdDsNCiAgICAgICAgICAgICAgICB5ID0gdGhpcy5tb3VzZXkgLSB0aGlzLm9mZnNldFRvcDsNCg0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLm1vdXNleCA9IHggPSB4IC0gdGhpcy5vZmZzZXRMZWZ0Ow0KICAgICAgICAgICAgICAgIHRoaXMubW91c2V5ID0geSA9IHkgLSB0aGlzLm9mZnNldFRvcDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghdGhpcy5oZWlnaHQgfHwgIXRoaXMud2lkdGggfHwgdGhpcy5oaWRkZW4pIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHkgLT0gdGhpcy5oZWlnaHQgKyB0aGlzLnRvb2x0aXBPZmZzZXRZOw0KICAgICAgICAgICAgaWYgKHkgPCB0aGlzLnNjcm9sbFRvcCkgew0KICAgICAgICAgICAgICAgIHkgPSB0aGlzLnNjcm9sbFRvcDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheU9uTGVmdCkgew0KICAgICAgICAgICAgICAgIHggLT0gdGhpcy50b29sdGlwT2Zmc2V0WCArIHRoaXMud2lkdGggKyB0aGlzLnBhZGRpbmc7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHggKz0gdGhpcy50b29sdGlwT2Zmc2V0WDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh4IDwgdGhpcy5zY3JvbGxMZWZ0KSB7DQogICAgICAgICAgICAgICAgeCA9IHRoaXMuc2Nyb2xsTGVmdDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoeCArIHRoaXMud2lkdGggPiB0aGlzLnNjcm9sbFJpZ2h0KSB7DQogICAgICAgICAgICAgICAgeCA9IHRoaXMuc2Nyb2xsUmlnaHQgLSB0aGlzLndpZHRoOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLnRvb2x0aXAuY3NzKHsNCiAgICAgICAgICAgICAgICAnbGVmdCc6IHgsDQogICAgICAgICAgICAgICAgJ3RvcCc6IHkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9LA0KDQogICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdGhpcy50b29sdGlwLnJlbW92ZSgpOw0KICAgICAgICAgICAgdGhpcy5zaXpldGlwLnJlbW92ZSgpOw0KICAgICAgICAgICAgdGhpcy5zaXpldGlwID0gdGhpcy50b29sdGlwID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgJCh3aW5kb3cpLnVuYmluZCgncmVzaXplLmpxcyBzY3JvbGwuanFzJyk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KDQogICAgaW5pdFN0eWxlcyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICBhZGRDU1MoZGVmYXVsdFN0eWxlcyk7DQogICAgfTsNCg0KICAgICQoaW5pdFN0eWxlcyk7DQoNCiAgICBwZW5kaW5nID0gW107DQogICAgJC5mbi5zcGFya2xpbmUgPSBmdW5jdGlvbiAodXNlclZhbHVlcywgdXNlck9wdGlvbnMpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IG5ldyAkLmZuLnNwYXJrbGluZS5vcHRpb25zKHRoaXMsIHVzZXJPcHRpb25zKSwNCiAgICAgICAgICAgICAgICAgJHRoaXMgPSAkKHRoaXMpLA0KICAgICAgICAgICAgICAgICByZW5kZXIsIGk7DQogICAgICAgICAgICByZW5kZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbHVlcywgd2lkdGgsIGhlaWdodCwgdG1wLCBtaGFuZGxlciwgc3AsIHZhbHM7DQogICAgICAgICAgICAgICAgaWYgKHVzZXJWYWx1ZXMgPT09ICdodG1sJyB8fCB1c2VyVmFsdWVzID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFscyA9IHRoaXMuZ2V0QXR0cmlidXRlKG9wdGlvbnMuZ2V0KCd0YWdWYWx1ZXNBdHRyaWJ1dGUnKSk7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWxzID09PSB1bmRlZmluZWQgfHwgdmFscyA9PT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFscyA9ICR0aGlzLmh0bWwoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWxzLnJlcGxhY2UoLyheXHMqPCEtLSl8KC0tPlxzKiQpfFxzKy9nLCAnJykuc3BsaXQoJywnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB1c2VyVmFsdWVzOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHdpZHRoID0gb3B0aW9ucy5nZXQoJ3dpZHRoJykgPT09ICdhdXRvJyA/IHZhbHVlcy5sZW5ndGggKiBvcHRpb25zLmdldCgnZGVmYXVsdFBpeGVsc1BlclZhbHVlJykgOiBvcHRpb25zLmdldCgnd2lkdGgnKTsNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2hlaWdodCcpID09PSAnYXV0bycpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmdldCgnY29tcG9zaXRlJykgfHwgISQuZGF0YSh0aGlzLCAnX2pxc192Y2FudmFzJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGUgbGluZSBoZWlnaHQNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5pbm5lckhUTUwgPSAnYSc7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5odG1sKHRtcCk7DQogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAkKHRtcCkuaW5uZXJIZWlnaHQoKSB8fCAkKHRtcCkuaGVpZ2h0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkKHRtcCkucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gb3B0aW9ucy5nZXQoJ2hlaWdodCcpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5nZXQoJ2Rpc2FibGVJbnRlcmFjdGlvbicpKSB7DQogICAgICAgICAgICAgICAgICAgIG1oYW5kbGVyID0gJC5kYXRhKHRoaXMsICdfanFzX21oYW5kbGVyJyk7DQogICAgICAgICAgICAgICAgICAgIGlmICghbWhhbmRsZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1oYW5kbGVyID0gbmV3IE1vdXNlSGFuZGxlcih0aGlzLCBvcHRpb25zKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICQuZGF0YSh0aGlzLCAnX2pxc19taGFuZGxlcicsIG1oYW5kbGVyKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5nZXQoJ2NvbXBvc2l0ZScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBtaGFuZGxlci5yZXNldCgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbWhhbmRsZXIgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2NvbXBvc2l0ZScpICYmICEkLmRhdGEodGhpcywgJ19qcXNfdmNhbnZhcycpKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghJC5kYXRhKHRoaXMsICdfanFzX2Vycm5vdGlmeScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgnQXR0ZW1wdGVkIHRvIGF0dGFjaCBhIGNvbXBvc2l0ZSBzcGFya2xpbmUgdG8gYW4gZWxlbWVudCB3aXRoIG5vIGV4aXN0aW5nIHNwYXJrbGluZScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsICdfanFzX2Vycm5vdGlmeScsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBzcCA9IG5ldyAkLmZuLnNwYXJrbGluZVtvcHRpb25zLmdldCgndHlwZScpXSh0aGlzLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpOw0KDQogICAgICAgICAgICAgICAgc3AucmVuZGVyKCk7DQoNCiAgICAgICAgICAgICAgICBpZiAobWhhbmRsZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgbWhhbmRsZXIucmVnaXN0ZXJTcGFya2xpbmUoc3ApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBpZiAoKCQodGhpcykuaHRtbCgpICYmICFvcHRpb25zLmdldCgnZGlzYWJsZUhpZGRlbkNoZWNrJykgJiYgJCh0aGlzKS5pcygnOmhpZGRlbicpKSB8fCAhJCh0aGlzKS5wYXJlbnRzKCdib2R5JykubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmdldCgnY29tcG9zaXRlJykgJiYgJC5kYXRhKHRoaXMsICdfanFzX3BlbmRpbmcnKSkgew0KICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW55IGV4aXN0aW5nIHJlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnQNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gcGVuZGluZy5sZW5ndGg7IGk7IGktLSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdbaSAtIDFdWzBdID09IHRoaXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNwbGljZShpIC0gMSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcGVuZGluZy5wdXNoKFt0aGlzLCByZW5kZXJdKTsNCiAgICAgICAgICAgICAgICAkLmRhdGEodGhpcywgJ19qcXNfcGVuZGluZycsIHRydWUpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZW5kZXIuY2FsbCh0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfTsNCg0KICAgICQuZm4uc3BhcmtsaW5lLmRlZmF1bHRzID0gZ2V0RGVmYXVsdHMoKTsNCg0KDQogICAgJC5zcGFya2xpbmVfZGlzcGxheV92aXNpYmxlID0gZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgZWwsIGksIHBsOw0KICAgICAgICB2YXIgZG9uZSA9IFtdOw0KICAgICAgICBmb3IgKGkgPSAwLCBwbCA9IHBlbmRpbmcubGVuZ3RoOyBpIDwgcGw7IGkrKykgew0KICAgICAgICAgICAgZWwgPSBwZW5kaW5nW2ldWzBdOw0KICAgICAgICAgICAgaWYgKCQoZWwpLmlzKCc6dmlzaWJsZScpICYmICEkKGVsKS5wYXJlbnRzKCkuaXMoJzpoaWRkZW4nKSkgew0KICAgICAgICAgICAgICAgIHBlbmRpbmdbaV1bMV0uY2FsbChlbCk7DQogICAgICAgICAgICAgICAgJC5kYXRhKHBlbmRpbmdbaV1bMF0sICdfanFzX3BlbmRpbmcnLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgZG9uZS5wdXNoKGkpOw0KICAgICAgICAgICAgfSBlbHNlIGlmICghJChlbCkuY2xvc2VzdCgnaHRtbCcpLmxlbmd0aCAmJiAhJC5kYXRhKGVsLCAnX2pxc19wZW5kaW5nJykpIHsNCiAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIERPTQ0KICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBub3QgeWV0IGluc2VydGVkIGludG8gdGhlIGRvbSB0aGVuIHRoZSAuZGF0YSByZXF1ZXN0DQogICAgICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gdHJ1ZS4NCiAgICAgICAgICAgICAgICAvLyByZW1vdmluZyBmcm9tIHRoZSBkb20gY2F1c2VzIHRoZSBkYXRhIHRvIGJlIHJlbW92ZWQuDQogICAgICAgICAgICAgICAgJC5kYXRhKHBlbmRpbmdbaV1bMF0sICdfanFzX3BlbmRpbmcnLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgZG9uZS5wdXNoKGkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaSA9IGRvbmUubGVuZ3RoOyBpOyBpLS0pIHsNCiAgICAgICAgICAgIHBlbmRpbmcuc3BsaWNlKGRvbmVbaSAtIDFdLCAxKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCg0KICAgIC8qKg0KICAgICAqIFVzZXIgb3B0aW9uIGhhbmRsZXINCiAgICAgKi8NCiAgICAkLmZuLnNwYXJrbGluZS5vcHRpb25zID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBpbml0OiBmdW5jdGlvbiAodGFnLCB1c2VyT3B0aW9ucykgew0KICAgICAgICAgICAgdmFyIGV4dGVuZGVkT3B0aW9ucywgZGVmYXVsdHMsIGJhc2UsIHRhZ09wdGlvblR5cGU7DQogICAgICAgICAgICB0aGlzLnVzZXJPcHRpb25zID0gdXNlck9wdGlvbnMgPSB1c2VyT3B0aW9ucyB8fCB7fTsNCiAgICAgICAgICAgIHRoaXMudGFnID0gdGFnOw0KICAgICAgICAgICAgdGhpcy50YWdWYWxDYWNoZSA9IHt9Ow0KICAgICAgICAgICAgZGVmYXVsdHMgPSAkLmZuLnNwYXJrbGluZS5kZWZhdWx0czsNCiAgICAgICAgICAgIGJhc2UgPSBkZWZhdWx0cy5jb21tb247DQogICAgICAgICAgICB0aGlzLnRhZ09wdGlvbnNQcmVmaXggPSB1c2VyT3B0aW9ucy5lbmFibGVUYWdPcHRpb25zICYmICh1c2VyT3B0aW9ucy50YWdPcHRpb25zUHJlZml4IHx8IGJhc2UudGFnT3B0aW9uc1ByZWZpeCk7DQoNCiAgICAgICAgICAgIHRhZ09wdGlvblR5cGUgPSB0aGlzLmdldFRhZ1NldHRpbmcoJ3R5cGUnKTsNCiAgICAgICAgICAgIGlmICh0YWdPcHRpb25UeXBlID09PSBVTlNFVF9PUFRJT04pIHsNCiAgICAgICAgICAgICAgICBleHRlbmRlZE9wdGlvbnMgPSBkZWZhdWx0c1t1c2VyT3B0aW9ucy50eXBlIHx8IGJhc2UudHlwZV07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGV4dGVuZGVkT3B0aW9ucyA9IGRlZmF1bHRzW3RhZ09wdGlvblR5cGVdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5tZXJnZWRPcHRpb25zID0gJC5leHRlbmQoe30sIGJhc2UsIGV4dGVuZGVkT3B0aW9ucywgdXNlck9wdGlvbnMpOw0KICAgICAgICB9LA0KDQoNCiAgICAgICAgZ2V0VGFnU2V0dGluZzogZnVuY3Rpb24gKGtleSkgew0KICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMudGFnT3B0aW9uc1ByZWZpeCwNCiAgICAgICAgICAgICAgICB2YWwsIGksIHBhaXJzLCBrZXl2YWw7DQogICAgICAgICAgICBpZiAocHJlZml4ID09PSBmYWxzZSB8fCBwcmVmaXggPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBVTlNFVF9PUFRJT047DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy50YWdWYWxDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQogICAgICAgICAgICAgICAgdmFsID0gdGhpcy50YWdWYWxDYWNoZS5rZXk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMudGFnLmdldEF0dHJpYnV0ZShwcmVmaXggKyBrZXkpOw0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFsID0gVU5TRVRfT1BUSU9OOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsLnN1YnN0cigwLCAxKSA9PT0gJ1snKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHIoMSwgdmFsLmxlbmd0aCAtIDIpLnNwbGl0KCcsJyk7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHZhbC5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbFtpXS5yZXBsYWNlKC8oXlxzKil8KFxzKiQpL2csICcnKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbC5zdWJzdHIoMCwgMSkgPT09ICd7Jykgew0KICAgICAgICAgICAgICAgICAgICBwYWlycyA9IHZhbC5zdWJzdHIoMSwgdmFsLmxlbmd0aCAtIDIpLnNwbGl0KCcsJyk7DQogICAgICAgICAgICAgICAgICAgIHZhbCA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBwYWlycy5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXZhbCA9IHBhaXJzW2ldLnNwbGl0KCc6JywgMik7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWxba2V5dmFsWzBdLnJlcGxhY2UoLyheXHMqKXwoXHMqJCkvZywgJycpXSA9IG5vcm1hbGl6ZVZhbHVlKGtleXZhbFsxXS5yZXBsYWNlKC8oXlxzKil8KFxzKiQpL2csICcnKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YWwgPSBub3JtYWxpemVWYWx1ZSh2YWwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLnRhZ1ZhbENhY2hlLmtleSA9IHZhbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB2YWw7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoa2V5LCBkZWZhdWx0dmFsKSB7DQogICAgICAgICAgICB2YXIgdGFnT3B0aW9uID0gdGhpcy5nZXRUYWdTZXR0aW5nKGtleSksDQogICAgICAgICAgICAgICAgcmVzdWx0Ow0KICAgICAgICAgICAgaWYgKHRhZ09wdGlvbiAhPT0gVU5TRVRfT1BUSU9OKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRhZ09wdGlvbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAocmVzdWx0ID0gdGhpcy5tZXJnZWRPcHRpb25zW2tleV0pID09PSB1bmRlZmluZWQgPyBkZWZhdWx0dmFsIDogcmVzdWx0Ow0KICAgICAgICB9DQogICAgfSk7DQoNCg0KICAgICQuZm4uc3BhcmtsaW5lLl9iYXNlID0gY3JlYXRlQ2xhc3Moew0KICAgICAgICBkaXNhYmxlZDogZmFsc2UsDQoNCiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAgIHRoaXMuZWwgPSBlbDsNCiAgICAgICAgICAgIHRoaXMuJGVsID0gJChlbCk7DQogICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsNCiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7DQogICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7DQogICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFJlZ2lvbiA9IHVuZGVmaW5lZDsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogU2V0dXAgdGhlIGNhbnZhcw0KICAgICAgICAgKi8NCiAgICAgICAgaW5pdFRhcmdldDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGludGVyYWN0aXZlID0gIXRoaXMub3B0aW9ucy5nZXQoJ2Rpc2FibGVJbnRlcmFjdGlvbicpOw0KICAgICAgICAgICAgaWYgKCEodGhpcy50YXJnZXQgPSB0aGlzLiRlbC5zaW1wbGVkcmF3KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLm9wdGlvbnMuZ2V0KCdjb21wb3NpdGUnKSwgaW50ZXJhY3RpdmUpKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1dpZHRoID0gdGhpcy50YXJnZXQucGl4ZWxXaWR0aDsNCiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHRoaXMudGFyZ2V0LnBpeGVsSGVpZ2h0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBTZXR1cCBjb2xvck1hcCBmcm9tIG9wdGlvbnMNCiAgICAgICAgICovDQogICAgICAgIGluaXRDb2xvck1hcDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgY29sb3JNYXAgPSB0aGlzLm9wdGlvbnMuZ2V0KCdjb2xvck1hcCcpOw0KICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihjb2xvck1hcCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yTWFwRnVuY3Rpb24gPSBjb2xvck1hcDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoJC5pc0FycmF5KGNvbG9yTWFwKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuY29sb3JNYXBGdW5jdGlvbiA9IGZ1bmN0aW9uKHNwYXJrbGluZSwgb3B0aW9ucywgaW5kZXgsIHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGNvbG9yTWFwLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yTWFwW2luZGV4XTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHVuZGVmaW5lZA0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9IGVsc2UgaWYgKGNvbG9yTWFwKSB7DQogICAgICAgICAgICAgICAgaWYgKGNvbG9yTWFwLmdldCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwID0gbmV3IFJhbmdlTWFwKGNvbG9yTWFwKTsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuY29sb3JNYXBGdW5jdGlvbiA9IGZ1bmN0aW9uKHNwYXJrbGluZSwgb3B0aW9ucywgaW5kZXgsIHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvck1hcC5nZXQodmFsdWUpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIEFjdHVhbGx5IHJlbmRlciB0aGUgY2hhcnQgdG8gdGhlIGNhbnZhcw0KICAgICAgICAgKi8NCiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgew0KICAgICAgICAgICAgICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gJyc7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIFJldHVybiBhIHJlZ2lvbiBpZCBmb3IgYSBnaXZlbiB4L3kgY28tb3JkaW5hdGUNCiAgICAgICAgICovDQogICAgICAgIGdldFJlZ2lvbjogZnVuY3Rpb24gKHgsIHkpIHsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogSGlnaGxpZ2h0IGFuIGl0ZW0gYmFzZWQgb24gdGhlIG1vdXNlZC1vdmVyIHgseSBjby1vcmRpbmF0ZQ0KICAgICAgICAgKi8NCiAgICAgICAgc2V0UmVnaW9uSGlnaGxpZ2h0OiBmdW5jdGlvbiAoZWwsIHgsIHkpIHsNCiAgICAgICAgICAgIHZhciBjdXJyZW50UmVnaW9uID0gdGhpcy5jdXJyZW50UmVnaW9uLA0KICAgICAgICAgICAgICAgIGhpZ2hsaWdodEVuYWJsZWQgPSAhdGhpcy5vcHRpb25zLmdldCgnZGlzYWJsZUhpZ2hsaWdodCcpLA0KICAgICAgICAgICAgICAgIG5ld1JlZ2lvbjsNCiAgICAgICAgICAgIC8vIENVU1RPTSBNT0Q6IHByb3BlciBob3ZlciBkZXRlY3Rpb24gY29uc2lkZXJpbmcgcGFkZGluZyBhcyB3ZWxsDQogICAgICAgICAgICB2YXIgY1cgPSAkKCdjYW52YXMnLHRoaXMuZWwpLndpZHRoKCkgKyBwYXJzZUludCgkKCdjYW52YXMnLHRoaXMuZWwpLmNzcygncGFkZGluZy1sZWZ0JykpICsgcGFyc2VJbnQoJCgnY2FudmFzJyx0aGlzLmVsKS5jc3MoJ3BhZGRpbmctcmlnaHQnKSkNCiAgICAgICAgICAgIC8vIGlmICh4ID4gdGhpcy5jYW52YXNXaWR0aCB8fCB5ID4gdGhpcy5jYW52YXNIZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIHsNCiAgICAgICAgICAgIGlmICh4ID4gY1cgfHwgeSA+IHRoaXMuY2FudmFzSGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBuZXdSZWdpb24gPSB0aGlzLmdldFJlZ2lvbihlbCwgeCwgeSk7DQogICAgICAgICAgICBpZiAoY3VycmVudFJlZ2lvbiAhPT0gbmV3UmVnaW9uKSB7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSZWdpb24gIT09IHVuZGVmaW5lZCAmJiBoaWdobGlnaHRFbmFibGVkKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJlZ2lvbiA9IG5ld1JlZ2lvbjsNCiAgICAgICAgICAgICAgICBpZiAobmV3UmVnaW9uICE9PSB1bmRlZmluZWQgJiYgaGlnaGxpZ2h0RW5hYmxlZCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckhpZ2hsaWdodCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogUmVzZXQgYW55IGN1cnJlbnRseSBoaWdobGlnaHRlZCBpdGVtDQogICAgICAgICAqLw0KICAgICAgICBjbGVhclJlZ2lvbkhpZ2hsaWdodDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTsNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSZWdpb24gPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVuZGVySGlnaGxpZ2h0OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLmNoYW5nZUhpZ2hsaWdodCh0cnVlKTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZW1vdmVIaWdobGlnaHQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMuY2hhbmdlSGlnaGxpZ2h0KGZhbHNlKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBjaGFuZ2VIaWdobGlnaHQ6IGZ1bmN0aW9uIChoaWdobGlnaHQpICB7fSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogRmV0Y2ggdGhlIEhUTUwgdG8gZGlzcGxheSBhcyBhIHRvb2x0aXANCiAgICAgICAgICovDQogICAgICAgIGdldEN1cnJlbnRSZWdpb25Ub29sdGlwOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywNCiAgICAgICAgICAgICAgICBoZWFkZXIgPSAnJywNCiAgICAgICAgICAgICAgICBlbnRyaWVzID0gW10sDQogICAgICAgICAgICAgICAgZmllbGRzLCBmb3JtYXRzLCBmb3JtYXRsZW4sIGZjbGFzcywgdGV4dCwgaSwNCiAgICAgICAgICAgICAgICBzaG93RmllbGRzLCBzaG93RmllbGRzS2V5LCBuZXdGaWVsZHMsIGZ2LA0KICAgICAgICAgICAgICAgIGZvcm1hdHRlciwgZm9ybWF0LCBmaWVsZGxlbiwgaiwNCiAgICAgICAgICAgICAgICBsYWJlbF9wcmVmaXgsIGxhYmVsX3N1ZmZpeDsNCiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRSZWdpb24gPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIHJldHVybiAnJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpZWxkcyA9IHRoaXMuZ2V0Q3VycmVudFJlZ2lvbkZpZWxkcygpOw0KICAgICAgICAgICAgZm9ybWF0dGVyID0gb3B0aW9ucy5nZXQoJ3Rvb2x0aXBGb3JtYXR0ZXInKTsNCiAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVyKHRoaXMsIG9wdGlvbnMsIGZpZWxkcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3Rvb2x0aXBDaGFydFRpdGxlJykpIHsNCiAgICAgICAgICAgICAgICBoZWFkZXIgKz0gJzxkaXYgY2xhc3M9ImpxcyBqcXN0aXRsZSI+JyArIG9wdGlvbnMuZ2V0KCd0b29sdGlwQ2hhcnRUaXRsZScpICsgJzwvZGl2PlxuJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvcm1hdHMgPSB0aGlzLm9wdGlvbnMuZ2V0KCd0b29sdGlwRm9ybWF0Jyk7DQogICAgICAgICAgICBpZiAoIWZvcm1hdHMpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoISQuaXNBcnJheShmb3JtYXRzKSkgew0KICAgICAgICAgICAgICAgIGZvcm1hdHMgPSBbZm9ybWF0c107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoISQuaXNBcnJheShmaWVsZHMpKSB7DQogICAgICAgICAgICAgICAgZmllbGRzID0gW2ZpZWxkc107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzaG93RmllbGRzID0gdGhpcy5vcHRpb25zLmdldCgndG9vbHRpcEZvcm1hdEZpZWxkbGlzdCcpOw0KICAgICAgICAgICAgc2hvd0ZpZWxkc0tleSA9IHRoaXMub3B0aW9ucy5nZXQoJ3Rvb2x0aXBGb3JtYXRGaWVsZGxpc3RLZXknKTsNCiAgICAgICAgICAgIGlmIChzaG93RmllbGRzICYmIHNob3dGaWVsZHNLZXkpIHsNCiAgICAgICAgICAgICAgICAvLyB1c2VyLXNlbGVjdGVkIG9yZGVyaW5nIG9mIGZpZWxkcw0KICAgICAgICAgICAgICAgIG5ld0ZpZWxkcyA9IFtdOw0KICAgICAgICAgICAgICAgIGZvciAoaSA9IGZpZWxkcy5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICAgICAgZnYgPSBmaWVsZHNbaV1bc2hvd0ZpZWxkc0tleV07DQogICAgICAgICAgICAgICAgICAgIGlmICgoaiA9ICQuaW5BcnJheShmdiwgc2hvd0ZpZWxkcykpICE9IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXdGaWVsZHNbal0gPSBmaWVsZHNbaV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmllbGRzID0gbmV3RmllbGRzOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9ybWF0bGVuID0gZm9ybWF0cy5sZW5ndGg7DQogICAgICAgICAgICBmaWVsZGxlbiA9IGZpZWxkcy5sZW5ndGg7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZm9ybWF0bGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXRzW2ldOw0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm9ybWF0ID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBuZXcgU1BGb3JtYXQoZm9ybWF0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmNsYXNzID0gZm9ybWF0LmZjbGFzcyB8fCAnanFzZmllbGQnOw0KDQogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZpZWxkbGVuOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZHNbal0uaXNOdWxsIHx8ICFvcHRpb25zLmdldCgndG9vbHRpcFNraXBOdWxsJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3ByZWZpeCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc3VmZml4ID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3Rvb2x0aXBQcmVmaXhCaW5MYWJlbHMnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChvcHRpb25zLmdldCgndG9vbHRpcFByZWZpeEJpbkxhYmVscycpLmxlbmd0aCA+IGZpZWxkc1tqXS5vZmZzZXQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfcHJlZml4ID0gb3B0aW9ucy5nZXQoJ3Rvb2x0aXBQcmVmaXhCaW5MYWJlbHMnKVtmaWVsZHNbal0ub2Zmc2V0XTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgndG9vbHRpcFN1ZmZpeEJpbkxhYmVscycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG9wdGlvbnMuZ2V0KCd0b29sdGlwU3VmZml4QmluTGFiZWxzJykubGVuZ3RoID4gZmllbGRzW2pdLm9mZnNldCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zdWZmaXggPSBvcHRpb25zLmdldCgndG9vbHRpcFN1ZmZpeEJpbkxhYmVscycpW2ZpZWxkc1tqXS5vZmZzZXRdOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQoZmllbGRzW2pdLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBsYWJlbF9wcmVmaXggKyBvcHRpb25zLmdldCgndG9vbHRpcFByZWZpeCcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeDogb3B0aW9ucy5nZXQoJ3Rvb2x0aXBTdWZmaXgnKSArIGxhYmVsX3N1ZmZpeA0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBmb3JtYXQucmVuZGVyKGZpZWxkc1tqXSwgb3B0aW9ucy5nZXQoJ3Rvb2x0aXBWYWx1ZUxvb2t1cHMnKSwgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goJzxkaXYgY2xhc3M9IicgKyBmY2xhc3MgKyAnIj4nICsgdGV4dCArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXIgKyBlbnRyaWVzLmpvaW4oJ1xuJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczogZnVuY3Rpb24gKCkge30sDQoNCiAgICAgICAgY2FsY0hpZ2hsaWdodENvbG9yOiBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHsNCiAgICAgICAgICAgIHZhciBoaWdobGlnaHRDb2xvciA9IG9wdGlvbnMuZ2V0KCdoaWdobGlnaHRDb2xvcicpLA0KICAgICAgICAgICAgICAgIGxpZ2h0ZW4gPSBvcHRpb25zLmdldCgnaGlnaGxpZ2h0TGlnaHRlbicpLA0KICAgICAgICAgICAgICAgIHBhcnNlLCBtdWx0LCByZ2JuZXcsIGk7DQogICAgICAgICAgICBpZiAoaGlnaGxpZ2h0Q29sb3IpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGxpZ2h0Q29sb3I7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobGlnaHRlbikgew0KICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgUkdCIHZhbHVlcw0KICAgICAgICAgICAgICAgIHBhcnNlID0gL14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pJC9pLmV4ZWMoY29sb3IpIHx8IC9eIyhbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KSQvaS5leGVjKGNvbG9yKTsNCiAgICAgICAgICAgICAgICBpZiAocGFyc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgcmdibmV3ID0gW107DQogICAgICAgICAgICAgICAgICAgIG11bHQgPSBjb2xvci5sZW5ndGggPT09IDQgPyAxNiA6IDE7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJnYm5ld1tpXSA9IGNsaXB2YWwoTWF0aC5yb3VuZChwYXJzZUludChwYXJzZVtpICsgMV0sIDE2KSAqIG11bHQgKiBsaWdodGVuKSwgMCwgMjU1KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYignICsgcmdibmV3LmpvaW4oJywnKSArICcpJzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBjb2xvcjsNCiAgICAgICAgfQ0KDQogICAgfSk7DQoNCiAgICBiYXJIaWdobGlnaHRNaXhpbiA9IHsNCiAgICAgICAgY2hhbmdlSGlnaGxpZ2h0OiBmdW5jdGlvbiAoaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgY3VycmVudFJlZ2lvbiA9IHRoaXMuY3VycmVudFJlZ2lvbiwNCiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCwNCiAgICAgICAgICAgICAgICBzaGFwZWlkcyA9IHRoaXMucmVnaW9uU2hhcGVzW2N1cnJlbnRSZWdpb25dLA0KICAgICAgICAgICAgICAgIG5ld1NoYXBlczsNCiAgICAgICAgICAgIC8vIHdpbGwgYmUgbnVsbCBpZiB0aGUgcmVnaW9uIHZhbHVlIHdhcyBudWxsDQogICAgICAgICAgICBpZiAoc2hhcGVpZHMgPj0gMCkgew0KICAgICAgICAgICAgICAgIG5ld1NoYXBlcyA9IHRoaXMucmVuZGVyUmVnaW9uKGN1cnJlbnRSZWdpb24sIGhpZ2hsaWdodCk7DQogICAgICAgICAgICAgICAgaWYgKCQuaXNBcnJheShuZXdTaGFwZXMpIHx8ICQuaXNBcnJheShzaGFwZWlkcykpIHsNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlcGxhY2VXaXRoU2hhcGVzKHNoYXBlaWRzLCBuZXdTaGFwZXMpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lvblNoYXBlc1tjdXJyZW50UmVnaW9uXSA9ICQubWFwKG5ld1NoYXBlcywgZnVuY3Rpb24gKG5ld1NoYXBlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3U2hhcGUuaWQ7DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZXBsYWNlV2l0aFNoYXBlKHNoYXBlaWRzLCBuZXdTaGFwZXMpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lvblNoYXBlc1tjdXJyZW50UmVnaW9uXSA9IG5ld1NoYXBlcy5pZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXMsDQogICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQsDQogICAgICAgICAgICAgICAgcmVnaW9uU2hhcGVzID0gdGhpcy5yZWdpb25TaGFwZXMsDQogICAgICAgICAgICAgICAgc2hhcGVzLCBpZHMsIGksIGo7DQoNCiAgICAgICAgICAgIGlmICghdGhpcy5jbHMuX3N1cGVyLnJlbmRlci5jYWxsKHRoaXMpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gdmFsdWVzLmxlbmd0aDsgaS0tOykgew0KICAgICAgICAgICAgICAgIHNoYXBlcyA9IHRoaXMucmVuZGVyUmVnaW9uKGkpOw0KICAgICAgICAgICAgICAgIGlmIChzaGFwZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCQuaXNBcnJheShzaGFwZXMpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZHMgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IHNoYXBlcy5sZW5ndGg7IGotLTspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZXNbal0uYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goc2hhcGVzW2pdLmlkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvblNoYXBlc1tpXSA9IGlkczsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlcy5hcHBlbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvblNoYXBlc1tpXSA9IHNoYXBlcy5pZDsgLy8gc3RvcmUganVzdCB0aGUgc2hhcGVpZA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gbnVsbCB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICByZWdpb25TaGFwZXNbaV0gPSBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRhcmdldC5yZW5kZXIoKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCg0KICAgIC8qKg0KICAgICAqIExpbmUgY2hhcnRzDQogICAgICovDQogICAgJC5mbi5zcGFya2xpbmUubGluZSA9IGxpbmUgPSBjcmVhdGVDbGFzcygkLmZuLnNwYXJrbGluZS5fYmFzZSwgew0KICAgICAgICB0eXBlOiAnbGluZScsDQoNCiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAgIGxpbmUuX3N1cGVyLmluaXQuY2FsbCh0aGlzLCBlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIHRoaXMudmVydGljZXMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMucmVnaW9uTWFwID0gW107DQogICAgICAgICAgICB0aGlzLnh2YWx1ZXMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMueXZhbHVlcyA9IFtdOw0KICAgICAgICAgICAgdGhpcy55bWlubWF4ID0gW107DQogICAgICAgICAgICB0aGlzLmhpZ2h0bGlnaHRTcG90SWQgPSBudWxsOw0KICAgICAgICAgICAgdGhpcy5sYXN0U2hhcGVJZCA9IG51bGw7DQogICAgICAgICAgICB0aGlzLmluaXRUYXJnZXQoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRSZWdpb246IGZ1bmN0aW9uIChlbCwgeCwgeSkgew0KICAgICAgICAgICAgdmFyIGksDQogICAgICAgICAgICAgICAgcmVnaW9uTWFwID0gdGhpcy5yZWdpb25NYXA7IC8vIG1hcHMgcmVnaW9ucyB0byB2YWx1ZSBwb3NpdGlvbnMNCiAgICAgICAgICAgIGZvciAoaSA9IHJlZ2lvbk1hcC5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICBpZiAocmVnaW9uTWFwW2ldICE9PSBudWxsICYmIHggKiB0aGlzLnRhcmdldC5yYXRpbyA+PSByZWdpb25NYXBbaV1bMF0gJiYgeCAqIHRoaXMudGFyZ2V0LnJhdGlvIDw9IHJlZ2lvbk1hcFtpXVsxXSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnaW9uTWFwW2ldWzJdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGN1cnJlbnRSZWdpb24gPSB0aGlzLmN1cnJlbnRSZWdpb247DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGlzTnVsbDogdGhpcy55dmFsdWVzW2N1cnJlbnRSZWdpb25dID09PSBudWxsLA0KICAgICAgICAgICAgICAgIHg6IHRoaXMueHZhbHVlc1tjdXJyZW50UmVnaW9uXSwNCiAgICAgICAgICAgICAgICB5OiB0aGlzLnl2YWx1ZXNbY3VycmVudFJlZ2lvbl0sDQogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5nZXQoJ2xpbmVDb2xvcicpLA0KICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogdGhpcy5vcHRpb25zLmdldCgnZmlsbENvbG9yJyksDQogICAgICAgICAgICAgICAgb2Zmc2V0OiBjdXJyZW50UmVnaW9uDQogICAgICAgICAgICB9Ow0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGN1cnJlbnRSZWdpb24gPSB0aGlzLmN1cnJlbnRSZWdpb24sDQogICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQsDQogICAgICAgICAgICAgICAgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1tjdXJyZW50UmVnaW9uXSwNCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLA0KICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMgPSBvcHRpb25zLmdldCgnc3BvdFJhZGl1cycpLA0KICAgICAgICAgICAgICAgIGhpZ2hsaWdodFNwb3RDb2xvciA9IG9wdGlvbnMuZ2V0KCdoaWdobGlnaHRTcG90Q29sb3InKSwNCiAgICAgICAgICAgICAgICBoaWdobGlnaHRMaW5lQ29sb3IgPSBvcHRpb25zLmdldCgnaGlnaGxpZ2h0TGluZUNvbG9yJyksDQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0U3BvdCwgaGlnaGxpZ2h0TGluZTsNCg0KICAgICAgICAgICAgaWYgKCF2ZXJ0ZXgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoc3BvdFJhZGl1cyAmJiBoaWdobGlnaHRTcG90Q29sb3IpIHsNCiAgICAgICAgICAgICAgICBoaWdobGlnaHRTcG90ID0gdGFyZ2V0LmRyYXdDaXJjbGUodmVydGV4WzBdLCB2ZXJ0ZXhbMV0sDQogICAgICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMsIHVuZGVmaW5lZCwgaGlnaGxpZ2h0U3BvdENvbG9yKTsNCiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFNwb3RJZCA9IGhpZ2hsaWdodFNwb3QuaWQ7DQogICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFmdGVyU2hhcGUodGhpcy5sYXN0U2hhcGVJZCwgaGlnaGxpZ2h0U3BvdCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoaGlnaGxpZ2h0TGluZUNvbG9yKSB7DQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0TGluZSA9IHRhcmdldC5kcmF3TGluZSh2ZXJ0ZXhbMF0sIHRoaXMuY2FudmFzVG9wLCB2ZXJ0ZXhbMF0sDQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzVG9wICsgdGhpcy5jYW52YXNIZWlnaHQsIGhpZ2hsaWdodExpbmVDb2xvcik7DQogICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRMaW5lSWQgPSBoaWdobGlnaHRMaW5lLmlkOw0KICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZnRlclNoYXBlKHRoaXMubGFzdFNoYXBlSWQsIGhpZ2hsaWdodExpbmUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIHJlbW92ZUhpZ2hsaWdodDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0Ow0KICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0U3BvdElkKSB7DQogICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZVNoYXBlSWQodGhpcy5oaWdobGlnaHRTcG90SWQpOw0KICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0U3BvdElkID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodExpbmVJZCkgew0KICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVTaGFwZUlkKHRoaXMuaGlnaGxpZ2h0TGluZUlkKTsNCiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodExpbmVJZCA9IG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgc2NhblZhbHVlczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzLA0KICAgICAgICAgICAgICAgIHZhbGNvdW50ID0gdmFsdWVzLmxlbmd0aCwNCiAgICAgICAgICAgICAgICB4dmFsdWVzID0gdGhpcy54dmFsdWVzLA0KICAgICAgICAgICAgICAgIHl2YWx1ZXMgPSB0aGlzLnl2YWx1ZXMsDQogICAgICAgICAgICAgICAgeW1pbm1heCA9IHRoaXMueW1pbm1heCwNCiAgICAgICAgICAgICAgICBpLCB2YWwsIGlzU3RyLCBpc0FycmF5LCBzcDsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWxjb3VudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFsID0gdmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgIGlzU3RyID0gdHlwZW9mKHZhbHVlc1tpXSkgPT09ICdzdHJpbmcnOw0KICAgICAgICAgICAgICAgIGlzQXJyYXkgPSB0eXBlb2YodmFsdWVzW2ldKSA9PT0gJ29iamVjdCcgJiYgdmFsdWVzW2ldIGluc3RhbmNlb2YgQXJyYXk7DQogICAgICAgICAgICAgICAgc3AgPSBpc1N0ciAmJiB2YWx1ZXNbaV0uc3BsaXQoJzonKTsNCiAgICAgICAgICAgICAgICBpZiAoaXNTdHIgJiYgc3AubGVuZ3RoID09PSAyKSB7IC8vIHg6eQ0KICAgICAgICAgICAgICAgICAgICB4dmFsdWVzLnB1c2goTnVtYmVyKHNwWzBdKSk7DQogICAgICAgICAgICAgICAgICAgIHl2YWx1ZXMucHVzaChOdW1iZXIoc3BbMV0pKTsNCiAgICAgICAgICAgICAgICAgICAgeW1pbm1heC5wdXNoKE51bWJlcihzcFsxXSkpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheSkgew0KICAgICAgICAgICAgICAgICAgICB4dmFsdWVzLnB1c2godmFsWzBdKTsNCiAgICAgICAgICAgICAgICAgICAgeXZhbHVlcy5wdXNoKHZhbFsxXSk7DQogICAgICAgICAgICAgICAgICAgIHltaW5tYXgucHVzaCh2YWxbMV0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHh2YWx1ZXMucHVzaChpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gbnVsbCB8fCB2YWx1ZXNbaV0gPT09ICdudWxsJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgeXZhbHVlcy5wdXNoKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgeXZhbHVlcy5wdXNoKE51bWJlcih2YWwpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHltaW5tYXgucHVzaChOdW1iZXIodmFsKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmdldCgneHZhbHVlcycpKSB7DQogICAgICAgICAgICAgICAgeHZhbHVlcyA9IHRoaXMub3B0aW9ucy5nZXQoJ3h2YWx1ZXMnKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5tYXh5ID0gdGhpcy5tYXh5b3JnID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgeW1pbm1heCk7DQogICAgICAgICAgICB0aGlzLm1pbnkgPSB0aGlzLm1pbnlvcmcgPSBNYXRoLm1pbi5hcHBseShNYXRoLCB5bWlubWF4KTsNCg0KICAgICAgICAgICAgdGhpcy5tYXh4ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgeHZhbHVlcyk7DQogICAgICAgICAgICB0aGlzLm1pbnggPSBNYXRoLm1pbi5hcHBseShNYXRoLCB4dmFsdWVzKTsNCg0KICAgICAgICAgICAgdGhpcy54dmFsdWVzID0geHZhbHVlczsNCiAgICAgICAgICAgIHRoaXMueXZhbHVlcyA9IHl2YWx1ZXM7DQogICAgICAgICAgICB0aGlzLnltaW5tYXggPSB5bWlubWF4Ow0KICAgICAgICB9LA0KDQogICAgICAgIHByb2Nlc3NSYW5nZU9wdGlvbnM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLA0KICAgICAgICAgICAgICAgIG5vcm1hbFJhbmdlTWluID0gb3B0aW9ucy5nZXQoJ25vcm1hbFJhbmdlTWluJyksDQogICAgICAgICAgICAgICAgbm9ybWFsUmFuZ2VNYXggPSBvcHRpb25zLmdldCgnbm9ybWFsUmFuZ2VNYXgnKTsNCg0KICAgICAgICAgICAgaWYgKG5vcm1hbFJhbmdlTWluICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsUmFuZ2VNaW4gPCB0aGlzLm1pbnkpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW55ID0gbm9ybWFsUmFuZ2VNaW47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChub3JtYWxSYW5nZU1heCA+IHRoaXMubWF4eSkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLm1heHkgPSBub3JtYWxSYW5nZU1heDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNaW4nKSAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLmdldCgnY2hhcnRSYW5nZUNsaXAnKSB8fCBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1pbicpIDwgdGhpcy5taW55KSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWlueSA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNYXgnKSAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLmdldCgnY2hhcnRSYW5nZUNsaXAnKSB8fCBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1heCcpID4gdGhpcy5tYXh5KSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWF4eSA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWF4Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNaW5YJykgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VDbGlwWCcpIHx8IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluWCcpIDwgdGhpcy5taW54KSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWlueCA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluWCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWF4WCcpICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlQ2xpcFgnKSB8fCBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1heFgnKSA+IHRoaXMubWF4eCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLm1heHggPSBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1heFgnKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9LA0KDQogICAgICAgIGRyYXdOb3JtYWxSYW5nZTogZnVuY3Rpb24gKGNhbnZhc0xlZnQsIGNhbnZhc1RvcCwgY2FudmFzSGVpZ2h0LCBjYW52YXNXaWR0aCwgcmFuZ2V5KSB7DQogICAgICAgICAgICB2YXIgbm9ybWFsUmFuZ2VNaW4gPSB0aGlzLm9wdGlvbnMuZ2V0KCdub3JtYWxSYW5nZU1pbicpLA0KICAgICAgICAgICAgICAgIG5vcm1hbFJhbmdlTWF4ID0gdGhpcy5vcHRpb25zLmdldCgnbm9ybWFsUmFuZ2VNYXgnKSwNCiAgICAgICAgICAgICAgICB5dG9wID0gY2FudmFzVG9wICsgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgLSAoY2FudmFzSGVpZ2h0ICogKChub3JtYWxSYW5nZU1heCAtIHRoaXMubWlueSkgLyByYW5nZXkpKSksDQogICAgICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5yb3VuZCgoY2FudmFzSGVpZ2h0ICogKG5vcm1hbFJhbmdlTWF4IC0gbm9ybWFsUmFuZ2VNaW4pKSAvIHJhbmdleSk7DQogICAgICAgICAgICB0aGlzLnRhcmdldC5kcmF3UmVjdChjYW52YXNMZWZ0LCB5dG9wLCBjYW52YXNXaWR0aCwgaGVpZ2h0LCB1bmRlZmluZWQsIHRoaXMub3B0aW9ucy5nZXQoJ25vcm1hbFJhbmdlQ29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywNCiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCwNCiAgICAgICAgICAgICAgICBjYW52YXNXaWR0aCA9IHRoaXMuY2FudmFzV2lkdGgsDQogICAgICAgICAgICAgICAgY2FudmFzSGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQsDQogICAgICAgICAgICAgICAgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzLA0KICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMgPSBvcHRpb25zLmdldCgnc3BvdFJhZGl1cycpLA0KICAgICAgICAgICAgICAgIHJlZ2lvbk1hcCA9IHRoaXMucmVnaW9uTWFwLA0KICAgICAgICAgICAgICAgIHJhbmdleCwgcmFuZ2V5LCB5dmFsbGFzdCwNCiAgICAgICAgICAgICAgICBjYW52YXNUb3AsIGNhbnZhc0xlZnQsDQogICAgICAgICAgICAgICAgdmVydGV4LCBwYXRoLCBwYXRocywgeCwgeSwgeG5leHQsIHhwb3MsIHhwb3NuZXh0LA0KICAgICAgICAgICAgICAgIGxhc3QsIG5leHQsIHl2YWxjb3VudCwgbGluZVNoYXBlcywgZmlsbFNoYXBlcywgcGxlbiwNCiAgICAgICAgICAgICAgICB2YWx1ZVNwb3RzLCBobFNwb3RzRW5hYmxlZCwgY29sb3IsIHh2YWx1ZXMsIHl2YWx1ZXMsIGk7DQoNCiAgICAgICAgICAgIGlmICghbGluZS5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuc2NhblZhbHVlcygpOw0KICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmFuZ2VPcHRpb25zKCk7DQoNCiAgICAgICAgICAgIHh2YWx1ZXMgPSB0aGlzLnh2YWx1ZXM7DQogICAgICAgICAgICB5dmFsdWVzID0gdGhpcy55dmFsdWVzOw0KDQogICAgICAgICAgICBpZiAoIXRoaXMueW1pbm1heC5sZW5ndGggfHwgdGhpcy55dmFsdWVzLmxlbmd0aCA8IDIpIHsNCiAgICAgICAgICAgICAgICAvLyBlbXB0eSBvciBhbGwgbnVsbCB2YWx1ZXNzDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjYW52YXNUb3AgPSBjYW52YXNMZWZ0ID0gMDsNCg0KICAgICAgICAgICAgcmFuZ2V4ID0gdGhpcy5tYXh4IC0gdGhpcy5taW54ID09PSAwID8gMSA6IHRoaXMubWF4eCAtIHRoaXMubWlueDsNCiAgICAgICAgICAgIHJhbmdleSA9IHRoaXMubWF4eSAtIHRoaXMubWlueSA9PT0gMCA/IDEgOiB0aGlzLm1heHkgLSB0aGlzLm1pbnk7DQogICAgICAgICAgICB5dmFsbGFzdCA9IHRoaXMueXZhbHVlcy5sZW5ndGggLSAxOw0KDQogICAgICAgICAgICBpZiAoc3BvdFJhZGl1cyAmJiAoY2FudmFzV2lkdGggPCAoc3BvdFJhZGl1cyAqIDQpIHx8IGNhbnZhc0hlaWdodCA8IChzcG90UmFkaXVzICogNCkpKSB7DQogICAgICAgICAgICAgICAgc3BvdFJhZGl1cyA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoc3BvdFJhZGl1cykgew0KICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgY2FudmFzIHNpemUgYXMgcmVxdWlyZWQgc28gdGhhdCBzcG90cyB3aWxsIGZpdA0KICAgICAgICAgICAgICAgIGhsU3BvdHNFbmFibGVkID0gb3B0aW9ucy5nZXQoJ2hpZ2hsaWdodFNwb3RDb2xvcicpICYmICAhb3B0aW9ucy5nZXQoJ2Rpc2FibGVJbnRlcmFjdGlvbicpOw0KICAgICAgICAgICAgICAgIGlmIChobFNwb3RzRW5hYmxlZCB8fCBvcHRpb25zLmdldCgnbWluU3BvdENvbG9yJykgfHwgKG9wdGlvbnMuZ2V0KCdzcG90Q29sb3InKSAmJiB5dmFsdWVzW3l2YWxsYXN0XSA9PT0gdGhpcy5taW55KSkgew0KICAgICAgICAgICAgICAgICAgICBjYW52YXNIZWlnaHQgLT0gTWF0aC5jZWlsKHNwb3RSYWRpdXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoaGxTcG90c0VuYWJsZWQgfHwgb3B0aW9ucy5nZXQoJ21heFNwb3RDb2xvcicpIHx8IChvcHRpb25zLmdldCgnc3BvdENvbG9yJykgJiYgeXZhbHVlc1t5dmFsbGFzdF0gPT09IHRoaXMubWF4eSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FudmFzSGVpZ2h0IC09IE1hdGguY2VpbChzcG90UmFkaXVzKTsNCiAgICAgICAgICAgICAgICAgICAgY2FudmFzVG9wICs9IE1hdGguY2VpbChzcG90UmFkaXVzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGhsU3BvdHNFbmFibGVkIHx8DQogICAgICAgICAgICAgICAgICAgICAoKG9wdGlvbnMuZ2V0KCdtaW5TcG90Q29sb3InKSB8fCBvcHRpb25zLmdldCgnbWF4U3BvdENvbG9yJykpICYmICh5dmFsdWVzWzBdID09PSB0aGlzLm1pbnkgfHwgeXZhbHVlc1swXSA9PT0gdGhpcy5tYXh5KSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FudmFzTGVmdCArPSBNYXRoLmNlaWwoc3BvdFJhZGl1cyk7DQogICAgICAgICAgICAgICAgICAgIGNhbnZhc1dpZHRoIC09IE1hdGguY2VpbChzcG90UmFkaXVzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGhsU3BvdHNFbmFibGVkIHx8IG9wdGlvbnMuZ2V0KCdzcG90Q29sb3InKSB8fA0KICAgICAgICAgICAgICAgICAgICAob3B0aW9ucy5nZXQoJ21pblNwb3RDb2xvcicpIHx8IG9wdGlvbnMuZ2V0KCdtYXhTcG90Q29sb3InKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgKHl2YWx1ZXNbeXZhbGxhc3RdID09PSB0aGlzLm1pbnkgfHwgeXZhbHVlc1t5dmFsbGFzdF0gPT09IHRoaXMubWF4eSkpKSB7DQogICAgICAgICAgICAgICAgICAgIGNhbnZhc1dpZHRoIC09IE1hdGguY2VpbChzcG90UmFkaXVzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgY2FudmFzSGVpZ2h0LS07DQoNCiAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnbm9ybWFsUmFuZ2VNaW4nKSAhPT0gdW5kZWZpbmVkICYmICFvcHRpb25zLmdldCgnZHJhd05vcm1hbE9uVG9wJykpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRyYXdOb3JtYWxSYW5nZShjYW52YXNMZWZ0LCBjYW52YXNUb3AsIGNhbnZhc0hlaWdodCwgY2FudmFzV2lkdGgsIHJhbmdleSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHBhdGggPSBbXTsNCiAgICAgICAgICAgIHBhdGhzID0gW3BhdGhdOw0KICAgICAgICAgICAgbGFzdCA9IG5leHQgPSBudWxsOw0KICAgICAgICAgICAgeXZhbGNvdW50ID0geXZhbHVlcy5sZW5ndGg7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeXZhbGNvdW50OyBpKyspIHsNCiAgICAgICAgICAgICAgICB4ID0geHZhbHVlc1tpXTsNCiAgICAgICAgICAgICAgICB4bmV4dCA9IHh2YWx1ZXNbaSArIDFdOw0KICAgICAgICAgICAgICAgIHkgPSB5dmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgIHhwb3MgPSBjYW52YXNMZWZ0ICsgTWF0aC5yb3VuZCgoeCAtIHRoaXMubWlueCkgKiAoY2FudmFzV2lkdGggLyByYW5nZXgpKTsNCiAgICAgICAgICAgICAgICB4cG9zbmV4dCA9IGkgPCB5dmFsY291bnQgLSAxID8gY2FudmFzTGVmdCArIE1hdGgucm91bmQoKHhuZXh0IC0gdGhpcy5taW54KSAqIChjYW52YXNXaWR0aCAvIHJhbmdleCkpIDogY2FudmFzV2lkdGg7DQogICAgICAgICAgICAgICAgbmV4dCA9IHhwb3MgKyAoKHhwb3NuZXh0IC0geHBvcykgLyAyKTsNCiAgICAgICAgICAgICAgICByZWdpb25NYXBbaV0gPSBbbGFzdCB8fCAwLCBuZXh0LCBpXTsNCiAgICAgICAgICAgICAgICBsYXN0ID0gbmV4dDsNCiAgICAgICAgICAgICAgICBpZiAoeSA9PT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoaSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHl2YWx1ZXNbaSAtIDFdICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCB0aGlzLm1pbnkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0aGlzLm1pbnk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiB0aGlzLm1heHkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0aGlzLm1heHk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRoLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmFsdWUgd2FzIG51bGwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucHVzaChbeHBvcywgY2FudmFzVG9wICsgY2FudmFzSGVpZ2h0XSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmVydGV4ID0gW3hwb3MsIGNhbnZhc1RvcCArIE1hdGgucm91bmQoY2FudmFzSGVpZ2h0IC0gKGNhbnZhc0hlaWdodCAqICgoeSAtIHRoaXMubWlueSkgLyByYW5nZXkpKSldOw0KICAgICAgICAgICAgICAgICAgICBwYXRoLnB1c2godmVydGV4KTsNCiAgICAgICAgICAgICAgICAgICAgdmVydGljZXMucHVzaCh2ZXJ0ZXgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGluZVNoYXBlcyA9IFtdOw0KICAgICAgICAgICAgZmlsbFNoYXBlcyA9IFtdOw0KICAgICAgICAgICAgcGxlbiA9IHBhdGhzLmxlbmd0aDsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aHNbaV07DQogICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnZmlsbENvbG9yJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucHVzaChbcGF0aFtwYXRoLmxlbmd0aCAtIDFdWzBdLCAoY2FudmFzVG9wICsgY2FudmFzSGVpZ2h0KV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFNoYXBlcy5wdXNoKHBhdGguc2xpY2UoMCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5wb3AoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG9ubHkgYSBzaW5nbGUgcG9pbnQgaW4gdGhpcyBwYXRoLCB0aGVuIHdlIHdhbnQgdG8gZGlzcGxheSBpdA0KICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHZlcnRpY2FsIGxpbmUgd2hpY2ggbWVhbnMgd2Uga2VlcCBwYXRoWzBdICBhcyBpcw0KICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPiAyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHdlIHdhbnQgdGhlIGZpcnN0IHZhbHVlDQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoWzBdID0gW3BhdGhbMF1bMF0sIHBhdGhbMV1bMV1dOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGxpbmVTaGFwZXMucHVzaChwYXRoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIGZpbGwgZmlyc3QsIHRoZW4gb3B0aW9uYWxseSB0aGUgbm9ybWFsIHJhbmdlLCB0aGVuIHRoZSBsaW5lIG9uIHRvcCBvZiB0aGF0DQogICAgICAgICAgICBwbGVuID0gZmlsbFNoYXBlcy5sZW5ndGg7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgdGFyZ2V0LmRyYXdTaGFwZShmaWxsU2hhcGVzW2ldLA0KICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnZmlsbENvbG9yJyksIG9wdGlvbnMuZ2V0KCdmaWxsQ29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnbm9ybWFsUmFuZ2VNaW4nKSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZ2V0KCdkcmF3Tm9ybWFsT25Ub3AnKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuZHJhd05vcm1hbFJhbmdlKGNhbnZhc0xlZnQsIGNhbnZhc1RvcCwgY2FudmFzSGVpZ2h0LCBjYW52YXNXaWR0aCwgcmFuZ2V5KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcGxlbiA9IGxpbmVTaGFwZXMubGVuZ3RoOw0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgIHRhcmdldC5kcmF3U2hhcGUobGluZVNoYXBlc1tpXSwgb3B0aW9ucy5nZXQoJ2xpbmVDb2xvcicpLCB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdsaW5lV2lkdGgnKSkuYXBwZW5kKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChzcG90UmFkaXVzICYmIG9wdGlvbnMuZ2V0KCd2YWx1ZVNwb3RzJykpIHsNCiAgICAgICAgICAgICAgICB2YWx1ZVNwb3RzID0gb3B0aW9ucy5nZXQoJ3ZhbHVlU3BvdHMnKTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWVTcG90cy5nZXQgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwb3RzID0gbmV3IFJhbmdlTWFwKHZhbHVlU3BvdHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeXZhbGNvdW50OyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB2YWx1ZVNwb3RzLmdldCh5dmFsdWVzW2ldKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZHJhd0NpcmNsZShjYW52YXNMZWZ0ICsgTWF0aC5yb3VuZCgoeHZhbHVlc1tpXSAtIHRoaXMubWlueCkgKiAoY2FudmFzV2lkdGggLyByYW5nZXgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNUb3AgKyBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAtIChjYW52YXNIZWlnaHQgKiAoKHl2YWx1ZXNbaV0gLSB0aGlzLm1pbnkpIC8gcmFuZ2V5KSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMsIHVuZGVmaW5lZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcikuYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzcG90UmFkaXVzICYmIG9wdGlvbnMuZ2V0KCdzcG90Q29sb3InKSAmJiB5dmFsdWVzW3l2YWxsYXN0XSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHRhcmdldC5kcmF3Q2lyY2xlKGNhbnZhc0xlZnQgKyBNYXRoLnJvdW5kKCh4dmFsdWVzW3h2YWx1ZXMubGVuZ3RoIC0gMV0gLSB0aGlzLm1pbngpICogKGNhbnZhc1dpZHRoIC8gcmFuZ2V4KSksDQogICAgICAgICAgICAgICAgICAgIGNhbnZhc1RvcCArIE1hdGgucm91bmQoY2FudmFzSGVpZ2h0IC0gKGNhbnZhc0hlaWdodCAqICgoeXZhbHVlc1t5dmFsbGFzdF0gLSB0aGlzLm1pbnkpIC8gcmFuZ2V5KSkpLA0KICAgICAgICAgICAgICAgICAgICBzcG90UmFkaXVzLCB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdzcG90Q29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5tYXh5ICE9PSB0aGlzLm1pbnlvcmcpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3BvdFJhZGl1cyAmJiBvcHRpb25zLmdldCgnbWluU3BvdENvbG9yJykpIHsNCiAgICAgICAgICAgICAgICAgICAgeCA9IHh2YWx1ZXNbJC5pbkFycmF5KHRoaXMubWlueW9yZywgeXZhbHVlcyldOw0KICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZHJhd0NpcmNsZShjYW52YXNMZWZ0ICsgTWF0aC5yb3VuZCgoeCAtIHRoaXMubWlueCkgKiAoY2FudmFzV2lkdGggLyByYW5nZXgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc1RvcCArIE1hdGgucm91bmQoY2FudmFzSGVpZ2h0IC0gKGNhbnZhc0hlaWdodCAqICgodGhpcy5taW55b3JnIC0gdGhpcy5taW55KSAvIHJhbmdleSkpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNwb3RSYWRpdXMsIHVuZGVmaW5lZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdtaW5TcG90Q29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChzcG90UmFkaXVzICYmIG9wdGlvbnMuZ2V0KCdtYXhTcG90Q29sb3InKSkgew0KICAgICAgICAgICAgICAgICAgICB4ID0geHZhbHVlc1skLmluQXJyYXkodGhpcy5tYXh5b3JnLCB5dmFsdWVzKV07DQogICAgICAgICAgICAgICAgICAgIHRhcmdldC5kcmF3Q2lyY2xlKGNhbnZhc0xlZnQgKyBNYXRoLnJvdW5kKCh4IC0gdGhpcy5taW54KSAqIChjYW52YXNXaWR0aCAvIHJhbmdleCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzVG9wICsgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgLSAoY2FudmFzSGVpZ2h0ICogKCh0aGlzLm1heHlvcmcgLSB0aGlzLm1pbnkpIC8gcmFuZ2V5KSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3BvdFJhZGl1cywgdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ21heFNwb3RDb2xvcicpKS5hcHBlbmQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgY29tcGFyZSB0aGUgcmVmTGluZVgvWSBvcHRpb24gdmFsdWVzIHdpdGggJ251bGwnIGFzIG51bWVyaWMgemVybygwKSBzaG91bGQgcGxvdCBhIHJlZi1saW5lIGF0IHplcm8hDQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3JlZkxpbmVYJykgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpzaGludCBpZ25vcmU6bGluZQ0KICAgICAgICAgICAgICAgIHkgPSBNYXRoLnJvdW5kKHRoaXMuY2FudmFzSGVpZ2h0IC0gKG9wdGlvbnMuZ2V0KCdyZWZMaW5lWCcpIC0gdGhpcy5taW55KSAqICh0aGlzLmNhbnZhc0hlaWdodC9yYW5nZXkpKTsNCiAgICAgICAgICAgICAgICB0YXJnZXQuZHJhd0xpbmUoMCwgeSwgdGhpcy5jYW52YXNXaWR0aCwgeSwgb3B0aW9ucy5nZXQoJ3JlZkxpbmVDb2xvcicpKS5hcHBlbmQoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KCdyZWZMaW5lWScpICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqc2hpbnQgaWdub3JlOmxpbmUNCiAgICAgICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCgob3B0aW9ucy5nZXQoJ3JlZkxpbmVZJykgLSB0aGlzLm1pbngpICogKHRoaXMuY2FudmFzV2lkdGgvcmFuZ2V4KSk7DQogICAgICAgICAgICAgICAgdGFyZ2V0LmRyYXdMaW5lKHgsIHRoaXMuY2FudmFzSGVpZ2h0LCB4LCAwLCBvcHRpb25zLmdldCgncmVmTGluZUNvbG9yJykpLmFwcGVuZCgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLmxhc3RTaGFwZUlkID0gdGFyZ2V0LmdldExhc3RTaGFwZUlkKCk7DQogICAgICAgICAgICB0aGlzLmNhbnZhc1RvcCA9IGNhbnZhc1RvcDsNCiAgICAgICAgICAgIHRhcmdldC5yZW5kZXIoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQoNCiAgICAvKioNCiAgICAgKiBCYXIgY2hhcnRzDQogICAgICovDQogICAgJC5mbi5zcGFya2xpbmUuYmFyID0gYmFyID0gY3JlYXRlQ2xhc3MoJC5mbi5zcGFya2xpbmUuX2Jhc2UsIGJhckhpZ2hsaWdodE1peGluLCB7DQogICAgICAgIHR5cGU6ICdiYXInLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgICAgICB2YXIgYmFyV2lkdGggPSBwYXJzZUludChvcHRpb25zLmdldCgnYmFyV2lkdGgnKSwgMTApLA0KICAgICAgICAgICAgICAgIGJhclNwYWNpbmcgPSBwYXJzZUludChvcHRpb25zLmdldCgnYmFyU3BhY2luZycpLCAxMCksDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1pbiA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluJyksDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZU1heCA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWF4JyksDQogICAgICAgICAgICAgICAgY2hhcnRSYW5nZUNsaXAgPSBvcHRpb25zLmdldCgnY2hhcnRSYW5nZUNsaXAnKSwNCiAgICAgICAgICAgICAgICBzdGFja01pbiA9IEluZmluaXR5LA0KICAgICAgICAgICAgICAgIHN0YWNrTWF4ID0gLUluZmluaXR5LA0KICAgICAgICAgICAgICAgIGlzU3RhY2tTdHJpbmcsIGdyb3VwTWluLCBncm91cE1heCwgc3RhY2tSYW5nZXMsIHN0YWNrUmFuZ2VzTmVnLCBzdGFja1RvdGFscywgYWN0dWFsTWluLCBhY3R1YWxNYXgsDQogICAgICAgICAgICAgICAgbnVtVmFsdWVzLCBpLCB2bGVuLCByYW5nZSwgemVyb0F4aXMsIHhheGlzT2Zmc2V0LCBtaW4sIG1heCwgY2xpcE1pbiwgY2xpcE1heCwNCiAgICAgICAgICAgICAgICBzdGFja2VkLCB2bGlzdCwgaiwgc2xlbiwgc3ZhbHMsIHZhbCwgeW9mZnNldCwgeU1heENhbGMsIGNhbnZhc0hlaWdodEVmOw0KICAgICAgICAgICAgYmFyLl9zdXBlci5pbml0LmNhbGwodGhpcywgZWwsIHZhbHVlcywgb3B0aW9ucywgd2lkdGgsIGhlaWdodCk7DQoNCiAgICAgICAgICAgIC8vIHNjYW4gdmFsdWVzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHN0YWNrIGJhcnMNCiAgICAgICAgICAgIGZvciAoaSA9IDAsIHZsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgdmxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFsID0gdmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgIGlzU3RhY2tTdHJpbmcgPSB0eXBlb2YodmFsKSA9PT0gJ3N0cmluZycgJiYgdmFsLmluZGV4T2YoJzonKSA+IC0xOw0KICAgICAgICAgICAgICAgIGlmIChpc1N0YWNrU3RyaW5nIHx8ICQuaXNBcnJheSh2YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIHN0YWNrZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGFja1N0cmluZykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsdWVzW2ldID0gbm9ybWFsaXplVmFsdWVzKHZhbC5zcGxpdCgnOicpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YWwgPSByZW1vdmUodmFsLCBudWxsKTsgLy8gbWluL21heCB3aWxsIHRyZWF0IG51bGwgYXMgemVybw0KICAgICAgICAgICAgICAgICAgICBncm91cE1pbiA9IE1hdGgubWluLmFwcGx5KE1hdGgsIHZhbCk7DQogICAgICAgICAgICAgICAgICAgIGdyb3VwTWF4ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgdmFsKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwTWluIDwgc3RhY2tNaW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWluID0gZ3JvdXBNaW47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwTWF4ID4gc3RhY2tNYXgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWF4ID0gZ3JvdXBNYXg7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuaW5pdFRhcmdldCgpOw0KDQogICAgICAgICAgICB0aGlzLnN0YWNrZWQgPSBzdGFja2VkOw0KICAgICAgICAgICAgdGhpcy5yZWdpb25TaGFwZXMgPSB7fTsNCiAgICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSBiYXJXaWR0aCAqIHRoaXMudGFyZ2V0LmRldmljZVBpeGVsUmF0aW87DQogICAgICAgICAgICB0aGlzLmJhclNwYWNpbmcgPSBiYXJTcGFjaW5nICogdGhpcy50YXJnZXQuZGV2aWNlUGl4ZWxSYXRpbzsNCiAgICAgICAgICAgIHRoaXMudG90YWxCYXJXaWR0aCA9IChiYXJXaWR0aCArIGJhclNwYWNpbmcpICogdGhpcy50YXJnZXQuZGV2aWNlUGl4ZWxSYXRpbzsNCiAgICAgICAgICAgIHZhciByYXdXaWR0aCA9ICh2YWx1ZXMubGVuZ3RoICogYmFyV2lkdGggKiB0aGlzLnRhcmdldC5kZXZpY2VQaXhlbFJhdGlvKSArICgodmFsdWVzLmxlbmd0aCAtIDEpICogYmFyU3BhY2luZyAqIHRoaXMudGFyZ2V0LmRldmljZVBpeGVsUmF0aW8pOw0KICAgICAgICAgICAgdGhpcy54U2NhbGUgPSBNYXRoLm1pbigxLCByYXdXaWR0aCA/IHdpZHRoICogdGhpcy50YXJnZXQuZGV2aWNlUGl4ZWxSYXRpbyAvIHJhd1dpZHRoIDogMSk7DQogICAgICAgICAgICB0aGlzLndpZHRoID0gcmF3V2lkdGggKiB0aGlzLnhTY2FsZTsNCg0KICAgICAgICAgICAgaWYgKGNoYXJ0UmFuZ2VDbGlwKSB7DQogICAgICAgICAgICAgICAgY2xpcE1pbiA9IGNoYXJ0UmFuZ2VNaW4gPT09IHVuZGVmaW5lZCA/IC1JbmZpbml0eSA6IGNoYXJ0UmFuZ2VNaW47DQogICAgICAgICAgICAgICAgY2xpcE1heCA9IGNoYXJ0UmFuZ2VNYXggPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogY2hhcnRSYW5nZU1heDsNCiAgICAgICAgICAgIH0NCgkJCWlmIChzdGFja2VkKSB7DQoJCQkJYWN0dWFsTWluID0gY2hhcnRSYW5nZU1pbiA9PT0gdW5kZWZpbmVkID8gc3RhY2tNaW4gOiBNYXRoLm1pbihzdGFja01pbiwgY2hhcnRSYW5nZU1pbik7DQoJCQkJYWN0dWFsTWF4ID0gY2hhcnRSYW5nZU1heCA9PT0gdW5kZWZpbmVkID8gc3RhY2tNYXggOiBNYXRoLm1heChzdGFja01heCwgY2hhcnRSYW5nZU1heCk7DQoJCQl9DQoNCiAgICAgICAgICAgIG51bVZhbHVlcyA9IFtdOw0KICAgICAgICAgICAgc3RhY2tSYW5nZXMgPSBzdGFja2VkID8gW10gOiBudW1WYWx1ZXM7DQogICAgICAgICAgICBzdGFja1RvdGFscyA9IFtdOw0KICAgICAgICAgICAgc3RhY2tSYW5nZXNOZWcgPSBbXTsNCiAgICAgICAgICAgIGZvciAoaSA9IDAsIHZsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgdmxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0YWNrZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmxpc3QgPSB2YWx1ZXNbaV07DQogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHN2YWxzID0gW107DQogICAgICAgICAgICAgICAgICAgIHN0YWNrVG90YWxzW2ldID0gMDsNCiAgICAgICAgICAgICAgICAgICAgc3RhY2tSYW5nZXNbaV0gPSBzdGFja1Jhbmdlc05lZ1tpXSA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDAsIHNsZW4gPSB2bGlzdC5sZW5ndGg7IGogPCBzbGVuOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHN2YWxzW2pdID0gY2hhcnRSYW5nZUNsaXAgPyBjbGlwdmFsKHZsaXN0W2pdLCBjbGlwTWluLCBjbGlwTWF4KSA6IHZsaXN0W2pdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrVG90YWxzW2ldICs9IHZhbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrTWluIDwgMCAmJiBzdGFja01heCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrUmFuZ2VzTmVnW2ldICs9IE1hdGguYWJzKHZhbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1Jhbmdlc1tpXSArPSB2YWw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1Jhbmdlc1tpXSArPSBNYXRoLmFicyh2YWwgLSAodmFsIDwgMCA/IGFjdHVhbE1heCA6IGFjdHVhbE1pbikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1WYWx1ZXMucHVzaCh2YWwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdmFsID0gY2hhcnRSYW5nZUNsaXAgPyBjbGlwdmFsKHZhbHVlc1tpXSwgY2xpcE1pbiwgY2xpcE1heCkgOiB2YWx1ZXNbaV07DQogICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbHVlc1tpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbCk7DQogICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG51bVZhbHVlcy5wdXNoKHZhbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLm1heCA9IG1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIG51bVZhbHVlcyk7DQogICAgICAgICAgICB0aGlzLm1pbiA9IG1pbiA9IE1hdGgubWluLmFwcGx5KE1hdGgsIG51bVZhbHVlcyk7DQogICAgICAgICAgICB0aGlzLnN0YWNrTWF4ID0gc3RhY2tNYXggPSBzdGFja2VkID8gTWF0aC5tYXguYXBwbHkoTWF0aCwgc3RhY2tUb3RhbHMpIDogbWF4Ow0KICAgICAgICAgICAgdGhpcy5zdGFja01pbiA9IHN0YWNrTWluID0gc3RhY2tlZCA/IE1hdGgubWluLmFwcGx5KE1hdGgsIG51bVZhbHVlcykgOiBtaW47DQoNCiAgICAgICAgICAgIGlmIChjaGFydFJhbmdlTWluICE9PSB1bmRlZmluZWQgJiYgKGNoYXJ0UmFuZ2VDbGlwIHx8IGNoYXJ0UmFuZ2VNaW4gPCBtaW4pKSB7DQogICAgICAgICAgICAgICAgbWluID0gY2hhcnRSYW5nZU1pbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjaGFydFJhbmdlTWF4ICE9PSB1bmRlZmluZWQgJiYgKGNoYXJ0UmFuZ2VDbGlwIHx8IGNoYXJ0UmFuZ2VNYXggPiBtYXgpKSB7DQogICAgICAgICAgICAgICAgbWF4ID0gY2hhcnRSYW5nZU1heDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy56ZXJvQXhpcyA9IHplcm9BeGlzID0gb3B0aW9ucy5nZXQoJ3plcm9BeGlzJywgdHJ1ZSk7DQogICAgICAgICAgICBpZiAobWluIDw9IDAgJiYgbWF4ID49IDAgJiYgemVyb0F4aXMpIHsNCiAgICAgICAgICAgICAgICB4YXhpc09mZnNldCA9IDA7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHplcm9BeGlzID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgIHhheGlzT2Zmc2V0ID0gbWluOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChtaW4gPiAwKSB7DQogICAgICAgICAgICAgICAgeGF4aXNPZmZzZXQgPSBtaW47DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHhheGlzT2Zmc2V0ID0gbWF4Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy54YXhpc09mZnNldCA9IHhheGlzT2Zmc2V0Ow0KDQogICAgICAgICAgICByYW5nZSA9IHN0YWNrZWQgPyAoTWF0aC5tYXguYXBwbHkoTWF0aCwgc3RhY2tSYW5nZXMpICsgTWF0aC5tYXguYXBwbHkoTWF0aCwgc3RhY2tSYW5nZXNOZWcpKSA6IG1heCAtIG1pbjsNCg0KICAgICAgICAgICAgLy8gYXMgd2UgcGxvdCB6ZXJvL21pbiB2YWx1ZXMgYSBzaW5nbGUgcGl4ZWwgbGluZSwgd2UgYWRkIGEgcGl4ZWwgdG8gYWxsIG90aGVyDQogICAgICAgICAgICAvLyB2YWx1ZXMgLSBSZWR1Y2UgdGhlIGVmZmVjdGl2ZSBjYW52YXMgc2l6ZSB0byBzdWl0DQogICAgICAgICAgICB0aGlzLmNhbnZhc0hlaWdodEVmID0gKHplcm9BeGlzICYmIG1pbiA8IDApID8gdGhpcy5jYW52YXNIZWlnaHQgLSAyIDogdGhpcy5jYW52YXNIZWlnaHQgLSAxOw0KDQogICAgICAgICAgICBpZiAobWluIDwgeGF4aXNPZmZzZXQpIHsNCiAgICAgICAgICAgICAgICB5TWF4Q2FsYyA9IChzdGFja2VkICYmIG1heCA+PSAwKSA/IHN0YWNrTWF4IDogbWF4Ow0KICAgICAgICAgICAgICAgIHlvZmZzZXQgPSAoeU1heENhbGMgLSB4YXhpc09mZnNldCkgLyByYW5nZSAqIHRoaXMuY2FudmFzSGVpZ2h0Ow0KICAgICAgICAgICAgICAgIGlmICh5b2Zmc2V0ICE9PSBNYXRoLmNlaWwoeW9mZnNldCkpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNIZWlnaHRFZiAtPSAyOw0KICAgICAgICAgICAgICAgICAgICB5b2Zmc2V0ID0gTWF0aC5jZWlsKHlvZmZzZXQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgeW9mZnNldCA9IHRoaXMuY2FudmFzSGVpZ2h0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy55b2Zmc2V0ID0geW9mZnNldDsNCg0KICAgICAgICAgICAgdGhpcy5pbml0Q29sb3JNYXAoKTsNCiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsNCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRSZWdpb246IGZ1bmN0aW9uIChlbCwgeCwgeSkgew0KICAgICAgICAgICAgeCAvPSB0aGlzLnhTY2FsZTsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBNYXRoLmZsb29yKHggKiB0aGlzLnRhcmdldC5yYXRpbyAvIHRoaXMudG90YWxCYXJXaWR0aCk7DQogICAgICAgICAgICByZXR1cm4gKHJlc3VsdCA8IDAgfHwgcmVzdWx0ID49IHRoaXMudmFsdWVzLmxlbmd0aCkgPyB1bmRlZmluZWQgOiByZXN1bHQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGN1cnJlbnRSZWdpb24gPSB0aGlzLmN1cnJlbnRSZWdpb24sDQogICAgICAgICAgICAgICAgdmFsdWVzID0gZW5zdXJlQXJyYXkodGhpcy52YWx1ZXNbY3VycmVudFJlZ2lvbl0pLA0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdLA0KICAgICAgICAgICAgICAgIHZhbHVlLCBpOw0KICAgICAgICAgICAgZm9yIChpID0gdmFsdWVzLmxlbmd0aDsgaS0tOykgew0KICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2ldOw0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgaXNOdWxsOiB2YWx1ZSA9PT0gbnVsbCwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLA0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5jYWxjQ29sb3IoaSwgdmFsdWUsIGN1cnJlbnRSZWdpb24pLA0KICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGN1cnJlbnRSZWdpb24NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgY2FsY0NvbG9yOiBmdW5jdGlvbiAoc3RhY2tudW0sIHZhbHVlLCB2YWx1ZW51bSkgew0KICAgICAgICAgICAgdmFyIGNvbG9yTWFwRnVuY3Rpb24gPSB0aGlzLmNvbG9yTWFwRnVuY3Rpb24sDQogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywNCiAgICAgICAgICAgICAgICBjb2xvciwgbmV3Q29sb3I7DQoNCiAgICAgICAgICAgIGlmIChjb2xvck1hcEZ1bmN0aW9uICYmIChuZXdDb2xvciA9IGNvbG9yTWFwRnVuY3Rpb24odGhpcywgb3B0aW9ucywgdmFsdWVudW0sIHZhbHVlKSkpIHsNCiAgICAgICAgICAgICAgICBjb2xvciA9IG5ld0NvbG9yOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2tlZCkgew0KICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG9wdGlvbnMuZ2V0KCdzdGFja2VkQmFyQ29sb3InKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICh2YWx1ZSA8IDApID8gb3B0aW9ucy5nZXQoJ25lZ0JhckNvbG9yJykgOiBvcHRpb25zLmdldCgnYmFyQ29sb3InKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwICYmIG9wdGlvbnMuZ2V0KCd6ZXJvQ29sb3InKSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gb3B0aW9ucy5nZXQoJ3plcm9Db2xvcicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAkLmlzQXJyYXkoY29sb3IpID8gY29sb3Jbc3RhY2tudW0gJSBjb2xvci5sZW5ndGhdIDogY29sb3I7DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIFJlbmRlciBiYXIocykgZm9yIGEgcmVnaW9uDQogICAgICAgICAqLw0KICAgICAgICByZW5kZXJSZWdpb246IGZ1bmN0aW9uICh2YWx1ZW51bSwgaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMudmFsdWVzW3ZhbHVlbnVtXSwNCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLA0KICAgICAgICAgICAgICAgIHhheGlzT2Zmc2V0ID0gdGhpcy54YXhpc09mZnNldCwNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXSwNCiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMucmFuZ2UsDQogICAgICAgICAgICAgICAgc3RhY2tlZCA9IHRoaXMuc3RhY2tlZCwNCiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCwNCiAgICAgICAgICAgICAgICB4ID0gdmFsdWVudW0gKiB0aGlzLnRvdGFsQmFyV2lkdGgsDQogICAgICAgICAgICAgICAgY2FudmFzSGVpZ2h0RWYgPSB0aGlzLmNhbnZhc0hlaWdodEVmLA0KICAgICAgICAgICAgICAgIHlvZmZzZXQgPSB0aGlzLnlvZmZzZXQsDQogICAgICAgICAgICAgICAgeSwgaGVpZ2h0LCBjb2xvciwgaXNOdWxsLCB5b2Zmc2V0TmVnLCBpLCB2YWxjb3VudCwgdmFsLCBtaW5QbG90dGVkLCBhbGxNaW47DQoNCiAgICAgICAgICAgIHZhbHMgPSAkLmlzQXJyYXkodmFscykgPyB2YWxzIDogW3ZhbHNdOw0KICAgICAgICAgICAgdmFsY291bnQgPSB2YWxzLmxlbmd0aDsNCiAgICAgICAgICAgIHZhbCA9IHZhbHNbMF07DQogICAgICAgICAgICBpc051bGwgPSBhbGwobnVsbCwgdmFscyk7DQogICAgICAgICAgICBhbGxNaW4gPSBhbGwoeGF4aXNPZmZzZXQsIHZhbHMsIHRydWUpOw0KDQogICAgICAgICAgICBpZiAoaXNOdWxsKSB7DQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KCdudWxsQ29sb3InKSkgew0KICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGhpZ2hsaWdodCA/IG9wdGlvbnMuZ2V0KCdudWxsQ29sb3InKSA6IHRoaXMuY2FsY0hpZ2hsaWdodENvbG9yKG9wdGlvbnMuZ2V0KCdudWxsQ29sb3InKSwgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgICAgIHkgPSAoeW9mZnNldCA+IDApID8geW9mZnNldCAtIDEgOiB5b2Zmc2V0Ow0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmRyYXdSZWN0KHgsIHksIHRoaXMuYmFyV2lkdGggLSAxLCAwLCBjb2xvciwgY29sb3IpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgeW9mZnNldE5lZyA9IHlvZmZzZXQ7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsY291bnQ7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhbCA9IHZhbHNbaV07DQoNCiAgICAgICAgICAgICAgICBpZiAoc3RhY2tlZCAmJiB2YWwgPT09IHhheGlzT2Zmc2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghYWxsTWluIHx8IG1pblBsb3R0ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIG1pblBsb3R0ZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChyYW5nZSA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihjYW52YXNIZWlnaHRFZiAqICgoTWF0aC5hYnModmFsIC0geGF4aXNPZmZzZXQpIC8gcmFuZ2UpKSkgKyAxOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICh2YWwgPCB4YXhpc09mZnNldCB8fCAodmFsID09PSB4YXhpc09mZnNldCAmJiB5b2Zmc2V0ID09PSAwKSkgew0KICAgICAgICAgICAgICAgICAgICB5ID0geW9mZnNldE5lZzsNCiAgICAgICAgICAgICAgICAgICAgeW9mZnNldE5lZyArPSBoZWlnaHQ7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgeSA9IHlvZmZzZXQgLSBoZWlnaHQ7DQogICAgICAgICAgICAgICAgICAgIHlvZmZzZXQgLT0gaGVpZ2h0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuY2FsY0NvbG9yKGksIHZhbCwgdmFsdWVudW0pOw0KICAgICAgICAgICAgICAgIGlmIChoaWdobGlnaHQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvciwgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRhcmdldC5kcmF3UmVjdCh4ICogdGhpcy54U2NhbGUsIHksICh0aGlzLmJhcldpZHRoIC0gMSkgKiB0aGlzLnhTY2FsZSwgaGVpZ2h0IC0gMSwgY29sb3IsIGNvbG9yKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMSkgew0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbMF07DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICB9DQogICAgfSk7DQoNCg0KICAgIC8qKg0KICAgICAqIFN0YWNrIGNoYXJ0cw0KICAgICAqLw0KICAgICQuZm4uc3BhcmtsaW5lLnN0YWNrID0gc3RhY2sgPSBjcmVhdGVDbGFzcygkLmZuLnNwYXJrbGluZS5fYmFzZSwgew0KICAgICAgICB0eXBlOiAnc3RhY2snLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgICAgICB2YXIgdG90YWwgPSAwLCBpOw0KDQogICAgICAgICAgICBzdGFjay5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsIGVsLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpOw0KDQogICAgICAgICAgICB0aGlzLnNoYXBlcyA9IHt9OyAvLyBtYXAgc2hhcGUgaWRzIHRvIHZhbHVlIG9mZnNldHMNCiAgICAgICAgICAgIHRoaXMudmFsdWVTaGFwZXMgPSB7fTsgLy8gbWFwcyB2YWx1ZSBvZmZzZXRzIHRvIHNoYXBlIGlkcw0KICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXMgPSAkLm1hcCh2YWx1ZXMsIE51bWJlcik7DQoNCiAgICAgICAgICAgIHRoaXMuaW5pdFRhcmdldCgpOw0KDQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3dpZHRoJykgPT09ICdhdXRvJykgew0KICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmhlaWdodDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgZm9yIChpID0gdmFsdWVzLmxlbmd0aDsgaS0tOykgew0KICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB2YWx1ZXNbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsOw0KDQogICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuY2FudmFzSGVpZ2h0ICogdGhpcy50YXJnZXQuZGV2aWNlUGl4ZWxSYXRpbzsNCiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoICogdGhpcy50YXJnZXQuZGV2aWNlUGl4ZWxSYXRpbzsNCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRSZWdpb246IGZ1bmN0aW9uIChlbCwgeCwgeSkgew0KICAgICAgICAgICAgdmFyIHNoYXBlaWQgPSB0aGlzLnRhcmdldC5nZXRTaGFwZUF0KGVsLCB4ICogdGhpcy50YXJnZXQucmF0aW8sIHkgKiB0aGlzLnRhcmdldC5yYXRpbyk7DQogICAgICAgICAgICByZXR1cm4gKHNoYXBlaWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNoYXBlc1tzaGFwZWlkXSAhPT0gdW5kZWZpbmVkKSA/IHRoaXMuc2hhcGVzW3NoYXBlaWRdIDogdW5kZWZpbmVkOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldEN1cnJlbnRSZWdpb25GaWVsZHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBjdXJyZW50UmVnaW9uID0gdGhpcy5jdXJyZW50UmVnaW9uOw0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICBpc051bGw6IHRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dID09PSB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dLA0KICAgICAgICAgICAgICAgIHBlcmNlbnQ6IHRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dIC8gdGhpcy50b3RhbCAqIDEwMCwNCiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5vcHRpb25zLmdldCgnc2xpY2VDb2xvcnMnKVtjdXJyZW50UmVnaW9uICUgdGhpcy5vcHRpb25zLmdldCgnc2xpY2VDb2xvcnMnKS5sZW5ndGhdLA0KICAgICAgICAgICAgICAgIG9mZnNldDogY3VycmVudFJlZ2lvbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgfSwNCg0KICAgICAgICBjaGFuZ2VIaWdobGlnaHQ6IGZ1bmN0aW9uIChoaWdobGlnaHQpIHsNCiAgICAgICAgICAgIHZhciBjdXJyZW50UmVnaW9uID0gdGhpcy5jdXJyZW50UmVnaW9uLA0KICAgICAgICAgICAgICAgICBuZXdzbGljZSA9IHRoaXMucmVuZGVyU2xpY2UoY3VycmVudFJlZ2lvbiwgaGlnaGxpZ2h0KSwNCiAgICAgICAgICAgICAgICAgc2hhcGVpZCA9IHRoaXMudmFsdWVTaGFwZXNbY3VycmVudFJlZ2lvbl07DQogICAgICAgICAgICBkZWxldGUgdGhpcy5zaGFwZXNbc2hhcGVpZF07DQogICAgICAgICAgICB0aGlzLnRhcmdldC5yZXBsYWNlV2l0aFNoYXBlKHNoYXBlaWQsIG5ld3NsaWNlKTsNCiAgICAgICAgICAgIHRoaXMudmFsdWVTaGFwZXNbY3VycmVudFJlZ2lvbl0gPSBuZXdzbGljZS5pZDsNCiAgICAgICAgICAgIHRoaXMuc2hhcGVzW25ld3NsaWNlLmlkXSA9IGN1cnJlbnRSZWdpb247DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVuZGVyU2xpY2U6IGZ1bmN0aW9uICh2YWx1ZW51bSwgaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQsDQogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywNCiAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCwNCiAgICAgICAgICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGgsDQogICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy52YWx1ZXMsDQogICAgICAgICAgICAgICAgdG90YWwgPSB0aGlzLnRvdGFsLA0KICAgICAgICAgICAgICAgIHN0YXJ0ID0gMCwNCiAgICAgICAgICAgICAgICBlbmQgPSAwLA0KICAgICAgICAgICAgICAgIGksIHZsZW4sIGNvbG9yOw0KDQogICAgICAgICAgICB2bGVuID0gdmFsdWVzLmxlbmd0aDsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2bGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBzdGFydCA9IGVuZDsNCiAgICAgICAgICAgICAgICB2YXIgc2xpY2VXaWR0aCA9IE1hdGgucm91bmQodmFsdWVzW2ldICogd2lkdGggLyB0b3RhbCk7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlbnVtID09PSBpKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gb3B0aW9ucy5nZXQoJ3NsaWNlQ29sb3JzJylbaSAlIG9wdGlvbnMuZ2V0KCdzbGljZUNvbG9ycycpLmxlbmd0aF07DQogICAgICAgICAgICAgICAgICAgIGlmIChoaWdobGlnaHQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jYWxjSGlnaGxpZ2h0Q29sb3IoY29sb3IsIG9wdGlvbnMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZHJhd1JlY3Qoc3RhcnQsIDAsIHNsaWNlV2lkdGgsIGhlaWdodCwgdW5kZWZpbmVkLCBjb2xvcik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVuZCArPSBzbGljZVdpZHRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0LA0KICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRoaXMudmFsdWVzLA0KICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsDQogICAgICAgICAgICAgICAgYm9yZGVyV2lkdGggPSBvcHRpb25zLmdldCgnYm9yZGVyV2lkdGgnKSwNCiAgICAgICAgICAgICAgICBzaGFwZSwgaTsNCg0KICAgICAgICAgICAgaWYgKCFzdGFjay5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSkgeyAvLyBkb24ndCByZW5kZXIgemVybyB2YWx1ZXMNCiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSB0aGlzLnJlbmRlclNsaWNlKGkpLmFwcGVuZCgpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU2hhcGVzW2ldID0gc2hhcGUuaWQ7IC8vIHN0b3JlIGp1c3QgdGhlIHNoYXBlaWQNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGUuaWRdID0gaTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0YXJnZXQucmVuZGVyKCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIC8qKg0KICAgICAqIFRyaXN0YXRlIGNoYXJ0cw0KICAgICAqLw0KICAgICQuZm4uc3BhcmtsaW5lLnRyaXN0YXRlID0gdHJpc3RhdGUgPSBjcmVhdGVDbGFzcygkLmZuLnNwYXJrbGluZS5fYmFzZSwgYmFySGlnaGxpZ2h0TWl4aW4sIHsNCiAgICAgICAgdHlwZTogJ3RyaXN0YXRlJywNCg0KICAgICAgICBpbml0OiBmdW5jdGlvbiAoZWwsIHZhbHVlcywgb3B0aW9ucywgd2lkdGgsIGhlaWdodCkgew0KICAgICAgICAgICAgdmFyIGJhcldpZHRoID0gcGFyc2VJbnQob3B0aW9ucy5nZXQoJ2JhcldpZHRoJyksIDEwKSwNCiAgICAgICAgICAgICAgICBiYXJTcGFjaW5nID0gcGFyc2VJbnQob3B0aW9ucy5nZXQoJ2JhclNwYWNpbmcnKSwgMTApOw0KICAgICAgICAgICAgdHJpc3RhdGUuX3N1cGVyLmluaXQuY2FsbCh0aGlzLCBlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KTsNCg0KICAgICAgICAgICAgdGhpcy5pbml0VGFyZ2V0KCk7DQoNCiAgICAgICAgICAgIHRoaXMucmVnaW9uU2hhcGVzID0ge307DQogICAgICAgICAgICB0aGlzLmJhcldpZHRoID0gYmFyV2lkdGggKiB0aGlzLnRhcmdldC5kZXZpY2VQaXhlbFJhdGlvOw0KICAgICAgICAgICAgdGhpcy5iYXJTcGFjaW5nID0gYmFyU3BhY2luZyAqIHRoaXMudGFyZ2V0LmRldmljZVBpeGVsUmF0aW87DQogICAgICAgICAgICB0aGlzLnRvdGFsQmFyV2lkdGggPSAoYmFyV2lkdGggKyBiYXJTcGFjaW5nKSAqIHRoaXMudGFyZ2V0LmRldmljZVBpeGVsUmF0aW87DQogICAgICAgICAgICB0aGlzLnZhbHVlcyA9ICQubWFwKHZhbHVlcywgTnVtYmVyKTsNCiAgICAgICAgICAgIHZhciByYXdXaWR0aCA9ICh2YWx1ZXMubGVuZ3RoICogYmFyV2lkdGggKiB0aGlzLnRhcmdldC5kZXZpY2VQaXhlbFJhdGlvKSArICgodmFsdWVzLmxlbmd0aCAtIDEpICogYmFyU3BhY2luZyAqIHRoaXMudGFyZ2V0LmRldmljZVBpeGVsUmF0aW8pOw0KICAgICAgICAgICAgdGhpcy54U2NhbGUgPSBNYXRoLm1pbigxLCByYXdXaWR0aCA/IHdpZHRoICogdGhpcy50YXJnZXQuZGV2aWNlUGl4ZWxSYXRpbyAvIHJhd1dpZHRoIDogMSk7DQogICAgICAgICAgICB0aGlzLndpZHRoID0gcmF3V2lkdGggKiB0aGlzLnhTY2FsZTsgDQoNCiAgICAgICAgICAgIHRoaXMuaW5pdENvbG9yTWFwKCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0UmVnaW9uOiBmdW5jdGlvbiAoZWwsIHgsIHkpIHsNCiAgICAgICAgICAgIHggLz0gdGhpcy54U2NhbGU7DQogICAgICAgICAgICB2YXIgcmVzdWx0ID0gTWF0aC5mbG9vcih4ICogdGhpcy50YXJnZXQucmF0aW8gLyB0aGlzLnRvdGFsQmFyV2lkdGgpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPCAwIHx8IHJlc3VsdCA+PSB0aGlzLnZhbHVlcy5sZW5ndGgpID8gdW5kZWZpbmVkIDogcmVzdWx0Ow0KICAgICAgICB9LA0KDQogICAgICAgIGdldEN1cnJlbnRSZWdpb25GaWVsZHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBjdXJyZW50UmVnaW9uID0gdGhpcy5jdXJyZW50UmVnaW9uOw0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICBpc051bGw6IHRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dID09PSB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dLA0KICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNhbGNDb2xvcih0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXSwgY3VycmVudFJlZ2lvbiksDQogICAgICAgICAgICAgICAgb2Zmc2V0OiBjdXJyZW50UmVnaW9uDQogICAgICAgICAgICB9Ow0KICAgICAgICB9LA0KDQogICAgICAgIGNhbGNDb2xvcjogZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZW51bSkgew0KICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsDQogICAgICAgICAgICAgICAgY29sb3JNYXBGdW5jdGlvbiA9IHRoaXMuY29sb3JNYXBGdW5jdGlvbiwNCiAgICAgICAgICAgICAgICBjb2xvciwgbmV3Q29sb3I7DQoNCiAgICAgICAgICAgIGlmIChjb2xvck1hcEZ1bmN0aW9uICYmIChuZXdDb2xvciA9IGNvbG9yTWFwRnVuY3Rpb24odGhpcywgb3B0aW9ucywgdmFsdWVudW0sIHZhbHVlKSkpIHsNCiAgICAgICAgICAgICAgICBjb2xvciA9IG5ld0NvbG9yOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8IDApIHsNCiAgICAgICAgICAgICAgICBjb2xvciA9IG9wdGlvbnMuZ2V0KCduZWdCYXJDb2xvcicpOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDApIHsNCiAgICAgICAgICAgICAgICBjb2xvciA9IG9wdGlvbnMuZ2V0KCdwb3NCYXJDb2xvcicpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBjb2xvciA9IG9wdGlvbnMuZ2V0KCd6ZXJvQmFyQ29sb3InKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBjb2xvcjsNCiAgICAgICAgfSwNCg0KICAgICAgICByZW5kZXJSZWdpb246IGZ1bmN0aW9uICh2YWx1ZW51bSwgaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXMsDQogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywNCiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCwNCiAgICAgICAgICAgICAgICBjYW52YXNIZWlnaHQsIGhlaWdodCwgaGFsZkhlaWdodCwNCiAgICAgICAgICAgICAgICB4LCB5LCBjb2xvcjsNCg0KICAgICAgICAgICAgY2FudmFzSGVpZ2h0ID0gdGFyZ2V0LnBpeGVsSGVpZ2h0Ow0KICAgICAgICAgICAgaGFsZkhlaWdodCA9IE1hdGgucm91bmQoY2FudmFzSGVpZ2h0IC8gMik7DQoNCiAgICAgICAgICAgIHggPSB2YWx1ZW51bSAqIHRoaXMudG90YWxCYXJXaWR0aDsNCiAgICAgICAgICAgIGlmICh2YWx1ZXNbdmFsdWVudW1dIDwgMCkgew0KICAgICAgICAgICAgICAgIHkgPSBoYWxmSGVpZ2h0Ow0KICAgICAgICAgICAgICAgIGhlaWdodCA9IGhhbGZIZWlnaHQgLSAxOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXNbdmFsdWVudW1dID4gMCkgew0KICAgICAgICAgICAgICAgIHkgPSAwOw0KICAgICAgICAgICAgICAgIGhlaWdodCA9IGhhbGZIZWlnaHQgLSAxOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB5ID0gaGFsZkhlaWdodCAtIDE7DQogICAgICAgICAgICAgICAgaGVpZ2h0ID0gMjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jYWxjQ29sb3IodmFsdWVzW3ZhbHVlbnVtXSwgdmFsdWVudW0pOw0KICAgICAgICAgICAgaWYgKGNvbG9yID09PSBudWxsKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGhpZ2hsaWdodCkgew0KICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jYWxjSGlnaGxpZ2h0Q29sb3IoY29sb3IsIG9wdGlvbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kcmF3UmVjdCh4ICogdGhpcy54U2NhbGUsIHksICh0aGlzLmJhcldpZHRoIC0gMSkgKiB0aGlzLnhTY2FsZSwgaGVpZ2h0IC0gMSwgY29sb3IsIGNvbG9yKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQoNCiAgICAvKioNCiAgICAgKiBEaXNjcmV0ZSBjaGFydHMNCiAgICAgKi8NCiAgICAkLmZuLnNwYXJrbGluZS5kaXNjcmV0ZSA9IGRpc2NyZXRlID0gY3JlYXRlQ2xhc3MoJC5mbi5zcGFya2xpbmUuX2Jhc2UsIGJhckhpZ2hsaWdodE1peGluLCB7DQogICAgICAgIHR5cGU6ICdkaXNjcmV0ZScsDQoNCiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAgIGRpc2NyZXRlLl9zdXBlci5pbml0LmNhbGwodGhpcywgZWwsIHZhbHVlcywgb3B0aW9ucywgd2lkdGgsIGhlaWdodCk7DQoNCiAgICAgICAgICAgIHRoaXMuaW5pdFRhcmdldCgpOw0KDQogICAgICAgICAgICB0aGlzLnJlZ2lvblNoYXBlcyA9IHt9Ow0KICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXMgPSAkLm1hcCh2YWx1ZXMsIE51bWJlcik7DQogICAgICAgICAgICB0aGlzLm1pbiA9IE1hdGgubWluLmFwcGx5KE1hdGgsIHZhbHVlcyk7DQogICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIHZhbHVlcyk7DQogICAgICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5tYXggLSB0aGlzLm1pbjsNCiAgICAgICAgICAgIHdpZHRoID0gb3B0aW9ucy5nZXQoJ3dpZHRoJykgPT09ICdhdXRvJyA/IHZhbHVlcy5sZW5ndGggKiAyICogdGhpcy50YXJnZXQuZGV2aWNlUGl4ZWxSYXRpbyA6IHRoaXMud2lkdGg7DQogICAgICAgICAgICAvL2FkanVzdCB3aWR0aCBmb3IgcGl4ZWwgcmF0aW8NCiAgICAgICAgICAgIHdpZHRoID0gd2lkdGggKiB0aGlzLnRhcmdldC5kZXZpY2VQaXhlbFJhdGlvOw0KICAgICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOw0KICAgICAgICAgICAgdGhpcy5pbnRlcnZhbCA9IE1hdGguZmxvb3Iod2lkdGggLyB2YWx1ZXMubGVuZ3RoKTsNCiAgICAgICAgICAgIHRoaXMuaXRlbVdpZHRoID0gd2lkdGggLyB2YWx1ZXMubGVuZ3RoOw0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluJykgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VDbGlwJykgfHwgb3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNaW4nKSA8IHRoaXMubWluKSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWluID0gb3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNaW4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1heCcpICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlQ2xpcCcpIHx8IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWF4JykgPiB0aGlzLm1heCkpIHsNCiAgICAgICAgICAgICAgICB0aGlzLm1heCA9IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWF4Jyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnRhcmdldCkgew0KICAgICAgICAgICAgICAgIHRoaXMubGluZUhlaWdodCA9IG9wdGlvbnMuZ2V0KCdsaW5lSGVpZ2h0JykgPT09ICdhdXRvJyA/IE1hdGgucm91bmQodGhpcy5jYW52YXNIZWlnaHQgKiAwLjMpIDogb3B0aW9ucy5nZXQoJ2xpbmVIZWlnaHQnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRSZWdpb246IGZ1bmN0aW9uIChlbCwgeCwgeSkgew0KICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoeCAqIHRoaXMudGFyZ2V0LnJhdGlvIC8gdGhpcy5pdGVtV2lkdGgpOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldEN1cnJlbnRSZWdpb25GaWVsZHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBjdXJyZW50UmVnaW9uID0gdGhpcy5jdXJyZW50UmVnaW9uOw0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICBpc051bGw6IHRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dID09PSB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVzW2N1cnJlbnRSZWdpb25dLA0KICAgICAgICAgICAgICAgIG9mZnNldDogY3VycmVudFJlZ2lvbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZW5kZXJSZWdpb246IGZ1bmN0aW9uICh2YWx1ZW51bSwgaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXMsDQogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywNCiAgICAgICAgICAgICAgICBtaW4gPSB0aGlzLm1pbiwNCiAgICAgICAgICAgICAgICBtYXggPSB0aGlzLm1heCwNCiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMucmFuZ2UsDQogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSB0aGlzLmludGVydmFsLA0KICAgICAgICAgICAgICAgIHRhcmdldCA9IHRoaXMudGFyZ2V0LA0KICAgICAgICAgICAgICAgIGNhbnZhc0hlaWdodCA9IHRoaXMuY2FudmFzSGVpZ2h0LA0KICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQgPSB0aGlzLmxpbmVIZWlnaHQsDQogICAgICAgICAgICAgICAgcGhlaWdodCA9IGNhbnZhc0hlaWdodCAtIGxpbmVIZWlnaHQsDQogICAgICAgICAgICAgICAgeXRvcCwgdmFsLCBjb2xvciwgeDsNCg0KICAgICAgICAgICAgdmFsID0gY2xpcHZhbCh2YWx1ZXNbdmFsdWVudW1dLCBtaW4sIG1heCk7DQogICAgICAgICAgICB4ID0gdmFsdWVudW0gKiBpbnRlcnZhbDsNCiAgICAgICAgICAgIHl0b3AgPSBNYXRoLnJvdW5kKHBoZWlnaHQgLSBwaGVpZ2h0ICogKCh2YWwgLSBtaW4pIC8gcmFuZ2UpKTsNCiAgICAgICAgICAgIGNvbG9yID0gKG9wdGlvbnMuZ2V0KCd0aHJlc2hvbGRDb2xvcicpICYmIHZhbCA8IG9wdGlvbnMuZ2V0KCd0aHJlc2hvbGRWYWx1ZScpKSA/IG9wdGlvbnMuZ2V0KCd0aHJlc2hvbGRDb2xvcicpIDogb3B0aW9ucy5nZXQoJ2xpbmVDb2xvcicpOw0KICAgICAgICAgICAgaWYgKGhpZ2hsaWdodCkgew0KICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jYWxjSGlnaGxpZ2h0Q29sb3IoY29sb3IsIG9wdGlvbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kcmF3TGluZSh4LCB5dG9wLCB4LCB5dG9wICsgbGluZUhlaWdodCwgY29sb3IpOw0KICAgICAgICB9DQogICAgfSk7DQoNCg0KICAgIC8qKg0KICAgICAqIEJ1bGxldCBjaGFydHMNCiAgICAgKi8NCiAgICAkLmZuLnNwYXJrbGluZS5idWxsZXQgPSBidWxsZXQgPSBjcmVhdGVDbGFzcygkLmZuLnNwYXJrbGluZS5fYmFzZSwgew0KICAgICAgICB0eXBlOiAnYnVsbGV0JywNCg0KICAgICAgICBpbml0OiBmdW5jdGlvbiAoZWwsIHZhbHVlcywgb3B0aW9ucywgd2lkdGgsIGhlaWdodCkgew0KICAgICAgICAgICAgdmFyIG1pbiwgbWF4LCB2YWxzOw0KICAgICAgICAgICAgYnVsbGV0Ll9zdXBlci5pbml0LmNhbGwodGhpcywgZWwsIHZhbHVlcywgb3B0aW9ucywgd2lkdGgsIGhlaWdodCk7DQoNCiAgICAgICAgICAgIC8vIHZhbHVlczogdGFyZ2V0LCBwZXJmb3JtYW5jZSwgcmFuZ2UxLCByYW5nZTIsIHJhbmdlMw0KICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXMgPSBub3JtYWxpemVWYWx1ZXModmFsdWVzKTsNCiAgICAgICAgICAgIC8vIHRhcmdldCBvciBwZXJmb3JtYW5jZSBjb3VsZCBiZSBudWxsDQogICAgICAgICAgICB2YWxzID0gdmFsdWVzLnNsaWNlKCk7DQogICAgICAgICAgICB2YWxzWzBdID0gdmFsc1swXSA9PT0gbnVsbCA/IHZhbHNbMl0gOiB2YWxzWzBdOw0KICAgICAgICAgICAgdmFsc1sxXSA9IHZhbHVlc1sxXSA9PT0gbnVsbCA/IHZhbHNbMl0gOiB2YWxzWzFdOw0KICAgICAgICAgICAgbWluID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgdmFsdWVzKTsNCiAgICAgICAgICAgIG1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIHZhbHVlcyk7DQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ2Jhc2UnKSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgbWluID0gbWluIDwgMCA/IG1pbiA6IDA7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIG1pbiA9IG9wdGlvbnMuZ2V0KCdiYXNlJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLm1pbiA9IG1pbjsNCiAgICAgICAgICAgIHRoaXMubWF4ID0gbWF4Ow0KICAgICAgICAgICAgdGhpcy5yYW5nZSA9IG1heCAtIG1pbjsNCgkJCQ0KCQkJLy8gR1JBRElFTlQNCgkJCXZhciBjb2xvcnMgPSBvcHRpb25zLmdldCgncmFuZ2VDb2xvcnMnKTsNCgkJCWlmIChvcHRpb25zLmdldCgnZ3JhZGllbnQnKSAmJiBjb2xvcnMubGVuZ3RoID4gMSkgew0KCQkJCXZhciByYWluYm93ID0gbmV3IFJhaW5ib3coKTsNCgkJCQlyYWluYm93LnNldFNwZWN0cnVtQnlBcnJheShjb2xvcnMpOw0KCQkJCXJhaW5ib3cuc2V0TnVtYmVyUmFuZ2UoMCwgdGhpcy52YWx1ZXMubGVuZ3RoKTsNCgkJCQkNCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCWNvbG9yc1tpXSA9IHJhaW5ib3cuY29sb3JBdChpKTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCXRoaXMucmFuZ2VDb2xvcnMgPSBjb2xvcnM7DQogICAgICAgICAgICB0aGlzLnNoYXBlcyA9IHt9Ow0KICAgICAgICAgICAgdGhpcy52YWx1ZVNoYXBlcyA9IHt9Ow0KICAgICAgICAgICAgdGhpcy5yZWdpb25kYXRhID0ge307DQogICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggPSBvcHRpb25zLmdldCgnd2lkdGgnKSA9PT0gJ2F1dG8nID8gJzQuMGVtJyA6IHdpZHRoOw0KICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLiRlbC5zaW1wbGVkcmF3KHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMuZ2V0KCdjb21wb3NpdGUnKSk7DQogICAgICAgICAgICBpZiAoIXZhbHVlcy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuaW5pdFRhcmdldCgpOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldFJlZ2lvbjogZnVuY3Rpb24gKGVsLCB4LCB5KSB7DQogICAgICAgICAgICB2YXIgc2hhcGVpZCA9IHRoaXMudGFyZ2V0LmdldFNoYXBlQXQoZWwsIHggKiB0aGlzLnRhcmdldC5yYXRpbywgeSAqIHRoaXMudGFyZ2V0LnJhdGlvKTsNCiAgICAgICAgICAgIHJldHVybiAoc2hhcGVpZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc2hhcGVzW3NoYXBlaWRdICE9PSB1bmRlZmluZWQpID8gdGhpcy5zaGFwZXNbc2hhcGVpZF0gOiB1bmRlZmluZWQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGN1cnJlbnRSZWdpb24gPSB0aGlzLmN1cnJlbnRSZWdpb247DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGZpZWxka2V5OiBjdXJyZW50UmVnaW9uLnN1YnN0cigwLCAxKSwNCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZXNbY3VycmVudFJlZ2lvbi5zdWJzdHIoMSldLA0KICAgICAgICAgICAgICAgIHJlZ2lvbjogY3VycmVudFJlZ2lvbg0KICAgICAgICAgICAgfTsNCiAgICAgICAgfSwNCg0KICAgICAgICBjaGFuZ2VIaWdobGlnaHQ6IGZ1bmN0aW9uIChoaWdobGlnaHQpIHsNCiAgICAgICAgICAgIHZhciBjdXJyZW50UmVnaW9uID0gdGhpcy5jdXJyZW50UmVnaW9uLA0KICAgICAgICAgICAgICAgIHNoYXBlaWQgPSB0aGlzLnZhbHVlU2hhcGVzW2N1cnJlbnRSZWdpb25dLA0KICAgICAgICAgICAgICAgIHNoYXBlOw0KICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2hhcGVzW3NoYXBlaWRdOw0KICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50UmVnaW9uLnN1YnN0cigwLCAxKSkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ3InOg0KICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IHRoaXMucmVuZGVyUmFuZ2UoY3VycmVudFJlZ2lvbi5zdWJzdHIoMSksIGhpZ2hsaWdodCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3AnOg0KICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IHRoaXMucmVuZGVyUGVyZm9ybWFuY2UoaGlnaGxpZ2h0KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAndCc6DQogICAgICAgICAgICAgICAgICAgIHNoYXBlID0gdGhpcy5yZW5kZXJUYXJnZXQoaGlnaGxpZ2h0KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnZhbHVlU2hhcGVzW2N1cnJlbnRSZWdpb25dID0gc2hhcGUuaWQ7DQogICAgICAgICAgICB0aGlzLnNoYXBlc1tzaGFwZS5pZF0gPSBjdXJyZW50UmVnaW9uOw0KICAgICAgICAgICAgdGhpcy50YXJnZXQucmVwbGFjZVdpdGhTaGFwZShzaGFwZWlkLCBzaGFwZSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVuZGVyUmFuZ2U6IGZ1bmN0aW9uIChybiwgaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgcmFuZ2V2YWwgPSB0aGlzLnZhbHVlc1tybl0sDQogICAgICAgICAgICAgICAgcmFuZ2V3aWR0aCA9IE1hdGgucm91bmQodGhpcy5jYW52YXNXaWR0aCAqICgocmFuZ2V2YWwgLSB0aGlzLm1pbikgLyB0aGlzLnJhbmdlKSksDQogICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLnJhbmdlQ29sb3JzW3JuIC0gMl07DQogICAgICAgICAgICBpZiAoaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvciwgdGhpcy5vcHRpb25zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhcmdldC5kcmF3UmVjdCgwLCAwLCByYW5nZXdpZHRoIC0gMSwgdGhpcy5jYW52YXNIZWlnaHQgLSAxLCBjb2xvciwgY29sb3IpOw0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlclBlcmZvcm1hbmNlOiBmdW5jdGlvbiAoaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgcGVyZnZhbCA9IHRoaXMudmFsdWVzWzFdLA0KICAgICAgICAgICAgICAgIHBlcmZ3aWR0aCA9IE1hdGgucm91bmQodGhpcy5jYW52YXNXaWR0aCAqICgocGVyZnZhbCAtIHRoaXMubWluKSAvIHRoaXMucmFuZ2UpKSwNCiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMub3B0aW9ucy5nZXQoJ3BlcmZvcm1hbmNlQ29sb3InKTsNCiAgICAgICAgICAgIGlmIChoaWdobGlnaHQpIHsNCiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuY2FsY0hpZ2hsaWdodENvbG9yKGNvbG9yLCB0aGlzLm9wdGlvbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0LmRyYXdSZWN0KDAsIE1hdGgucm91bmQodGhpcy5jYW52YXNIZWlnaHQgKiAwLjMpLCBwZXJmd2lkdGggLSAxLA0KICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5jYW52YXNIZWlnaHQgKiAwLjQpIC0gMSwgY29sb3IsIGNvbG9yKTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uIChoaWdobGlnaHQpIHsNCiAgICAgICAgICAgIHZhciB0YXJnZXR2YWwgPSB0aGlzLnZhbHVlc1swXSwNCiAgICAgICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCh0aGlzLmNhbnZhc1dpZHRoICogKCh0YXJnZXR2YWwgLSB0aGlzLm1pbikgLyB0aGlzLnJhbmdlKSAtICh0aGlzLm9wdGlvbnMuZ2V0KCd0YXJnZXRXaWR0aCcpIC8gMikpLA0KICAgICAgICAgICAgICAgIHRhcmdldHRvcCA9IE1hdGgucm91bmQodGhpcy5jYW52YXNIZWlnaHQgKiAwLjEwKSwNCiAgICAgICAgICAgICAgICB0YXJnZXRoZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodCAtICh0YXJnZXR0b3AgKiAyKSwNCiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMub3B0aW9ucy5nZXQoJ3RhcmdldENvbG9yJyk7DQogICAgICAgICAgICBpZiAoaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvciwgdGhpcy5vcHRpb25zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhcmdldC5kcmF3UmVjdCh4LCB0YXJnZXR0b3AsIHRoaXMub3B0aW9ucy5nZXQoJ3RhcmdldFdpZHRoJykgLSAxLCB0YXJnZXRoZWlnaHQgLSAxLCBjb2xvciwgY29sb3IpOw0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHZsZW4gPSB0aGlzLnZhbHVlcy5sZW5ndGgsDQogICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQsDQogICAgICAgICAgICAgICAgaSwgc2hhcGU7DQogICAgICAgICAgICBpZiAoIWJ1bGxldC5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgdmxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgc2hhcGUgPSB0aGlzLnJlbmRlclJhbmdlKGkpLmFwcGVuZCgpOw0KICAgICAgICAgICAgICAgIHRoaXMuc2hhcGVzW3NoYXBlLmlkXSA9ICdyJyArIGk7DQogICAgICAgICAgICAgICAgdGhpcy52YWx1ZVNoYXBlc1sncicgKyBpXSA9IHNoYXBlLmlkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzWzFdICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgc2hhcGUgPSB0aGlzLnJlbmRlclBlcmZvcm1hbmNlKCkuYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGUuaWRdID0gJ3AxJzsNCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU2hhcGVzLnAxID0gc2hhcGUuaWQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy52YWx1ZXNbMF0gIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICBzaGFwZSA9IHRoaXMucmVuZGVyVGFyZ2V0KCkuYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGUuaWRdID0gJ3QwJzsNCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU2hhcGVzLnQwID0gc2hhcGUuaWQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0YXJnZXQucmVuZGVyKCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KDQogICAgLyoqDQogICAgICogUGllIGNoYXJ0cw0KICAgICAqLw0KICAgICQuZm4uc3BhcmtsaW5lLnBpZSA9IHBpZSA9IGNyZWF0ZUNsYXNzKCQuZm4uc3BhcmtsaW5lLl9iYXNlLCB7DQogICAgICAgIHR5cGU6ICdwaWUnLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgICAgICB2YXIgdG90YWwgPSAwLCBpOw0KDQogICAgICAgICAgICBwaWUuX3N1cGVyLmluaXQuY2FsbCh0aGlzLCBlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KTsNCg0KICAgICAgICAgICAgdGhpcy5zaGFwZXMgPSB7fTsgLy8gbWFwIHNoYXBlIGlkcyB0byB2YWx1ZSBvZmZzZXRzDQogICAgICAgICAgICB0aGlzLnZhbHVlU2hhcGVzID0ge307IC8vIG1hcHMgdmFsdWUgb2Zmc2V0cyB0byBzaGFwZSBpZHMNCiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzID0gJC5tYXAodmFsdWVzLCBOdW1iZXIpOw0KDQogICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3dpZHRoJykgPT09ICdhdXRvJykgew0KICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmhlaWdodDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgZm9yIChpID0gdmFsdWVzLmxlbmd0aDsgaS0tOykgew0KICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB2YWx1ZXNbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsOw0KICAgICAgICAgICAgdGhpcy5pbml0VGFyZ2V0KCk7DQogICAgICAgICAgICB0aGlzLnJhZGl1cyA9IE1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5jYW52YXNXaWR0aCwgdGhpcy5jYW52YXNIZWlnaHQpIC8gMik7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0UmVnaW9uOiBmdW5jdGlvbiAoZWwsIHgsIHkpIHsNCiAgICAgICAgICAgIHZhciBzaGFwZWlkID0gdGhpcy50YXJnZXQuZ2V0U2hhcGVBdChlbCwgeCAqIHRoaXMudGFyZ2V0LnJhdGlvLCB5ICogdGhpcy50YXJnZXQucmF0aW8pOw0KICAgICAgICAgICAgcmV0dXJuIChzaGFwZWlkICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zaGFwZXNbc2hhcGVpZF0gIT09IHVuZGVmaW5lZCkgPyB0aGlzLnNoYXBlc1tzaGFwZWlkXSA6IHVuZGVmaW5lZDsNCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRDdXJyZW50UmVnaW9uRmllbGRzOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgY3VycmVudFJlZ2lvbiA9IHRoaXMuY3VycmVudFJlZ2lvbjsNCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgaXNOdWxsOiB0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXSA9PT0gdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXSwNCiAgICAgICAgICAgICAgICBwZXJjZW50OiB0aGlzLnZhbHVlc1tjdXJyZW50UmVnaW9uXSAvIHRoaXMudG90YWwgKiAxMDAsDQogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5nZXQoJ3NsaWNlQ29sb3JzJylbY3VycmVudFJlZ2lvbiAlIHRoaXMub3B0aW9ucy5nZXQoJ3NsaWNlQ29sb3JzJykubGVuZ3RoXSwNCiAgICAgICAgICAgICAgICBvZmZzZXQ6IGN1cnJlbnRSZWdpb24NCiAgICAgICAgICAgIH07DQogICAgICAgIH0sDQoNCiAgICAgICAgY2hhbmdlSGlnaGxpZ2h0OiBmdW5jdGlvbiAoaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgY3VycmVudFJlZ2lvbiA9IHRoaXMuY3VycmVudFJlZ2lvbiwNCiAgICAgICAgICAgICAgICAgbmV3c2xpY2UgPSB0aGlzLnJlbmRlclNsaWNlKGN1cnJlbnRSZWdpb24sIGhpZ2hsaWdodCksDQogICAgICAgICAgICAgICAgIHNoYXBlaWQgPSB0aGlzLnZhbHVlU2hhcGVzW2N1cnJlbnRSZWdpb25dOw0KICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2hhcGVzW3NoYXBlaWRdOw0KICAgICAgICAgICAgdGhpcy50YXJnZXQucmVwbGFjZVdpdGhTaGFwZShzaGFwZWlkLCBuZXdzbGljZSk7DQogICAgICAgICAgICB0aGlzLnZhbHVlU2hhcGVzW2N1cnJlbnRSZWdpb25dID0gbmV3c2xpY2UuaWQ7DQogICAgICAgICAgICB0aGlzLnNoYXBlc1tuZXdzbGljZS5pZF0gPSBjdXJyZW50UmVnaW9uOw0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlclNsaWNlOiBmdW5jdGlvbiAodmFsdWVudW0sIGhpZ2hsaWdodCkgew0KICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0LA0KICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsDQogICAgICAgICAgICAgICAgcmFkaXVzID0gdGhpcy5yYWRpdXMsDQogICAgICAgICAgICAgICAgYm9yZGVyV2lkdGggPSBvcHRpb25zLmdldCgnYm9yZGVyV2lkdGgnKSwNCiAgICAgICAgICAgICAgICBvZmZzZXQgPSBvcHRpb25zLmdldCgnb2Zmc2V0JyksDQogICAgICAgICAgICAgICAgY2lyY2xlID0gMiAqIE1hdGguUEksDQogICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy52YWx1ZXMsDQogICAgICAgICAgICAgICAgdG90YWwgPSB0aGlzLnRvdGFsLA0KICAgICAgICAgICAgICAgIG5leHQgPSBvZmZzZXQgPyAoMipNYXRoLlBJKSoob2Zmc2V0LzM2MCkgOiAwLA0KICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGksIHZsZW4sIGNvbG9yOw0KDQogICAgICAgICAgICB2bGVuID0gdmFsdWVzLmxlbmd0aDsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2bGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBzdGFydCA9IG5leHQ7DQogICAgICAgICAgICAgICAgZW5kID0gbmV4dDsNCiAgICAgICAgICAgICAgICBpZiAodG90YWwgPiAwKSB7ICAvLyBhdm9pZCBkaXZpZGUgYnkgemVybw0KICAgICAgICAgICAgICAgICAgICBlbmQgPSBuZXh0ICsgKGNpcmNsZSAqICh2YWx1ZXNbaV0gLyB0b3RhbCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAodmFsdWVudW0gPT09IGkpIHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBvcHRpb25zLmdldCgnc2xpY2VDb2xvcnMnKVtpICUgb3B0aW9ucy5nZXQoJ3NsaWNlQ29sb3JzJykubGVuZ3RoXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLmNhbGNIaWdobGlnaHRDb2xvcihjb2xvciwgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmRyYXdQaWVTbGljZShyYWRpdXMsIHJhZGl1cywgcmFkaXVzIC0gYm9yZGVyV2lkdGgsIHN0YXJ0LCBlbmQsIHVuZGVmaW5lZCwgY29sb3IpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0LA0KICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRoaXMudmFsdWVzLA0KICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsDQogICAgICAgICAgICAgICAgcmFkaXVzID0gdGhpcy5yYWRpdXMsDQogICAgICAgICAgICAgICAgYm9yZGVyV2lkdGggPSBvcHRpb25zLmdldCgnYm9yZGVyV2lkdGgnKSwNCiAgICAgICAgICAgICAgICBzaGFwZSwgaTsNCg0KICAgICAgICAgICAgaWYgKCFwaWUuX3N1cGVyLnJlbmRlci5jYWxsKHRoaXMpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGJvcmRlcldpZHRoKSB7DQogICAgICAgICAgICAgICAgdGFyZ2V0LmRyYXdDaXJjbGUocmFkaXVzLCByYWRpdXMsIE1hdGguZmxvb3IocmFkaXVzIC0gKGJvcmRlcldpZHRoIC8gMikpLA0KICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnYm9yZGVyQ29sb3InKSwgdW5kZWZpbmVkLCBib3JkZXJXaWR0aCkuYXBwZW5kKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGkgPSB2YWx1ZXMubGVuZ3RoOyBpLS07KSB7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSkgeyAvLyBkb24ndCByZW5kZXIgemVybyB2YWx1ZXMNCiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSB0aGlzLnJlbmRlclNsaWNlKGkpLmFwcGVuZCgpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU2hhcGVzW2ldID0gc2hhcGUuaWQ7IC8vIHN0b3JlIGp1c3QgdGhlIHNoYXBlaWQNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGUuaWRdID0gaTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0YXJnZXQucmVuZGVyKCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KDQogICAgLyoqDQogICAgICogQm94IHBsb3RzDQogICAgICovDQogICAgJC5mbi5zcGFya2xpbmUuYm94ID0gYm94ID0gY3JlYXRlQ2xhc3MoJC5mbi5zcGFya2xpbmUuX2Jhc2UsIHsNCiAgICAgICAgdHlwZTogJ2JveCcsDQoNCiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAgIGJveC5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsIGVsLCB2YWx1ZXMsIG9wdGlvbnMsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSAkLm1hcCh2YWx1ZXMsIE51bWJlcik7DQogICAgICAgICAgICB0aGlzLndpZHRoID0gb3B0aW9ucy5nZXQoJ3dpZHRoJykgPT09ICdhdXRvJyA/ICc0LjBlbScgOiB3aWR0aDsNCiAgICAgICAgICAgIHRoaXMuaW5pdFRhcmdldCgpOw0KICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlcy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogU2ltdWxhdGUgYSBzaW5nbGUgcmVnaW9uDQogICAgICAgICAqLw0KICAgICAgICBnZXRSZWdpb246IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldEN1cnJlbnRSZWdpb25GaWVsZHM6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbDQogICAgICAgICAgICAgICAgeyBmaWVsZDogJ2xxJywgdmFsdWU6IHRoaXMucXVhcnRpbGVzWzBdIH0sDQogICAgICAgICAgICAgICAgeyBmaWVsZDogJ21lZCcsIHZhbHVlOiB0aGlzLnF1YXJ0aWxlc1sxXSB9LA0KICAgICAgICAgICAgICAgIHsgZmllbGQ6ICd1cScsIHZhbHVlOiB0aGlzLnF1YXJ0aWxlc1syXSB9DQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgaWYgKHRoaXMubG91dGxpZXIgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZmllbGQ6ICdsbycsIHZhbHVlOiB0aGlzLmxvdXRsaWVyfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5yb3V0bGllciAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmaWVsZDogJ3JvJywgdmFsdWU6IHRoaXMucm91dGxpZXJ9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLmx3aGlza2VyICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZpZWxkOiAnbHcnLCB2YWx1ZTogdGhpcy5sd2hpc2tlcn0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMucndoaXNrZXIgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZmllbGQ6ICdydycsIHZhbHVlOiB0aGlzLnJ3aGlza2VyfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0LA0KICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRoaXMudmFsdWVzLA0KICAgICAgICAgICAgICAgIHZsZW4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsDQogICAgICAgICAgICAgICAgY2FudmFzV2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoLA0KICAgICAgICAgICAgICAgIGNhbnZhc0hlaWdodCA9IHRoaXMuY2FudmFzSGVpZ2h0LA0KICAgICAgICAgICAgICAgIG1pblZhbHVlID0gb3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNaW4nKSA9PT0gdW5kZWZpbmVkID8gTWF0aC5taW4uYXBwbHkoTWF0aCwgdmFsdWVzKSA6IG9wdGlvbnMuZ2V0KCdjaGFydFJhbmdlTWluJyksDQogICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBvcHRpb25zLmdldCgnY2hhcnRSYW5nZU1heCcpID09PSB1bmRlZmluZWQgPyBNYXRoLm1heC5hcHBseShNYXRoLCB2YWx1ZXMpIDogb3B0aW9ucy5nZXQoJ2NoYXJ0UmFuZ2VNYXgnKSwNCiAgICAgICAgICAgICAgICBjYW52YXNMZWZ0ID0gMCwNCiAgICAgICAgICAgICAgICBsd2hpc2tlciwgbG91dGxpZXIsIGlxciwgcTEsIHEyLCBxMywgcndoaXNrZXIsIHJvdXRsaWVyLCBpLA0KICAgICAgICAgICAgICAgIHNpemUsIHVuaXRTaXplLCB1bml0T2Zmc2V0Ow0KDQogICAgICAgICAgICBpZiAoIWJveC5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgncmF3JykpIHsNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3Nob3dPdXRsaWVycycpICYmIHZhbHVlcy5sZW5ndGggPiA1KSB7DQogICAgICAgICAgICAgICAgICAgIGxvdXRsaWVyID0gdmFsdWVzWzBdOw0KICAgICAgICAgICAgICAgICAgICBsd2hpc2tlciA9IHZhbHVlc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgcTEgPSB2YWx1ZXNbMl07DQogICAgICAgICAgICAgICAgICAgIHEyID0gdmFsdWVzWzNdOw0KICAgICAgICAgICAgICAgICAgICBxMyA9IHZhbHVlc1s0XTsNCiAgICAgICAgICAgICAgICAgICAgcndoaXNrZXIgPSB2YWx1ZXNbNV07DQogICAgICAgICAgICAgICAgICAgIHJvdXRsaWVyID0gdmFsdWVzWzZdOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGx3aGlza2VyID0gdmFsdWVzWzBdOw0KICAgICAgICAgICAgICAgICAgICBxMSA9IHZhbHVlc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgcTIgPSB2YWx1ZXNbMl07DQogICAgICAgICAgICAgICAgICAgIHEzID0gdmFsdWVzWzNdOw0KICAgICAgICAgICAgICAgICAgICByd2hpc2tlciA9IHZhbHVlc1s0XTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHZhbHVlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSk7DQogICAgICAgICAgICAgICAgcTEgPSBxdWFydGlsZSh2YWx1ZXMsIDEpOw0KICAgICAgICAgICAgICAgIHEyID0gcXVhcnRpbGUodmFsdWVzLCAyKTsNCiAgICAgICAgICAgICAgICBxMyA9IHF1YXJ0aWxlKHZhbHVlcywgMyk7DQogICAgICAgICAgICAgICAgaXFyID0gcTMgLSBxMTsNCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXQoJ3Nob3dPdXRsaWVycycpKSB7DQogICAgICAgICAgICAgICAgICAgIGx3aGlza2VyID0gcndoaXNrZXIgPSB1bmRlZmluZWQ7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2bGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsd2hpc2tlciA9PT0gdW5kZWZpbmVkICYmIHZhbHVlc1tpXSA+IHExIC0gKGlxciAqIG9wdGlvbnMuZ2V0KCdvdXRsaWVySVFSJykpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHdoaXNrZXIgPSB2YWx1ZXNbaV07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2ldIDwgcTMgKyAoaXFyICogb3B0aW9ucy5nZXQoJ291dGxpZXJJUVInKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByd2hpc2tlciA9IHZhbHVlc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBsb3V0bGllciA9IHZhbHVlc1swXTsNCiAgICAgICAgICAgICAgICAgICAgcm91dGxpZXIgPSB2YWx1ZXNbdmxlbiAtIDFdOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGx3aGlza2VyID0gdmFsdWVzWzBdOw0KICAgICAgICAgICAgICAgICAgICByd2hpc2tlciA9IHZhbHVlc1t2bGVuIC0gMV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5xdWFydGlsZXMgPSBbcTEsIHEyLCBxM107DQogICAgICAgICAgICB0aGlzLmx3aGlza2VyID0gbHdoaXNrZXI7DQogICAgICAgICAgICB0aGlzLnJ3aGlza2VyID0gcndoaXNrZXI7DQogICAgICAgICAgICB0aGlzLmxvdXRsaWVyID0gbG91dGxpZXI7DQogICAgICAgICAgICB0aGlzLnJvdXRsaWVyID0gcm91dGxpZXI7DQoNCiAgICAgICAgICAgIC8vIE5vbi16ZXJvIHVuaXQgb2Zmc2V0IGNhbiB0aHJvdyBvZmYgdGhlIHBsb3R0aW5nIGlmIGl0IGlzIG5vdA0KICAgICAgICAgICAgLy8gcmVxdWlyZWQgdG8gYXZvaWQgYSBkaXZpc2lvbiBieSB6ZXJvLg0KICAgICAgICAgICAgdW5pdE9mZnNldCA9IDAuMDsNCiAgICAgICAgICAgIGlmICggKCBtYXhWYWx1ZSAtIG1pblZhbHVlICkgPT0gMC4wICkgeyB1bml0T2Zmc2V0ID0gMS4wOyB9DQoNCiAgICAgICAgICAgIHVuaXRTaXplID0gY2FudmFzV2lkdGggLyAobWF4VmFsdWUgLSBtaW5WYWx1ZSArIHVuaXRPZmZzZXQgKTsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnc2hvd091dGxpZXJzJykpIHsNCiAgICAgICAgICAgICAgICBjYW52YXNMZWZ0ID0gTWF0aC5jZWlsKG9wdGlvbnMuZ2V0KCdzcG90UmFkaXVzJykpOw0KICAgICAgICAgICAgICAgIGNhbnZhc1dpZHRoIC09IDIgKiBNYXRoLmNlaWwob3B0aW9ucy5nZXQoJ3Nwb3RSYWRpdXMnKSk7DQogICAgICAgICAgICAgICAgdW5pdFNpemUgPSBjYW52YXNXaWR0aCAvIChtYXhWYWx1ZSAtIG1pblZhbHVlICsgdW5pdE9mZnNldCk7DQogICAgICAgICAgICAgICAgaWYgKGxvdXRsaWVyIDwgbHdoaXNrZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRyYXdDaXJjbGUoKGxvdXRsaWVyIC0gbWluVmFsdWUpICogdW5pdFNpemUgKyBjYW52YXNMZWZ0LA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzSGVpZ2h0IC8gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdzcG90UmFkaXVzJyksDQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnb3V0bGllckxpbmVDb2xvcicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ291dGxpZXJGaWxsQ29sb3InKSkuYXBwZW5kKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChyb3V0bGllciA+IHJ3aGlza2VyKSB7DQogICAgICAgICAgICAgICAgICAgIHRhcmdldC5kcmF3Q2lyY2xlKChyb3V0bGllciAtIG1pblZhbHVlKSAqIHVuaXRTaXplICsgY2FudmFzTGVmdCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc0hlaWdodCAvIDIsDQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnc3BvdFJhZGl1cycpLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ291dGxpZXJMaW5lQ29sb3InKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdvdXRsaWVyRmlsbENvbG9yJykpLmFwcGVuZCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gYm94DQogICAgICAgICAgICB0YXJnZXQuZHJhd1JlY3QoDQogICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgocTEgLSBtaW5WYWx1ZSkgKiB1bml0U2l6ZSArIGNhbnZhc0xlZnQpLA0KICAgICAgICAgICAgICAgIE1hdGgucm91bmQoY2FudmFzSGVpZ2h0ICogMC4xKSwNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKChxMyAtIHExKSAqIHVuaXRTaXplKSwNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAqIDAuOCksDQogICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ2JveExpbmVDb2xvcicpLA0KICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdib3hGaWxsQ29sb3InKSwNCiAgICAgICAgICAgICAgICAvLyBDVVNUT00gTU9EOiBsaW5lIHdpZHRoICYgY29ybmVyIHJhZGl1cw0KICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdsaW5lV2lkdGgnKSwNCiAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnY29ybmVyUmFkaXVzJykpLmFwcGVuZCgpOw0KICAgICAgICAgICAgLy8gbGVmdCB3aGlza2VyDQogICAgICAgICAgICAvLyBDVVNUT00gTU9EOiBzdHJpa2V0aHJvdWdoIG9wdGlvbg0KICAgICAgICAgICAgdmFyIHJpZ2h0RW5kID0gcTEgLSBtaW5WYWx1ZTsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLmdldCgnc3RyaWtlVGhyb3VnaCcpKQ0KICAgICAgICAgICAgICByaWdodEVuZCA9IHJ3aGlza2VyIC0gbWluVmFsdWU7DQoNCiAgICAgICAgICAgIHRhcmdldC5kcmF3TGluZSgNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKChsd2hpc2tlciAtIG1pblZhbHVlKSAqIHVuaXRTaXplICsgY2FudmFzTGVmdCksDQogICAgICAgICAgICAgICAgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgLyAyKSwNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHJpZ2h0RW5kICogdW5pdFNpemUgKyBjYW52YXNMZWZ0KSwNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAvIDIpLA0KICAgICAgICAgICAgICAgIC8vIENVU1RPTSBNT0Q6IGxpbmUgd2lkdGggYWRkZWQNCiAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnbGluZUNvbG9yJyksDQogICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ2xpbmVXaWR0aCcpKS5hcHBlbmQoKTsNCiAgICAgICAgICAgIHRhcmdldC5kcmF3TGluZSgNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKChsd2hpc2tlciAtIG1pblZhbHVlKSAqIHVuaXRTaXplICsgY2FudmFzTGVmdCksDQogICAgICAgICAgICAgICAgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgLyA0KSwNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKChsd2hpc2tlciAtIG1pblZhbHVlKSAqIHVuaXRTaXplICsgY2FudmFzTGVmdCksDQogICAgICAgICAgICAgICAgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgLSBjYW52YXNIZWlnaHQgLyA0KSwNCiAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnd2hpc2tlckNvbG9yJyksDQogICAgICAgICAgICAgICAgLy8gQ1VTVE9NIE1PRDogbGluZSB3aWR0aCBhZGRlZA0KICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCdsaW5lV2lkdGgnKSkuYXBwZW5kKCk7DQogICAgICAgICAgICAvLyByaWdodCB3aGlza2VyDQogICAgICAgICAgICAvLyBDVVNUT00gTU9EOiBzdHJpa2V0aHJvdWdoIG9wdGlvbg0KICAgICAgICAgICAgaWYgKCFvcHRpb25zLmdldCgnc3RyaWtlVGhyb3VnaCcpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICB0YXJnZXQuZHJhd0xpbmUoTWF0aC5yb3VuZCgocndoaXNrZXIgLSBtaW5WYWx1ZSkgKiB1bml0U2l6ZSArIGNhbnZhc0xlZnQpLA0KICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgLyAyKSwNCiAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHEzIC0gbWluVmFsdWUpICogdW5pdFNpemUgKyBjYW52YXNMZWZ0KSwNCiAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoY2FudmFzSGVpZ2h0IC8gMiksDQogICAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnbGluZUNvbG9yJyksDQogICAgICAgICAgICAgICAgICAvLyBDVVNUT00gTU9EOiBsaW5lIHdpZHRoIGFkZGVkDQogICAgICAgICAgICAgICAgICBvcHRpb25zLmdldCgnbGluZVdpZHRoJykpLmFwcGVuZCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGFyZ2V0LmRyYXdMaW5lKA0KICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHJ3aGlza2VyIC0gbWluVmFsdWUpICogdW5pdFNpemUgKyBjYW52YXNMZWZ0KSwNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAvIDQpLA0KICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHJ3aGlza2VyIC0gbWluVmFsdWUpICogdW5pdFNpemUgKyBjYW52YXNMZWZ0KSwNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAtIGNhbnZhc0hlaWdodCAvIDQpLA0KICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCd3aGlza2VyQ29sb3InKSwNCiAgICAgICAgICAgICAgICAvLyBDVVNUT00gTU9EOiBsaW5lIHdpZHRoIGFkZGVkDQogICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ2xpbmVXaWR0aCcpKS5hcHBlbmQoKTsNCg0KICAgICAgICAgICAgLy8gbWVkaWFuIGxpbmUNCiAgICAgICAgICAgIHRhcmdldC5kcmF3TGluZSgNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKChxMiAtIG1pblZhbHVlKSAqIHVuaXRTaXplICsgY2FudmFzTGVmdCksDQogICAgICAgICAgICAgICAgTWF0aC5yb3VuZChjYW52YXNIZWlnaHQgKiAwLjEpLA0KICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHEyIC0gbWluVmFsdWUpICogdW5pdFNpemUgKyBjYW52YXNMZWZ0KSwNCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAqIDAuOSksDQogICAgICAgICAgICAgICAgLy8gQ1VTVE9NIE1PRDogbWVkaWFud2lkdGggb3B0aW9uDQogICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ21lZGlhbkNvbG9yJyksDQogICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ21lZGlhbldpZHRoJykpLmFwcGVuZCgpOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmdldCgndGFyZ2V0JykgPT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgICAgICBzaXplID0gTWF0aC5jZWlsKG9wdGlvbnMuZ2V0KCdzcG90UmFkaXVzJykpOw0KICAgICAgICAgICAgICAgIC8vIENVU1RPTSBNT0Q6IGNpcmNsZSByZXByZXNlbnRhdGlvbiBvZiBtZWRpYW4NCiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0VmFsID0gb3B0aW9ucy5nZXQoJ3RhcmdldCcpOw0KICAgICAgICAgICAgICAgIHZhciB0YXJnZXRPYmogPSBvcHRpb25zLmdldCgndGFyZ2V0T2JqJykNCiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldE9iaiB8fCB0YXJnZXRPYmogPT0gJ2Nyb3NzaGFpcicpIHsNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRyYXdMaW5lKA0KICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgodGFyZ2V0VmFsIC0gbWluVmFsdWUpICogdW5pdFNpemUgKyBjYW52YXNMZWZ0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKGNhbnZhc0hlaWdodCAvIDIpIC0gc2l6ZSksDQogICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKCh0YXJnZXRWYWwgLSBtaW5WYWx1ZSkgKiB1bml0U2l6ZSArIGNhbnZhc0xlZnQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoY2FudmFzSGVpZ2h0IC8gMikgKyBzaXplKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCd0YXJnZXRDb2xvcicpKS5hcHBlbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRyYXdMaW5lKA0KICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgodGFyZ2V0VmFsIC0gbWluVmFsdWUpICogdW5pdFNpemUgKyBjYW52YXNMZWZ0IC0gc2l6ZSksDQogICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAvIDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgodGFyZ2V0VmFsIC0gbWluVmFsdWUpICogdW5pdFNpemUgKyBjYW52YXNMZWZ0ICsgc2l6ZSksDQogICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGNhbnZhc0hlaWdodCAvIDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ3RhcmdldENvbG9yJykpLmFwcGVuZCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXRPYmogPT0gJ2NpcmNsZScpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZHJhd0NpcmNsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXRWYWwgLSBtaW5WYWx1ZSkgKiB1bml0U2l6ZSArIGNhbnZhc0xlZnQsDQogICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNIZWlnaHQgLyAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ3Nwb3RSYWRpdXMnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KCd0YXJnZXRDb2xvcicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoJ3RhcmdldENvbG9yJykpLmFwcGVuZCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRhcmdldC5yZW5kZXIoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQoNCiAgLypqc2xpbnQgbm9tZW46IHRydWUsIHBsdXNwbHVzOiB0cnVlLCB0b2RvOiB0cnVlLCB3aGl0ZTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSAqLy8qKg0KICAgICAqIFRpbWVsaW5lIHNwYXJrbGluZSBjaGFydA0KICAgICAqIEdpdmVuIGEgbGlzdCBvZiBldmVudHMgd2l0aCBiZWdpbi9maW5pc2ggdGltZXMsIGdyYXBoIHRoZW0gdmVydGljYWxseSBvciBob3Jpem9udGFsbHkgYnkgZXZlbnQgdHlwZS4NCiAgICAgKiBsZXQgZXZlbnRzID0gWw0KICAgICAqICB7YmVnaW46ZGF0ZSgxMWEpLCBmaW5pc2g6ZGF0ZSgxMmEpLCBjb2xvcjoncmVkJ30sDQogICAgICogIHtiZWdpbjpkYXRlKDEyYSksIGZpbmlzaDpkYXRlKDFwKSwgY29sb3I6J2dyZWVuJ30sDQogICAgICogIHtiZWdpbjpkYXRlKDFwKSwgZmluaXNoOmRhdGUoNnApLCBjb2xvcjonYmx1ZSd9DQogICAgICogXQ0KICAgICAqIGxldCAxIHBpeGVsID0gMSBtaW51dGUNCiAgICAgKiBsZXQgOCBhbSBiZSB0aGUgc3BhcmtsaW5lIGJlZ2luDQogICAgICogbGV0IDggcG0gYmUgdGhlIHNwYXJrbGluZSBmaW5pc2ggDQogICAgICogbGV0IDcyMCBwaXhlbHMgYmUgdGhlIHRvdGFsIHZpc2libGUgZHVyYXRpb24NCiAgICAgKiB0aGVuIGdyYXBoIA0KICAgICAqICB8d2hpdGUgZm9yIDMwMCBwaXhlbHN8fHJlZCBmb3IgNjAgcGl4ZWxzfHxncmVlbiBmb3IgNjAgcGl4ZWxzfHxibHVlIGZvciAzMDAgcGl4ZWxzfHx3aGl0ZSBmb3IgMTIwIHBpeGVsc3wNCiAgICAgKi8NCjsoZnVuY3Rpb24gKCQpIHsNCg0KICAgICJ1c2Ugc3RyaWN0IjsNCg0KICAgICQuZm4uc3BhcmtsaW5lLnRpbWVsaW5lID0gdGltZWxpbmUgPSBjcmVhdGVDbGFzcygkLmZuLnNwYXJrbGluZS5fYmFzZSwgYmFySGlnaGxpZ2h0TWl4aW4sIHsNCg0KICAgICAgICB0eXBlOiAndGltZWxpbmUnLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlbCwgdmFsdWVzLCBvcHRpb25zLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgICAgICAvLyBleHBlY3QgYSBEYXRlIG9yIHRoZSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jDQogICAgICAgICAgICBmdW5jdGlvbiBtaW51dGVzKGRhdGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZSAvICg2MCAqIDEwMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gZm9yY2UgcG9zaXRpdmUgbnVtYmVyIG90aGVyd2lzZSAwDQogICAgICAgICAgICBmdW5jdGlvbiBmb3JjZVBvc2l0aXZlTnVtYmVyKHZhbCkgew0KICAgICAgICAgICAgICAgIHZhbCA9IE1hdGguYWJzKHZhbCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHZhbCkgPyAwIDogdmFsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGksIGRhdGEsIHNlZ21lbnQsIGJlZ2luTWludXRlcywgZmluaXNoTWludXRlcywgZHVyYXRpb25NaW51dGVzLCANCiAgICAgICAgICAgICAgICBwaXhlbHNQZXJNaW51dGUsIHVzZXJJbml0SGFuZGxlciwgdGltZU1hcmtQaXhlbHMsIGlzVmVydGljYWxPcmllbnRhdGlvbiwgDQogICAgICAgICAgICAgICAgdGltZU1hcmtJbnRlcnZhbCwgdGltZU1hcmtPZmZzZXQsIHRpbWVNYXJrLCB0aWNrLCB0aWNrU2l6ZTsNCiAgICAgICAgICAgIHRpbWVsaW5lLl9zdXBlci5pbml0LmNhbGwodGhpcywgZWwsIHZhbHVlcywgb3B0aW9ucywgd2lkdGgsIGhlaWdodCk7DQogICAgICAgICAgICAvLyByZXF1aXJlZCBieSBiYXJIaWdobGlnaHRNaXhpbg0KICAgICAgICAgICAgdGhpcy5yZWdpb25TaGFwZXMgPSB7fTsNCiAgICAgICAgICAgIC8vIHNldHMgY2FudmFzIGhlaWdodC93aWR0aA0KICAgICAgICAgICAgdGhpcy5pbml0VGFyZ2V0KCk7DQogICAgICAgICAgICAvLyBob2xkcyBlYWNoIHRpbWVsaW5lIGVudHJ5IHdpdGggeCx5LHcsaCxsYyxmYyxyZCB2YWx1ZXMNCiAgICAgICAgICAgIHRoaXMuc2VnbWVudHMgPSBbXTsNCiAgICAgICAgICAgIC8vIGhvbGRzIHRpbWUgbWFya2VycyBlbnRyeSB3aXRoIHgxLHkxLHgyLHkyLGxjLHcgdmFsdWVzDQogICAgICAgICAgICB0aGlzLnRpbWVtYXJrcyA9IFtdOw0KICAgICAgICAgICAgLy8gcGFpbnRzIGEgMXB4IGxpbmUgc2hvd2luZyBmdWxsIGxlbmd0aCBvZiB0aW1lbGluZQ0KICAgICAgICAgICAgdGltZU1hcmtJbnRlcnZhbCA9IGZvcmNlUG9zaXRpdmVOdW1iZXIob3B0aW9ucy5tZXJnZWRPcHRpb25zLnRpbWVNYXJrSW50ZXJ2YWwpOw0KICAgICAgICAgICAgLy8gb3JpZW50IHRoZSBzcGFya2xpbmUgZGlyZWN0aW9uLCB0aGUgZGVmYXVsdCBpcyBob3Jpem9udGFsDQogICAgICAgICAgICBpc1ZlcnRpY2FsT3JpZW50YXRpb24gPSAndmVydGljYWwnID09PSBvcHRpb25zLm1lcmdlZE9wdGlvbnMub3JpZW50YXRpb247DQogICAgICAgICAgICAvLyBhbGxvdyB1c2VyIHRvIG1hbmlwdWxhdGUgdGhlIGRhdGEgYmVmb3JlIHNlZ21lbnQgaXMgYnVpbHQNCiAgICAgICAgICAgIHVzZXJJbml0SGFuZGxlciA9ICQuaXNGdW5jdGlvbihvcHRpb25zLm1lcmdlZE9wdGlvbnMuaW5pdCkgPyBvcHRpb25zLm1lcmdlZE9wdGlvbnMuaW5pdCA6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkOyB9Ow0KICAgICAgICAgICAgZnVuY3Rpb24gb2Zmc2V0KGRhdGUsIGJhc2VsaW5lKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChwaXhlbHNQZXJNaW51dGUgKiAobWludXRlcyhkYXRlKSAtIGJhc2VsaW5lKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBzZWdtZW50cyB0aGF0IGZhbGwgb3V0c2lkZSBvZiBiZWdpbi9maW5pc2ggd2lsbCBiZSBjbGlwcGVkDQogICAgICAgICAgICBiZWdpbk1pbnV0ZXMgPSBtaW51dGVzKG9wdGlvbnMubWVyZ2VkT3B0aW9ucy5iZWdpbik7DQogICAgICAgICAgICBmaW5pc2hNaW51dGVzID0gbWludXRlcyhvcHRpb25zLm1lcmdlZE9wdGlvbnMuZmluaXNoKTsNCiAgICAgICAgICAgIGR1cmF0aW9uTWludXRlcyA9IChmaW5pc2hNaW51dGVzIC0gYmVnaW5NaW51dGVzKTsNCiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsT3JpZW50YXRpb24pIHsNCiAgICAgICAgICAgICAgICBwaXhlbHNQZXJNaW51dGUgPSAodGhpcy5jYW52YXNIZWlnaHQgLSAxKSAvIGR1cmF0aW9uTWludXRlczsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcGl4ZWxzUGVyTWludXRlID0gKHRoaXMuY2FudmFzV2lkdGggLSAxKSAvIGR1cmF0aW9uTWludXRlczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aW1lTWFya0ludGVydmFsID4gMCkgew0KICAgICAgICAgICAgICAgIHRpbWVNYXJrUGl4ZWxzID0gdGltZU1hcmtJbnRlcnZhbCAqIHBpeGVsc1Blck1pbnV0ZTsNCiAgICAgICAgICAgICAgICAvLyBhZGQgdGljayBtYXJrcyBiYXNlZCBvbiB0aW1lTWFya0ludGVydmFsDQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICgoZHVyYXRpb25NaW51dGVzICogcGl4ZWxzUGVyTWludXRlKSAvIHRpbWVNYXJrUGl4ZWxzKSArIDE7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB0aWNrID0ge3gxOiAwLCB5MTogMCwgeDI6IDAsIHkyOiAwLCBsYzonI2ZmMDAxMScsIHc6IDF9Ow0KICAgICAgICAgICAgICAgICAgICB0aW1lTWFyayA9IE1hdGgucm91bmQoaSAqIHRpbWVNYXJrUGl4ZWxzKTsNCiAgICAgICAgICAgICAgICAgICAgdGlja1NpemUgPSBNYXRoLmNlaWwodGltZU1hcmsgLyBwaXhlbHNQZXJNaW51dGUpICUgNjAgPT09IDAgPyAzIDogMTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmVydGljYWxPcmllbnRhdGlvbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGljay54MiA9IHRpY2tTaXplOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGljay55MSA9IHRpY2sueTIgPSB0aW1lTWFyazsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2sueTIgPSB0aWNrU2l6ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2sueDEgPSB0aWNrLngyID0gdGltZU1hcms7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lbWFya3MucHVzaCh0aWNrKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gYWRkIGxhc3QgdGljayBtYXJrIGFuZCB0aW1lbGluZQ0KICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsT3JpZW50YXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lbWFya3MucHVzaCh7eDE6MCwgeTE6MCwgeDI6MCwgeTI6dGhpcy5jYW52YXNIZWlnaHQsIGxjOicjZWVlJywgdzoxfSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lbWFya3MucHVzaCh7eDE6MCwgeTE6MCwgeDI6dGhpcy5jYW52YXNXaWR0aCwgeTI6MCwgbGM6JyNlZWUnLCB3OjF9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBidWlsZCBlYWNoIHNlZ21lbnQgZm9yIHJlbmRlcmluZw0KICAgICAgICAgICAgdGltZU1hcmtPZmZzZXQgPSAodGltZU1hcmtJbnRlcnZhbCA+IDApID8gMSA6IDA7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgLy8gVE9ETzogZGV0ZXJtaW5lIHdoeSB2YWx1ZXMgaGFzIGJvZ3VzIGxlbmd0aCB2YWx1ZSBpbiBJRTgNCiAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2ldKSB7DQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSB1c2VySW5pdEhhbmRsZXIodmFsdWVzW2ldLCBpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtaW51cyAyIGlzIHRvIHByZXZlbnQgY2xpcHBpbmcgdGhlIHNlZ21lbnQNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogdGltZU1hcmtPZmZzZXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHRpbWVNYXJrT2Zmc2V0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiB3aWR0aCAtICh0aW1lTWFya09mZnNldCArIDEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBoZWlnaHQgLSAodGltZU1hcmtPZmZzZXQgKyAxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YQ0KICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkanVzdCBzaGFwZSBzaXplIGZvciBvdmVybGFwcGluZyByZWdpb25zDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbE9yaWVudGF0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC55ID0gb2Zmc2V0KGRhdGEuYmVnaW4sIGJlZ2luTWludXRlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5oID0gb2Zmc2V0KGRhdGEuZmluaXNoLCBtaW51dGVzKGRhdGEuYmVnaW4pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC54ID0gb2Zmc2V0KGRhdGEuYmVnaW4sIGJlZ2luTWludXRlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC53ID0gb2Zmc2V0KGRhdGEuZmluaXNoLCBtaW51dGVzKGRhdGEuYmVnaW4pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuZmMgPSBkYXRhLmNvbG9yIHx8IG9wdGlvbnMubWVyZ2VkT3B0aW9ucy5maWxsQ29sb3I7DQogICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmxjID0gZGF0YS5saW5lQ29sb3IgfHwgb3B0aW9ucy5tZXJnZWRPcHRpb25zLmxpbmVDb2xvcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudHMucHVzaChzZWdtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gc29ydCB0aGUgc2VnbWVudHMgc28gYWxsIHNlZ21lbnRzIGFyZSB2aXNpYmxlIGluIHRpbWVsaW5lDQogICAgICAgICAgICB0aGlzLnNlZ21lbnRzID0gdGhpcy5zZWdtZW50cy5zb3J0KGZ1bmN0aW9uIGNvbXBhcmUoYSxiKSB7DQogICAgICAgICAgICAgICAgdmFyIGFiLCBhZiwgYmIsIGJmOw0KICAgICAgICAgICAgICAgIGFiID0gTnVtYmVyKGEuZGF0YS5iZWdpbik7DQogICAgICAgICAgICAgICAgYmIgPSBOdW1iZXIoYi5kYXRhLmJlZ2luKTsNCiAgICAgICAgICAgICAgICBhZiA9IE51bWJlcihhLmRhdGEuZmluaXNoKTsNCiAgICAgICAgICAgICAgICBiZiA9IE51bWJlcihiLmRhdGEuZmluaXNoKTsNCiAgICAgICAgICAgICAgICAvLyByZXZlcnNlIG9yZGVyIHNvcnQNCiAgICAgICAgICAgICAgICByZXR1cm4gKGJiLWFiKSArIChiZi1hZik7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKiogcmV0dXJuIG1vdXNlIGNvb3JkaW5hdGVzIG9uIHRpbWVsaW5lICovDQogICAgICAgIGdldFJlZ2lvbjogZnVuY3Rpb24gKGVsLCB4LCB5KSB7DQogICAgICAgICAgICByZXR1cm4ge2VsOiBlbCwgeDogeCwgeTogeX07DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoqIHJldHVybiBkYXRhIHVzZWQgdG8gZGlzcGxheSB0b29sdGlwIGZvciB0aGUgY3VycmVudCByZWdpb24ocykgKi8NCiAgICAgICAgZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGksIGVsLCB4LCB5LCBzZWdtZW50LCByZWdpb25zID0gW10sIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbTsNCiAgICAgICAgICAgIGVsID0gdGhpcy5jdXJyZW50UmVnaW9uLmVsOw0KICAgICAgICAgICAgeCA9IHRoaXMuY3VycmVudFJlZ2lvbi54Ow0KICAgICAgICAgICAgeSA9IHRoaXMuY3VycmVudFJlZ2lvbi55Ow0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2VnbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBzZWdtZW50ID0gdGhpcy5zZWdtZW50c1tpXTsNCiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gc2VnbWVudC54Ow0KICAgICAgICAgICAgICAgICAgICByaWdodCA9IGxlZnQgKyBzZWdtZW50Lnc7DQogICAgICAgICAgICAgICAgICAgIHRvcCA9IHNlZ21lbnQueTsNCiAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gdG9wICsgc2VnbWVudC5oOw0KICAgICAgICAgICAgICAgICAgICBpZiAoeCA+IGxlZnQgJiYgeCA8IHJpZ2h0ICYmIHkgPiB0b3AgJiYgeSA8IGJvdHRvbSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucy5wdXNoKHNlZ21lbnQuZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmVnaW9uczsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKiogcmVuZGVyIHRpbWVsaW5lIHNlZ21lbnQgYW5kIHRpY2ttYXJrcyAqLw0KICAgICAgICByZW5kZXJSZWdpb246IGZ1bmN0aW9uICh2YWx1ZW51bSwgaGlnaGxpZ2h0KSB7DQogICAgICAgICAgICB2YXIgaSwgdGljaywgc2VnbWVudCwgcmVzdWx0ID0gW10sIHRhcmdldCA9IHRoaXMudGFyZ2V0Ow0KICAgICAgICAgICAgaWYgKHZhbHVlbnVtID09PSAwKSB7DQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMudGltZW1hcmtzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpY2sgPSB0aGlzLnRpbWVtYXJrc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGFyZ2V0LmRyYXdMaW5lKHRpY2sueDEsIHRpY2sueTEsIHRpY2sueDIsIHRpY2sueTIsIHRpY2subGMsIHRpY2sudykpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3ZhbHVlbnVtXTsNCiAgICAgICAgICAgIGlmIChzZWdtZW50KSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGFyZ2V0LmRyYXdSZWN0KHNlZ21lbnQueCwgc2VnbWVudC55LCBzZWdtZW50LncsIHNlZ21lbnQuaCwgc2VnbWVudC5sYywgc2VnbWVudC5mYykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgfQ0KICAgIH0pOw0KfShqUXVlcnkpKTsNCg0KDQogICAgLy8gU2V0dXAgYSB2ZXJ5IHNpbXBsZSAidmlydHVhbCBjYW52YXMiIHRvIG1ha2UgZHJhd2luZyB0aGUgZmV3IHNoYXBlcyB3ZSBuZWVkIGVhc2llcg0KICAgIC8vIFRoaXMgaXMgYWNjZXNzaWJsZSBhcyAkKGZvbykuc2ltcGxlZHJhdygpDQoNCiAgICBWU2hhcGUgPSBjcmVhdGVDbGFzcyh7DQogICAgICAgIGluaXQ6IGZ1bmN0aW9uICh0YXJnZXQsIGlkLCB0eXBlLCBhcmdzKSB7DQogICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsNCiAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsNCiAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7DQogICAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOw0KICAgICAgICB9LA0KICAgICAgICBhcHBlbmQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmFwcGVuZFNoYXBlKHRoaXMpOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIFZDYW52YXNfYmFzZSA9IGNyZWF0ZUNsYXNzKHsNCiAgICAgICAgX3B4cmVnZXg6IC8oXGQrKShweCk/XHMqJC9pLA0KDQogICAgICAgIGluaXQ6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCB0YXJnZXQpIHsNCiAgICAgICAgICAgIGlmICghd2lkdGgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7DQogICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsNCiAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KICAgICAgICAgICAgdGhpcy5sYXN0U2hhcGVJZCA9IG51bGw7DQogICAgICAgICAgICBpZiAodGFyZ2V0WzBdKSB7DQogICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0WzBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJC5kYXRhKHRhcmdldCwgJ19qcXNfdmNhbnZhcycsIHRoaXMpOw0KICAgICAgICB9LA0KDQogICAgICAgIGRyYXdMaW5lOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIGxpbmVDb2xvciwgbGluZVdpZHRoKSB7DQogICAgICAgICAgICAvLyBDVVNUT00gTU9EOiBsaW5lIHdpZHRoIGFkZGVkDQogICAgICAgICAgICByZXR1cm4gdGhpcy5kcmF3U2hhcGUoW1t4MSwgeTFdLCBbeDIsIHkyXV0sIGxpbmVDb2xvciwgbnVsbCwgbGluZVdpZHRoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBkcmF3U2hhcGU6IGZ1bmN0aW9uIChwYXRoLCBsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2VuU2hhcGUoJ1NoYXBlJywgW3BhdGgsIGxpbmVDb2xvciwgZmlsbENvbG9yLCBsaW5lV2lkdGhdKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBkcmF3Q2lyY2xlOiBmdW5jdGlvbiAoeCwgeSwgcmFkaXVzLCBsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2VuU2hhcGUoJ0NpcmNsZScsIFt4LCB5LCByYWRpdXMsIGxpbmVDb2xvciwgZmlsbENvbG9yLCBsaW5lV2lkdGhdKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBkcmF3UGllU2xpY2U6IGZ1bmN0aW9uICh4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBsaW5lQ29sb3IsIGZpbGxDb2xvcikgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dlblNoYXBlKCdQaWVTbGljZScsIFt4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBsaW5lQ29sb3IsIGZpbGxDb2xvcl0pOw0KICAgICAgICB9LA0KDQogICAgICAgIC8vIENVU1RPTSBNT0Q6IGxpbmUgd2lkdGggLyByYWRpdXMgYWRkZWQNCiAgICAgICAgZHJhd1JlY3Q6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoLCByYWRpdXMpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZW5TaGFwZSgnUmVjdCcsIFt4LCB5LCB3aWR0aCwgaGVpZ2h0LCBsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoLCByYWRpdXNdKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRFbGVtZW50OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jYW52YXM7DQogICAgICAgIH0sDQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIFJldHVybiB0aGUgbW9zdCByZWNlbnRseSBpbnNlcnRlZCBzaGFwZSBpZA0KICAgICAgICAgKi8NCiAgICAgICAgZ2V0TGFzdFNoYXBlSWQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhc3RTaGFwZUlkOw0KICAgICAgICB9LA0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBDbGVhciBhbmQgcmVzZXQgdGhlIGNhbnZhcw0KICAgICAgICAgKi8NCiAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGFsZXJ0KCdyZXNldCBub3QgaW1wbGVtZW50ZWQnKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBfaW5zZXJ0OiBmdW5jdGlvbiAoZWwsIHRhcmdldCkgew0KICAgICAgICAgICAgJCh0YXJnZXQpLmh0bWwoZWwpOw0KICAgICAgICB9LA0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHBpeGVsIGRpbWVuc2lvbnMgb2YgdGhlIGNhbnZhcw0KICAgICAgICAgKi8NCiAgICAgICAgX2NhbGN1bGF0ZVBpeGVsRGltczogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIGNhbnZhcykgew0KICAgICAgICAgICAgLy8gWFhYIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgY29uZmlndXJhYmxlIG9wdGlvbg0KICAgICAgICAgICAgdmFyIG1hdGNoOw0KICAgICAgICAgICAgbWF0Y2ggPSB0aGlzLl9weHJlZ2V4LmV4ZWMoaGVpZ2h0KTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxIZWlnaHQgPSBtYXRjaFsxXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5waXhlbEhlaWdodCA9ICQoY2FudmFzKS5oZWlnaHQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG1hdGNoID0gdGhpcy5fcHhyZWdleC5leGVjKHdpZHRoKTsNCiAgICAgICAgICAgIGlmIChtYXRjaCkgew0KICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxXaWR0aCA9IG1hdGNoWzFdOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsV2lkdGggPSAkKGNhbnZhcykud2lkdGgoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciByYXRpbyA9IHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZGV2aWNlUGl4ZWxSYXRpbycpID8gd2luZG93LmRldmljZVBpeGVsUmF0aW8gOiAxOw0KICAgICAgICAgICAgdGhpcy5waXhlbFdpZHRoICo9IHJhdGlvOw0KICAgICAgICAgICAgdGhpcy5waXhlbEhlaWdodCAqPSByYXRpbzsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogR2VuZXJhdGUgYSBzaGFwZSBvYmplY3QgYW5kIGlkIGZvciBsYXRlciByZW5kZXJpbmcNCiAgICAgICAgICovDQogICAgICAgIF9nZW5TaGFwZTogZnVuY3Rpb24gKHNoYXBldHlwZSwgc2hhcGVhcmdzKSB7DQogICAgICAgICAgICB2YXIgaWQgPSBzaGFwZUNvdW50Kys7DQogICAgICAgICAgICBzaGFwZWFyZ3MudW5zaGlmdChpZCk7DQogICAgICAgICAgICByZXR1cm4gbmV3IFZTaGFwZSh0aGlzLCBpZCwgc2hhcGV0eXBlLCBzaGFwZWFyZ3MpOw0KICAgICAgICB9LA0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBBZGQgYSBzaGFwZSB0byB0aGUgZW5kIG9mIHRoZSByZW5kZXIgcXVldWUNCiAgICAgICAgICovDQogICAgICAgIGFwcGVuZFNoYXBlOiBmdW5jdGlvbiAoc2hhcGUpIHsNCiAgICAgICAgICAgIGFsZXJ0KCdhcHBlbmRTaGFwZSBub3QgaW1wbGVtZW50ZWQnKTsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogUmVwbGFjZSBvbmUgc2hhcGUgd2l0aCBhbm90aGVyDQogICAgICAgICAqLw0KICAgICAgICByZXBsYWNlV2l0aFNoYXBlOiBmdW5jdGlvbiAoc2hhcGVpZCwgc2hhcGUpIHsNCiAgICAgICAgICAgIGFsZXJ0KCdyZXBsYWNlV2l0aFNoYXBlIG5vdCBpbXBsZW1lbnRlZCcpOw0KICAgICAgICB9LA0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBJbnNlcnQgb25lIHNoYXBlIGFmdGVyIGFub3RoZXIgaW4gdGhlIHJlbmRlciBxdWV1ZQ0KICAgICAgICAgKi8NCiAgICAgICAgaW5zZXJ0QWZ0ZXJTaGFwZTogZnVuY3Rpb24gKHNoYXBlaWQsIHNoYXBlKSB7DQogICAgICAgICAgICBhbGVydCgnaW5zZXJ0QWZ0ZXJTaGFwZSBub3QgaW1wbGVtZW50ZWQnKTsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogUmVtb3ZlIGEgc2hhcGUgZnJvbSB0aGUgcXVldWUNCiAgICAgICAgICovDQogICAgICAgIHJlbW92ZVNoYXBlSWQ6IGZ1bmN0aW9uIChzaGFwZWlkKSB7DQogICAgICAgICAgICBhbGVydCgncmVtb3ZlU2hhcGVJZCBub3QgaW1wbGVtZW50ZWQnKTsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogRmluZCBhIHNoYXBlIGF0IHRoZSBzcGVjaWZpZWQgeC95IGNvLW9yZGluYXRlcw0KICAgICAgICAgKi8NCiAgICAgICAgZ2V0U2hhcGVBdDogZnVuY3Rpb24gKGVsLCB4LCB5KSB7DQogICAgICAgICAgICBhbGVydCgnZ2V0U2hhcGVBdCBub3QgaW1wbGVtZW50ZWQnKTsNCiAgICAgICAgfSwNCg0KICAgICAgICAvKioNCiAgICAgICAgICogUmVuZGVyIGFsbCBxdWV1ZWQgc2hhcGVzIG9udG8gdGhlIGNhbnZhcw0KICAgICAgICAgKi8NCiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBhbGVydCgncmVuZGVyIG5vdCBpbXBsZW1lbnRlZCcpOw0KICAgICAgICB9DQogICAgfSk7DQoNCg0KICAgIFZDYW52YXNfY2FudmFzID0gY3JlYXRlQ2xhc3MoVkNhbnZhc19iYXNlLCB7DQogICAgICAgIGluaXQ6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCB0YXJnZXQsIGludGVyYWN0KSB7DQogICAgICAgICAgICBWQ2FudmFzX2NhbnZhcy5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsIHdpZHRoLCBoZWlnaHQsIHRhcmdldCk7DQogICAgICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOw0KICAgICAgICAgICAgaWYgKHRhcmdldFswXSkgew0KICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFswXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7DQoNCiAgICAgICAgICAgIHZhciBkZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwNCiAgICAgICAgICAgICAgICBiYWNraW5nU3RvcmVSYXRpbyA9IHRoaXMuY29udGV4dC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IHRoaXMuY29udGV4dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IHRoaXMuY29udGV4dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgdGhpcy5jb250ZXh0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IHRoaXMuY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDEsDQogICAgICAgICAgICAgICAgcmF0aW8gPSBkZXZpY2VQaXhlbFJhdGlvIC8gYmFja2luZ1N0b3JlUmF0aW87DQoNCiAgICAgICAgICAgICQuZGF0YSh0YXJnZXQsICdfanFzX3ZjYW52YXMnLCB0aGlzKTsNCiAgICAgICAgICAgICQodGhpcy5jYW52YXMpLmNzcyh7IGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCB2ZXJ0aWNhbEFsaWduOiAndG9wJyB9KTsNCiAgICAgICAgICAgIHRoaXMuX2luc2VydCh0aGlzLmNhbnZhcywgdGFyZ2V0KTsNCiAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZVBpeGVsRGltcyh3aWR0aCwgaGVpZ2h0LCB0aGlzLmNhbnZhcyk7DQogICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMucGl4ZWxXaWR0aCAqIHJhdGlvOw0KICAgICAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5waXhlbEhlaWdodCAqIHJhdGlvOw0KICAgICAgICAgICAgdGhpcy5jb250ZXh0LnNjYWxlKHJhdGlvLCByYXRpbyk7DQogICAgICAgICAgICB0aGlzLmludGVyYWN0ID0gaW50ZXJhY3Q7DQogICAgICAgICAgICB0aGlzLnNoYXBlcyA9IHt9Ow0KICAgICAgICAgICAgdGhpcy5zaGFwZXNlcSA9IFtdOw0KICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0U2hhcGVJZCA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIC8vJCh0aGlzLmNhbnZhcykuY3NzKHt3aWR0aDogdGhpcy5waXhlbFdpZHRoLCBoZWlnaHQ6IHRoaXMucGl4ZWxIZWlnaHR9KTsNCiAgICAgICAgICAgIC8vaWYgdHJhbnNmb3JtIGFwcGxpZWQgdG8gcGFyZW50IHRoZW4gbmVlZCB0byBhZGp1c3QgZm9yIHRoYXQNCiAgICAgICAgICAgIHRoaXMuZGV2aWNlUGl4ZWxSYXRpbyA9IHJhdGlvOw0KICAgICAgICAgICAgdGhpcy5yYXRpbyA9IHRoaXMucGl4ZWxXaWR0aCAvIHRoaXMuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoOw0KICAgICAgICB9LA0KDQogICAgICAgIF9nZXRDb250ZXh0OiBmdW5jdGlvbiAobGluZUNvbG9yLCBmaWxsQ29sb3IsIGxpbmVXaWR0aCkgew0KICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgaWYgKGxpbmVDb2xvciAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGxpbmVDb2xvcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoID09PSB1bmRlZmluZWQgPyAxIDogbGluZVdpZHRoOw0KICAgICAgICAgICAgaWYgKGZpbGxDb2xvciAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBmaWxsQ29sb3I7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gY29udGV4dDsNCiAgICAgICAgfSwNCg0KICAgICAgICByZXNldDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KCk7DQogICAgICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLnBpeGVsV2lkdGgsIHRoaXMucGl4ZWxIZWlnaHQpOw0KICAgICAgICAgICAgdGhpcy5zaGFwZXMgPSB7fTsNCiAgICAgICAgICAgIHRoaXMuc2hhcGVzZXEgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFRhcmdldFNoYXBlSWQgPSB1bmRlZmluZWQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgLy8gQ1VTVE9NIE1PRDogcmFkaXVzIGFkZGVkDQogICAgICAgIF9kcmF3U2hhcGU6IGZ1bmN0aW9uIChzaGFwZWlkLCBwYXRoLCBsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoLCByYWRpdXMpIHsNCiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5fZ2V0Q29udGV4dChsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoKSwNCiAgICAgICAgICAgICAgICBpLCBwbGVuLCBkb25lID0gZmFsc2U7DQogICAgICAgICAgICBpZiAoIXJhZGl1cykNCiAgICAgICAgICAgICAgcmFkaXVzID0gMDsNCiAgICAgICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7DQogICAgICAgICAgICAvLyBDVVNUT00gTU9EOiBjb3JuZXIgcmFkaXVzIGRyYXdpbmcgYWRkZWQgZm9yIHJlY3RhbmdsZXMNCiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gNSkgew0KICAgICAgICAgICAgICAgIGlmICgocGF0aFsxXVswXSAtIHBhdGhbMF1bMF0pIDwgcmFkaXVzKQ0KICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAwOw0KICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSByZWN0YW5nbGUNCiAgICAgICAgICAgICAgICBpZiAocmFkaXVzID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm1vdmVUbyhwYXRoWzBdWzBdICsgcmFkaXVzICsgMC41LCBwYXRoWzBdWzFdICsgMC41KTsNCg0KICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVUbyhwYXRoWzFdWzBdIC0gcmFkaXVzICsgMC41LCBwYXRoWzFdWzFdICsgMC41KTsNCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHBhdGhbMV1bMF0gLSByYWRpdXMgKyAwLjUsIHBhdGhbMV1bMV0gKyAwLjUsIHBhdGhbMV1bMF0gKyAwLjUsIHBhdGhbMV1bMV0gKyByYWRpdXMgKyAwLjUpOw0KDQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZVRvKHBhdGhbMl1bMF0gKyAwLjUsIHBhdGhbMl1bMV0gLSByYWRpdXMgKyAwLjUpOw0KICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8ocGF0aFsyXVswXSArIDAuNSwgcGF0aFsyXVsxXSAtIHJhZGl1cyArIDAuNSwgcGF0aFsyXVswXSAtIHJhZGl1cyArIDAuNSwgcGF0aFsyXVsxXSArIDAuNSk7DQoNCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lVG8ocGF0aFszXVswXSArIHJhZGl1cyArIDAuNSwgcGF0aFszXVsxXSArIDAuNSk7DQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyhwYXRoWzNdWzBdICsgcmFkaXVzICsgMC41LCBwYXRoWzNdWzFdICsgMC41LCBwYXRoWzNdWzBdICsgMC41LCBwYXRoWzNdWzFdIC0gcmFkaXVzICsgMC41KTsNCg0KICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVUbyhwYXRoWzRdWzBdICsgMC41LCBwYXRoWzRdWzFdICsgcmFkaXVzICsgMC41KTsNCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHBhdGhbNF1bMF0gKyAwLjUsIHBhdGhbNF1bMV0gKyByYWRpdXMgKyAwLjUsIHBhdGhbNF1bMF0gKyByYWRpdXMgKyAwLjUsIHBhdGhbNF1bMV0gKyAwLjUpOw0KDQogICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBpZiAoIWRvbmUpIHsNCiAgICAgICAgICAgICAgY29udGV4dC5tb3ZlVG8ocGF0aFswXVswXSArIDAuNSwgcGF0aFswXVsxXSArIDAuNSk7DQogICAgICAgICAgICAgIGZvciAoaSA9IDEsIHBsZW4gPSBwYXRoLmxlbmd0aDsgaSA8IHBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lVG8ocGF0aFtpXVswXSArIDAuNSwgcGF0aFtpXVsxXSArIDAuNSk7IC8vIHRoZSAwLjUgb2Zmc2V0IGdpdmVzIHVzIGNyaXNwIHBpeGVsLXdpZHRoIGxpbmVzDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGxpbmVDb2xvciAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgY29udGV4dC5zdHJva2UoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChmaWxsQ29sb3IgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0WCAhPT0gdW5kZWZpbmVkICYmIHRoaXMudGFyZ2V0WSAhPT0gdW5kZWZpbmVkICYmDQogICAgICAgICAgICAgICAgY29udGV4dC5pc1BvaW50SW5QYXRoKHRoaXMudGFyZ2V0WCwgdGhpcy50YXJnZXRZKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRhcmdldFNoYXBlSWQgPSBzaGFwZWlkOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIF9kcmF3Q2lyY2xlOiBmdW5jdGlvbiAoc2hhcGVpZCwgeCwgeSwgcmFkaXVzLCBsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoKSB7DQogICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX2dldENvbnRleHQobGluZUNvbG9yLCBmaWxsQ29sb3IsIGxpbmVXaWR0aCk7DQogICAgICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpOw0KICAgICAgICAgICAgY29udGV4dC5hcmMoeCwgeSwgcmFkaXVzLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpOw0KICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0WCAhPT0gdW5kZWZpbmVkICYmIHRoaXMudGFyZ2V0WSAhPT0gdW5kZWZpbmVkICYmDQogICAgICAgICAgICAgICAgY29udGV4dC5pc1BvaW50SW5QYXRoKHRoaXMudGFyZ2V0WCwgdGhpcy50YXJnZXRZKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRhcmdldFNoYXBlSWQgPSBzaGFwZWlkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGxpbmVDb2xvciAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgY29udGV4dC5zdHJva2UoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChmaWxsQ29sb3IgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIF9kcmF3UGllU2xpY2U6IGZ1bmN0aW9uIChzaGFwZWlkLCB4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBsaW5lQ29sb3IsIGZpbGxDb2xvcikgew0KICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KGxpbmVDb2xvciwgZmlsbENvbG9yKTsNCiAgICAgICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7DQogICAgICAgICAgICBjb250ZXh0Lm1vdmVUbyh4LCB5KTsNCiAgICAgICAgICAgIGNvbnRleHQuYXJjKHgsIHksIHJhZGl1cywgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGZhbHNlKTsNCiAgICAgICAgICAgIGNvbnRleHQubGluZVRvKHgsIHkpOw0KICAgICAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICAgICAgICAgIGlmIChsaW5lQ29sb3IgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZmlsbENvbG9yKSB7DQogICAgICAgICAgICAgICAgY29udGV4dC5maWxsKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy50YXJnZXRYICE9PSB1bmRlZmluZWQgJiYgdGhpcy50YXJnZXRZICE9PSB1bmRlZmluZWQgJiYNCiAgICAgICAgICAgICAgICBjb250ZXh0LmlzUG9pbnRJblBhdGgodGhpcy50YXJnZXRYLCB0aGlzLnRhcmdldFkpKSB7DQogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0U2hhcGVJZCA9IHNoYXBlaWQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgLy8gQ1VTVE9NIE1PRDogcmFkaXVzIGFkZGVkDQogICAgICAgIF9kcmF3UmVjdDogZnVuY3Rpb24gKHNoYXBlaWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGxpbmVDb2xvciwgZmlsbENvbG9yLCBsaW5lV2lkdGgsIHJhZGl1cykgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYXdTaGFwZShzaGFwZWlkLCBbW3gsIHldLCBbeCArIHdpZHRoLCB5XSwgW3ggKyB3aWR0aCwgeSArIGhlaWdodF0sIFt4LCB5ICsgaGVpZ2h0XSwgW3gsIHldXSwgbGluZUNvbG9yLCBmaWxsQ29sb3IsIG51bGwsIHJhZGl1cyk7DQogICAgICAgIH0sDQoNCiAgICAgICAgYXBwZW5kU2hhcGU6IGZ1bmN0aW9uIChzaGFwZSkgew0KICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGUuaWRdID0gc2hhcGU7DQogICAgICAgICAgICB0aGlzLnNoYXBlc2VxLnB1c2goc2hhcGUuaWQpOw0KICAgICAgICAgICAgdGhpcy5sYXN0U2hhcGVJZCA9IHNoYXBlLmlkOw0KICAgICAgICAgICAgcmV0dXJuIHNoYXBlLmlkOw0KICAgICAgICB9LA0KDQogICAgICAgIHJlcGxhY2VXaXRoU2hhcGU6IGZ1bmN0aW9uIChzaGFwZWlkLCBzaGFwZSkgew0KICAgICAgICAgICAgdmFyIHNoYXBlc2VxID0gdGhpcy5zaGFwZXNlcSwNCiAgICAgICAgICAgICAgICBpOw0KICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGUuaWRdID0gc2hhcGU7DQogICAgICAgICAgICBmb3IgKGkgPSBzaGFwZXNlcS5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICBpZiAoc2hhcGVzZXFbaV0gPT0gc2hhcGVpZCkgew0KICAgICAgICAgICAgICAgICAgICBzaGFwZXNlcVtpXSA9IHNoYXBlLmlkOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNoYXBlc1tzaGFwZWlkXTsNCiAgICAgICAgfSwNCg0KICAgICAgICByZXBsYWNlV2l0aFNoYXBlczogZnVuY3Rpb24gKHNoYXBlaWRzLCBzaGFwZXMpIHsNCiAgICAgICAgICAgIHZhciBzaGFwZXNlcSA9IHRoaXMuc2hhcGVzZXEsDQogICAgICAgICAgICAgICAgc2hhcGVtYXAgPSB7fSwNCiAgICAgICAgICAgICAgICBzaWQsIGksIGZpcnN0Ow0KDQogICAgICAgICAgICBmb3IgKGkgPSBzaGFwZWlkcy5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICBzaGFwZW1hcFtzaGFwZWlkc1tpXV0gPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpID0gc2hhcGVzZXEubGVuZ3RoOyBpLS07KSB7DQogICAgICAgICAgICAgICAgc2lkID0gc2hhcGVzZXFbaV07DQogICAgICAgICAgICAgICAgaWYgKHNoYXBlbWFwW3NpZF0pIHsNCiAgICAgICAgICAgICAgICAgICAgc2hhcGVzZXEuc3BsaWNlKGksIDEpOw0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zaGFwZXNbc2lkXTsNCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaSA9IHNoYXBlcy5sZW5ndGg7IGktLTspIHsNCiAgICAgICAgICAgICAgICBzaGFwZXNlcS5zcGxpY2UoZmlyc3QsIDAsIHNoYXBlc1tpXS5pZCk7DQogICAgICAgICAgICAgICAgdGhpcy5zaGFwZXNbc2hhcGVzW2ldLmlkXSA9IHNoYXBlc1tpXTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9LA0KDQogICAgICAgIGluc2VydEFmdGVyU2hhcGU6IGZ1bmN0aW9uIChzaGFwZWlkLCBzaGFwZSkgew0KICAgICAgICAgICAgdmFyIHNoYXBlc2VxID0gdGhpcy5zaGFwZXNlcSwNCiAgICAgICAgICAgICAgICBpOw0KICAgICAgICAgICAgZm9yIChpID0gc2hhcGVzZXEubGVuZ3RoOyBpLS07KSB7DQogICAgICAgICAgICAgICAgaWYgKHNoYXBlc2VxW2ldID09PSBzaGFwZWlkKSB7DQogICAgICAgICAgICAgICAgICAgIHNoYXBlc2VxLnNwbGljZShpICsgMSwgMCwgc2hhcGUuaWQpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXBlc1tzaGFwZS5pZF0gPSBzaGFwZTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICByZW1vdmVTaGFwZUlkOiBmdW5jdGlvbiAoc2hhcGVpZCkgew0KICAgICAgICAgICAgdmFyIHNoYXBlc2VxID0gdGhpcy5zaGFwZXNlcSwNCiAgICAgICAgICAgICAgICBpOw0KICAgICAgICAgICAgZm9yIChpID0gc2hhcGVzZXEubGVuZ3RoOyBpLS07KSB7DQogICAgICAgICAgICAgICAgaWYgKHNoYXBlc2VxW2ldID09PSBzaGFwZWlkKSB7DQogICAgICAgICAgICAgICAgICAgIHNoYXBlc2VxLnNwbGljZShpLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2hhcGVzW3NoYXBlaWRdOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldFNoYXBlQXQ6IGZ1bmN0aW9uIChlbCwgeCwgeSkgew0KICAgICAgICAgICAgdGhpcy50YXJnZXRYID0geCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOw0KICAgICAgICAgICAgdGhpcy50YXJnZXRZID0geSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOw0KICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUYXJnZXRTaGFwZUlkOw0KICAgICAgICB9LA0KDQogICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIHNoYXBlc2VxID0gdGhpcy5zaGFwZXNlcSwNCiAgICAgICAgICAgICAgICBzaGFwZXMgPSB0aGlzLnNoYXBlcywNCiAgICAgICAgICAgICAgICBzaGFwZUNvdW50ID0gc2hhcGVzZXEubGVuZ3RoLA0KICAgICAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KCksDQogICAgICAgICAgICAgICAgc2hhcGVpZCwgc2hhcGUsIGk7DQogICAgICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLnBpeGVsV2lkdGgsIHRoaXMucGl4ZWxIZWlnaHQpOw0KICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNoYXBlQ291bnQ7IGkrKykgew0KICAgICAgICAgICAgICAgIHNoYXBlaWQgPSBzaGFwZXNlcVtpXTsNCiAgICAgICAgICAgICAgICBzaGFwZSA9IHNoYXBlc1tzaGFwZWlkXTsNCiAgICAgICAgICAgICAgICB0aGlzWydfZHJhdycgKyBzaGFwZS50eXBlXS5hcHBseSh0aGlzLCBzaGFwZS5hcmdzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghdGhpcy5pbnRlcmFjdCkgew0KICAgICAgICAgICAgICAgIC8vIG5vdCBpbnRlcmFjdGl2ZSBzbyBubyBuZWVkIHRvIGtlZXAgdGhlIHNoYXBlcyBhcnJheQ0KICAgICAgICAgICAgICAgIHRoaXMuc2hhcGVzID0ge307DQogICAgICAgICAgICAgICAgdGhpcy5zaGFwZXNlcSA9IFtdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCg0KICAgIFZDYW52YXNfdm1sID0gY3JlYXRlQ2xhc3MoVkNhbnZhc19iYXNlLCB7DQogICAgICAgIGluaXQ6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCB0YXJnZXQpIHsNCiAgICAgICAgICAgIHZhciBncm91cGVsOw0KICAgICAgICAgICAgVkNhbnZhc192bWwuX3N1cGVyLmluaXQuY2FsbCh0aGlzLCB3aWR0aCwgaGVpZ2h0LCB0YXJnZXQpOw0KICAgICAgICAgICAgaWYgKHRhcmdldFswXSkgew0KICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFswXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICQuZGF0YSh0YXJnZXQsICdfanFzX3ZjYW52YXMnLCB0aGlzKTsNCiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KICAgICAgICAgICAgJCh0aGlzLmNhbnZhcykuY3NzKHsgZGlzcGxheTogJ2lubGluZS1ibG9jaycsIHBvc2l0aW9uOiAncmVsYXRpdmUnLCBvdmVyZmxvdzogJ2hpZGRlbicsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIG1hcmdpbjogJzBweCcsIHBhZGRpbmc6ICcwcHgnLCB2ZXJ0aWNhbEFsaWduOiAndG9wJ30pOw0KICAgICAgICAgICAgdGhpcy5faW5zZXJ0KHRoaXMuY2FudmFzLCB0YXJnZXQpOw0KICAgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlUGl4ZWxEaW1zKHdpZHRoLCBoZWlnaHQsIHRoaXMuY2FudmFzKTsNCiAgICAgICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5waXhlbFdpZHRoOw0KICAgICAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5waXhlbEhlaWdodDsNCiAgICAgICAgICAgIGdyb3VwZWwgPSAnPHY6Z3JvdXAgY29vcmRvcmlnaW49IjAgMCIgY29vcmRzaXplPSInICsgdGhpcy5waXhlbFdpZHRoICsgJyAnICsgdGhpcy5waXhlbEhlaWdodCArICciJyArDQogICAgICAgICAgICAgICAgICAgICcgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDonICsgdGhpcy5waXhlbFdpZHRoICsgJ3B4O2hlaWdodD0nICsgdGhpcy5waXhlbEhlaWdodCArICdweDsiPjwvdjpncm91cD4nOw0KICAgICAgICAgICAgdGhpcy5jYW52YXMuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVFbmQnLCBncm91cGVsKTsNCiAgICAgICAgICAgIHRoaXMuZ3JvdXAgPSAkKHRoaXMuY2FudmFzKS5jaGlsZHJlbigpWzBdOw0KICAgICAgICAgICAgdGhpcy5yZW5kZXJlZCA9IGZhbHNlOw0KICAgICAgICAgICAgdGhpcy5wcmVyZW5kZXIgPSAnJzsNCiAgICAgICAgfSwNCg0KICAgICAgICBfZHJhd1NoYXBlOiBmdW5jdGlvbiAoc2hhcGVpZCwgcGF0aCwgbGluZUNvbG9yLCBmaWxsQ29sb3IsIGxpbmVXaWR0aCwgcmFkaXVzKSB7DQogICAgICAgICAgICB2YXIgdnBhdGggPSBbXSwNCiAgICAgICAgICAgICAgICBpbml0aWFsLCBzdHJva2UsIGZpbGwsIGNsb3NlZCwgdmVsLCBwbGVuLCBpOw0KICAgICAgICAgICAgZm9yIChpID0gMCwgcGxlbiA9IHBhdGgubGVuZ3RoOyBpIDwgcGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgdnBhdGhbaV0gPSAnJyArIChwYXRoW2ldWzBdKSArICcsJyArIChwYXRoW2ldWzFdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGluaXRpYWwgPSB2cGF0aC5zcGxpY2UoMCwgMSk7DQogICAgICAgICAgICBsaW5lV2lkdGggPSBsaW5lV2lkdGggPT09IHVuZGVmaW5lZCA/IDEgOiBsaW5lV2lkdGg7DQogICAgICAgICAgICBzdHJva2UgPSBsaW5lQ29sb3IgPT09IHVuZGVmaW5lZCA/ICcgc3Ryb2tlZD0iZmFsc2UiICcgOiAnIHN0cm9rZVdlaWdodD0iJyArIGxpbmVXaWR0aCArICdweCIgc3Ryb2tlQ29sb3I9IicgKyBsaW5lQ29sb3IgKyAnIiAnOw0KICAgICAgICAgICAgZmlsbCA9IGZpbGxDb2xvciA9PT0gdW5kZWZpbmVkID8gJyBmaWxsZWQ9ImZhbHNlIicgOiAnIGZpbGxDb2xvcj0iJyArIGZpbGxDb2xvciArICciIGZpbGxlZD0idHJ1ZSIgJzsNCiAgICAgICAgICAgIGNsb3NlZCA9IHZwYXRoWzBdID09PSB2cGF0aFt2cGF0aC5sZW5ndGggLSAxXSA/ICd4ICcgOiAnJzsNCiAgICAgICAgICAgIHZlbCA9ICc8djpzaGFwZSBjb29yZG9yaWdpbj0iMCAwIiBjb29yZHNpemU9IicgKyB0aGlzLnBpeGVsV2lkdGggKyAnICcgKyB0aGlzLnBpeGVsSGVpZ2h0ICsgJyIgJyArDQogICAgICAgICAgICAgICAgICcgaWQ9Impxc3NoYXBlJyArIHNoYXBlaWQgKyAnIiAnICsNCiAgICAgICAgICAgICAgICAgc3Ryb2tlICsNCiAgICAgICAgICAgICAgICAgZmlsbCArDQogICAgICAgICAgICAgICAgJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7dG9wOjBweDtoZWlnaHQ6JyArIHRoaXMucGl4ZWxIZWlnaHQgKyAncHg7d2lkdGg6JyArIHRoaXMucGl4ZWxXaWR0aCArICdweDtwYWRkaW5nOjBweDttYXJnaW46MHB4OyIgJyArDQogICAgICAgICAgICAgICAgJyBwYXRoPSJtICcgKyBpbml0aWFsICsgJyBsICcgKyB2cGF0aC5qb2luKCcsICcpICsgJyAnICsgY2xvc2VkICsgJ2UiPicgKw0KICAgICAgICAgICAgICAgICcgPC92OnNoYXBlPic7DQogICAgICAgICAgICByZXR1cm4gdmVsOw0KICAgICAgICB9LA0KDQogICAgICAgIF9kcmF3Q2lyY2xlOiBmdW5jdGlvbiAoc2hhcGVpZCwgeCwgeSwgcmFkaXVzLCBsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoKSB7DQogICAgICAgICAgICB2YXIgc3Ryb2tlLCBmaWxsLCB2ZWw7DQogICAgICAgICAgICB4IC09IHJhZGl1czsNCiAgICAgICAgICAgIHkgLT0gcmFkaXVzOw0KICAgICAgICAgICAgc3Ryb2tlID0gbGluZUNvbG9yID09PSB1bmRlZmluZWQgPyAnIHN0cm9rZWQ9ImZhbHNlIiAnIDogJyBzdHJva2VXZWlnaHQ9IicgKyBsaW5lV2lkdGggKyAncHgiIHN0cm9rZUNvbG9yPSInICsgbGluZUNvbG9yICsgJyIgJzsNCiAgICAgICAgICAgIGZpbGwgPSBmaWxsQ29sb3IgPT09IHVuZGVmaW5lZCA/ICcgZmlsbGVkPSJmYWxzZSInIDogJyBmaWxsQ29sb3I9IicgKyBmaWxsQ29sb3IgKyAnIiBmaWxsZWQ9InRydWUiICc7DQogICAgICAgICAgICB2ZWwgPSAnPHY6b3ZhbCAnICsNCiAgICAgICAgICAgICAgICAgJyBpZD0ianFzc2hhcGUnICsgc2hhcGVpZCArICciICcgKw0KICAgICAgICAgICAgICAgIHN0cm9rZSArDQogICAgICAgICAgICAgICAgZmlsbCArDQogICAgICAgICAgICAgICAgJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOicgKyB5ICsgJ3B4OyBsZWZ0OicgKyB4ICsgJ3B4OyB3aWR0aDonICsgKHJhZGl1cyAqIDIpICsgJ3B4OyBoZWlnaHQ6JyArIChyYWRpdXMgKiAyKSArICdweCI+PC92Om92YWw+JzsNCiAgICAgICAgICAgIHJldHVybiB2ZWw7DQoNCiAgICAgICAgfSwNCg0KICAgICAgICBfZHJhd1BpZVNsaWNlOiBmdW5jdGlvbiAoc2hhcGVpZCwgeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgbGluZUNvbG9yLCBmaWxsQ29sb3IpIHsNCiAgICAgICAgICAgIHZhciB2cGF0aCwgc3RhcnR4LCBzdGFydHksIGVuZHgsIGVuZHksIHN0cm9rZSwgZmlsbCwgdmVsOw0KICAgICAgICAgICAgaWYgKHN0YXJ0QW5nbGUgPT09IGVuZEFuZ2xlKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOyAgLy8gVk1MIHNlZW1zIHRvIGhhdmUgcHJvYmxlbSB3aGVuIHN0YXJ0IGFuZ2xlIGVxdWFscyBlbmQgYW5nbGUuDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSkgPT09ICgyICogTWF0aC5QSSkpIHsNCiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlID0gMC4wOyAgLy8gVk1MIHNlZW1zIHRvIGhhdmUgYSBwcm9ibGVtIHdoZW4gZHJhd2luZyBhIGZ1bGwgY2lyY2xlIHRoYXQgZG9lc24ndCBzdGFydCAwDQogICAgICAgICAgICAgICAgZW5kQW5nbGUgPSAoMiAqIE1hdGguUEkpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzdGFydHggPSB4ICsgTWF0aC5yb3VuZChNYXRoLmNvcyhzdGFydEFuZ2xlKSAqIHJhZGl1cyk7DQogICAgICAgICAgICBzdGFydHkgPSB5ICsgTWF0aC5yb3VuZChNYXRoLnNpbihzdGFydEFuZ2xlKSAqIHJhZGl1cyk7DQogICAgICAgICAgICBlbmR4ID0geCArIE1hdGgucm91bmQoTWF0aC5jb3MoZW5kQW5nbGUpICogcmFkaXVzKTsNCiAgICAgICAgICAgIGVuZHkgPSB5ICsgTWF0aC5yb3VuZChNYXRoLnNpbihlbmRBbmdsZSkgKiByYWRpdXMpOw0KDQogICAgICAgICAgICBpZiAoc3RhcnR4ID09PSBlbmR4ICYmIHN0YXJ0eSA9PT0gZW5keSkgew0KICAgICAgICAgICAgICAgIGlmICgoZW5kQW5nbGUgLSBzdGFydEFuZ2xlKSA8IE1hdGguUEkpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB2ZXJ5IHNtYWxsIHNsaWNlcyBmcm9tIGJlaW5nIG1pc3Rha2VuIGFzIGEgd2hvbGUgcGllDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gZXNzZW50aWFsbHkgZ29pbmcgdG8gYmUgdGhlIGVudGlyZSBjaXJjbGUsIHNvIGlnbm9yZSBzdGFydEFuZ2xlDQogICAgICAgICAgICAgICAgc3RhcnR4ID0gZW5keCA9IHggKyByYWRpdXM7DQogICAgICAgICAgICAgICAgc3RhcnR5ID0gZW5keSA9IHk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChzdGFydHggPT09IGVuZHggJiYgc3RhcnR5ID09PSBlbmR5ICYmIChlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpIDwgTWF0aC5QSSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAnJzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdnBhdGggPSBbeCAtIHJhZGl1cywgeSAtIHJhZGl1cywgeCArIHJhZGl1cywgeSArIHJhZGl1cywgc3RhcnR4LCBzdGFydHksIGVuZHgsIGVuZHldOw0KICAgICAgICAgICAgc3Ryb2tlID0gbGluZUNvbG9yID09PSB1bmRlZmluZWQgPyAnIHN0cm9rZWQ9ImZhbHNlIiAnIDogJyBzdHJva2VXZWlnaHQ9IjFweCIgc3Ryb2tlQ29sb3I9IicgKyBsaW5lQ29sb3IgKyAnIiAnOw0KICAgICAgICAgICAgZmlsbCA9IGZpbGxDb2xvciA9PT0gdW5kZWZpbmVkID8gJyBmaWxsZWQ9ImZhbHNlIicgOiAnIGZpbGxDb2xvcj0iJyArIGZpbGxDb2xvciArICciIGZpbGxlZD0idHJ1ZSIgJzsNCiAgICAgICAgICAgIHZlbCA9ICc8djpzaGFwZSBjb29yZG9yaWdpbj0iMCAwIiBjb29yZHNpemU9IicgKyB0aGlzLnBpeGVsV2lkdGggKyAnICcgKyB0aGlzLnBpeGVsSGVpZ2h0ICsgJyIgJyArDQogICAgICAgICAgICAgICAgICcgaWQ9Impxc3NoYXBlJyArIHNoYXBlaWQgKyAnIiAnICsNCiAgICAgICAgICAgICAgICAgc3Ryb2tlICsNCiAgICAgICAgICAgICAgICAgZmlsbCArDQogICAgICAgICAgICAgICAgJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7dG9wOjBweDtoZWlnaHQ6JyArIHRoaXMucGl4ZWxIZWlnaHQgKyAncHg7d2lkdGg6JyArIHRoaXMucGl4ZWxXaWR0aCArICdweDtwYWRkaW5nOjBweDttYXJnaW46MHB4OyIgJyArDQogICAgICAgICAgICAgICAgJyBwYXRoPSJtICcgKyB4ICsgJywnICsgeSArICcgd2EgJyArIHZwYXRoLmpvaW4oJywgJykgKyAnIHggZSI+JyArDQogICAgICAgICAgICAgICAgJyA8L3Y6c2hhcGU+JzsNCiAgICAgICAgICAgIHJldHVybiB2ZWw7DQogICAgICAgIH0sDQoNCiAgICAgICAgX2RyYXdSZWN0OiBmdW5jdGlvbiAoc2hhcGVpZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgbGluZUNvbG9yLCBmaWxsQ29sb3IsIGxpbmVXaWR0aCwgcmFkaXVzKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJhd1NoYXBlKHNoYXBlaWQsIFtbeCwgeV0sIFt4LCB5ICsgaGVpZ2h0XSwgW3ggKyB3aWR0aCwgeSArIGhlaWdodF0sIFt4ICsgd2lkdGgsIHldLCBbeCwgeV1dLCBsaW5lQ29sb3IsIGZpbGxDb2xvciwgbGluZVdpZHRoLCByYWRpdXMpOw0KICAgICAgICB9LA0KDQogICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLmdyb3VwLmlubmVySFRNTCA9ICcnOw0KICAgICAgICB9LA0KDQogICAgICAgIGFwcGVuZFNoYXBlOiBmdW5jdGlvbiAoc2hhcGUpIHsNCiAgICAgICAgICAgIHZhciB2ZWwgPSB0aGlzWydfZHJhdycgKyBzaGFwZS50eXBlXS5hcHBseSh0aGlzLCBzaGFwZS5hcmdzKTsNCiAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkKSB7DQogICAgICAgICAgICAgICAgdGhpcy5ncm91cC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZUVuZCcsIHZlbCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMucHJlcmVuZGVyICs9IHZlbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubGFzdFNoYXBlSWQgPSBzaGFwZS5pZDsNCiAgICAgICAgICAgIHJldHVybiBzaGFwZS5pZDsNCiAgICAgICAgfSwNCg0KICAgICAgICByZXBsYWNlV2l0aFNoYXBlOiBmdW5jdGlvbiAoc2hhcGVpZCwgc2hhcGUpIHsNCiAgICAgICAgICAgIHZhciBleGlzdGluZyA9ICQoJyNqcXNzaGFwZScgKyBzaGFwZWlkKSwNCiAgICAgICAgICAgICAgICB2ZWwgPSB0aGlzWydfZHJhdycgKyBzaGFwZS50eXBlXS5hcHBseSh0aGlzLCBzaGFwZS5hcmdzKTsNCiAgICAgICAgICAgIGV4aXN0aW5nWzBdLm91dGVySFRNTCA9IHZlbDsNCiAgICAgICAgfSwNCg0KICAgICAgICByZXBsYWNlV2l0aFNoYXBlczogZnVuY3Rpb24gKHNoYXBlaWRzLCBzaGFwZXMpIHsNCiAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGZpcnN0IHNoYXBlaWQgd2l0aCBhbGwgdGhlIG5ldyBzaGFwZXMgdGhlbiB0b2FzdCB0aGUgcmVtYWluaW5nIG9sZCBzaGFwZXMNCiAgICAgICAgICAgIHZhciBleGlzdGluZyA9ICQoJyNqcXNzaGFwZScgKyBzaGFwZWlkc1swXSksDQogICAgICAgICAgICAgICAgcmVwbGFjZSA9ICcnLA0KICAgICAgICAgICAgICAgIHNsZW4gPSBzaGFwZXMubGVuZ3RoLA0KICAgICAgICAgICAgICAgIGk7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgcmVwbGFjZSArPSB0aGlzWydfZHJhdycgKyBzaGFwZXNbaV0udHlwZV0uYXBwbHkodGhpcywgc2hhcGVzW2ldLmFyZ3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZXhpc3RpbmdbMF0ub3V0ZXJIVE1MID0gcmVwbGFjZTsNCiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzaGFwZWlkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICQoJyNqcXNzaGFwZScgKyBzaGFwZWlkc1tpXSkucmVtb3ZlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgaW5zZXJ0QWZ0ZXJTaGFwZTogZnVuY3Rpb24gKHNoYXBlaWQsIHNoYXBlKSB7DQogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSAkKCcjanFzc2hhcGUnICsgc2hhcGVpZCksDQogICAgICAgICAgICAgICAgIHZlbCA9IHRoaXNbJ19kcmF3JyArIHNoYXBlLnR5cGVdLmFwcGx5KHRoaXMsIHNoYXBlLmFyZ3MpOw0KICAgICAgICAgICAgZXhpc3RpbmdbMF0uaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlckVuZCcsIHZlbCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVtb3ZlU2hhcGVJZDogZnVuY3Rpb24gKHNoYXBlaWQpIHsNCiAgICAgICAgICAgIHZhciBleGlzdGluZyA9ICQoJyNqcXNzaGFwZScgKyBzaGFwZWlkKTsNCiAgICAgICAgICAgIHRoaXMuZ3JvdXAucmVtb3ZlQ2hpbGQoZXhpc3RpbmdbMF0pOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldFNoYXBlQXQ6IGZ1bmN0aW9uIChlbCwgeCwgeSkgew0KICAgICAgICAgICAgdmFyIHNoYXBlaWQgPSBlbC5pZC5zdWJzdHIoOCk7DQogICAgICAgICAgICByZXR1cm4gc2hhcGVpZDsNCiAgICAgICAgfSwNCg0KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlZCkgew0KICAgICAgICAgICAgICAgIC8vIGJhdGNoIHRoZSBpbnRpYWwgcmVuZGVyIGludG8gYSBzaW5nbGUgcmVwYWludA0KICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuaW5uZXJIVE1MID0gdGhpcy5wcmVyZW5kZXI7DQogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KDQp9KSk7DQoNCn0oZG9jdW1lbnQsIE1hdGgpKTsNCg=="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCiAgbmFtZTogInNwYXJrbGluZSIsDQogIHR5cGU6ICJvdXRwdXQiLA0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KICAgIA0KICAgIHZhciBpbnN0YW5jZSA9IHt9Ow0KICAgIA0KICAgIHJldHVybiB7DQoNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihkYXRhKSB7DQogICAgICAgIA0KICAgICAgICAkKGVsKS5lbXB0eSgpOw0KDQogICAgICAgIC8vIGlmIHJlbmRlclRhZyBwcm92aWRlZCB0aGVuIHdlIHdpbGwgZG8gdGhyZWUgdGhpbmdzDQogICAgICAgIC8vICAgMS4gIHNldCBoZWlnaHQgYW5kIHdpZHRoIHRvIDAgYW5kIGRpc3BsYXkgbm9uZQ0KICAgICAgICAvLyAgIDIuICBzZXQgb3VyIGVsIHRvIHRoZSByZW5kZXIgdGFnIGlmIGF2YWlsYWJsZQ0KICAgICAgICAvLyAgIDMuICBzZXQgaGVpZ2h0IGFuZCB3aWR0aCBvcHRpb25zIHRvIG51bGwNCiAgICAgICAgaWYoZGF0YS5yZW5kZXJTZWxlY3RvciAmJiAkKGRhdGEucmVuZGVyU2VsZWN0b3IpLmxlbmd0aCl7DQogICAgICAgICAgJChlbCkuY3NzKHsNCiAgICAgICAgICAgICdoZWlnaHQnOiAnMCcsDQogICAgICAgICAgICAnd2lkdGgnOiAnMCcsDQogICAgICAgICAgICAnZGlzcGxheSc6ICdub25lJw0KICAgICAgICAgIH0pOw0KICAgICAgICAgIGVsID0gZGF0YS5yZW5kZXJTZWxlY3RvcjsNCiAgICAgICAgICAvLyBzZXQgaGVpZ2h0IGFuZCB3aWR0aCB0byBudWxsDQogICAgICAgICAgLy8gICB0aGlzIG1pZ2h0IGJlIGNvbmZ1c2luZyBhbmQgbmVlZCB0byBiZSByZXZlcnRlZA0KICAgICAgICAgIGRhdGEub3B0aW9ucy5oZWlnaHQgPSBudWxsOw0KICAgICAgICAgIGRhdGEub3B0aW9ucy53aWR0aCA9IG51bGw7DQogICAgICAgIH0NCiAgICAgICAgJChlbCkuc3BhcmtsaW5lKGRhdGEudmFsdWVzLCBkYXRhLm9wdGlvbnMpOw0KICAgICAgICANCiAgICAgICAgLy8gZXhwZXJpbWVudGFsIGFkZENvbXBvc2l0ZSBmdW5jdGlvbiBpbiBSDQogICAgICAgIC8vICAgd2lsbCBhZGQgY29tcG9zaXRlcyB0byBkYXRhLmNvbXBvc2l0ZXMNCiAgICAgICAgaWYoZGF0YS5jb21wb3NpdGVzKSB7DQogICAgICAgICAgaWYoIUFycmF5LmlzQXJyYXkoZGF0YS5jb21wb3NpdGVzKSkgew0KICAgICAgICAgICAgZGF0YS5jb21wb3NpdGVzID0gW2RhdGEuY29tcG9zaXRlc107DQogICAgICAgICAgfQ0KICAgICAgICAgIGRhdGEuY29tcG9zaXRlcy5tYXAoIGZ1bmN0aW9uKHNwaykgew0KICAgICAgICAgICAgJChlbCkuc3BhcmtsaW5lKHNway52YWx1ZXMsc3BrLm9wdGlvbnMpOw0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpbnN0YW5jZS5kYXRhID0gZGF0YTsNCiAgICAgIH0sDQoNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgew0KDQogICAgICAgIC8vIG5vdCBzdXJlIHdoYXQgdG8gZG8gaW4gdGhlIGV2ZW50IG9mIHJlc2l6ZQ0KICAgICAgICAvLyAgSSB0aGluayBub3RoaW5nIGZvciBub3cNCiAgICAgICAgLy8gIGJ1dCB3aWxsIG5lZWQgdG8gZ2V0IGEgZmVlbCBmb3IgdXNlIGNhc2VzDQogICAgICAgIC8vICB3aGVyZSB0aGlzIGlzIGltcG9ydGFudCBzdWNoIGFzIHNsaWRlcywgZmxleGRhc2hib2FyZCwgdGFic2V0DQogICAgICAgIHRoaXMucmVuZGVyVmFsdWUoaW5zdGFuY2UuZGF0YSk7DQoNCiAgICAgIH0NCg0KICAgIH07DQogIH0gIA0KfSk7DQo="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget-e2efcb9f25efe74c92f8" class="leaflet html-widget" style="width:100%;height:400px;">
</div>
<script type="application/json" data-for="htmlwidget-e2efcb9f25efe74c92f8">{"x":{"options":{"crs":{"crsClass":"L.CRS.EPSG3857","code":null,"proj4def":null,"projectedBounds":null,"options":{}}},"calls":[{"method":"addTiles","args":["https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",null,null,{"minZoom":0,"maxZoom":18,"maxNativeZoom":null,"tileSize":256,"subdomains":"abc","errorTileUrl":"","tms":false,"continuousWorld":false,"noWrap":false,"zoomOffset":0,"zoomReverse":false,"opacity":1,"zIndex":null,"unloadInvisibleTiles":null,"updateWhenIdle":null,"detectRetina":false,"reuseTiles":false,"attribution":"&copy; <a href=\"http://openstreetmap.org\">OpenStreetMap\u003c/a> contributors, <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA\u003c/a>"}]},{"method":"addPopups","args":[[42.0234825870603,42.0307604555286,42.0351787714233,42.0392610581046,42.0374351753496,42.0151925907102,42.0054177457852,42.0276524822969,42.0249385564562,42.0196893423356],[-93.6551567216301,-93.6365542904387,-93.6344509175569,-93.6526627416888,-93.6607085627401,-93.6652336413016,-93.6409150666598,-93.6487394160397,-93.6390314082345,-93.6342371203683],["<span id=\"htmlwidget-26c5979a6f5ae14f2fc6\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-26c5979a6f5ae14f2fc6\">{\"x\":{\"values\":[0.824480948038399,0.482314522145316,0.344917303416878,0.651675851084292,0.851302154827863,0.0455997076351196,0.560437101870775,0.784026847220957,0.0212169496808201,0.260669153183699],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-b2837db3e684e1cf0757\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-b2837db3e684e1cf0757\">{\"x\":{\"values\":[0.185673248255625,0.766900298418477,0.45878083165735,0.0229701308999211,0.777217878727242,0.0797046776860952,0.284565497422591,0.863326736027375,0.484969321405515,0.519998684059829],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-ec488da90590e3a297d6\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-ec488da90590e3a297d6\">{\"x\":{\"values\":[0.202053196029738,0.399210170144215,0.948907285928726,0.382832856616005,0.179249747423455,0.698751882184297,0.589790003141388,0.824380206875503,0.704189753625542,0.497331454185769],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-c222011fbff7acbd788b\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-c222011fbff7acbd788b\">{\"x\":{\"values\":[0.149839809862897,0.215194704243913,0.0990836163982749,0.130791013361886,0.110448952531442,0.765287174610421,0.729062399826944,0.113589339889586,0.431503011845052,0.736914232373238],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-a42ce34786a6899c0d1a\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-a42ce34786a6899c0d1a\">{\"x\":{\"values\":[0.710499898996204,0.13279061159119,0.374303558375686,0.860614611534402,0.638874247670174,0.189705389086157,0.542470585554838,0.607397989602759,0.337333020986989,0.165935407858342],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-f55bc09012cfba1db415\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-f55bc09012cfba1db415\">{\"x\":{\"values\":[0.456738099455833,0.888067652238533,0.0109916534274817,0.829046733444557,0.592949796468019,0.578467464074492,0.380387617973611,0.126655485713854,0.490674076601863,0.849222467048094],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-20f6e20497e29b4a6a1c\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-20f6e20497e29b4a6a1c\">{\"x\":{\"values\":[0.792469437699765,0.295303360093385,0.690919795306399,0.702747202478349,0.306615031557158,0.245793869020417,0.868971017422155,0.925612686667591,0.270117716863751,0.269551729084924],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-fe38d73136bad758b94f\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-fe38d73136bad758b94f\">{\"x\":{\"values\":[0.990436550462618,0.0814589755609632,0.1599233916495,0.571057496592402,0.188904044218361,0.0171360415406525,0.672050244407728,0.276769791496918,0.925425357418135,0.909724907018244],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-37c0fc6b4dd4e63a82ab\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-37c0fc6b4dd4e63a82ab\">{\"x\":{\"values\":[0.116782111115754,0.774943704018369,0.344617217080668,0.852947449777275,0.42635968583636,0.259478101972491,0.93319423077628,0.494088553823531,0.590038136346266,0.322168499231339],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>","<span id=\"htmlwidget-5886b8539b07bb4d4b5c\" class=\"sparkline html-widget\">\u003c/span>\n<script type=\"application/json\" data-for=\"htmlwidget-5886b8539b07bb4d4b5c\">{\"x\":{\"values\":[0.488460112595931,0.78154587559402,0.844358698697761,0.638046104693785,0.201537614921108,0.794841456227005,0.319292165804654,0.457808871753514,0.209731391398236,0.183225886663422],\"options\":{\"height\":20,\"width\":60},\"width\":60,\"height\":20},\"evals\":[],\"jsHooks\":[]}\u003c/script>"],null,null,{"maxWidth":300,"minWidth":50,"maxHeight":null,"autoPan":true,"keepInView":false,"closeButton":true,"zoomAnimation":true,"closeOnClick":null,"className":""}]}],"limits":{"lat":[42.0054177457852,42.0392610581046],"lng":[-93.6652336413016,-93.6342371203683]}},"evals":[],"jsHooks":{"render":[{"code":"function(el, x, data) {\n return (\nfunction(el,x) {HTMLWidgets.staticRender()}\n).call(this.getMap(), el, x, data);\n}","data":null}]}}</script>
</body>
</html>
@timelyportfolio
Copy link
Author

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment