Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active December 6, 2016 17:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/1dcf6eb05ad3d73595c55573ac29c777 to your computer and use it in GitHub Desktop.
Save timelyportfolio/1dcf6eb05ad3d73595c55573ac29c777 to your computer and use it in GitHub Desktop.
parcoords (d3.js) + sparkline + crosstalk in R
license: mit

In response to my last example plotly + parcoords, Jowanza Joseph said he might like to see sparkline + parcoords. This example shows how we can listen to the crosstalk event change to dynamically draw a sparkline with the parcoords selection. The two sparklines allow quick comparison of the selection to the whole.

code

# devtools::install_github("rstudio/crosstalk@joe/simplify")
# devtools::install_github("timelyportfolio/parcoords@feature/crosstalk2")

library(parcoords)
library(sparkline)
library(crosstalk)
library(htmlwidgets)
library(htmltools)

sd <- SharedData$new(mtcars, group="grp1")
pc <- parcoords(sd,brushMode="1d-axes")

spark_mpg <- sparkline(
  mtcars$mpg,
  type="box",
  chartRangeMin=0,
  chartRangeMax=max(mtcars$mpg),
  elementId = "sparkline-mpg"
)
spark_disp <- sparkline(
  mtcars$disp,
  type="box",
  chartRangeMin=0,
  chartRangeMax=max(mtcars$disp),
  elementId = "sparkline-disp"
)

browsable(tagList(
  tags$div(
    tags$span(style="font-style:bold","mpg"),
    tags$br(),
    spark_mpg,
    tags$br(),
    modifyList(spark_mpg,list(elementId="sparkline-mpg-selected"))
  ),
  tags$div(
    tags$span(style="font-style:bold","disp"),
    tags$br(),
    spark_disp,
    tags$br(),
    modifyList(spark_disp,list(elementId="sparkline-disp-selected"))
  ),
  # hack to make data available to window/global
  #  probably should not be considered best practice
  onRender(
    pc,
    "function(el,x){window.mtcars = x.data}"
  ),
  tags$script(
    HTML(sprintf(
"        
var drawBox = function(selection){
  //make sure mtcars is available first
  //  since this will likely run before
  //  we run assignment of mtcars after parcoords render
  if(mtcars){
    var selected_rows = mtcars;
    if(selection && selection.length > 0){
      selection = Array.isArray(selection) ? selection : [selection];
      selected_rows = mtcars.filter(function(d){
        return selection.indexOf(d.key_) >= 0
      });
    }
    $('#sparkline-mpg-selected').sparkline(
      selected_rows.map(function(d){return d.mpg}),
      {type:'box',chartRangeMin:0,chartRangeMax:%i}
    );
    $('#sparkline-disp-selected').sparkline(
      selected_rows.map(function(d){return d.disp}),
      {type:'box',chartRangeMin:0,chartRangeMax:%i}
    );
  }
};

var sel_handle = new crosstalk.SelectionHandle('grp1');
sel_handle.on(
  'change',
  function(val){drawBox(val.value)}
);
"         ,
      ceiling(max(mtcars$mpg)),
      ceiling(max(mtcars$disp))
    )
  ))
))
<!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,LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8NCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWMuc2xpY2UsZT1jLmNvbmNhdCxmPWMucHVzaCxnPWMuaW5kZXhPZixoPXt9LGk9aC50b1N0cmluZyxqPWguaGFzT3duUHJvcGVydHksaz17fSxsPSIxLjExLjMiLG09ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IG0uZm4uaW5pdChhLGIpfSxuPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxvPS9eLW1zLS8scD0vLShbXGRhLXpdKS9naSxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bS5mbj1tLnByb3RvdHlwZT17anF1ZXJ5OmwsY29uc3RydWN0b3I6bSxzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPzA+YT90aGlzW2ErdGhpcy5sZW5ndGhdOnRoaXNbYV06ZC5jYWxsKHRoaXMpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9bS5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGIucHJldk9iamVjdD10aGlzLGIuY29udGV4dD10aGlzLmNvbnRleHQsYn0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmVhY2godGhpcyxhLGIpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG0ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG0uZXh0ZW5kPW0uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxtLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2hdKSlmb3IoZCBpbiBlKWE9Z1tkXSxjPWVbZF0sZyE9PWMmJihqJiZjJiYobS5pc1BsYWluT2JqZWN0KGMpfHwoYj1tLmlzQXJyYXkoYykpKT8oYj8oYj0hMSxmPWEmJm0uaXNBcnJheShhKT9hOltdKTpmPWEmJm0uaXNQbGFpbk9iamVjdChhKT9hOnt9LGdbZF09bS5leHRlbmQoaixmLGMpKTp2b2lkIDAhPT1jJiYoZ1tkXT1jKSk7cmV0dXJuIGd9LG0uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhsK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1tLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuImFycmF5Ij09PW0udHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIW0uaXNBcnJheShhKSYmYS1wYXJzZUZsb2F0KGEpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1tLnR5cGUoYSl8fGEubm9kZVR5cGV8fG0uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFqLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWouY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKGsub3duTGFzdClmb3IoYiBpbiBhKXJldHVybiBqLmNhbGwoYSxiKTtmb3IoYiBpbiBhKTtyZXR1cm4gdm9pZCAwPT09Ynx8ai5jYWxsKGEsYil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YSsiIjoib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhP2hbaS5jYWxsKGEpXXx8Im9iamVjdCI6dHlwZW9mIGF9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmbS50cmltKGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKG8sIm1zLSIpLnJlcGxhY2UocCxxKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yi50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPTAsZj1hLmxlbmd0aCxnPXIoYSk7aWYoYyl7aWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgaWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6KGErIiIpLnJlcGxhY2UobiwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO3JldHVybiBudWxsIT1hJiYocihPYmplY3QoYSkpP20ubWVyZ2UoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmYuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihnKXJldHVybiBnLmNhbGwoYixhLGMpO2ZvcihkPWIubGVuZ3RoLGM9Yz8wPmM/TWF0aC5tYXgoMCxkK2MpOmM6MDtkPmM7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIGN9cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO3doaWxlKGM+ZClhW2UrK109YltkKytdO2lmKGMhPT1jKXdoaWxlKHZvaWQgMCE9PWJbZF0pYVtlKytdPWJbZCsrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQsZT1bXSxmPTAsZz1hLmxlbmd0aCxoPSFjO2c+ZjtmKyspZD0hYihhW2ZdLGYpLGQhPT1oJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj0wLGc9YS5sZW5ndGgsaD1yKGEpLGk9W107aWYoaClmb3IoO2c+ZjtmKyspZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7ZWxzZSBmb3IoZiBpbiBhKWQ9YihhW2ZdLGYsYyksbnVsbCE9ZCYmaS5wdXNoKGQpO3JldHVybiBlLmFwcGx5KFtdLGkpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGY7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiJiYoZj1hW2JdLGI9YSxhPWYpLG0uaXNGdW5jdGlvbihhKT8oYz1kLmNhbGwoYXJndW1lbnRzLDIpLGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShifHx0aGlzLGMuY29uY2F0KGQuY2FsbChhcmd1bWVudHMpKSl9LGUuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxtLmd1aWQrKyxlKTp2b2lkIDB9LG5vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0sc3VwcG9ydDprfSksbS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aFsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiByKGEpe3ZhciBiPSJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1tLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG0uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHM9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49TS5yZXBsYWNlKCJ3IiwidyMiKSxPPSJcXFsiK0wrIiooIitNKyIpKD86IitMKyIqKFsqXiR8IX5dPz0pIitMKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTisiKSl8KSIrTCsiKlxcXSIsUD0iOigiK00rIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK08rIikqKXwuKilcXCl8KSIsUT1uZXcgUmVnRXhwKEwrIisiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0wrIiskIiwiZyIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKiwiK0wrIioiKSxUPW5ldyBSZWdFeHAoIl4iK0wrIiooWz4rfl18IitMKyIpIitMKyIqIiksVT1uZXcgUmVnRXhwKCI9IitMKyIqKFteXFxdJ1wiXSo/KSIrTCsiKlxcXSIsImciKSxWPW5ldyBSZWdFeHAoUCksVz1uZXcgUmVnRXhwKCJeIitOKyIkIiksWD17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK08pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitQKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWj0vXmhcZCQvaSwkPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxfPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sYWE9L1srfl0vLGJhPS8nfFxcL2csY2E9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitMKyI/fCgiK0wrIil8LikiLCJpZyIpLGRhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxlYT1mdW5jdGlvbigpe20oKX07dHJ5e0guYXBwbHkoRT1JLmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLEVbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0g9e2FwcGx5OkUubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ry5hcHBseShhLEkuY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHMsdyx4O2lmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLGQ9ZHx8W10saz1iLm5vZGVUeXBlLCJzdHJpbmciIT10eXBlb2YgYXx8IWF8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiBkO2lmKCFlJiZwKXtpZigxMSE9PWsmJihmPV8uZXhlYyhhKSkpaWYoaj1mWzFdKXtpZig5PT09ayl7aWYoaD1iLmdldEVsZW1lbnRCeUlkKGopLCFofHwhaC5wYXJlbnROb2RlKXJldHVybiBkO2lmKGguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGg9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopKSYmdChiLGgpJiZoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaj1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopKSxkfWlmKGMucXNhJiYoIXF8fCFxLnRlc3QoYSkpKXtpZihzPXI9dSx3PWIseD0xIT09ayYmYSwxPT09ayYmIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe289ZyhhKSwocj1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1yLnJlcGxhY2UoYmEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLHMpLHM9IltpZD0nIitzKyInXSAiLGw9by5sZW5ndGg7d2hpbGUobC0tKW9bbF09cytyYShvW2xdKTt3PWFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIseD1vLmpvaW4oIiwiKX1pZih4KXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbCh4KSksZH1jYXRjaCh5KXt9ZmluYWxseXtyfHxiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShSLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGthKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9YS5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGxhKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBtYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gb2EoYSl7cmV0dXJuIGlhKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGlhKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gcGEoYSl7cmV0dXJuIGEmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmYX1jPWdhLnN1cHBvcnQ9e30sZj1nYS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89Zy5kb2N1bWVudEVsZW1lbnQsZT1nLmRlZmF1bHRWaWV3LGUmJmUhPT1lLnRvcCYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZWEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixlYSkpLHA9IWYoZyksYy5hdHRyaWJ1dGVzPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZy5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9JC50ZXN0KGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWphKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIWcuZ2V0RWxlbWVudHNCeU5hbWV8fCFnLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjJiZjLnBhcmVudE5vZGU/W2NdOltdfX0sZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNhLGRhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19KTooZGVsZXRlIGQuZmluZC5JRCxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09Yn19KSxkLmZpbmQuVEFHPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTpjLnFzYT9iLnF1ZXJ5U2VsZWN0b3JBbGwoYSk6dm9pZCAwfTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT0wLGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtpZigiKiI9PT1hKXt3aGlsZShjPWZbZSsrXSkxPT09Yy5ub2RlVHlwZSYmZC5wdXNoKGMpO3JldHVybiBkfXJldHVybiBmfSxkLmZpbmQuQ0xBU1M9Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhLGIpe3JldHVybiBwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9JC50ZXN0KGcucXVlcnlTZWxlY3RvckFsbCkpJiYoamEoZnVuY3Rpb24oYSl7by5hcHBlbmRDaGlsZChhKS5pbm5lckhUTUw9IjxhIGlkPSciK3UrIic+PC9hPjxzZWxlY3QgaWQ9JyIrdSsiLVxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe3ZhciBiPWcuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPSQudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLFApfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj0kLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHwkLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1nfHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PWd8fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxoPVthXSxpPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1nPy0xOmI9PT1nPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGxhKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaS51bnNoaWZ0KGMpO3doaWxlKGhbZF09PT1pW2RdKWQrKztyZXR1cm4gZD9sYShoW2RdLGlbZF0pOmhbZF09PT12Py0xOmlbZF09PT12PzE6MH0sZyk6bn0sZ2EubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBnYShhLG51bGwsbnVsbCxiKX0sZ2EubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFUsIj0nJDEnXSIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZELmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGNhLGRhKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShjYSxkYSksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGdhLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmdhLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlYudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0wrIikiK2ErIigiK0wrInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlLnJlcGxhY2UoUSwiICIpKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aWEoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUooYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aWEoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFIsIiQxIikpO3JldHVybiBkW3VdP2lhKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBnYShhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShjYSxkYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGNhLGRhKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpvYShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6b2EoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm9hKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46b2EoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6b2EoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpvYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1tYShiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1uYShiKTtmdW5jdGlvbiBxYSgpe31xYS5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHFhLGc9Z2EudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2dhLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcmEoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiBzYShhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdWEoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylnYShhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB3YShhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD13YShkKSksZSYmIWVbdV0mJihlPXdhKGUsZikpLGlhKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHVhKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnZhKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj12YShyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/SihmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dmEocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkguYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHhhKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbIiAiXSxpPWc/MTowLGs9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxsPXNhKGZ1bmN0aW9uKGEpe3JldHVybiBKKGIsYSk+LTF9LGgsITApLG09W2Z1bmN0aW9uKGEsYyxkKXt2YXIgZT0hZyYmKGR8fGMhPT1qKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKTtyZXR1cm4gYj1udWxsLGV9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3NhKHRhKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB3YShpPjEmJnRhKG0pLGk+MSYmcmEoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShSLCIkMSIpLGMsZT5pJiZ4YShhLnNsaWNlKGksZSkpLGY+ZSYmeGEoYT1hLnNsaWNlKGUpKSxmPmUmJnJhKGEpKX1tLnB1c2goYyl9cmV0dXJuIHRhKG0pfWZ1bmN0aW9uIHlhKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT0iMCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHY9dys9bnVsbD09dD8xOk1hdGgucmFuZG9tKCl8fC4xLHg9dS5sZW5ndGg7Zm9yKGsmJihqPWchPT1uJiZnKTtxIT09eCYmbnVsbCE9KGw9dVtxXSk7cSsrKXtpZihlJiZsKXttPTA7d2hpbGUobz1hW20rK10paWYobyhsLGcsaCkpe2kucHVzaChsKTticmVha31rJiYodz12KX1jJiYoKGw9IW8mJmwpJiZwLS0sZiYmci5wdXNoKGwpKX1pZihwKz1xLGMmJnEhPT1wKXttPTA7d2hpbGUobz1iW20rK10pbyhyLHMsZyxoKTtpZihmKXtpZihwPjApd2hpbGUocS0tKXJbcV18fHNbcV18fChzW3FdPUYuY2FsbChpKSk7cz12YShzKX1ILmFwcGx5KGkscyksayYmIWYmJnMubGVuZ3RoPjAmJnArYi5sZW5ndGg+MSYmZ2EudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9dixqPXQpLHJ9O3JldHVybiBjP2lhKGYpOmZ9cmV0dXJuIGg9Z2EuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXhhKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx5YShlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9Z2Euc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShjYSxkYSksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVgubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxhYS50ZXN0KGpbMF0udHlwZSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZyYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSxhYS50ZXN0KGEpJiZwYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGthKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGthKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGphKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxrYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxnYX0oYSk7bS5maW5kPXMsbS5leHByPXMuc2VsZWN0b3JzLG0uZXhwclsiOiJdPW0uZXhwci5wc2V1ZG9zLG0udW5pcXVlPXMudW5pcXVlU29ydCxtLnRleHQ9cy5nZXRUZXh0LG0uaXNYTUxEb2M9cy5pc1hNTCxtLmNvbnRhaW5zPXMuY29udGFpbnM7dmFyIHQ9bS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx1PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdj0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHcoYSxiLGMpe2lmKG0uaXNGdW5jdGlvbihiKSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYodi50ZXN0KGIpKXJldHVybiBtLmZpbHRlcihiLGEsYyk7Yj1tLmZpbHRlcihiLGEpfXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbS5pbkFycmF5KGEsYik+PTAhPT1jfSl9bS5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bS5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTptLmZpbmQubWF0Y2hlcyhhLG0uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbS5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG0oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG0uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbS5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bS51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXcodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnQudGVzdChhKT9tKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHgseT1hLmRvY3VtZW50LHo9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxBPW0uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTp6LmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2YgbT9iWzBdOmIsbS5tZXJnZSh0aGlzLG0ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eSwhMCkpLHUudGVzdChjWzFdKSYmbS5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbS5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD15LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHguZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXksdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTptLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB4LnJlYWR5P3gucmVhZHkoYSk6YShtKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxtLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bS5mbix4PW0oeSk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTttLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW0oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG0uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1tKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobS5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXQudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP20oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm0uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9tLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP20uaW5BcnJheSh0aGlzWzBdLG0oYSkpOm0uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS51bmlxdWUobS5tZXJnZSh0aGlzLmdldCgpLG0oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRChhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBtLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDptLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1tLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW0uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHwoZT1tLnVuaXF1ZShlKSksQi50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBFPS9cUysvZyxGPXt9O2Z1bmN0aW9uIEcoYSl7dmFyIGI9RlthXT17fTtyZXR1cm4gbS5lYWNoKGEubWF0Y2goRSl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bS5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/RlthXXx8RyhhKTptLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXttLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW0udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZtLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bS5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bS5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxtLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbS5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBtLkRlZmVycmVkKGZ1bmN0aW9uKGMpe20uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bS5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZtLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP20uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbS5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bS5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZtLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEg7bS5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbS5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxtLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9tLnJlYWR5V2FpdCsrOm0ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbS5yZWFkeVdhaXQ6IW0uaXNSZWFkeSl7aWYoIXkuYm9keSlyZXR1cm4gc2V0VGltZW91dChtLnJlYWR5KTttLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW0ucmVhZHlXYWl0PjB8fChILnJlc29sdmVXaXRoKHksW21dKSxtLmZuLnRyaWdnZXJIYW5kbGVyJiYobSh5KS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxtKHkpLm9mZigicmVhZHkiKSkpfX19KTtmdW5jdGlvbiBJKCl7eS5hZGRFdmVudExpc3RlbmVyPyh5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSkpOih5LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSikpfWZ1bmN0aW9uIEooKXsoeS5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKSYmKEkoKSxtLnJlYWR5KCkpfW0ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSClpZihIPW0uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKXNldFRpbWVvdXQobS5yZWFkeSk7ZWxzZSBpZih5LmFkZEV2ZW50TGlzdGVuZXIpeS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixKLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEosITEpO2Vsc2V7eS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixKKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEopO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ5LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbS5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUkoKSxtLnJlYWR5KCl9fSgpfXJldHVybiBILnByb21pc2UoYil9O3ZhciBLPSJ1bmRlZmluZWQiLEw7Zm9yKEwgaW4gbShrKSlicmVhaztrLm93bkxhc3Q9IjAiIT09TCxrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbShmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2M9eS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGUmJihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6aW5saW5lO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD1hPTM9PT1iLm9mZnNldFdpZHRoLGEmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoZCkpfSksZnVuY3Rpb24oKXt2YXIgYT15LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWsuZGVsZXRlRXhwYW5kbyl7ay5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2suZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG0uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1tLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE09L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxOPS8oW0EtWl0pL2c7ZnVuY3Rpb24gTyhhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE4sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpNLnRlc3QoYyk/bS5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bS5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFAoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW0uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTsNCg0KcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpew0KcmV0dXJuIG5ldyBaYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW0uVHdlZW49WmEsWmEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpaYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobS5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpaYS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1aYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bS5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LFphLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1aYS5wcm90b3R5cGUsWmEucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBudWxsPT1hLmVsZW1bYS5wcm9wXXx8YS5lbGVtLnN0eWxlJiZudWxsIT1hLmVsZW0uc3R5bGVbYS5wcm9wXT8oYj1tLmNzcyhhLmVsZW0sYS5wcm9wLCIiKSxiJiYiYXV0byIhPT1iP2I6MCk6YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXttLmZ4LnN0ZXBbYS5wcm9wXT9tLmZ4LnN0ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihudWxsIT1hLmVsZW0uc3R5bGVbbS5jc3NQcm9wc1thLnByb3BdXXx8bS5jc3NIb29rc1thLnByb3BdKT9tLnN0eWxlKGEuZWxlbSxhLnByb3AsYS5ub3crYS51bml0KTphLmVsZW1bYS5wcm9wXT1hLm5vd319fSxaYS5wcm9wSG9va3Muc2Nyb2xsVG9wPVphLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBlJiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19LG0uZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3aW5nOmZ1bmN0aW9uKGEpe3JldHVybi41LU1hdGguY29zKGEqTWF0aC5QSSkvMn19LG0uZng9WmEucHJvdG90eXBlLmluaXQsbS5meC5zdGVwPXt9O3ZhciAkYSxfYSxhYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sYmI9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1MrIikoW2EteiVdKikkIiwiaSIpLGNiPS9xdWV1ZUhvb2tzJC8sZGI9W2liXSxlYj17IioiOltmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3JlYXRlVHdlZW4oYSxiKSxkPWMuY3VyKCksZT1iYi5leGVjKGIpLGY9ZSYmZVszXXx8KG0uY3NzTnVtYmVyW2FdPyIiOiJweCIpLGc9KG0uY3NzTnVtYmVyW2FdfHwicHgiIT09ZiYmK2QpJiZiYi5leGVjKG0uY3NzKGMuZWxlbSxhKSksaD0xLGk9MjA7aWYoZyYmZ1szXSE9PWYpe2Y9Znx8Z1szXSxlPWV8fFtdLGc9K2R8fDE7ZG8gaD1ofHwiLjUiLGcvPWgsbS5zdHlsZShjLmVsZW0sYSxnK2YpO3doaWxlKGghPT0oaD1jLmN1cigpL2QpJiYxIT09aCYmLS1pKX1yZXR1cm4gZSYmKGc9Yy5zdGFydD0rZ3x8K2R8fDAsYy51bml0PWYsYy5lbmQ9ZVsxXT9nKyhlWzFdKzEpKmVbMl06K2VbMl0pLGN9XX07ZnVuY3Rpb24gZmIoKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpeyRhPXZvaWQgMH0pLCRhPW0ubm93KCl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYyxkPXtoZWlnaHQ6YX0sZT0wO2ZvcihiPWI/MTowOzQ+ZTtlKz0yLWIpYz1UW2VdLGRbIm1hcmdpbiIrY109ZFsicGFkZGluZyIrY109YTtyZXR1cm4gYiYmKGQub3BhY2l0eT1kLndpZHRoPWEpLGR9ZnVuY3Rpb24gaGIoYSxiLGMpe2Zvcih2YXIgZCxlPShlYltiXXx8W10pLmNvbmNhdChlYlsiKiJdKSxmPTAsZz1lLmxlbmd0aDtnPmY7ZisrKWlmKGQ9ZVtmXS5jYWxsKGMsYixhKSlyZXR1cm4gZH1mdW5jdGlvbiBpYihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosbCxuPXRoaXMsbz17fSxwPWEuc3R5bGUscT1hLm5vZGVUeXBlJiZVKGEpLHI9bS5fZGF0YShhLCJmeHNob3ciKTtjLnF1ZXVlfHwoaD1tLl9xdWV1ZUhvb2tzKGEsImZ4IiksbnVsbD09aC51bnF1ZXVlZCYmKGgudW5xdWV1ZWQ9MCxpPWguZW1wdHkuZmlyZSxoLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtoLnVucXVldWVkfHxpKCl9KSxoLnVucXVldWVkKyssbi5hbHdheXMoZnVuY3Rpb24oKXtuLmFsd2F5cyhmdW5jdGlvbigpe2gudW5xdWV1ZWQtLSxtLnF1ZXVlKGEsImZ4IikubGVuZ3RofHxoLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1hLm5vZGVUeXBlJiYoImhlaWdodCJpbiBifHwid2lkdGgiaW4gYikmJihjLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSxqPW0uY3NzKGEsImRpc3BsYXkiKSxsPSJub25lIj09PWo/bS5fZGF0YShhLCJvbGRkaXNwbGF5Iil8fEZhKGEubm9kZU5hbWUpOmosImlubGluZSI9PT1sJiYibm9uZSI9PT1tLmNzcyhhLCJmbG9hdCIpJiYoay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYiaW5saW5lIiE9PUZhKGEubm9kZU5hbWUpP3Auem9vbT0xOnAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLGMub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLGsuc2hyaW5rV3JhcEJsb2NrcygpfHxuLmFsd2F5cyhmdW5jdGlvbigpe3Aub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSk7Zm9yKGQgaW4gYilpZihlPWJbZF0sYWIuZXhlYyhlKSl7aWYoZGVsZXRlIGJbZF0sZj1mfHwidG9nZ2xlIj09PWUsZT09PShxPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1lfHwhcnx8dm9pZCAwPT09cltkXSljb250aW51ZTtxPSEwfW9bZF09ciYmcltkXXx8bS5zdHlsZShhLGQpfWVsc2Ugaj12b2lkIDA7aWYobS5pc0VtcHR5T2JqZWN0KG8pKSJpbmxpbmUiPT09KCJub25lIj09PWo/RmEoYS5ub2RlTmFtZSk6aikmJihwLmRpc3BsYXk9aik7ZWxzZXtyPyJoaWRkZW4iaW4gciYmKHE9ci5oaWRkZW4pOnI9bS5fZGF0YShhLCJmeHNob3ciLHt9KSxmJiYoci5oaWRkZW49IXEpLHE/bShhKS5zaG93KCk6bi5kb25lKGZ1bmN0aW9uKCl7bShhKS5oaWRlKCl9KSxuLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjttLl9yZW1vdmVEYXRhKGEsImZ4c2hvdyIpO2ZvcihiIGluIG8pbS5zdHlsZShhLGIsb1tiXSl9KTtmb3IoZCBpbiBvKWc9aGIocT9yW2RdOjAsZCxuKSxkIGluIHJ8fChyW2RdPWcuc3RhcnQscSYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBqYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW0uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbS5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1tLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIGtiKGEsYixjKXt2YXIgZCxlLGY9MCxnPWRiLmxlbmd0aCxoPW0uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPSRhfHxmYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczptLmV4dGVuZCh7fSxiKSxvcHRzOm0uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6JGF8fGZiKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1tLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9ZGJbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBtLm1hcChrLGhiLGopLG0uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG0uZngudGltZXIobS5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bS5BbmltYXRpb249bS5leHRlbmQoa2Ise3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXttLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sZWJbY109ZWJbY118fFtdLGViW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/ZGIudW5zaGlmdChhKTpkYi5wdXNoKGEpfX0pLG0uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9tLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG0uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbS5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1tLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbS5meC5zcGVlZHM/bS5meC5zcGVlZHNbZC5kdXJhdGlvbl06bS5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe20uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbS5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG0uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW0uaXNFbXB0eU9iamVjdChhKSxmPW0uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1rYih0aGlzLG0uZXh0ZW5kKHt9LGEpLGYpOyhlfHxtLl9kYXRhKHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bS50aW1lcnMsZz1tLl9kYXRhKHRoaXMpO2lmKGUpZ1tlXSYmZ1tlXS5zdG9wJiZkKGdbZV0pO2Vsc2UgZm9yKGUgaW4gZylnW2VdJiZnW2VdLnN0b3AmJmNiLnRlc3QoZSkmJmQoZ1tlXSk7Zm9yKGU9Zi5sZW5ndGg7ZS0tOylmW2VdLmVsZW0hPT10aGlzfHxudWxsIT1hJiZmW2VdLnF1ZXVlIT09YXx8KGZbZV0uYW5pbS5zdG9wKGMpLGI9ITEsZi5zcGxpY2UoZSwxKSk7KGJ8fCFjKSYmbS5kZXF1ZXVlKHRoaXMsYSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiBhIT09ITEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiLGM9bS5fZGF0YSh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bS50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG0ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW0uZm5bYl07bS5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdiKGIsITApLGEsZCxlKX19KSxtLmVhY2goe3NsaWRlRG93bjpnYigic2hvdyIpLHNsaWRlVXA6Z2IoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbS50aW1lcnM9W10sbS5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj1tLnRpbWVycyxjPTA7Zm9yKCRhPW0ubm93KCk7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEoKXx8YltjXSE9PWF8fGIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8bS5meC5zdG9wKCksJGE9dm9pZCAwfSxtLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe20udGltZXJzLnB1c2goYSksYSgpP20uZnguc3RhcnQoKTptLnRpbWVycy5wb3AoKX0sbS5meC5pbnRlcnZhbD0xMyxtLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7X2F8fChfYT1zZXRJbnRlcnZhbChtLmZ4LnRpY2ssbS5meC5pbnRlcnZhbCkpfSxtLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKF9hKSxfYT1udWxsfSxtLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxtLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bS5meD9tLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU7Yj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGIuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz15LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGU9Yy5hcHBlbmRDaGlsZCh5LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sZC5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4IixrLmdldFNldEF0dHJpYnV0ZT0idCIhPT1iLmNsYXNzTmFtZSxrLnN0eWxlPS90b3AvLnRlc3QoZC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGsuaHJlZk5vcm1hbGl6ZWQ9Ii9hIj09PWQuZ2V0QXR0cmlidXRlKCJocmVmIiksay5jaGVja09uPSEhYS52YWx1ZSxrLm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsay5lbmN0eXBlPSEheS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxjLmRpc2FibGVkPSEwLGsub3B0RGlzYWJsZWQ9IWUuZGlzYWJsZWQsYT15LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksay5pbnB1dD0iIj09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpLGEudmFsdWU9InQiLGEuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGI9L1xyL2c7bS5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW0uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxtKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bS5pc0FycmF5KGUpJiYoZT1tLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1tLnZhbEhvb2tzW3RoaXMudHlwZV18fG0udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1tLnZhbEhvb2tzW2UudHlwZV18fG0udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKGxiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxtLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjptLnRyaW0obS50ZXh0KGEpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9YS5vcHRpb25zLGU9YS5zZWxlY3RlZEluZGV4LGY9InNlbGVjdC1vbmUiPT09YS50eXBlfHwwPmUsZz1mP251bGw6W10saD1mP2UrMTpkLmxlbmd0aCxpPTA+ZT9oOmY/ZTowO2g+aTtpKyspaWYoYz1kW2ldLCEoIWMuc2VsZWN0ZWQmJmkhPT1lfHwoay5vcHREaXNhYmxlZD9jLmRpc2FibGVkOm51bGwhPT1jLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fGMucGFyZW50Tm9kZS5kaXNhYmxlZCYmbS5ub2RlTmFtZShjLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihiPW0oYykudmFsKCksZilyZXR1cm4gYjtnLnB1c2goYil9cmV0dXJuIGd9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLm9wdGlvbnMsZj1tLm1ha2VBcnJheShiKSxnPWUubGVuZ3RoO3doaWxlKGctLSlpZihkPWVbZ10sbS5pbkFycmF5KG0udmFsSG9va3Mub3B0aW9uLmdldChkKSxmKT49MCl0cnl7ZC5zZWxlY3RlZD1jPSEwfWNhdGNoKGgpe2Quc2Nyb2xsSGVpZ2h0fWVsc2UgZC5zZWxlY3RlZD0hMTtyZXR1cm4gY3x8KGEuc2VsZWN0ZWRJbmRleD0tMSksZX19fX0pLG0uZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe20udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmlzQXJyYXkoYik/YS5jaGVja2VkPW0uaW5BcnJheShtKGEpLnZhbCgpLGIpPj0wOnZvaWQgMH19LGsuY2hlY2tPbnx8KG0udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjphLnZhbHVlfSl9KTt2YXIgbWIsbmIsb2I9bS5leHByLmF0dHJIYW5kbGUscGI9L14oPzpjaGVja2VkfHNlbGVjdGVkKSQvaSxxYj1rLmdldFNldEF0dHJpYnV0ZSxyYj1rLmlucHV0O20uZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFYodGhpcyxtLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20ucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksbS5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKGEmJjMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09PUs/bS5wcm9wKGEsYixjKTooMT09PWYmJm0uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxkPW0uYXR0ckhvb2tzW2JdfHwobS5leHByLm1hdGNoLmJvb2wudGVzdChiKT9uYjptYikpLHZvaWQgMD09PWM/ZCYmImdldCJpbiBkJiZudWxsIT09KGU9ZC5nZXQoYSxiKSk/ZTooZT1tLmZpbmQuYXR0cihhLGIpLG51bGw9PWU/dm9pZCAwOmUpOm51bGwhPT1jP2QmJiJzZXQiaW4gZCYmdm9pZCAwIT09KGU9ZC5zZXQoYSxjLGIpKT9lOihhLnNldEF0dHJpYnV0ZShiLGMrIiIpLGMpOnZvaWQgbS5yZW1vdmVBdHRyKGEsYikpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEUpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bS5wcm9wRml4W2NdfHxjLG0uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/cmImJnFifHwhcGIudGVzdChjKT9hW2RdPSExOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTptLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZShxYj9jOmQpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFrLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZtLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fX0pLG5iPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bS5yZW1vdmVBdHRyKGEsYyk6cmImJnFifHwhcGIudGVzdChjKT9hLnNldEF0dHJpYnV0ZSghcWImJm0ucHJvcEZpeFtjXXx8YyxjKTphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG0uZWFjaChtLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPW9iW2JdfHxtLmZpbmQuYXR0cjtvYltiXT1yYiYmcWJ8fCFwYi50ZXN0KGIpP2Z1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj1vYltiXSxvYltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsb2JbYl09ZiksZX06ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHJiJiZxYnx8KG0uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTptYiYmbWIuc2V0KGEsYixjKX19KSxxYnx8KG1iPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sb2IuaWQ9b2IubmFtZT1vYi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxtLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0Om1iLnNldH0sbS5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe21iLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbS5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe20uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxrLnN0eWxlfHwobS5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgc2I9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksdGI9L14oPzphfGFyZWEpJC9pO20uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFYodGhpcyxtLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bS5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbS5leHRlbmQoe3Byb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSxwcm9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1hLm5vZGVUeXBlO2lmKGEmJjMhPT1nJiY4IT09ZyYmMiE9PWcpcmV0dXJuIGY9MSE9PWd8fCFtLmlzWE1MRG9jKGEpLGYmJihiPW0ucHJvcEZpeFtiXXx8YixlPW0ucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1tLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOnNiLnRlc3QoYS5ub2RlTmFtZSl8fHRiLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19fSksay5ocmVmTm9ybWFsaXplZHx8bS5lYWNoKFsiaHJlZiIsInNyYyJdLGZ1bmN0aW9uKGEsYil7bS5wcm9wSG9va3NbYl09e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiw0KX19fSksay5vcHRTZWxlY3RlZHx8KG0ucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9fSksbS5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXttLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksay5lbmN0eXBlfHwobS5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIik7dmFyIHViPS9bXHRcclxuXGZdL2c7bS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTAsaT10aGlzLmxlbmd0aCxqPSJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiAiKSl7Zj0wO3doaWxlKGU9YltmKytdKWQuaW5kZXhPZigiICIrZSsiICIpPDAmJihkKz1lKyIgIik7Zz1tLnRyaW0oZCksYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTAsaT10aGlzLmxlbmd0aCxqPTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGEmJmE7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihqKWZvcihiPShhfHwiIikubWF0Y2goRSl8fFtdO2k+aDtoKyspaWYoYz10aGlzW2hdLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oIiAiK2MuY2xhc3NOYW1lKyIgIikucmVwbGFjZSh1YiwiICIpOiIiKSl7Zj0wO3doaWxlKGU9YltmKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZSsiICIpPj0wKWQ9ZC5yZXBsYWNlKCIgIitlKyIgIiwiICIpO2c9YT9tLnRyaW0oZCk6IiIsYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnRoaXMuZWFjaChtLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYyl7bSh0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfTpmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09Yyl7dmFyIGIsZD0wLGU9bSh0aGlzKSxmPWEubWF0Y2goRSl8fFtdO3doaWxlKGI9ZltkKytdKWUuaGFzQ2xhc3MoYik/ZS5yZW1vdmVDbGFzcyhiKTplLmFkZENsYXNzKGIpfWVsc2UoYz09PUt8fCJib29sZWFuIj09PWMpJiYodGhpcy5jbGFzc05hbWUmJm0uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6bS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Q+YztjKyspaWYoMT09PXRoaXNbY10ubm9kZVR5cGUmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIikuaW5kZXhPZihiKT49MClyZXR1cm4hMDtyZXR1cm4hMX19KSxtLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxtLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pO3ZhciB2Yj1tLm5vdygpLHdiPS9cPy8seGI9LygsKXwoXFt8eyl8KH18XSl8Iig/OlteIlxcXHJcbl18XFxbIlxcXC9iZm5ydF18XFx1W1xkYS1mQS1GXXs0fSkqIlxzKjo/fHRydWV8ZmFsc2V8bnVsbHwtPyg/ITBcZClcZCsoPzpcLlxkK3wpKD86W2VFXVsrLV0/XGQrfCkvZzttLnBhcnNlSlNPTj1mdW5jdGlvbihiKXtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIrIiIpO3ZhciBjLGQ9bnVsbCxlPW0udHJpbShiKyIiKTtyZXR1cm4gZSYmIW0udHJpbShlLnJlcGxhY2UoeGIsZnVuY3Rpb24oYSxiLGUsZil7cmV0dXJuIGMmJmImJihkPTApLDA9PT1kP2E6KGM9ZXx8YixkKz0hZi0hZSwiIil9KSk/RnVuY3Rpb24oInJldHVybiAiK2UpKCk6bS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxtLnBhcnNlWE1MPWZ1bmN0aW9uKGIpe3ZhciBjLGQ7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7YS5ET01QYXJzZXI/KGQ9bmV3IERPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksYy5hc3luYz0iZmFsc2UiLGMubG9hZFhNTChiKSl9Y2F0Y2goZSl7Yz12b2lkIDB9cmV0dXJuIGMmJmMuZG9jdW1lbnRFbGVtZW50JiYhYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fG0uZXJyb3IoIkludmFsaWQgWE1MOiAiK2IpLGN9O3ZhciB5Yix6YixBYj0vIy4qJC8sQmI9LyhbPyZdKV89W14mXSovLENiPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvZ20sRGI9L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sRWI9L14oPzpHRVR8SEVBRCkkLyxGYj0vXlwvXC8vLEdiPS9eKFtcdy4rLV0rOikoPzpcL1wvKD86W15cLz8jXSpAfCkoW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLEhiPXt9LEliPXt9LEpiPSIqLyIuY29uY2F0KCIqIik7dHJ5e3piPWxvY2F0aW9uLmhyZWZ9Y2F0Y2goS2Ipe3piPXkuY3JlYXRlRWxlbWVudCgiYSIpLHpiLmhyZWY9IiIsemI9emIuaHJlZn15Yj1HYi5leGVjKHpiLnRvTG93ZXJDYXNlKCkpfHxbXTtmdW5jdGlvbiBMYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8W107aWYobS5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWQuY2hhckF0KDApPyhkPWQuc2xpY2UoMSl8fCIqIiwoYVtkXT1hW2RdfHxbXSkudW5zaGlmdChjKSk6KGFbZF09YVtkXXx8W10pLnB1c2goYyl9fWZ1bmN0aW9uIE1iKGEsYixjLGQpe3ZhciBlPXt9LGY9YT09PUliO2Z1bmN0aW9uIGcoaCl7dmFyIGk7cmV0dXJuIGVbaF09ITAsbS5lYWNoKGFbaF18fFtdLGZ1bmN0aW9uKGEsaCl7dmFyIGo9aChiLGMsZCk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBqfHxmfHxlW2pdP2Y/IShpPWopOnZvaWQgMDooYi5kYXRhVHlwZXMudW5zaGlmdChqKSxnKGopLCExKX0pLGl9cmV0dXJuIGcoYi5kYXRhVHlwZXNbMF0pfHwhZVsiKiJdJiZnKCIqIil9ZnVuY3Rpb24gTmIoYSxiKXt2YXIgYyxkLGU9bS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGIpdm9pZCAwIT09YltkXSYmKChlW2RdP2E6Y3x8KGM9e30pKVtkXT1iW2RdKTtyZXR1cm4gYyYmbS5leHRlbmQoITAsYSxjKSxhfWZ1bmN0aW9uIE9iKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY29udGVudHMsaT1hLmRhdGFUeXBlczt3aGlsZSgiKiI9PT1pWzBdKWkuc2hpZnQoKSx2b2lkIDA9PT1lJiYoZT1hLm1pbWVUeXBlfHxiLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYoZSlmb3IoZyBpbiBoKWlmKGhbZ10mJmhbZ10udGVzdChlKSl7aS51bnNoaWZ0KGcpO2JyZWFrfWlmKGlbMF1pbiBjKWY9aVswXTtlbHNle2ZvcihnIGluIGMpe2lmKCFpWzBdfHxhLmNvbnZlcnRlcnNbZysiICIraVswXV0pe2Y9ZzticmVha31kfHwoZD1nKX1mPWZ8fGR9cmV0dXJuIGY/KGYhPT1pWzBdJiZpLnVuc2hpZnQoZiksY1tmXSk6dm9pZCAwfWZ1bmN0aW9uIFBiKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaj17fSxrPWEuZGF0YVR5cGVzLnNsaWNlKCk7aWYoa1sxXSlmb3IoZyBpbiBhLmNvbnZlcnRlcnMpaltnLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1tnXTtmPWsuc2hpZnQoKTt3aGlsZShmKWlmKGEucmVzcG9uc2VGaWVsZHNbZl0mJihjW2EucmVzcG9uc2VGaWVsZHNbZl1dPWIpLCFpJiZkJiZhLmRhdGFGaWx0ZXImJihiPWEuZGF0YUZpbHRlcihiLGEuZGF0YVR5cGUpKSxpPWYsZj1rLnNoaWZ0KCkpaWYoIioiPT09ZilmPWk7ZWxzZSBpZigiKiIhPT1pJiZpIT09Zil7aWYoZz1qW2krIiAiK2ZdfHxqWyIqICIrZl0sIWcpZm9yKGUgaW4gailpZihoPWUuc3BsaXQoIiAiKSxoWzFdPT09ZiYmKGc9altpKyIgIitoWzBdXXx8alsiKiAiK2hbMF1dKSl7Zz09PSEwP2c9altlXTpqW2VdIT09ITAmJihmPWhbMF0say51bnNoaWZ0KGhbMV0pKTticmVha31pZihnIT09ITApaWYoZyYmYVsidGhyb3dzIl0pYj1nKGIpO2Vsc2UgdHJ5e2I9ZyhiKX1jYXRjaChsKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjpnP2w6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK2krIiB0byAiK2Z9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6Yn19bS5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnpiLHR5cGU6IkdFVCIsaXNMb2NhbDpEYi50ZXN0KHliWzFdKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkpiLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bS5wYXJzZUpTT04sInRleHQgeG1sIjptLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9OYihOYihhLG0uYWpheFNldHRpbmdzKSxiKTpOYihtLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpMYihIYiksYWpheFRyYW5zcG9ydDpMYihJYiksYWpheDpmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYj1ifHx7fTt2YXIgYyxkLGUsZixnLGgsaSxqLGs9bS5hamF4U2V0dXAoe30sYiksbD1rLmNvbnRleHR8fGssbj1rLmNvbnRleHQmJihsLm5vZGVUeXBlfHxsLmpxdWVyeSk/bShsKTptLmV2ZW50LG89bS5EZWZlcnJlZCgpLHA9bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikscT1rLnN0YXR1c0NvZGV8fHt9LHI9e30scz17fSx0PTAsdT0iY2FuY2VsZWQiLHY9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dCl7aWYoIWope2o9e307d2hpbGUoYj1DYi5leGVjKGYpKWpbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9althLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT10P2Y6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdHx8KGE9c1tjXT1zW2NdfHxhLHJbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdHx8KGsubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dClmb3IoYiBpbiBhKXFbYl09W3FbYl0sYVtiXV07ZWxzZSB2LmFsd2F5cyhhW3Yuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHU7cmV0dXJuIGkmJmkuYWJvcnQoYikseCgwLGIpLHRoaXN9fTtpZihvLnByb21pc2UodikuY29tcGxldGU9cC5hZGQsdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCxrLnVybD0oKGF8fGsudXJsfHx6YikrIiIpLnJlcGxhY2UoQWIsIiIpLnJlcGxhY2UoRmIseWJbMV0rIi8vIiksay50eXBlPWIubWV0aG9kfHxiLnR5cGV8fGsubWV0aG9kfHxrLnR5cGUsay5kYXRhVHlwZXM9bS50cmltKGsuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8WyIiXSxudWxsPT1rLmNyb3NzRG9tYWluJiYoYz1HYi5leGVjKGsudXJsLnRvTG93ZXJDYXNlKCkpLGsuY3Jvc3NEb21haW49ISghY3x8Y1sxXT09PXliWzFdJiZjWzJdPT09eWJbMl0mJihjWzNdfHwoImh0dHA6Ij09PWNbMV0/IjgwIjoiNDQzIikpPT09KHliWzNdfHwoImh0dHA6Ij09PXliWzFdPyI4MCI6IjQ0MyIpKSkpLGsuZGF0YSYmay5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBrLmRhdGEmJihrLmRhdGE9bS5wYXJhbShrLmRhdGEsay50cmFkaXRpb25hbCkpLE1iKEhiLGssYix2KSwyPT09dClyZXR1cm4gdjtoPW0uZXZlbnQmJmsuZ2xvYmFsLGgmJjA9PT1tLmFjdGl2ZSsrJiZtLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGsudHlwZT1rLnR5cGUudG9VcHBlckNhc2UoKSxrLmhhc0NvbnRlbnQ9IUViLnRlc3Qoay50eXBlKSxlPWsudXJsLGsuaGFzQ29udGVudHx8KGsuZGF0YSYmKGU9ay51cmwrPSh3Yi50ZXN0KGUpPyImIjoiPyIpK2suZGF0YSxkZWxldGUgay5kYXRhKSxrLmNhY2hlPT09ITEmJihrLnVybD1CYi50ZXN0KGUpP2UucmVwbGFjZShCYiwiJDFfPSIrdmIrKyk6ZSsod2IudGVzdChlKT8iJiI6Ij8iKSsiXz0iK3ZiKyspKSxrLmlmTW9kaWZpZWQmJihtLmxhc3RNb2RpZmllZFtlXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbS5sYXN0TW9kaWZpZWRbZV0pLG0uZXRhZ1tlXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixtLmV0YWdbZV0pKSwoay5kYXRhJiZrLmhhc0NvbnRlbnQmJmsuY29udGVudFR5cGUhPT0hMXx8Yi5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixrLmNvbnRlbnRUeXBlKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsay5kYXRhVHlwZXNbMF0mJmsuYWNjZXB0c1trLmRhdGFUeXBlc1swXV0/ay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXSsoIioiIT09ay5kYXRhVHlwZXNbMF0/IiwgIitKYisiOyBxPTAuMDEiOiIiKTprLmFjY2VwdHNbIioiXSk7Zm9yKGQgaW4gay5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcihkLGsuaGVhZGVyc1tkXSk7aWYoay5iZWZvcmVTZW5kJiYoay5iZWZvcmVTZW5kLmNhbGwobCx2LGspPT09ITF8fDI9PT10KSlyZXR1cm4gdi5hYm9ydCgpO3U9ImFib3J0Ijtmb3IoZCBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W2RdKGtbZF0pO2lmKGk9TWIoSWIsayxiLHYpKXt2LnJlYWR5U3RhdGU9MSxoJiZuLnRyaWdnZXIoImFqYXhTZW5kIixbdixrXSksay5hc3luYyYmay50aW1lb3V0PjAmJihnPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGsudGltZW91dCkpO3RyeXt0PTEsaS5zZW5kKHIseCl9Y2F0Y2godyl7aWYoISgyPnQpKXRocm93IHc7eCgtMSx3KX19ZWxzZSB4KC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiB4KGEsYixjLGQpe3ZhciBqLHIscyx1LHcseD1iOzIhPT10JiYodD0yLGcmJmNsZWFyVGltZW91dChnKSxpPXZvaWQgMCxmPWR8fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowLGo9YT49MjAwJiYzMDA+YXx8MzA0PT09YSxjJiYodT1PYihrLHYsYykpLHU9UGIoayx1LHYsaiksaj8oay5pZk1vZGlmaWVkJiYodz12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksdyYmKG0ubGFzdE1vZGlmaWVkW2VdPXcpLHc9di5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpLHcmJihtLmV0YWdbZV09dykpLDIwND09PWF8fCJIRUFEIj09PWsudHlwZT94PSJub2NvbnRlbnQiOjMwND09PWE/eD0ibm90bW9kaWZpZWQiOih4PXUuc3RhdGUscj11LmRhdGEscz11LmVycm9yLGo9IXMpKToocz14LChhfHwheCkmJih4PSJlcnJvciIsMD5hJiYoYT0wKSkpLHYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PShifHx4KSsiIixqP28ucmVzb2x2ZVdpdGgobCxbcix4LHZdKTpvLnJlamVjdFdpdGgobCxbdix4LHNdKSx2LnN0YXR1c0NvZGUocSkscT12b2lkIDAsaCYmbi50cmlnZ2VyKGo/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbdixrLGo/cjpzXSkscC5maXJlV2l0aChsLFt2LHhdKSxoJiYobi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGtdKSwtLW0uYWN0aXZlfHxtLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gdn0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZ2V0KGEsYixjLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmdldChhLHZvaWQgMCxiLCJzY3JpcHQiKX19KSxtLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxiKXttW2JdPWZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBtLmlzRnVuY3Rpb24oYykmJihlPWV8fGQsZD1jLGM9dm9pZCAwKSxtLmFqYXgoe3VybDphLHR5cGU6YixkYXRhVHlwZTplLGRhdGE6YyxzdWNjZXNzOmR9KX19KSxtLl9ldmFsVXJsPWZ1bmN0aW9uKGEpe3JldHVybiBtLmFqYXgoe3VybDphLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSl9LG0uZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1tKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiYxPT09YS5maXJzdENoaWxkLm5vZGVUeXBlKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChtLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfTpmdW5jdGlvbigpe3ZhciBiPW0odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bS5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bSh0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe20ubm9kZU5hbWUodGhpcywiYm9keSIpfHxtKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KSxtLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wfHwhay5yZWxpYWJsZUhpZGRlbk9mZnNldHMoKSYmIm5vbmUiPT09KGEuc3R5bGUmJmEuc3R5bGUuZGlzcGxheXx8bS5jc3MoYSwiZGlzcGxheSIpKX0sbS5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbS5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgUWI9LyUyMC9nLFJiPS9cW1xdJC8sU2I9L1xyP1xuL2csVGI9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFViPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBWYihhLGIsYyxkKXt2YXIgZTtpZihtLmlzQXJyYXkoYikpbS5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxSYi50ZXN0KGEpP2QoYSxlKTpWYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bS50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpVmIoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW0ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW0uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1tLmFqYXhTZXR0aW5ncyYmbS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG0uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFtLmlzUGxhaW5PYmplY3QoYSkpbS5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlWYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShRYiwiKyIpfSxtLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG0ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1tLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9tLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFtKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmVWIudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVRiLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFXLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bSh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm0uaXNBcnJheShjKT9tLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoU2IsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKFNiLCJcclxuIil9fSkuZ2V0KCl9fSksbS5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJi9eKGdldHxwb3N0fGhlYWR8cHV0fGRlbGV0ZXxvcHRpb25zKSQvaS50ZXN0KHRoaXMudHlwZSkmJlpiKCl8fCRiKCl9OlpiO3ZhciBXYj0wLFhiPXt9LFliPW0uYWpheFNldHRpbmdzLnhocigpO2EuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBYYilYYlthXSh2b2lkIDAsITApfSksay5jb3JzPSEhWWImJiJ3aXRoQ3JlZGVudGlhbHMiaW4gWWIsWWI9ay5hamF4PSEhWWIsWWImJm0uYWpheFRyYW5zcG9ydChmdW5jdGlvbihhKXtpZighYS5jcm9zc0RvbWFpbnx8ay5jb3JzKXt2YXIgYjtyZXR1cm57c2VuZDpmdW5jdGlvbihjLGQpe3ZhciBlLGY9YS54aHIoKSxnPSsrV2I7aWYoZi5vcGVuKGEudHlwZSxhLnVybCxhLmFzeW5jLGEudXNlcm5hbWUsYS5wYXNzd29yZCksYS54aHJGaWVsZHMpZm9yKGUgaW4gYS54aHJGaWVsZHMpZltlXT1hLnhockZpZWxkc1tlXTthLm1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZShhLm1pbWVUeXBlKSxhLmNyb3NzRG9tYWlufHxjWyJYLVJlcXVlc3RlZC1XaXRoIl18fChjWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKGUgaW4gYyl2b2lkIDAhPT1jW2VdJiZmLnNldFJlcXVlc3RIZWFkZXIoZSxjW2VdKyIiKTtmLnNlbmQoYS5oYXNDb250ZW50JiZhLmRhdGF8fG51bGwpLGI9ZnVuY3Rpb24oYyxlKXt2YXIgaCxpLGo7aWYoYiYmKGV8fDQ9PT1mLnJlYWR5U3RhdGUpKWlmKGRlbGV0ZSBYYltnXSxiPXZvaWQgMCxmLm9ucmVhZHlzdGF0ZWNoYW5nZT1tLm5vb3AsZSk0IT09Zi5yZWFkeVN0YXRlJiZmLmFib3J0KCk7ZWxzZXtqPXt9LGg9Zi5zdGF0dXMsInN0cmluZyI9PXR5cGVvZiBmLnJlc3BvbnNlVGV4dCYmKGoudGV4dD1mLnJlc3BvbnNlVGV4dCk7dHJ5e2k9Zi5zdGF0dXNUZXh0fWNhdGNoKGspe2k9IiJ9aHx8IWEuaXNMb2NhbHx8YS5jcm9zc0RvbWFpbj8xMjIzPT09aCYmKGg9MjA0KTpoPWoudGV4dD8yMDA6NDA0fWomJmQoaCxpLGosZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSl9LGEuYXN5bmM/ND09PWYucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KGIpOmYub25yZWFkeXN0YXRlY2hhbmdlPVhiW2ddPWI6YigpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIodm9pZCAwLCEwKX19fX0pO2Z1bmN0aW9uIFpiKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fWZ1bmN0aW9uICRiKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319bS5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi8oPzpqYXZhfGVjbWEpc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtyZXR1cm4gbS5nbG9iYWxFdmFsKGEpLGF9fX0pLG0uYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXt2b2lkIDA9PT1hLmNhY2hlJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxtLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGIsYz15LmhlYWR8fG0oImhlYWQiKVswXXx8eS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXtiPXkuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksYi5hc3luYz0hMCxhLnNjcmlwdENoYXJzZXQmJihiLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxiLnNyYz1hLnVybCxiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpeyhjfHwhYi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGIucmVhZHlTdGF0ZSkpJiYoYi5vbmxvYWQ9Yi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGwsY3x8ZSgyMDAsInN1Y2Nlc3MiKSl9LGMuaW5zZXJ0QmVmb3JlKGIsYy5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtiJiZiLm9ubG9hZCh2b2lkIDAsITApfX19fSk7dmFyIF9iPVtdLGFjPS8oPSlcPyg/PSZ8JCl8XD9cPy87bS5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPV9iLnBvcCgpfHxtLmV4cGFuZG8rIl8iK3ZiKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxtLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaD1iLmpzb25wIT09ITEmJihhYy50ZXN0KGIudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGIuZGF0YSYmIShiLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmFjLnRlc3QoYi5kYXRhKSYmImRhdGEiKTtyZXR1cm4gaHx8Impzb25wIj09PWIuZGF0YVR5cGVzWzBdPyhlPWIuanNvbnBDYWxsYmFjaz1tLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaD9iW2hdPWJbaF0ucmVwbGFjZShhYywiJDEiK2UpOmIuanNvbnAhPT0hMSYmKGIudXJsKz0od2IudGVzdChiLnVybCk/IiYiOiI/IikrYi5qc29ucCsiPSIrZSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGd8fG0uZXJyb3IoZSsiIHdhcyBub3QgY2FsbGVkIiksZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iLGY9YVtlXSxhW2VdPWZ1bmN0aW9uKCl7Zz1hcmd1bWVudHN9LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtlXT1mLGJbZV0mJihiLmpzb25wQ2FsbGJhY2s9Yy5qc29ucENhbGxiYWNrLF9iLnB1c2goZSkpLGcmJm0uaXNGdW5jdGlvbihmKSYmZihnWzBdKSxnPWY9dm9pZCAwfSksInNjcmlwdCIpOnZvaWQgMH0pLG0ucGFyc2VIVE1MPWZ1bmN0aW9uKGEsYixjKXtpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSksYj1ifHx5O3ZhciBkPXUuZXhlYyhhKSxlPSFjJiZbXTtyZXR1cm4gZD9bYi5jcmVhdGVFbGVtZW50KGRbMV0pXTooZD1tLmJ1aWxkRnJhZ21lbnQoW2FdLGIsZSksZSYmZS5sZW5ndGgmJm0oZSkucmVtb3ZlKCksbS5tZXJnZShbXSxkLmNoaWxkTm9kZXMpKX07dmFyIGJjPW0uZm4ubG9hZDttLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe2lmKCJzdHJpbmciIT10eXBlb2YgYSYmYmMpcmV0dXJuIGJjLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZCxlLGYsZz10aGlzLGg9YS5pbmRleE9mKCIgIik7cmV0dXJuIGg+PTAmJihkPW0udHJpbShhLnNsaWNlKGgsYS5sZW5ndGgpKSxhPWEuc2xpY2UoMCxoKSksbS5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJiJvYmplY3QiPT10eXBlb2YgYiYmKGY9IlBPU1QiKSxnLmxlbmd0aD4wJiZtLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtlPWFyZ3VtZW50cyxnLmh0bWwoZD9tKCI8ZGl2PiIpLmFwcGVuZChtLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmNvbXBsZXRlKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGMsZXx8W2EucmVzcG9uc2VUZXh0LGIsYV0pfSksdGhpc30sbS5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbS5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZ3JlcChtLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIGNjPWEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Z1bmN0aW9uIGRjKGEpe3JldHVybiBtLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9bS5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1tLmNzcyhhLCJwb3NpdGlvbiIpLGw9bShhKSxuPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bS5jc3MoYSwidG9wIiksaT1tLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmbS5pbkFycmF5KCJhdXRvIixbZixpXSk+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG0uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihuLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihuLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxuKTpsLmNzcyhuKX19LG0uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXttLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG0uY29udGFpbnMoYixlKT8odHlwZW9mIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09SyYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1kYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bS5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbS5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1tLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bS5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3AtbS5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW0uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8Y2M7d2hpbGUoYSYmIW0ubm9kZU5hbWUoYSwiaHRtbCIpJiYic3RhdGljIj09PW0uY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8Y2N9KX19KSxtLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0vWS8udGVzdChiKTttLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBWKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmPWRjKGEpO3JldHVybiB2b2lkIDA9PT1lP2Y/YiBpbiBmP2ZbYl06Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP20oZikuc2Nyb2xsTGVmdCgpOmUsYz9lOm0oZikuc2Nyb2xsVG9wKCkpOmFbZF09ZSl9LGEsZCxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG0uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09TGEoay5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9SmEoYSxiKSxIYS50ZXN0KGMpP20oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbS5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXttLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bS5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG0uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bS5jc3MoYixjLGcpOm0uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbS5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxtLmZuLmFuZFNlbGY9bS5mbi5hZGRCYWNrLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBtfSk7dmFyIGVjPWEualF1ZXJ5LGZjPWEuJDtyZXR1cm4gbS5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1tJiYoYS4kPWZjKSxiJiZhLmpRdWVyeT09PW0mJihhLmpRdWVyeT1lYyksbX0sdHlwZW9mIGI9PT1LJiYoYS5qUXVlcnk9YS4kPW0pLG19KTsNCg=="></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>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBjKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGwoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT1wYXx8blswXT09PXZhP3ZhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT12YT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9ZGEubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PWRhW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBsO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksbz1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YobykpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7dGEuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9dGEuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gRShuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9dGEuZXZlbnQ7dS50YXJnZXQ9bix0YS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7dGEuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEEobil7cmV0dXJuIHlhKG4sX2EpLG59ZnVuY3Rpb24gTihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIE1hKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiB4YShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gYSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP2E6bzpuLmxvY2FsP2k6dX1mdW5jdGlvbiBxKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIEwobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3RhLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1MKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlP3QuY3JlYXRlRWxlbWVudE5TKGUsbik6dC5jcmVhdGVFbGVtZW50KG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztvKyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIHlhKG4sU2EpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8sYT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIHUoKXt2YXIgdT1jKHQscmEoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit0YS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxjPSQ7YT4wJiYobj1uLnNsaWNlKDAsYSkpO3ZhciBsPWthLmdldChuKTtyZXR1cm4gbCYmKG49bCxjPUIpLGE/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10YS5ldmVudDt0YS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7dGEuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK0FhLHU9ImNsaWNrIityLGk9dGEuc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09RWEmJihFYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxFYSl7dmFyIG89bihlKS5zdHlsZSxhPW9bRWFdO29bRWFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLEVhJiYob1tFYV09YSksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TmEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9dGEuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO05hPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBOYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtYS5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktYS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xPzA6LTE+bj9xYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdHQobil7cmV0dXJuIG4+MT9SYTotMT5uPy1SYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZXQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcnQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdXQobil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGl0KG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb3QoKXt9ZnVuY3Rpb24gYXQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYXQ/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGF0P25ldyBhdChuLmgsbi5zLG4ubCk6YnQoIiIrbixfdCxhdCk6bmV3IGF0KG4sdCxlKX1mdW5jdGlvbiBjdChuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhvLWkpKm4vNjA6MTgwPm4/bzoyNDA+bj9pKyhvLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxvO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxvPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1vLG5ldyBtdCh1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBsdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBsdD8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbHQ/bmV3IGx0KG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgZnQ/Z3Qobi5sLG4uYSxuLmIpOmd0KChuPXd0KChuPXRhLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgbHQobix0LGUpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgZnQoZSxNYXRoLmNvcyhuKj1EYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBmdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmdD8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgZnQ/bmV3IGZ0KG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgbHQ/c3Qobi5oLG4uYyxuLmwpOnd0KChuPW10KG4pKS5yLG4uZyxuLmIpOm5ldyBmdChuLHQsZSl9ZnVuY3Rpb24gaHQobix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT1wdCh1KSpYYSxyPXB0KHIpKiRhLGk9cHQoaSkqQmEsbmV3IG10KGR0KDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLGR0KC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxkdCguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBndChuLHQsZSl7cmV0dXJuIG4+MD9uZXcgbHQoTWF0aC5hdGFuMihlLHQpKlBhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgbHQoMC8wLDAvMCxuKX1mdW5jdGlvbiBwdChuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBkdChuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBtdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBtdD8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbXQ/bmV3IG10KG4ucixuLmcsbi5iKTpidCgiIituLG10LGN0KTpuZXcgbXQobix0LGUpfWZ1bmN0aW9uIHl0KG4pe3JldHVybiBuZXcgbXQobj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIE10KG4pe3JldHVybiB5dChuKSsiIn1mdW5jdGlvbiB4dChuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBidChuLHQsZSl7dmFyIHIsdSxpLG89MCxhPTAsYz0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvaS5leGVjKG4pKXN3aXRjaCh1PXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdCh1WzBdKSxwYXJzZUZsb2F0KHVbMV0pLzEwMCxwYXJzZUZsb2F0KHVbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KGt0KHVbMF0pLGt0KHVbMV0pLGt0KHVbMl0pKX1yZXR1cm4oaT1HYS5nZXQobi50b0xvd2VyQ2FzZSgpKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gX3Qobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgYXQocix1LGMpfWZ1bmN0aW9uIHd0KG4sdCxlKXtuPVN0KG4pLHQ9U3QodCksZT1TdChlKTt2YXIgcj12dCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL1hhKSx1PXZ0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS8kYSksaT12dCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvQmEpO3JldHVybiBmdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiBTdChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBrdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIEV0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGkscil9by5sb2FkLmNhbGwoaSxuKX1lbHNlIG8uZXJyb3IuY2FsbChpLGMpfXZhciBpPXt9LG89dGEuZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGE9e30sYz1uZXcgWE1MSHR0cFJlcXVlc3QsbD1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KHRjKSx0Yz1zZXRUaW1lb3V0KHF0LHQpKSxuYz0wKToobmM9MSxyYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3IoZWM9S2E7ZWM7KW4+PWVjLnQmJihlYy5mPWVjLmMobi1lYy50KSksZWM9ZWMubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PUthLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjpLYT10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIFFhPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypnYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1pYy5leGVjKG4pLHI9ZVsxXXx8IiAiLG89ZVsyXXx8Ij4iLGE9ZVszXXx8Ii0iLGM9ZVs0XXx8IiIsbD1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGx8fCIwIj09PXImJiI9Ij09PW8pJiYobD1yPSIwIixvPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWMmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1jJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9b2MuZ2V0KGcpfHxVdDt2YXIgTT1sJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PWE/IiI6YTtpZigwPnApe3ZhciBjPXRhLmZvcm1hdFByZWZpeChuLGgpO249Yy5zY2FsZShuKSxlPWMuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFsJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09bz91K24razoiPiI9PT1vP2srdStuOiJeIj09PW8/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gVXQobil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24ganQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIEZ0KG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBjYyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBjYygrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4pLGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywxKTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVuY3Rpb24gYShuLHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPW4sbyhyLHQsZSl9ZmluYWxseXtjYz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1vO3ZhciBjPW4udXRjPUh0KG4pO3JldHVybiBjLmZsb29yPWMsYy5yb3VuZD1IdChyKSxjLmNlaWw9SHQodSksYy5vZmZzZXQ9SHQoaSksYy5yYW5nZT1hLG59ZnVuY3Rpb24gSHQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtjYz1EYXRlfX19ZnVuY3Rpb24gT3Qobil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLGM9MDsrK2E8cjspMzc9PT1uLmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zbGljZShjLGEpKSxudWxsIT0odT1zY1tlPW4uY2hhckF0KCsrYSldKSYmKGU9bi5jaGFyQXQoKythKSksKGk9TltlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksby5wdXNoKGUpLGM9YSsxKTtyZXR1cm4gby5wdXNoKG4uc2xpY2UoYyxhKSksby5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZjYyE9PWp0LG89bmV3KGk/anQ6Y2MpO3JldHVybiJqImluIHI/by5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJ3ImluIHImJigiVyJpbiByfHwiVSJpbiByKT8oby5zZXRGdWxsWWVhcihyLnksMCwxKSxvLnNldEZ1bGxZZWFyKHIueSwwLCJXImluIHI/KHIudys2KSU3Kzcqci5XLShvLmdldERheSgpKzUpJTc6ci53Kzcqci5VLShvLmdldERheSgpKzYpJTcpKTpvLnNldEZ1bGxZZWFyKHIueSxyLm0sci5kKSxvLnNldEhvdXJzKHIuSCsoci5aLzEwMHwwKSxyLk0rci5aJTEwMCxyLlMsci5MKSxpP28uXzpvfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHR9ZnVuY3Rpb24gZShuLHQsZSxyKXtmb3IodmFyIHUsaSxvLGE9MCxjPXQubGVuZ3RoLGw9ZS5sZW5ndGg7Yz5hOyl7aWYocj49bClyZXR1cm4tMTtpZih1PXQuY2hhckNvZGVBdChhKyspLDM3PT09dSl7aWYobz10LmNoYXJBdChhKyspLGk9Q1tvIGluIHNjP3QuY2hhckF0KGErKyk6b10sIWl8fChyPWkobixlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYodSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gcihuLHQsZSl7Xy5sYXN0SW5kZXg9MDt2YXIgcj1fLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz13LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHUobix0LGUpe3gubGFzdEluZGV4PTA7dmFyIHI9eC5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9Yi5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtFLmxhc3RJbmRleD0wO3ZhciByPUUuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPUEuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyhuLHQsZSl7Uy5sYXN0SW5kZXg9MDt2YXIgcj1TLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1rLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LHIpe3JldHVybiBlKG4sTi5jLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLE4ueC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixOLlgudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIHMobix0LGUpe3ZhciByPU0uZ2V0KHQuc2xpY2UoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxkPW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dHJ5e2NjPWp0O3ZhciB0PW5ldyBjYztyZXR1cm4gdC5fPW4scih0KX1maW5hbGx5e2NjPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5e2NjPWp0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e2NjPURhdGV9fSxlLnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT1hZTt2YXIgTT10YS5tYXAoKSx4PVl0KHYpLGI9WnQodiksXz1ZdChkKSx3PVp0KGQpLFM9WXQobSksaz1adChtKSxFPVl0KHkpLEE9WnQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7TS5zZXQobi50b0xvd2VyQ2FzZSgpLHQpfSk7dmFyIE49e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rpb24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRNb250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpJTEyfHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KDErYWMuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gcFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldFNlY29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjppZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxDPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6UXQsZTpRdCxIOnRlLEk6dGUsajpuZSxMOnVlLG06S3QsTTplZSxwOnMsUzpyZSxVOlh0LHc6VnQsVzokdCx4OmMsWDpsLHk6V3QsWTpCdCxaOkp0LCIlIjpvZX07cmV0dXJuIHR9ZnVuY3Rpb24gSXQobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUtaSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gWXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKHRhLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBadChuKXtmb3IodmFyIHQ9bmV3IGwsZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVnQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByPyhuLnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWHQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdChuLHQsZSl7ZmMubGFzdEluZGV4PTA7dmFyIHI9ZmMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8obi55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi55PUd0KCtyWzBdKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KHQ9dC5zbGljZShlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5jdGlvbiBHdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gS3Qobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKSxlPXQ+MD8iLSI6IisiLHI9Z2EodCkvNjB8MCx1PWdhKHQpJTYwO3JldHVybiBlK0l0KHIsIjAiLDIpK0l0KHUsIjAiLDIpfWZ1bmN0aW9uIG9lKG4sdCxlKXtoYy5sYXN0SW5kZXg9MDt2YXIgcj1oYy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGFlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPS0xOysrZTx0OyluW2VdWzBdPXRoaXMobltlXVswXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9bltlXTshclsxXSh0KTspcj1uWysrZV07cmV0dXJuIHJbMF0odCl9fWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIGxlKG4sdCxlKXt2YXIgcj1lLnM9bit0LHU9ci1uLGk9ci11O2UudD1uLWkrKHQtdSl9ZnVuY3Rpb24gc2Uobix0KXtuJiZkYy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpJiZkY1tuLnR5cGVdKG4sdCl9ZnVuY3Rpb24gZmUobix0LGUpe3ZhciByLHU9LTEsaT1uLmxlbmd0aC1lO2Zvcih0LmxpbmVTdGFydCgpOysrdTxpOylyPW5bdV0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gaGUobix0KXt2YXIgZT0tMSxyPW4ubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxyOylmZShuW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gZ2UoKXtmdW5jdGlvbiBuKG4sdCl7bio9RGEsdD10KkRhLzIrcWEvNDt2YXIgZT1uLXIsbz1lPj0wPzE6LTEsYT1vKmUsYz1NYXRoLmNvcyh0KSxsPU1hdGguc2luKHQpLHM9aSpsLGY9dSpjK3MqTWF0aC5jb3MoYSksaD1zKm8qTWF0aC5zaW4oYSk7eWMuYWRkKE1hdGguYXRhbjIoaCxmKSkscj1uLHU9YyxpPWx9dmFyIHQsZSxyLHUsaTtNYy5wb2ludD1mdW5jdGlvbihvLGEpe01jLnBvaW50PW4scj0odD1vKSpEYSx1PU1hdGguY29zKGE9KGU9YSkqRGEvMitxYS80KSxpPU1hdGguc2luKGEpfSxNYy5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBwZShuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHZlKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIGRlKG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBtZShuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIHllKG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiBNZShuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIHhlKG4pe3JldHVybltNYXRoLmF0YW4yKG5bMV0sblswXSksdHQoblsyXSldfWZ1bmN0aW9uIGJlKG4sdCl7cmV0dXJuIGdhKG5bMF0tdFswXSk8Q2EmJmdhKG5bMV0tdFsxXSk8Q2F9ZnVuY3Rpb24gX2Uobix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSk7d2UoZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pLE1hdGguc2luKHQpKX1mdW5jdGlvbiB3ZShuLHQsZSl7Kyt4YyxfYys9KG4tX2MpL3hjLHdjKz0odC13YykveGMsU2MrPShlLVNjKS94Y31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIG4obix1KXtuKj1EYTt2YXIgaT1NYXRoLmNvcyh1Kj1EYSksbz1pKk1hdGguY29zKG4pLGE9aSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHUpLGw9TWF0aC5hdGFuMihNYXRoLnNxcnQoKGw9ZSpjLXIqYSkqbCsobD1yKm8tdCpjKSpsKyhsPXQqYS1lKm8pKmwpLHQqbytlKmErcipjKTtiYys9bCxrYys9bCoodCsodD1vKSksRWMrPWwqKGUrKGU9YSkpLEFjKz1sKihyKyhyPWMpKSx3ZSh0LGUscil9dmFyIHQsZSxyO3FjLnBvaW50PWZ1bmN0aW9uKHUsaSl7dSo9RGE7dmFyIG89TWF0aC5jb3MoaSo9RGEpO3Q9bypNYXRoLmNvcyh1KSxlPW8qTWF0aC5zaW4odSkscj1NYXRoLnNpbihpKSxxYy5wb2ludD1uLHdlKHQsZSxyKX19ZnVuY3Rpb24ga2UoKXtxYy5wb2ludD1fZX1mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIG4obix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSksbz1lKk1hdGguY29zKG4pLGE9ZSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHQpLGw9dSpjLWkqYSxzPWkqby1yKmMsZj1yKmEtdSpvLGg9TWF0aC5zcXJ0KGwqbCtzKnMrZipmKSxnPXIqbyt1KmEraSpjLHA9aCYmLW50KGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TmMrPXAqbCxDYys9cCpzLHpjKz1wKmYsYmMrPXYsa2MrPXYqKHIrKHI9bykpLEVjKz12Kih1Kyh1PWEpKSxBYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7cWMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLHFjLnBvaW50PW4sbyo9RGE7dmFyIGM9TWF0aC5jb3MoYSo9RGEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LHFjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSkscWMubGluZUVuZD1rZSxxYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdm9pZCB1LmxpbmVFbmQoKX12YXIgYz1uZXcgcWUoZSxuLG51bGwsITApLGw9bmV3IHFlKGUsbnVsbCxjLCExKTtjLm89bCxpLnB1c2goYyksby5wdXNoKGwpLGM9bmV3IHFlKHIsbixudWxsLCExKSxsPW5ldyBxZShyLG51bGwsYywhMCksYy5vPWwsaS5wdXNoKGMpLG8ucHVzaChsKX19KSxvLnNvcnQodCksemUoaSksemUobyksaS5sZW5ndGgpe2Zvcih2YXIgYT0wLGM9ZSxsPW8ubGVuZ3RoO2w+YTsrK2Epb1thXS5lPWM9IWM7Zm9yKHZhciBzLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09aClyZXR1cm47cz1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihwKWZvcih2YXIgYT0wLGw9cy5sZW5ndGg7bD5hOysrYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pO2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe3M9Zy5wLno7Zm9yKHZhciBhPXMubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1zW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLHM9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5kKCl9fX1mdW5jdGlvbiB6ZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBdOysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBxZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIExlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1LGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgcj11KHQsZSk7bih0PXJbMF0sZT1yWzFdKSYmaS5wb2ludCh0LGUpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT11KG4sdCk7ZC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lU3RhcnQoKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZUVuZCgpfWZ1bmN0aW9uIHMobix0KXt2LnB1c2goW24sdF0pO3ZhciBlPXUobix0KTt4LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gZigpe3gubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7cyh2WzBdWzBdLHZbMF1bMV0pLHgubGluZUVuZCgpO3ZhciBuLHQ9eC5jbGVhbigpLGU9TS5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxyKWlmKDEmdCl7bj1lWzBdO3ZhciB1LHI9bi5sZW5ndGgtMSxvPS0xO2lmKHI+MCl7Zm9yKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCk7KytvPHI7KWkucG9pbnQoKHU9bltvXSlbMF0sdVsxXSk7aS5saW5lRW5kKCl9fWVsc2Ugcj4xJiYyJnQmJmUucHVzaChlLnBvcCgpLmNvbmNhdChlLnNoaWZ0KCkpKSxnLnB1c2goZS5maWx0ZXIoVGUpKX12YXIgZyxwLHYsZD10KGkpLG09dS5pbnZlcnQoclswXSxyWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpjLGxpbmVFbmQ6bCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PXMseS5saW5lU3RhcnQ9Zix5LmxpbmVFbmQ9aCxnPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9Yyx5LmxpbmVFbmQ9bCxnPXRhLm1lcmdlKGcpO3ZhciBuPUZlKG0scCk7Zy5sZW5ndGg/KGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLENlKGcsRGUsbixlLGkpKTpuJiYoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxiJiYoaS5wb2x5Z29uRW5kKCksYj0hMSksZz1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX0sTT1SZSgpLHg9dChNKSxiPSExO3JldHVybiB5fX1mdW5jdGlvbiBUZShuKXtyZXR1cm4gbi5sZW5ndGg+MX1mdW5jdGlvbiBSZSgpe3ZhciBuLHQ9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QucHVzaChuPVtdKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtuLnB1c2goW3QsZV0pfSxsaW5lRW5kOmIsYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIGU9dDtyZXR1cm4gdD1bXSxuPW51bGwsZX0scmVqb2luOmZ1bmN0aW9uKCl7dC5sZW5ndGg+MSYmdC5wdXNoKHQucG9wKCkuY29uY2F0KHQuc2hpZnQoKSkpfX19ZnVuY3Rpb24gRGUobix0KXtyZXR1cm4oKG49bi54KVswXTwwP25bMV0tUmEtQ2E6UmEtblsxXSktKCh0PXQueClbMF08MD90WzFdLVJhLUNhOlJhLXRbMV0pfWZ1bmN0aW9uIFBlKG4pe3ZhciB0LGU9MC8wLHI9MC8wLHU9MC8wO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24oaSxvKXt2YXIgYT1pPjA/cWE6LXFhLGM9Z2EoaS1lKTtnYShjLXFhKTxDYT8obi5wb2ludChlLHI9KHIrbykvMj4wP1JhOi1SYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLG4ucG9pbnQoaSxyKSx0PTApOnUhPT1hJiZjPj1xYSYmKGdhKGUtdSk8Q2EmJihlLT11KkNhKSxnYShpLWEpPENhJiYoaS09YSpDYSkscj1VZShlLHIsaSxvKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksdD0wKSxuLnBvaW50KGU9aSxyPW8pLHU9YX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpLGU9cj0wLzB9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItdH19fWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1LGksbz1NYXRoLnNpbihuLWUpO3JldHVybiBnYShvKT5DYT9NYXRoLmF0YW4oKE1hdGguc2luKHQpKihpPU1hdGguY29zKHIpKSpNYXRoLnNpbihlKS1NYXRoLnNpbihyKSoodT1NYXRoLmNvcyh0KSkqTWF0aC5zaW4obikpLyh1KmkqbykpOih0K3IpLzJ9ZnVuY3Rpb24gamUobix0LGUscil7dmFyIHU7aWYobnVsbD09bil1PWUqUmEsci5wb2ludCgtcWEsdSksci5wb2ludCgwLHUpLHIucG9pbnQocWEsdSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC11KSxyLnBvaW50KDAsLXUpLHIucG9pbnQoLXFhLC11KSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSx1KTtlbHNlIGlmKGdhKG5bMF0tdFswXSk+Q2Epe3ZhciBpPW5bMF08dFswXT9xYTotcWE7dT1lKmkvMixyLnBvaW50KC1pLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KGksdSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gRmUobix0KXt2YXIgZT1uWzBdLHI9blsxXSx1PVtNYXRoLnNpbihlKSwtTWF0aC5jb3MoZSksMF0saT0wLG89MDt5Yy5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7Yz5hOysrYSl7dmFyIGw9dFthXSxzPWwubGVuZ3RoO2lmKHMpZm9yKHZhciBmPWxbMF0saD1mWzBdLGc9ZlsxXS8yK3FhLzQscD1NYXRoLnNpbihnKSx2PU1hdGguY29zKGcpLGQ9MTs7KXtkPT09cyYmKGQ9MCksbj1sW2RdO3ZhciBtPW5bMF0seT1uWzFdLzIrcWEvNCxNPU1hdGguc2luKHkpLHg9TWF0aC5jb3MoeSksYj1tLWgsXz1iPj0wPzE6LTEsdz1fKmIsUz13PnFhLGs9cCpNO2lmKHljLmFkZChNYXRoLmF0YW4yKGsqXypNYXRoLnNpbih3KSx2KngraypNYXRoLmNvcyh3KSkpLGkrPVM/YitfKkxhOmIsU15oPj1lXm0+PWUpe3ZhciBFPWRlKHBlKGYpLHBlKG4pKTtNZShFKTt2YXIgQT1kZSh1LEUpO01lKEEpO3ZhciBOPShTXmI+PTA/LTE6MSkqdHQoQVsyXSk7KHI+Tnx8cj09PU4mJihFWzBdfHxFWzFdKSkmJihvKz1TXmI+PTA/MTotMSl9aWYoIWQrKylicmVhaztoPW0scD1NLHY9eCxmPW59fXJldHVybigtQ2E+aXx8Q2E+aSYmMD55YyleMSZvfWZ1bmN0aW9uIEhlKG4pe2Z1bmN0aW9uIHQobix0KXtyZXR1cm4gTWF0aC5jb3MobikqTWF0aC5jb3ModCk+aX1mdW5jdGlvbiBlKG4pe3ZhciBlLGksYyxsLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2w9Yz0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGYsaCl7dmFyIGcscD1bZixoXSx2PXQoZixoKSxkPW8/dj8wOnUoZixoKTp2P3UoZisoMD5mP3FhOi1xYSksaCk6MDtpZighZSYmKGw9Yz12KSYmbi5saW5lU3RhcnQoKSx2IT09YyYmKGc9cihlLHApLChiZShlLGcpfHxiZShwLGcpKSYmKHBbMF0rPUNhLHBbMV0rPUNhLHY9dChwWzBdLHBbMV0pKSksdiE9PWMpcz0wLHY/KG4ubGluZVN0YXJ0KCksZz1yKHAsZSksbi5wb2ludChnWzBdLGdbMV0pKTooZz1yKGUscCksbi5wb2ludChnWzBdLGdbMV0pLG4ubGluZUVuZCgpKSxlPWc7ZWxzZSBpZihhJiZlJiZvXnYpe3ZhciBtO2QmaXx8IShtPXIocCxlLCEwKSl8fChzPTAsbz8obi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSksbi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpKToobi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pKSl9IXZ8fGUmJmJlKGUscCl8fG4ucG9pbnQocFswXSxwWzFdKSxlPXAsYz12LGk9ZH0sbGluZUVuZDpmdW5jdGlvbigpe2MmJm4ubGluZUVuZCgpLGU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3wobCYmYyk8PDF9fX1mdW5jdGlvbiByKG4sdCxlKXt2YXIgcj1wZShuKSx1PXBlKHQpLG89WzEsMCwwXSxhPWRlKHIsdSksYz12ZShhLGEpLGw9YVswXSxzPWMtbCpsO2lmKCFzKXJldHVybiFlJiZuO3ZhciBmPWkqYy9zLGg9LWkqbC9zLGc9ZGUobyxhKSxwPXllKG8sZiksdj15ZShhLGgpO21lKHAsdik7dmFyIGQ9ZyxtPXZlKHAsZCkseT12ZShkLGQpLE09bSptLXkqKHZlKHAscCktMSk7aWYoISgwPk0pKXt2YXIgeD1NYXRoLnNxcnQoTSksYj15ZShkLCgtbS14KS95KTtpZihtZShiLHApLGI9eGUoYiksIWUpcmV0dXJuIGI7dmFyIF8sdz1uWzBdLFM9dFswXSxrPW5bMV0sRT10WzFdO3c+UyYmKF89dyx3PVMsUz1fKTt2YXIgQT1TLXcsTj1nYShBLXFhKTxDYSxDPU58fENhPkE7aWYoIU4mJms+RSYmKF89ayxrPUUsRT1fKSxDP04/aytFPjBeYlsxXTwoZ2EoYlswXS13KTxDYT9rOkUpOms8PWJbMV0mJmJbMV08PUU6QT5xYV4odzw9YlswXSYmYlswXTw9Uykpe3ZhciB6PXllKGQsKC1tK3gpL3kpO3JldHVybiBtZSh6LHApLFtiLHhlKHopXX19fWZ1bmN0aW9uIHUodCxlKXt2YXIgcj1vP246cWEtbix1PTA7cmV0dXJuLXI+dD91fD0xOnQ+ciYmKHV8PTIpLC1yPmU/dXw9NDplPnImJih1fD04KSx1fXZhciBpPU1hdGguY29zKG4pLG89aT4wLGE9Z2EoaSk+Q2EsYz1ncihuLDYqRGEpO3JldHVybiBMZSh0LGUsYyxvP1swLC1uXTpbLXFhLG4tcWFdKX1mdW5jdGlvbiBPZShuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGksbz11LmEsYT11LmIsYz1vLngsbD1vLnkscz1hLngsZj1hLnksaD0wLGc9MSxwPXMtYyx2PWYtbDtpZihpPW4tYyxwfHwhKGk+MCkpe2lmKGkvPXAsMD5wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZihwPjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPWUtYyxwfHwhKDA+aSkpe2lmKGkvPXAsMD5wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZihwPjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1pZihpPXQtbCx2fHwhKGk+MCkpe2lmKGkvPXYsMD52KXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZih2PjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPXItbCx2fHwhKDA+aSkpe2lmKGkvPXYsMD52KXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZih2PjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1yZXR1cm4gaD4wJiYodS5hPXt4OmMraCpwLHk6bCtoKnZ9KSwxPmcmJih1LmI9e3g6YytnKnAseTpsK2cqdn0pLHV9fX19fX1mdW5jdGlvbiBJZShuLHQsZSxyKXtmdW5jdGlvbiB1KHIsdSl7cmV0dXJuIGdhKHJbMF0tbik8Q2E/dT4wPzA6MzpnYShyWzBdLWUpPENhP3U+MD8yOjE6Z2EoclsxXS10KTxDYT91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gaShuLHQpe3JldHVybiBvKG4ueCx0LngpfWZ1bmN0aW9uIG8obix0KXt2YXIgZT11KG4sMSkscj11KHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19cmV0dXJuIGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobil7Zm9yKHZhciB0PTAsZT1kLmxlbmd0aCxyPW5bMV0sdT0wO2U+dTsrK3UpZm9yKHZhciBpLG89MSxhPWRbdV0sYz1hLmxlbmd0aCxsPWFbMF07Yz5vOysrbylpPWFbb10sbFsxXTw9cj9pWzFdPnImJlEobCxpLG4pPjAmJisrdDppWzFdPD1yJiZRKGwsaSxuKTwwJiYtLXQsbD1pO3JldHVybiAwIT09dH1mdW5jdGlvbiBsKGksYSxjLGwpe3ZhciBzPTAsZj0wO2lmKG51bGw9PWl8fChzPXUoaSxjKSkhPT0oZj11KGEsYykpfHxvKGksYSk8MF5jPjApe2RvIGwucG9pbnQoMD09PXN8fDM9PT1zP246ZSxzPjE/cjp0KTt3aGlsZSgocz0ocytjKzQpJTQpIT09Zil9ZWxzZSBsLnBvaW50KGFbMF0sYVsxXSl9ZnVuY3Rpb24gcyh1LGkpe3JldHVybiB1Pj1uJiZlPj11JiZpPj10JiZyPj1pfWZ1bmN0aW9uIGYobix0KXtzKG4sdCkmJmEucG9pbnQobix0KX1mdW5jdGlvbiBoKCl7Qy5wb2ludD1wLGQmJmQucHVzaChtPVtdKSxTPSEwLHc9ITEsYj1fPTAvMH1mdW5jdGlvbiBnKCl7diYmKHAoeSxNKSx4JiZ3JiZBLnJlam9pbigpLHYucHVzaChBLmJ1ZmZlcigpKSksQy5wb2ludD1mLHcmJmEubGluZUVuZCgpfWZ1bmN0aW9uIHAobix0KXtuPU1hdGgubWF4KC1UYyxNYXRoLm1pbihUYyxuKSksdD1NYXRoLm1heCgtVGMsTWF0aC5taW4oVGMsdCkpO3ZhciBlPXMobix0KTtpZihkJiZtLnB1c2goW24sdF0pLFMpeT1uLE09dCx4PWUsUz0hMSxlJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCkpO2Vsc2UgaWYoZSYmdylhLnBvaW50KG4sdCk7ZWxzZXt2YXIgcj17YTp7eDpiLHk6X30sYjp7eDpuLHk6dH19O04ocik/KHd8fChhLmxpbmVTdGFydCgpLGEucG9pbnQoci5hLngsci5hLnkpKSxhLnBvaW50KHIuYi54LHIuYi55KSxlfHxhLmxpbmVFbmQoKSxrPSExKTplJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCksaz0hMSl9Yj1uLF89dCx3PWV9dmFyIHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPWEsQT1SZSgpLE49T2Uobix0LGUsciksQz17cG9pbnQ6ZixsaW5lU3RhcnQ6aCxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YT1BLHY9W10sZD1bXSxrPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YT1FLHY9dGEubWVyZ2Uodik7dmFyIHQ9YyhbbixyXSksZT1rJiZ0LHU9di5sZW5ndGg7KGV8fHUpJiYoYS5wb2x5Z29uU3RhcnQoKSxlJiYoYS5saW5lU3RhcnQoKSxsKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSx1JiZDZSh2LGksdCxsLGEpLGEucG9seWdvbkVuZCgpKSx2PWQ9bT1udWxsfX07cmV0dXJuIEN9fWZ1bmN0aW9uIFllKG4pe3ZhciB0PTAsZT1xYS8zLHI9aXIobiksdT1yKHQsZSk7cmV0dXJuIHUucGFyYWxsZWxzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IodD1uWzBdKnFhLzE4MCxlPW5bMV0qcWEvMTgwKTpbdC9xYSoxODAsZS9xYSoxODBdfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsdHQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtEYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O0hjLnBvaW50PWZ1bmN0aW9uKGksbyl7SGMucG9pbnQ9bix0PXI9aSxlPXU9b30sSGMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtQYz5uJiYoUGM9biksbj5qYyYmKGpjPW4pLFVjPnQmJihVYz10KSx0PkZjJiYoRmM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe19jKz1uLHdjKz10LCsrU2N9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO2tjKz1vKih0K24pLzIsRWMrPW8qKGUrcikvMixBYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO0ljLnBvaW50PWZ1bmN0aW9uKHIsdSl7SWMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtJYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7a2MrPW8qKHIrbikvMixFYys9byoodSt0KS8yLEFjKz1vLG89dSpuLXIqdCxOYys9byoocituKSxDYys9byoodSt0KSx6Yys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O0ljLnBvaW50PWZ1bmN0aW9uKGksbyl7SWMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LEljLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxMYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0OmJ9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWMNCn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLFMubGluZVN0YXJ0PXJ9fTtyZXR1cm4gU31mdW5jdGlvbiB1KHQsZSxyLGEsYyxsLHMsZixoLGcscCx2LGQsbSl7dmFyIHk9cy10LE09Zi1lLHg9eSp5K00qTTtpZih4PjQqaSYmZC0tKXt2YXIgYj1hK2csXz1jK3Asdz1sK3YsUz1NYXRoLnNxcnQoYipiK18qXyt3KncpLGs9TWF0aC5hc2luKHcvPVMpLEU9Z2EoZ2EodyktMSk8Q2F8fGdhKHItaCk8Q2E/KHIraCkvMjpNYXRoLmF0YW4yKF8sYiksQT1uKEUsayksTj1BWzBdLEM9QVsxXSx6PU4tdCxxPUMtZSxMPU0qei15KnE7KEwqTC94Pml8fGdhKCh5KnorTSpxKS94LS41KT4uM3x8bz5hKmcrYypwK2wqdikmJih1KHQsZSxyLGEsYyxsLE4sQyxFLGIvPVMsXy89Uyx3LGQsbSksbS5wb2ludChOLEMpLHUoTixDLEUsYixfLHcscyxmLGgsZyxwLHYsZCxtKSl9fXZhciBpPS41LG89TWF0aC5jb3MoMzAqRGEpLGE9MTY7cmV0dXJuIHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPShpPW4qbik+MCYmMTYsdCk6TWF0aC5zcXJ0KGkpfSx0fWZ1bmN0aW9uIHRyKG4pe3ZhciB0PW5yKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oW3QqUGEsZSpQYV0pfSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBvcih0KG4pKX19ZnVuY3Rpb24gZXIobil7dGhpcy5zdHJlYW09bn1mdW5jdGlvbiBycihuLHQpe3JldHVybntwb2ludDp0LHNwaGVyZTpmdW5jdGlvbigpe24uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gdXIobil7cmV0dXJuIGlyKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSgpfWZ1bmN0aW9uIGlyKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuIG49YShuWzBdKkRhLG5bMV0qRGEpLFtuWzBdKmgrYyxsLW5bMV0qaF19ZnVuY3Rpb24gZShuKXtyZXR1cm4gbj1hLmludmVydCgoblswXS1jKS9oLChsLW5bMV0pL2gpLG4mJltuWzBdKlBhLG5bMV0qUGFdfWZ1bmN0aW9uIHIoKXthPUFlKG89bHIobSxNLHgpLGkpO3ZhciBuPWkodixkKTtyZXR1cm4gYz1nLW5bMF0qaCxsPXArblsxXSpoLHUoKX1mdW5jdGlvbiB1KCl7cmV0dXJuIHMmJihzLnZhbGlkPSExLHM9bnVsbCksdH12YXIgaSxvLGEsYyxsLHMsZj1ucihmdW5jdGlvbihuLHQpe3JldHVybiBuPWkobix0KSxbblswXSpoK2MsbC1uWzFdKmhdfSksaD0xNTAsZz00ODAscD0yNTAsdj0wLGQ9MCxtPTAsTT0wLHg9MCxiPUxjLF89eSx3PW51bGwsUz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9b3IoYihvLGYoXyhuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPW51bGw9PW4/KHc9bixMYyk6SGUoKHc9K24pKkRhKSx1KCkpOnd9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1uLF89bj9JZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTp5LHUoKSk6U30sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rbixyKCkpOmh9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStuWzBdLHA9K25bMV0scigpKTpbZyxwXX0sdC5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9blswXSUzNjAqRGEsZD1uWzFdJTM2MCpEYSxyKCkpOlt2KlBhLGQqUGFdfSx0LnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uWzBdJTM2MCpEYSxNPW5bMV0lMzYwKkRhLHg9bi5sZW5ndGg+Mj9uWzJdJTM2MCpEYTowLHIoKSk6W20qUGEsTSpQYSx4KlBhXX0sdGEucmViaW5kKHQsZiwicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmludmVydD1pLmludmVydCYmZSxyKCl9fWZ1bmN0aW9uIG9yKG4pe3JldHVybiBycihuLGZ1bmN0aW9uKHQsZSl7bi5wb2ludCh0KkRhLGUqRGEpfSl9ZnVuY3Rpb24gYXIobix0KXtyZXR1cm5bbix0XX1mdW5jdGlvbiBjcihuLHQpe3JldHVybltuPnFhP24tTGE6LXFhPm4/bitMYTpuLHRdfWZ1bmN0aW9uIGxyKG4sdCxlKXtyZXR1cm4gbj90fHxlP0FlKGZyKG4pLGhyKHQsZSkpOmZyKG4pOnR8fGU/aHIodCxlKTpjcn1mdW5jdGlvbiBzcihuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9bixbdD5xYT90LUxhOi1xYT50P3QrTGE6dCxlXX19ZnVuY3Rpb24gZnIobil7dmFyIHQ9c3Iobik7cmV0dXJuIHQuaW52ZXJ0PXNyKC1uKSx0fWZ1bmN0aW9uIGhyKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguY29zKHQpLGE9TWF0aC5jb3MobikqZSxjPU1hdGguc2luKG4pKmUsbD1NYXRoLnNpbih0KSxzPWwqcithKnU7cmV0dXJuW01hdGguYXRhbjIoYyppLXMqbyxhKnItbCp1KSx0dChzKmkrYypvKV19dmFyIHI9TWF0aC5jb3MobiksdT1NYXRoLnNpbihuKSxpPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0aC5zaW4obikqZSxsPU1hdGguc2luKHQpLHM9bCppLWMqbztyZXR1cm5bTWF0aC5hdGFuMihjKmkrbCpvLGEqcitzKnUpLHR0KHMqci1hKnUpXX0sZX1mdW5jdGlvbiBncihuLHQpe3ZhciBlPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obik7cmV0dXJuIGZ1bmN0aW9uKHUsaSxvLGEpe3ZhciBjPW8qdDtudWxsIT11Pyh1PXByKGUsdSksaT1wcihlLGkpLChvPjA/aT51OnU+aSkmJih1Kz1vKkxhKSk6KHU9bitvKkxhLGk9bi0uNSpjKTtmb3IodmFyIGwscz11O28+MD9zPmk6aT5zO3MtPWMpYS5wb2ludCgobD14ZShbZSwtcipNYXRoLmNvcyhzKSwtcipNYXRoLnNpbihzKV0pKVswXSxsWzFdKX19ZnVuY3Rpb24gcHIobix0KXt2YXIgZT1wZSh0KTtlWzBdLT1uLE1lKGUpO3ZhciByPW50KC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLUNhKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB2cihuLHQsZSl7dmFyIHI9dGEucmFuZ2Uobix0LUNhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGRyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtQ2EsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gbXIobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHlyKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBNcihuLHQsZSxyKXt2YXIgdT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLG89TWF0aC5jb3MociksYT1NYXRoLnNpbihyKSxjPXUqTWF0aC5jb3MobiksbD11Kk1hdGguc2luKG4pLHM9bypNYXRoLmNvcyhlKSxmPW8qTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQoaXQoci10KSt1Km8qaXQoZS1uKSkpLGc9MS9NYXRoLnNpbihoKSxwPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqZyxlPU1hdGguc2luKGgtbikqZyxyPWUqYyt0KnMsdT1lKmwrdCpmLG89ZSppK3QqYTtyZXR1cm5bTWF0aC5hdGFuMih1LHIpKlBhLE1hdGguYXRhbjIobyxNYXRoLnNxcnQocipyK3UqdSkpKlBhXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipQYSx0KlBhXX07cmV0dXJuIHAuZGlzdGFuY2U9aCxwfWZ1bmN0aW9uIHhyKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPU1hdGguc2luKHUqPURhKSxvPU1hdGguY29zKHUpLGE9Z2EoKG4qPURhKS10KSxjPU1hdGguY29zKGEpO1ljKz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYT1vKk1hdGguc2luKGEpKSphKyhhPXIqaS1lKm8qYykqYSksZSppK3IqbypjKSx0PW4sZT1pLHI9b312YXIgdCxlLHI7WmMucG9pbnQ9ZnVuY3Rpb24odSxpKXt0PXUqRGEsZT1NYXRoLnNpbihpKj1EYSkscj1NYXRoLmNvcyhpKSxaYy5wb2ludD1ufSxaYy5saW5lRW5kPWZ1bmN0aW9uKCl7WmMucG9pbnQ9WmMubGluZUVuZD1ifX1mdW5jdGlvbiBicihuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguY29zKGUpLGk9bihyKnUpO3JldHVybltpKnUqTWF0aC5zaW4odCksaSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLHU9dChyKSxpPU1hdGguc2luKHUpLG89TWF0aC5jb3ModSk7cmV0dXJuW01hdGguYXRhbjIobippLHIqbyksTWF0aC5hc2luKHImJmUqaS9yKV19LGV9ZnVuY3Rpb24gX3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7bz4wPy1SYStDYT50JiYodD0tUmErQ2EpOnQ+UmEtQ2EmJih0PVJhLUNhKTt2YXIgZT1vL01hdGgucG93KHUodCksaSk7cmV0dXJuW2UqTWF0aC5zaW4oaSpuKSxvLWUqTWF0aC5jb3MoaSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4ocWEvNCtuLzIpfSxpPW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKHUodCkvdShuKSksbz1yKk1hdGgucG93KHUobiksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQscj1LKGkpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksMipNYXRoLmF0YW4oTWF0aC5wb3coby9yLDEvaSkpLVJhXX0sZSk6U3J9ZnVuY3Rpb24gd3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9aS10O3JldHVybltlKk1hdGguc2luKHUqbiksaS1lKk1hdGguY29zKHUqbildfXZhciByPU1hdGguY29zKG4pLHU9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLGk9ci91K247cmV0dXJuIGdhKHUpPENhP2FyOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWktdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsaS1LKHUpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIFNyKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4ocWEvNCt0LzIpKV19ZnVuY3Rpb24ga3Iobil7dmFyIHQsZT11cihuKSxyPWUuc2NhbGUsdT1lLnRyYW5zbGF0ZSxpPWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49dS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBvPWkuYXBwbHkoZSxhcmd1bWVudHMpO2lmKG89PT1lKXtpZih0PW51bGw9PW4pe3ZhciBhPXFhKnIoKSxjPXUoKTtpKFtbY1swXS1hLGNbMV0tYV0sW2NbMF0rYSxjWzFdK2FdXSl9fWVsc2UgdCYmKG89bnVsbCk7cmV0dXJuIG99LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBFcihuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihxYS80K3QvMikpLC1uXX1mdW5jdGlvbiBBcihuKXtyZXR1cm4gblswXX1mdW5jdGlvbiBOcihuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBDcihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsdT0yO3Q+dTt1Kyspe2Zvcig7cj4xJiZRKG5bZVtyLTJdXSxuW2Vbci0xXV0sblt1XSk8PTA7KS0tcjtlW3IrK109dX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHpyKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIHFyKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBMcihuLHQsZSxyKXt2YXIgdT1uWzBdLGk9ZVswXSxvPXRbMF0tdSxhPXJbMF0taSxjPW5bMV0sbD1lWzFdLHM9dFsxXS1jLGY9clsxXS1sLGg9KGEqKGMtbCktZioodS1pKSkvKGYqby1hKnMpO3JldHVyblt1K2gqbyxjK2gqc119ZnVuY3Rpb24gVHIobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUnIoKXt0dSh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gRHIobil7dmFyIHQ9ZWwucG9wKCl8fG5ldyBScjtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBQcihuKXtYcihuKSxRYy5yZW1vdmUobiksZWwucHVzaChuKSx0dShuKX1mdW5jdGlvbiBVcihuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksdT17eDplLHk6cn0saT1uLlAsbz1uLk4sYT1bbl07UHIobik7Zm9yKHZhciBjPWk7Yy5jaXJjbGUmJmdhKGUtYy5jaXJjbGUueCk8Q2EmJmdhKHItYy5jaXJjbGUuY3kpPENhOylpPWMuUCxhLnVuc2hpZnQoYyksUHIoYyksYz1pO2EudW5zaGlmdChjKSxYcihjKTtmb3IodmFyIGw9bztsLmNpcmNsZSYmZ2EoZS1sLmNpcmNsZS54KTxDYSYmZ2Eoci1sLmNpcmNsZS5jeSk8Q2E7KW89bC5OLGEucHVzaChsKSxQcihsKSxsPW87YS5wdXNoKGwpLFhyKGwpO3ZhciBzLGY9YS5sZW5ndGg7Zm9yKHM9MTtmPnM7KytzKWw9YVtzXSxjPWFbcy0xXSxLcihsLmVkZ2UsYy5zaXRlLGwuc2l0ZSx1KTtjPWFbMF0sbD1hW2YtMV0sbC5lZGdlPUpyKGMuc2l0ZSxsLnNpdGUsbnVsbCx1KSxWcihjKSxWcihsKX1mdW5jdGlvbiBqcihuKXtmb3IodmFyIHQsZSxyLHUsaT1uLngsbz1uLnksYT1RYy5fO2E7KWlmKHI9RnIoYSxvKS1pLHI+Q2EpYT1hLkw7ZWxzZXtpZih1PWktSHIoYSxvKSwhKHU+Q2EpKXtyPi1DYT8odD1hLlAsZT1hKTp1Pi1DYT8odD1hLGU9YS5OKTp0PWU9YTticmVha31pZighYS5SKXt0PWE7YnJlYWt9YT1hLlJ9dmFyIGM9RHIobik7aWYoUWMuaW5zZXJ0KHQsYyksdHx8ZSl7aWYodD09PWUpcmV0dXJuIFhyKHQpLGU9RHIodC5zaXRlKSxRYy5pbnNlcnQoYyxlKSxjLmVkZ2U9ZS5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLFZyKHQpLHZvaWQgVnIoZSk7aWYoIWUpcmV0dXJuIHZvaWQoYy5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpKTtYcih0KSxYcihlKTt2YXIgbD10LnNpdGUscz1sLngsZj1sLnksaD1uLngtcyxnPW4ueS1mLHA9ZS5zaXRlLHY9cC54LXMsZD1wLnktZixtPTIqKGgqZC1nKnYpLHk9aCpoK2cqZyxNPXYqditkKmQseD17eDooZCp5LWcqTSkvbStzLHk6KGgqTS12KnkpL20rZn07S3IoZS5lZGdlLGwscCx4KSxjLmVkZ2U9SnIobCxuLG51bGwseCksZS5lZGdlPUpyKG4scCxudWxsLHgpLFZyKHQpLFZyKGUpfX1mdW5jdGlvbiBGcihuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCx1PWUueSxpPXUtdDtpZighaSlyZXR1cm4gcjt2YXIgbz1uLlA7aWYoIW8pcmV0dXJuLTEvMDtlPW8uc2l0ZTt2YXIgYT1lLngsYz1lLnksbD1jLXQ7aWYoIWwpcmV0dXJuIGE7dmFyIHM9YS1yLGY9MS9pLTEvbCxoPXMvbDtyZXR1cm4gZj8oLWgrTWF0aC5zcXJ0KGgqaC0yKmYqKHMqcy8oLTIqbCktYytsLzIrdS1pLzIpKSkvZityOihyK2EpLzJ9ZnVuY3Rpb24gSHIobix0KXt2YXIgZT1uLk47aWYoZSlyZXR1cm4gRnIoZSx0KTt2YXIgcj1uLnNpdGU7cmV0dXJuIHIueT09PXQ/ci54OjEvMH1mdW5jdGlvbiBPcihuKXt0aGlzLnNpdGU9bix0aGlzLmVkZ2VzPVtdfWZ1bmN0aW9uIElyKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG8sYSxjLGwscyxmPW5bMF1bMF0saD1uWzFdWzBdLGc9blswXVsxXSxwPW5bMV1bMV0sdj1LYyxkPXYubGVuZ3RoO2QtLTspaWYoaT12W2RdLGkmJmkucHJlcGFyZSgpKWZvcihhPWkuZWRnZXMsYz1hLmxlbmd0aCxvPTA7Yz5vOylzPWFbb10uZW5kKCkscj1zLngsdT1zLnksbD1hWysrbyVjXS5zdGFydCgpLHQ9bC54LGU9bC55LChnYShyLXQpPkNhfHxnYSh1LWUpPkNhKSYmKGEuc3BsaWNlKG8sMCxuZXcgUXIoR3IoaS5zaXRlLHMsZ2Eoci1mKTxDYSYmcC11PkNhP3t4OmYseTpnYSh0LWYpPENhP2U6cH06Z2EodS1wKTxDYSYmaC1yPkNhP3t4OmdhKGUtcCk8Q2E/dDpoLHk6cH06Z2Eoci1oKTxDYSYmdS1nPkNhP3t4OmgseTpnYSh0LWgpPENhP2U6Z306Z2EodS1nKTxDYSYmci1mPkNhP3t4OmdhKGUtZyk8Q2E/dDpmLHk6Z306bnVsbCksaS5zaXRlLG51bGwpKSwrK2MpfWZ1bmN0aW9uIFlyKG4sdCl7cmV0dXJuIHQuYW5nbGUtbi5hbmdsZX1mdW5jdGlvbiBacigpe3R1KHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBWcihuKXt2YXIgdD1uLlAsZT1uLk47aWYodCYmZSl7dmFyIHI9dC5zaXRlLHU9bi5zaXRlLGk9ZS5zaXRlO2lmKHIhPT1pKXt2YXIgbz11LngsYT11LnksYz1yLngtbyxsPXIueS1hLHM9aS54LW8sZj1pLnktYSxoPTIqKGMqZi1sKnMpO2lmKCEoaD49LXphKSl7dmFyIGc9YypjK2wqbCxwPXMqcytmKmYsdj0oZipnLWwqcCkvaCxkPShjKnAtcypnKS9oLGY9ZCthLG09cmwucG9wKCl8fG5ldyBacjttLmFyYz1uLG0uc2l0ZT11LG0ueD12K28sbS55PWYrTWF0aC5zcXJ0KHYqditkKmQpLG0uY3k9ZixuLmNpcmNsZT1tO2Zvcih2YXIgeT1udWxsLE09dGwuXztNOylpZihtLnk8TS55fHxtLnk9PT1NLnkmJm0ueDw9TS54KXtpZighTS5MKXt5PU0uUDticmVha31NPU0uTH1lbHNle2lmKCFNLlIpe3k9TTticmVha31NPU0uUn10bC5pbnNlcnQoeSxtKSx5fHwobmw9bSl9fX19ZnVuY3Rpb24gWHIobil7dmFyIHQ9bi5jaXJjbGU7dCYmKHQuUHx8KG5sPXQuTiksdGwucmVtb3ZlKHQpLHJsLnB1c2godCksdHUodCksbi5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gJHIobil7Zm9yKHZhciB0LGU9R2Mscj1PZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKSx1PWUubGVuZ3RoO3UtLTspdD1lW3VdLCghQnIodCxuKXx8IXIodCl8fGdhKHQuYS54LXQuYi54KTxDYSYmZ2EodC5hLnktdC5iLnkpPENhKSYmKHQuYT10LmI9bnVsbCxlLnNwbGljZSh1LDEpKX1mdW5jdGlvbiBCcihuLHQpe3ZhciBlPW4uYjtpZihlKXJldHVybiEwO3ZhciByLHUsaT1uLmEsbz10WzBdWzBdLGE9dFsxXVswXSxjPXRbMF1bMV0sbD10WzFdWzFdLHM9bi5sLGY9bi5yLGg9cy54LGc9cy55LHA9Zi54LHY9Zi55LGQ9KGgrcCkvMixtPShnK3YpLzI7aWYodj09PWcpe2lmKG8+ZHx8ZD49YSlyZXR1cm47aWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDpkLHk6Y307ZT17eDpkLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OmQseTpsfTtlPXt4OmQseTpjfX19ZWxzZSBpZihyPShoLXApLyh2LWcpLHU9bS1yKmQsLTE+cnx8cj4xKWlmKGg+cCl7aWYoaSl7aWYoaS55Pj1sKXJldHVybn1lbHNlIGk9e3g6KGMtdSkvcix5OmN9O2U9e3g6KGwtdSkvcix5Omx9fWVsc2V7aWYoaSl7aWYoaS55PGMpcmV0dXJufWVsc2UgaT17eDoobC11KS9yLHk6bH07ZT17eDooYy11KS9yLHk6Y319ZWxzZSBpZih2Pmcpe2lmKGkpe2lmKGkueD49YSlyZXR1cm59ZWxzZSBpPXt4Om8seTpyKm8rdX07ZT17eDphLHk6ciphK3V9fWVsc2V7aWYoaSl7aWYoaS54PG8pcmV0dXJufWVsc2UgaT17eDphLHk6ciphK3V9O2U9e3g6byx5OnIqbyt1fX1yZXR1cm4gbi5hPWksbi5iPWUsITB9ZnVuY3Rpb24gV3Iobix0KXt0aGlzLmw9bix0aGlzLnI9dCx0aGlzLmE9dGhpcy5iPW51bGx9ZnVuY3Rpb24gSnIobix0LGUscil7dmFyIHU9bmV3IFdyKG4sdCk7cmV0dXJuIEdjLnB1c2godSksZSYmS3IodSxuLHQsZSksciYmS3IodSx0LG4sciksS2Nbbi5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LG4sdCkpLEtjW3QuaV0uZWRnZXMucHVzaChuZXcgUXIodSx0LG4pKSx1fWZ1bmN0aW9uIEdyKG4sdCxlKXt2YXIgcj1uZXcgV3IobixudWxsKTtyZXR1cm4gci5hPXQsci5iPWUsR2MucHVzaChyKSxyfWZ1bmN0aW9uIEtyKG4sdCxlLHIpe24uYXx8bi5iP24ubD09PWU/bi5iPXI6bi5hPXI6KG4uYT1yLG4ubD10LG4ucj1lKX1mdW5jdGlvbiBRcihuLHQsZSl7dmFyIHI9bi5hLHU9bi5iO3RoaXMuZWRnZT1uLHRoaXMuc2l0ZT10LHRoaXMuYW5nbGU9ZT9NYXRoLmF0YW4yKGUueS10LnksZS54LXQueCk6bi5sPT09dD9NYXRoLmF0YW4yKHUueC1yLngsci55LXUueSk6TWF0aC5hdGFuMihyLngtdS54LHUueS1yLnkpfWZ1bmN0aW9uIG51KCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gdHUobil7bi5VPW4uQz1uLkw9bi5SPW4uUD1uLk49bnVsbH1mdW5jdGlvbiBldShuLHQpe3ZhciBlPXQscj10LlIsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gcnUobix0KXt2YXIgZT10LHI9dC5MLHU9ZS5VO3U/dS5MPT09ZT91Lkw9cjp1LlI9cjpuLl89cixyLlU9dSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIHV1KG4pe2Zvcig7bi5MOyluPW4uTDtyZXR1cm4gbn1mdW5jdGlvbiBpdShuLHQpe3ZhciBlLHIsdSxpPW4uc29ydChvdSkucG9wKCk7Zm9yKEdjPVtdLEtjPW5ldyBBcnJheShuLmxlbmd0aCksUWM9bmV3IG51LHRsPW5ldyBudTs7KWlmKHU9bmwsaSYmKCF1fHxpLnk8dS55fHxpLnk9PT11LnkmJmkueDx1LngpKShpLnghPT1lfHxpLnkhPT1yKSYmKEtjW2kuaV09bmV3IE9yKGkpLGpyKGkpLGU9aS54LHI9aS55KSxpPW4ucG9wKCk7ZWxzZXtpZighdSlicmVhaztVcih1LmFyYyl9dCYmKCRyKHQpLElyKHQpKTt2YXIgbz17Y2VsbHM6S2MsZWRnZXM6R2N9O3JldHVybiBRYz10bD1HYz1LYz1udWxsLG99ZnVuY3Rpb24gb3Uobix0KXtyZXR1cm4gdC55LW4ueXx8dC54LW4ueH1mdW5jdGlvbiBhdShuLHQsZSl7cmV0dXJuKG4ueC1lLngpKih0Lnktbi55KS0obi54LXQueCkqKGUueS1uLnkpfWZ1bmN0aW9uIGN1KG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gbHUobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBzdSgpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gZnUobix0LGUscix1LGkpe2lmKCFuKHQsZSxyLHUsaSkpe3ZhciBvPS41KihlK3UpLGE9LjUqKHIraSksYz10Lm5vZGVzO2NbMF0mJmZ1KG4sY1swXSxlLHIsbyxhKSxjWzFdJiZmdShuLGNbMV0sbyxyLHUsYSksY1syXSYmZnUobixjWzJdLGUsYSxvLGkpLGNbM10mJmZ1KG4sY1szXSxvLGEsdSxpKX19ZnVuY3Rpb24gaHUobix0LGUscix1LGksbyl7dmFyIGEsYz0xLzA7cmV0dXJuIGZ1bmN0aW9uIGwobixzLGYsaCxnKXtpZighKHM+aXx8Zj5vfHxyPmh8fHU+Zykpe2lmKHA9bi5wb2ludCl7dmFyIHAsdj10LW4ueCxkPWUtbi55LG09dip2K2QqZDtpZihjPm0pe3ZhciB5PU1hdGguc3FydChjPW0pO3I9dC15LHU9ZS15LGk9dCt5LG89ZSt5LGE9cH19Zm9yKHZhciBNPW4ubm9kZXMseD0uNSoocytoKSxiPS41KihmK2cpLF89dD49eCx3PWU+PWIsUz13PDwxfF8saz1TKzQ7az5TOysrUylpZihuPU1bMyZTXSlzd2l0Y2goMyZTKXtjYXNlIDA6bChuLHMsZix4LGIpO2JyZWFrO2Nhc2UgMTpsKG4seCxmLGgsYik7YnJlYWs7Y2FzZSAyOmwobixzLGIseCxnKTticmVhaztjYXNlIDM6bChuLHgsYixoLGcpfX19KG4scix1LGksbyksYX1mdW5jdGlvbiBndShuLHQpe249dGEucmdiKG4pLHQ9dGEucmdiKHQpO3ZhciBlPW4ucixyPW4uZyx1PW4uYixpPXQuci1lLG89dC5nLXIsYT10LmItdTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIiMiK3h0KE1hdGgucm91bmQoZStpKm4pKSt4dChNYXRoLnJvdW5kKHIrbypuKSkreHQoTWF0aC5yb3VuZCh1K2EqbikpfX1mdW5jdGlvbiBwdShuLHQpe3ZhciBlLHI9e30sdT17fTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPW11KG5bZV0sdFtlXSk6dVtlXT1uW2VdO2ZvcihlIGluIHQpZSBpbiBufHwodVtlXT10W2VdKTtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKGUgaW4gcil1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIHZ1KG4sdCl7cmV0dXJuIG49K24sdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gbiooMS1lKSt0KmV9fWZ1bmN0aW9uIGR1KG4sdCl7dmFyIGUscix1LGk9aWwubGFzdEluZGV4PW9sLmxhc3RJbmRleD0wLG89LTEsYT1bXSxjPVtdO2ZvcihuKz0iIix0Kz0iIjsoZT1pbC5leGVjKG4pKSYmKHI9b2wuZXhlYyh0KSk7KSh1PXIuaW5kZXgpPmkmJih1PXQuc2xpY2UoaSx1KSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLChlPWVbMF0pPT09KHI9clswXSk/YVtvXT9hW29dKz1yOmFbKytvXT1yOihhWysrb109bnVsbCxjLnB1c2goe2k6byx4OnZ1KGUscil9KSksaT1vbC5sYXN0SW5kZXg7cmV0dXJuIGk8dC5sZW5ndGgmJih1PXQuc2xpY2UoaSksYVtvXT9hW29dKz11OmFbKytvXT11KSxhLmxlbmd0aDwyP2NbMF0/KHQ9Y1swXS54LGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gdH06KHQ9Yy5sZW5ndGgsZnVuY3Rpb24obil7Zm9yKHZhciBlLHI9MDt0PnI7KytyKWFbKGU9Y1tyXSkuaV09ZS54KG4pO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gbXUobix0KXtmb3IodmFyIGUscj10YS5pbnRlcnBvbGF0b3JzLmxlbmd0aDstLXI+PTAmJiEoZT10YS5pbnRlcnBvbGF0b3JzW3JdKG4sdCkpOyk7cmV0dXJuIGV9ZnVuY3Rpb24geXUobix0KXt2YXIgZSxyPVtdLHU9W10saT1uLmxlbmd0aCxvPXQubGVuZ3RoLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpO2ZvcihlPTA7YT5lOysrZSlyLnB1c2gobXUobltlXSx0W2VdKSk7Zm9yKDtpPmU7KytlKXVbZV09bltlXTtmb3IoO28+ZTsrK2UpdVtlXT10W2VdO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZT0wO2E+ZTsrK2UpdVtlXT1yW2VdKG4pO3JldHVybiB1fX1mdW5jdGlvbiBNdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+PXQ/MDp0Pj0xPzE6bih0KX19ZnVuY3Rpb24geHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAxLW4oMS10KX19ZnVuY3Rpb24gYnUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybi41KiguNT50P24oMip0KToyLW4oMi0yKnQpKX19ZnVuY3Rpb24gX3Uobil7cmV0dXJuIG4qbn1mdW5jdGlvbiB3dShuKXtyZXR1cm4gbipuKm59ZnVuY3Rpb24gU3Uobil7aWYoMD49bilyZXR1cm4gMDtpZihuPj0xKXJldHVybiAxO3ZhciB0PW4qbixlPXQqbjtyZXR1cm4gNCooLjU+bj9lOjMqKG4tdCkrZS0uNzUpfWZ1bmN0aW9uIGt1KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gRXUobil7cmV0dXJuIDEtTWF0aC5jb3MobipSYSl9ZnVuY3Rpb24gQXUobil7cmV0dXJuIE1hdGgucG93KDIsMTAqKG4tMSkpfWZ1bmN0aW9uIE51KG4pe3JldHVybiAxLU1hdGguc3FydCgxLW4qbil9ZnVuY3Rpb24gQ3Uobix0KXt2YXIgZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD0uNDUpLGFyZ3VtZW50cy5sZW5ndGg/ZT10L0xhKk1hdGguYXNpbigxL24pOihuPTEsZT10LzQpLGZ1bmN0aW9uKHIpe3JldHVybiAxK24qTWF0aC5wb3coMiwtMTAqcikqTWF0aC5zaW4oKHItZSkqTGEvdCl9fWZ1bmN0aW9uIHp1KG4pe3JldHVybiBufHwobj0xLjcwMTU4KSxmdW5jdGlvbih0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfX1mdW5jdGlvbiBxdShuKXtyZXR1cm4gMS8yLjc1Pm4/Ny41NjI1Km4qbjoyLzIuNzU+bj83LjU2MjUqKG4tPTEuNS8yLjc1KSpuKy43NToyLjUvMi43NT5uPzcuNTYyNSoobi09Mi4yNS8yLjc1KSpuKy45Mzc1OjcuNTYyNSoobi09Mi42MjUvMi43NSkqbisuOTg0Mzc1fWZ1bmN0aW9uIEx1KG4sdCl7bj10YS5oY2wobiksdD10YS5oY2wodCk7dmFyIGU9bi5oLHI9bi5jLHU9bi5sLGk9dC5oLWUsbz10LmMtcixhPXQubC11O3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIpP3QuYzpyKSxpc05hTihpKT8oaT0wLGU9aXNOYU4oZSk/dC5oOmUpOmk+MTgwP2ktPTM2MDotMTgwPmkmJihpKz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBzdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIFR1KG4sdCl7bj10YS5oc2wobiksdD10YS5oc2wodCk7dmFyIGU9bi5oLHI9bi5zLHU9bi5sLGk9dC5oLWUsbz10LnMtcixhPXQubC11O3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIpP3QuczpyKSxpc05hTihpKT8oaT0wLGU9aXNOYU4oZSk/dC5oOmUpOmk+MTgwP2ktPTM2MDotMTgwPmkmJihpKz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBjdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIFJ1KG4sdCl7bj10YS5sYWIobiksdD10YS5sYWIodCk7dmFyIGU9bi5sLHI9bi5hLHU9bi5iLGk9dC5sLWUsbz10LmEtcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaHQoZStpKm4scitvKm4sdSthKm4pKyIifX1mdW5jdGlvbiBEdShuLHQpe3JldHVybiB0LT1uLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKG4rdCplKX19ZnVuY3Rpb24gUHUobil7dmFyIHQ9W24uYSxuLmJdLGU9W24uYyxuLmRdLHI9anUodCksdT1VdSh0LGUpLGk9anUoRnUoZSx0LC11KSl8fDA7dFswXSplWzFdPGVbMF0qdFsxXSYmKHRbMF0qPS0xLHRbMV0qPS0xLHIqPS0xLHUqPS0xKSx0aGlzLnJvdGF0ZT0ocj9NYXRoLmF0YW4yKHRbMV0sdFswXSk6TWF0aC5hdGFuMigtZVswXSxlWzFdKSkqUGEsdGhpcy50cmFuc2xhdGU9W24uZSxuLmZdLHRoaXMuc2NhbGU9W3IsaV0sdGhpcy5za2V3PWk/TWF0aC5hdGFuMih1LGkpKlBhOjB9ZnVuY3Rpb24gVXUobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXX1mdW5jdGlvbiBqdShuKXt2YXIgdD1NYXRoLnNxcnQoVXUobixuKSk7cmV0dXJuIHQmJihuWzBdLz10LG5bMV0vPXQpLHR9ZnVuY3Rpb24gRnUobix0LGUpe3JldHVybiBuWzBdKz1lKnRbMF0sblsxXSs9ZSp0WzFdLG59ZnVuY3Rpb24gSHUobix0KXt2YXIgZSxyPVtdLHU9W10saT10YS50cmFuc2Zvcm0obiksbz10YS50cmFuc2Zvcm0odCksYT1pLnRyYW5zbGF0ZSxjPW8udHJhbnNsYXRlLGw9aS5yb3RhdGUscz1vLnJvdGF0ZSxmPWkuc2tldyxoPW8uc2tldyxnPWkuc2NhbGUscD1vLnNjYWxlO3JldHVybiBhWzBdIT1jWzBdfHxhWzFdIT1jWzFdPyhyLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6MSx4OnZ1KGFbMF0sY1swXSl9LHtpOjMseDp2dShhWzFdLGNbMV0pfSkpOnIucHVzaChjWzBdfHxjWzFdPyJ0cmFuc2xhdGUoIitjKyIpIjoiIiksbCE9cz8obC1zPjE4MD9zKz0zNjA6cy1sPjE4MCYmKGwrPTM2MCksdS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIixudWxsLCIpIiktMix4OnZ1KGwscyl9KSk6cyYmci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiK3MrIikiKSxmIT1oP3UucHVzaCh7aTpyLnB1c2goci5wb3AoKSsic2tld1goIixudWxsLCIpIiktMix4OnZ1KGYsaCl9KTpoJiZyLnB1c2goci5wb3AoKSsic2tld1goIitoKyIpIiksZ1swXSE9cFswXXx8Z1sxXSE9cFsxXT8oZT1yLnB1c2goci5wb3AoKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIiksdS5wdXNoKHtpOmUtNCx4OnZ1KGdbMF0scFswXSl9LHtpOmUtMix4OnZ1KGdbMV0scFsxXSl9KSk6KDEhPXBbMF18fDEhPXBbMV0pJiZyLnB1c2goci5wb3AoKSsic2NhbGUoIitwKyIpIiksZT11Lmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIHQsaT0tMTsrK2k8ZTspclsodD11W2ldKS5pXT10Lngobik7cmV0dXJuIHIuam9pbigiIil9fWZ1bmN0aW9uIE91KG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuKGUtbikvdH19ZnVuY3Rpb24gSXUobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChlLW4pL3QpKX19ZnVuY3Rpb24gWXUobil7Zm9yKHZhciB0PW4uc291cmNlLGU9bi50YXJnZXQscj1WdSh0LGUpLHU9W3RdO3QhPT1yOyl0PXQucGFyZW50LHUucHVzaCh0KTtmb3IodmFyIGk9dS5sZW5ndGg7ZSE9PXI7KXUuc3BsaWNlKGksMCxlKSxlPWUucGFyZW50O3JldHVybiB1fWZ1bmN0aW9uIFp1KG4pe2Zvcih2YXIgdD1bXSxlPW4ucGFyZW50O251bGwhPWU7KXQucHVzaChuKSxuPWUsZT1lLnBhcmVudDtyZXR1cm4gdC5wdXNoKG4pLHR9ZnVuY3Rpb24gVnUobix0KXtpZihuPT09dClyZXR1cm4gbjtmb3IodmFyIGU9WnUobikscj1adSh0KSx1PWUucG9wKCksaT1yLnBvcCgpLG89bnVsbDt1PT09aTspbz11LHU9ZS5wb3AoKSxpPXIucG9wKCk7cmV0dXJuIG99ZnVuY3Rpb24gWHUobil7bi5maXhlZHw9Mn1mdW5jdGlvbiAkdShuKXtuLmZpeGVkJj0tN31mdW5jdGlvbiBCdShuKXtuLmZpeGVkfD00LG4ucHg9bi54LG4ucHk9bi55fWZ1bmN0aW9uIFd1KG4pe24uZml4ZWQmPS01fWZ1bmN0aW9uIEp1KG4sdCxlKXt2YXIgcj0wLHU9MDtpZihuLmNoYXJnZT0wLCFuLmxlYWYpZm9yKHZhciBpLG89bi5ub2RlcyxhPW8ubGVuZ3RoLGM9LTE7KytjPGE7KWk9b1tjXSxudWxsIT1pJiYoSnUoaSx0LGUpLG4uY2hhcmdlKz1pLmNoYXJnZSxyKz1pLmNoYXJnZSppLmN4LHUrPWkuY2hhcmdlKmkuY3kpO2lmKG4ucG9pbnQpe24ubGVhZnx8KG4ucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSxuLnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpO3ZhciBsPXQqZVtuLnBvaW50LmluZGV4XTtuLmNoYXJnZSs9bi5wb2ludENoYXJnZT1sLHIrPWwqbi5wb2ludC54LHUrPWwqbi5wb2ludC55fW4uY3g9ci9uLmNoYXJnZSxuLmN5PXUvbi5jaGFyZ2V9ZnVuY3Rpb24gR3Uobix0KXtyZXR1cm4gdGEucmViaW5kKG4sdCwic29ydCIsImNoaWxkcmVuIiwidmFsdWUiKSxuLm5vZGVzPW4sbi5saW5rcz1yaSxufWZ1bmN0aW9uIEt1KG4sdCl7Zm9yKHZhciBlPVtuXTtudWxsIT0obj1lLnBvcCgpKTspaWYodChuKSwodT1uLmNoaWxkcmVuKSYmKHI9dS5sZW5ndGgpKWZvcih2YXIgcix1Oy0tcj49MDspZS5wdXNoKHVbcl0pfWZ1bmN0aW9uIFF1KG4sdCl7Zm9yKHZhciBlPVtuXSxyPVtdO251bGwhPShuPWUucG9wKCkpOylpZihyLnB1c2gobiksKGk9bi5jaGlsZHJlbikmJih1PWkubGVuZ3RoKSlmb3IodmFyIHUsaSxvPS0xOysrbzx1OyllLnB1c2goaVtvXSk7Zm9yKDtudWxsIT0obj1yLnBvcCgpKTspdChuKX1mdW5jdGlvbiBuaShuKXtyZXR1cm4gbi5jaGlsZHJlbn1mdW5jdGlvbiB0aShuKXtyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBlaShuLHQpe3JldHVybiB0LnZhbHVlLW4udmFsdWV9ZnVuY3Rpb24gcmkobil7cmV0dXJuIHRhLm1lcmdlKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6bix0YXJnZXQ6dH19KX0pKX1mdW5jdGlvbiB1aShuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIGlpKG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gb2kobix0LGUpe24ueTA9dCxuLnk9ZX1mdW5jdGlvbiBhaShuKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpfWZ1bmN0aW9uIGNpKG4pe2Zvcih2YXIgdD0tMSxlPW5bMF0ubGVuZ3RoLHI9W107Kyt0PGU7KXJbdF09MDtyZXR1cm4gcn1mdW5jdGlvbiBsaShuKXtmb3IodmFyIHQsZT0xLHI9MCx1PW5bMF1bMV0saT1uLmxlbmd0aDtpPmU7KytlKSh0PW5bZV1bMV0pPnUmJihyPWUsdT10KTtyZXR1cm4gcn1mdW5jdGlvbiBzaShuKXtyZXR1cm4gbi5yZWR1Y2UoZmksMCl9ZnVuY3Rpb24gZmkobix0KXtyZXR1cm4gbit0WzFdfWZ1bmN0aW9uIGhpKG4sdCl7cmV0dXJuIGdpKG4sTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMisxKSl9ZnVuY3Rpb24gZ2kobix0KXtmb3IodmFyIGU9LTEscj0rblswXSx1PShuWzFdLXIpL3QsaT1bXTsrK2U8PXQ7KWlbZV09dSplK3I7cmV0dXJuIGl9ZnVuY3Rpb24gcGkobil7cmV0dXJuW3RhLm1pbihuKSx0YS5tYXgobildfWZ1bmN0aW9uIHZpKG4sdCl7cmV0dXJuIG4udmFsdWUtdC52YWx1ZX1mdW5jdGlvbiBkaShuLHQpe3ZhciBlPW4uX3BhY2tfbmV4dDtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bix0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBtaShuLHQpe24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1ufWZ1bmN0aW9uIHlpKG4sdCl7dmFyIGU9dC54LW4ueCxyPXQueS1uLnksdT1uLnIrdC5yO3JldHVybi45OTkqdSp1PmUqZStyKnJ9ZnVuY3Rpb24gTWkobil7ZnVuY3Rpb24gdChuKXtzPU1hdGgubWluKG4ueC1uLnIscyksZj1NYXRoLm1heChuLngrbi5yLGYpLGg9TWF0aC5taW4obi55LW4ucixoKSxnPU1hdGgubWF4KG4ueStuLnIsZyl9aWYoKGU9bi5jaGlsZHJlbikmJihsPWUubGVuZ3RoKSl7dmFyIGUscix1LGksbyxhLGMsbCxzPTEvMCxmPS0xLzAsaD0xLzAsZz0tMS8wO2lmKGUuZm9yRWFjaCh4aSkscj1lWzBdLHIueD0tci5yLHIueT0wLHQociksbD4xJiYodT1lWzFdLHUueD11LnIsdS55PTAsdCh1KSxsPjIpKWZvcihpPWVbMl0sd2kocix1LGkpLHQoaSksZGkocixpKSxyLl9wYWNrX3ByZXY9aSxkaShpLHUpLHU9ci5fcGFja19uZXh0LG89MztsPm87bysrKXt3aShyLHUsaT1lW29dKTt2YXIgcD0wLHY9MSxkPTE7Zm9yKGE9dS5fcGFja19uZXh0O2EhPT11O2E9YS5fcGFja19uZXh0LHYrKylpZih5aShhLGkpKXtwPTE7YnJlYWt9aWYoMT09cClmb3IoYz1yLl9wYWNrX3ByZXY7YyE9PWEuX3BhY2tfcHJldiYmIXlpKGMsaSk7Yz1jLl9wYWNrX3ByZXYsZCsrKTtwPyhkPnZ8fHY9PWQmJnUucjxyLnI/bWkocix1PWEpOm1pKHI9Yyx1KSxvLS0pOihkaShyLGkpLHU9aSx0KGkpKX12YXIgbT0ocytmKS8yLHk9KGgrZykvMixNPTA7Zm9yKG89MDtsPm87bysrKWk9ZVtvXSxpLngtPW0saS55LT15LE09TWF0aC5tYXgoTSxpLnIrTWF0aC5zcXJ0KGkueCppLngraS55KmkueSkpO24ucj1NLGUuZm9yRWFjaChiaSl9fWZ1bmN0aW9uIHhpKG4pe24uX3BhY2tfbmV4dD1uLl9wYWNrX3ByZXY9bn1mdW5jdGlvbiBiaShuKXtkZWxldGUgbi5fcGFja19uZXh0LGRlbGV0ZSBuLl9wYWNrX3ByZXZ9ZnVuY3Rpb24gX2kobix0LGUscil7dmFyIHU9bi5jaGlsZHJlbjtpZihuLng9dCs9cipuLngsbi55PWUrPXIqbi55LG4ucio9cix1KWZvcih2YXIgaT0tMSxvPXUubGVuZ3RoOysraTxvOylfaSh1W2ldLHQsZSxyKX1mdW5jdGlvbiB3aShuLHQsZSl7dmFyIHI9bi5yK2Uucix1PXQueC1uLngsaT10Lnktbi55O2lmKHImJih1fHxpKSl7dmFyIG89dC5yK2UucixhPXUqdStpKmk7byo9byxyKj1yO3ZhciBjPS41KyhyLW8pLygyKmEpLGw9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKihyK2EpLShyLT1hKSpyLW8qbykpLygyKmEpO2UueD1uLngrYyp1K2wqaSxlLnk9bi55K2MqaS1sKnV9ZWxzZSBlLng9bi54K3IsZS55PW4ueX1mdW5jdGlvbiBTaShuLHQpe3JldHVybiBuLnBhcmVudD09dC5wYXJlbnQ/MToyfWZ1bmN0aW9uIGtpKG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQubGVuZ3RoP3RbMF06bi50fWZ1bmN0aW9uIEVpKG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4odD1lLmxlbmd0aCk/ZVt0LTFdOm4udH1mdW5jdGlvbiBBaShuLHQsZSl7dmFyIHI9ZS8odC5pLW4uaSk7dC5jLT1yLHQucys9ZSxuLmMrPXIsdC56Kz1lLHQubSs9ZX1mdW5jdGlvbiBOaShuKXtmb3IodmFyIHQsZT0wLHI9MCx1PW4uY2hpbGRyZW4saT11Lmxlbmd0aDstLWk+PTA7KXQ9dVtpXSx0LnorPWUsdC5tKz1lLGUrPXQucysocis9dC5jKX1mdW5jdGlvbiBDaShuLHQsZSl7cmV0dXJuIG4uYS5wYXJlbnQ9PT10LnBhcmVudD9uLmE6ZX1mdW5jdGlvbiB6aShuKXtyZXR1cm4gMSt0YS5tYXgobixmdW5jdGlvbihuKXtyZXR1cm4gbi55fSl9ZnVuY3Rpb24gcWkobil7cmV0dXJuIG4ucmVkdWNlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4rdC54fSwwKS9uLmxlbmd0aH1mdW5jdGlvbiBMaShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0JiZ0Lmxlbmd0aD9MaSh0WzBdKTpufWZ1bmN0aW9uIFRpKG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4gZSYmKHQ9ZS5sZW5ndGgpP1RpKGVbdC0xXSk6bn1mdW5jdGlvbiBSaShuKXtyZXR1cm57eDpuLngseTpuLnksZHg6bi5keCxkeTpuLmR5fX1mdW5jdGlvbiBEaShuLHQpe3ZhciBlPW4ueCt0WzNdLHI9bi55K3RbMF0sdT1uLmR4LXRbMV0tdFszXSxpPW4uZHktdFswXS10WzJdO3JldHVybiAwPnUmJihlKz11LzIsdT0wKSwwPmkmJihyKz1pLzIsaT0wKSx7eDplLHk6cixkeDp1LGR5Oml9fWZ1bmN0aW9uIFBpKG4pe3ZhciB0PW5bMF0sZT1uW24ubGVuZ3RoLTFdO3JldHVybiBlPnQ/W3QsZV06W2UsdF19ZnVuY3Rpb24gVWkobil7cmV0dXJuIG4ucmFuZ2VFeHRlbnQ/bi5yYW5nZUV4dGVudCgpOlBpKG4ucmFuZ2UoKSl9ZnVuY3Rpb24gamkobix0LGUscil7dmFyIHU9ZShuWzBdLG5bMV0pLGk9cih0WzBdLHRbMV0pO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaSh1KG4pKX19ZnVuY3Rpb24gRmkobix0KXt2YXIgZSxyPTAsdT1uLmxlbmd0aC0xLGk9bltyXSxvPW5bdV07cmV0dXJuIGk+byYmKGU9cixyPXUsdT1lLGU9aSxpPW8sbz1lKSxuW3JdPXQuZmxvb3IoaSksblt1XT10LmNlaWwobyksbn1mdW5jdGlvbiBIaShuKXtyZXR1cm4gbj97Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IodC9uKSpufSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwodC9uKSpufX06bWx9ZnVuY3Rpb24gT2kobix0LGUscil7dmFyIHU9W10saT1bXSxvPTAsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCktMTtmb3IoblthXTxuWzBdJiYobj1uLnNsaWNlKCkucmV2ZXJzZSgpLHQ9dC5zbGljZSgpLnJldmVyc2UoKSk7KytvPD1hOyl1LnB1c2goZShuW28tMV0sbltvXSkpLGkucHVzaChyKHRbby0xXSx0W29dKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXRhLmJpc2VjdChuLHQsMSxhKS0xO3JldHVybiBpW2VdKHVbZV0odCkpfX1mdW5jdGlvbiBJaShuLHQsZSxyKXtmdW5jdGlvbiB1KCl7dmFyIHU9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpPjI/T2k6amksYz1yP0l1Ok91O3JldHVybiBvPXUobix0LGMsZSksYT11KHQsbixjLG11KSxpfWZ1bmN0aW9uIGkobil7cmV0dXJuIG8obil9dmFyIG8sYTtyZXR1cm4gaS5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuIGEobil9LGkuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKE51bWJlciksdSgpKTpufSxpLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sdSgpKTp0fSxpLnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGkucmFuZ2UobikuaW50ZXJwb2xhdGUoRHUpfSxpLmNsYW1wPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdSgpKTpyfSxpLmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdSgpKTplfSxpLnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBYaShuLHQpfSxpLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gJGkobix0LGUpfSxpLm5pY2U9ZnVuY3Rpb24odCl7cmV0dXJuIFppKG4sdCksdSgpfSxpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSWkobix0LGUscil9LHUoKX1mdW5jdGlvbiBZaShuLHQpe3JldHVybiB0YS5yZWJpbmQobix0LCJyYW5nZSIsInJhbmdlUm91bmQiLCJpbnRlcnBvbGF0ZSIsImNsYW1wIil9ZnVuY3Rpb24gWmkobix0KXtyZXR1cm4gRmkobixIaShWaShuLHQpWzJdKSl9ZnVuY3Rpb24gVmkobix0KXtudWxsPT10JiYodD0xMCk7dmFyIGU9UGkobikscj1lWzFdLWVbMF0sdT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIvdCkvTWF0aC5MTjEwKSksaT10L3IqdTtyZXR1cm4uMTU+PWk/dSo9MTA6LjM1Pj1pP3UqPTU6Ljc1Pj1pJiYodSo9MiksZVswXT1NYXRoLmNlaWwoZVswXS91KSp1LGVbMV09TWF0aC5mbG9vcihlWzFdL3UpKnUrLjUqdSxlWzJdPXUsZX1mdW5jdGlvbiBYaShuLHQpe3JldHVybiB0YS5yYW5nZS5hcHBseSh0YSxWaShuLHQpKX1mdW5jdGlvbiAkaShuLHQsZSl7dmFyIHI9Vmkobix0KTtpZihlKXt2YXIgdT1pYy5leGVjKGUpO2lmKHUuc2hpZnQoKSwicyI9PT11WzhdKXt2YXIgaT10YS5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoZ2EoclswXSksZ2EoclsxXSkpKTtyZXR1cm4gdVs3XXx8KHVbN109Ii4iK0JpKGkuc2NhbGUoclsyXSkpKSx1WzhdPSJmIixlPXRhLmZvcm1hdCh1LmpvaW4oIiIpKSxmdW5jdGlvbihuKXtyZXR1cm4gZShpLnNjYWxlKG4pKStpLnN5bWJvbH19dVs3XXx8KHVbN109Ii4iK1dpKHVbOF0scikpLGU9dS5qb2luKCIiKX1lbHNlIGU9IiwuIitCaShyWzJdKSsiZiI7cmV0dXJuIHRhLmZvcm1hdChlKX1mdW5jdGlvbiBCaShuKXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyhuKS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBXaShuLHQpe3ZhciBlPUJpKHRbMl0pO3JldHVybiBuIGluIHlsP01hdGguYWJzKGUtQmkoTWF0aC5tYXgoZ2EodFswXSksZ2EodFsxXSkpKSkrICsoImUiIT09bik6ZS0yKigiJSI9PT1uKX1mdW5jdGlvbiBKaShuLHQsZSxyKXtmdW5jdGlvbiB1KG4pe3JldHVybihlP01hdGgubG9nKDA+bj8wOm4pOi1NYXRoLmxvZyhuPjA/MDotbikpL01hdGgubG9nKHQpfWZ1bmN0aW9uIGkobil7cmV0dXJuIGU/TWF0aC5wb3codCxuKTotTWF0aC5wb3codCwtbil9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbih1KHQpKX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10WzBdPj0wLG4uZG9tYWluKChyPXQubWFwKE51bWJlcikpLm1hcCh1KSksbyk6cn0sby5iYXNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlLG4uZG9tYWluKHIubWFwKHUpKSxvKTp0fSxvLm5pY2U9ZnVuY3Rpb24oKXt2YXIgdD1GaShyLm1hcCh1KSxlP01hdGg6eGwpO3JldHVybiBuLmRvbWFpbih0KSxyPXQubWFwKGkpLG99LG8udGlja3M9ZnVuY3Rpb24oKXt2YXIgbj1QaShyKSxvPVtdLGE9blswXSxjPW5bMV0sbD1NYXRoLmZsb29yKHUoYSkpLHM9TWF0aC5jZWlsKHUoYykpLGY9dCUxPzI6dDtpZihpc0Zpbml0ZShzLWwpKXtpZihlKXtmb3IoO3M+bDtsKyspZm9yKHZhciBoPTE7Zj5oO2grKylvLnB1c2goaShsKSpoKTtvLnB1c2goaShsKSl9ZWxzZSBmb3Ioby5wdXNoKGkobCkpO2wrKzxzOylmb3IodmFyIGg9Zi0xO2g+MDtoLS0pby5wdXNoKGkobCkqaCk7Zm9yKGw9MDtvW2xdPGE7bCsrKTtmb3Iocz1vLmxlbmd0aDtvW3MtMV0+YztzLS0pO289by5zbGljZShsLHMpfXJldHVybiBvfSxvLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gTWw7YXJndW1lbnRzLmxlbmd0aDwyP3Q9TWw6ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXRhLmZvcm1hdCh0KSk7dmFyIHIsYT1NYXRoLm1heCguMSxuL28udGlja3MoKS5sZW5ndGgpLGM9ZT8ocj0xZS0xMixNYXRoLmNlaWwpOihyPS0xZS0xMixNYXRoLmZsb29yKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4vaShjKHUobikrcikpPD1hP3Qobik6IiJ9fSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSmkobi5jb3B5KCksdCxlLHIpfSxZaShvLG4pfWZ1bmN0aW9uIEdpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHUodCkpfXZhciB1PUtpKHQpLGk9S2koMS90KTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4oKGU9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxyKTplfSxyLnRpY2tzPWZ1bmN0aW9uKG4pe3JldHVybiBYaShlLG4pfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gJGkoZSxuLHQpfSxyLm5pY2U9ZnVuY3Rpb24obil7cmV0dXJuIHIuZG9tYWluKFppKGUsbikpfSxyLmV4cG9uZW50PWZ1bmN0aW9uKG8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUtpKHQ9byksaT1LaSgxL3QpLG4uZG9tYWluKGUubWFwKHUpKSxyKTp0fSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gR2kobi5jb3B5KCksdCxlKX0sWWkocixuKX1mdW5jdGlvbiBLaShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+dD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX19ZnVuY3Rpb24gUWkobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBpWygodS5nZXQoZSl8fCgicmFuZ2UiPT09dC50P3Uuc2V0KGUsbi5wdXNoKGUpKTowLzApKS0xKSVpLmxlbmd0aF19ZnVuY3Rpb24gcih0LGUpe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn0pfXZhciB1LGksbztyZXR1cm4gZS5kb21haW49ZnVuY3Rpb24ocil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47bj1bXSx1PW5ldyBsO2Zvcih2YXIgaSxvPS0xLGE9ci5sZW5ndGg7KytvPGE7KXUuaGFzKGk9cltvXSl8fHUuc2V0KGksbi5wdXNoKGkpKTtyZXR1cm4gZVt0LnRdLmFwcGx5KGUsdC5hKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLG89MCx0PXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LGUpOml9LGUucmFuZ2VQb2ludHM9ZnVuY3Rpb24odSxhKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApO3ZhciBjPXVbMF0sbD11WzFdLHM9bi5sZW5ndGg8Mj8oYz0oYytsKS8yLDApOihsLWMpLyhuLmxlbmd0aC0xK2EpO3JldHVybiBpPXIoYytzKmEvMixzKSxvPTAsdD17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24odSxhKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApO3ZhciBjPXVbMF0sbD11WzFdLHM9bi5sZW5ndGg8Mj8oYz1sPU1hdGgucm91bmQoKGMrbCkvMiksMCk6KGwtYykvKG4ubGVuZ3RoLTErYSl8MDtyZXR1cm4gaT1yKGMrTWF0aC5yb3VuZChzKmEvMisobC1jLShuLmxlbmd0aC0xK2EpKnMpLzIpLHMpLG89MCx0PXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmRzPWZ1bmN0aW9uKHUsYSxjKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGM9YSk7dmFyIGw9dVsxXTx1WzBdLHM9dVtsLTBdLGY9dVsxLWxdLGg9KGYtcykvKG4ubGVuZ3RoLWErMipjKTtyZXR1cm4gaT1yKHMraCpjLGgpLGwmJmkucmV2ZXJzZSgpLG89aCooMS1hKSx0PXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24odSxhLGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz1hKTt2YXIgbD11WzFdPHVbMF0scz11W2wtMF0sZj11WzEtbF0saD1NYXRoLmZsb29yKChmLXMpLyhuLmxlbmd0aC1hKzIqYykpO3JldHVybiBpPXIocytNYXRoLnJvdW5kKChmLXMtKG4ubGVuZ3RoLWEpKmgpLzIpLGgpLGwmJmkucmV2ZXJzZSgpLG89TWF0aC5yb3VuZChoKigxLWEpKSx0PXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBvfSxlLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIFBpKHQuYVswXSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBRaShuLHQpfSxlLmRvbWFpbihuKX1mdW5jdGlvbiBubyhuLHQpe2Z1bmN0aW9uIGkoKXt2YXIgZT0wLHI9dC5sZW5ndGg7Zm9yKGE9W107KytlPHI7KWFbZS0xXT10YS5xdWFudGlsZShuLGUvcik7cmV0dXJuIG99ZnVuY3Rpb24gbyhuKXtyZXR1cm4gaXNOYU4obj0rbik/dm9pZCAwOnRbdGEuYmlzZWN0KGEsbildfXZhciBhO3JldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChyKS5maWx0ZXIodSkuc29ydChlKSxpKCkpOm59LG8ucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKCkpOnR9LG8ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSwwPmU/WzAvMCwwLzBdOltlPjA/YVtlLTFdOm5bMF0sZTxhLmxlbmd0aD9hW2VdOm5bbi5sZW5ndGgtMV1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbm8obix0KX0saSgpfWZ1bmN0aW9uIHRvKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBlW01hdGgubWF4KDAsTWF0aC5taW4obyxNYXRoLmZsb29yKGkqKHQtbikpKSldfWZ1bmN0aW9uIHUoKXtyZXR1cm4gaT1lLmxlbmd0aC8odC1uKSxvPWUubGVuZ3RoLTEscn12YXIgaSxvO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rZVswXSx0PStlW2UubGVuZ3RoLTFdLHUoKSk6W24sdF19LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PWUuaW5kZXhPZih0KSx0PTA+dD8wLzA6dC9pK24sW3QsdCsxL2ldfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdG8obix0LGUpfSx1KCl9ZnVuY3Rpb24gZW8obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBlPj1lP3RbdGEuYmlzZWN0KG4sZSldOnZvaWQgMH1yZXR1cm4gZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZSk6dH0sZS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLFtuW2UtMV0sbltlXV19LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBlbyhuLHQpfSxlfWZ1bmN0aW9uIHJvKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuK259cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLm1hcCh0KSx0KTpufSx0LnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBYaShuLHQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gJGkobix0LGUpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8obil9LHR9ZnVuY3Rpb24gdW8oKXtyZXR1cm4gMH1mdW5jdGlvbiBpbyhuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiBvbyhuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBhbyhuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIGNvKG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGxvKG4pe3JldHVybiBuJiZuLnBhZEFuZ2xlfWZ1bmN0aW9uIHNvKG4sdCxlLHIpe3JldHVybihuLWUpKnQtKHQtcikqbj4wPzA6MX1mdW5jdGlvbiBmbyhuLHQsZSxyLHUpe3ZhciBpPW5bMF0tdFswXSxvPW5bMV0tdFsxXSxhPSh1P3I6LXIpL01hdGguc3FydChpKmkrbypvKSxjPWEqbyxsPS1hKmkscz1uWzBdK2MsZj1uWzFdK2wsaD10WzBdK2MsZz10WzFdK2wscD0ocytoKS8yLHY9KGYrZykvMixkPWgtcyxtPWctZix5PWQqZCttKm0sTT1lLXIseD1zKmctaCpmLGI9KDA+bT8tMToxKSpNYXRoLnNxcnQoTSpNKnkteCp4KSxfPSh4Km0tZCpiKS95LHc9KC14KmQtbSpiKS95LFM9KHgqbStkKmIpL3ksaz0oLXgqZCttKmIpL3ksRT1fLXAsQT13LXYsTj1TLXAsQz1rLXY7cmV0dXJuIEUqRStBKkE+TipOK0MqQyYmKF89Uyx3PWspLFtbXy1jLHctbF0sW18qZS9NLHcqZS9NXV19ZnVuY3Rpb24gaG8obil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBvKCl7bC5wdXNoKCJNIixpKG4ocyksYSkpfWZvcih2YXIgYyxsPVtdLHM9W10sZj0tMSxoPXQubGVuZ3RoLGc9RXQoZSkscD1FdChyKTsrK2Y8aDspdS5jYWxsKHRoaXMsYz10W2ZdLGYpP3MucHVzaChbK2cuY2FsbCh0aGlzLGMsZiksK3AuY2FsbCh0aGlzLGMsZildKTpzLmxlbmd0aCYmKG8oKSxzPVtdKTtyZXR1cm4gcy5sZW5ndGgmJm8oKSxsLmxlbmd0aD9sLmpvaW4oIiIpOm51bGx9dmFyIGU9QXIscj1Ocix1PU5lLGk9Z28sbz1pLmtleSxhPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2k9bjooaT1FbC5nZXQobil8fGdvKS5rZXksdCk6b30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sdCk6YX0sdH1mdW5jdGlvbiBnbyhuKXtyZXR1cm4gbi5qb2luKCJMIil9ZnVuY3Rpb24gcG8obil7cmV0dXJuIGdvKG4pKyJaIn1mdW5jdGlvbiB2byhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJIIiwoclswXSsocj1uW3RdKVswXSkvMiwiViIsclsxXSk7cmV0dXJuIGU+MSYmdS5wdXNoKCJIIixyWzBdKSx1LmpvaW4oIiIpfWZ1bmN0aW9uIG1vKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIlYiLChyPW5bdF0pWzFdLCJIIixyWzBdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiB5byhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJIIiwocj1uW3RdKVswXSwiViIsclsxXSk7cmV0dXJuIHUuam9pbigiIil9ZnVuY3Rpb24gTW8obix0KXtyZXR1cm4gbi5sZW5ndGg8ND9nbyhuKTpuWzFdK19vKG4uc2xpY2UoMSwtMSksd28obix0KSl9ZnVuY3Rpb24geG8obix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKChuLnB1c2goblswXSksbiksd28oW25bbi5sZW5ndGgtMl1dLmNvbmNhdChuLFtuWzFdXSksdCkpfWZ1bmN0aW9uIGJvKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbyhuLHdvKG4sdCkpfWZ1bmN0aW9uIF9vKG4sdCl7aWYodC5sZW5ndGg8MXx8bi5sZW5ndGghPXQubGVuZ3RoJiZuLmxlbmd0aCE9dC5sZW5ndGgrMilyZXR1cm4gZ28obik7dmFyIGU9bi5sZW5ndGghPXQubGVuZ3RoLHI9IiIsdT1uWzBdLGk9blsxXSxvPXRbMF0sYT1vLGM9MTtpZihlJiYocis9IlEiKyhpWzBdLTIqb1swXS8zKSsiLCIrKGlbMV0tMipvWzFdLzMpKyIsIitpWzBdKyIsIitpWzFdLHU9blsxXSxjPTIpLHQubGVuZ3RoPjEpe2E9dFsxXSxpPW5bY10sYysrLHIrPSJDIisodVswXStvWzBdKSsiLCIrKHVbMV0rb1sxXSkrIiwiKyhpWzBdLWFbMF0pKyIsIisoaVsxXS1hWzFdKSsiLCIraVswXSsiLCIraVsxXTtmb3IodmFyIGw9MjtsPHQubGVuZ3RoO2wrKyxjKyspaT1uW2NdLGE9dFtsXSxyKz0iUyIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdfWlmKGUpe3ZhciBzPW5bY107cis9IlEiKyhpWzBdKzIqYVswXS8zKSsiLCIrKGlbMV0rMiphWzFdLzMpKyIsIitzWzBdKyIsIitzWzFdfXJldHVybiByfWZ1bmN0aW9uIHdvKG4sdCl7Zm9yKHZhciBlLHI9W10sdT0oMS10KS8yLGk9blswXSxvPW5bMV0sYT0xLGM9bi5sZW5ndGg7KythPGM7KWU9aSxpPW8sbz1uW2FdLHIucHVzaChbdSoob1swXS1lWzBdKSx1KihvWzFdLWVbMV0pXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gU28obil7aWYobi5sZW5ndGg8MylyZXR1cm4gZ28obik7dmFyIHQ9MSxlPW4ubGVuZ3RoLHI9blswXSx1PXJbMF0saT1yWzFdLG89W3UsdSx1LChyPW5bMV0pWzBdXSxhPVtpLGksaSxyWzFdXSxjPVt1LCIsIixpLCJMIixObyhDbCxvKSwiLCIsTm8oQ2wsYSldO2ZvcihuLnB1c2gobltlLTFdKTsrK3Q8PWU7KXI9blt0XSxvLnNoaWZ0KCksby5wdXNoKHJbMF0pLGEuc2hpZnQoKSxhLnB1c2goclsxXSksQ28oYyxvLGEpO3JldHVybiBuLnBvcCgpLGMucHVzaCgiTCIsciksYy5qb2luKCIiKX1mdW5jdGlvbiBrbyhuKXtpZihuLmxlbmd0aDw0KXJldHVybiBnbyhuKTtmb3IodmFyIHQsZT1bXSxyPS0xLHU9bi5sZW5ndGgsaT1bMF0sbz1bMF07KytyPDM7KXQ9bltyXSxpLnB1c2godFswXSksby5wdXNoKHRbMV0pO2ZvcihlLnB1c2goTm8oQ2wsaSkrIiwiK05vKENsLG8pKSwtLXI7KytyPHU7KXQ9bltyXSxpLnNoaWZ0KCksaS5wdXNoKHRbMF0pLG8uc2hpZnQoKSxvLnB1c2godFsxXSksQ28oZSxpLG8pO3JldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIEVvKG4pe2Zvcih2YXIgdCxlLHI9LTEsdT1uLmxlbmd0aCxpPXUrNCxvPVtdLGE9W107KytyPDQ7KWU9bltyJXVdLG8ucHVzaChlWzBdKSxhLnB1c2goZVsxXSk7Zm9yKHQ9W05vKENsLG8pLCIsIixObyhDbCxhKV0sLS1yOysrcjxpOyllPW5bciV1XSxvLnNoaWZ0KCksby5wdXNoKGVbMF0pLGEuc2hpZnQoKSxhLnB1c2goZVsxXSksQ28odCxvLGEpO3JldHVybiB0LmpvaW4oIiIpfWZ1bmN0aW9uIEFvKG4sdCl7dmFyIGU9bi5sZW5ndGgtMTtpZihlKWZvcih2YXIgcix1LGk9blswXVswXSxvPW5bMF1bMV0sYT1uW2VdWzBdLWksYz1uW2VdWzFdLW8sbD0tMTsrK2w8PWU7KXI9bltsXSx1PWwvZSxyWzBdPXQqclswXSsoMS10KSooaSt1KmEpLHJbMV09dCpyWzFdKygxLXQpKihvK3UqYyk7cmV0dXJuIFNvKG4pfWZ1bmN0aW9uIE5vKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdK25bM10qdFszXX1mdW5jdGlvbiBDbyhuLHQsZSl7bi5wdXNoKCJDIixObyhBbCx0KSwiLCIsTm8oQWwsZSksIiwiLE5vKE5sLHQpLCIsIixObyhObCxlKSwiLCIsTm8oQ2wsdCksIiwiLE5vKENsLGUpKX1mdW5jdGlvbiB6byhuLHQpe3JldHVybih0WzFdLW5bMV0pLyh0WzBdLW5bMF0pfWZ1bmN0aW9uIHFvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgtMSxyPVtdLHU9blswXSxpPW5bMV0sbz1yWzBdPXpvKHUsaSk7Kyt0PGU7KXJbdF09KG8rKG89em8odT1pLGk9blt0KzFdKSkpLzI7cmV0dXJuIHJbdF09byxyfWZ1bmN0aW9uIExvKG4pe2Zvcih2YXIgdCxlLHIsdSxpPVtdLG89cW8obiksYT0tMSxjPW4ubGVuZ3RoLTE7KythPGM7KXQ9em8oblthXSxuW2ErMV0pLGdhKHQpPENhP29bYV09b1thKzFdPTA6KGU9b1thXS90LHI9b1thKzFdL3QsdT1lKmUrcipyLHU+OSYmKHU9Myp0L01hdGguc3FydCh1KSxvW2FdPXUqZSxvW2ErMV09dSpyKSk7Zm9yKGE9LTE7KythPD1jOyl1PShuW01hdGgubWluKGMsYSsxKV1bMF0tbltNYXRoLm1heCgwLGEtMSldWzBdKS8oNiooMStvW2FdKm9bYV0pKSxpLnB1c2goW3V8fDAsb1thXSp1fHwwXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVG8obil7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbyhuLExvKG4pKX1mdW5jdGlvbiBSbyhuKXtmb3IodmFyIHQsZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspdD1uW3VdLGU9dFswXSxyPXRbMV0tUmEsdFswXT1lKk1hdGguY29zKHIpLHRbMV09ZSpNYXRoLnNpbihyKTtyZXR1cm4gbn1mdW5jdGlvbiBEbyhuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIGMoKXt2LnB1c2goIk0iLGEobihtKSxmKSxzLGwobihkLnJldmVyc2UoKSksZiksIloiKX1mb3IodmFyIGgsZyxwLHY9W10sZD1bXSxtPVtdLHk9LTEsTT10Lmxlbmd0aCx4PUV0KGUpLGI9RXQodSksXz1lPT09cj9mdW5jdGlvbigpe3JldHVybiBnfTpFdChyKSx3PXU9PT1pP2Z1bmN0aW9uKCl7cmV0dXJuIHB9OkV0KGkpOysreTxNOylvLmNhbGwodGhpcyxoPXRbeV0seSk/KGQucHVzaChbZz0reC5jYWxsKHRoaXMsaCx5KSxwPStiLmNhbGwodGhpcyxoLHkpXSksbS5wdXNoKFsrXy5jYWxsKHRoaXMsaCx5KSwrdy5jYWxsKHRoaXMsaCx5KV0pKTpkLmxlbmd0aCYmKGMoKSxkPVtdLG09W10pO3JldHVybiBkLmxlbmd0aCYmYygpLHYubGVuZ3RoP3Yuam9pbigiIik6bnVsbH12YXIgZT1BcixyPUFyLHU9MCxpPU5yLG89TmUsYT1nbyxjPWEua2V5LGw9YSxzPSJMIixmPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cj1uLHQpOnJ9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cg0KfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9aT1uLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LnkxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sdCk6aX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9hPW46KGE9RWwuZ2V0KG4pfHxnbykua2V5LGw9YS5yZXZlcnNlfHxhLHM9YS5jbG9zZWQ/Ik0iOiJMIix0KTpjfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bix0KTpmfSx0fWZ1bmN0aW9uIFBvKG4pe3JldHVybiBuLnJhZGl1c31mdW5jdGlvbiBVbyhuKXtyZXR1cm5bbi54LG4ueV19ZnVuY3Rpb24gam8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10WzBdLHI9dFsxXS1SYTtyZXR1cm5bZSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKHIpXX19ZnVuY3Rpb24gRm8oKXtyZXR1cm4gNjR9ZnVuY3Rpb24gSG8oKXtyZXR1cm4iY2lyY2xlIn1mdW5jdGlvbiBPbyhuKXt2YXIgdD1NYXRoLnNxcnQobi9xYSk7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIit0KyJaIn1mdW5jdGlvbiBJbyhuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdCxlOyh0PXRoaXNbbl0pJiYoZT10W3QuYWN0aXZlXSkmJigtLXQuY291bnQ/ZGVsZXRlIHRbdC5hY3RpdmVdOmRlbGV0ZSB0aGlzW25dLHQuYWN0aXZlKz0uNSxlLmV2ZW50JiZlLmV2ZW50LmludGVycnVwdC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLmluZGV4KSl9fWZ1bmN0aW9uIFlvKG4sdCxlKXtyZXR1cm4geWEobixQbCksbi5uYW1lc3BhY2U9dCxuLmlkPWUsbn1mdW5jdGlvbiBabyhuLHQsZSxyKXt2YXIgdT1uLmlkLGk9bi5uYW1lc3BhY2U7cmV0dXJuIFkobiwiZnVuY3Rpb24iPT10eXBlb2YgZT9mdW5jdGlvbihuLG8sYSl7bltpXVt1XS50d2Vlbi5zZXQodCxyKGUuY2FsbChuLG4uX19kYXRhX18sbyxhKSkpfTooZT1yKGUpLGZ1bmN0aW9uKG4pe25baV1bdV0udHdlZW4uc2V0KHQsZSl9KSl9ZnVuY3Rpb24gVm8obil7cmV0dXJuIG51bGw9PW4mJihuPSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn19ZnVuY3Rpb24gWG8obil7cmV0dXJuIG51bGw9PW4/Il9fdHJhbnNpdGlvbl9fIjoiX190cmFuc2l0aW9uXyIrbisiX18ifWZ1bmN0aW9uICRvKG4sdCxlLHIsdSl7dmFyIGk9bltlXXx8KG5bZV09e2FjdGl2ZTowLGNvdW50OjB9KSxvPWlbcl07aWYoIW8pe3ZhciBhPXUudGltZTtvPWlbcl09e3R3ZWVuOm5ldyBsLHRpbWU6YSxkZWxheTp1LmRlbGF5LGR1cmF0aW9uOnUuZHVyYXRpb24sZWFzZTp1LmVhc2UsaW5kZXg6dH0sdT1udWxsLCsraS5jb3VudCx0YS50aW1lcihmdW5jdGlvbih1KXtmdW5jdGlvbiBjKGUpe2lmKGkuYWN0aXZlPnIpcmV0dXJuIHMoKTt2YXIgdT1pW2kuYWN0aXZlXTt1JiYoLS1pLmNvdW50LGRlbGV0ZSBpW2kuYWN0aXZlXSx1LmV2ZW50JiZ1LmV2ZW50LmludGVycnVwdC5jYWxsKG4sbi5fX2RhdGFfXyx1LmluZGV4KSksaS5hY3RpdmU9cixvLmV2ZW50JiZvLmV2ZW50LnN0YXJ0LmNhbGwobixuLl9fZGF0YV9fLHQpLG8udHdlZW4uZm9yRWFjaChmdW5jdGlvbihlLHIpeyhyPXIuY2FsbChuLG4uX19kYXRhX18sdCkpJiZ2LnB1c2gocil9KSxoPW8uZWFzZSxmPW8uZHVyYXRpb24sdGEudGltZXIoZnVuY3Rpb24oKXtyZXR1cm4gcC5jPWwoZXx8MSk/TmU6bCwxfSwwLGEpfWZ1bmN0aW9uIGwoZSl7aWYoaS5hY3RpdmUhPT1yKXJldHVybiAxO2Zvcih2YXIgdT1lL2YsYT1oKHUpLGM9di5sZW5ndGg7Yz4wOyl2Wy0tY10uY2FsbChuLGEpO3JldHVybiB1Pj0xPyhvLmV2ZW50JiZvLmV2ZW50LmVuZC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxzKCkpOnZvaWQgMH1mdW5jdGlvbiBzKCl7cmV0dXJuLS1pLmNvdW50P2RlbGV0ZSBpW3JdOmRlbGV0ZSBuW2VdLDF9dmFyIGYsaCxnPW8uZGVsYXkscD1lYyx2PVtdO3JldHVybiBwLnQ9ZythLHU+PWc/Yyh1LWcpOnZvaWQocC5jPWMpfSwwLGEpfX1mdW5jdGlvbiBCbyhuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgiKyhpc0Zpbml0ZShyKT9yOmUobikpKyIsMCkifSl9ZnVuY3Rpb24gV28obix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoMCwiKyhpc0Zpbml0ZShyKT9yOmUobikpKyIpIn0pfWZ1bmN0aW9uIEpvKG4pe3JldHVybiBuLnRvSVNPU3RyaW5nKCl9ZnVuY3Rpb24gR28obix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4odCl9ZnVuY3Rpb24gdShuLGUpe3ZhciByPW5bMV0tblswXSx1PXIvZSxpPXRhLmJpc2VjdChWbCx1KTtyZXR1cm4gaT09VmwubGVuZ3RoP1t0LnllYXIsVmkobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4vMzE1MzZlNn0pLGUpWzJdXTppP3RbdS9WbFtpLTFdPFZsW2ldL3U/aS0xOmldOltCbCxWaShuLGUpWzJdXX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEtvKG4uaW52ZXJ0KHQpKX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4uZG9tYWluKHQpLHIpOm4uZG9tYWluKCkubWFwKEtvKX0sci5uaWNlPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4haXNOYU4oZSkmJiFuLnJhbmdlKGUsS28oK2UrMSksdCkubGVuZ3RofXZhciBpPXIuZG9tYWluKCksbz1QaShpKSxhPW51bGw9PW4/dShvLDEwKToibnVtYmVyIj09dHlwZW9mIG4mJnUobyxuKTtyZXR1cm4gYSYmKG49YVswXSx0PWFbMV0pLHIuZG9tYWluKEZpKGksdD4xP3tmbG9vcjpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmZsb29yKHQpKTspdD1Lbyh0LTEpO3JldHVybiB0fSxjZWlsOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uY2VpbCh0KSk7KXQ9S28oK3QrMSk7cmV0dXJuIHR9fTpuKSl9LHIudGlja3M9ZnVuY3Rpb24obix0KXt2YXIgZT1QaShyLmRvbWFpbigpKSxpPW51bGw9PW4/dShlLDEwKToibnVtYmVyIj09dHlwZW9mIG4/dShlLG4pOiFuLnJhbmdlJiZbe3JhbmdlOm59LHRdO3JldHVybiBpJiYobj1pWzBdLHQ9aVsxXSksbi5yYW5nZShlWzBdLEtvKCtlWzFdKzEpLDE+dD8xOnQpfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEdvKG4uY29weSgpLHQsZSl9LFlpKHIsbil9ZnVuY3Rpb24gS28obil7cmV0dXJuIG5ldyBEYXRlKG4pfWZ1bmN0aW9uIFFvKG4pe3JldHVybiBKU09OLnBhcnNlKG4ucmVzcG9uc2VUZXh0KX1mdW5jdGlvbiBuYShuKXt2YXIgdD11YS5jcmVhdGVSYW5nZSgpO3JldHVybiB0LnNlbGVjdE5vZGUodWEuYm9keSksdC5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQobi5yZXNwb25zZVRleHQpfXZhciB0YT17dmVyc2lvbjoiMy41LjUifSxlYT1bXS5zbGljZSxyYT1mdW5jdGlvbihuKXtyZXR1cm4gZWEuY2FsbChuKX0sdWE9dGhpcy5kb2N1bWVudDtpZih1YSl0cnl7cmEodWEuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKGlhKXtyYT1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fWlmKERhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KSx1YSl0cnl7dWEuY3JlYXRlRWxlbWVudCgiRElWIikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLDAsIiIpfWNhdGNoKG9hKXt2YXIgYWE9dGhpcy5FbGVtZW50LnByb3RvdHlwZSxjYT1hYS5zZXRBdHRyaWJ1dGUsbGE9YWEuc2V0QXR0cmlidXRlTlMsc2E9dGhpcy5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSxmYT1zYS5zZXRQcm9wZXJ0eTthYS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24obix0KXtjYS5jYWxsKHRoaXMsbix0KyIiKX0sYWEuc2V0QXR0cmlidXRlTlM9ZnVuY3Rpb24obix0LGUpe2xhLmNhbGwodGhpcyxuLHQsZSsiIil9LHNhLnNldFByb3BlcnR5PWZ1bmN0aW9uKG4sdCxlKXtmYS5jYWxsKHRoaXMsbix0KyIiLGUpfX10YS5hc2NlbmRpbmc9ZSx0YS5kZXNjZW5kaW5nPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4+dD8tMTp0Pm4/MTp0Pj1uPzA6MC8wfSx0YS5taW49ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmZT5yJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJmU+ciYmKGU9cil9cmV0dXJuIGV9LHRhLm1heD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysrdTxpOylpZihudWxsIT0ocj1uW3VdKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPW5bdV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj5lJiYoZT1yKX1yZXR1cm4gZX0sdGEuZXh0ZW50PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1LGk9LTEsbz1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bltpXSkmJnI+PXIpe2U9dT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPW5baV0pJiYoZT5yJiYoZT1yKSxyPnUmJih1PXIpKX1lbHNle2Zvcig7KytpPG87KWlmKG51bGwhPShyPXQuY2FsbChuLG5baV0saSkpJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9cmV0dXJuW2UsdV19LHRhLnN1bT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MCxpPW4ubGVuZ3RoLG89LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK288aTspdShlPStuW29dKSYmKHIrPWUpO2Vsc2UgZm9yKDsrK288aTspdShlPSt0LmNhbGwobixuW29dLG8pKSYmKHIrPWUpO3JldHVybiByfSx0YS5tZWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaT0wLG89bi5sZW5ndGgsYT0tMSxjPW87aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2E8bzspdShlPXIoblthXSkpP2krPWU6LS1jO2Vsc2UgZm9yKDsrK2E8bzspdShlPXIodC5jYWxsKG4sblthXSxhKSkpP2krPWU6LS1jO3JldHVybiBjP2kvYzp2b2lkIDB9LHRhLnF1YW50aWxlPWZ1bmN0aW9uKG4sdCl7dmFyIGU9KG4ubGVuZ3RoLTEpKnQrMSxyPU1hdGguZmxvb3IoZSksdT0rbltyLTFdLGk9ZS1yO3JldHVybiBpP3UraSoobltyXS11KTp1fSx0YS5tZWRpYW49ZnVuY3Rpb24obix0KXt2YXIgaSxvPVtdLGE9bi5sZW5ndGgsYz0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYzxhOyl1KGk9cihuW2NdKSkmJm8ucHVzaChpKTtlbHNlIGZvcig7KytjPGE7KXUoaT1yKHQuY2FsbChuLG5bY10sYykpKSYmby5wdXNoKGkpO3JldHVybiBvLmxlbmd0aD90YS5xdWFudGlsZShvLnNvcnQoZSksLjUpOnZvaWQgMH0sdGEudmFyaWFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxpLG89bi5sZW5ndGgsYT0wLGM9MCxsPS0xLHM9MDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbDxvOyl1KGU9cihuW2xdKSkmJihpPWUtYSxhKz1pLysrcyxjKz1pKihlLWEpKTtlbHNlIGZvcig7KytsPG87KXUoZT1yKHQuY2FsbChuLG5bbF0sbCkpKSYmKGk9ZS1hLGErPWkvKytzLGMrPWkqKGUtYSkpO3JldHVybiBzPjE/Yy8ocy0xKTp2b2lkIDB9LHRhLmRldmlhdGlvbj1mdW5jdGlvbigpe3ZhciBuPXRhLnZhcmlhbmNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbj9NYXRoLnNxcnQobik6bn07dmFyIGhhPWkoZSk7dGEuYmlzZWN0TGVmdD1oYS5sZWZ0LHRhLmJpc2VjdD10YS5iaXNlY3RSaWdodD1oYS5yaWdodCx0YS5iaXNlY3Rvcj1mdW5jdGlvbihuKXtyZXR1cm4gaSgxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxyKXtyZXR1cm4gZShuKHQpLHIpfTpuKX0sdGEuc2h1ZmZsZT1mdW5jdGlvbihuLHQsZSl7KGk9YXJndW1lbnRzLmxlbmd0aCk8MyYmKGU9bi5sZW5ndGgsMj5pJiYodD0wKSk7Zm9yKHZhciByLHUsaT1lLXQ7aTspdT1NYXRoLnJhbmRvbSgpKmktLXwwLHI9bltpK3RdLG5baSt0XT1uW3UrdF0sblt1K3RdPXI7cmV0dXJuIG59LHRhLnBlcm11dGU9ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPW5bdFtlXV07cmV0dXJuIHJ9LHRhLnBhaXJzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlPTAscj1uLmxlbmd0aC0xLHU9blswXSxpPW5ldyBBcnJheSgwPnI/MDpyKTtyPmU7KWlbZV09W3Q9dSx1PW5bKytlXV07cmV0dXJuIGl9LHRhLnppcD1mdW5jdGlvbigpe2lmKCEocj1hcmd1bWVudHMubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsdD10YS5taW4oYXJndW1lbnRzLG8pLGU9bmV3IEFycmF5KHQpOysrbjx0Oylmb3IodmFyIHIsdT0tMSxpPWVbbl09bmV3IEFycmF5KHIpOysrdTxyOylpW3VdPWFyZ3VtZW50c1t1XVtuXTtyZXR1cm4gZX0sdGEudHJhbnNwb3NlPWZ1bmN0aW9uKG4pe3JldHVybiB0YS56aXAuYXBwbHkodGEsbil9LHRhLmtleXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKGUpO3JldHVybiB0fSx0YS52YWx1ZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKG5bZV0pO3JldHVybiB0fSx0YS5lbnRyaWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaCh7a2V5OmUsdmFsdWU6bltlXX0pO3JldHVybiB0fSx0YS5tZXJnZT1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHU9bi5sZW5ndGgsaT0tMSxvPTA7KytpPHU7KW8rPW5baV0ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKTstLXU+PTA7KWZvcihyPW5bdV0sdD1yLmxlbmd0aDstLXQ+PTA7KWVbLS1vXT1yW3RdO3JldHVybiBlfTt2YXIgZ2E9TWF0aC5hYnM7dGEucmFuZ2U9ZnVuY3Rpb24obix0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9MSxhcmd1bWVudHMubGVuZ3RoPDImJih0PW4sbj0wKSksKHQtbikvZT09PTEvMCl0aHJvdyBuZXcgRXJyb3IoImluZmluaXRlIHJhbmdlIik7dmFyIHIsdT1bXSxpPWEoZ2EoZSkpLG89LTE7aWYobio9aSx0Kj1pLGUqPWksMD5lKWZvcig7KHI9bitlKisrbyk+dDspdS5wdXNoKHIvaSk7ZWxzZSBmb3IoOyhyPW4rZSorK28pPHQ7KXUucHVzaChyL2kpO3JldHVybiB1fSx0YS5tYXA9ZnVuY3Rpb24obix0KXt2YXIgZT1uZXcgbDtpZihuIGluc3RhbmNlb2YgbCluLmZvckVhY2goZnVuY3Rpb24obix0KXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KG4pKXt2YXIgcix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK3U8aTspZS5zZXQodSxuW3VdKTtlbHNlIGZvcig7Kyt1PGk7KWUuc2V0KHQuY2FsbChuLHI9blt1XSx1KSxyKX1lbHNlIGZvcih2YXIgbyBpbiBuKWUuc2V0KG8sbltvXSk7cmV0dXJuIGV9O3ZhciBwYT0iX19wcm90b19fIix2YT0iXHgwMCI7YyhsLHtoYXM6aCxnZXQ6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX1tzKG4pXX0sc2V0OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIHRoaXMuX1tzKG4pXT10fSxyZW1vdmU6ZyxrZXlzOnAsdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIG49W107Zm9yKHZhciB0IGluIHRoaXMuXyluLnB1c2godGhpcy5fW3RdKTtyZXR1cm4gbn0sZW50cmllczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHtrZXk6Zih0KSx2YWx1ZTp0aGlzLl9bdF19KTtyZXR1cm4gbn0sc2l6ZTp2LGVtcHR5OmQsZm9yRWFjaDpmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gdGhpcy5fKW4uY2FsbCh0aGlzLGYodCksdGhpcy5fW3RdKX19KSx0YS5uZXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LG8sYSl7aWYoYT49aS5sZW5ndGgpcmV0dXJuIHI/ci5jYWxsKHUsbyk6ZT9vLnNvcnQoZSk6bztmb3IodmFyIGMscyxmLGgsZz0tMSxwPW8ubGVuZ3RoLHY9aVthKytdLGQ9bmV3IGw7KytnPHA7KShoPWQuZ2V0KGM9dihzPW9bZ10pKSk/aC5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gdD8ocz10KCksZj1mdW5jdGlvbihlLHIpe3Muc2V0KGUsbih0LHIsYSkpfSk6KHM9e30sZj1mdW5jdGlvbihlLHIpe3NbZV09bih0LHIsYSl9KSxkLmZvckVhY2goZiksc31mdW5jdGlvbiB0KG4sZSl7aWYoZT49aS5sZW5ndGgpcmV0dXJuIG47dmFyIHI9W10sdT1vW2UrK107cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihuLHUpe3IucHVzaCh7a2V5Om4sdmFsdWVzOnQodSxlKX0pfSksdT9yLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gdShuLmtleSx0LmtleSl9KTpyfXZhciBlLHIsdT17fSxpPVtdLG89W107cmV0dXJuIHUubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oZSx0LDApfSx1LmVudHJpZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobih0YS5tYXAsZSwwKSwwKX0sdS5rZXk9ZnVuY3Rpb24obil7cmV0dXJuIGkucHVzaChuKSx1fSx1LnNvcnRLZXlzPWZ1bmN0aW9uKG4pe3JldHVybiBvW2kubGVuZ3RoLTFdPW4sdX0sdS5zb3J0VmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBlPW4sdX0sdS5yb2xsdXA9ZnVuY3Rpb24obil7cmV0dXJuIHI9bix1fSx1fSx0YS5zZXQ9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IG07aWYobilmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTsrK2UpdC5hZGQobltlXSk7cmV0dXJuIHR9LGMobSx7aGFzOmgsYWRkOmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKz0iIildPSEwLG59LHJlbW92ZTpnLHZhbHVlczpwLHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpKX19KSx0YS5iZWhhdmlvcj17fSx0YS5yZWJpbmQ9ZnVuY3Rpb24obix0KXtmb3IodmFyIGUscj0xLHU9YXJndW1lbnRzLmxlbmd0aDsrK3I8dTspbltlPWFyZ3VtZW50c1tyXV09TShuLHQsdFtlXSk7cmV0dXJuIG59O3ZhciBkYT1bIndlYmtpdCIsIm1zIiwibW96IiwiTW96IiwibyIsIk8iXTt0YS5kaXNwYXRjaD1mdW5jdGlvbigpe2Zvcih2YXIgbj1uZXcgXyx0PS0xLGU9YXJndW1lbnRzLmxlbmd0aDsrK3Q8ZTspblthcmd1bWVudHNbdF1dPXcobik7cmV0dXJuIG59LF8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bi5pbmRleE9mKCIuIikscj0iIjtpZihlPj0wJiYocj1uLnNsaWNlKGUrMSksbj1uLnNsaWNlKDAsZSkpLG4pcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzW25dLm9uKHIpOnRoaXNbbl0ub24ocix0KTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYobnVsbD09dClmb3IobiBpbiB0aGlzKXRoaXMuaGFzT3duUHJvcGVydHkobikmJnRoaXNbbl0ub24ocixudWxsKTtyZXR1cm4gdGhpc319LHRhLmV2ZW50PW51bGwsdGEucmVxdW90ZT1mdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKG1hLCJcXCQmIil9O3ZhciBtYT0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2cseWE9e30uX19wcm90b19fP2Z1bmN0aW9uKG4sdCl7bi5fX3Byb3RvX189dH06ZnVuY3Rpb24obix0KXtmb3IodmFyIGUgaW4gdCluW2VdPXRbZV19LE1hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcihuKX0seGE9ZnVuY3Rpb24obix0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yQWxsKG4pfSxiYT1mdW5jdGlvbihuLHQpe3ZhciBlPW4ubWF0Y2hlc3x8blt4KG4sIm1hdGNoZXNTZWxlY3RvciIpXTtyZXR1cm4oYmE9ZnVuY3Rpb24obix0KXtyZXR1cm4gZS5jYWxsKG4sdCl9KShuLHQpfTsiZnVuY3Rpb24iPT10eXBlb2YgU2l6emxlJiYoTWE9ZnVuY3Rpb24obix0KXtyZXR1cm4gU2l6emxlKG4sdClbMF18fG51bGx9LHhhPVNpenpsZSxiYT1TaXp6bGUubWF0Y2hlc1NlbGVjdG9yKSx0YS5zZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2VsZWN0KHVhLmRvY3VtZW50RWxlbWVudCl9O3ZhciBfYT10YS5zZWxlY3Rpb24ucHJvdG90eXBlPVtdO19hLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpPVtdO249TihuKTtmb3IodmFyIG89LTEsYT10aGlzLmxlbmd0aDsrK288YTspe2kucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KHI9dGhpc1tvXSkucGFyZW50Tm9kZTtmb3IodmFyIGM9LTEsbD1yLmxlbmd0aDsrK2M8bDspKHU9cltjXSk/KHQucHVzaChlPW4uY2FsbCh1LHUuX19kYXRhX18sYyxvKSksZSYmIl9fZGF0YV9fImluIHUmJihlLl9fZGF0YV9fPXUuX19kYXRhX18pKTp0LnB1c2gobnVsbCl9cmV0dXJuIEEoaSl9LF9hLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9W107bj1DKG4pO2Zvcih2YXIgdT0tMSxpPXRoaXMubGVuZ3RoOysrdTxpOylmb3IodmFyIG89dGhpc1t1XSxhPS0xLGM9by5sZW5ndGg7KythPGM7KShlPW9bYV0pJiYoci5wdXNoKHQ9cmEobi5jYWxsKGUsZS5fX2RhdGFfXyxhLHUpKSksdC5wYXJlbnROb2RlPWUpO3JldHVybiBBKHIpfTt2YXIgd2E9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O3RhLm5zPXtwcmVmaXg6d2EscXVhbGlmeTpmdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIjoiKSxlPW47cmV0dXJuIHQ+PTAmJihlPW4uc2xpY2UoMCx0KSxuPW4uc2xpY2UodCsxKSksd2EuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOndhW2VdLGxvY2FsOm59Om59fSxfYS5hdHRyPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpO3JldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbi5sb2NhbD9lLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6ZS5nZXRBdHRyaWJ1dGUobil9Zm9yKHQgaW4gbil0aGlzLmVhY2goeih0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKHoobix0KSl9LF9hLmNsYXNzZWQ9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGU9dGhpcy5ub2RlKCkscj0obj1UKG4pKS5sZW5ndGgsdT0tMTtpZih0PWUuY2xhc3NMaXN0KXtmb3IoOysrdTxyOylpZighdC5jb250YWlucyhuW3VdKSlyZXR1cm4hMX1lbHNlIGZvcih0PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOysrdTxyOylpZighTChuW3VdKS50ZXN0KHQpKXJldHVybiExO3JldHVybiEwfWZvcih0IGluIG4pdGhpcy5lYWNoKFIodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChSKG4sdCkpfSxfYS5zdHlsZT1mdW5jdGlvbihuLGUscil7dmFyIHU9YXJndW1lbnRzLmxlbmd0aDtpZigzPnUpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj51JiYoZT0iIik7Zm9yKHIgaW4gbil0aGlzLmVhY2goUChyLG5bcl0sZSkpO3JldHVybiB0aGlzfWlmKDI+dSl7dmFyIGk9dGhpcy5ub2RlKCk7cmV0dXJuIHQoaSkuZ2V0Q29tcHV0ZWRTdHlsZShpLG51bGwpLmdldFByb3BlcnR5VmFsdWUobil9cj0iIn1yZXR1cm4gdGhpcy5lYWNoKFAobixlLHIpKX0sX2EucHJvcGVydHk9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gdGhpcy5ub2RlKClbbl07Zm9yKHQgaW4gbil0aGlzLmVhY2goVSh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFUobix0KSl9LF9hLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PSIifTpmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn0pOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxfYS5odG1sPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPSIifTpmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPW59KTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LF9hLmFwcGVuZD1mdW5jdGlvbihuKXtyZXR1cm4gbj1qKG4pLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LF9hLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBuPWoobiksdD1OKHQpLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxfYS5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKEYpfSxfYS5kYXRhPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByLHUsaSxvPW4ubGVuZ3RoLGY9ZS5sZW5ndGgsaD1NYXRoLm1pbihvLGYpLGc9bmV3IEFycmF5KGYpLHA9bmV3IEFycmF5KGYpLHY9bmV3IEFycmF5KG8pO2lmKHQpe3ZhciBkLG09bmV3IGwseT1uZXcgQXJyYXkobyk7Zm9yKHI9LTE7KytyPG87KW0uaGFzKGQ9dC5jYWxsKHU9bltyXSx1Ll9fZGF0YV9fLHIpKT92W3JdPXU6bS5zZXQoZCx1KSx5W3JdPWQ7Zm9yKHI9LTE7KytyPGY7KSh1PW0uZ2V0KGQ9dC5jYWxsKGUsaT1lW3JdLHIpKSk/dSE9PSEwJiYoZ1tyXT11LHUuX19kYXRhX189aSk6cFtyXT1IKGkpLG0uc2V0KGQsITApO2ZvcihyPS0xOysrcjxvOyltLmdldCh5W3JdKSE9PSEwJiYodltyXT1uW3JdKX1lbHNle2ZvcihyPS0xOysrcjxoOyl1PW5bcl0saT1lW3JdLHU/KHUuX19kYXRhX189aSxnW3JdPXUpOnBbcl09SChpKTtmb3IoO2Y+cjsrK3IpcFtyXT1IKGVbcl0pO2Zvcig7bz5yOysrcil2W3JdPW5bcl19cC51cGRhdGU9ZyxwLnBhcmVudE5vZGU9Zy5wYXJlbnROb2RlPXYucGFyZW50Tm9kZT1uLnBhcmVudE5vZGUsYS5wdXNoKHApLGMucHVzaChnKSxzLnB1c2godil9dmFyIHIsdSxpPS0xLG89dGhpcy5sZW5ndGg7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihuPW5ldyBBcnJheShvPShyPXRoaXNbMF0pLmxlbmd0aCk7KytpPG87KSh1PXJbaV0pJiYobltpXT11Ll9fZGF0YV9fKTtyZXR1cm4gbn12YXIgYT1aKFtdKSxjPUEoW10pLHM9QShbXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pZm9yKDsrK2k8bzspZShyPXRoaXNbaV0sbi5jYWxsKHIsci5wYXJlbnROb2RlLl9fZGF0YV9fLGkpKTtlbHNlIGZvcig7KytpPG87KWUocj10aGlzW2ldLG4pO3JldHVybiBjLmVudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LGMuZXhpdD1mdW5jdGlvbigpe3JldHVybiBzfSxjfSxfYS5kYXR1bT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsbik6dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKX0sX2EuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1PKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KGU9dGhpc1tpXSkucGFyZW50Tm9kZTtmb3IodmFyIGE9MCxjPWUubGVuZ3RoO2M+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSxpKSYmdC5wdXNoKHIpfXJldHVybiBBKHUpfSxfYS5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgbj0tMSx0PXRoaXMubGVuZ3RoOysrbjx0Oylmb3IodmFyIGUscj10aGlzW25dLHU9ci5sZW5ndGgtMSxpPXJbdV07LS11Pj0wOykoZT1yW3VdKSYmKGkmJmkhPT1lLm5leHRTaWJsaW5nJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsaSksaT1lKTtyZXR1cm4gdGhpc30sX2Euc29ydD1mdW5jdGlvbihuKXtuPUkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2Zvcih2YXIgdD0tMSxlPXRoaXMubGVuZ3RoOysrdDxlOyl0aGlzW3RdLnNvcnQobik7cmV0dXJuIHRoaXMub3JkZXIoKX0sX2EuZWFjaD1mdW5jdGlvbihuKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKHQsZSxyKXtuLmNhbGwodCx0Ll9fZGF0YV9fLGUscil9KX0sX2EuY2FsbD1mdW5jdGlvbihuKXt2YXIgdD1yYShhcmd1bWVudHMpO3JldHVybiBuLmFwcGx5KHRbMF09dGhpcyx0KSx0aGlzfSxfYS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLm5vZGUoKX0sX2Eubm9kZT1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLHQ9dGhpcy5sZW5ndGg7dD5uO24rKylmb3IodmFyIGU9dGhpc1tuXSxyPTAsdT1lLmxlbmd0aDt1PnI7cisrKXt2YXIgaT1lW3JdO2lmKGkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LF9hLnNpemU9ZnVuY3Rpb24oKXt2YXIgbj0wO3JldHVybiBZKHRoaXMsZnVuY3Rpb24oKXsrK259KSxufTt2YXIgU2E9W107dGEuc2VsZWN0aW9uLmVudGVyPVosdGEuc2VsZWN0aW9uLmVudGVyLnByb3RvdHlwZT1TYSxTYS5hcHBlbmQ9X2EuYXBwZW5kLFNhLmVtcHR5PV9hLmVtcHR5LFNhLm5vZGU9X2Eubm9kZSxTYS5jYWxsPV9hLmNhbGwsU2Euc2l6ZT1fYS5zaXplLFNhLnNlbGVjdD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvPVtdLGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe3I9KHU9dGhpc1thXSkudXBkYXRlLG8ucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9dS5wYXJlbnROb2RlO2Zvcih2YXIgbD0tMSxzPXUubGVuZ3RoOysrbDxzOykoaT11W2xdKT8odC5wdXNoKHJbbF09ZT1uLmNhbGwodS5wYXJlbnROb2RlLGkuX19kYXRhX18sbCxhKSksZS5fX2RhdGFfXz1pLl9fZGF0YV9fKTp0LnB1c2gobnVsbCl9cmV0dXJuIEEobyl9LFNhLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PVYodGhpcykpLF9hLmluc2VydC5jYWxsKHRoaXMsbix0KX0sdGEuc2VsZWN0PWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8oZT1bTWEodCx1YSldLGUucGFyZW50Tm9kZT11YS5kb2N1bWVudEVsZW1lbnQpOihlPVt0XSxlLnBhcmVudE5vZGU9bih0KSksQShbZV0pfSx0YS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQ7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuPyh0PXJhKHhhKG4sdWEpKSx0LnBhcmVudE5vZGU9dWEuZG9jdW1lbnRFbGVtZW50KToodD1uLHQucGFyZW50Tm9kZT1udWxsKSxBKFt0XSl9LF9hLm9uPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO2lmKDM+cil7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnImJih0PSExKTtmb3IoZSBpbiBuKXRoaXMuZWFjaChYKGUsbltlXSx0KSk7cmV0dXJuIHRoaXN9aWYoMj5yKXJldHVybihyPXRoaXMubm9kZSgpWyJfX29uIituXSkmJnIuXztlPSExfXJldHVybiB0aGlzLmVhY2goWChuLHQsZSkpfTt2YXIga2E9dGEubWFwKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pO3VhJiZrYS5mb3JFYWNoKGZ1bmN0aW9uKG4peyJvbiIrbiBpbiB1YSYma2EucmVtb3ZlKG4pfSk7dmFyIEVhLEFhPTA7dGEubW91c2U9ZnVuY3Rpb24obil7cmV0dXJuIEoobixrKCkpfTt2YXIgTmE9dGhpcy5uYXZpZ2F0b3ImJi9XZWJLaXQvLnRlc3QodGhpcy5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO3RhLnRvdWNoPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPXQsdD1rKCkuY2hhbmdlZFRvdWNoZXMpLHQpZm9yKHZhciByLHU9MCxpPXQubGVuZ3RoO2k+dTsrK3UpaWYoKHI9dFt1XSkuaWRlbnRpZmllcj09PWUpcmV0dXJuIEoobixyKX0sdGEuYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsaSkub24oInRvdWNoc3RhcnQuZHJhZyIsbyl9ZnVuY3Rpb24gZShuLHQsZSxpLG8pe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt2YXIgbixlLHI9dChoLHYpO3ImJihuPXJbMF0tTVswXSxlPXJbMV0tTVsxXSxwfD1ufGUsTT1yLGcoe3R5cGU6ImRyYWciLHg6clswXStsWzBdLHk6clsxXStsWzFdLGR4Om4sZHk6ZX0pKX1mdW5jdGlvbiBjKCl7dChoLHYpJiYobS5vbihpK2QsbnVsbCkub24obytkLG51bGwpLHkocCYmdGEuZXZlbnQudGFyZ2V0PT09ZiksZyh7dHlwZToiZHJhZ2VuZCJ9KSl9dmFyIGwscz10aGlzLGY9dGEuZXZlbnQudGFyZ2V0LGg9cy5wYXJlbnROb2RlLGc9ci5vZihzLGFyZ3VtZW50cykscD0wLHY9bigpLGQ9Ii5kcmFnIisobnVsbD09dj8iIjoiLSIrdiksbT10YS5zZWxlY3QoZShmKSkub24oaStkLGEpLm9uKG8rZCxjKSx5PVcoZiksTT10KGgsdik7dT8obD11LmFwcGx5KHMsYXJndW1lbnRzKSxsPVtsLngtTVswXSxsLnktTVsxXV0pOmw9WzAsMF0sZyh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgcj1FKG4sImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiksdT1udWxsLGk9ZShiLHRhLm1vdXNlLHQsIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxvPWUoRyx0YS50b3VjaCx5LCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LHRhLnJlYmluZChuLHIsIm9uIil9LHRhLnRvdWNoZXM9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1rKCkudG91Y2hlcyksdD9yYSh0KS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9SihuLHQpO3JldHVybiBlLmlkZW50aWZpZXI9dC5pZGVudGlmaWVyLGV9KTpbXX07dmFyIENhPTFlLTYsemE9Q2EqQ2EscWE9TWF0aC5QSSxMYT0yKnFhLFRhPUxhLUNhLFJhPXFhLzIsRGE9cWEvMTgwLFBhPTE4MC9xYSxVYT1NYXRoLlNRUlQyLGphPTIsRmE9NDt0YS5pbnRlcnBvbGF0ZVpvb209ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4pe3ZhciB0PW4qeTtpZihtKXt2YXIgZT1ydCh2KSxvPWkvKGphKmgpKihlKnV0KFVhKnQrdiktZXQodikpO3JldHVybltyK28qbCx1K28qcyxpKmUvcnQoVWEqdCt2KV19cmV0dXJuW3IrbipsLHUrbipzLGkqTWF0aC5leHAoVWEqdCldfXZhciByPW5bMF0sdT1uWzFdLGk9blsyXSxvPXRbMF0sYT10WzFdLGM9dFsyXSxsPW8tcixzPWEtdSxmPWwqbCtzKnMsaD1NYXRoLnNxcnQoZiksZz0oYypjLWkqaStGYSpmKS8oMippKmphKmgpLHA9KGMqYy1pKmktRmEqZikvKDIqYypqYSpoKSx2PU1hdGgubG9nKE1hdGguc3FydChnKmcrMSktZyksZD1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLG09ZC12LHk9KG18fE1hdGgubG9nKGMvaSkpL1VhO3JldHVybiBlLmR1cmF0aW9uPTFlMyp5LGV9LHRhLmJlaGF2aW9yLnpvb209ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24ub24ocSxmKS5vbihPYSsiLnpvb20iLGcpLm9uKCJkYmxjbGljay56b29tIixwKS5vbihSLGgpfWZ1bmN0aW9uIGUobil7cmV0dXJuWyhuWzBdLWsueCkvay5rLChuWzFdLWsueSkvay5rXX1mdW5jdGlvbiByKG4pe3JldHVybltuWzBdKmsuaytrLngsblsxXSprLmsray55XX1mdW5jdGlvbiB1KG4pe2suaz1NYXRoLm1heChOWzBdLE1hdGgubWluKE5bMV0sbikpfWZ1bmN0aW9uIGkobix0KXt0PXIodCksay54Kz1uWzBdLXRbMF0say55Kz1uWzFdLXRbMV19ZnVuY3Rpb24gbyh0LGUscixvKXt0Ll9fY2hhcnRfXz17eDprLngseTprLnksazprLmt9LHUoTWF0aC5wb3coMixvKSksaShkPWUsciksdD10YS5zZWxlY3QodCksQz4wJiYodD10LnRyYW5zaXRpb24oKS5kdXJhdGlvbihDKSksdC5jYWxsKG4uZXZlbnQpfWZ1bmN0aW9uIGEoKXtiJiZiLmRvbWFpbih4LnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueCkvay5rfSkubWFwKHguaW52ZXJ0KSksdyYmdy5kb21haW4oXy5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1rLnkpL2sua30pLm1hcChfLmludmVydCkpfWZ1bmN0aW9uIGMobil7eisrfHxuKHt0eXBlOiJ6b29tc3RhcnQifSl9ZnVuY3Rpb24gbChuKXthKCksbih7dHlwZToiem9vbSIsc2NhbGU6ay5rLHRyYW5zbGF0ZTpbay54LGsueV19KX1mdW5jdGlvbiBzKG4pey0tenx8bih7dHlwZToiem9vbWVuZCJ9KSxkPW51bGx9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXtmPTEsaSh0YS5tb3VzZSh1KSxnKSxsKGEpfWZ1bmN0aW9uIHIoKXtoLm9uKEwsbnVsbCkub24oVCxudWxsKSxwKGYmJnRhLmV2ZW50LnRhcmdldD09PW8pLHMoYSl9dmFyIHU9dGhpcyxvPXRhLmV2ZW50LnRhcmdldCxhPUQub2YodSxhcmd1bWVudHMpLGY9MCxoPXRhLnNlbGVjdCh0KHUpKS5vbihMLG4pLm9uKFQsciksZz1lKHRhLm1vdXNlKHUpKSxwPVcodSk7RGwuY2FsbCh1KSxjKGEpfWZ1bmN0aW9uIGgoKXtmdW5jdGlvbiBuKCl7dmFyIG49dGEudG91Y2hlcyhwKTtyZXR1cm4gZz1rLmssbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaWRlbnRpZmllciBpbiBkJiYoZFtuLmlkZW50aWZpZXJdPWUobikpfSksbn1mdW5jdGlvbiB0KCl7dmFyIHQ9dGEuZXZlbnQudGFyZ2V0O3RhLnNlbGVjdCh0KS5vbih4LHIpLm9uKGIsYSksXy5wdXNoKHQpO2Zvcih2YXIgZT10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyx1PTAsaT1lLmxlbmd0aDtpPnU7Kyt1KWRbZVt1XS5pZGVudGlmaWVyXT1udWxsO3ZhciBjPW4oKSxsPURhdGUubm93KCk7aWYoMT09PWMubGVuZ3RoKXtpZig1MDA+bC1NKXt2YXIgcz1jWzBdO28ocCxzLGRbcy5pZGVudGlmaWVyXSxNYXRoLmZsb29yKE1hdGgubG9nKGsuaykvTWF0aC5MTjIpKzEpLFMoKX1NPWx9ZWxzZSBpZihjLmxlbmd0aD4xKXt2YXIgcz1jWzBdLGY9Y1sxXSxoPXNbMF0tZlswXSxnPXNbMV0tZlsxXTttPWgqaCtnKmd9fWZ1bmN0aW9uIHIoKXt2YXIgbix0LGUscixvPXRhLnRvdWNoZXMocCk7RGwuY2FsbChwKTtmb3IodmFyIGE9MCxjPW8ubGVuZ3RoO2M+YTsrK2Escj1udWxsKWlmKGU9b1thXSxyPWRbZS5pZGVudGlmaWVyXSl7aWYodClicmVhaztuPWUsdD1yfWlmKHIpe3ZhciBzPShzPWVbMF0tblswXSkqcysocz1lWzFdLW5bMV0pKnMsZj1tJiZNYXRoLnNxcnQocy9tKTtuPVsoblswXStlWzBdKS8yLChuWzFdK2VbMV0pLzJdLHQ9Wyh0WzBdK3JbMF0pLzIsKHRbMV0rclsxXSkvMl0sdShmKmcpfU09bnVsbCxpKG4sdCksbCh2KX1mdW5jdGlvbiBhKCl7aWYodGEuZXZlbnQudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgdD10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyxlPTAscj10Lmxlbmd0aDtyPmU7KytlKWRlbGV0ZSBkW3RbZV0uaWRlbnRpZmllcl07Zm9yKHZhciB1IGluIGQpcmV0dXJuIHZvaWQgbigpfXRhLnNlbGVjdEFsbChfKS5vbih5LG51bGwpLHcub24ocSxmKS5vbihSLGgpLEUoKSxzKHYpfXZhciBnLHA9dGhpcyx2PUQub2YocCxhcmd1bWVudHMpLGQ9e30sbT0wLHk9Ii56b29tLSIrdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcix4PSJ0b3VjaG1vdmUiK3ksYj0idG91Y2hlbmQiK3ksXz1bXSx3PXRhLnNlbGVjdChwKSxFPVcocCk7dCgpLGModiksdy5vbihxLG51bGwpLm9uKFIsdCl9ZnVuY3Rpb24gZygpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpO3k/Y2xlYXJUaW1lb3V0KHkpOih2PWUoZD1tfHx0YS5tb3VzZSh0aGlzKSksRGwuY2FsbCh0aGlzKSxjKG4pKSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGwscyhuKX0sNTApLFMoKSx1KE1hdGgucG93KDIsLjAwMipIYSgpKSprLmspLGkoZCx2KSxsKG4pfWZ1bmN0aW9uIHAoKXt2YXIgbj10YS5tb3VzZSh0aGlzKSx0PU1hdGgubG9nKGsuaykvTWF0aC5MTjI7byh0aGlzLG4sZShuKSx0YS5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwodCktMTpNYXRoLmZsb29yKHQpKzEpfXZhciB2LGQsbSx5LE0seCxiLF8sdyxrPXt4OjAseTowLGs6MX0sQT1bOTYwLDUwMF0sTj1JYSxDPTI1MCx6PTAscT0ibW91c2Vkb3duLnpvb20iLEw9Im1vdXNlbW92ZS56b29tIixUPSJtb3VzZXVwLnpvb20iLFI9InRvdWNoc3RhcnQuem9vbSIsRD1FKG4sInpvb21zdGFydCIsInpvb20iLCJ6b29tZW5kIik7cmV0dXJuIE9hfHwoT2E9Im9ud2hlZWwiaW4gdWE/KEhhPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRlbHRhWSoodGEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiB1YT8oSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooSGE9ZnVuY3Rpb24oKXtyZXR1cm4tdGEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpKSxuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpLHQ9aztUbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxjKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1BWzBdLHI9QVsxXSx1PWQ/ZFswXTplLzIsaT1kP2RbMV06ci8yLG89dGEuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPW8odCksYT1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qYSx5OmktclsxXSphLGs6YX0sbChuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtzKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGMobiksbChuKSxzKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxhKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOit0fSxhKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPW51bGw9PXQ/SWE6Wyt0WzBdLCt0WzFdXSxuKTpOfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10JiZbK3RbMF0sK3RbMV1dLG4pOm19LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT10JiZbK3RbMF0sK3RbMV1dLG4pOkF9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9K3Qsbik6Q30sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQseD10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6Yn0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6d30sdGEucmViaW5kKG4sRCwib24iKX07dmFyIEhhLE9hLElhPVswLDEvMF07dGEuY29sb3I9b3Qsb3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LHRhLmhzbD1hdDt2YXIgWWE9YXQucHJvdG90eXBlPW5ldyBvdDtZYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGF0KHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxZYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBhdCh0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sWWEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGN0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sdGEuaGNsPWx0O3ZhciBaYT1sdC5wcm90b3R5cGU9bmV3IG90O1phLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK1ZhKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sWmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1WYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LFphLnJnYj1mdW5jdGlvbigpe3JldHVybiBzdCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LHRhLmxhYj1mdDt2YXIgVmE9MTgsWGE9Ljk1MDQ3LCRhPTEsQmE9MS4wODg4MyxXYT1mdC5wcm90b3R5cGU9bmV3IG90O1dhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5taW4oMTAwLHRoaXMubCtWYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sV2EuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5tYXgoMCx0aGlzLmwtVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFdhLnJnYj1mdW5jdGlvbigpe3JldHVybiBodCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LHRhLnJnYj1tdDt2YXIgSmE9bXQucHJvdG90eXBlPW5ldyBvdDtKYS5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IG10KE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IG10KHUsdSx1KX0sSmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgbXQobip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxKYS5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gX3QodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxKYS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIit4dCh0aGlzLnIpK3h0KHRoaXMuZykreHQodGhpcy5iKX07dmFyIEdhPXRhLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7R2EuZm9yRWFjaChmdW5jdGlvbihuLHQpe0dhLnNldChuLHl0KHQpKX0pLHRhLmZ1bmN0b3I9RXQsdGEueGhyPUF0KHkpLHRhLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBvPU50KG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LG99ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4obil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gYS50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIGE9bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGM9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihzPj1sKXJldHVybiBvO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1zO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8bDspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfXM9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytzKToxMD09PXImJih1PSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtsPnM7KXt2YXIgcj1uLmNoYXJDb2RlQXQocysrKSxhPTE7aWYoMTA9PT1yKXU9ITA7ZWxzZSBpZigxMz09PXIpdT0hMCwxMD09PW4uY2hhckNvZGVBdChzKSYmKCsrcywrK2EpO2Vsc2UgaWYociE9PWMpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxzLWEpfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcix1LGk9e30sbz17fSxhPVtdLGw9bi5sZW5ndGgscz0wLGY9MDsocj1lKCkpIT09bzspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PW87KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgsZisrKSl8fGEucHVzaChoKX1yZXR1cm4gYX0sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyBtLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChvKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LHRhLmNzdj10YS5kc3YoIiwiLCJ0ZXh0L2NzdiIpLHRhLnRzdj10YS5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIEthLFFhLG5jLHRjLGVjLHJjPXRoaXNbeCh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O3RhLnRpbWVyPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxmOiExLG46bnVsbH07UWE/UWEubj1pOkthPWksUWE9aSxuY3x8KHRjPWNsZWFyVGltZW91dCh0YyksbmM9MSxyYyhxdCkpfSx0YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe0x0KCksVHQoKX0sdGEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciB1Yz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoRHQpO3RhLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuIG4mJigwPm4mJihuKj0tMSksdCYmKG49dGEucm91bmQobixSdChuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksdWNbOCtlLzNdfTt2YXIgaWM9Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLG9jPXRhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49dGEucm91bmQobixSdChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFJ0KG4qKDErMWUtMTUpLHQpKSkpfX0pLGFjPXRhLnRpbWU9e30sY2M9RGF0ZTtqdC5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe2xjLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe2xjLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe2xjLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe2xjLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgbGM9RGF0ZS5wcm90b3R5cGU7YWMueWVhcj1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1hYy5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxhYy55ZWFycz1hYy55ZWFyLnJhbmdlLGFjLnllYXJzLnV0Yz1hYy55ZWFyLnV0Yy5yYW5nZSxhYy5kYXk9RnQoZnVuY3Rpb24obil7dmFyIHQ9bmV3IGNjKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxhYy5kYXlzPWFjLmRheS5yYW5nZSxhYy5kYXlzLnV0Yz1hYy5kYXkudXRjLnJhbmdlLGFjLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1hYy55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWFjW25dPUZ0KGZ1bmN0aW9uKG4pe3JldHVybihuPWFjLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1hYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChhYy5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2FjW24rInMiXT1lLnJhbmdlLGFjW24rInMiXS51dGM9ZS51dGMucmFuZ2UsYWNbbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9YWMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoYWMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGFjLndlZWs9YWMuc3VuZGF5LGFjLndlZWtzPWFjLnN1bmRheS5yYW5nZSxhYy53ZWVrcy51dGM9YWMuc3VuZGF5LnV0Yy5yYW5nZSxhYy53ZWVrT2ZZZWFyPWFjLnN1bmRheU9mWWVhcjt2YXIgc2M9eyItIjoiIixfOiIgIiwwOiIwIn0sZmM9L15ccypcZCsvLGhjPS9eJS87dGEubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6UHQobiksdGltZUZvcm1hdDpPdChuKX19O3ZhciBnYz10YS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3RhLmZvcm1hdD1nYy5udW1iZXJGb3JtYXQsdGEuZ2VvPXt9LGNlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7bGUobix0aGlzLnQscGMpLGxlKHBjLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXBjLnQ6dGhpcy5zPXBjLnQNCn0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIHBjPW5ldyBjZTt0YS5nZW8uc3RyZWFtPWZ1bmN0aW9uKG4sdCl7biYmdmMuaGFzT3duUHJvcGVydHkobi50eXBlKT92Y1tuLnR5cGVdKG4sdCk6c2Uobix0KX07dmFyIHZjPXtGZWF0dXJlOmZ1bmN0aW9uKG4sdCl7c2Uobi5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5mZWF0dXJlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0uZ2VvbWV0cnksdCl9fSxkYz17U3BoZXJlOmZ1bmN0aW9uKG4sdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24obix0KXtuPW4uY29vcmRpbmF0ZXMsdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KW49ZVtyXSx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe2ZlKG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylmZShlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtoZShuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWhlKGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLHQpfX07dGEuZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIG1jPTAsdGEuZ2VvLnN0cmVhbShuLE1jKSxtY307dmFyIG1jLHljPW5ldyBjZSxNYz17c3BoZXJlOmZ1bmN0aW9uKCl7bWMrPTQqcWF9LHBvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3ljLnJlc2V0KCksTWMubGluZVN0YXJ0PWdlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49Mip5YzttYys9MD5uPzQqcWErbjpuLE1jLmxpbmVTdGFydD1NYy5saW5lRW5kPU1jLnBvaW50PWJ9fTt0YS5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe00ucHVzaCh4PVtzPW4saD1uXSksZj50JiYoZj10KSx0PmcmJihnPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1wZShbdCpEYSxlKkRhXSk7aWYobSl7dmFyIHU9ZGUobSxyKSxpPVt1WzFdLC11WzBdLDBdLG89ZGUoaSx1KTtNZShvKSxvPXhlKG8pO3ZhciBjPXQtcCxsPWM+MD8xOi0xLHY9b1swXSpQYSpsLGQ9Z2EoYyk+MTgwO2lmKGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PW9bMV0qUGE7eT5nJiYoZz15KX1lbHNlIGlmKHY9KHYrMzYwKSUzNjAtMTgwLGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PS1vWzFdKlBhO2Y+eSYmKGY9eSl9ZWxzZSBmPmUmJihmPWUpLGU+ZyYmKGc9ZSk7ZD9wPnQ/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCk6aD49cz8ocz50JiYocz10KSx0PmgmJihoPXQpKTp0PnA/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCl9ZWxzZSBuKHQsZSk7bT1yLHA9dH1mdW5jdGlvbiBlKCl7Yi5wb2ludD10fWZ1bmN0aW9uIHIoKXt4WzBdPXMseFsxXT1oLGIucG9pbnQ9bixtPW51bGx9ZnVuY3Rpb24gdShuLGUpe2lmKG0pe3ZhciByPW4tcDt5Kz1nYShyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2Ugdj1uLGQ9ZTtNYy5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiBpKCl7TWMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe3UodixkKSxNYy5saW5lRW5kKCksZ2EoeSk+Q2EmJihzPS0oaD0xODApKSx4WzBdPXMseFsxXT1oLG09bnVsbH1mdW5jdGlvbiBhKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgcyxmLGgsZyxwLHYsZCxtLHksTSx4LGI9e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9dSxiLmxpbmVTdGFydD1pLGIubGluZUVuZD1vLHk9MCxNYy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe01jLnBvbHlnb25FbmQoKSxiLnBvaW50PW4sYi5saW5lU3RhcnQ9ZSxiLmxpbmVFbmQ9ciwwPnljPyhzPS0oaD0xODApLGY9LShnPTkwKSk6eT5DYT9nPTkwOi1DYT55JiYoZj0tOTApLHhbMF09cyx4WzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7Zz1oPS0ocz1mPTEvMCksTT1bXSx0YS5nZW8uc3RyZWFtKG4sYik7dmFyIHQ9TS5sZW5ndGg7aWYodCl7TS5zb3J0KGMpO2Zvcih2YXIgZSxyPTEsdT1NWzBdLGk9W3VdO3Q+cjsrK3IpZT1NW3JdLGwoZVswXSx1KXx8bChlWzFdLHUpPyhhKHVbMF0sZVsxXSk+YSh1WzBdLHVbMV0pJiYodVsxXT1lWzFdKSxhKGVbMF0sdVsxXSk+YSh1WzBdLHVbMV0pJiYodVswXT1lWzBdKSk6aS5wdXNoKHU9ZSk7Zm9yKHZhciBvLGUscD0tMS8wLHQ9aS5sZW5ndGgtMSxyPTAsdT1pW3RdO3Q+PXI7dT1lLCsrcillPWlbcl0sKG89YSh1WzFdLGVbMF0pKT5wJiYocD1vLHM9ZVswXSxoPXVbMV0pfXJldHVybiBNPXg9bnVsbCwxLzA9PT1zfHwxLzA9PT1mP1tbMC8wLDAvMF0sWzAvMCwwLzBdXTpbW3MsZl0sW2gsZ11dfX0oKSx0YS5nZW8uY2VudHJvaWQ9ZnVuY3Rpb24obil7eGM9YmM9X2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4scWMpO3ZhciB0PU5jLGU9Q2Mscj16Yyx1PXQqdCtlKmUrcipyO3JldHVybiB6YT51JiYodD1rYyxlPUVjLHI9QWMsQ2E+YmMmJih0PV9jLGU9d2Mscj1TYyksdT10KnQrZSplK3Iqcix6YT51KT9bMC8wLDAvMF06W01hdGguYXRhbjIoZSx0KSpQYSx0dChyL01hdGguc3FydCh1KSkqUGFdfTt2YXIgeGMsYmMsX2Msd2MsU2Msa2MsRWMsQWMsTmMsQ2MsemMscWM9e3NwaGVyZTpiLHBvaW50Ol9lLGxpbmVTdGFydDpTZSxsaW5lRW5kOmtlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1FZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1TZX19LExjPUxlKE5lLFBlLGplLFstcWEsLXFhLzJdKSxUYz0xZTk7dGEuZ2VvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgbix0LGUscix1LGksbz17c3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiB1JiYodS52YWxpZD0hMSksdT1pKG4pLHUudmFsaWQ9ITAsdX0sZXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUllKG49K2FbMF1bMF0sdD0rYVswXVsxXSxlPSthWzFdWzBdLHI9K2FbMV1bMV0pLHUmJih1LnZhbGlkPSExLHU9bnVsbCksbyk6W1tuLHRdLFtlLHJdXX19O3JldHVybiBvLmV4dGVudChbWzAsMF0sWzk2MCw1MDBdXSl9LCh0YS5nZW8uY29uaWNFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWWUoWmUpfSkucmF3PVplLHRhLmdlby5hbGJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCl9LHRhLmdlby5hbGJlcnNVc2E9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3ZhciBpPW5bMF0sbz1uWzFdO3JldHVybiB0PW51bGwsZShpLG8pLHR8fChyKGksbyksdCl8fHUoaSxvKSx0fXZhciB0LGUscix1LGk9dGEuZ2VvLmFsYmVycygpLG89dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxhPXRhLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbihuLGUpe3Q9W24sZV19fTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIHQ9aS5zY2FsZSgpLGU9aS50cmFuc2xhdGUoKSxyPShuWzBdLWVbMF0pL3QsdT0oblsxXS1lWzFdKS90O3JldHVybih1Pj0uMTImJi4yMzQ+dSYmcj49LS40MjUmJi0uMjE0PnI/bzp1Pj0uMTY2JiYuMjM0PnUmJnI+PS0uMjE0JiYtLjExNT5yP2E6aSkuaW52ZXJ0KG4pfSxuLnN0cmVhbT1mdW5jdGlvbihuKXt2YXIgdD1pLnN0cmVhbShuKSxlPW8uc3RyZWFtKG4pLHI9YS5zdHJlYW0obik7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sdSl7dC5wb2ludChuLHUpLGUucG9pbnQobix1KSxyLnBvaW50KG4sdSl9LHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCksZS5zcGhlcmUoKSxyLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGUubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGUubGluZUVuZCgpLHIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLGUucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLGUucG9seWdvbkVuZCgpLHIucG9seWdvbkVuZCgpfX19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnByZWNpc2lvbih0KSxvLnByZWNpc2lvbih0KSxhLnByZWNpc2lvbih0KSxuKTppLnByZWNpc2lvbigpfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnNjYWxlKHQpLG8uc2NhbGUoLjM1KnQpLGEuc2NhbGUodCksbi50cmFuc2xhdGUoaS50cmFuc2xhdGUoKSkpOmkuc2NhbGUoKX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGkudHJhbnNsYXRlKCk7dmFyIGw9aS5zY2FsZSgpLHM9K3RbMF0sZj0rdFsxXTtyZXR1cm4gZT1pLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbcy0uNDU1KmwsZi0uMjM4KmxdLFtzKy40NTUqbCxmKy4yMzgqbF1dKS5zdHJlYW0oYykucG9pbnQscj1vLnRyYW5zbGF0ZShbcy0uMzA3KmwsZisuMjAxKmxdKS5jbGlwRXh0ZW50KFtbcy0uNDI1KmwrQ2EsZisuMTIqbCtDYV0sW3MtLjIxNCpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCx1PWEudHJhbnNsYXRlKFtzLS4yMDUqbCxmKy4yMTIqbF0pLmNsaXBFeHRlbnQoW1tzLS4yMTQqbCtDYSxmKy4xNjYqbCtDYV0sW3MtLjExNSpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCxufSxuLnNjYWxlKDEwNzApfTt2YXIgUmMsRGMsUGMsVWMsamMsRmMsSGM9e3BvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0RjPTAsSGMubGluZVN0YXJ0PVZlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7SGMubGluZVN0YXJ0PUhjLmxpbmVFbmQ9SGMucG9pbnQ9YixSYys9Z2EoRGMvMil9fSxPYz17cG9pbnQ6WGUsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpiLHBvbHlnb25FbmQ6Yn0sSWM9e3BvaW50OldlLGxpbmVTdGFydDpKZSxsaW5lRW5kOkdlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0ljLmxpbmVTdGFydD1LZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0ljLnBvaW50PVdlLEljLmxpbmVTdGFydD1KZSxJYy5saW5lRW5kPUdlfX07dGEuZ2VvLnBhdGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGEmJmkucG9pbnRSYWRpdXMoK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxvJiZvLnZhbGlkfHwobz11KGkpKSx0YS5nZW8uc3RyZWFtKG4sbykpLGkucmVzdWx0KCl9ZnVuY3Rpb24gdCgpe3JldHVybiBvPW51bGwsbn12YXIgZSxyLHUsaSxvLGE9NC41O3JldHVybiBuLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFJjPTAsdGEuZ2VvLnN0cmVhbShuLHUoSGMpKSxSY30sbi5jZW50cm9pZD1mdW5jdGlvbihuKXtyZXR1cm4gX2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4sdShJYykpLHpjP1tOYy96YyxDYy96Y106QWM/W2tjL0FjLEVjL0FjXTpTYz9bX2MvU2Msd2MvU2NdOlswLzAsMC8wXX0sbi5ib3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIGpjPUZjPS0oUGM9VWM9MS8wKSx0YS5nZW8uc3RyZWFtKG4sdShPYykpLFtbUGMsVWNdLFtqYyxGY11dfSxuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9KGU9bik/bi5zdHJlYW18fHRyKG4pOnksdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3ICRlOm5ldyBRZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cyhhKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOmF9LG4ucHJvamVjdGlvbih0YS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LHRhLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgZXIodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LGVyLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sdGEuZ2VvLnByb2plY3Rpb249dXIsdGEuZ2VvLnByb2plY3Rpb25NdXRhdG9yPWlyLCh0YS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKGFyKX0pLnJhdz1hci5pbnZlcnQ9YXIsdGEuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKkRhLHRbMV0qRGEpLHRbMF0qPVBhLHRbMV0qPVBhLHR9cmV0dXJuIG49bHIoblswXSUzNjAqRGEsblsxXSpEYSxuLmxlbmd0aD4yP25bMl0qRGE6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpEYSx0WzFdKkRhKSx0WzBdKj1QYSx0WzFdKj1QYSx0fSx0fSxjci5pbnZlcnQ9YXIsdGEuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9bHIoLW5bMF0qRGEsLW5bMV0qRGEsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1QYSxuWzFdKj1QYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IoKHQ9K3IpKkRhLHUqRGEpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWdyKHQqRGEsKHU9K3IpKkRhKSxuKTp1fSxuLmFuZ2xlKDkwKX0sdGEuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpEYSx1PW5bMV0qRGEsaT10WzFdKkRhLG89TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHUpLGw9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKm8pKmUrKGU9bCpzLWMqZiphKSplKSxjKnMrbCpmKmEpfSx0YS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwobC9tKSptLGMsbSkubWFwKGcpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gZ2EobiVkKT5DYX0pLm1hcChzKSkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsbyx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIGdhKG4lbSk+Q2F9KS5tYXAoZikpfXZhciBlLHIsdSxpLG8sYSxjLGwscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhjKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGwpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxsPSt0WzBdWzFdLGM9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGw+YyYmKHQ9bCxsPWMsYz10KSxuLnByZWNpc2lvbih5KSk6W1tpLGxdLFt1LGNdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLGE9K3RbMF1bMV0sbz0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksYT5vJiYodD1hLGE9byxvPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3IsYV0sW2Usb11dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9dnIoYSxvLDkwKSxmPWRyKHIsZSx5KSxoPXZyKGwsYyw5MCksZz1kcihpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK0NhXSxbMTgwLDkwLUNhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtQ2FdLFsxODAsODArQ2FdXSl9LHRhLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPW1yLHU9eXI7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSx0YS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXIoblswXSpEYSxuWzFdKkRhLHRbMF0qRGEsdFsxXSpEYSl9LHRhLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIFljPTAsdGEuZ2VvLnN0cmVhbShuLFpjKSxZY307dmFyIFljLFpjPXtzcGhlcmU6Yixwb2ludDpiLGxpbmVTdGFydDp4cixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxWYz1icihmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyh0YS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFZjKX0pLnJhdz1WYzt2YXIgWGM9YnIoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSx5KTsodGEuZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFhjKX0pLnJhdz1YYywodGEuZ2VvLmNvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIFllKF9yKX0pLnJhdz1fciwodGEuZ2VvLmNvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gWWUod3IpfSkucmF3PXdyO3ZhciAkYz1icihmdW5jdGlvbihuKXtyZXR1cm4gMS9ufSxNYXRoLmF0YW4pOyh0YS5nZW8uZ25vbW9uaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoJGMpfSkucmF3PSRjLFNyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVybltuLDIqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS1SYV19LCh0YS5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4ga3IoU3IpfSkucmF3PVNyO3ZhciBCYz1icihmdW5jdGlvbigpe3JldHVybiAxfSxNYXRoLmFzaW4pOyh0YS5nZW8ub3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKEJjKX0pLnJhdz1CYzt2YXIgV2M9YnIoZnVuY3Rpb24obil7cmV0dXJuIDEvKDErbil9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXRhbihuKX0pOyh0YS5nZW8uc3RlcmVvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihXYyl9KS5yYXc9V2MsRXIuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuWy10LDIqTWF0aC5hdGFuKE1hdGguZXhwKG4pKS1SYV19LCh0YS5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yPWZ1bmN0aW9uKCl7dmFyIG49a3IoRXIpLHQ9bi5jZW50ZXIsZT1uLnJvdGF0ZTtyZXR1cm4gbi5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG4/dChbLW5bMV0sblswXV0pOihuPXQoKSxbblsxXSwtblswXV0pfSxuLnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbj9lKFtuWzBdLG5bMV0sbi5sZW5ndGg+Mj9uWzJdKzkwOjkwXSk6KG49ZSgpLFtuWzBdLG5bMV0sblsyXS05MF0pfSxlKFswLDAsOTBdKX0pLnJhdz1Fcix0YS5nZW9tPXt9LHRhLmdlb20uaHVsbD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuW107dmFyIHQsdT1FdChlKSxpPUV0KHIpLG89bi5sZW5ndGgsYT1bXSxjPVtdO2Zvcih0PTA7bz50O3QrKylhLnB1c2goWyt1LmNhbGwodGhpcyxuW3RdLHQpLCtpLmNhbGwodGhpcyxuW3RdLHQpLHRdKTtmb3IoYS5zb3J0KHpyKSx0PTA7bz50O3QrKyljLnB1c2goW2FbdF1bMF0sLWFbdF1bMV1dKTt2YXIgbD1DcihhKSxzPUNyKGMpLGY9c1swXT09PWxbMF0saD1zW3MubGVuZ3RoLTFdPT09bFtsLmxlbmd0aC0xXSxnPVtdO2Zvcih0PWwubGVuZ3RoLTE7dD49MDstLXQpZy5wdXNoKG5bYVtsW3RdXVsyXV0pO2Zvcih0PStmO3Q8cy5sZW5ndGgtaDsrK3QpZy5wdXNoKG5bYVtzW3RdXVsyXV0pO3JldHVybiBnfXZhciBlPUFyLHI9TnI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChuKToodC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdCl9LHRhLmdlb20ucG9seWdvbj1mdW5jdGlvbihuKXtyZXR1cm4geWEobixKYyksbn07dmFyIEpjPXRhLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107SmMuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PS0xLGU9dGhpcy5sZW5ndGgscj10aGlzW2UtMV0sdT0wOysrdDxlOyluPXIscj10aGlzW3RdLHUrPW5bMV0qclswXS1uWzBdKnJbMV07cmV0dXJuLjUqdX0sSmMuY2VudHJvaWQ9ZnVuY3Rpb24obil7dmFyIHQsZSxyPS0xLHU9dGhpcy5sZW5ndGgsaT0wLG89MCxhPXRoaXNbdS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KG49LTEvKDYqdGhpcy5hcmVhKCkpKTsrK3I8dTspdD1hLGE9dGhpc1tyXSxlPXRbMF0qYVsxXS1hWzBdKnRbMV0saSs9KHRbMF0rYVswXSkqZSxvKz0odFsxXSthWzFdKSplO3JldHVybltpKm4sbypuXX0sSmMuY2xpcD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvLGE9VHIobiksYz0tMSxsPXRoaXMubGVuZ3RoLVRyKHRoaXMpLHM9dGhpc1tsLTFdOysrYzxsOyl7Zm9yKHQ9bi5zbGljZSgpLG4ubGVuZ3RoPTAsdT10aGlzW2NdLGk9dFsocj10Lmxlbmd0aC1hKS0xXSxlPS0xOysrZTxyOylvPXRbZV0scXIobyxzLHUpPyhxcihpLHMsdSl8fG4ucHVzaChMcihpLG8scyx1KSksbi5wdXNoKG8pKTpxcihpLHMsdSkmJm4ucHVzaChMcihpLG8scyx1KSksaT1vO2EmJm4ucHVzaChuWzBdKSxzPXV9cmV0dXJuIG59O3ZhciBHYyxLYyxRYyxubCx0bCxlbD1bXSxybD1bXTtPci5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PXRoaXMuZWRnZXMsZT10Lmxlbmd0aDtlLS07KW49dFtlXS5lZGdlLG4uYiYmbi5hfHx0LnNwbGljZShlLDEpO3JldHVybiB0LnNvcnQoWXIpLHQubGVuZ3RofSxRci5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSxudS5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbihuLHQpe3ZhciBlLHIsdTtpZihuKXtpZih0LlA9bix0Lk49bi5OLG4uTiYmKG4uTi5QPXQpLG4uTj10LG4uUil7Zm9yKG49bi5SO24uTDspbj1uLkw7bi5MPXR9ZWxzZSBuLlI9dDtlPW59ZWxzZSB0aGlzLl8/KG49dXUodGhpcy5fKSx0LlA9bnVsbCx0Lk49bixuLlA9bi5MPXQsZT1uKToodC5QPXQuTj1udWxsLHRoaXMuXz10LGU9bnVsbCk7Zm9yKHQuTD10LlI9bnVsbCx0LlU9ZSx0LkM9ITAsbj10O2UmJmUuQzspcj1lLlUsZT09PXIuTD8odT1yLlIsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5SJiYoZXUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAscnUodGhpcyxyKSkpOih1PXIuTCx1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLkwmJihydSh0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxldSh0aGlzLHIpKSksZT1uLlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbihuKXtuLk4mJihuLk4uUD1uLlApLG4uUCYmKG4uUC5OPW4uTiksbi5OPW4uUD1udWxsO3ZhciB0LGUscix1PW4uVSxpPW4uTCxvPW4uUjtpZihlPWk/bz91dShvKTppOm8sdT91Lkw9PT1uP3UuTD1lOnUuUj1lOnRoaXMuXz1lLGkmJm8/KHI9ZS5DLGUuQz1uLkMsZS5MPWksaS5VPWUsZSE9PW8/KHU9ZS5VLGUuVT1uLlUsbj1lLlIsdS5MPW4sZS5SPW8sby5VPWUpOihlLlU9dSx1PWUsbj1lLlIpKToocj1uLkMsbj1lKSxuJiYobi5VPXUpLCFyKXtpZihuJiZuLkMpcmV0dXJuIHZvaWQobi5DPSExKTtkb3tpZihuPT09dGhpcy5fKWJyZWFrO2lmKG49PT11Lkwpe2lmKHQ9dS5SLHQuQyYmKHQuQz0hMSx1LkM9ITAsZXUodGhpcyx1KSx0PXUuUiksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5SJiZ0LlIuQ3x8KHQuTC5DPSExLHQuQz0hMCxydSh0aGlzLHQpLHQ9dS5SKSx0LkM9dS5DLHUuQz10LlIuQz0hMSxldSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfX1lbHNlIGlmKHQ9dS5MLHQuQyYmKHQuQz0hMSx1LkM9ITAscnUodGhpcyx1KSx0PXUuTCksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5MJiZ0LkwuQ3x8KHQuUi5DPSExLHQuQz0hMCxldSh0aGlzLHQpLHQ9dS5MKSx0LkM9dS5DLHUuQz10LkwuQz0hMSxydSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfXQuQz0hMCxuPXUsdT11LlV9d2hpbGUoIW4uQyk7biYmKG4uQz0hMSl9fX0sdGEuZ2VvbS52b3Jvbm9pPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7dmFyIHQ9bmV3IEFycmF5KG4ubGVuZ3RoKSxyPWFbMF1bMF0sdT1hWzBdWzFdLGk9YVsxXVswXSxvPWFbMV1bMV07cmV0dXJuIGl1KGUobiksYSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLGEpe3ZhciBjPWUuZWRnZXMsbD1lLnNpdGUscz10W2FdPWMubGVuZ3RoP2MubWFwKGZ1bmN0aW9uKG4pe3ZhciB0PW4uc3RhcnQoKTtyZXR1cm5bdC54LHQueV19KTpsLng+PXImJmwueDw9aSYmbC55Pj11JiZsLnk8PW8/W1tyLG9dLFtpLG9dLFtpLHVdLFtyLHVdXTpbXTtzLnBvaW50PW5bYV19KSx0fWZ1bmN0aW9uIGUobil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJue3g6TWF0aC5yb3VuZChpKG4sdCkvQ2EpKkNhLHk6TWF0aC5yb3VuZChvKG4sdCkvQ2EpKkNhLGk6dH19KX12YXIgcj1Bcix1PU5yLGk9cixvPXUsYT11bDtyZXR1cm4gbj90KG4pOih0LmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBpdShlKG4pKS5lZGdlcy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4ubCYmbi5yfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6blt0LmwuaV0sdGFyZ2V0Om5bdC5yLmldfX0pfSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtyZXR1cm4gaXUoZShuKSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2Zvcih2YXIgdSxpLG89ZS5zaXRlLGE9ZS5lZGdlcy5zb3J0KFlyKSxjPS0xLGw9YS5sZW5ndGgscz1hW2wtMV0uZWRnZSxmPXMubD09PW8/cy5yOnMubDsrK2M8bDspdT1zLGk9ZixzPWFbY10uZWRnZSxmPXMubD09PW8/cy5yOnMubCxyPGkuaSYmcjxmLmkmJmF1KG8saSxmKTwwJiZ0LnB1c2goW25bcl0sbltpLmldLG5bZi5pXV0pfSksdH0sdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUV0KHI9biksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHU9biksdCk6dX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW51bGw9PW4/dWw6bix0KTphPT09dWw/bnVsbDphfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jbGlwRXh0ZW50KG4mJltbMCwwXSxuXSk6YT09PXVsP251bGw6YSYmYVsxXX0sdCl9O3ZhciB1bD1bWy0xZTYsLTFlNl0sWzFlNiwxZTZdXTt0YS5nZW9tLmRlbGF1bmF5PWZ1bmN0aW9uKG4pe3JldHVybiB0YS5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXMobil9LHRhLmdlb20ucXVhZHRyZWU9ZnVuY3Rpb24obix0LGUscix1KXtmdW5jdGlvbiBpKG4pe2Z1bmN0aW9uIGkobix0LGUscix1LGksbyxhKXtpZighaXNOYU4oZSkmJiFpc05hTihyKSlpZihuLmxlYWYpe3ZhciBjPW4ueCxzPW4ueTtpZihudWxsIT1jKWlmKGdhKGMtZSkrZ2Eocy1yKTwuMDEpbChuLHQsZSxyLHUsaSxvLGEpO2Vsc2V7dmFyIGY9bi5wb2ludDtuLng9bi55PW4ucG9pbnQ9bnVsbCxsKG4sZixjLHMsdSxpLG8sYSksbChuLHQsZSxyLHUsaSxvLGEpfWVsc2Ugbi54PWUsbi55PXIsbi5wb2ludD10fWVsc2UgbChuLHQsZSxyLHUsaSxvLGEpfWZ1bmN0aW9uIGwobix0LGUscix1LG8sYSxjKXt2YXIgbD0uNSoodSthKSxzPS41KihvK2MpLGY9ZT49bCxoPXI+PXMsZz1oPDwxfGY7bi5sZWFmPSExLG49bi5ub2Rlc1tnXXx8KG4ubm9kZXNbZ109c3UoKSksZj91PWw6YT1sLGg/bz1zOmM9cyxpKG4sdCxlLHIsdSxvLGEsYyl9dmFyIHMsZixoLGcscCx2LGQsbSx5LE09RXQoYSkseD1FdChjKTtpZihudWxsIT10KXY9dCxkPWUsbT1yLHk9dTtlbHNlIGlmKG09eT0tKHY9ZD0xLzApLGY9W10saD1bXSxwPW4ubGVuZ3RoLG8pZm9yKGc9MDtwPmc7KytnKXM9bltnXSxzLng8diYmKHY9cy54KSxzLnk8ZCYmKGQ9cy55KSxzLng+bSYmKG09cy54KSxzLnk+eSYmKHk9cy55KSxmLnB1c2gocy54KSxoLnB1c2gocy55KTtlbHNlIGZvcihnPTA7cD5nOysrZyl7dmFyIGI9K00ocz1uW2ddLGcpLF89K3gocyxnKTt2PmImJih2PWIpLGQ+XyYmKGQ9XyksYj5tJiYobT1iKSxfPnkmJih5PV8pLGYucHVzaChiKSxoLnB1c2goXyl9dmFyIHc9bS12LFM9eS1kO3c+Uz95PWQrdzptPXYrUzt2YXIgaz1zdSgpO2lmKGsuYWRkPWZ1bmN0aW9uKG4pe2koayxuLCtNKG4sKytnKSwreChuLGcpLHYsZCxtLHkpfSxrLnZpc2l0PWZ1bmN0aW9uKG4pe2Z1KG4sayx2LGQsbSx5KX0say5maW5kPWZ1bmN0aW9uKG4pe3JldHVybiBodShrLG5bMF0sblsxXSx2LGQsbSx5KX0sZz0tMSxudWxsPT10KXtmb3IoOysrZzxwOylpKGssbltnXSxmW2ddLGhbZ10sdixkLG0seSk7LS1nfWVsc2Ugbi5mb3JFYWNoKGsuYWRkKTtyZXR1cm4gZj1oPW49cz1udWxsLGt9dmFyIG8sYT1BcixjPU5yO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhhPWN1LGM9bHUsMz09PW8mJih1PWUscj10LGU9dD0wKSxpKG4pKTooaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4saSk6YX0saS55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PStuWzBdWzBdLGU9K25bMF1bMV0scj0rblsxXVswXSx1PStuWzFdWzFdKSxpKTpudWxsPT10P251bGw6W1t0LGVdLFtyLHVdXX0saS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD1lPTAscj0rblswXSx1PStuWzFdKSxpKTpudWxsPT10P251bGw6W3ItdCx1LWVdfSxpKX0sdGEuaW50ZXJwb2xhdGVSZ2I9Z3UsdGEuaW50ZXJwb2xhdGVPYmplY3Q9cHUsdGEuaW50ZXJwb2xhdGVOdW1iZXI9dnUsdGEuaW50ZXJwb2xhdGVTdHJpbmc9ZHU7dmFyIGlsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxvbD1uZXcgUmVnRXhwKGlsLnNvdXJjZSwiZyIpO3RhLmludGVycG9sYXRlPW11LHRhLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKG4sdCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuKCJzdHJpbmciPT09ZT9HYS5oYXModCl8fC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KHQpP2d1OmR1OnQgaW5zdGFuY2VvZiBvdD9ndTpBcnJheS5pc0FycmF5KHQpP3l1OiJvYmplY3QiPT09ZSYmaXNOYU4odCk/cHU6dnUpKG4sdCl9XSx0YS5pbnRlcnBvbGF0ZUFycmF5PXl1O3ZhciBhbD1mdW5jdGlvbigpe3JldHVybiB5fSxjbD10YS5tYXAoe2xpbmVhcjphbCxwb2x5Omt1LHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIHd1fSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGV4cDpmdW5jdGlvbigpe3JldHVybiBBdX0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE51fSxlbGFzdGljOkN1LGJhY2s6enUsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHF1fX0pLGxsPXRhLm1hcCh7ImluIjp5LG91dDp4dSwiaW4tb3V0IjpidSwib3V0LWluIjpmdW5jdGlvbihuKXtyZXR1cm4gYnUoeHUobikpfX0pO3RhLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCItIiksZT10Pj0wP24uc2xpY2UoMCx0KTpuLHI9dD49MD9uLnNsaWNlKHQrMSk6ImluIjtyZXR1cm4gZT1jbC5nZXQoZSl8fGFsLHI9bGwuZ2V0KHIpfHx5LE11KHIoZS5hcHBseShudWxsLGVhLmNhbGwoYXJndW1lbnRzLDEpKSkpfSx0YS5pbnRlcnBvbGF0ZUhjbD1MdSx0YS5pbnRlcnBvbGF0ZUhzbD1UdSx0YS5pbnRlcnBvbGF0ZUxhYj1SdSx0YS5pbnRlcnBvbGF0ZVJvdW5kPUR1LHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD11YS5jcmVhdGVFbGVtZW50TlModGEubnMucHJlZml4LnN2ZywiZyIpO3JldHVybih0YS50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgUHUoZT9lLm1hdHJpeDpzbCl9KShuKX0sUHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBzbD17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O3RhLmludGVycG9sYXRlVHJhbnNmb3JtPUh1LHRhLmxheW91dD17fSx0YS5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChZdShuW2VdKSk7cmV0dXJuIHR9fSx0YS5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sbCxmLGgsZyxwPXt9LHY9W10sZD10YS5yYW5nZShpKSxtPVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPGk7KXtmb3IobD0wLGc9LTE7KytnPGk7KWwrPXVbaF1bZ107di5wdXNoKGwpLG0ucHVzaCh0YS5yYW5nZShpKSksbis9bH1mb3IobyYmZC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG8odltuXSx2W3RdKX0pLGEmJm0uZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBhKHVbdF1bbl0sdVt0XVtlXSl9KX0pLG49KExhLXMqaSkvbixsPTAsaD0tMTsrK2g8aTspe2ZvcihmPWwsZz0tMTsrK2c8aTspe3ZhciB5PWRbaF0sTT1tW3ldW2ddLHg9dVt5XVtNXSxiPWwsXz1sKz14Km47cFt5KyItIitNXT17aW5kZXg6eSxzdWJpbmRleDpNLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTpfLHZhbHVlOnh9fXJbeV09e2luZGV4Onksc3RhcnRBbmdsZTpmLGVuZEFuZ2xlOmwsdmFsdWU6KGwtZikvbn0sbCs9c31mb3IoaD0tMTsrK2g8aTspZm9yKGc9aC0xOysrZzxpOyl7dmFyIHc9cFtoKyItIitnXSxTPXBbZysiLSIraF07KHcudmFsdWV8fFMudmFsdWUpJiZlLnB1c2gody52YWx1ZTxTLnZhbHVlP3tzb3VyY2U6Uyx0YXJnZXQ6d306e3NvdXJjZTp3LHRhcmdldDpTfSl9YyYmdCgpfWZ1bmN0aW9uIHQoKXtlLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gYygobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpLzIsKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yKX0pfXZhciBlLHIsdSxpLG8sYSxjLGw9e30scz0wO3JldHVybiBsLm1hdHJpeD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1uKSYmdS5sZW5ndGgsZT1yPW51bGwsbCk6dX0sbC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sZT1yPW51bGwsbCk6c30sbC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sZT1yPW51bGwsbCk6b30sbC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sZT1udWxsLGwpOmF9LGwuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGUmJnQoKSxsKTpjfSxsLmNob3Jkcz1mdW5jdGlvbigpe3JldHVybiBlfHxuKCksZX0sbC5ncm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8bigpLHJ9LGx9LHRhLmxheW91dC5mb3JjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLHUpe2lmKHQucG9pbnQhPT1uKXt2YXIgaT10LmN4LW4ueCxvPXQuY3ktbi55LGE9dS1lLGM9aSppK28qbztpZihjPmEqYS9kKXtpZihwPmMpe3ZhciBsPXQuY2hhcmdlL2M7bi5weC09aSpsLG4ucHktPW8qbH1yZXR1cm4hMH1pZih0LnBvaW50JiZjJiZwPmMpe3ZhciBsPXQucG9pbnRDaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfX1yZXR1cm4hdC5jaGFyZ2V9fWZ1bmN0aW9uIHQobil7bi5weD10YS5ldmVudC54LG4ucHk9dGEuZXZlbnQueSxhLnJlc3VtZSgpfXZhciBlLHIsdSxpLG8sYT17fSxjPXRhLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxsPVsxLDFdLHM9LjksZj1mbCxoPWhsLGc9LTMwLHA9Z2wsdj0uMSxkPS42NCxtPVtdLE09W107cmV0dXJuIGEudGljaz1mdW5jdGlvbigpe2lmKChyKj0uOTkpPC4wMDUpcmV0dXJuIGMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnI9MH0pLCEwO3ZhciB0LGUsYSxmLGgscCxkLHkseCxiPW0ubGVuZ3RoLF89TS5sZW5ndGg7Zm9yKGU9MDtfPmU7KytlKWE9TVtlXSxmPWEuc291cmNlLGg9YS50YXJnZXQseT1oLngtZi54LHg9aC55LWYueSwocD15KnkreCp4KSYmKHA9cippW2VdKigocD1NYXRoLnNxcnQocCkpLXVbZV0pL3AseSo9cCx4Kj1wLGgueC09eSooZD1mLndlaWdodC8oaC53ZWlnaHQrZi53ZWlnaHQpKSxoLnktPXgqZCxmLngrPXkqKGQ9MS1kKSxmLnkrPXgqZCk7aWYoKGQ9cip2KSYmKHk9bFswXS8yLHg9bFsxXS8yLGU9LTEsZCkpZm9yKDsrK2U8YjspYT1tW2VdLGEueCs9KHktYS54KSpkLGEueSs9KHgtYS55KSpkO2lmKGcpZm9yKEp1KHQ9dGEuZ2VvbS5xdWFkdHJlZShtKSxyLG8pLGU9LTE7KytlPGI7KShhPW1bZV0pLmZpeGVkfHx0LnZpc2l0KG4oYSkpO2ZvcihlPS0xOysrZTxiOylhPW1bZV0sYS5maXhlZD8oYS54PWEucHgsYS55PWEucHkpOihhLngtPShhLnB4LShhLnB4PWEueCkpKnMsYS55LT0oYS5weS0oYS5weT1hLnkpKSpzKTtjLnRpY2soe3R5cGU6InRpY2siLGFscGhhOnJ9KX0sYS5ub2Rlcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uLGEpOm19LGEubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09bixhKTpNfSxhLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixhKTpsfSxhLmxpbmtEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmZ9LGEuZGlzdGFuY2U9YS5saW5rRGlzdGFuY2UsYS5saW5rU3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpofSxhLmZyaWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPStuLGEpOnN9LGEuY2hhcmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Z30sYS5jaGFyZ2VEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uKm4sYSk6TWF0aC5zcXJ0KHApfSxhLmdyYXZpdHk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K24sYSk6dn0sYS50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1uKm4sYSk6TWF0aC5zcXJ0KGQpfSxhLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStuLHI/cj1uPjA/bjowOm4+MCYmKGMuc3RhcnQoe3R5cGU6InN0YXJ0IixhbHBoYTpyPW59KSx0YS50aW1lcihhLnRpY2spKSxhKTpyfSxhLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXtmb3IoZT1uZXcgQXJyYXkoYyksYT0wO2M+YTsrK2EpZVthXT1bXTtmb3IoYT0wO3M+YTsrK2Epe3ZhciB1PU1bYV07ZVt1LnNvdXJjZS5pbmRleF0ucHVzaCh1LnRhcmdldCksZVt1LnRhcmdldC5pbmRleF0ucHVzaCh1LnNvdXJjZSl9fWZvcih2YXIgaSxvPWVbdF0sYT0tMSxsPW8ubGVuZ3RoOysrYTxsOylpZighaXNOYU4oaT1vW2FdW25dKSlyZXR1cm4gaTtyZXR1cm4gTWF0aC5yYW5kb20oKSpyfXZhciB0LGUscixjPW0ubGVuZ3RoLHM9TS5sZW5ndGgscD1sWzBdLHY9bFsxXTtmb3IodD0wO2M+dDsrK3QpKHI9bVt0XSkuaW5kZXg9dCxyLndlaWdodD0wO2Zvcih0PTA7cz50OysrdClyPU1bdF0sIm51bWJlciI9PXR5cGVvZiByLnNvdXJjZSYmKHIuc291cmNlPW1bci5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIHIudGFyZ2V0JiYoci50YXJnZXQ9bVtyLnRhcmdldF0pLCsrci5zb3VyY2Uud2VpZ2h0LCsrci50YXJnZXQud2VpZ2h0O2Zvcih0PTA7Yz50OysrdClyPW1bdF0saXNOYU4oci54KSYmKHIueD1uKCJ4IixwKSksaXNOYU4oci55KSYmKHIueT1uKCJ5Iix2KSksaXNOYU4oci5weCkmJihyLnB4PXIueCksaXNOYU4oci5weSkmJihyLnB5PXIueSk7aWYodT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IodD0wO3M+dDsrK3QpdVt0XT0rZi5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdCl1W3RdPWY7aWYoaT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgaClmb3IodD0wO3M+dDsrK3QpaVt0XT0raC5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdClpW3RdPWg7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZylmb3IodD0wO2M+dDsrK3Qpb1t0XT0rZy5jYWxsKHRoaXMsbVt0XSx0KTtlbHNlIGZvcih0PTA7Yz50OysrdClvW3RdPWc7cmV0dXJuIGEucmVzdW1lKCl9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYWxwaGEoLjEpfSxhLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSgwKX0sYS5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fChlPXRhLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oeSkub24oImRyYWdzdGFydC5mb3JjZSIsWHUpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsJHUpKSxhcmd1bWVudHMubGVuZ3RoP3ZvaWQgdGhpcy5vbigibW91c2VvdmVyLmZvcmNlIixCdSkub24oIm1vdXNlb3V0LmZvcmNlIixXdSkuY2FsbChlKTplfSx0YS5yZWJpbmQoYSxjLCJvbiIpfTt2YXIgZmw9MjAsaGw9MSxnbD0xLzA7dGEubGF5b3V0LmhpZXJhcmNoeT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odSl7dmFyIGksbz1bdV0sYT1bXTtmb3IodS5kZXB0aD0wO251bGwhPShpPW8ucG9wKCkpOylpZihhLnB1c2goaSksKGw9ZS5jYWxsKG4saSxpLmRlcHRoKSkmJihjPWwubGVuZ3RoKSl7Zm9yKHZhciBjLGwsczstLWM+PTA7KW8ucHVzaChzPWxbY10pLHMucGFyZW50PWkscy5kZXB0aD1pLmRlcHRoKzE7ciYmKGkudmFsdWU9MCksaS5jaGlsZHJlbj1sfWVsc2UgciYmKGkudmFsdWU9K3IuY2FsbChuLGksaS5kZXB0aCl8fDApLGRlbGV0ZSBpLmNoaWxkcmVuO3JldHVybiBRdSh1LGZ1bmN0aW9uKG4pe3ZhciBlLHU7dCYmKGU9bi5jaGlsZHJlbikmJmUuc29ydCh0KSxyJiYodT1uLnBhcmVudCkmJih1LnZhbHVlKz1uLnZhbHVlKX0pLGF9dmFyIHQ9ZWksZT1uaSxyPXRpO3JldHVybiBuLnNvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNoaWxkcmVuPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4ucmV2YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gciYmKEt1KHQsZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmKG4udmFsdWU9MCl9KSxRdSh0LGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2hpbGRyZW58fCh0LnZhbHVlPStyLmNhbGwobix0LHQuZGVwdGgpfHwwKSwoZT10LnBhcmVudCkmJihlLnZhbHVlKz10LnZhbHVlKX0pKSx0fSxufSx0YS5sYXlvdXQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUscix1KXt2YXIgaT10LmNoaWxkcmVuO2lmKHQueD1lLHQueT10LmRlcHRoKnUsdC5keD1yLHQuZHk9dSxpJiYobz1pLmxlbmd0aCkpe3ZhciBvLGEsYyxsPS0xO2ZvcihyPXQudmFsdWU/ci90LnZhbHVlOjA7KytsPG87KW4oYT1pW2xdLGUsYz1hLnZhbHVlKnIsdSksZSs9Y319ZnVuY3Rpb24gdChuKXt2YXIgZT1uLmNoaWxkcmVuLHI9MDtpZihlJiYodT1lLmxlbmd0aCkpZm9yKHZhciB1LGk9LTE7KytpPHU7KXI9TWF0aC5tYXgocix0KGVbaV0pKTtyZXR1cm4gMStyfWZ1bmN0aW9uIGUoZSxpKXt2YXIgbz1yLmNhbGwodGhpcyxlLGkpO3JldHVybiBuKG9bMF0sMCx1WzBdLHVbMV0vdChvWzBdKSksb312YXIgcj10YS5sYXlvdXQuaGllcmFyY2h5KCksdT1bMSwxXTtyZXR1cm4gZS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sZSk6dX0sR3UoZSxyKX0sdGEubGF5b3V0LnBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obyl7dmFyIGEsYz1vLmxlbmd0aCxsPW8ubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuK3QuY2FsbChuLGUscil9KSxzPSsoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksZj0oImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSktcyxoPU1hdGgubWluKE1hdGguYWJzKGYpL2MsKygiZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKSksZz1oKigwPmY/LTE6MSkscD0oZi1jKmcpL3RhLnN1bShsKSx2PXRhLnJhbmdlKGMpLGQ9W107cmV0dXJuIG51bGwhPWUmJnYuc29ydChlPT09cGw/ZnVuY3Rpb24obix0KXtyZXR1cm4gbFt0XS1sW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKG9bbl0sb1t0XSl9KSx2LmZvckVhY2goZnVuY3Rpb24obil7ZFtuXT17ZGF0YTpvW25dLHZhbHVlOmE9bFtuXSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6cys9YSpwK2cscGFkQW5nbGU6aH19KSxkfXZhciB0PU51bWJlcixlPXBsLHI9MCx1PUxhLGk9MDtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbn07dmFyIHBsPXt9O3RhLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSxjKXtpZighKGg9YS5sZW5ndGgpKXJldHVybiBhO3ZhciBsPWEubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxzPWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybltpLmNhbGwobix0LGUpLG8uY2FsbChuLHQsZSldfSl9KSxmPWUuY2FsbChuLHMsYyk7bD10YS5wZXJtdXRlKGwsZikscz10YS5wZXJtdXRlKHMsZik7dmFyIGgsZyxwLHYsZD1yLmNhbGwobixzLGMpLG09bFswXS5sZW5ndGg7Zm9yKHA9MDttPnA7KytwKWZvcih1LmNhbGwobixsWzBdW3BdLHY9ZFtwXSxzWzBdW3BdWzFdKSxnPTE7aD5nOysrZyl1LmNhbGwobixsW2ddW3BdLHYrPXNbZy0xXVtwXVsxXSxzW2ddW3BdWzFdKTtyZXR1cm4gYX12YXIgdD15LGU9YWkscj1jaSx1PW9pLGk9dWksbz1paTtyZXR1cm4gbi52YWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dmwuZ2V0KHQpfHxhaSxuKTplfSxuLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRsLmdldCh0KXx8Y2ksbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sbi5vdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxufTt2YXIgdmw9dGEubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24obil7dmFyIHQsZSxyPW4ubGVuZ3RoLHU9bi5tYXAobGkpLGk9bi5tYXAoc2kpLG89dGEucmFuZ2Uocikuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiB1W25dLXVbdF19KSxhPTAsYz0wLGw9W10scz1bXTtmb3IodD0wO3I+dDsrK3QpZT1vW3RdLGM+YT8oYSs9aVtlXSxsLnB1c2goZSkpOihjKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChsKX0scmV2ZXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpLnJldmVyc2UoKX0sImRlZmF1bHQiOmFpfSksZGw9dGEubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz1bXSxhPTAsYz1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtyPmEmJihhPXIpLG8ucHVzaChyKX1mb3IoZT0wO2k+ZTsrK2UpY1tlXT0oYS1vW2VdKS8yO3JldHVybiBjfSx3aWdnbGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvLGEsYyxsLHM9bi5sZW5ndGgsZj1uWzBdLGg9Zi5sZW5ndGgsZz1bXTtmb3IoZ1swXT1jPWw9MCxlPTE7aD5lOysrZSl7Zm9yKHQ9MCx1PTA7cz50OysrdCl1Kz1uW3RdW2VdWzFdO2Zvcih0PTAsaT0wLGE9ZltlXVswXS1mW2UtMV1bMF07cz50OysrdCl7Zm9yKHI9MCxvPShuW3RdW2VdWzFdLW5bdF1bZS0xXVsxXSkvKDIqYSk7dD5yOysrcilvKz0obltyXVtlXVsxXS1uW3JdW2UtMV1bMV0pL2E7aSs9bypuW3RdW2VdWzFdfWdbZV09Yy09dT9pL3UqYTowLGw+YyYmKGw9Yyl9Zm9yKGU9MDtoPmU7KytlKWdbZV0tPWw7cmV0dXJuIGd9LGV4cGFuZDpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPW5bMF0ubGVuZ3RoLG89MS91LGE9W107Zm9yKGU9MDtpPmU7KytlKXtmb3IodD0wLHI9MDt1PnQ7dCsrKXIrPW5bdF1bZV1bMV07aWYocilmb3IodD0wO3U+dDt0Kyspblt0XVtlXVsxXS89cjtlbHNlIGZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdPW99Zm9yKGU9MDtpPmU7KytlKWFbZV09MDtyZXR1cm4gYX0semVybzpjaX0pO3RhLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7Zm9yKHZhciBvLGEsYz1bXSxsPW4ubWFwKGUsdGhpcykscz1yLmNhbGwodGhpcyxsLGkpLGY9dS5jYWxsKHRoaXMscyxsLGkpLGk9LTEsaD1sLmxlbmd0aCxnPWYubGVuZ3RoLTEscD10PzE6MS9oOysraTxnOylvPWNbaV09W10sby5keD1mW2krMV0tKG8ueD1mW2ldKSxvLnk9MDtpZihnPjApZm9yKGk9LTE7KytpPGg7KWE9bFtpXSxhPj1zWzBdJiZhPD1zWzFdJiYobz1jW3RhLmJpc2VjdChmLGEsMSxnKS0xXSxvLnkrPXAsby5wdXNoKG5baV0pKTtyZXR1cm4gY312YXIgdD0hMCxlPU51bWJlcixyPXBpLHU9aGk7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KHQpLG4pOnJ9LG4uYmlucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24obil7cmV0dXJuIGdpKG4sdCl9OkV0KHQpLG4pOnV9LG4uZnJlcXVlbmN5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSEhZSxuKTp0fSxufSx0YS5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgbz1lLmNhbGwodGhpcyxuLGkpLGE9b1swXSxjPXVbMF0sbD11WzFdLHM9bnVsbD09dD9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fTtpZihhLng9YS55PTAsUXUoYSxmdW5jdGlvbihuKXtuLnI9K3Mobi52YWx1ZSl9KSxRdShhLE1pKSxyKXt2YXIgZj1yKih0PzE6TWF0aC5tYXgoMiphLnIvYywyKmEuci9sKSkvMjtRdShhLGZ1bmN0aW9uKG4pe24ucis9Zn0pLFF1KGEsTWkpLFF1KGEsZnVuY3Rpb24obil7bi5yLT1mfSl9cmV0dXJuIF9pKGEsYy8yLGwvMix0PzE6MS9NYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKSxvfXZhciB0LGU9dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQodmkpLHI9MCx1PVsxLDFdO3JldHVybiBuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1lfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9lOitlLG4pOnR9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxHdShuLGUpfSx0YS5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgcz1vLmNhbGwodGhpcyxuLHUpLGY9c1swXSxoPXQoZik7aWYoUXUoaCxlKSxoLnBhcmVudC5tPS1oLnosS3UoaCxyKSxsKUt1KGYsaSk7ZWxzZXt2YXIgZz1mLHA9Zix2PWY7S3UoZixmdW5jdGlvbihuKXtuLng8Zy54JiYoZz1uKSxuLng+cC54JiYocD1uKSxuLmRlcHRoPnYuZGVwdGgmJih2PW4pfSk7dmFyIGQ9YShnLHApLzItZy54LG09Y1swXS8ocC54K2EocCxnKS8yK2QpLHk9Y1sxXS8odi5kZXB0aHx8MSk7S3UoZixmdW5jdGlvbihuKXtuLng9KG4ueCtkKSptLG4ueT1uLmRlcHRoKnl9KX1yZXR1cm4gc31mdW5jdGlvbiB0KG4pe2Zvcih2YXIgdCxlPXtBOm51bGwsY2hpbGRyZW46W25dfSxyPVtlXTtudWxsIT0odD1yLnBvcCgpKTspZm9yKHZhciB1LGk9dC5jaGlsZHJlbixvPTAsYT1pLmxlbmd0aDthPm87KytvKXIucHVzaCgoaVtvXT11PXtfOmlbb10scGFyZW50OnQsY2hpbGRyZW46KHU9aVtvXS5jaGlsZHJlbikmJnUuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6b30pLmE9dSk7cmV0dXJuIGUuY2hpbGRyZW5bMF19ZnVuY3Rpb24gZShuKXt2YXIgdD1uLmNoaWxkcmVuLGU9bi5wYXJlbnQuY2hpbGRyZW4scj1uLmk/ZVtuLmktMV06bnVsbDtpZih0Lmxlbmd0aCl7Tmkobik7dmFyIGk9KHRbMF0ueit0W3QubGVuZ3RoLTFdLnopLzI7cj8obi56PXIueithKG4uXyxyLl8pLG4ubT1uLnotaSk6bi56PWl9ZWxzZSByJiYobi56PXIueithKG4uXyxyLl8pKTtuLnBhcmVudC5BPXUobixyLG4ucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIHIobil7bi5fLng9bi56K24ucGFyZW50Lm0sbi5tKz1uLnBhcmVudC5tfWZ1bmN0aW9uIHUobix0LGUpe2lmKHQpe2Zvcih2YXIgcix1PW4saT1uLG89dCxjPXUucGFyZW50LmNoaWxkcmVuWzBdLGw9dS5tLHM9aS5tLGY9by5tLGg9Yy5tO289RWkobyksdT1raSh1KSxvJiZ1OyljPWtpKGMpLGk9RWkoaSksaS5hPW4scj1vLnorZi11LnotbCthKG8uXyx1Ll8pLHI+MCYmKEFpKENpKG8sbixlKSxuLHIpLGwrPXIscys9ciksZis9by5tLGwrPXUubSxoKz1jLm0scys9aS5tO28mJiFFaShpKSYmKGkudD1vLGkubSs9Zi1zKSx1JiYha2koYykmJihjLnQ9dSxjLm0rPWwtaCxlPW4pfXJldHVybiBlfWZ1bmN0aW9uIGkobil7bi54Kj1jWzBdLG4ueT1uLmRlcHRoKmNbMV19dmFyIG89dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksYT1TaSxjPVsxLDFdLGw9bnVsbDtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbik6YX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP2k6bnVsbCxuKTpsP251bGw6Y30sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1udWxsPT0oYz10KT9udWxsOmksbik6bD9jOm51bGx9LEd1KG4sbyl9LHRhLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvLGE9dC5jYWxsKHRoaXMsbixpKSxjPWFbMF0sbD0wO1F1KGMsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PXFpKHQpLG4ueT16aSh0KSk6KG4ueD1vP2wrPWUobixvKTowLG4ueT0wLG89bil9KTt2YXIgcz1MaShjKSxmPVRpKGMpLGg9cy54LWUocyxmKS8yLGc9Zi54K2UoZixzKS8yO3JldHVybiBRdShjLHU/ZnVuY3Rpb24obil7bi54PShuLngtYy54KSpyWzBdLG4ueT0oYy55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKGctaCkqclswXSxuLnk9KDEtKGMueT9uLnkvYy55OjEpKSpyWzFdfSksYX12YXIgdD10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPVNpLHI9WzEsMV0sdT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShyPXQpLG4pOnU/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGwhPShyPXQpLG4pOnU/cjpudWxsfSxHdShuLHQpfSx0YS5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXI9KGU9blt1XSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgaT1lLmNoaWxkcmVuO2lmKGkmJmkubGVuZ3RoKXt2YXIgbyxhLGMsbD1mKGUpLHM9W10saD1pLnNsaWNlKCkscD0xLzAsdj0ic2xpY2UiPT09Zz9sLmR4OiJkaWNlIj09PWc/bC5keToic2xpY2UtZGljZSI9PT1nPzEmZS5kZXB0aD9sLmR5OmwuZHg6TWF0aC5taW4obC5keCxsLmR5KTtmb3IobihoLGwuZHgqbC5keS9lLnZhbHVlKSxzLmFyZWE9MDsoYz1oLmxlbmd0aCk+MDspcy5wdXNoKG89aFtjLTFdKSxzLmFyZWErPW8uYXJlYSwic3F1YXJpZnkiIT09Z3x8KGE9cihzLHYpKTw9cD8oaC5wb3AoKSxwPWEpOihzLmFyZWEtPXMucG9wKCkuYXJlYSx1KHMsdixsLCExKSx2PU1hdGgubWluKGwuZHgsbC5keSkscy5sZW5ndGg9cy5hcmVhPTAscD0xLzApO3MubGVuZ3RoJiYodShzLHYsbCwhMCkscy5sZW5ndGg9cy5hcmVhPTApLGkuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgaSxvPWYodCksYT1yLnNsaWNlKCksYz1bXTtmb3IobihhLG8uZHgqby5keS90LnZhbHVlKSxjLmFyZWE9MDtpPWEucG9wKCk7KWMucHVzaChpKSxjLmFyZWErPWkuYXJlYSxudWxsIT1pLnomJih1KGMsaS56P28uZHg6by5keSxvLCFhLmxlbmd0aCksYy5sZW5ndGg9Yy5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSx1PTAsaT0xLzAsbz0tMSxhPW4ubGVuZ3RoOysrbzxhOykoZT1uW29dLmFyZWEpJiYoaT5lJiYoaT1lKSxlPnUmJih1PWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCp1KnAvcixyLyh0KmkqcCkpOjEvMH1mdW5jdGlvbiB1KG4sdCxlLHIpe3ZhciB1LGk9LTEsbz1uLmxlbmd0aCxhPWUueCxsPWUueSxzPXQ/YyhuLmFyZWEvdCk6MDtpZih0PT1lLmR4KXtmb3IoKHJ8fHM+ZS5keSkmJihzPWUuZHkpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keT1zLGErPXUuZHg9TWF0aC5taW4oZS54K2UuZHgtYSxzP2ModS5hcmVhL3MpOjApO3Uuej0hMCx1LmR4Kz1lLngrZS5keC1hLGUueSs9cyxlLmR5LT1zfWVsc2V7Zm9yKChyfHxzPmUuZHgpJiYocz1lLmR4KTsrK2k8bzspdT1uW2ldLHUueD1hLHUueT1sLHUuZHg9cyxsKz11LmR5PU1hdGgubWluKGUueStlLmR5LWwscz9jKHUuYXJlYS9zKTowKTt1Lno9ITEsdS5keSs9ZS55K2UuZHktbCxlLngrPXMsZS5keC09c319ZnVuY3Rpb24gaShyKXt2YXIgdT1vfHxhKHIpLGk9dVswXTtyZXR1cm4gaS54PTAsaS55PTAsaS5keD1sWzBdLGkuZHk9bFsxXSxvJiZhLnJldmFsdWUoaSksbihbaV0saS5keCppLmR5L2kudmFsdWUpLChvP2U6dCkoaSksaCYmKG89dSksdX12YXIgbyxhPXRhLmxheW91dC5oaWVyYXJjaHkoKSxjPU1hdGgucm91bmQsbD1bMSwxXSxzPW51bGwsZj1SaSxoPSExLGc9InNxdWFyaWZ5IixwPS41KigxK01hdGguc3FydCg1KSk7DQpyZXR1cm4gaS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5wYWRkaW5nPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7dmFyIGU9bi5jYWxsKGksdCx0LmRlcHRoKTtyZXR1cm4gbnVsbD09ZT9SaSh0KTpEaSh0LCJudW1iZXIiPT10eXBlb2YgZT9bZSxlLGUsZV06ZSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gRGkodCxuKX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gczt2YXIgcjtyZXR1cm4gZj1udWxsPT0ocz1uKT9SaToiZnVuY3Rpb24iPT0ocj10eXBlb2Ygbik/dDoibnVtYmVyIj09PXI/KG49W24sbixuLG5dLGUpOmUsaX0saS5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uP01hdGgucm91bmQ6TnVtYmVyLGkpOmMhPU51bWJlcn0saS5zdGlja3k9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bixvPW51bGwsaSk6aH0saS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uLGkpOnB9LGkubW9kZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1uKyIiLGkpOmd9LEd1KGksYSl9LHRhLnJhbmRvbT17bm9ybWFsOmZ1bmN0aW9uKG4sdCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gMj5lJiYodD0xKSwxPmUmJihuPTApLGZ1bmN0aW9uKCl7dmFyIGUscix1O2RvIGU9MipNYXRoLnJhbmRvbSgpLTEscj0yKk1hdGgucmFuZG9tKCktMSx1PWUqZStyKnI7d2hpbGUoIXV8fHU+MSk7cmV0dXJuIG4rdCplKk1hdGguc3FydCgtMipNYXRoLmxvZyh1KS91KX19LGxvZ05vcm1hbDpmdW5jdGlvbigpe3ZhciBuPXRhLnJhbmRvbS5ub3JtYWwuYXBwbHkodGEsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAobigpKX19LGJhdGVzOmZ1bmN0aW9uKG4pe3ZhciB0PXRhLnJhbmRvbS5pcndpbkhhbGwobik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQoKS9ufX0saXJ3aW5IYWxsOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtuPmU7ZSsrKXQrPU1hdGgucmFuZG9tKCk7cmV0dXJuIHR9fX0sdGEuc2NhbGU9e307dmFyIG1sPXtmbG9vcjp5LGNlaWw6eX07dGEuc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIElpKFswLDFdLFswLDFdLG11LCExKX07dmFyIHlsPXtzOjEsZzoxLHA6MSxyOjEsZToxfTt0YS5zY2FsZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gSmkodGEuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLDFdKSwxMCwhMCxbMSwxMF0pfTt2YXIgTWw9dGEuZm9ybWF0KCIuMGUiKSx4bD17Zmxvb3I6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguY2VpbCgtbil9LGNlaWw6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguZmxvb3IoLW4pfX07dGEuc2NhbGUucG93PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKHRhLnNjYWxlLmxpbmVhcigpLDEsWzAsMV0pfSx0YS5zY2FsZS5zcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KX0sdGEuc2NhbGUub3JkaW5hbD1mdW5jdGlvbigpe3JldHVybiBRaShbXSx7dDoicmFuZ2UiLGE6W1tdXX0pfSx0YS5zY2FsZS5jYXRlZ29yeTEwPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShibCl9LHRhLnNjYWxlLmNhdGVnb3J5MjA9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKF9sKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKHdsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKFNsKX07dmFyIGJsPVsyMDYyMjYwLDE2NzQ0MjA2LDI5MjQ1ODgsMTQwMzQ3MjgsOTcyNTg4NSw5MTk3MTMxLDE0OTA3MzMwLDgzNTU3MTEsMTIzNjkxODYsMTU1NjE3NV0ubWFwKE10KSxfbD1bMjA2MjI2MCwxMTQ1NDQ0MCwxNjc0NDIwNiwxNjc1OTY3MiwyOTI0NTg4LDEwMDE4Njk4LDE0MDM0NzI4LDE2NzUwNzQyLDk3MjU4ODUsMTI5NTU4NjEsOTE5NzEzMSwxMjg4NTE0MCwxNDkwNzMzMCwxNjIzNDE5NCw4MzU1NzExLDEzMDkyODA3LDEyMzY5MTg2LDE0NDA4NTg5LDE1NTYxNzUsMTA0MTA3MjVdLm1hcChNdCksd2w9WzM3NTA3NzcsNTM5NTYxOSw3MDQwNzE5LDEwMjY0Mjg2LDY1MTkwOTcsOTIxNjU5NCwxMTkxNTExNSwxMzU1NjYzNiw5MjAyOTkzLDEyNDI2ODA5LDE1MTg2NTE0LDE1MTkwOTMyLDg2NjYxNjksMTEzNTY0OTAsMTQwNDk2NDMsMTUxNzczNzIsODA3NzY4MywxMDgzNDMyNCwxMzUyODUwOSwxNDU4OTY1NF0ubWFwKE10KSxTbD1bMzI0NDczMyw3MDU3MTEwLDEwNDA2NjI1LDEzMDMyNDMxLDE1MDk1MDUzLDE2NjE2NzY0LDE2NjI1MjU5LDE2NjM0MDE4LDMyNTMwNzYsNzY1MjQ3MCwxMDYwNzAwMywxMzEwMTUwNCw3Njk1MjgxLDEwMzk0MzEyLDEyMzY5MzcyLDE0MzQyODkxLDY1MTM1MDcsOTg2ODk1MCwxMjQzNDg3NywxNDI3NzA4MV0ubWFwKE10KTt0YS5zY2FsZS5xdWFudGlsZT1mdW5jdGlvbigpe3JldHVybiBubyhbXSxbXSl9LHRhLnNjYWxlLnF1YW50aXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRvKDAsMSxbMCwxXSl9LHRhLnNjYWxlLnRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiBlbyhbLjVdLFswLDFdKX0sdGEuc2NhbGUuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8oWzAsMV0pfSx0YS5zdmc9e30sdGEuc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj1NYXRoLm1heCgwLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbD1NYXRoLm1heCgwLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1SYSxmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLVJhLGg9TWF0aC5hYnMoZi1zKSxnPXM+Zj8wOjE7aWYobj5sJiYocD1sLGw9bixuPXApLGg+PVRhKXJldHVybiB0KGwsZykrKG4/dChuLDEtZyk6IiIpKyJaIjt2YXIgcCx2LGQsbSx5LE0seCxiLF8sdyxTLGssRT0wLEE9MCxOPVtdO2lmKChtPSgrYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDApLzIpJiYoZD1pPT09a2w/TWF0aC5zcXJ0KG4qbitsKmwpOitpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnfHwoQSo9LTEpLGwmJihBPXR0KGQvbCpNYXRoLnNpbihtKSkpLG4mJihFPXR0KGQvbipNYXRoLnNpbihtKSkpKSxsKXt5PWwqTWF0aC5jb3MocytBKSxNPWwqTWF0aC5zaW4ocytBKSx4PWwqTWF0aC5jb3MoZi1BKSxiPWwqTWF0aC5zaW4oZi1BKTt2YXIgQz1NYXRoLmFicyhmLXMtMipBKTw9cWE/MDoxO2lmKEEmJnNvKHksTSx4LGIpPT09Z15DKXt2YXIgej0ocytmKS8yO3k9bCpNYXRoLmNvcyh6KSxNPWwqTWF0aC5zaW4oeikseD1iPW51bGx9fWVsc2UgeT1NPTA7aWYobil7Xz1uKk1hdGguY29zKGYtRSksdz1uKk1hdGguc2luKGYtRSksUz1uKk1hdGguY29zKHMrRSksaz1uKk1hdGguc2luKHMrRSk7dmFyIHE9TWF0aC5hYnMocy1mKzIqRSk8PXFhPzA6MTtpZihFJiZzbyhfLHcsUyxrKT09PTEtZ15xKXt2YXIgTD0ocytmKS8yO189bipNYXRoLmNvcyhMKSx3PW4qTWF0aC5zaW4oTCksUz1rPW51bGx9fWVsc2UgXz13PTA7aWYoKHA9TWF0aC5taW4oTWF0aC5hYnMobC1uKS8yLCt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpPi4wMDEpe3Y9bD5uXmc/MDoxO3ZhciBUPW51bGw9PVM/W18sd106bnVsbD09eD9beSxNXTpMcihbeSxNXSxbUyxrXSxbeCxiXSxbXyx3XSksUj15LVRbMF0sRD1NLVRbMV0sUD14LVRbMF0sVT1iLVRbMV0saj0xL01hdGguc2luKE1hdGguYWNvcygoUipQK0QqVSkvKE1hdGguc3FydChSKlIrRCpEKSpNYXRoLnNxcnQoUCpQK1UqVSkpKS8yKSxGPU1hdGguc3FydChUWzBdKlRbMF0rVFsxXSpUWzFdKTtpZihudWxsIT14KXt2YXIgSD1NYXRoLm1pbihwLChsLUYpLyhqKzEpKSxPPWZvKG51bGw9PVM/W18sd106W1Msa10sW3ksTV0sbCxILGcpLEk9Zm8oW3gsYl0sW18sd10sbCxILGcpO3A9PT1IP04ucHVzaCgiTSIsT1swXSwiQSIsSCwiLCIsSCwiIDAgMCwiLHYsIiAiLE9bMV0sIkEiLGwsIiwiLGwsIiAwICIsMS1nXnNvKE9bMV1bMF0sT1sxXVsxXSxJWzFdWzBdLElbMV1bMV0pLCIsIixnLCIgIixJWzFdLCJBIixILCIsIixILCIgMCAwLCIsdiwiICIsSVswXSk6Ti5wdXNoKCJNIixPWzBdLCJBIixILCIsIixILCIgMCAxLCIsdiwiICIsSVswXSl9ZWxzZSBOLnB1c2goIk0iLHksIiwiLE0pO2lmKG51bGwhPVMpe3ZhciBZPU1hdGgubWluKHAsKG4tRikvKGotMSkpLFo9Zm8oW3ksTV0sW1Msa10sbiwtWSxnKSxWPWZvKFtfLHddLG51bGw9PXg/W3ksTV06W3gsYl0sbiwtWSxnKTtwPT09WT9OLnB1c2goIkwiLFZbMF0sIkEiLFksIiwiLFksIiAwIDAsIix2LCIgIixWWzFdLCJBIixuLCIsIixuLCIgMCAiLGdec28oVlsxXVswXSxWWzFdWzFdLFpbMV1bMF0sWlsxXVsxXSksIiwiLDEtZywiICIsWlsxXSwiQSIsWSwiLCIsWSwiIDAgMCwiLHYsIiAiLFpbMF0pOk4ucHVzaCgiTCIsVlswXSwiQSIsWSwiLCIsWSwiIDAgMCwiLHYsIiAiLFpbMF0pfWVsc2UgTi5wdXNoKCJMIixfLCIsIix3KX1lbHNlIE4ucHVzaCgiTSIseSwiLCIsTSksbnVsbCE9eCYmTi5wdXNoKCJBIixsLCIsIixsLCIgMCAiLEMsIiwiLGcsIiAiLHgsIiwiLGIpLE4ucHVzaCgiTCIsXywiLCIsdyksbnVsbCE9UyYmTi5wdXNoKCJBIixuLCIsIixuLCIgMCAiLHEsIiwiLDEtZywiICIsUywiLCIsayk7cmV0dXJuIE4ucHVzaCgiWiIpLE4uam9pbigiIil9ZnVuY3Rpb24gdChuLHQpe3JldHVybiJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiKy1uKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIitufXZhciBlPWlvLHI9b28sdT11byxpPWtsLG89YW8sYT1jbyxjPWxvO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUV0KHQpLG4pOmV9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RXQodCksbik6cn0sbi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9RXQodCksbik6dX0sbi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dD09a2w/a2w6RXQodCksbik6aX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHQpLG4pOm99LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RXQodCksbik6YX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1FdCh0KSxuKTpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIG49KCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHQ9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLVJhO3JldHVybltNYXRoLmNvcyh0KSpuLE1hdGguc2luKHQpKm5dfSxufTt2YXIga2w9ImF1dG8iO3RhLnN2Zy5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIGhvKHkpfTt2YXIgRWw9dGEubWFwKHtsaW5lYXI6Z28sImxpbmVhci1jbG9zZWQiOnBvLHN0ZXA6dm8sInN0ZXAtYmVmb3JlIjptbywic3RlcC1hZnRlciI6eW8sYmFzaXM6U28sImJhc2lzLW9wZW4iOmtvLCJiYXNpcy1jbG9zZWQiOkVvLGJ1bmRsZTpBbyxjYXJkaW5hbDpibywiY2FyZGluYWwtb3BlbiI6TW8sImNhcmRpbmFsLWNsb3NlZCI6eG8sbW9ub3RvbmU6VG99KTtFbC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7dC5rZXk9bix0LmNsb3NlZD0vLWNsb3NlZCQvLnRlc3Qobil9KTt2YXIgQWw9WzAsMi8zLDEvMywwXSxObD1bMCwxLzMsMi8zLDBdLENsPVswLDEvNiwyLzMsMS82XTt0YS5zdmcubGluZS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1obyhSbyk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uYW5nbGU9bi55LGRlbGV0ZSBuLnksbn0sbW8ucmV2ZXJzZT15byx5by5yZXZlcnNlPW1vLHRhLnN2Zy5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIERvKHkpfSx0YS5zdmcuYXJlYS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1EbyhSbyk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uaW5uZXJSYWRpdXM9bi54MCxkZWxldGUgbi54MCxuLm91dGVyUmFkaXVzPW4ueDEsZGVsZXRlIG4ueDEsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxuLnN0YXJ0QW5nbGU9bi55MCxkZWxldGUgbi55MCxuLmVuZEFuZ2xlPW4ueTEsZGVsZXRlIG4ueTEsbn0sdGEuc3ZnLmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGEpe3ZhciBjPXQodGhpcyxpLG4sYSksbD10KHRoaXMsbyxuLGEpO3JldHVybiJNIitjLnAwK3IoYy5yLGMucDEsYy5hMS1jLmEwKSsoZShjLGwpP3UoYy5yLGMucDEsYy5yLGMucDApOnUoYy5yLGMucDEsbC5yLGwucDApK3IobC5yLGwucDEsbC5hMS1sLmEwKSt1KGwucixsLnAxLGMucixjLnAwKSkrIloifWZ1bmN0aW9uIHQobix0LGUscil7dmFyIHU9dC5jYWxsKG4sZSxyKSxpPWEuY2FsbChuLHUsciksbz1jLmNhbGwobix1LHIpLVJhLHM9bC5jYWxsKG4sdSxyKS1SYTtyZXR1cm57cjppLGEwOm8sYTE6cyxwMDpbaSpNYXRoLmNvcyhvKSxpKk1hdGguc2luKG8pXSxwMTpbaSpNYXRoLmNvcyhzKSxpKk1hdGguc2luKHMpXX19ZnVuY3Rpb24gZShuLHQpe3JldHVybiBuLmEwPT10LmEwJiZuLmExPT10LmExfWZ1bmN0aW9uIHIobix0LGUpe3JldHVybiJBIituKyIsIituKyIgMCAiKyArKGU+cWEpKyIsMSAiK3R9ZnVuY3Rpb24gdShuLHQsZSxyKXtyZXR1cm4iUSAwLDAgIityfXZhciBpPW1yLG89eXIsYT1QbyxjPWFvLGw9Y287cmV0dXJuIG4ucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUV0KHQpLG4pOmF9LG4uc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUV0KHQpLG4pOml9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHQpLG4pOm99LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1FdCh0KSxuKTpjfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUV0KHQpLG4pOmx9LG59LHRhLnN2Zy5kaWFnb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgaT10LmNhbGwodGhpcyxuLHUpLG89ZS5jYWxsKHRoaXMsbix1KSxhPShpLnkrby55KS8yLGM9W2kse3g6aS54LHk6YX0se3g6by54LHk6YX0sb107cmV0dXJuIGM9Yy5tYXAociksIk0iK2NbMF0rIkMiK2NbMV0rIiAiK2NbMl0rIiAiK2NbM119dmFyIHQ9bXIsZT15cixyPVVvO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1FdChlKSxuKTp0fSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1FdCh0KSxuKTplfSxuLnByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxufSx0YS5zdmcuZGlhZ29uYWwucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49dGEuc3ZnLmRpYWdvbmFsKCksdD1VbyxlPW4ucHJvamVjdGlvbjtyZXR1cm4gbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2Uoam8odD1uKSk6dH0sbn0sdGEuc3ZnLnN5bWJvbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtyZXR1cm4oemwuZ2V0KHQuY2FsbCh0aGlzLG4scikpfHxPbykoZS5jYWxsKHRoaXMsbixyKSl9dmFyIHQ9SG8sZT1GbztyZXR1cm4gbi50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUV0KGUpLG4pOnR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1FdCh0KSxuKTplfSxufTt2YXIgemw9dGEubWFwKHtjaXJjbGU6T28sY3Jvc3M6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vNSkvMjtyZXR1cm4iTSIrLTMqdCsiLCIrLXQrIkgiKy10KyJWIistMyp0KyJIIit0KyJWIistdCsiSCIrMyp0KyJWIit0KyJIIit0KyJWIiszKnQrIkgiKy10KyJWIit0KyJIIistMyp0KyJaIn0sZGlhbW9uZDpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi8oMipMbCkpLGU9dCpMbDtyZXR1cm4iTTAsIistdCsiTCIrZSsiLDAgMCwiK3QrIiAiKy1lKyIsMFoifSxzcXVhcmU6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4pLzI7cmV0dXJuIk0iKy10KyIsIistdCsiTCIrdCsiLCIrLXQrIiAiK3QrIiwiK3QrIiAiKy10KyIsIit0KyJaIn0sInRyaWFuZ2xlLWRvd24iOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL3FsKSxlPXQqcWwvMjtyZXR1cm4iTTAsIitlKyJMIit0KyIsIistZSsiICIrLXQrIiwiKy1lKyJaIn0sInRyaWFuZ2xlLXVwIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi9xbCksZT10KnFsLzI7cmV0dXJuIk0wLCIrLWUrIkwiK3QrIiwiK2UrIiAiKy10KyIsIitlKyJaIn19KTt0YS5zdmcuc3ltYm9sVHlwZXM9emwua2V5cygpO3ZhciBxbD1NYXRoLnNxcnQoMyksTGw9TWF0aC50YW4oMzAqRGEpO19hLnRyYW5zaXRpb249ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscj1UbHx8KytVbCx1PVhvKG4pLGk9W10sbz1SbHx8e3RpbWU6RGF0ZS5ub3coKSxlYXNlOlN1LGRlbGF5OjAsZHVyYXRpb246MjUwfSxhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtpLnB1c2godD1bXSk7Zm9yKHZhciBsPXRoaXNbYV0scz0tMSxmPWwubGVuZ3RoOysrczxmOykoZT1sW3NdKSYmJG8oZSxzLHUscixvKSx0LnB1c2goZSl9cmV0dXJuIFlvKGksdSxyKX0sX2EuaW50ZXJydXB0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2gobnVsbD09bj9EbDpJbyhYbyhuKSkpfTt2YXIgVGwsUmwsRGw9SW8oWG8oKSksUGw9W10sVWw9MDtQbC5jYWxsPV9hLmNhbGwsUGwuZW1wdHk9X2EuZW1wdHksUGwubm9kZT1fYS5ub2RlLFBsLnNpemU9X2Euc2l6ZSx0YS50cmFuc2l0aW9uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4udHJhbnNpdGlvbj9UbD9uLnRyYW5zaXRpb24odCk6bjp0YS5zZWxlY3Rpb24oKS50cmFuc2l0aW9uKG4pfSx0YS50cmFuc2l0aW9uLnByb3RvdHlwZT1QbCxQbC5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9dGhpcy5pZCxpPXRoaXMubmFtZXNwYWNlLG89W107bj1OKG4pO2Zvcih2YXIgYT0tMSxjPXRoaXMubGVuZ3RoOysrYTxjOyl7by5wdXNoKHQ9W10pO2Zvcih2YXIgbD10aGlzW2FdLHM9LTEsZj1sLmxlbmd0aDsrK3M8ZjspKHI9bFtzXSkmJihlPW4uY2FsbChyLHIuX19kYXRhX18scyxhKSk/KCJfX2RhdGFfXyJpbiByJiYoZS5fX2RhdGFfXz1yLl9fZGF0YV9fKSwkbyhlLHMsaSx1LHJbaV1bdV0pLHQucHVzaChlKSk6dC5wdXNoKG51bGwpfXJldHVybiBZbyhvLGksdSl9LFBsLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG89dGhpcy5pZCxhPXRoaXMubmFtZXNwYWNlLGM9W107bj1DKG4pO2Zvcih2YXIgbD0tMSxzPXRoaXMubGVuZ3RoOysrbDxzOylmb3IodmFyIGY9dGhpc1tsXSxoPS0xLGc9Zi5sZW5ndGg7KytoPGc7KWlmKHI9ZltoXSl7aT1yW2FdW29dLGU9bi5jYWxsKHIsci5fX2RhdGFfXyxoLGwpLGMucHVzaCh0PVtdKTtmb3IodmFyIHA9LTEsdj1lLmxlbmd0aDsrK3A8djspKHU9ZVtwXSkmJiRvKHUscCxhLG8saSksdC5wdXNoKHUpfXJldHVybiBZbyhjLGEsbyl9LFBsLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsbz10aGlzLmxlbmd0aDtvPmk7aSsrKXt1LnB1c2godD1bXSk7Zm9yKHZhciBlPXRoaXNbaV0sYT0wLGM9ZS5sZW5ndGg7Yz5hO2ErKykocj1lW2FdKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxhLGkpJiZ0LnB1c2gocil9cmV0dXJuIFlvKHUsdGhpcy5uYW1lc3BhY2UsdGhpcy5pZCl9LFBsLnR3ZWVuPWZ1bmN0aW9uKG4sdCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpcy5ub2RlKClbcl1bZV0udHdlZW4uZ2V0KG4pOlkodGhpcyxudWxsPT10P2Z1bmN0aW9uKHQpe3Rbcl1bZV0udHdlZW4ucmVtb3ZlKG4pfTpmdW5jdGlvbih1KXt1W3JdW2VdLnR3ZWVuLnNldChuLHQpfSl9LFBsLmF0dHI9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUoYSl9ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKX1mdW5jdGlvbiB1KG4pe3JldHVybiBudWxsPT1uP2U6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZShhKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZShhLHQobikpfSl9KX1mdW5jdGlvbiBpKG4pe3JldHVybiBudWxsPT1uP3I6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCk7cmV0dXJuIGUhPT1uJiYodD1vKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwsdChuKSl9KX0pfWlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHQgaW4gbil0aGlzLmF0dHIodCxuW3RdKTtyZXR1cm4gdGhpc312YXIgbz0idHJhbnNmb3JtIj09bj9IdTptdSxhPXRhLm5zLnF1YWxpZnkobik7cmV0dXJuIFpvKHRoaXMsImF0dHIuIituLHQsYS5sb2NhbD9pOnUpfSxQbC5hdHRyVHdlZW49ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlKHUpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUodSxyKG4pKX19ZnVuY3Rpb24gcihuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZU5TKHUuc3BhY2UsdS5sb2NhbCkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHUuc3BhY2UsdS5sb2NhbCxyKG4pKX19dmFyIHU9dGEubnMucXVhbGlmeShuKTtyZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iK24sdS5sb2NhbD9yOmUpfSxQbC5zdHlsZT1mdW5jdGlvbihuLGUscil7ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gaShlKXtyZXR1cm4gbnVsbD09ZT91OihlKz0iIixmdW5jdGlvbigpe3ZhciB1LGk9dCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gaSE9PWUmJih1PW11KGksZSksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHUodCkscil9KX0pfXZhciBvPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5vKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+byYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5zdHlsZShyLG5bcl0sZSk7cmV0dXJuIHRoaXN9cj0iIn1yZXR1cm4gWm8odGhpcywic3R5bGUuIituLGUsaSl9LFBsLnN0eWxlVHdlZW49ZnVuY3Rpb24obixlLHIpe2Z1bmN0aW9uIHUodSxpKXt2YXIgbz1lLmNhbGwodGhpcyx1LGksdCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKSk7cmV0dXJuIG8mJmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobixvKHQpLHIpfX1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwzJiYocj0iIiksdGhpcy50d2Vlbigic3R5bGUuIituLHUpfSxQbC50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBabyh0aGlzLCJ0ZXh0IixuLFZvKX0sUGwucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYW1lc3BhY2U7cmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLGZ1bmN0aW9uKCl7dmFyIHQ7dGhpc1tuXS5jb3VudDwyJiYodD10aGlzLnBhcmVudE5vZGUpJiZ0LnJlbW92ZUNoaWxkKHRoaXMpfSl9LFBsLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZWFzZTooImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPXRhLmVhc2UuYXBwbHkodGEsYXJndW1lbnRzKSksWSh0aGlzLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZWFzZT1ufSkpfSxQbC5kZWxheT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5kZWxheTpZKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24ocix1LGkpe3JbZV1bdF0uZGVsYXk9K24uY2FsbChyLHIuX19kYXRhX18sdSxpKX06KG49K24sZnVuY3Rpb24ocil7cltlXVt0XS5kZWxheT1ufSkpfSxQbC5kdXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5kdXJhdGlvbjpZKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24ocix1LGkpe3JbZV1bdF0uZHVyYXRpb249TWF0aC5tYXgoMSxuLmNhbGwocixyLl9fZGF0YV9fLHUsaSkpfToobj1NYXRoLm1heCgxLG4pLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZHVyYXRpb249bn0pKX0sUGwuZWFjaD1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciB1PVJsLGk9VGw7dHJ5e1RsPWUsWSh0aGlzLGZ1bmN0aW9uKHQsdSxpKXtSbD10W3JdW2VdLG4uY2FsbCh0LHQuX19kYXRhX18sdSxpKX0pfWZpbmFsbHl7Umw9dSxUbD1pfX1lbHNlIFkodGhpcyxmdW5jdGlvbih1KXt2YXIgaT11W3JdW2VdOyhpLmV2ZW50fHwoaS5ldmVudD10YS5kaXNwYXRjaCgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSkpLm9uKG4sdCl9KTtyZXR1cm4gdGhpc30sUGwudHJhbnNpdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgbix0LGUscix1PXRoaXMuaWQsaT0rK1VsLG89dGhpcy5uYW1lc3BhY2UsYT1bXSxjPTAsbD10aGlzLmxlbmd0aDtsPmM7YysrKXthLnB1c2gobj1bXSk7Zm9yKHZhciB0PXRoaXNbY10scz0wLGY9dC5sZW5ndGg7Zj5zO3MrKykoZT10W3NdKSYmKHI9ZVtvXVt1XSwkbyhlLHMsbyxpLHt0aW1lOnIudGltZSxlYXNlOnIuZWFzZSxkZWxheTpyLmRlbGF5K3IuZHVyYXRpb24sZHVyYXRpb246ci5kdXJhdGlvbn0pKSxuLnB1c2goZSl9cmV0dXJuIFlvKGEsbyxpKX0sdGEuc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuLGw9dGEuc2VsZWN0KHRoaXMpLHM9dGhpcy5fX2NoYXJ0X198fGUsZj10aGlzLl9fY2hhcnRfXz1lLmNvcHkoKSxoPW51bGw9PWM/Zi50aWNrcz9mLnRpY2tzLmFwcGx5KGYsYSk6Zi5kb21haW4oKTpjLGc9bnVsbD09dD9mLnRpY2tGb3JtYXQ/Zi50aWNrRm9ybWF0LmFwcGx5KGYsYSk6eTp0LHA9bC5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShoLGYpLHY9cC5lbnRlcigpLmluc2VydCgiZyIsIi5kb21haW4iKS5hdHRyKCJjbGFzcyIsInRpY2siKS5zdHlsZSgib3BhY2l0eSIsQ2EpLGQ9dGEudHJhbnNpdGlvbihwLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLENhKS5yZW1vdmUoKSxtPXRhLnRyYW5zaXRpb24ocC5vcmRlcigpKS5zdHlsZSgib3BhY2l0eSIsMSksTT1NYXRoLm1heCh1LDApK28seD1VaShmKSxiPWwuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLF89KGIuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLHRhLnRyYW5zaXRpb24oYikpO3YuYXBwZW5kKCJsaW5lIiksdi5hcHBlbmQoInRleHQiKTt2YXIgdyxTLGssRSxBPXYuc2VsZWN0KCJsaW5lIiksTj1tLnNlbGVjdCgibGluZSIpLEM9cC5zZWxlY3QoInRleHQiKS50ZXh0KGcpLHo9di5zZWxlY3QoInRleHQiKSxxPW0uc2VsZWN0KCJ0ZXh0IiksTD0idG9wIj09PXJ8fCJsZWZ0Ij09PXI/LTE6MTtpZigiYm90dG9tIj09PXJ8fCJ0b3AiPT09cj8obj1Cbyx3PSJ4IixrPSJ5IixTPSJ4MiIsRT0ieTIiLEMuYXR0cigiZHkiLDA+TD8iMGVtIjoiLjcxZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxfLmF0dHIoImQiLCJNIit4WzBdKyIsIitMKmkrIlYwSCIreFsxXSsiViIrTCppKSk6KG49V28sdz0ieSIsaz0ieCIsUz0ieTIiLEU9IngyIixDLmF0dHIoImR5IiwiLjMyZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLDA+TD8iZW5kIjoic3RhcnQiKSxfLmF0dHIoImQiLCJNIitMKmkrIiwiK3hbMF0rIkgwViIreFsxXSsiSCIrTCppKSksQS5hdHRyKEUsTCp1KSx6LmF0dHIoayxMKk0pLE4uYXR0cihTLDApLmF0dHIoRSxMKnUpLHEuYXR0cih3LDApLmF0dHIoayxMKk0pLGYucmFuZ2VCYW5kKXt2YXIgVD1mLFI9VC5yYW5nZUJhbmQoKS8yO3M9Zj1mdW5jdGlvbihuKXtyZXR1cm4gVChuKStSfX1lbHNlIHMucmFuZ2VCYW5kP3M9ZjpkLmNhbGwobixmLHMpO3YuY2FsbChuLHMsZiksbS5jYWxsKG4sZixmKX0pfXZhciB0LGU9dGEuc2NhbGUubGluZWFyKCkscj1qbCx1PTYsaT02LG89MyxhPVsxMF0sYz1udWxsO3JldHVybiBuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5vcmllbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCBpbiBGbD90KyIiOmpsLG4pOnJ9LG4udGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1hcmd1bWVudHMsbik6YX0sbi50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQsbik6Y30sbi50aWNrRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi50aWNrU2l6ZT1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBlPyh1PSt0LGk9K2FyZ3VtZW50c1tlLTFdLG4pOnV9LG4uaW5uZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxuKTp1fSxuLm91dGVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbik6aX0sbi50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSxuLnRpY2tTdWJkaXZpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCYmbn0sbn07dmFyIGpsPSJib3R0b20iLEZsPXt0b3A6MSxyaWdodDoxLGJvdHRvbToxLGxlZnQ6MX07dGEuc3ZnLmJydXNoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD10YS5zZWxlY3QodGhpcykuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIixpKS5vbigidG91Y2hzdGFydC5icnVzaCIsaSksbz10LnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFswXSk7by5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiYmFja2dyb3VuZCIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikuc3R5bGUoImN1cnNvciIsImNyb3NzaGFpciIpLHQuc2VsZWN0QWxsKCIuZXh0ZW50IikuZGF0YShbMF0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJleHRlbnQiKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpO3ZhciBhPXQuc2VsZWN0QWxsKCIucmVzaXplIikuZGF0YSh2LHkpO2EuZXhpdCgpLnJlbW92ZSgpLGEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24obil7cmV0dXJuInJlc2l6ZSAiK259KS5zdHlsZSgiY3Vyc29yIixmdW5jdGlvbihuKXtyZXR1cm4gSGxbbl19KS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IixmdW5jdGlvbihuKXtyZXR1cm4vW2V3XSQvLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoInkiLGZ1bmN0aW9uKG4pe3JldHVybi9eW25zXS8udGVzdChuKT8tMzpudWxsfSkuYXR0cigid2lkdGgiLDYpLmF0dHIoImhlaWdodCIsNikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxhLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpO3ZhciBjLGY9dGEudHJhbnNpdGlvbih0KSxoPXRhLnRyYW5zaXRpb24obyk7bCYmKGM9VWkobCksaC5hdHRyKCJ4IixjWzBdKS5hdHRyKCJ3aWR0aCIsY1sxXS1jWzBdKSxyKGYpKSxzJiYoYz1VaShzKSxoLmF0dHIoInkiLGNbMF0pLmF0dHIoImhlaWdodCIsY1sxXS1jWzBdKSx1KGYpKSxlKGYpfSl9ZnVuY3Rpb24gZShuKXtuLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgiK2ZbKy9lJC8udGVzdChuKV0rIiwiK2hbKy9ecy8udGVzdChuKV0rIikifSl9ZnVuY3Rpb24gcihuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLGZbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixmWzFdLWZbMF0pfWZ1bmN0aW9uIHUobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixoWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGhbMV0taFswXSl9ZnVuY3Rpb24gaSgpe2Z1bmN0aW9uIGkoKXszMj09dGEuZXZlbnQua2V5Q29kZSYmKEN8fChNPW51bGwscVswXS09ZlsxXSxxWzFdLT1oWzFdLEM9MiksUygpKX1mdW5jdGlvbiB2KCl7MzI9PXRhLmV2ZW50LmtleUNvZGUmJjI9PUMmJihxWzBdKz1mWzFdLHFbMV0rPWhbMV0sQz0wLFMoKSl9ZnVuY3Rpb24gZCgpe3ZhciBuPXRhLm1vdXNlKGIpLHQ9ITE7eCYmKG5bMF0rPXhbMF0sblsxXSs9eFsxXSksQ3x8KHRhLmV2ZW50LmFsdEtleT8oTXx8KE09WyhmWzBdK2ZbMV0pLzIsKGhbMF0raFsxXSkvMl0pLHFbMF09ZlsrKG5bMF08TVswXSldLHFbMV09aFsrKG5bMV08TVsxXSldKTpNPW51bGwpLEEmJm0obixsLDApJiYocihrKSx0PSEwKSxOJiZtKG4scywxKSYmKHUoayksdD0hMCksdCYmKGUoayksdyh7dHlwZToiYnJ1c2giLG1vZGU6Qz8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gbShuLHQsZSl7dmFyIHIsdSxpPVVpKHQpLGM9aVswXSxsPWlbMV0scz1xW2VdLHY9ZT9oOmYsZD12WzFdLXZbMF07cmV0dXJuIEMmJihjLT1zLGwtPWQrcykscj0oZT9wOmcpP01hdGgubWF4KGMsTWF0aC5taW4obCxuW2VdKSk6bltlXSxDP3U9KHIrPXMpK2Q6KE0mJihzPU1hdGgubWF4KGMsTWF0aC5taW4obCwyKk1bZV0tcikpKSxyPnM/KHU9cixyPXMpOnU9cyksdlswXSE9cnx8dlsxXSE9dT8oZT9hPW51bGw6bz1udWxsLHZbMF09cix2WzFdPXUsITApOnZvaWQgMH1mdW5jdGlvbiB5KCl7ZCgpLGsuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCksdGEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCksTC5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSx6KCksdyh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIE0seCxiPXRoaXMsXz10YS5zZWxlY3QodGEuZXZlbnQudGFyZ2V0KSx3PWMub2YoYixhcmd1bWVudHMpLGs9dGEuc2VsZWN0KGIpLEU9Xy5kYXR1bSgpLEE9IS9eKG58cykkLy50ZXN0KEUpJiZsLE49IS9eKGV8dykkLy50ZXN0KEUpJiZzLEM9Xy5jbGFzc2VkKCJleHRlbnQiKSx6PVcoYikscT10YS5tb3VzZShiKSxMPXRhLnNlbGVjdCh0KGIpKS5vbigia2V5ZG93bi5icnVzaCIsaSkub24oImtleXVwLmJydXNoIix2KTtpZih0YS5ldmVudC5jaGFuZ2VkVG91Y2hlcz9MLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLGQpLm9uKCJ0b3VjaGVuZC5icnVzaCIseSk6TC5vbigibW91c2Vtb3ZlLmJydXNoIixkKS5vbigibW91c2V1cC5icnVzaCIseSksay5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxDKXFbMF09ZlswXS1xWzBdLHFbMV09aFswXS1xWzFdO2Vsc2UgaWYoRSl7dmFyIFQ9Ky93JC8udGVzdChFKSxSPSsvXm4vLnRlc3QoRSk7eD1bZlsxLVRdLXFbMF0saFsxLVJdLXFbMV1dLHFbMF09ZltUXSxxWzFdPWhbUl19ZWxzZSB0YS5ldmVudC5hbHRLZXkmJihNPXEuc2xpY2UoKSk7ay5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHRhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLF8uc3R5bGUoImN1cnNvciIpKSx3KHt0eXBlOiJicnVzaHN0YXJ0In0pLGQoKX12YXIgbyxhLGM9RShuLCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLGw9bnVsbCxzPW51bGwsZj1bMCwwXSxoPVswLDBdLGc9ITAscD0hMCx2PU9sWzBdO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPWMub2YodGhpcyxhcmd1bWVudHMpLHQ9e3g6Zix5OmgsaTpvLGo6YX0sZT10aGlzLl9fY2hhcnRfX3x8dDt0aGlzLl9fY2hhcnRfXz10LFRsP3RhLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7bz1lLmksYT1lLmosZj1lLngsaD1lLnksbih7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgZT15dShmLHQueCkscj15dShoLHQueSk7cmV0dXJuIG89YT1udWxsLGZ1bmN0aW9uKHUpe2Y9dC54PWUodSksaD10Lnk9cih1KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXtvPXQuaSxhPXQuaixuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pfSk6KG4oe3R5cGU6ImJydXNoc3RhcnQifSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsdj1PbFshbDw8MXwhc10sbik6bH0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsdj1PbFshbDw8MXwhc10sbik6c30sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obCYmcz8oZz0hIXRbMF0scD0hIXRbMV0pOmw/Zz0hIXQ6cyYmKHA9ISF0KSxuKTpsJiZzP1tnLHBdOmw/ZzpzP3A6bnVsbH0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGUscix1LGksYztyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obCYmKGU9dFswXSxyPXRbMV0scyYmKGU9ZVswXSxyPXJbMF0pLG89W2Uscl0sbC5pbnZlcnQmJihlPWwoZSkscj1sKHIpKSxlPnImJihjPWUsZT1yLHI9YyksKGUhPWZbMF18fHIhPWZbMV0pJiYoZj1bZSxyXSkpLHMmJih1PXRbMF0saT10WzFdLGwmJih1PXVbMV0saT1pWzFdKSxhPVt1LGldLHMuaW52ZXJ0JiYodT1zKHUpLGk9cyhpKSksdT5pJiYoYz11LHU9aSxpPWMpLCh1IT1oWzBdfHxpIT1oWzFdKSYmKGg9W3UsaV0pKSxuKToobCYmKG8/KGU9b1swXSxyPW9bMV0pOihlPWZbMF0scj1mWzFdLGwuaW52ZXJ0JiYoZT1sLmludmVydChlKSxyPWwuaW52ZXJ0KHIpKSxlPnImJihjPWUsZT1yLHI9YykpKSxzJiYoYT8odT1hWzBdLGk9YVsxXSk6KHU9aFswXSxpPWhbMV0scy5pbnZlcnQmJih1PXMuaW52ZXJ0KHUpLGk9cy5pbnZlcnQoaSkpLHU+aSYmKGM9dSx1PWksaT1jKSkpLGwmJnM/W1tlLHVdLFtyLGldXTpsP1tlLHJdOnMmJlt1LGldKX0sbi5jbGVhcj1mdW5jdGlvbigpe3JldHVybiBuLmVtcHR5KCl8fChmPVswLDBdLGg9WzAsMF0sbz1hPW51bGwpLG59LG4uZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hIWwmJmZbMF09PWZbMV18fCEhcyYmaFswXT09aFsxXX0sdGEucmViaW5kKG4sYywib24iKX07dmFyIEhsPXtuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LE9sPVtbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLFsiZSIsInciXSxbIm4iLCJzIl0sW11dLElsPWFjLmZvcm1hdD1nYy50aW1lRm9ybWF0LFlsPUlsLnV0YyxabD1ZbCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7SWwuaXNvPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nJiYrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP0pvOlpsLEpvLnBhcnNlPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBEYXRlKG4pO3JldHVybiBpc05hTih0KT9udWxsOnR9LEpvLnRvU3RyaW5nPVpsLnRvU3RyaW5nLGFjLnNlY29uZD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGNjKDFlMypNYXRoLmZsb29yKG4vMWUzKSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzFlMypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfSksYWMuc2Vjb25kcz1hYy5zZWNvbmQucmFuZ2UsYWMuc2Vjb25kcy51dGM9YWMuc2Vjb25kLnV0Yy5yYW5nZSxhYy5taW51dGU9RnQoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBjYyg2ZTQqTWF0aC5mbG9vcihuLzZlNCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSs2ZTQqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX0pLGFjLm1pbnV0ZXM9YWMubWludXRlLnJhbmdlLGFjLm1pbnV0ZXMudXRjPWFjLm1pbnV0ZS51dGMucmFuZ2UsYWMuaG91cj1GdChmdW5jdGlvbihuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBjYygzNmU1KihNYXRoLmZsb29yKG4vMzZlNS10KSt0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9KSxhYy5ob3Vycz1hYy5ob3VyLnJhbmdlLGFjLmhvdXJzLnV0Yz1hYy5ob3VyLnV0Yy5yYW5nZSxhYy5tb250aD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1hYy5kYXkobiksbi5zZXREYXRlKDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRNb250aChuLmdldE1vbnRoKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9KSxhYy5tb250aHM9YWMubW9udGgucmFuZ2UsYWMubW9udGhzLnV0Yz1hYy5tb250aC51dGMucmFuZ2U7dmFyIFZsPVsxZTMsNWUzLDE1ZTMsM2U0LDZlNCwzZTUsOWU1LDE4ZTUsMzZlNSwxMDhlNSwyMTZlNSw0MzJlNSw4NjRlNSwxNzI4ZTUsNjA0OGU1LDI1OTJlNiw3Nzc2ZTYsMzE1MzZlNl0sWGw9W1thYy5zZWNvbmQsMV0sW2FjLnNlY29uZCw1XSxbYWMuc2Vjb25kLDE1XSxbYWMuc2Vjb25kLDMwXSxbYWMubWludXRlLDFdLFthYy5taW51dGUsNV0sW2FjLm1pbnV0ZSwxNV0sW2FjLm1pbnV0ZSwzMF0sW2FjLmhvdXIsMV0sW2FjLmhvdXIsM10sW2FjLmhvdXIsNl0sW2FjLmhvdXIsMTJdLFthYy5kYXksMV0sW2FjLmRheSwyXSxbYWMud2VlaywxXSxbYWMubW9udGgsMV0sW2FjLm1vbnRoLDNdLFthYy55ZWFyLDFdXSwkbD1JbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKSYmMSE9bi5nZXREYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXREYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfV0sWyIlWSIsTmVdXSksQmw9e3JhbmdlOmZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gdGEucmFuZ2UoTWF0aC5jZWlsKG4vZSkqZSwrdCxlKS5tYXAoS28pfSxmbG9vcjp5LGNlaWw6eX07WGwueWVhcj1hYy55ZWFyLGFjLnNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIEdvKHRhLnNjYWxlLmxpbmVhcigpLFhsLCRsKX07dmFyIFdsPVhsLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bblswXS51dGMsblsxXV19KSxKbD1ZbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ1NlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0hvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENEYXkoKSYmMSE9bi5nZXRVVENEYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXRVVENEYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNb250aCgpfV0sWyIlWSIsTmVdXSk7V2wueWVhcj1hYy55ZWFyLnV0YyxhYy5zY2FsZS51dGM9ZnVuY3Rpb24oKXtyZXR1cm4gR28odGEuc2NhbGUubGluZWFyKCksV2wsSmwpfSx0YS50ZXh0PUF0KGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlc3BvbnNlVGV4dH0pLHRhLmpzb249ZnVuY3Rpb24obix0KXtyZXR1cm4gTnQobiwiYXBwbGljYXRpb24vanNvbiIsUW8sdCl9LHRhLmh0bWw9ZnVuY3Rpb24obix0KXtyZXR1cm4gTnQobiwidGV4dC9odG1sIixuYSx0KX0sdGEueG1sPUF0KGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlc3BvbnNlWE1MfSksImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodGEpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyYmKG1vZHVsZS5leHBvcnRzPXRhKSx0aGlzLmQzPXRhfSgpOw=="></script>
<link href="data:text/css;charset=utf-8,%2Eparcoords%20%3E%20svg%2C%20%2Eparcoords%20%3E%20canvas%20%7B%0Afont%3A%2014px%20sans%2Dserif%3B%0Aposition%3A%20absolute%3B%0A%7D%0A%2Eparcoords%20%3E%20canvas%20%7B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Eparcoords%20text%2Elabel%20%7B%0Acursor%3A%20default%3B%0A%7D%0A%2Eparcoords%20rect%2Ebackground%20%7B%0Afill%3A%20transparent%3B%0A%7D%0A%2Eparcoords%20rect%2Ebackground%3Ahover%20%7B%0Afill%3A%20rgba%28120%2C120%2C120%2C0%2E2%29%3B%0A%7D%0A%2Eparcoords%20%2Eresize%20rect%20%7B%0Afill%3A%20rgba%280%2C0%2C0%2C0%2E1%29%3B%0A%7D%0A%2Eparcoords%20rect%2Eextent%20%7B%0Afill%3A%20rgba%28255%2C255%2C255%2C0%2E25%29%3B%0Astroke%3A%20rgba%280%2C0%2C0%2C0%2E6%29%3B%0A%7D%0A%2Eparcoords%20%2Eaxis%20line%2C%20%2Eparcoords%20%2Eaxis%20path%20%7B%0Afill%3A%20none%3B%0Astroke%3A%20%23222%3B%0Ashape%2Drendering%3A%20crispEdges%3B%0A%7D%0A%2Eparcoords%20canvas%20%7B%0Aopacity%3A%201%3B%0A%2Dmoz%2Dtransition%3A%20opacity%200%2E3s%3B%0A%2Dwebkit%2Dtransition%3A%20opacity%200%2E3s%3B%0A%2Do%2Dtransition%3A%20opacity%200%2E3s%3B%0A%7D%0A%2Eparcoords%20canvas%2Efaded%20%7B%0Aopacity%3A%200%2E25%3B%0A%7D%0A%2Eparcoords%20%7B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0Abackground%2Dcolor%3A%20white%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uICgpIHsNCiAgZDMuc3ZnLm11bHRpYnJ1c2ggPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIEZyb20gZDMvc2NhbGUvc2NhbGUuanMNCiAgICBmdW5jdGlvbiBkM19zY2FsZUV4dGVudChkb21haW4pIHsNCiAgICAgIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07DQogICAgICByZXR1cm4gc3RhcnQgPCBzdG9wID8gWyBzdGFydCwgc3RvcCBdIDogWyBzdG9wLCBzdGFydCBdOw0KICAgIH0NCiAgICBmdW5jdGlvbiBkM19zY2FsZVJhbmdlKHNjYWxlKSB7DQogICAgICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7DQogICAgfQ0KDQogICAgLy8gRnJvbSBkMw0KICAgIHZhciBkM19kb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQ7DQogICAgZnVuY3Rpb24gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpIHsNCiAgICAgIHJldHVybiBub2RlICYmIChub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZS5kb2N1bWVudCB8fCBub2RlKS5kb2N1bWVudEVsZW1lbnQ7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGQzX3dpbmRvdyhub2RlKSB7DQogICAgICByZXR1cm4gbm9kZSAmJiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgfHwgbm9kZS5kZWZhdWx0Vmlldyk7DQogICAgfQ0KICAgIGlmIChkM19kb2N1bWVudCkgew0KICAgICAgdHJ5IHsNCiAgICAgICAgZDNfYXJyYXkoZDNfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlOw0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBkM19hcnJheSA9IGZ1bmN0aW9uKGxpc3QpIHsNCiAgICAgICAgICB2YXIgaSA9IGxpc3QubGVuZ3RoLCBhcnJheSA9IG5ldyBBcnJheShpKTsNCiAgICAgICAgICB3aGlsZSAoaS0tKSBhcnJheVtpXSA9IGxpc3RbaV07DQogICAgICAgICAgcmV0dXJuIGFycmF5Ow0KICAgICAgICB9Ow0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKSB7DQogICAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGQzX3ZlbmRvclN5bWJvbChvYmplY3QsIG5hbWUpIHsNCiAgICAgIGlmIChuYW1lIGluIG9iamVjdCkgcmV0dXJuIG5hbWU7DQogICAgICBuYW1lID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7DQogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGQzX3ZlbmRvclByZWZpeGVzLmxlbmd0aDsgaSA8IG47ICsraSkgew0KICAgICAgICB2YXIgcHJlZml4TmFtZSA9IGQzX3ZlbmRvclByZWZpeGVzW2ldICsgbmFtZTsNCiAgICAgICAgaWYgKHByZWZpeE5hbWUgaW4gb2JqZWN0KSByZXR1cm4gcHJlZml4TmFtZTsNCiAgICAgIH0NCiAgICB9DQogICAgdmFyIGQzX3ZlbmRvclByZWZpeGVzID0gWyAid2Via2l0IiwgIm1zIiwgIm1veiIsICJNb3oiLCAibyIsICJPIiBdOw0KDQogICAgdmFyIGQzX2V2ZW50X2RyYWdTZWxlY3QgPSAib25zZWxlY3RzdGFydCIgaW4gZG9jdW1lbnQgPyBudWxsIDogZDNfdmVuZG9yU3ltYm9sKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSwgInVzZXJTZWxlY3QiKSwgZDNfZXZlbnRfZHJhZ0lkID0gMDsNCiAgICBmdW5jdGlvbiBkM19ldmVudF9kcmFnU3VwcHJlc3Mobm9kZSkgew0KICAgICAgdmFyIG5hbWUgPSAiLmRyYWdzdXBwcmVzcy0iICsgKytkM19ldmVudF9kcmFnSWQsIGNsaWNrID0gImNsaWNrIiArIG5hbWUsIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KG5vZGUpKS5vbigidG91Y2htb3ZlIiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpLm9uKCJkcmFnc3RhcnQiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCkub24oInNlbGVjdHN0YXJ0IiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpOw0KICAgICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QgPT0gbnVsbCkgew0KICAgICAgICBkM19ldmVudF9kcmFnU2VsZWN0ID0gIm9uc2VsZWN0c3RhcnQiIGluIG5vZGUgPyBmYWxzZSA6IGQzX3ZlbmRvclN5bWJvbChub2RlLnN0eWxlLCAidXNlclNlbGVjdCIpOw0KICAgICAgfQ0KICAgICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QpIHsNCiAgICAgICAgdmFyIHN0eWxlID0gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpLnN0eWxlLCBzZWxlY3QgPSBzdHlsZVtkM19ldmVudF9kcmFnU2VsZWN0XTsNCiAgICAgICAgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSAibm9uZSI7DQogICAgICB9DQogICAgICByZXR1cm4gZnVuY3Rpb24oc3VwcHJlc3NDbGljaykgew0KICAgICAgICB3Lm9uKG5hbWUsIG51bGwpOw0KICAgICAgICBpZiAoZDNfZXZlbnRfZHJhZ1NlbGVjdCkgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSBzZWxlY3Q7DQogICAgICAgIGlmIChzdXBwcmVzc0NsaWNrKSB7DQogICAgICAgICAgdmFyIG9mZiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdy5vbihjbGljaywgbnVsbCk7DQogICAgICAgICAgfTsNCiAgICAgICAgICB3Lm9uKGNsaWNrLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIG9mZigpOw0KICAgICAgICAgIH0sIHRydWUpOw0KICAgICAgICAgIHNldFRpbWVvdXQob2ZmLCAwKTsNCiAgICAgICAgfQ0KICAgICAgfTsNCiAgICB9DQoNCiAgICB2YXIgZXZlbnQgPSBkMy5kaXNwYXRjaCgiYnJ1c2hzdGFydCIsICJicnVzaCIsICJicnVzaGVuZCIpLA0KICAgICAgICBicnVzaEVsZW1lbnQsDQogICAgICAgIHggPSBudWxsLCAvLyB4LXNjYWxlLCBvcHRpb25hbA0KICAgICAgICB5ID0gbnVsbCwgLy8geS1zY2FsZSwgb3B0aW9uYWwNCiAgICAgICAgeEV4dGVudCA9IFtbMCwgMF1dLCAvLyBbeDAsIHgxXSBpbiBpbnRlZ2VyIHBpeGVscw0KICAgICAgICB5RXh0ZW50ID0gW1swLCAwXV0sIC8vIFt5MCwgeTFdIGluIGludGVnZXIgcGl4ZWxzDQogICAgICAgIHhFeHRlbnREb21haW4gPSBbXSwgLy8geC1leHRlbnQgaW4gZGF0YSBzcGFjZQ0KICAgICAgICB5RXh0ZW50RG9tYWluID0gW10sIC8vIHktZXh0ZW50IGluIGRhdGEgc3BhY2UNCiAgICAgICAgeENsYW1wID0gdHJ1ZSwgLy8gd2hldGhlciB0byBjbGFtcCB0aGUgeC1leHRlbnQgdG8gdGhlIHJhbmdlDQogICAgICAgIHlDbGFtcCA9IHRydWUsIC8vIHdoZXRoZXIgdG8gY2xhbXAgdGhlIHktZXh0ZW50IHRvIHRoZSByYW5nZQ0KICAgICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1swXSwNCiAgICAgICAgcmVzaXplQWRhcHRpb24gPSBmdW5jdGlvbiAoKSB7fSwgLy8gRnVuY3Rpb24gdG8gJ2NhbGwnIG9uIG5ldyByZXNpemUgc2VsZWN0aW9uDQogICAgICAgIGV4dGVudEFkYXB0aW9uID0gZnVuY3Rpb24gKCkge307IC8vIEZ1bmN0aW9uIHRvICdjYWxsJyBvbiBuZXcgZXh0ZW50IHNlbGVjdGlvbg0KDQogICAgZXZlbnQub2YgPSBmdW5jdGlvbih0aGl6LCBhcmd1bWVudHopIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihlMSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgIHZhciBlMCA9DQogICAgICAgICAgZTEuc291cmNlRXZlbnQgPSBkMy5ldmVudDsNCiAgICAgICAgICBlMS50YXJnZXQgPSBicnVzaDsNCiAgICAgICAgICBkMy5ldmVudCA9IGUxOw0KICAgICAgICAgIGV2ZW50W2UxLnR5cGVdLmFwcGx5KHRoaXosIGFyZ3VtZW50eik7DQogICAgICAgIH0gZmluYWxseSB7DQogICAgICAgICAgZDMuZXZlbnQgPSBlMDsNCiAgICAgICAgfQ0KICAgICAgfTsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gYnJ1c2goZykgew0KICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkgew0KDQogICAgICAgIC8vIFByZXBhcmUgdGhlIGJydXNoIGNvbnRhaW5lciBmb3IgZXZlbnRzLg0KICAgICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKQ0KICAgICAgICAgICAgLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQ0KICAgICAgICAgICAgLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCAicmdiYSgwLDAsMCwwKSIpDQogICAgICAgICAgICAub24oIm1vdXNlZG93bi5icnVzaCIsIGJydXNoc3RhcnQpDQogICAgICAgICAgICAub24oInRvdWNoc3RhcnQuYnJ1c2giLCBicnVzaHN0YXJ0KTsNCg0KICAgICAgICBicnVzaEVsZW1lbnQgPSBnOw0KDQogICAgICAgIC8vIEFuIGludmlzaWJsZSwgbW91c2VhYmxlIGFyZWEgZm9yIHN0YXJ0aW5nIGEgbmV3IGJydXNoLg0KICAgICAgICB2YXIgYmFja2dyb3VuZCA9IGcuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpDQogICAgICAgICAgICAuZGF0YShbMF0pOw0KDQogICAgICAgIGJhY2tncm91bmQuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQ0KICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImJhY2tncm91bmQiKQ0KICAgICAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpDQogICAgICAgICAgICAuc3R5bGUoImN1cnNvciIsICJjcm9zc2hhaXIiKTsNCg0KICAgICAgICBkcmF3RXh0ZW50cyhnKTsNCg0KICAgICAgICAvLyBXaGVuIGNhbGxlZCBvbiBhIHRyYW5zaXRpb24sIHVzZSBhIHRyYW5zaXRpb24gdG8gdXBkYXRlLg0KICAgICAgICB2YXIgZ1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24oZyksDQogICAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlID0gZDMudHJhbnNpdGlvbihiYWNrZ3JvdW5kKSwNCiAgICAgICAgICAgIHJhbmdlOw0KDQogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gZmlsbCB0aGUgZGVmaW5lZCByYW5nZS4NCiAgICAgICAgLy8gSWYgdGhlIHJhbmdlIGlzbid0IGRlZmluZWQsIHlvdSBjYW4gcG9zdC1wcm9jZXNzLg0KICAgICAgICBpZiAoeCkgew0KICAgICAgICAgIHJhbmdlID0gZDNfc2NhbGVSYW5nZSh4KTsNCiAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlLmF0dHIoIngiLCByYW5nZVswXSkuYXR0cigid2lkdGgiLCByYW5nZVsxXSAtIHJhbmdlWzBdKTsNCiAgICAgICAgICByZWRyYXdYKGdVcGRhdGUpOw0KICAgICAgICB9DQogICAgICAgIGlmICh5KSB7DQogICAgICAgICAgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHkpOw0KICAgICAgICAgIGJhY2tncm91bmRVcGRhdGUuYXR0cigieSIsIHJhbmdlWzBdKS5hdHRyKCJoZWlnaHQiLCByYW5nZVsxXSAtIHJhbmdlWzBdKTsNCiAgICAgICAgICByZWRyYXdZKGdVcGRhdGUpOw0KICAgICAgICB9DQogICAgICAgIHJlZHJhdyhnVXBkYXRlKTsNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdFeHRlbnRzKGcpIHsNCiAgICAgIHZhciBleCA9IHhFeHRlbnQubGVuZ3RoID4geUV4dGVudC5sZW5ndGggPyB4RXh0ZW50IDogeUV4dGVudCwNCiAgICAgICAgICBpID0gZXgubGVuZ3RoDQogICAgICAgICAgZXh0ZW50QXJyID0gZXgubWFwKGZ1bmN0aW9uKGQsaSkgeyByZXR1cm4gaTsgfSksDQogICAgICAgICAgZXh0ZW50UmVzaXplcyA9IGQzLm1lcmdlKGV4Lm1hcChmdW5jdGlvbihkLGkpIHsgcmV0dXJuIHJlc2l6ZXMubWFwKGZ1bmN0aW9uKHIpIHsgcmV0dXJuIFtyLCBpXTsgfSk7IH0pKTsNCg0KICAgICAgaWYoIWcpIGcgPSBicnVzaEVsZW1lbnQ7DQoNCiAgICAgIC8vIFRoZSB2aXNpYmxlIGJydXNoIGV4dGVudDsgc3R5bGUgdGhpcyBhcyB5b3UgbGlrZSENCiAgICAgIHZhciBleHRlbnQgPSBnLnNlbGVjdEFsbCgiLmV4dGVudCIpDQogICAgICAgICAgLmRhdGEoZXh0ZW50QXJyLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZDsgfSk7DQoNCiAgICAgIGV4dGVudC5leGl0KCkucmVtb3ZlKCk7DQoNCiAgICAgIGV4dGVudC5lbnRlcigpLmFwcGVuZCgicmVjdCIpDQogICAgICAgICAgLmF0dHIoImNsYXNzIiwgImV4dGVudCIpDQogICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCAibW92ZSIpDQogICAgICAgICAgLmNhbGwoZXh0ZW50QWRhcHRpb24pOw0KDQogICAgICAvLyBNb3JlIGludmlzaWJsZSByZWN0cyBmb3IgcmVzaXppbmcgdGhlIGV4dGVudC4NCiAgICAgIHZhciByZXNpemUgPSBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpDQogICAgICAgICAgLmRhdGEoZXh0ZW50UmVzaXplcywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGRbMF0gKyBkWzFdOyB9KTsNCg0KICAgICAgLy8gUmVtb3ZlIGFueSBzdXBlcmZsdW91cyByZXNpemVycy4NCiAgICAgIHJlc2l6ZS5leGl0KCkucmVtb3ZlKCk7DQoNCiAgICAgIHZhciBuZXdSZXNpemUgPSByZXNpemUuZW50ZXIoKS5hcHBlbmQoImciKQ0KICAgICAgICAgIC5hdHRyKCJjbGFzcyIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJyZXNpemUgIiArIGRbMF07IH0pDQogICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkM19zdmdfYnJ1c2hDdXJzb3JbZFswXV07IH0pOw0KDQogICAgICBuZXdSZXNpemUuYXBwZW5kKCJyZWN0IikNCiAgICAgICAgICAuYXR0cigieCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9bZXddJC8udGVzdChkWzBdKSA/IC0zIDogbnVsbDsgfSkNCiAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9eW25zXS8udGVzdChkWzBdKSA/IC0zIDogbnVsbDsgfSkNCiAgICAgICAgICAuYXR0cigid2lkdGgiLCA2KQ0KICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCA2KQ0KICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsNCg0KICAgICAgbmV3UmVzaXplLmNhbGwocmVzaXplQWRhcHRpb24pOw0KDQogICAgICAvLyBTaG93IG9yIGhpZGUgdGhlIHJlc2l6ZXJzLg0KICAgICAgcmVzaXplLnN0eWxlKCJkaXNwbGF5IiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGJydXNoLmVtcHR5KGRbMV0pID8gIm5vbmUiIDogbnVsbDsgfSk7DQogICAgfQ0KDQogICAgYnJ1c2guZXZlbnQgPSBmdW5jdGlvbihnKSB7DQogICAgICBnLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBldmVudF8gPSBldmVudC5vZih0aGlzLCBhcmd1bWVudHMpLA0KICAgICAgICAgICAgZXh0ZW50MSA9IHt4OiB4RXh0ZW50LCB5OiB5RXh0ZW50LCBpOiB4RXh0ZW50RG9tYWluLCBqOiB5RXh0ZW50RG9tYWlufSwNCiAgICAgICAgICAgIGV4dGVudDAgPSB0aGlzLl9fY2hhcnRfXyB8fCBleHRlbnQxOw0KICAgICAgICB0aGlzLl9fY2hhcnRfXyA9IGV4dGVudDE7DQogICAgICAgIGlmIChkM190cmFuc2l0aW9uSW5oZXJpdElkKSB7DQogICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKQ0KICAgICAgICAgICAgICAuZWFjaCgic3RhcnQuYnJ1c2giLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB4RXh0ZW50RG9tYWluID0gZXh0ZW50MC5pOyAvLyBwcmUtdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHlFeHRlbnREb21haW4gPSBleHRlbnQwLmo7DQogICAgICAgICAgICAgICAgeEV4dGVudCA9IGV4dGVudDAueDsNCiAgICAgICAgICAgICAgICB5RXh0ZW50ID0gZXh0ZW50MC55Ow0KICAgICAgICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoc3RhcnQifSk7DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50d2VlbigiYnJ1c2g6YnJ1c2giLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiB0cmFuc2l0aW9ucyBmb3IgYWxsIGV4dGVudHMNCiAgICAgICAgICAgICAgICB2YXIgeGkgPSBkM19pbnRlcnBvbGF0ZUFycmF5KHhFeHRlbnRbMF0sIGV4dGVudDEueFswXSksDQogICAgICAgICAgICAgICAgICAgIHlpID0gZDNfaW50ZXJwb2xhdGVBcnJheSh5RXh0ZW50WzBdLCBleHRlbnQxLnlbMF0pOw0KICAgICAgICAgICAgICAgIHhFeHRlbnREb21haW5bMF0gPSB5RXh0ZW50RG9tYWluWzBdID0gbnVsbDsgLy8gdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICAgICAgICAgICAgICB4RXh0ZW50WzBdID0gZXh0ZW50MS54WzBdID0geGkodCk7DQogICAgICAgICAgICAgICAgICB5RXh0ZW50WzBdID0gZXh0ZW50MS55WzBdID0geWkodCk7DQogICAgICAgICAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaCIsIG1vZGU6ICJyZXNpemUifSk7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmVhY2goImVuZC5icnVzaCIsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHhFeHRlbnREb21haW4gPSBleHRlbnQxLmk7IC8vIHBvc3QtdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHlFeHRlbnREb21haW4gPSBleHRlbnQxLmo7DQogICAgICAgICAgICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2giLCBtb2RlOiAicmVzaXplIn0pOw0KICAgICAgICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoZW5kIn0pOw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaHN0YXJ0In0pOw0KICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoIiwgbW9kZTogInJlc2l6ZSJ9KTsNCiAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaGVuZCJ9KTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIHJlZHJhdyhnKSB7DQogICAgICBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHhFeHRlbnRbZFsxXV1bKy9lJC8udGVzdChkWzBdKV0gKyAiLCIgKyB5RXh0ZW50W2RbMV1dWysvXnMvLnRlc3QoZFswXSldICsgIikiOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVkcmF3WChnKSB7DQogICAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCIpLmF0dHIoIngiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4geEV4dGVudFtkXVswXTsgfSk7DQogICAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCIpLmF0dHIoIndpZHRoIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4geEV4dGVudFtkXVsxXSAtIHhFeHRlbnRbZF1bMF07IH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlZHJhd1koZykgew0KICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQiKS5hdHRyKCJ5IiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHlFeHRlbnRbZF1bMF07IH0pOw0KICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQiKS5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4geUV4dGVudFtkXVsxXSAtIHlFeHRlbnRbZF1bMF07IH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJydXNoc3RhcnQoKSB7DQogICAgICB2YXIgdGFyZ2V0ID0gdGhpcywNCiAgICAgICAgICBldmVudFRhcmdldCA9IGQzLnNlbGVjdChkMy5ldmVudC50YXJnZXQpLA0KICAgICAgICAgIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwNCiAgICAgICAgICBnID0gZDMuc2VsZWN0KHRhcmdldCksDQogICAgICAgICAgcmVzaXppbmcgPSBldmVudFRhcmdldC5kYXR1bSgpWzBdLA0KICAgICAgICAgIHJlc2l6aW5nWCA9ICEvXihufHMpJC8udGVzdChyZXNpemluZykgJiYgeCwNCiAgICAgICAgICByZXNpemluZ1kgPSAhL14oZXx3KSQvLnRlc3QocmVzaXppbmcpICYmIHksDQogICAgICAgICAgZHJhZ2dpbmcgPSBldmVudFRhcmdldC5jbGFzc2VkKCJleHRlbnQiKSwNCiAgICAgICAgICBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcyh0YXJnZXQpLA0KICAgICAgICAgIGNlbnRlciwNCiAgICAgICAgICBvcmlnaW4gPSBkMy5tb3VzZSh0YXJnZXQpLA0KICAgICAgICAgIG9mZnNldCwNCiAgICAgICAgICBpOw0KDQogICAgICB2YXIgdyA9IGQzLnNlbGVjdCh3aW5kb3cpDQogICAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwga2V5ZG93bikNCiAgICAgICAgICAub24oImtleXVwLmJydXNoIiwga2V5dXApOw0KDQogICAgICBpZiAoZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHsNCiAgICAgICAgdy5vbigidG91Y2htb3ZlLmJydXNoIiwgYnJ1c2htb3ZlKS5vbigidG91Y2hlbmQuYnJ1c2giLCBicnVzaGVuZCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB3Lm9uKCJtb3VzZW1vdmUuYnJ1c2giLCBicnVzaG1vdmUpLm9uKCJtb3VzZXVwLmJydXNoIiwgYnJ1c2hlbmQpOw0KICAgICAgfQ0KDQogICAgICAvLyBJbnRlcnJ1cHQgdGhlIHRyYW5zaXRpb24sIGlmIGFueS4NCiAgICAgIGcuaW50ZXJydXB0KCkuc2VsZWN0QWxsKCIqIikuaW50ZXJydXB0KCk7DQoNCiAgICAgIC8vIElmIHRoZSBleHRlbnQgd2FzIGNsaWNrZWQgb24sIGRyYWcgcmF0aGVyIHRoYW4gYnJ1c2g7DQogICAgICAvLyBzdG9yZSB0aGUgcG9pbnQgYmV0d2VlbiB0aGUgbW91c2UgYW5kIGV4dGVudCBvcmlnaW4gaW5zdGVhZC4NCiAgICAgIGlmIChkcmFnZ2luZykgew0KICAgICAgICBpID0gZXZlbnRUYXJnZXQuZGF0dW0oKTsNCiAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFtpXVswXSAtIG9yaWdpblswXTsNCiAgICAgICAgb3JpZ2luWzFdID0geUV4dGVudFtpXVswXSAtIG9yaWdpblsxXTsNCiAgICAgIH0NCg0KICAgICAgLy8gSWYgYSByZXNpemVyIHdhcyBjbGlja2VkIG9uLCByZWNvcmQgd2hpY2ggc2lkZSBpcyB0byBiZSByZXNpemVkLg0KICAgICAgLy8gQWxzbywgc2V0IHRoZSBvcmlnaW4gdG8gdGhlIG9wcG9zaXRlIHNpZGUuDQogICAgICBlbHNlIGlmIChyZXNpemluZykgew0KICAgICAgICB2YXIgZXggPSArL3ckLy50ZXN0KHJlc2l6aW5nKSwNCiAgICAgICAgICAgIGV5ID0gKy9ebi8udGVzdChyZXNpemluZyk7DQoNCiAgICAgICAgaSA9IGV2ZW50VGFyZ2V0LmRhdHVtKClbMV07DQogICAgICAgIG9mZnNldCA9IFt4RXh0ZW50W2ldWzEgLSBleF0gLSBvcmlnaW5bMF0sIHlFeHRlbnRbaV1bMSAtIGV5XSAtIG9yaWdpblsxXV07DQogICAgICAgIG9yaWdpblswXSA9IHhFeHRlbnRbaV1bZXhdOw0KICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50W2ldW2V5XTsNCiAgICAgIH0NCg0KICAgICAgZWxzZSB7DQogICAgICAgIGkgPSB4RXh0ZW50Lmxlbmd0aCAtIDE7IC8vIEZpZ3VyZSBvdXQgdGhlIGNvdW50IG9mIHRoZSBuZXcgZXh0ZW50Lg0KICAgICAgICB4RXh0ZW50LnB1c2goWzAsMF0pOw0KICAgICAgICB5RXh0ZW50LnB1c2goWzAsMF0pOw0KDQogICAgICAgIC8vIElmIHRoZSBBTFQga2V5IGlzIGRvd24gd2hlbiBzdGFydGluZyBhIGJydXNoLCB0aGUgY2VudGVyIGlzIGF0IHRoZSBtb3VzZS4NCiAgICAgICAgaWYgKGQzLmV2ZW50LmFsdEtleSkgY2VudGVyID0gb3JpZ2luLnNsaWNlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgYWN0aXZlIGN1cnNvciB0byB0aGUgYm9keSBmb3IgdGhlIGRyYWcgZHVyYXRpb24uDQogICAgICBnLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJub25lIik7DQogICAgICBkMy5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIiwgZXZlbnRUYXJnZXQuc3R5bGUoImN1cnNvciIpKTsNCg0KICAgICAgLy8gU2hvdyByZXNpemVycyBhcyBsb25nIGFzIHdlJ3JlIG5vdCBkcmFnZ2luZyBvciByZXNpemluZy4NCiAgICAgIGlmKCFkcmFnZ2luZyAmJiAhcmVzaXppbmcpIGcuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLCBudWxsKQ0KDQogICAgICAvLyBOb3RpZnkgbGlzdGVuZXJzLg0KICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2hzdGFydCJ9KTsNCiAgICAgIGJydXNobW92ZSgpOw0KDQogICAgICBmdW5jdGlvbiBrZXlkb3duKCkgew0KICAgICAgICBpZiAoZDMuZXZlbnQua2V5Q29kZSA9PSAzMikgew0KICAgICAgICAgIGlmICghZHJhZ2dpbmcpIHsNCiAgICAgICAgICAgIGNlbnRlciA9IG51bGw7DQogICAgICAgICAgICBvcmlnaW5bMF0gLT0geEV4dGVudFtpXVsxXTsNCiAgICAgICAgICAgIG9yaWdpblsxXSAtPSB5RXh0ZW50W2ldWzFdOw0KICAgICAgICAgICAgZHJhZ2dpbmcgPSAyOw0KICAgICAgICAgIH0NCiAgICAgICAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGZ1bmN0aW9uIGtleXVwKCkgew0KICAgICAgICBpZiAoZDMuZXZlbnQua2V5Q29kZSA9PSAzMiAmJiBkcmFnZ2luZyA9PSAyKSB7DQogICAgICAgICAgb3JpZ2luWzBdICs9IHhFeHRlbnRbaV1bMV07DQogICAgICAgICAgb3JpZ2luWzFdICs9IHlFeHRlbnRbaV1bMV07DQogICAgICAgICAgZHJhZ2dpbmcgPSAwOw0KICAgICAgICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gYnJ1c2htb3ZlKCkgew0KICAgICAgICB2YXIgcG9pbnQgPSBkMy5tb3VzZSh0YXJnZXQpLA0KICAgICAgICAgICAgbW92ZWQgPSBmYWxzZTsNCg0KICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgb2Zmc2V0IGZvciB0aGljayByZXNpemVycy4NCiAgICAgICAgaWYgKG9mZnNldCkgew0KICAgICAgICAgIHBvaW50WzBdICs9IG9mZnNldFswXTsNCiAgICAgICAgICBwb2ludFsxXSArPSBvZmZzZXRbMV07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWRyYWdnaW5nKSB7DQoNCiAgICAgICAgICAvLyBJZiBuZWVkZWQsIGRldGVybWluZSB0aGUgY2VudGVyIGZyb20gdGhlIGN1cnJlbnQgZXh0ZW50Lg0KICAgICAgICAgIGlmIChkMy5ldmVudC5hbHRLZXkpIHsNCiAgICAgICAgICAgIGlmICghY2VudGVyKSBjZW50ZXIgPSBbKHhFeHRlbnRbaV1bMF0gKyB4RXh0ZW50W2ldWzFdKSAvIDIsICh5RXh0ZW50W2ldWzBdICsgeUV4dGVudFtpXVsxXSkgLyAyXTsNCg0KICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW4sIGZvciB3aGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLg0KICAgICAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFtpXVsrKHBvaW50WzBdIDwgY2VudGVyWzBdKV07DQogICAgICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50W2ldWysocG9pbnRbMV0gPCBjZW50ZXJbMV0pXTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBXaGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLCB3ZSBjbGVhciB0aGUgY2VudGVyLg0KICAgICAgICAgIGVsc2UgY2VudGVyID0gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFVwZGF0ZSB0aGUgYnJ1c2ggZXh0ZW50IGZvciBlYWNoIGRpbWVuc2lvbi4NCiAgICAgICAgaWYgKHJlc2l6aW5nWCAmJiBtb3ZlMShwb2ludCwgeCwgMCkpIHsNCiAgICAgICAgICByZWRyYXdYKGcsIGkpOw0KICAgICAgICAgIG1vdmVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzaXppbmdZICYmIG1vdmUxKHBvaW50LCB5LCAxKSkgew0KICAgICAgICAgIHJlZHJhd1koZywgaSk7DQogICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gRmluYWwgcmVkcmF3IGFuZCBub3RpZnkgbGlzdGVuZXJzLg0KICAgICAgICBpZiAobW92ZWQpIHsNCiAgICAgICAgICByZWRyYXcoZyk7DQogICAgICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2giLCBtb2RlOiBkcmFnZ2luZyA/ICJtb3ZlIiA6ICJyZXNpemUifSk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gbW92ZTEocG9pbnQsIHNjYWxlLCBqKSB7DQogICAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLA0KICAgICAgICAgICAgcjAgPSByYW5nZVswXSwNCiAgICAgICAgICAgIHIxID0gcmFuZ2VbMV0sDQogICAgICAgICAgICBwb3NpdGlvbiA9IG9yaWdpbltqXSwNCiAgICAgICAgICAgIGV4dGVudCA9IGogPyB5RXh0ZW50W2ldIDogeEV4dGVudFtpXSwNCiAgICAgICAgICAgIHNpemUgPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sDQogICAgICAgICAgICBtaW4sDQogICAgICAgICAgICBtYXg7DQoNCiAgICAgICAgLy8gV2hlbiBkcmFnZ2luZywgcmVkdWNlIHRoZSByYW5nZSBieSB0aGUgZXh0ZW50IHNpemUgYW5kIHBvc2l0aW9uLg0KICAgICAgICBpZiAoZHJhZ2dpbmcpIHsNCiAgICAgICAgICByMCAtPSBwb3NpdGlvbjsNCiAgICAgICAgICByMSAtPSBzaXplICsgcG9zaXRpb247DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDbGFtcCB0aGUgcG9pbnQgKHVubGVzcyBjbGFtcCBzZXQgdG8gZmFsc2UpIHNvIHRoYXQgdGhlIGV4dGVudCBmaXRzIHdpdGhpbiB0aGUgcmFuZ2UgZXh0ZW50Lg0KICAgICAgICBtaW4gPSAoaiA/IHlDbGFtcCA6IHhDbGFtcCkgPyBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIHBvaW50W2pdKSkgOiBwb2ludFtqXTsNCg0KICAgICAgICAvLyBDb21wdXRlIHRoZSBuZXcgZXh0ZW50IGJvdW5kcy4NCiAgICAgICAgaWYgKGRyYWdnaW5nKSB7DQogICAgICAgICAgbWF4ID0gKG1pbiArPSBwb3NpdGlvbikgKyBzaXplOw0KICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgcHJlc3NlZCwgdGhlbiBwcmVzZXJ2ZSB0aGUgY2VudGVyIG9mIHRoZSBleHRlbnQuDQogICAgICAgICAgaWYgKGNlbnRlcikgcG9zaXRpb24gPSBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIDIgKiBjZW50ZXJbal0gLSBtaW4pKTsNCg0KICAgICAgICAgIC8vIENvbXB1dGUgdGhlIG1pbiBhbmQgbWF4IG9mIHRoZSBwb3NpdGlvbiBhbmQgcG9pbnQuDQogICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbWluKSB7DQogICAgICAgICAgICBtYXggPSBtaW47DQogICAgICAgICAgICBtaW4gPSBwb3NpdGlvbjsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbWF4ID0gcG9zaXRpb247DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdG9yZWQgYm91bmRzLg0KICAgICAgICBpZiAoZXh0ZW50WzBdICE9IG1pbiB8fCBleHRlbnRbMV0gIT0gbWF4KSB7DQogICAgICAgICAgaWYgKGopIHlFeHRlbnREb21haW5baV0gPSBudWxsOw0KICAgICAgICAgIGVsc2UgeEV4dGVudERvbWFpbltpXSA9IG51bGw7DQogICAgICAgICAgZXh0ZW50WzBdID0gbWluOw0KICAgICAgICAgIGV4dGVudFsxXSA9IG1heDsNCiAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBmdW5jdGlvbiBicnVzaGVuZCgpIHsNCiAgICAgICAgYnJ1c2htb3ZlKCk7DQoNCiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZXh0ZW50IGlzIGVtcHR5LCBjbGVhciBldmVyeXRoaW5nLg0KICAgICAgICBpZih4ICYmIHhFeHRlbnRbaV1bMF0gPT0geEV4dGVudFtpXVsxXSB8fA0KICAgICAgICAgICB5ICYmIHlFeHRlbnRbaV1bMF0gPT0geUV4dGVudFtpXVsxXSkgew0KICAgICAgICAgIGJydXNoLmNsZWFyKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyByZXNldCB0aGUgY3Vyc29yIHN0eWxlcw0KICAgICAgICBnLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGJydXNoLmVtcHR5KGRbMV0pID8gIm5vbmUiIDogbnVsbDsgfSk7DQogICAgICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBudWxsKTsNCg0KICAgICAgICB3IC5vbigibW91c2Vtb3ZlLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oIm1vdXNldXAuYnJ1c2giLCBudWxsKQ0KICAgICAgICAgIC5vbigidG91Y2htb3ZlLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oImtleWRvd24uYnJ1c2giLCBudWxsKQ0KICAgICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBudWxsKTsNCg0KICAgICAgICBkcmF3RXh0ZW50cygpOw0KDQogICAgICAgIGRyYWdSZXN0b3JlKCk7DQogICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoZW5kIn0pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGJydXNoLnggPSBmdW5jdGlvbih6KSB7DQogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4Ow0KICAgICAgeCA9IHo7DQogICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOyAvLyBmb3JlIQ0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC55ID0gZnVuY3Rpb24oeikgew0KICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTsNCiAgICAgIHkgPSB6Ow0KICAgICAgcmVzaXplcyA9IGQzX3N2Z19icnVzaFJlc2l6ZXNbIXggPDwgMSB8ICF5XTsgLy8gZm9yZSENCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9Ow0KDQogICAgYnJ1c2gucmVzaXplQWRhcHRpb24gPSBmdW5jdGlvbih6KSB7DQogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByZXNpemVBZGFwdGlvbjsNCiAgICAgIHJlc2l6ZUFkYXB0aW9uID0gejsNCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9DQoNCiAgICBicnVzaC5leHRlbnRBZGFwdGlvbiA9IGZ1bmN0aW9uKHopIHsNCiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGV4dGVudEFkYXB0aW9uOw0KICAgICAgZXh0ZW50QWRhcHRpb24gPSB6Ow0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH0NCg0KICAgIGJydXNoLmNsYW1wID0gZnVuY3Rpb24oeikgew0KICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geCAmJiB5ID8gW3hDbGFtcCwgeUNsYW1wXSA6IHggPyB4Q2xhbXAgOiB5ID8geUNsYW1wIDogbnVsbDsNCiAgICAgIGlmICh4ICYmIHkpIHhDbGFtcCA9ICEhelswXSwgeUNsYW1wID0gISF6WzFdOw0KICAgICAgZWxzZSBpZiAoeCkgeENsYW1wID0gISF6Ow0KICAgICAgZWxzZSBpZiAoeSkgeUNsYW1wID0gISF6Ow0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbih6KSB7DQogICAgICB2YXIgeDAsIHgxLCB5MCwgeTEsIHQ7DQogICAgICB2YXIgeE91dHB1dCwgeU91dHB1dCwgeHlPdXRwdXQgPSBbXTsNCg0KICAgICAgLy8gSW52ZXJ0IHRoZSBwaXhlbCBleHRlbnQgdG8gZGF0YS1zcGFjZS4NCiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgew0KICAgICAgICBpZiAoeCkgew0KICAgICAgICAgIGlmICh4RXh0ZW50RG9tYWluWzBdKSB7DQogICAgICAgICAgICB4T3V0cHV0ID0geEV4dGVudERvbWFpbjsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgeE91dHB1dCA9IHhFeHRlbnQubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgICAgIGlmICh4LmludmVydCkgcmV0dXJuIFsgeC5pbnZlcnQoZFswXSksIHguaW52ZXJ0KGRbMV0pIF07DQogICAgICAgICAgICAgIHJldHVybiBkOw0KICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgICAgIGlmIChkWzFdIDwgZFswXSkgcmV0dXJuIFsgZFsxXSwgZFswXSBdOw0KICAgICAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZCkgeyByZXR1cm4gZFsxXSAtIGRbMF0gIT0gMDsgfSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICh5KSB7DQogICAgICAgICAgaWYgKHlFeHRlbnREb21haW5bMF0pIHsNCiAgICAgICAgICAgIHlPdXRwdXQgPSB5RXh0ZW50RG9tYWluOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB5T3V0cHV0ID0geUV4dGVudC5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICAgICAgaWYoeS5pbnZlcnQpIHJldHVybiBbIHkuaW52ZXJ0KGRbMF0pLCB5LmludmVydChkWzFdKSBdOw0KICAgICAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgICAgICBpZiAoZFsxXSA8IGRbMF0pIHJldHVybiBbIGRbMV0sIGRbMF0gXTsNCiAgICAgICAgICAgICAgcmV0dXJuIGQ7DQogICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGRbMV0gLSBkWzBdICE9IDA7IH0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZih4ICYmIHkpIHsNCiAgICAgICAgICB4T3V0cHV0LmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsNCiAgICAgICAgICAgIHh5T3V0cHV0LnB1c2goW1tkWzBdLCB5T3V0cHV0W2ldWzBdXSwgW2RbMV0sIHlPdXRwdXRbaV1bMV1dXSk7DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHggJiYgeSA/IHh5T3V0cHV0IDogeCA/IHhPdXRwdXQgOiB5ICYmIHlPdXRwdXQ7DQogICAgICB9DQoNCiAgICAgIC8vIFNjYWxlIHRoZSBkYXRhLXNwYWNlIGV4dGVudCB0byBwaXhlbHMuDQogICAgICBpZiAoeCkgew0KICAgICAgICB4T3V0cHV0ID0gejsNCiAgICAgICAgaWYgKHkpIHhPdXRwdXQgPSB4T3V0cHV0Lm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgIHJldHVybiBbZFswXVswXSwgZFsxXVswXV07DQogICAgICAgIH0pOw0KICAgICAgICB4RXh0ZW50RG9tYWluID0geE91dHB1dDsNCiAgICAgICAgeE91dHB1dCA9IHhPdXRwdXQubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgaWYgKHguaW52ZXJ0KSByZXR1cm4gW3goZFswXSksIHgoZFsxXSldOw0KICAgICAgICAgIHJldHVybiBkOw0KICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICBpZihkWzFdIDwgZFswXSkgcmV0dXJuIFtkWzFdLCBkWzBdXTsNCiAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgfSk7DQogICAgICAgIHhFeHRlbnQgPSB4T3V0cHV0Ow0KICAgICAgICBpZigheSkgeUV4dGVudCA9IHhPdXRwdXQubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gWzAsMF07IH0pOw0KICAgICAgfQ0KICAgICAgaWYgKHkpIHsNCiAgICAgICAgeU91dHB1dCA9IHo7DQogICAgICAgIGlmICh4KSB5T3V0cHV0ID0geU91dHB1dC5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICByZXR1cm4gW2RbMF1bMV0sIGRbMV1bMV1dOw0KICAgICAgICB9KTsNCiAgICAgICAgeUV4dGVudERvbWFpbiA9IHlPdXRwdXQ7DQogICAgICAgIHlPdXRwdXQgPSB5T3V0cHV0Lm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgIGlmICh5LmludmVydCkgcmV0dXJuIFt5KGRbMF0pLCB5KGRbMV0pXTsNCiAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgaWYoZFsxXSA8IGRbMF0pIHJldHVybiBbZFsxXSwgZFswXV07DQogICAgICAgICAgcmV0dXJuIGQ7DQogICAgICAgIH0pOw0KICAgICAgICB5RXh0ZW50ID0geU91dHB1dDsNCiAgICAgICAgaWYoIXgpIHhFeHRlbnQgPSB5T3V0cHV0Lm1hcChmdW5jdGlvbiAoKSB7IHJldHVybiBbMCwwXTsgfSk7DQogICAgICB9DQoNCiAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgZXh0ZW50cyBhcmUgc2V0IHRvIGVtcHR5IGFycmF5cy4NCiAgICAgIGlmKHhFeHRlbnQubGVuZ3RoID09PSAwKSB4RXh0ZW50ID0gW1swLDBdXTsNCiAgICAgIGlmKHlFeHRlbnQubGVuZ3RoID09PSAwKSB5RXh0ZW50ID0gW1swLDBdXTsNCg0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKCkgew0KICAgICAgeEV4dGVudCA9IFtbMCwgMF1dLCB5RXh0ZW50ID0gW1swLCAwXV07DQogICAgICB4RXh0ZW50RG9tYWluID0geUV4dGVudERvbWFpbiA9IFtdOw0KICAgICAgZHJhd0V4dGVudHMoKTsNCiAgICAgIGlmKHgpIHJlZHJhd1goYnJ1c2hFbGVtZW50KTsNCiAgICAgIGlmKHkpIHJlZHJhd1koYnJ1c2hFbGVtZW50KTsNCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9Ow0KDQogICAgYnJ1c2guZW1wdHkgPSBmdW5jdGlvbihpKSB7DQogICAgaWYgKHRoaXMuZXh0ZW50KCkubGVuZ3RoID09PSAwKSB7DQogICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgICBpZih4RXh0ZW50Lmxlbmd0aCA9PSAxICYmIHlFeHRlbnQubGVuZ3RoID09IDEpIGkgPSAwOw0KICAgICAgaWYoaSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgIHJldHVybiAhIXggJiYgeEV4dGVudFtpXVswXSA9PSB4RXh0ZW50W2ldWzFdDQogICAgICAgICAgfHwgISF5ICYmIHlFeHRlbnRbaV1bMF0gPT0geUV4dGVudFtpXVsxXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICB9Ow0KDQogICAgcmV0dXJuIGQzLnJlYmluZChicnVzaCwgZXZlbnQsICJvbiIpOw0KICB9Ow0KDQogIHZhciBkM19zdmdfYnJ1c2hDdXJzb3IgPSB7DQogICAgbjogIm5zLXJlc2l6ZSIsDQogICAgZTogImV3LXJlc2l6ZSIsDQogICAgczogIm5zLXJlc2l6ZSIsDQogICAgdzogImV3LXJlc2l6ZSIsDQogICAgbnc6ICJud3NlLXJlc2l6ZSIsDQogICAgbmU6ICJuZXN3LXJlc2l6ZSIsDQogICAgc2U6ICJud3NlLXJlc2l6ZSIsDQogICAgc3c6ICJuZXN3LXJlc2l6ZSINCiAgfTsNCg0KICB2YXIgZDNfc3ZnX2JydXNoUmVzaXplcyA9IFsNCiAgICBbIm4iLCAiZSIsICJzIiwgInciLCAibnciLCAibmUiLCAic2UiLCAic3ciXSwNCiAgICBbImUiLCAidyJdLA0KICAgIFsibiIsICJzIl0sDQogICAgW10NCiAgXTsNCn0pKCk7DQo="></script>
<script src="data:application/x-javascript;base64,ZDMucGFyY29vcmRzID0gZnVuY3Rpb24oY29uZmlnKSB7DQogIHZhciBfXyA9IHsNCiAgICBkYXRhOiBbXSwNCiAgICBoaWdobGlnaHRlZDogW10sDQogICAgZGltZW5zaW9uczoge30sDQogICAgZGltZW5zaW9uVGl0bGVSb3RhdGlvbjogMCwNCiAgICBicnVzaGVkOiBmYWxzZSwNCiAgICBicnVzaGVkQ29sb3I6IG51bGwsDQogICAgYWxwaGFPbkJydXNoZWQ6IDAuMCwNCiAgICBtb2RlOiAiZGVmYXVsdCIsDQogICAgcmF0ZTogMjAsDQogICAgd2lkdGg6IDYwMCwNCiAgICBoZWlnaHQ6IDMwMCwNCiAgICBtYXJnaW46IHsgdG9wOiAyNCwgcmlnaHQ6IDAsIGJvdHRvbTogMTIsIGxlZnQ6IDAgfSwNCiAgICBudWxsVmFsdWVTZXBhcmF0b3I6ICJ1bmRlZmluZWQiLCAvLyBzZXQgdG8gInRvcCIgb3IgImJvdHRvbSINCiAgICBudWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nOiB7IHRvcDogOCwgcmlnaHQ6IDAsIGJvdHRvbTogOCwgbGVmdDogMCB9LA0KICAgIGNvbG9yOiAiIzA2OSIsDQogICAgY29tcG9zaXRlOiAic291cmNlLW92ZXIiLA0KICAgIGFscGhhOiAwLjcsDQogICAgYnVuZGxpbmdTdHJlbmd0aDogMC41LA0KICAgIGJ1bmRsZURpbWVuc2lvbjogbnVsbCwNCiAgICBzbW9vdGhuZXNzOiAwLjAsDQogICAgc2hvd0NvbnRyb2xQb2ludHM6IGZhbHNlLA0KICAgIGhpZGVBeGlzIDogW10sDQogICAgZmxpcEF4ZXM6IFtdLA0KICAgIGFuaW1hdGlvblRpbWU6IDExMDAsIC8vIEhvdyBsb25nIGl0IHRha2VzIHRvIGZsaXAgdGhlIGF4aXMgd2hlbiB5b3UgZG91YmxlIGNsaWNrDQogICAgcm90YXRlTGFiZWxzOiBmYWxzZQ0KICB9Ow0KDQogIGV4dGVuZChfXywgY29uZmlnKTsNCg0KICBpZiAoY29uZmlnICYmIGNvbmZpZy5kaW1lbnNpb25UaXRsZXMpIHsNCiAgICBjb25zb2xlLndhcm4oImRpbWVuc2lvblRpdGxlcyBwYXNzZWQgaW4gY29uZmlnIGlzIGRlcHJlY2F0ZWQuIEFkZCB0aXRsZSB0byBkaW1lbnNpb24gb2JqZWN0LiIpOw0KICAgIGQzLmVudHJpZXMoY29uZmlnLmRpbWVuc2lvblRpdGxlcykuZm9yRWFjaChmdW5jdGlvbihkKSB7DQogICAgICBpZiAoX18uZGltZW5zaW9uc1tkLmtleV0pIHsNCiAgICAgICAgX18uZGltZW5zaW9uc1tkLmtleV0udGl0bGUgPSBfXy5kaW1lbnNpb25zW2Qua2V5XS50aXRsZSA/IF9fLmRpbWVuc2lvbnNbZC5rZXldLnRpdGxlIDogZC52YWx1ZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIF9fLmRpbWVuc2lvbnNbZC5rZXldID0gew0KICAgICAgICAgIHRpdGxlOiBkLnZhbHVlDQogICAgICAgIH07DQogICAgICB9DQogICAgfSk7DQogIH0NCnZhciBwYyA9IGZ1bmN0aW9uKHNlbGVjdGlvbikgew0KICBzZWxlY3Rpb24gPSBwYy5zZWxlY3Rpb24gPSBkMy5zZWxlY3Qoc2VsZWN0aW9uKTsNCg0KICBfXy53aWR0aCA9IHNlbGVjdGlvblswXVswXS5jbGllbnRXaWR0aDsNCiAgX18uaGVpZ2h0ID0gc2VsZWN0aW9uWzBdWzBdLmNsaWVudEhlaWdodDsNCg0KICAvLyBjYW52YXMgZGF0YSBsYXllcnMNCiAgWyJtYXJrcyIsICJmb3JlZ3JvdW5kIiwgImJydXNoZWQiLCAiaGlnaGxpZ2h0Il0uZm9yRWFjaChmdW5jdGlvbihsYXllcikgew0KICAgIGNhbnZhc1tsYXllcl0gPSBzZWxlY3Rpb24NCiAgICAgIC5hcHBlbmQoImNhbnZhcyIpDQogICAgICAuYXR0cigiY2xhc3MiLCBsYXllcilbMF1bMF07DQogICAgY3R4W2xheWVyXSA9IGNhbnZhc1tsYXllcl0uZ2V0Q29udGV4dCgiMmQiKTsNCiAgfSk7DQoNCiAgLy8gc3ZnIHRpY2sgYW5kIGJydXNoIGxheWVycw0KICBwYy5zdmcgPSBzZWxlY3Rpb24NCiAgICAuYXBwZW5kKCJzdmciKQ0KICAgICAgLmF0dHIoIndpZHRoIiwgX18ud2lkdGgpDQogICAgICAuYXR0cigiaGVpZ2h0IiwgX18uaGVpZ2h0KQ0KICAgICAgLnN0eWxlKCJmb250IiwgIjE0cHggc2Fucy1zZXJpZiIpDQogICAgICAuc3R5bGUoInBvc2l0aW9uIiwgImFic29sdXRlIikNCg0KICAgIC5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBfXy5tYXJnaW4ubGVmdCArICIsIiArIF9fLm1hcmdpbi50b3AgKyAiKSIpOw0KDQogIHJldHVybiBwYzsNCn07DQp2YXIgZXZlbnRzID0gZDMuZGlzcGF0Y2guYXBwbHkodGhpcyxbInJlbmRlciIsICJyZXNpemUiLCAiaGlnaGxpZ2h0IiwgImJydXNoIiwgImJydXNoZW5kIiwgImJydXNoc3RhcnQiLCAiYXhlc3Jlb3JkZXIiXS5jb25jYXQoZDMua2V5cyhfXykpKSwNCiAgICB3ID0gZnVuY3Rpb24oKSB7IHJldHVybiBfXy53aWR0aCAtIF9fLm1hcmdpbi5yaWdodCAtIF9fLm1hcmdpbi5sZWZ0OyB9LA0KICAgIGggPSBmdW5jdGlvbigpIHsgcmV0dXJuIF9fLmhlaWdodCAtIF9fLm1hcmdpbi50b3AgLSBfXy5tYXJnaW4uYm90dG9tOyB9LA0KICAgIGZsYWdzID0gew0KICAgICAgYnJ1c2hhYmxlOiBmYWxzZSwNCiAgICAgIHJlb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgIGF4ZXM6IGZhbHNlLA0KICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLA0KICAgICAgZGVidWc6IGZhbHNlDQogICAgfSwNCiAgICB4c2NhbGUgPSBkMy5zY2FsZS5vcmRpbmFsKCksDQogICAgZHJhZ2dpbmcgPSB7fSwNCiAgICBsaW5lID0gZDMuc3ZnLmxpbmUoKSwNCiAgICBheGlzID0gZDMuc3ZnLmF4aXMoKS5vcmllbnQoImxlZnQiKS50aWNrcyg1KSwNCiAgICBnLCAvLyBncm91cHMgZm9yIGF4ZXMsIGJydXNoZXMNCiAgICBjdHggPSB7fSwNCiAgICBjYW52YXMgPSB7fSwNCiAgICBjbHVzdGVyQ2VudHJvaWRzID0gW107DQoNCi8vIHNpZGUgZWZmZWN0cyBmb3Igc2V0dGVycw0KdmFyIHNpZGVfZWZmZWN0cyA9IGQzLmRpc3BhdGNoLmFwcGx5KHRoaXMsZDMua2V5cyhfXykpDQogIC5vbigiY29tcG9zaXRlIiwgZnVuY3Rpb24oZCkgew0KICAgIGN0eC5mb3JlZ3JvdW5kLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGQudmFsdWU7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZC52YWx1ZTsNCiAgfSkNCiAgLm9uKCJhbHBoYSIsIGZ1bmN0aW9uKGQpIHsNCiAgICBjdHguZm9yZWdyb3VuZC5nbG9iYWxBbHBoYSA9IGQudmFsdWU7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQWxwaGEgPSBkLnZhbHVlOw0KICB9KQ0KICAub24oImJydXNoZWRDb2xvciIsIGZ1bmN0aW9uIChkKSB7DQogICAgY3R4LmJydXNoZWQuc3Ryb2tlU3R5bGUgPSBkLnZhbHVlOw0KICB9KQ0KICAub24oIndpZHRoIiwgZnVuY3Rpb24oZCkgeyBwYy5yZXNpemUoKTsgfSkNCiAgLm9uKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHBjLnJlc2l6ZSgpOyB9KQ0KICAub24oIm1hcmdpbiIsIGZ1bmN0aW9uKGQpIHsgcGMucmVzaXplKCk7IH0pDQogIC5vbigicmF0ZSIsIGZ1bmN0aW9uKGQpIHsNCiAgICBicnVzaGVkUXVldWUucmF0ZShkLnZhbHVlKTsNCiAgICBmb3JlZ3JvdW5kUXVldWUucmF0ZShkLnZhbHVlKTsNCiAgfSkNCiAgLm9uKCJkaW1lbnNpb25zIiwgZnVuY3Rpb24oZCkgew0KICAgIF9fLmRpbWVuc2lvbnMgPSBwYy5hcHBseURpbWVuc2lvbkRlZmF1bHRzKGQzLmtleXMoZC52YWx1ZSkpOw0KICAgIHhzY2FsZS5kb21haW4ocGMuZ2V0T3JkZXJlZERpbWVuc2lvbktleXMoKSk7DQogICAgcGMuc29ydERpbWVuc2lvbnMoKTsNCiAgICBpZiAoZmxhZ3MuaW50ZXJhY3RpdmUpe3BjLnJlbmRlcigpLnVwZGF0ZUF4ZXMoKTt9DQogIH0pDQogIC5vbigiYnVuZGxlRGltZW5zaW9uIiwgZnVuY3Rpb24oZCkgew0KICAgICAgaWYgKCFkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aCkgcGMuZGV0ZWN0RGltZW5zaW9ucygpOw0KICAgICAgcGMuYXV0b3NjYWxlKCk7DQogICAgICBpZiAodHlwZW9mIGQudmFsdWUgPT09ICJudW1iZXIiKSB7DQogICAgICAgICAgaWYgKGQudmFsdWUgPCBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aCkgew0KICAgICAgICAgICAgICBfXy5idW5kbGVEaW1lbnNpb24gPSBfXy5kaW1lbnNpb25zW2QudmFsdWVdOw0KICAgICAgICAgIH0gZWxzZSBpZiAoZC52YWx1ZSA8IF9fLmhpZGVBeGlzLmxlbmd0aCkgew0KICAgICAgICAgICAgICBfXy5idW5kbGVEaW1lbnNpb24gPSBfXy5oaWRlQXhpc1tkLnZhbHVlXTsNCiAgICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICAgIF9fLmJ1bmRsZURpbWVuc2lvbiA9IGQudmFsdWU7DQogICAgICB9DQoNCiAgICAgIF9fLmNsdXN0ZXJDZW50cm9pZHMgPSBjb21wdXRlX2NsdXN0ZXJfY2VudHJvaWRzKF9fLmJ1bmRsZURpbWVuc2lvbik7DQogICAgaWYgKGZsYWdzLmludGVyYWN0aXZlKXtwYy5yZW5kZXIoKTt9DQogIH0pDQogIC5vbigiaGlkZUF4aXMiLCBmdW5jdGlvbihkKSB7DQogICAgcGMuZGltZW5zaW9ucyhwYy5hcHBseURpbWVuc2lvbkRlZmF1bHRzKCkpOw0KICAgIHBjLmRpbWVuc2lvbnMod2l0aG91dChfXy5kaW1lbnNpb25zLCBkLnZhbHVlKSk7DQogIH0pDQogIC5vbigiZmxpcEF4ZXMiLCBmdW5jdGlvbihkKSB7DQogICAgaWYgKGQudmFsdWUgJiYgZC52YWx1ZS5sZW5ndGgpIHsNCiAgICAgICAgZC52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGF4aXMpIHsNCiAgICAgICAgICAgIGZsaXBBeGlzQW5kVXBkYXRlUENQKGF4aXMpOw0KICAgICAgICB9KTsNCiAgICAgICAgcGMudXBkYXRlQXhlcygwKTsNCiAgICB9DQogIH0pOw0KDQovLyBleHBvc2UgdGhlIHN0YXRlIG9mIHRoZSBjaGFydA0KcGMuc3RhdGUgPSBfXzsNCnBjLmZsYWdzID0gZmxhZ3M7DQoNCi8vIGNyZWF0ZSBnZXR0ZXIvc2V0dGVycw0KZ2V0c2V0KHBjLCBfXywgZXZlbnRzKTsNCg0KLy8gZXhwb3NlIGV2ZW50cw0KZDMucmViaW5kKHBjLCBldmVudHMsICJvbiIpOw0KDQovLyBnZXR0ZXIvc2V0dGVyIHdpdGggZXZlbnQgZmlyaW5nDQpmdW5jdGlvbiBnZXRzZXQob2JqLHN0YXRlLGV2ZW50cykgIHsNCiAgZDMua2V5cyhzdGF0ZSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsNCiAgICAgIG9ialtrZXldID0gZnVuY3Rpb24oeCkgew0KICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsNCiAgICAgICAgICByZXR1cm4gc3RhdGVba2V5XTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoa2V5ID09PSAnZGltZW5zaW9ucycgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nKSB7DQogICAgICAgICAgY29uc29sZS53YXJuKCJwYy5kaW1lbnNpb25zKFtdKSBpcyBkZXByZWNhdGVkLCB1c2UgcGMuZGltZW5zaW9ucyh7fSkiKTsNCiAgICAgICAgICB4ID0gcGMuYXBwbHlEaW1lbnNpb25EZWZhdWx0cyh4KTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgb2xkID0gc3RhdGVba2V5XTsNCiAgICAgICAgc3RhdGVba2V5XSA9IHg7DQogICAgICAgIHNpZGVfZWZmZWN0c1trZXldLmNhbGwocGMseyJ2YWx1ZSI6IHgsICJwcmV2aW91cyI6IG9sZH0pOw0KICAgICAgICBldmVudHNba2V5XS5jYWxsKHBjLHsidmFsdWUiOiB4LCAicHJldmlvdXMiOiBvbGR9KTsNCiAgICAgICAgcmV0dXJuIG9iajsNCiAgICAgIH07DQogIH0pOw0KfTsNCg0KZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7DQogIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsNCiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOw0KICB9DQogIHJldHVybiB0YXJnZXQ7DQp9Ow0KDQpmdW5jdGlvbiB3aXRob3V0KGFyciwgaXRlbXMpIHsNCiAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICBkZWxldGUgYXJyW2VsXTsNCiAgfSk7DQogIHJldHVybiBhcnI7DQp9Ow0KLyoqIGFkanVzdHMgYW4gYXhpcycgZGVmYXVsdCByYW5nZSBbaCgpKzEsIDFdIGlmIGEgTnVsbFZhbHVlU2VwYXJhdG9yIGlzIHNldCAqLw0KZnVuY3Rpb24gZ2V0UmFuZ2UoKSB7DQoJaWYgKF9fLm51bGxWYWx1ZVNlcGFyYXRvcj09ImJvdHRvbSIpIHsNCgkJcmV0dXJuIFtoKCkrMS1fXy5udWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nLmJvdHRvbS1fXy5udWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nLnRvcCwgMV07DQoJfSBlbHNlIGlmIChfXy5udWxsVmFsdWVTZXBhcmF0b3I9PSJ0b3AiKSB7DQoJCXJldHVybiBbaCgpKzEsIDErX18ubnVsbFZhbHVlU2VwYXJhdG9yUGFkZGluZy5ib3R0b20rX18ubnVsbFZhbHVlU2VwYXJhdG9yUGFkZGluZy50b3BdOw0KCX0NCglyZXR1cm4gW2goKSsxLCAxXTsNCn07DQoNCnBjLmF1dG9zY2FsZSA9IGZ1bmN0aW9uKCkgew0KICAvLyB5c2NhbGUNCiAgdmFyIGRlZmF1bHRTY2FsZXMgPSB7DQogICAgImRhdGUiOiBmdW5jdGlvbihrKSB7DQogICAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KF9fLmRhdGEsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuIGRba10gPyBkW2tdLmdldFRpbWUoKSA6IG51bGw7DQogICAgICB9KTsNCg0KICAgICAgLy8gc3BlY2lhbCBjYXNlIGlmIHNpbmdsZSB2YWx1ZQ0KICAgICAgaWYgKGV4dGVudFswXSA9PT0gZXh0ZW50WzFdKSB7DQogICAgICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkNCiAgICAgICAgICAuZG9tYWluKFtleHRlbnRbMF1dKQ0KICAgICAgICAgIC5yYW5nZVBvaW50cyhnZXRSYW5nZSgpKTsNCiAgICAgIH0NCg0KICAgICAgcmV0dXJuIGQzLnRpbWUuc2NhbGUoKQ0KICAgICAgICAuZG9tYWluKGV4dGVudCkNCiAgICAgICAgLnJhbmdlKGdldFJhbmdlKCkpOw0KICAgIH0sDQogICAgIm51bWJlciI6IGZ1bmN0aW9uKGspIHsNCiAgICAgIHZhciBleHRlbnQgPSBkMy5leHRlbnQoX18uZGF0YSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gK2Rba107IH0pOw0KDQogICAgICAvLyBzcGVjaWFsIGNhc2UgaWYgc2luZ2xlIHZhbHVlDQogICAgICBpZiAoZXh0ZW50WzBdID09PSBleHRlbnRbMV0pIHsNCiAgICAgICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKQ0KICAgICAgICAgIC5kb21haW4oW2V4dGVudFswXV0pDQogICAgICAgICAgLnJhbmdlUG9pbnRzKGdldFJhbmdlKCkpOw0KICAgICAgfQ0KDQogICAgICByZXR1cm4gZDMuc2NhbGUubGluZWFyKCkNCiAgICAgICAgLmRvbWFpbihleHRlbnQpDQogICAgICAgIC5yYW5nZShnZXRSYW5nZSgpKTsNCiAgICB9LA0KICAgICJzdHJpbmciOiBmdW5jdGlvbihrKSB7DQogICAgICB2YXIgY291bnRzID0ge30sDQogICAgICAgICAgZG9tYWluID0gW107DQoNCiAgICAgIC8vIExldCdzIGdldCB0aGUgY291bnQgZm9yIGVhY2ggdmFsdWUgc28gdGhhdCB3ZSBjYW4gc29ydCB0aGUgZG9tYWluIGJhc2VkDQogICAgICAvLyBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHZhbHVlLg0KICAgICAgX18uZGF0YS5tYXAoZnVuY3Rpb24ocCkgew0KICAgICAgICBpZiAocFtrXSA9PT0gdW5kZWZpbmVkICYmIF9fLm51bGxWYWx1ZVNlcGFyYXRvciE9PSAidW5kZWZpbmVkIil7DQogICAgICAgICAgcmV0dXJuOyAvLyBudWxsIHZhbHVlcyB3aWxsIGJlIGRyYXduIGJleW9uZCB0aGUgaG9yaXpvbnRhbCBudWxsIHZhbHVlIHNlcGFyYXRvciENCiAgICAgICAgfQ0KICAgICAgICBpZiAoY291bnRzW3Bba11dID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICBjb3VudHNbcFtrXV0gPSAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGNvdW50c1twW2tdXSA9IGNvdW50c1twW2tdXSArIDE7DQogICAgICAgIH0NCiAgICAgIH0pOw0KDQogICAgICBkb21haW4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb3VudHMpLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KICAgICAgICByZXR1cm4gY291bnRzW2FdIC0gY291bnRzW2JdOw0KICAgICAgfSk7DQoNCiAgICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkNCiAgICAgICAgLmRvbWFpbihkb21haW4pDQogICAgICAgIC5yYW5nZVBvaW50cyhnZXRSYW5nZSgpKTsNCiAgICB9DQogIH07DQoNCiAgZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHsNCiAgICBpZiAoIV9fLmRpbWVuc2lvbnNba10ueXNjYWxlKXsNCiAgICAgIF9fLmRpbWVuc2lvbnNba10ueXNjYWxlID0gZGVmYXVsdFNjYWxlc1tfXy5kaW1lbnNpb25zW2tdLnR5cGVdKGspOw0KICAgIH0NCiAgfSk7DQoNCiAgLy8geHNjYWxlDQogIHhzY2FsZS5yYW5nZVBvaW50cyhbMCwgdygpXSwgMSk7DQoNCiAgLy8gUmV0aW5hIGRpc3BsYXksIGV0Yy4NCiAgdmFyIGRldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxOw0KDQogIC8vIGNhbnZhcyBzaXplcw0KICBwYy5zZWxlY3Rpb24uc2VsZWN0QWxsKCJjYW52YXMiKQ0KICAgICAgLnN0eWxlKCJtYXJnaW4tdG9wIiwgX18ubWFyZ2luLnRvcCArICJweCIpDQogICAgICAuc3R5bGUoIm1hcmdpbi1sZWZ0IiwgX18ubWFyZ2luLmxlZnQgKyAicHgiKQ0KICAgICAgLnN0eWxlKCJ3aWR0aCIsICh3KCkrMikgKyAicHgiKQ0KICAgICAgLnN0eWxlKCJoZWlnaHQiLCAoaCgpKzIpICsgInB4IikNCiAgICAgIC5hdHRyKCJ3aWR0aCIsICh3KCkrMikgKiBkZXZpY2VQaXhlbFJhdGlvKQ0KICAgICAgLmF0dHIoImhlaWdodCIsIChoKCkrMikgKiBkZXZpY2VQaXhlbFJhdGlvKTsNCg0KICAvLyBkZWZhdWx0IHN0eWxlcywgbmVlZHMgdG8gYmUgc2V0IHdoZW4gY2FudmFzIHdpZHRoIGNoYW5nZXMNCiAgY3R4LmZvcmVncm91bmQuc3Ryb2tlU3R5bGUgPSBfXy5jb2xvcjsNCiAgY3R4LmZvcmVncm91bmQubGluZVdpZHRoID0gMS40Ow0KICBjdHguZm9yZWdyb3VuZC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBfXy5jb21wb3NpdGU7DQogIGN0eC5mb3JlZ3JvdW5kLmdsb2JhbEFscGhhID0gX18uYWxwaGE7DQogIGN0eC5mb3JlZ3JvdW5kLnNjYWxlKGRldmljZVBpeGVsUmF0aW8sIGRldmljZVBpeGVsUmF0aW8pOw0KICBjdHguYnJ1c2hlZC5zdHJva2VTdHlsZSA9IF9fLmJydXNoZWRDb2xvcjsNCiAgY3R4LmJydXNoZWQubGluZVdpZHRoID0gMS40Ow0KICBjdHguYnJ1c2hlZC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBfXy5jb21wb3NpdGU7DQogIGN0eC5icnVzaGVkLmdsb2JhbEFscGhhID0gX18uYWxwaGE7DQogIGN0eC5icnVzaGVkLnNjYWxlKGRldmljZVBpeGVsUmF0aW8sIGRldmljZVBpeGVsUmF0aW8pOw0KICBjdHguaGlnaGxpZ2h0LmxpbmVXaWR0aCA9IDM7DQogIGN0eC5oaWdobGlnaHQuc2NhbGUoZGV2aWNlUGl4ZWxSYXRpbywgZGV2aWNlUGl4ZWxSYXRpbyk7DQoNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5zY2FsZSA9IGZ1bmN0aW9uKGQsIGRvbWFpbikgew0KICBfXy5kaW1lbnNpb25zW2RdLnlzY2FsZS5kb21haW4oZG9tYWluKTsNCg0KICByZXR1cm4gdGhpczsNCn07DQoNCnBjLmZsaXAgPSBmdW5jdGlvbihkKSB7DQogIC8vX18uZGltZW5zaW9uc1tkXS55c2NhbGUuZG9tYWluKCkucmV2ZXJzZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCB3b3JrDQogIF9fLmRpbWVuc2lvbnNbZF0ueXNjYWxlLmRvbWFpbihfXy5kaW1lbnNpb25zW2RdLnlzY2FsZS5kb21haW4oKS5yZXZlcnNlKCkpOyAvLyB3b3Jrcw0KDQogIHJldHVybiB0aGlzOw0KfTsNCg0KcGMuY29tbW9uU2NhbGUgPSBmdW5jdGlvbihnbG9iYWwsIHR5cGUpIHsNCiAgdmFyIHQgPSB0eXBlIHx8ICJudW1iZXIiOw0KICBpZiAodHlwZW9mIGdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcpIHsNCiAgICBnbG9iYWwgPSB0cnVlOw0KICB9DQoNCiAgLy8gdHJ5IHRvIGF1dG9kZXRlY3QgZGltZW5zaW9ucyBhbmQgY3JlYXRlIHNjYWxlcw0KICBpZiAoIWQzLmtleXMoX18uZGltZW5zaW9ucykubGVuZ3RoKSB7DQogICAgcGMuZGV0ZWN0RGltZW5zaW9ucygpDQogIH0NCiAgcGMuYXV0b3NjYWxlKCk7DQoNCiAgLy8gc2NhbGVzIG9mIHRoZSBzYW1lIHR5cGUNCiAgdmFyIHNjYWxlcyA9IGQzLmtleXMoX18uZGltZW5zaW9ucykuZmlsdGVyKGZ1bmN0aW9uKHApIHsNCiAgICByZXR1cm4gX18uZGltZW5zaW9uc1twXS50eXBlID09IHQ7DQogIH0pOw0KDQogIGlmIChnbG9iYWwpIHsNCiAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KHNjYWxlcy5tYXAoZnVuY3Rpb24oZCxpKSB7DQogICAgICByZXR1cm4gX18uZGltZW5zaW9uc1tkXS55c2NhbGUuZG9tYWluKCk7DQogICAgfSkucmVkdWNlKGZ1bmN0aW9uKGEsYikgew0KICAgICAgcmV0dXJuIGEuY29uY2F0KGIpOw0KICAgIH0pKTsNCg0KICAgIHNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgIF9fLmRpbWVuc2lvbnNbZF0ueXNjYWxlLmRvbWFpbihleHRlbnQpOw0KICAgIH0pOw0KDQogIH0gZWxzZSB7DQogICAgc2NhbGVzLmZvckVhY2goZnVuY3Rpb24oZCkgew0KICAgICAgX18uZGltZW5zaW9uc1tkXS55c2NhbGUuZG9tYWluKGQzLmV4dGVudChfXy5kYXRhLCBmdW5jdGlvbihkKSB7IHJldHVybiArZFtrXTsgfSkpOw0KICAgIH0pOw0KICB9DQoNCiAgLy8gdXBkYXRlIGNlbnRyb2lkcw0KICBpZiAoX18uYnVuZGxlRGltZW5zaW9uICE9PSBudWxsKSB7DQogICAgcGMuYnVuZGxlRGltZW5zaW9uKF9fLmJ1bmRsZURpbWVuc2lvbik7DQogIH0NCg0KICByZXR1cm4gdGhpczsNCn07DQpwYy5kZXRlY3REaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7DQogIHBjLmRpbWVuc2lvbnMocGMuYXBwbHlEaW1lbnNpb25EZWZhdWx0cygpKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5hcHBseURpbWVuc2lvbkRlZmF1bHRzID0gZnVuY3Rpb24oZGltcykgew0KICB2YXIgdHlwZXMgPSBwYy5kZXRlY3REaW1lbnNpb25UeXBlcyhfXy5kYXRhKTsNCiAgZGltcyA9IGRpbXMgPyBkaW1zIDogZDMua2V5cyh0eXBlcyk7DQogIHZhciBuZXdEaW1zID0ge307DQogIHZhciBjdXJySW5kZXggPSAwOw0KICBkaW1zLmZvckVhY2goZnVuY3Rpb24oaykgew0KICAgIG5ld0RpbXNba10gPSBfXy5kaW1lbnNpb25zW2tdID8gX18uZGltZW5zaW9uc1trXSA6IHt9Ow0KICAgIC8vU2V0IHVwIGRlZmF1bHRzDQogICAgbmV3RGltc1trXS5vcmllbnQ9IG5ld0RpbXNba10ub3JpZW50ID8gbmV3RGltc1trXS5vcmllbnQgOiAnbGVmdCc7DQogICAgbmV3RGltc1trXS50aWNrcz0gbmV3RGltc1trXS50aWNrcyAhPSBudWxsID8gbmV3RGltc1trXS50aWNrcyA6IDU7DQogICAgbmV3RGltc1trXS5pbm5lclRpY2tTaXplPSBuZXdEaW1zW2tdLmlubmVyVGlja1NpemUgIT0gbnVsbCA/IG5ld0RpbXNba10uaW5uZXJUaWNrU2l6ZSA6IDY7DQogICAgbmV3RGltc1trXS5vdXRlclRpY2tTaXplPSBuZXdEaW1zW2tdLm91dGVyVGlja1NpemUgIT0gbnVsbCA/IG5ld0RpbXNba10ub3V0ZXJUaWNrU2l6ZSA6IDA7DQogICAgbmV3RGltc1trXS50aWNrUGFkZGluZz0gbmV3RGltc1trXS50aWNrUGFkZGluZyAhPSBudWxsID8gbmV3RGltc1trXS50aWNrUGFkZGluZyA6IDM7DQogICAgbmV3RGltc1trXS50eXBlPSBuZXdEaW1zW2tdLnR5cGUgPyBuZXdEaW1zW2tdLnR5cGUgOiB0eXBlc1trXTsNCg0KICAgIG5ld0RpbXNba10uaW5kZXggPSBuZXdEaW1zW2tdLmluZGV4ICE9IG51bGwgPyBuZXdEaW1zW2tdLmluZGV4IDogY3VyckluZGV4Ow0KICAgIGN1cnJJbmRleCsrOw0KICB9KTsNCiAgcmV0dXJuIG5ld0RpbXM7DQp9Ow0KDQpwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cyA9IGZ1bmN0aW9uKCl7DQogIHJldHVybiBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLnNvcnQoZnVuY3Rpb24oeCwgeSl7DQogICAgcmV0dXJuIGQzLmFzY2VuZGluZyhfXy5kaW1lbnNpb25zW3hdLmluZGV4LCBfXy5kaW1lbnNpb25zW3ldLmluZGV4KTsNCiAgfSk7DQp9Ow0KDQovLyBhIGJldHRlciAidHlwZW9mIiBmcm9tIHRoaXMgcG9zdDogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83MzkwNDI2L2JldHRlci13YXktdG8tZ2V0LXR5cGUtb2YtYS1qYXZhc2NyaXB0LXZhcmlhYmxlDQpwYy50b1R5cGUgPSBmdW5jdGlvbih2KSB7DQogIHJldHVybiAoe30pLnRvU3RyaW5nLmNhbGwodikubWF0Y2goL1xzKFthLXpBLVpdKykvKVsxXS50b0xvd2VyQ2FzZSgpOw0KfTsNCg0KLy8gdHJ5IHRvIGNvZXJjZSB0byBudW1iZXIgYmVmb3JlIHJldHVybmluZyB0eXBlDQpwYy50b1R5cGVDb2VyY2VOdW1iZXJzID0gZnVuY3Rpb24odikgew0KICBpZiAoKHBhcnNlRmxvYXQodikgPT0gdikgJiYgKHYgIT0gbnVsbCkpIHsNCiAgICByZXR1cm4gIm51bWJlciI7DQogIH0NCiAgcmV0dXJuIHBjLnRvVHlwZSh2KTsNCn07DQoNCi8vIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHR5cGVzIG9mIGVhY2ggZGltZW5zaW9uIGJhc2VkIG9uIGZpcnN0IHJvdyBvZiBkYXRhDQpwYy5kZXRlY3REaW1lbnNpb25UeXBlcyA9IGZ1bmN0aW9uKGRhdGEpIHsNCiAgdmFyIHR5cGVzID0ge307DQogIGQzLmtleXMoZGF0YVswXSkNCiAgICAuZm9yRWFjaChmdW5jdGlvbihjb2wpIHsNCiAgICAgIHR5cGVzW2lzTmFOKE51bWJlcihjb2wpKSA/IGNvbCA6IHBhcnNlSW50KGNvbCldID0gcGMudG9UeXBlQ29lcmNlTnVtYmVycyhkYXRhWzBdW2NvbF0pOw0KICAgIH0pOw0KICByZXR1cm4gdHlwZXM7DQp9Ow0KcGMucmVuZGVyID0gZnVuY3Rpb24oKSB7DQogIC8vIHRyeSB0byBhdXRvZGV0ZWN0IGRpbWVuc2lvbnMgYW5kIGNyZWF0ZSBzY2FsZXMNCiAgaWYgKCFkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aCkgew0KICAgIHBjLmRldGVjdERpbWVuc2lvbnMoKQ0KICB9DQogIHBjLmF1dG9zY2FsZSgpOw0KDQogIHBjLnJlbmRlcltfXy5tb2RlXSgpOw0KDQogIGV2ZW50cy5yZW5kZXIuY2FsbCh0aGlzKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5yZW5kZXJCcnVzaGVkID0gZnVuY3Rpb24oKSB7DQogIGlmICghZDMua2V5cyhfXy5kaW1lbnNpb25zKS5sZW5ndGgpIHBjLmRldGVjdERpbWVuc2lvbnMoKTsNCg0KICBwYy5yZW5kZXJCcnVzaGVkW19fLm1vZGVdKCk7DQoNCiAgZXZlbnRzLnJlbmRlci5jYWxsKHRoaXMpOw0KICByZXR1cm4gdGhpczsNCn07DQoNCmZ1bmN0aW9uIGlzQnJ1c2hlZCgpIHsNCiAgaWYgKF9fLmJydXNoZWQgJiYgX18uYnJ1c2hlZC5sZW5ndGggIT09IF9fLmRhdGEubGVuZ3RoKQ0KICAgIHJldHVybiB0cnVlOw0KDQogIHZhciBvYmplY3QgPSBicnVzaC5jdXJyZW50TW9kZSgpLmJydXNoU3RhdGUoKTsNCg0KICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7DQogICAgaWYgKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQogICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIGZhbHNlOw0KfTsNCg0KcGMucmVuZGVyLmRlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgcGMuY2xlYXIoJ2ZvcmVncm91bmQnKTsNCiAgcGMuY2xlYXIoJ2hpZ2hsaWdodCcpOw0KDQogIHBjLnJlbmRlckJydXNoZWQuZGVmYXVsdCgpOw0KDQogIF9fLmRhdGEuZm9yRWFjaChwYXRoX2ZvcmVncm91bmQpOw0KfTsNCg0KdmFyIGZvcmVncm91bmRRdWV1ZSA9IGQzLnJlbmRlclF1ZXVlKHBhdGhfZm9yZWdyb3VuZCkNCiAgLnJhdGUoNTApDQogIC5jbGVhcihmdW5jdGlvbigpIHsNCiAgICBwYy5jbGVhcignZm9yZWdyb3VuZCcpOw0KICAgIHBjLmNsZWFyKCdoaWdobGlnaHQnKTsNCiAgfSk7DQoNCnBjLnJlbmRlci5xdWV1ZSA9IGZ1bmN0aW9uKCkgew0KICBwYy5yZW5kZXJCcnVzaGVkLnF1ZXVlKCk7DQoNCiAgZm9yZWdyb3VuZFF1ZXVlKF9fLmRhdGEpOw0KfTsNCg0KcGMucmVuZGVyQnJ1c2hlZC5kZWZhdWx0ID0gZnVuY3Rpb24oKSB7DQogIHBjLmNsZWFyKCdicnVzaGVkJyk7DQoNCiAgaWYgKGlzQnJ1c2hlZCgpKSB7DQogICAgX18uYnJ1c2hlZC5mb3JFYWNoKHBhdGhfYnJ1c2hlZCk7DQogIH0NCn07DQoNCnZhciBicnVzaGVkUXVldWUgPSBkMy5yZW5kZXJRdWV1ZShwYXRoX2JydXNoZWQpDQogIC5yYXRlKDUwKQ0KICAuY2xlYXIoZnVuY3Rpb24oKSB7DQogICAgcGMuY2xlYXIoJ2JydXNoZWQnKTsNCiAgfSk7DQoNCnBjLnJlbmRlckJydXNoZWQucXVldWUgPSBmdW5jdGlvbigpIHsNCiAgaWYgKGlzQnJ1c2hlZCgpKSB7DQogICAgYnJ1c2hlZFF1ZXVlKF9fLmJydXNoZWQpOw0KICB9IGVsc2Ugew0KICAgIGJydXNoZWRRdWV1ZShbXSk7IC8vIFRoaXMgaXMgbmVlZGVkIHRvIGNsZWFyIHRoZSBjdXJyZW50bHkgYnJ1c2hlZCBpdGVtcw0KICB9DQp9Ow0KZnVuY3Rpb24gY29tcHV0ZV9jbHVzdGVyX2NlbnRyb2lkcyhkKSB7DQoNCgl2YXIgY2x1c3RlckNlbnRyb2lkcyA9IGQzLm1hcCgpOw0KCXZhciBjbHVzdGVyQ291bnRzID0gZDMubWFwKCk7DQoJLy8gZGV0ZXJtaW5lIGNsdXN0ZXJDb3VudHMNCglfXy5kYXRhLmZvckVhY2goZnVuY3Rpb24ocm93KSB7DQoJCXZhciBzY2FsZWQgPSBfXy5kaW1lbnNpb25zW2RdLnlzY2FsZShyb3dbZF0pOw0KCQlpZiAoIWNsdXN0ZXJDb3VudHMuaGFzKHNjYWxlZCkpIHsNCgkJCWNsdXN0ZXJDb3VudHMuc2V0KHNjYWxlZCwgMCk7DQoJCX0NCgkJdmFyIGNvdW50ID0gY2x1c3RlckNvdW50cy5nZXQoc2NhbGVkKTsNCgkJY2x1c3RlckNvdW50cy5zZXQoc2NhbGVkLCBjb3VudCArIDEpOw0KCX0pOw0KDQoJX18uZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKHJvdykgew0KCQlkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLm1hcChmdW5jdGlvbihwLCBpKSB7DQoJCQl2YXIgc2NhbGVkID0gX18uZGltZW5zaW9uc1tkXS55c2NhbGUocm93W2RdKTsNCgkJCWlmICghY2x1c3RlckNlbnRyb2lkcy5oYXMoc2NhbGVkKSkgew0KCQkJCXZhciBtYXAgPSBkMy5tYXAoKTsNCgkJCQljbHVzdGVyQ2VudHJvaWRzLnNldChzY2FsZWQsIG1hcCk7DQoJCQl9DQoJCQlpZiAoIWNsdXN0ZXJDZW50cm9pZHMuZ2V0KHNjYWxlZCkuaGFzKHApKSB7DQoJCQkJY2x1c3RlckNlbnRyb2lkcy5nZXQoc2NhbGVkKS5zZXQocCwgMCk7DQoJCQl9DQoJCQl2YXIgdmFsdWUgPSBjbHVzdGVyQ2VudHJvaWRzLmdldChzY2FsZWQpLmdldChwKTsNCgkJCXZhbHVlICs9IF9fLmRpbWVuc2lvbnNbcF0ueXNjYWxlKHJvd1twXSkgLyBjbHVzdGVyQ291bnRzLmdldChzY2FsZWQpOw0KCQkJY2x1c3RlckNlbnRyb2lkcy5nZXQoc2NhbGVkKS5zZXQocCwgdmFsdWUpOw0KCQl9KTsNCgl9KTsNCg0KCXJldHVybiBjbHVzdGVyQ2VudHJvaWRzOw0KDQp9DQoNCmZ1bmN0aW9uIGNvbXB1dGVfY2VudHJvaWRzKHJvdykgew0KCXZhciBjZW50cm9pZHMgPSBbXTsNCg0KCXZhciBwID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKTsNCgl2YXIgY29scyA9IHAubGVuZ3RoOw0KCXZhciBhID0gMC41OwkJCS8vIGNlbnRlciBiZXR3ZWVuIGF4ZXMNCglmb3IgKHZhciBpID0gMDsgaSA8IGNvbHM7ICsraSkgew0KCQkvLyBjZW50cm9pZHMgb24gJ3JlYWwnIGF4ZXMNCgkJdmFyIHggPSBwb3NpdGlvbihwW2ldKTsNCgkJdmFyIHkgPSBfXy5kaW1lbnNpb25zW3BbaV1dLnlzY2FsZShyb3dbcFtpXV0pOw0KCQljZW50cm9pZHMucHVzaCgkVihbeCwgeV0pKTsNCg0KCQkvLyBjZW50cm9pZHMgb24gJ3ZpcnR1YWwnIGF4ZXMNCgkJaWYgKGkgPCBjb2xzIC0gMSkgew0KCQkJdmFyIGN4ID0geCArIGEgKiAocG9zaXRpb24ocFtpKzFdKSAtIHgpOw0KCQkJdmFyIGN5ID0geSArIGEgKiAoX18uZGltZW5zaW9uc1twW2krMV1dLnlzY2FsZShyb3dbcFtpKzFdXSkgLSB5KTsNCgkJCWlmIChfXy5idW5kbGVEaW1lbnNpb24gIT09IG51bGwpIHsNCgkJCQl2YXIgbGVmdENlbnRyb2lkID0gX18uY2x1c3RlckNlbnRyb2lkcy5nZXQoX18uZGltZW5zaW9uc1tfXy5idW5kbGVEaW1lbnNpb25dLnlzY2FsZShyb3dbX18uYnVuZGxlRGltZW5zaW9uXSkpLmdldChwW2ldKTsNCgkJCQl2YXIgcmlnaHRDZW50cm9pZCA9IF9fLmNsdXN0ZXJDZW50cm9pZHMuZ2V0KF9fLmRpbWVuc2lvbnNbX18uYnVuZGxlRGltZW5zaW9uXS55c2NhbGUocm93W19fLmJ1bmRsZURpbWVuc2lvbl0pKS5nZXQocFtpKzFdKTsNCgkJCQl2YXIgY2VudHJvaWQgPSAwLjUgKiAobGVmdENlbnRyb2lkICsgcmlnaHRDZW50cm9pZCk7DQoJCQkJY3kgPSBjZW50cm9pZCArICgxIC0gX18uYnVuZGxpbmdTdHJlbmd0aCkgKiAoY3kgLSBjZW50cm9pZCk7DQoJCQl9DQoJCQljZW50cm9pZHMucHVzaCgkVihbY3gsIGN5XSkpOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIGNlbnRyb2lkczsNCn0NCg0KZnVuY3Rpb24gY29tcHV0ZV9jb250cm9sX3BvaW50cyhjZW50cm9pZHMpIHsNCg0KCXZhciBjb2xzID0gY2VudHJvaWRzLmxlbmd0aDsNCgl2YXIgYSA9IF9fLnNtb290aG5lc3M7DQoJdmFyIGNwcyA9IFtdOw0KDQoJY3BzLnB1c2goY2VudHJvaWRzWzBdKTsNCgljcHMucHVzaCgkVihbY2VudHJvaWRzWzBdLmUoMSkgKyBhKjIqKGNlbnRyb2lkc1sxXS5lKDEpLWNlbnRyb2lkc1swXS5lKDEpKSwgY2VudHJvaWRzWzBdLmUoMildKSk7DQoJZm9yICh2YXIgY29sID0gMTsgY29sIDwgY29scyAtIDE7ICsrY29sKSB7DQoJCXZhciBtaWQgPSBjZW50cm9pZHNbY29sXTsNCgkJdmFyIGxlZnQgPSBjZW50cm9pZHNbY29sIC0gMV07DQoJCXZhciByaWdodCA9IGNlbnRyb2lkc1tjb2wgKyAxXTsNCg0KCQl2YXIgZGlmZiA9IGxlZnQuc3VidHJhY3QocmlnaHQpOw0KCQljcHMucHVzaChtaWQuYWRkKGRpZmYueChhKSkpOw0KCQljcHMucHVzaChtaWQpOw0KCQljcHMucHVzaChtaWQuc3VidHJhY3QoZGlmZi54KGEpKSk7DQoJfQ0KCWNwcy5wdXNoKCRWKFtjZW50cm9pZHNbY29scy0xXS5lKDEpICsgYSoyKihjZW50cm9pZHNbY29scy0yXS5lKDEpLWNlbnRyb2lkc1tjb2xzLTFdLmUoMSkpLCBjZW50cm9pZHNbY29scy0xXS5lKDIpXSkpOw0KCWNwcy5wdXNoKGNlbnRyb2lkc1tjb2xzIC0gMV0pOw0KDQoJcmV0dXJuIGNwczsNCg0KfTtwYy5zaGFkb3dzID0gZnVuY3Rpb24oKSB7DQoJZmxhZ3Muc2hhZG93cyA9IHRydWU7DQoJcGMuYWxwaGFPbkJydXNoZWQoMC4xKTsNCglwYy5yZW5kZXIoKTsNCglyZXR1cm4gdGhpczsNCn07DQoNCi8vIGRyYXcgZG90cyB3aXRoIHJhZGl1cyByIG9uIHRoZSBheGlzIGxpbmUgd2hlcmUgZGF0YSBpbnRlcnNlY3RzDQpwYy5heGlzRG90cyA9IGZ1bmN0aW9uKHIpIHsNCgl2YXIgciA9IHIgfHwgMC4xOw0KCXZhciBjdHggPSBwYy5jdHgubWFya3M7DQoJdmFyIHN0YXJ0QW5nbGUgPSAwOw0KCXZhciBlbmRBbmdsZSA9IDIgKiBNYXRoLlBJOw0KCWN0eC5nbG9iYWxBbHBoYSA9IGQzLm1pbihbIDEgLyBNYXRoLnBvdyhfXy5kYXRhLmxlbmd0aCwgMSAvIDIpLCAxIF0pOw0KCV9fLmRhdGEuZm9yRWFjaChmdW5jdGlvbihkKSB7DQoJCWQzLmVudHJpZXMoX18uZGltZW5zaW9ucykuZm9yRWFjaChmdW5jdGlvbihwLCBpKSB7DQoJCQljdHguYmVnaW5QYXRoKCk7DQoJCQljdHguYXJjKHBvc2l0aW9uKHApLCBfXy5kaW1lbnNpb25zW3Aua2V5XS55c2NhbGUoZFtwXSksIHIsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKTsNCgkJCWN0eC5zdHJva2UoKTsNCgkJCWN0eC5maWxsKCk7DQoJCX0pOw0KCX0pOw0KCXJldHVybiB0aGlzOw0KfTsNCg0KLy8gZHJhdyBzaW5nbGUgY3ViaWMgYmV6aWVyIGN1cnZlDQpmdW5jdGlvbiBzaW5nbGVfY3VydmUoZCwgY3R4KSB7DQoNCgl2YXIgY2VudHJvaWRzID0gY29tcHV0ZV9jZW50cm9pZHMoZCk7DQoJdmFyIGNwcyA9IGNvbXB1dGVfY29udHJvbF9wb2ludHMoY2VudHJvaWRzKTsNCg0KCWN0eC5tb3ZlVG8oY3BzWzBdLmUoMSksIGNwc1swXS5lKDIpKTsNCglmb3IgKHZhciBpID0gMTsgaSA8IGNwcy5sZW5ndGg7IGkgKz0gMykgew0KCQlpZiAoX18uc2hvd0NvbnRyb2xQb2ludHMpIHsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgMzsgaisrKSB7DQoJCQkJY3R4LmZpbGxSZWN0KGNwc1tpK2pdLmUoMSksIGNwc1tpK2pdLmUoMiksIDIsIDIpOw0KCQkJfQ0KCQl9DQoJCWN0eC5iZXppZXJDdXJ2ZVRvKGNwc1tpXS5lKDEpLCBjcHNbaV0uZSgyKSwgY3BzW2krMV0uZSgxKSwgY3BzW2krMV0uZSgyKSwgY3BzW2krMl0uZSgxKSwgY3BzW2krMl0uZSgyKSk7DQoJfQ0KfTsNCg0KLy8gZHJhdyBzaW5nbGUgcG9seWxpbmUNCmZ1bmN0aW9uIGNvbG9yX3BhdGgoZCwgY3R4KSB7DQoJY3R4LmJlZ2luUGF0aCgpOw0KCWlmICgoX18uYnVuZGxlRGltZW5zaW9uICE9PSBudWxsICYmIF9fLmJ1bmRsaW5nU3RyZW5ndGggPiAwKSB8fCBfXy5zbW9vdGhuZXNzID4gMCkgew0KCQlzaW5nbGVfY3VydmUoZCwgY3R4KTsNCgl9IGVsc2Ugew0KCQlzaW5nbGVfcGF0aChkLCBjdHgpOw0KCX0NCgljdHguc3Ryb2tlKCk7DQp9Ow0KDQovLyBkcmF3IG1hbnkgcG9seWxpbmVzIG9mIHRoZSBzYW1lIGNvbG9yDQpmdW5jdGlvbiBwYXRocyhkYXRhLCBjdHgpIHsNCgljdHguY2xlYXJSZWN0KC0xLCAtMSwgdygpICsgMiwgaCgpICsgMik7DQoJY3R4LmJlZ2luUGF0aCgpOw0KCWRhdGEuZm9yRWFjaChmdW5jdGlvbihkKSB7DQoJCWlmICgoX18uYnVuZGxlRGltZW5zaW9uICE9PSBudWxsICYmIF9fLmJ1bmRsaW5nU3RyZW5ndGggPiAwKSB8fCBfXy5zbW9vdGhuZXNzID4gMCkgew0KCQkJc2luZ2xlX2N1cnZlKGQsIGN0eCk7DQoJCX0gZWxzZSB7DQoJCQlzaW5nbGVfcGF0aChkLCBjdHgpOw0KCQl9DQoJfSk7DQoJY3R4LnN0cm9rZSgpOw0KfTsNCg0KLy8gcmV0dXJucyB0aGUgeS1wb3NpdGlvbiBqdXN0IGJleW9uZCB0aGUgc2VwYXJhdGluZyBudWxsIHZhbHVlIGxpbmUNCmZ1bmN0aW9uIGdldE51bGxQb3NpdGlvbigpIHsNCglpZiAoX18ubnVsbFZhbHVlU2VwYXJhdG9yPT0iYm90dG9tIikgew0KCQlyZXR1cm4gaCgpKzE7DQoJfSBlbHNlIGlmIChfXy5udWxsVmFsdWVTZXBhcmF0b3I9PSJ0b3AiKSB7DQoJCXJldHVybiAxOw0KCX0gZWxzZSB7DQoJCWNvbnNvbGUubG9nKCJBIHZhbHVlIGlzIE5VTEwsIGJ1dCBudWxsVmFsdWVTZXBhcmF0b3IgaXMgbm90IHNldDsgc2V0IGl0IHRvICdib3R0b20nIG9yICd0b3AnLiIpOw0KCX0NCglyZXR1cm4gaCgpKzE7DQp9Ow0KDQpmdW5jdGlvbiBzaW5nbGVfcGF0aChkLCBjdHgpIHsNCglkMy5lbnRyaWVzKF9fLmRpbWVuc2lvbnMpLmZvckVhY2goZnVuY3Rpb24ocCwgaSkgeyAgLy9wIGlzbid0IHJlYWxseSBwDQoJCWlmIChpID09IDApIHsNCgkJCWN0eC5tb3ZlVG8ocG9zaXRpb24ocC5rZXkpLCB0eXBlb2YgZFtwLmtleV0gPT0ndW5kZWZpbmVkJyA/IGdldE51bGxQb3NpdGlvbigpIDogX18uZGltZW5zaW9uc1twLmtleV0ueXNjYWxlKGRbcC5rZXldKSk7DQoJCX0gZWxzZSB7DQoJCQljdHgubGluZVRvKHBvc2l0aW9uKHAua2V5KSwgdHlwZW9mIGRbcC5rZXldID09J3VuZGVmaW5lZCcgPyBnZXROdWxsUG9zaXRpb24oKSA6IF9fLmRpbWVuc2lvbnNbcC5rZXldLnlzY2FsZShkW3Aua2V5XSkpOw0KCQl9DQoJfSk7DQp9Ow0KDQpmdW5jdGlvbiBwYXRoX2JydXNoZWQoZCwgaSkgew0KICBpZiAoX18uYnJ1c2hlZENvbG9yICE9PSBudWxsKSB7DQogICAgY3R4LmJydXNoZWQuc3Ryb2tlU3R5bGUgPSBkMy5mdW5jdG9yKF9fLmJydXNoZWRDb2xvcikoZCwgaSk7DQogIH0gZWxzZSB7DQogICAgY3R4LmJydXNoZWQuc3Ryb2tlU3R5bGUgPSBkMy5mdW5jdG9yKF9fLmNvbG9yKShkLCBpKTsNCiAgfQ0KICByZXR1cm4gY29sb3JfcGF0aChkLCBjdHguYnJ1c2hlZCkNCn07DQoNCmZ1bmN0aW9uIHBhdGhfZm9yZWdyb3VuZChkLCBpKSB7DQogIGN0eC5mb3JlZ3JvdW5kLnN0cm9rZVN0eWxlID0gZDMuZnVuY3RvcihfXy5jb2xvcikoZCwgaSk7DQoJcmV0dXJuIGNvbG9yX3BhdGgoZCwgY3R4LmZvcmVncm91bmQpOw0KfTsNCg0KZnVuY3Rpb24gcGF0aF9oaWdobGlnaHQoZCwgaSkgew0KICBjdHguaGlnaGxpZ2h0LnN0cm9rZVN0eWxlID0gZDMuZnVuY3RvcihfXy5jb2xvcikoZCwgaSk7DQoJcmV0dXJuIGNvbG9yX3BhdGgoZCwgY3R4LmhpZ2hsaWdodCk7DQp9Ow0KcGMuY2xlYXIgPSBmdW5jdGlvbihsYXllcikgew0KICBjdHhbbGF5ZXJdLmNsZWFyUmVjdCgwLCAwLCB3KCkgKyAyLCBoKCkgKyAyKTsNCg0KICAvLyBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGZvcmVncm91bmQgaXRlbXMgYXJlIHRyYW5zcGFyZW50DQogIC8vIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGNoYW5naW5nIHRoZSBvcGFjaXR5IHN0eWxlIG9mIHRoZSBmb3JlZ3JvdW5kIGNhbnZhcw0KICAvLyBhcyB0aGlzIHdvdWxkIHN0b3AgdGhlIGNzcyBzdHlsaW5nIGZyb20gd29ya2luZw0KICBpZihsYXllciA9PT0gImJydXNoZWQiICYmIGlzQnJ1c2hlZCgpKSB7DQogICAgY3R4LmJydXNoZWQuZmlsbFN0eWxlID0gcGMuc2VsZWN0aW9uLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQWxwaGEgPSAxIC0gX18uYWxwaGFPbkJydXNoZWQ7DQogICAgY3R4LmJydXNoZWQuZmlsbFJlY3QoMCwgMCwgdygpICsgMiwgaCgpICsgMik7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQWxwaGEgPSBfXy5hbHBoYTsNCiAgfQ0KICByZXR1cm4gdGhpczsNCn07DQpkMy5yZWJpbmQocGMsIGF4aXMsICJ0aWNrcyIsICJvcmllbnQiLCAidGlja1ZhbHVlcyIsICJ0aWNrU3ViZGl2aWRlIiwgInRpY2tTaXplIiwgInRpY2tQYWRkaW5nIiwgInRpY2tGb3JtYXQiKTsNCg0KZnVuY3Rpb24gZmxpcEF4aXNBbmRVcGRhdGVQQ1AoZGltZW5zaW9uKSB7DQogIHZhciBnID0gcGMuc3ZnLnNlbGVjdEFsbCgiLmRpbWVuc2lvbiIpOw0KDQogIHBjLmZsaXAoZGltZW5zaW9uKTsNCg0KICBkMy5zZWxlY3QodGhpcy5wYXJlbnRFbGVtZW50KQ0KICAgIC50cmFuc2l0aW9uKCkNCiAgICAgIC5kdXJhdGlvbihfXy5hbmltYXRpb25UaW1lKQ0KICAgICAgLmNhbGwoYXhpcy5zY2FsZShfXy5kaW1lbnNpb25zW2RpbWVuc2lvbl0ueXNjYWxlKSk7DQoNCiAgcGMucmVuZGVyKCk7DQp9DQoNCmZ1bmN0aW9uIHJvdGF0ZUxhYmVscygpIHsNCiAgaWYgKCFfXy5yb3RhdGVMYWJlbHMpIHJldHVybjsNCiAgDQogIHZhciBkZWx0YSA9IGQzLmV2ZW50LmRlbHRhWTsNCiAgZGVsdGEgPSBkZWx0YSA8IDAgPyAtNSA6IGRlbHRhOw0KICBkZWx0YSA9IGRlbHRhID4gMCA/IDUgOiBkZWx0YTsNCg0KICBfXy5kaW1lbnNpb25UaXRsZVJvdGF0aW9uICs9IGRlbHRhOw0KICBwYy5zdmcuc2VsZWN0QWxsKCJ0ZXh0LmxhYmVsIikNCiAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLC01KSByb3RhdGUoIiArIF9fLmRpbWVuc2lvblRpdGxlUm90YXRpb24gKyAiKSIpOw0KICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KfQ0KDQpmdW5jdGlvbiBkaW1lbnNpb25MYWJlbHMoZCkgew0KICByZXR1cm4gX18uZGltZW5zaW9uc1tkXS50aXRsZSA/IF9fLmRpbWVuc2lvbnNbZF0udGl0bGUgOiBkOyAgLy8gZGltZW5zaW9uIGRpc3BsYXkgbmFtZXMNCn0NCg0KcGMuY3JlYXRlQXhlcyA9IGZ1bmN0aW9uKCkgew0KICBpZiAoZykgcGMucmVtb3ZlQXhlcygpOw0KDQogIC8vIEFkZCBhIGdyb3VwIGVsZW1lbnQgZm9yIGVhY2ggZGltZW5zaW9uLg0KICBnID0gcGMuc3ZnLnNlbGVjdEFsbCgiLmRpbWVuc2lvbiIpDQogICAgICAuZGF0YShwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpLCBmdW5jdGlvbihkKSB7DQogICAgICAgIHJldHVybiBkOw0KICAgICAgfSkNCiAgICAuZW50ZXIoKS5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJkaW1lbnNpb24iKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHhzY2FsZShkKSArICIpIjsNCiAgICAgIH0pOw0KDQogIC8vIEFkZCBhbiBheGlzIGFuZCB0aXRsZS4NCiAgZy5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJheGlzIikNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKDAsMCkiKQ0KICAgICAgLmVhY2goZnVuY3Rpb24oZCkgew0KICAgICAgICB2YXIgYXhpc0VsZW1lbnQgPSBkMy5zZWxlY3QodGhpcykuY2FsbCggcGMuYXBwbHlBeGlzQ29uZmlnKGF4aXMsIF9fLmRpbWVuc2lvbnNbZF0pICk7DQoNCiAgICAgICAgYXhpc0VsZW1lbnQuc2VsZWN0QWxsKCJwYXRoIikNCiAgICAgICAgICAgIC5zdHlsZSgiZmlsbCIsICJub25lIikNCiAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgIiMyMjIiKQ0KICAgICAgICAgICAgLnN0eWxlKCJzaGFwZS1yZW5kZXJpbmciLCAiY3Jpc3BFZGdlcyIpOw0KDQogICAgICAgIGF4aXNFbGVtZW50LnNlbGVjdEFsbCgibGluZSIpDQogICAgICAgICAgICAuc3R5bGUoImZpbGwiLCAibm9uZSIpDQogICAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsICIjMjIyIikNCiAgICAgICAgICAgIC5zdHlsZSgic2hhcGUtcmVuZGVyaW5nIiwgImNyaXNwRWRnZXMiKTsNCiAgICAgIH0pDQogICAgLmFwcGVuZCgic3ZnOnRleHQiKQ0KICAgICAgLmF0dHIoew0KICAgICAgICAidGV4dC1hbmNob3IiOiAibWlkZGxlIiwNCiAgICAgICAgInkiOiAwLA0KICAgICAgICAidHJhbnNmb3JtIjogInRyYW5zbGF0ZSgwLC01KSByb3RhdGUoIiArIF9fLmRpbWVuc2lvblRpdGxlUm90YXRpb24gKyAiKSIsDQogICAgICAgICJ4IjogMCwNCiAgICAgICAgImNsYXNzIjogImxhYmVsIg0KICAgICAgfSkNCiAgICAgIC50ZXh0KGRpbWVuc2lvbkxhYmVscykNCiAgICAgIC5vbigiZGJsY2xpY2siLCBmbGlwQXhpc0FuZFVwZGF0ZVBDUCkNCiAgICAgIC5vbigid2hlZWwiLCByb3RhdGVMYWJlbHMpOw0KDQogIGlmIChfXy5udWxsVmFsdWVTZXBhcmF0b3I9PSJ0b3AiKSB7DQogICAgcGMuc3ZnLmFwcGVuZCgibGluZSIpDQogICAgICAuYXR0cigieDEiLCAwKQ0KICAgICAgLmF0dHIoInkxIiwgMStfXy5udWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nLnRvcCkNCiAgICAgIC5hdHRyKCJ4MiIsIHcoKSkNCiAgICAgIC5hdHRyKCJ5MiIsIDErX18ubnVsbFZhbHVlU2VwYXJhdG9yUGFkZGluZy50b3ApDQogICAgICAuYXR0cigic3Ryb2tlLXdpZHRoIiwgMSkNCiAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzc3NyIpDQogICAgICAuYXR0cigiZmlsbCIsICJub25lIikNCiAgICAgIC5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCAiY3Jpc3BFZGdlcyIpOw0KICB9IGVsc2UgaWYgKF9fLm51bGxWYWx1ZVNlcGFyYXRvcj09ImJvdHRvbSIpIHsNCiAgICBwYy5zdmcuYXBwZW5kKCJsaW5lIikNCiAgICAgIC5hdHRyKCJ4MSIsIDApDQogICAgICAuYXR0cigieTEiLCBoKCkrMS1fXy5udWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nLmJvdHRvbSkNCiAgICAgIC5hdHRyKCJ4MiIsIHcoKSkNCiAgICAgIC5hdHRyKCJ5MiIsIGgoKSsxLV9fLm51bGxWYWx1ZVNlcGFyYXRvclBhZGRpbmcuYm90dG9tKQ0KICAgICAgLmF0dHIoInN0cm9rZS13aWR0aCIsIDEpDQogICAgICAuYXR0cigic3Ryb2tlIiwgIiM3NzciKQ0KICAgICAgLmF0dHIoImZpbGwiLCAibm9uZSIpDQogICAgICAuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwgImNyaXNwRWRnZXMiKTsNCiAgfQ0KDQogIGZsYWdzLmF4ZXM9IHRydWU7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KcGMucmVtb3ZlQXhlcyA9IGZ1bmN0aW9uKCkgew0KICBnLnJlbW92ZSgpOw0KICBnID0gdW5kZWZpbmVkOw0KICByZXR1cm4gdGhpczsNCn07DQoNCnBjLnVwZGF0ZUF4ZXMgPSBmdW5jdGlvbihhbmltYXRpb25UaW1lKSB7DQogIGlmICh0eXBlb2YgYW5pbWF0aW9uVGltZSA9PT0gJ3VuZGVmaW5lZCcpIHsNCiAgICBhbmltYXRpb25UaW1lID0gX18uYW5pbWF0aW9uVGltZTsNCiAgfQ0KDQogIHZhciBnX2RhdGEgPSBwYy5zdmcuc2VsZWN0QWxsKCIuZGltZW5zaW9uIikuZGF0YShwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpKTsNCg0KICAvLyBFbnRlcg0KICBnX2RhdGEuZW50ZXIoKS5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJkaW1lbnNpb24iKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKHApIHsgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHBvc2l0aW9uKHApICsgIikiOyB9KQ0KICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMCkNCiAgICAuYXBwZW5kKCJzdmc6ZyIpDQogICAgICAuYXR0cigiY2xhc3MiLCAiYXhpcyIpDQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLDApIikNCiAgICAgIC5lYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgdmFyIGF4aXNFbGVtZW50ID0gZDMuc2VsZWN0KHRoaXMpLmNhbGwoIHBjLmFwcGx5QXhpc0NvbmZpZyhheGlzLCBfXy5kaW1lbnNpb25zW2RdKSApOw0KDQogICAgICAgIGF4aXNFbGVtZW50LnNlbGVjdEFsbCgicGF0aCIpDQogICAgICAgICAgICAuc3R5bGUoImZpbGwiLCAibm9uZSIpDQogICAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsICIjMjIyIikNCiAgICAgICAgICAgIC5zdHlsZSgic2hhcGUtcmVuZGVyaW5nIiwgImNyaXNwRWRnZXMiKTsNCg0KICAgICAgICBheGlzRWxlbWVudC5zZWxlY3RBbGwoImxpbmUiKQ0KICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgIm5vbmUiKQ0KICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCAiIzIyMiIpDQogICAgICAgICAgICAuc3R5bGUoInNoYXBlLXJlbmRlcmluZyIsICJjcmlzcEVkZ2VzIik7DQogICAgICB9KQ0KICAgIC5hcHBlbmQoInN2Zzp0ZXh0IikNCiAgICAgIC5hdHRyKHsNCiAgICAgICAgInRleHQtYW5jaG9yIjogIm1pZGRsZSIsDQogICAgICAgICJ5IjogMCwNCiAgICAgICAgInRyYW5zZm9ybSI6ICJ0cmFuc2xhdGUoMCwtNSkgcm90YXRlKCIgKyBfXy5kaW1lbnNpb25UaXRsZVJvdGF0aW9uICsgIikiLA0KICAgICAgICAieCI6IDAsDQogICAgICAgICJjbGFzcyI6ICJsYWJlbCINCiAgICAgIH0pDQogICAgICAudGV4dChkaW1lbnNpb25MYWJlbHMpDQogICAgICAub24oImRibGNsaWNrIiwgZmxpcEF4aXNBbmRVcGRhdGVQQ1ApDQogICAgICAub24oIndoZWVsIiwgcm90YXRlTGFiZWxzKTsNCg0KICAvLyBVcGRhdGUNCiAgZ19kYXRhLmF0dHIoIm9wYWNpdHkiLCAwKTsNCiAgZ19kYXRhLnNlbGVjdCgiLmF4aXMiKQ0KICAgIC50cmFuc2l0aW9uKCkNCiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25UaW1lKQ0KICAgICAgLmVhY2goZnVuY3Rpb24oZCkgeyBkMy5zZWxlY3QodGhpcykuY2FsbCggcGMuYXBwbHlBeGlzQ29uZmlnKGF4aXMsIF9fLmRpbWVuc2lvbnNbZF0pICkNCiAgICAgIH0pOw0KICBnX2RhdGEuc2VsZWN0KCIubGFiZWwiKQ0KICAgIC50cmFuc2l0aW9uKCkNCiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25UaW1lKQ0KICAgICAgLnRleHQoZGltZW5zaW9uTGFiZWxzKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoMCwtNSkgcm90YXRlKCIgKyBfXy5kaW1lbnNpb25UaXRsZVJvdGF0aW9uICsgIikiKTsNCg0KICAvLyBFeGl0DQogIGdfZGF0YS5leGl0KCkucmVtb3ZlKCk7DQoNCiAgZyA9IHBjLnN2Zy5zZWxlY3RBbGwoIi5kaW1lbnNpb24iKTsNCiAgZy50cmFuc2l0aW9uKCkuZHVyYXRpb24oYW5pbWF0aW9uVGltZSkNCiAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24ocCkgeyByZXR1cm4gInRyYW5zbGF0ZSgiICsgcG9zaXRpb24ocCkgKyAiKSI7IH0pDQogICAgLnN0eWxlKCJvcGFjaXR5IiwgMSk7DQoNCiAgcGMuc3ZnLnNlbGVjdEFsbCgiLmF4aXMiKQ0KICAgIC50cmFuc2l0aW9uKCkNCiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25UaW1lKQ0KICAgICAgLmVhY2goZnVuY3Rpb24oZCkgeyBkMy5zZWxlY3QodGhpcykuY2FsbCggcGMuYXBwbHlBeGlzQ29uZmlnKGF4aXMsIF9fLmRpbWVuc2lvbnNbZF0pICk7DQogICAgICB9KTsNCg0KICBpZiAoZmxhZ3MuYnJ1c2hhYmxlKSBwYy5icnVzaGFibGUoKTsNCiAgaWYgKGZsYWdzLnJlb3JkZXJhYmxlKSBwYy5yZW9yZGVyYWJsZSgpOw0KICBpZiAocGMuYnJ1c2hNb2RlKCkgIT09ICJOb25lIikgew0KICAgIHZhciBtb2RlID0gcGMuYnJ1c2hNb2RlKCk7DQogICAgcGMuYnJ1c2hNb2RlKCJOb25lIik7DQogICAgcGMuYnJ1c2hNb2RlKG1vZGUpOw0KICB9DQogIHJldHVybiB0aGlzOw0KfTsNCg0KcGMuYXBwbHlBeGlzQ29uZmlnID0gZnVuY3Rpb24oYXhpcywgZGltZW5zaW9uKSB7DQogIHJldHVybiBheGlzLnNjYWxlKGRpbWVuc2lvbi55c2NhbGUpDQogICAgLm9yaWVudChkaW1lbnNpb24ub3JpZW50KQ0KICAgIC50aWNrcyhkaW1lbnNpb24udGlja3MpDQogICAgLnRpY2tWYWx1ZXMoZGltZW5zaW9uLnRpY2tWYWx1ZXMpDQogICAgLmlubmVyVGlja1NpemUoZGltZW5zaW9uLmlubmVyVGlja1NpemUpDQogICAgLm91dGVyVGlja1NpemUoZGltZW5zaW9uLm91dGVyVGlja1NpemUpDQogICAgLnRpY2tQYWRkaW5nKGRpbWVuc2lvbi50aWNrUGFkZGluZykNCiAgICAudGlja0Zvcm1hdChkaW1lbnNpb24udGlja0Zvcm1hdCkNCn07DQoNCi8vIEphc29uIERhdmllcywgaHR0cDovL2JsLm9ja3Mub3JnLzEzNDEyODENCnBjLnJlb3JkZXJhYmxlID0gZnVuY3Rpb24oKSB7DQogIGlmICghZykgcGMuY3JlYXRlQXhlcygpOw0KDQogIGcuc3R5bGUoImN1cnNvciIsICJtb3ZlIikNCiAgICAuY2FsbChkMy5iZWhhdmlvci5kcmFnKCkNCiAgICAgIC5vbigiZHJhZ3N0YXJ0IiwgZnVuY3Rpb24oZCkgew0KICAgICAgICBkcmFnZ2luZ1tkXSA9IHRoaXMuX19vcmlnaW5fXyA9IHhzY2FsZShkKTsNCiAgICAgIH0pDQogICAgICAub24oImRyYWciLCBmdW5jdGlvbihkKSB7DQogICAgICAgIGRyYWdnaW5nW2RdID0gTWF0aC5taW4odygpLCBNYXRoLm1heCgwLCB0aGlzLl9fb3JpZ2luX18gKz0gZDMuZXZlbnQuZHgpKTsNCiAgICAgICAgcGMuc29ydERpbWVuc2lvbnMoKTsNCiAgICAgICAgeHNjYWxlLmRvbWFpbihwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpKTsNCiAgICAgICAgcGMucmVuZGVyKCk7DQogICAgICAgIGcuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyBwb3NpdGlvbihkKSArICIpIjsNCiAgICAgICAgfSk7DQogICAgICB9KQ0KICAgICAgLm9uKCJkcmFnZW5kIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICAvLyBMZXQncyBzZWUgaWYgdGhlIG9yZGVyIGhhcyBjaGFuZ2VkIGFuZCBzZW5kIG91dCBhbiBldmVudCBpZiBzby4NCiAgICAgICAgdmFyIGkgPSAwLA0KICAgICAgICAgICAgaiA9IF9fLmRpbWVuc2lvbnNbZF0uaW5kZXgsDQogICAgICAgICAgICBlbGVtID0gdGhpcywNCiAgICAgICAgICAgIHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudDsNCg0KICAgICAgICB3aGlsZSgoZWxlbSA9IGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZykgIT0gbnVsbCkgKytpOw0KICAgICAgICBpZiAoaSAhPT0gaikgew0KICAgICAgICAgIGV2ZW50cy5heGVzcmVvcmRlci5jYWxsKHBjLCBwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpKTsNCiAgICAgICAgICAvLyBXZSBub3cgYWxzbyB3YW50IHRvIHJlb3JkZXIgdGhlIGFjdHVhbCBkb20gZWxlbWVudHMgdGhhdCByZXByZXNlbnQNCiAgICAgICAgICAvLyB0aGUgYXhlcy4gVGhhdCBpcywgdGhlIGcuZGltZW5zaW9uIGVsZW1lbnRzLiBJZiB3ZSBkb24ndCBkbyB0aGlzLA0KICAgICAgICAgIC8vIHdlIGdldCBhIHdlaXJkIGFuZCBjb25mdXNpbmcgdHJhbnNpdGlvbiB3aGVuIHVwZGF0ZUF4ZXMgaXMgY2FsbGVkLg0KICAgICAgICAgIC8vIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQsIGluaXRpYWxseSB0aGUgbnRoIGcuZGltZW5zaW9uIGVsZW1lbnQNCiAgICAgICAgICAvLyByZXByZXNlbnRzIHRoZSBudGggYXhpcy4gSG93ZXZlciwgYWZ0ZXIgYSBtYW51YWwgcmVvcmRlcmluZywNCiAgICAgICAgICAvLyB3aXRob3V0IHJlb3JkZXJpbmcgdGhlIGRvbSBlbGVtZW50cywgdGhlIG50aCBkb20gZWxlbWVudHMgbm8gbG9uZ2VyDQogICAgICAgICAgLy8gbmVjZXNzYXJpbHkgcmVwcmVzZW50cyB0aGUgbnRoIGF4aXMuDQogICAgICAgICAgLy8NCiAgICAgICAgICAvLyBpIGlzIHRoZSBvcmlnaW5hbCBpbmRleCBvZiB0aGUgZG9tIGVsZW1lbnQNCiAgICAgICAgICAvLyBqIGlzIHRoZSBuZXcgaW5kZXggb2YgdGhlIGRvbSBlbGVtZW50DQogICAgICAgICAgaWYgKGkgPiBqKSB7IC8vIEVsZW1lbnQgbW92ZWQgbGVmdA0KICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLCBwYXJlbnQuY2hpbGRyZW5baiAtIDFdKTsNCiAgICAgICAgICB9IGVsc2UgeyAgICAgLy8gRWxlbWVudCBtb3ZlZCByaWdodA0KICAgICAgICAgICAgaWYgKChqICsgMSkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7DQogICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcywgcGFyZW50LmNoaWxkcmVuW2ogKyAxXSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZGVsZXRlIHRoaXMuX19vcmlnaW5fXzsNCiAgICAgICAgZGVsZXRlIGRyYWdnaW5nW2RdOw0KICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHhzY2FsZShkKSArICIpIik7DQogICAgICAgIHBjLnJlbmRlcigpOw0KICAgICAgfSkpOw0KICBmbGFncy5yZW9yZGVyYWJsZSA9IHRydWU7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gUmVvcmRlciBkaW1lbnNpb25zLCBzdWNoIHRoYXQgdGhlIGhpZ2hlc3QgdmFsdWUgKHZpc3VhbGx5KSBpcyBvbiB0aGUgbGVmdCBhbmQNCi8vIHRoZSBsb3dlc3Qgb24gdGhlIHJpZ2h0LiBWaXN1YWwgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhIHZhbHVlcyBpbg0KLy8gdGhlIGdpdmVuIHJvdy4NCnBjLnJlb3JkZXIgPSBmdW5jdGlvbihyb3dkYXRhKSB7DQogIHZhciBmaXJzdERpbSA9IHBjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKClbMF07DQoNCiAgcGMuc29ydERpbWVuc2lvbnNCeVJvd0RhdGEocm93ZGF0YSk7DQogIC8vIE5PVEU6IHRoaXMgaXMgcmVsYXRpdmVseSBjaGVhcCBnaXZlbiB0aGF0Og0KICAvLyBudW1iZXIgb2YgZGltZW5zaW9ucyA8IG51bWJlciBvZiBkYXRhIGl0ZW1zDQogIC8vIFRodXMgd2UgY2hlY2sgZXF1YWxpdHkgb2Ygb3JkZXIgdG8gcHJldmVudCByZXJlbmRlcmluZyB3aGVuIHRoaXMgaXMgdGhlIGNhc2UuDQogIHZhciByZW9yZGVyZWQgPSBmYWxzZTsNCiAgcmVvcmRlcmVkID0gZmlyc3REaW0gIT09IHBjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKClbMF07DQoNCiAgaWYgKHJlb3JkZXJlZCkgew0KICAgIHhzY2FsZS5kb21haW4ocGMuZ2V0T3JkZXJlZERpbWVuc2lvbktleXMoKSk7DQogICAgdmFyIGhpZ2hsaWdodGVkID0gX18uaGlnaGxpZ2h0ZWQuc2xpY2UoMCk7DQogICAgcGMudW5oaWdobGlnaHQoKTsNCg0KICAgIGcudHJhbnNpdGlvbigpDQogICAgICAuZHVyYXRpb24oMTUwMCkNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7DQogICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB4c2NhbGUoZCkgKyAiKSI7DQogICAgICB9KTsNCiAgICBwYy5yZW5kZXIoKTsNCg0KICAgIC8vIHBjLmhpZ2hsaWdodCgpIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgaGlnaGxpZ2h0ZWQgaXMgbGVuZ3RoIHplcm8sIHNvIHdlIGRvIHRoYXQgaGVyZS4NCiAgICBpZiAoaGlnaGxpZ2h0ZWQubGVuZ3RoICE9PSAwKSB7DQogICAgICBwYy5oaWdobGlnaHQoaGlnaGxpZ2h0ZWQpOw0KICAgIH0NCiAgfQ0KfQ0KDQpwYy5zb3J0RGltZW5zaW9uc0J5Um93RGF0YSA9IGZ1bmN0aW9uKHJvd2RhdGEpIHsNCiAgdmFyIGNvcHkgPSBfXy5kaW1lbnNpb25zOw0KICB2YXIgcG9zaXRpb25Tb3J0ZWRLZXlzID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsNCiAgICB2YXIgcGl4ZWxEaWZmZXJlbmNlID0gX18uZGltZW5zaW9uc1thXS55c2NhbGUocm93ZGF0YVthXSkgLSBfXy5kaW1lbnNpb25zW2JdLnlzY2FsZShyb3dkYXRhW2JdKTsNCg0KICAgIC8vIEFycmF5LnNvcnQgaXMgbm90IG5lY2Vzc2FyaWx5IHN0YWJsZSwgdGhpcyBtZWFucyB0aGF0IGlmIHBpeGVsRGlmZmVyZW5jZSBpcyB6ZXJvDQogICAgLy8gdGhlIG9yZGVyaW5nIG9mIGRpbWVuc2lvbnMgbWlnaHQgY2hhbmdlIHVuZXhwZWN0ZWRseS4gVGhpcyBpcyBzb2x2ZWQgYnkgc29ydGluZyBvbg0KICAgIC8vIHZhcmlhYmxlIG5hbWUgaW4gdGhhdCBjYXNlLg0KICAgIGlmIChwaXhlbERpZmZlcmVuY2UgPT09IDApIHsNCiAgICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7DQogICAgfSAvLyBlbHNlDQogICAgcmV0dXJuIHBpeGVsRGlmZmVyZW5jZTsNCiAgfSk7DQogIF9fLmRpbWVuc2lvbnMgPSB7fTsNCiAgcG9zaXRpb25Tb3J0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24ocCwgaSl7DQogICAgX18uZGltZW5zaW9uc1twXSA9IGNvcHlbcF07DQogICAgX18uZGltZW5zaW9uc1twXS5pbmRleCA9IGk7DQogIH0pOw0KfQ0KDQpwYy5zb3J0RGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkgew0KICB2YXIgY29weSA9IF9fLmRpbWVuc2lvbnM7DQogIHZhciBwb3NpdGlvblNvcnRlZEtleXMgPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KICAgIHJldHVybiBwb3NpdGlvbihhKSAtIHBvc2l0aW9uKGIpOw0KICB9KTsNCiAgX18uZGltZW5zaW9ucyA9IHt9Ow0KICBwb3NpdGlvblNvcnRlZEtleXMuZm9yRWFjaChmdW5jdGlvbihwLCBpKXsNCiAgICBfXy5kaW1lbnNpb25zW3BdID0gY29weVtwXTsNCiAgICBfXy5kaW1lbnNpb25zW3BdLmluZGV4ID0gaTsNCiAgfSkNCn07DQoNCi8vIHBhaXJzIG9mIGFkamFjZW50IGRpbWVuc2lvbnMNCnBjLmFkamFjZW50X3BhaXJzID0gZnVuY3Rpb24oYXJyKSB7DQogIHZhciByZXQgPSBbXTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoLTE7IGkrKykgew0KICAgIHJldC5wdXNoKFthcnJbaV0sYXJyW2krMV1dKTsNCiAgfTsNCiAgcmV0dXJuIHJldDsNCn07DQoNCnZhciBicnVzaCA9IHsNCiAgbW9kZXM6IHsNCiAgICAiTm9uZSI6IHsNCiAgICAgIGluc3RhbGw6IGZ1bmN0aW9uKHBjKSB7fSwgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGJlIGRvbmUuDQogICAgICB1bmluc3RhbGw6IGZ1bmN0aW9uKHBjKSB7fSwgICAgICAgICAgLy8gTm90aGluZyB0byBiZSBkb25lLg0KICAgICAgc2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0sIC8vIE5vdGhpbmcgdG8gcmV0dXJuDQogICAgICBicnVzaFN0YXRlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHt9OyB9DQogICAgfQ0KICB9LA0KICBtb2RlOiAiTm9uZSIsDQogIHByZWRpY2F0ZTogIkFORCIsDQogIGN1cnJlbnRNb2RlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5tb2Rlc1t0aGlzLm1vZGVdOw0KICB9DQp9Ow0KDQovLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciAnbGl2ZScgdXBkYXRlcyBvZiBicnVzaGVzLiBUaGF0IGlzLCBkdXJpbmcgdGhlDQovLyBzcGVjaWZpY2F0aW9uIG9mIGEgYnJ1c2gsIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZSB2aWV3Lg0KLy8NCi8vIEBwYXJhbSBuZXdTZWxlY3Rpb24gLSBUaGUgbmV3IHNldCBvZiBkYXRhIGl0ZW1zIHRoYXQgaXMgY3VycmVudGx5IGNvbnRhaW5lZA0KLy8gICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBicnVzaGVzDQpmdW5jdGlvbiBicnVzaFVwZGF0ZWQobmV3U2VsZWN0aW9uKSB7DQogIF9fLmJydXNoZWQgPSBuZXdTZWxlY3Rpb247DQogIGV2ZW50cy5icnVzaC5jYWxsKHBjLF9fLmJydXNoZWQpOw0KICBwYy5yZW5kZXJCcnVzaGVkKCk7DQp9DQoNCmZ1bmN0aW9uIGJydXNoUHJlZGljYXRlKHByZWRpY2F0ZSkgew0KICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgcmV0dXJuIGJydXNoLnByZWRpY2F0ZTsgfQ0KDQogIHByZWRpY2F0ZSA9IFN0cmluZyhwcmVkaWNhdGUpLnRvVXBwZXJDYXNlKCk7DQogIGlmIChwcmVkaWNhdGUgIT09ICJBTkQiICYmIHByZWRpY2F0ZSAhPT0gIk9SIikgew0KICAgIHRocm93ICJJbnZhbGlkIHByZWRpY2F0ZSAiICsgcHJlZGljYXRlOw0KICB9DQoNCiAgYnJ1c2gucHJlZGljYXRlID0gcHJlZGljYXRlOw0KICBfXy5icnVzaGVkID0gYnJ1c2guY3VycmVudE1vZGUoKS5zZWxlY3RlZCgpOw0KICBwYy5yZW5kZXJCcnVzaGVkKCk7DQogIHJldHVybiBwYzsNCn0NCg0KcGMuYnJ1c2hNb2RlcyA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYnJ1c2gubW9kZXMpOw0KfTsNCg0KcGMuYnJ1c2hNb2RlID0gZnVuY3Rpb24obW9kZSkgew0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgew0KICAgIHJldHVybiBicnVzaC5tb2RlOw0KICB9DQoNCiAgaWYgKHBjLmJydXNoTW9kZXMoKS5pbmRleE9mKG1vZGUpID09PSAtMSkgew0KICAgIHRocm93ICJwYy5icnVzaG1vZGU6IFVuc3VwcG9ydGVkIGJydXNoIG1vZGU6ICIgKyBtb2RlOw0KICB9DQoNCiAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgdHJpZ2dlciB1bm5lY2Vzc2FyeSBldmVudHMgYnkgY2hlY2tpbmcgaWYgdGhlIG1vZGUNCiAgLy8gYWN0dWFsbHkgY2hhbmdlcy4NCiAgaWYgKG1vZGUgIT09IGJydXNoLm1vZGUpIHsNCiAgICAvLyBXaGVuIGNoYW5naW5nIGJydXNoIG1vZGVzLCB0aGUgZmlyc3QgdGhpbmcgd2UgbmVlZCB0byBkbyBpcyBjbGVhcmluZyBhbnkNCiAgICAvLyBicnVzaGVzIGZyb20gdGhlIGN1cnJlbnQgbW9kZSwgaWYgYW55Lg0KICAgIGlmIChicnVzaC5tb2RlICE9PSAiTm9uZSIpIHsNCiAgICAgIHBjLmJydXNoUmVzZXQoKTsNCiAgICB9DQoNCiAgICAvLyBOZXh0LCB3ZSBuZWVkIHRvICd1bmluc3RhbGwnIHRoZSBjdXJyZW50IGJydXNoTW9kZS4NCiAgICBicnVzaC5tb2Rlc1ticnVzaC5tb2RlXS51bmluc3RhbGwocGMpOw0KICAgIC8vIEZpbmFsbHksIHdlIGNhbiBpbnN0YWxsIHRoZSByZXF1ZXN0ZWQgb25lLg0KICAgIGJydXNoLm1vZGUgPSBtb2RlOw0KICAgIGJydXNoLm1vZGVzW2JydXNoLm1vZGVdLmluc3RhbGwoKTsNCiAgICBpZiAobW9kZSA9PT0gIk5vbmUiKSB7DQogICAgICBkZWxldGUgcGMuYnJ1c2hQcmVkaWNhdGU7DQogICAgfSBlbHNlIHsNCiAgICAgIHBjLmJydXNoUHJlZGljYXRlID0gYnJ1c2hQcmVkaWNhdGU7DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIHBjOw0KfTsNCg0KLy8gYnJ1c2ggbW9kZTogMUQtQXhlcw0KDQooZnVuY3Rpb24oKSB7DQoJdmFyIGJydXNoZXMgPSB7fTsNCg0KCWZ1bmN0aW9uIGlzX2JydXNoZWQocCkgew0KCQlyZXR1cm4gIWJydXNoZXNbcF0uZW1wdHkoKTsNCgl9DQoNCiAgLy8gZGF0YSB3aXRoaW4gZXh0ZW50cw0KICBmdW5jdGlvbiBzZWxlY3RlZCgpIHsNCiAgICB2YXIgYWN0aXZlcyA9IGQzLmtleXMoX18uZGltZW5zaW9ucykuZmlsdGVyKGlzX2JydXNoZWQpLA0KICAgICAgICBleHRlbnRzID0gYWN0aXZlcy5tYXAoZnVuY3Rpb24ocCkgeyByZXR1cm4gYnJ1c2hlc1twXS5leHRlbnQoKTsgfSk7DQoNCgkJLy8gV2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIGZ1bGwgZGF0YSBzZXQgd2hlbiB0aGVyZSBhcmUgbm8gYXhlcyBicnVzaGVkLg0KCQkvLyBBY3R1YWxseSwgd2hlbiB0aGVyZSBhcmUgbm8gYXhlcyBicnVzaGVkLCBieSBkZWZpbml0aW9uLCBubyBpdGVtcyBhcmUNCgkJLy8gc2VsZWN0ZWQuIFNvLCBsZXQncyBhdm9pZCB0aGUgZmlsdGVyaW5nIGFuZCBqdXN0IHJldHVybiBmYWxzZS4NCgkJLy9pZiAoYWN0aXZlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTsNCg0KCQkvLyBSZXNvbHZlcyBicm9rZW4gZXhhbXBsZXMgZm9yIG5vdy4gVGhleSBleHBlY3QgdG8gZ2V0IHRoZSBmdWxsIGRhdGFzZXQgYmFjayBmcm9tIGVtcHR5IGJydXNoZXMNCgkJaWYgKGFjdGl2ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gX18uZGF0YTsNCg0KCQkvLyB0ZXN0IGlmIHdpdGhpbiByYW5nZQ0KCQl2YXIgd2l0aGluID0gew0KCQkJImRhdGUiOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uKSB7DQoJaWYgKHR5cGVvZiBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZS5yYW5nZVBvaW50cyA9PT0gImZ1bmN0aW9uIikgeyAvLyBpZiBpdCBpcyBvcmRpbmFsDQogICAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXVswXSA8PSBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZShkW3BdKSAmJiBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZShkW3BdKSA8PSBleHRlbnRzW2RpbWVuc2lvbl1bMV0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByZXR1cm4gZXh0ZW50c1tkaW1lbnNpb25dWzBdIDw9IGRbcF0gJiYgZFtwXSA8PSBleHRlbnRzW2RpbWVuc2lvbl1bMV0NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJudW1iZXIiOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uKSB7DQogICAgICAgIGlmICh0eXBlb2YgX18uZGltZW5zaW9uc1twXS55c2NhbGUucmFuZ2VQb2ludHMgPT09ICJmdW5jdGlvbiIpIHsgLy8gaWYgaXQgaXMgb3JkaW5hbA0KICAgICAgICAgIHJldHVybiBleHRlbnRzW2RpbWVuc2lvbl1bMF0gPD0gX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgJiYgX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgPD0gZXh0ZW50c1tkaW1lbnNpb25dWzFdDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXVswXSA8PSBkW3BdICYmIGRbcF0gPD0gZXh0ZW50c1tkaW1lbnNpb25dWzFdDQogICAgICAgIH0NCiAgICAgIH0sDQogICAgICAic3RyaW5nIjogZnVuY3Rpb24oZCxwLGRpbWVuc2lvbikgew0KICAgICAgICByZXR1cm4gZXh0ZW50c1tkaW1lbnNpb25dWzBdIDw9IF9fLmRpbWVuc2lvbnNbcF0ueXNjYWxlKGRbcF0pICYmIF9fLmRpbWVuc2lvbnNbcF0ueXNjYWxlKGRbcF0pIDw9IGV4dGVudHNbZGltZW5zaW9uXVsxXQ0KICAgICAgfQ0KICAgIH07DQoNCiAgICByZXR1cm4gX18uZGF0YQ0KICAgICAgLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICAgIHN3aXRjaChicnVzaC5wcmVkaWNhdGUpIHsNCiAgICAgICAgY2FzZSAiQU5EIjoNCiAgICAgICAgICByZXR1cm4gYWN0aXZlcy5ldmVyeShmdW5jdGlvbihwLCBkaW1lbnNpb24pIHsNCiAgICAgICAgICAgIHJldHVybiB3aXRoaW5bX18uZGltZW5zaW9uc1twXS50eXBlXShkLHAsZGltZW5zaW9uKTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgY2FzZSAiT1IiOg0KICAgICAgICAgIHJldHVybiBhY3RpdmVzLnNvbWUoZnVuY3Rpb24ocCwgZGltZW5zaW9uKSB7DQogICAgICAgICAgICByZXR1cm4gd2l0aGluW19fLmRpbWVuc2lvbnNbcF0udHlwZV0oZCxwLGRpbWVuc2lvbik7DQogICAgICAgICAgfSk7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgdGhyb3cgIlVua25vd24gYnJ1c2ggcHJlZGljYXRlICIgKyBfXy5icnVzaFByZWRpY2F0ZTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogIH07DQoNCiAgZnVuY3Rpb24gYnJ1c2hFeHRlbnRzKGV4dGVudHMpIHsNCiAgICBpZih0eXBlb2YoZXh0ZW50cykgPT09ICd1bmRlZmluZWQnKQ0KCQl7DQoJCQl2YXIgZXh0ZW50cyA9IHt9Ow0KCQkJZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCgkJCQl2YXIgYnJ1c2ggPSBicnVzaGVzW2RdOw0KCQkJCWlmIChicnVzaCAhPT0gdW5kZWZpbmVkICYmICFicnVzaC5lbXB0eSgpKSB7DQoJCQkJCXZhciBleHRlbnQgPSBicnVzaC5leHRlbnQoKTsNCgkJCQkJZXh0ZW50LnNvcnQoZDMuYXNjZW5kaW5nKTsNCgkJCQkJZXh0ZW50c1tkXSA9IGV4dGVudDsNCgkJCQl9DQoJCQl9KTsNCgkJCXJldHVybiBleHRlbnRzOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLy9maXJzdCBnZXQgYWxsIHRoZSBicnVzaCBzZWxlY3Rpb25zDQoJCQl2YXIgYnJ1c2hTZWxlY3Rpb25zID0ge307DQoJCQlnLnNlbGVjdEFsbCgnLmJydXNoJykNCgkJCQkuZWFjaChmdW5jdGlvbihkKSB7DQoJCQkJCWJydXNoU2VsZWN0aW9uc1tkXSA9IGQzLnNlbGVjdCh0aGlzKTsNCg0KCQkJfSk7DQoNCgkJCS8vIGxvb3Agb3ZlciBlYWNoIGRpbWVuc2lvbiBhbmQgdXBkYXRlIGFwcHJvcHJpYXRlbHkgKGlmIGl0IHdhcyBwYXNzZWQgaW4gdGhyb3VnaCBleHRlbnRzKQ0KCQkJZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCgkJCQlpZiAoZXh0ZW50c1tkXSA9PT0gdW5kZWZpbmVkKXsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCXZhciBicnVzaCA9IGJydXNoZXNbZF07DQoJCQkJaWYgKGJydXNoICE9PSB1bmRlZmluZWQpIHsNCgkJCQkJLy91cGRhdGUgdGhlIGV4dGVudA0KCQkJCQlicnVzaC5leHRlbnQoZXh0ZW50c1tkXSk7DQoNCgkJCQkJLy9yZWRyYXcgdGhlIGJydXNoDQoJCQkJCWJydXNoU2VsZWN0aW9uc1tkXQ0KCQkJCQkJLnRyYW5zaXRpb24oKQ0KCQkJCQkJLmR1cmF0aW9uKDApDQoJCQkJCQkuY2FsbChicnVzaCk7DQoNCgkJCQkJLy9maXJlIHNvbWUgZXZlbnRzDQoJCQkJCWJydXNoLmV2ZW50KGJydXNoU2VsZWN0aW9uc1tkXSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCS8vcmVkcmF3IHRoZSBjaGFydA0KCQkJcGMucmVuZGVyQnJ1c2hlZCgpOw0KDQoJCQlyZXR1cm4gcGM7DQoJCX0NCiAgfQ0KDQogIGZ1bmN0aW9uIGJydXNoRm9yKGF4aXMpIHsNCiAgICB2YXIgYnJ1c2ggPSBkMy5zdmcuYnJ1c2goKTsNCg0KICAgIGJydXNoDQogICAgICAueShfXy5kaW1lbnNpb25zW2F4aXNdLnlzY2FsZSkNCiAgICAgIC5vbigiYnJ1c2hzdGFydCIsIGZ1bmN0aW9uKCkgew0KCQkJCWlmKGQzLmV2ZW50LnNvdXJjZUV2ZW50ICE9PSBudWxsKSB7DQoJCQkJCWV2ZW50cy5icnVzaHN0YXJ0LmNhbGwocGMsIF9fLmJydXNoZWQpOw0KCQkJCQlkMy5ldmVudC5zb3VyY2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCgkJCQl9DQoJCQl9KQ0KCQkJLm9uKCJicnVzaCIsIGZ1bmN0aW9uKCkgew0KCQkJCWJydXNoVXBkYXRlZChzZWxlY3RlZCgpKTsNCgkJCX0pDQoJCQkub24oImJydXNoZW5kIiwgZnVuY3Rpb24oKSB7DQoJCQkJZXZlbnRzLmJydXNoZW5kLmNhbGwocGMsIF9fLmJydXNoZWQpOw0KCQkJfSk7DQoNCgkJYnJ1c2hlc1theGlzXSA9IGJydXNoOw0KCQlyZXR1cm4gYnJ1c2g7DQoJfTsNCg0KCWZ1bmN0aW9uIGJydXNoUmVzZXQoZGltZW5zaW9uKSB7DQoJCWlmIChkaW1lbnNpb249PT11bmRlZmluZWQpIHsNCgkJCV9fLmJydXNoZWQgPSBmYWxzZTsNCgkJCWlmIChnKSB7DQoJCQkJZy5zZWxlY3RBbGwoJy5icnVzaCcpDQoJCQkJCS5lYWNoKGZ1bmN0aW9uKGQpIHsNCgkJCQkJCWQzLnNlbGVjdCh0aGlzKQ0KCQkJCQkJCS50cmFuc2l0aW9uKCkNCgkJCQkJCQkuZHVyYXRpb24oMCkNCgkJCQkJCQkuY2FsbChicnVzaGVzW2RdLmNsZWFyKCkpOw0KCQkJCQl9KTsNCgkJCQlwYy5yZW5kZXJCcnVzaGVkKCk7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQlpZiAoZykgew0KCQkJCWcuc2VsZWN0QWxsKCcuYnJ1c2gnKQ0KCQkJCQkuZWFjaChmdW5jdGlvbihkKSB7DQoJCQkJCQlpZiAoZCE9ZGltZW5zaW9uKSByZXR1cm47DQoJCQkJCQlkMy5zZWxlY3QodGhpcykNCgkJCQkJCQkudHJhbnNpdGlvbigpDQoJCQkJCQkJLmR1cmF0aW9uKDApDQoJCQkJCQkJLmNhbGwoYnJ1c2hlc1tkXS5jbGVhcigpKTsNCgkJCQkJCWJydXNoZXNbZF0uZXZlbnQoZDMuc2VsZWN0KHRoaXMpKTsNCgkJCQkJfSk7DQoJCQkJcGMucmVuZGVyQnJ1c2hlZCgpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiB0aGlzOw0KCX07DQoNCglmdW5jdGlvbiBpbnN0YWxsKCkgew0KCQlpZiAoIWcpIHBjLmNyZWF0ZUF4ZXMoKTsNCg0KCQkvLyBBZGQgYW5kIHN0b3JlIGEgYnJ1c2ggZm9yIGVhY2ggYXhpcy4NCgkJdmFyIGJydXNoID0gZy5hcHBlbmQoInN2ZzpnIikNCgkJCS5hdHRyKCJjbGFzcyIsICJicnVzaCIpDQoJCQkuZWFjaChmdW5jdGlvbihkKSB7DQoJCQkJZDMuc2VsZWN0KHRoaXMpLmNhbGwoYnJ1c2hGb3IoZCkpOw0KCQkJfSk7DQoNCgkJYnJ1c2guc2VsZWN0QWxsKCJyZWN0IikNCgkJCQkuc3R5bGUoInZpc2liaWxpdHkiLCBudWxsKQ0KCQkJCS5hdHRyKCJ4IiwgLTE1KQ0KCQkJCS5hdHRyKCJ3aWR0aCIsIDMwKTsNCg0KCQlicnVzaC5zZWxlY3RBbGwoInJlY3QuYmFja2dyb3VuZCIpDQoJCQkJLnN0eWxlKCJmaWxsIiwgInRyYW5zcGFyZW50Iik7DQoNCgkJYnJ1c2guc2VsZWN0QWxsKCJyZWN0LmV4dGVudCIpDQoJCQkJLnN0eWxlKCJmaWxsIiwgInJnYmEoMjU1LDI1NSwyNTUsMC4yNSkiKQ0KCQkJCS5zdHlsZSgic3Ryb2tlIiwgInJnYmEoMCwwLDAsMC42KSIpOw0KDQoJCWJydXNoLnNlbGVjdEFsbCgiLnJlc2l6ZSByZWN0IikNCgkJCQkuc3R5bGUoImZpbGwiLCAicmdiYSgwLDAsMCwwLjEpIik7DQoNCgkJcGMuYnJ1c2hFeHRlbnRzID0gYnJ1c2hFeHRlbnRzOw0KCQlwYy5icnVzaFJlc2V0ID0gYnJ1c2hSZXNldDsNCgkJcmV0dXJuIHBjOw0KCX07DQoNCglicnVzaC5tb2Rlc1siMUQtYXhlcyJdID0gew0KCQlpbnN0YWxsOiBpbnN0YWxsLA0KCQl1bmluc3RhbGw6IGZ1bmN0aW9uKCkgew0KCQkJZy5zZWxlY3RBbGwoIi5icnVzaCIpLnJlbW92ZSgpOw0KCQkJYnJ1c2hlcyA9IHt9Ow0KCQkJZGVsZXRlIHBjLmJydXNoRXh0ZW50czsNCgkJCWRlbGV0ZSBwYy5icnVzaFJlc2V0Ow0KCQl9LA0KCQlzZWxlY3RlZDogc2VsZWN0ZWQsDQoJCWJydXNoU3RhdGU6IGJydXNoRXh0ZW50cw0KCX0NCn0pKCk7DQovLyBicnVzaCBtb2RlOiAyRC1zdHJ1bXMNCi8vIGJsLm9ja3Mub3JnL3N5bnRhZ21hdGljLzU0NDEwMjINCg0KKGZ1bmN0aW9uKCkgew0KICB2YXIgc3RydW1zID0ge30sDQogICAgICBzdHJ1bVJlY3Q7DQoNCiAgZnVuY3Rpb24gZHJhd1N0cnVtKHN0cnVtLCBhY3RpdmVQb2ludCkgew0KICAgIHZhciBzdmcgPSBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5zZWxlY3QoImcjc3RydW1zIiksDQogICAgICAgIGlkID0gc3RydW0uZGltcy5pLA0KICAgICAgICBwb2ludHMgPSBbc3RydW0ucDEsIHN0cnVtLnAyXSwNCiAgICAgICAgbGluZSA9IHN2Zy5zZWxlY3RBbGwoImxpbmUjc3RydW0tIiArIGlkKS5kYXRhKFtzdHJ1bV0pLA0KICAgICAgICBjaXJjbGVzID0gc3ZnLnNlbGVjdEFsbCgiY2lyY2xlI3N0cnVtLSIgKyBpZCkuZGF0YShwb2ludHMpLA0KICAgICAgICBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpOw0KDQogICAgbGluZS5lbnRlcigpDQogICAgICAuYXBwZW5kKCJsaW5lIikNCiAgICAgIC5hdHRyKCJpZCIsICJzdHJ1bS0iICsgaWQpDQogICAgICAuYXR0cigiY2xhc3MiLCAic3RydW0iKTsNCg0KICAgIGxpbmUNCiAgICAgIC5hdHRyKCJ4MSIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuIGQucDFbMF07IH0pDQogICAgICAuYXR0cigieTEiLCBmdW5jdGlvbihkKSB7DQogICAgICAgIHJldHVybiBkLnAxWzFdOyB9KQ0KICAgICAgLmF0dHIoIngyIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gZC5wMlswXTsgfSkNCiAgICAgIC5hdHRyKCJ5MiIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuIGQucDJbMV07IH0pDQogICAgICAuYXR0cigic3Ryb2tlIiwgImJsYWNrIikNCiAgICAgIC5hdHRyKCJzdHJva2Utd2lkdGgiLCAyKTsNCg0KICAgIGRyYWcNCiAgICAgIC5vbigiZHJhZyIsIGZ1bmN0aW9uKGQsIGkpIHsgDQogICAgICAgIHZhciBldiA9IGQzLmV2ZW50Ow0KICAgICAgICBpID0gaSArIDE7DQogICAgICAgIHN0cnVtWyJwIiArIGldWzBdID0gTWF0aC5taW4oTWF0aC5tYXgoc3RydW0ubWluWCArIDEsIGV2LngpLCBzdHJ1bS5tYXhYKTsNCiAgICAgICAgc3RydW1bInAiICsgaV1bMV0gPSBNYXRoLm1pbihNYXRoLm1heChzdHJ1bS5taW5ZLCBldi55KSwgc3RydW0ubWF4WSk7DQogICAgICAgIGRyYXdTdHJ1bShzdHJ1bSwgaSAtIDEpOw0KICAgICAgfSkNCiAgICAgIC5vbigiZHJhZ2VuZCIsIG9uRHJhZ0VuZCgpKTsNCg0KICAgIGNpcmNsZXMuZW50ZXIoKQ0KICAgICAgLmFwcGVuZCgiY2lyY2xlIikNCiAgICAgIC5hdHRyKCJpZCIsICJzdHJ1bS0iICsgaWQpDQogICAgICAuYXR0cigiY2xhc3MiLCAic3RydW0iKTsNCg0KICAgIGNpcmNsZXMNCiAgICAgIC5hdHRyKCJjeCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGRbMF07IH0pDQogICAgICAuYXR0cigiY3kiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkWzFdOyB9KQ0KICAgICAgLmF0dHIoInIiLCA1KQ0KICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgZnVuY3Rpb24oZCwgaSkgew0KICAgICAgICByZXR1cm4gKGFjdGl2ZVBvaW50ICE9PSB1bmRlZmluZWQgJiYgaSA9PT0gYWN0aXZlUG9pbnQpID8gMC44IDogMDsNCiAgICAgIH0pDQogICAgICAub24oIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoIm9wYWNpdHkiLCAwLjgpOw0KICAgICAgfSkNCiAgICAgIC5vbigibW91c2VvdXQiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCJvcGFjaXR5IiwgMCk7DQogICAgICB9KQ0KICAgICAgLmNhbGwoZHJhZyk7DQogIH0NCg0KICBmdW5jdGlvbiBkaW1lbnNpb25zRm9yUG9pbnQocCkgew0KICAgIHZhciBkaW1zID0geyBpOiAtMSwgbGVmdDogdW5kZWZpbmVkLCByaWdodDogdW5kZWZpbmVkIH07DQogICAgZDMua2V5cyhfXy5kaW1lbnNpb25zKS5zb21lKGZ1bmN0aW9uKGRpbSwgaSkgew0KICAgICAgaWYgKHhzY2FsZShkaW0pIDwgcFswXSkgew0KICAgICAgICB2YXIgbmV4dCA9IGQzLmtleXMoX18uZGltZW5zaW9ucylbcGMuZ2V0T3JkZXJlZERpbWVuc2lvbktleXMoKS5pbmRleE9mKGRpbSkrMV07DQogICAgICAgIGRpbXMuaSA9IGk7DQogICAgICAgIGRpbXMubGVmdCA9IGRpbTsNCiAgICAgICAgZGltcy5yaWdodCA9IG5leHQ7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0cnVlOw0KICAgIH0pOw0KDQogICAgaWYgKGRpbXMubGVmdCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAvLyBFdmVudCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBmaXJzdCBheGlzLg0KICAgICAgZGltcy5pID0gMDsNCiAgICAgIGRpbXMubGVmdCA9IHBjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKClbMF07DQogICAgICBkaW1zLnJpZ2h0ID0gcGMuZ2V0T3JkZXJlZERpbWVuc2lvbktleXMoKVsxXTsNCiAgICB9IGVsc2UgaWYgKGRpbXMucmlnaHQgPT09IHVuZGVmaW5lZCkgew0KICAgICAgLy8gRXZlbnQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGxhc3QgYXhpcw0KICAgICAgZGltcy5pID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKS5sZW5ndGggLSAxOw0KICAgICAgZGltcy5yaWdodCA9IGRpbXMubGVmdDsNCiAgICAgIGRpbXMubGVmdCA9IHBjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKClbZDMua2V5cyhfXy5kaW1lbnNpb25zKS5sZW5ndGggLSAyXTsNCiAgICB9DQoNCiAgICByZXR1cm4gZGltczsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KCkgew0KICAgIC8vIEZpcnN0IHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGJldHdlZW4gd2hpY2ggdHdvIGF4ZXMgdGhlIHN0dXJtIHdhcyBzdGFydGVkLg0KICAgIC8vIFRoaXMgd2lsbCBkZXRlcm1pbmUgdGhlIGZyZWVkb20gb2YgbW92ZW1lbnQsIGJlY2F1c2UgYSBzdHJ1bSBjYW4NCiAgICAvLyBsb2dpY2FsbHkgb25seSBoYXBwZW4gYmV0d2VlbiB0d28gYXhlcywgc28gbm8gbW92ZW1lbnQgb3V0c2lkZSB0aGVzZSBheGVzDQogICAgLy8gc2hvdWxkIGJlIGFsbG93ZWQuDQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHAgPSBkMy5tb3VzZShzdHJ1bVJlY3RbMF1bMF0pLA0KICAgICAgICAgIGRpbXMsDQogICAgICAgICAgc3RydW07DQoNCiAgICAgIHBbMF0gPSBwWzBdIC0gX18ubWFyZ2luLmxlZnQ7DQogICAgICBwWzFdID0gcFsxXSAtIF9fLm1hcmdpbi50b3A7DQoNCiAgICAgIGRpbXMgPSBkaW1lbnNpb25zRm9yUG9pbnQocCksDQogICAgICBzdHJ1bSA9IHsNCiAgICAgICAgcDE6IHAsDQogICAgICAgIGRpbXM6IGRpbXMsDQogICAgICAgIG1pblg6IHhzY2FsZShkaW1zLmxlZnQpLA0KICAgICAgICBtYXhYOiB4c2NhbGUoZGltcy5yaWdodCksDQogICAgICAgIG1pblk6IDAsDQogICAgICAgIG1heFk6IGgoKQ0KICAgICAgfTsNCg0KICAgICAgc3RydW1zW2RpbXMuaV0gPSBzdHJ1bTsNCiAgICAgIHN0cnVtcy5hY3RpdmUgPSBkaW1zLmk7DQoNCiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kcw0KICAgICAgc3RydW0ucDFbMF0gPSBNYXRoLm1pbihNYXRoLm1heChzdHJ1bS5taW5YLCBwWzBdKSwgc3RydW0ubWF4WCk7DQogICAgICBzdHJ1bS5wMiA9IHN0cnVtLnAxLnNsaWNlKCk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uRHJhZygpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZXYgPSBkMy5ldmVudCwNCiAgICAgICAgICBzdHJ1bSA9IHN0cnVtc1tzdHJ1bXMuYWN0aXZlXTsNCg0KICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRzDQogICAgICBzdHJ1bS5wMlswXSA9IE1hdGgubWluKE1hdGgubWF4KHN0cnVtLm1pblggKyAxLCBldi54IC0gX18ubWFyZ2luLmxlZnQpLCBzdHJ1bS5tYXhYKTsNCiAgICAgIHN0cnVtLnAyWzFdID0gTWF0aC5taW4oTWF0aC5tYXgoc3RydW0ubWluWSwgZXYueSAtIF9fLm1hcmdpbi50b3ApLCBzdHJ1bS5tYXhZKTsNCiAgICAgIGRyYXdTdHJ1bShzdHJ1bSwgMSk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNvbnRhaW5tZW50VGVzdChzdHJ1bSwgd2lkdGgpIHsNCiAgICB2YXIgcDEgPSBbc3RydW0ucDFbMF0gLSBzdHJ1bS5taW5YLCBzdHJ1bS5wMVsxXSAtIHN0cnVtLm1pblhdLA0KICAgICAgICBwMiA9IFtzdHJ1bS5wMlswXSAtIHN0cnVtLm1pblgsIHN0cnVtLnAyWzFdIC0gc3RydW0ubWluWF0sDQogICAgICAgIG0xID0gMSAtIHdpZHRoIC8gcDFbMF0sDQogICAgICAgIGIxID0gcDFbMV0gKiAoMSAtIG0xKSwNCiAgICAgICAgbTIgPSAxIC0gd2lkdGggLyBwMlswXSwNCiAgICAgICAgYjIgPSBwMlsxXSAqICgxIC0gbTIpOw0KDQogICAgLy8gdGVzdCBpZiBwb2ludCBmYWxscyBiZXR3ZWVuIGxpbmVzDQogICAgcmV0dXJuIGZ1bmN0aW9uKHApIHsNCiAgICAgIHZhciB4ID0gcFswXSwNCiAgICAgICAgICB5ID0gcFsxXSwNCiAgICAgICAgICB5MSA9IG0xICogeCArIGIxLA0KICAgICAgICAgIHkyID0gbTIgKiB4ICsgYjI7DQoNCiAgICAgIGlmICh5ID4gTWF0aC5taW4oeTEsIHkyKSAmJiB5IDwgTWF0aC5tYXgoeTEsIHkyKSkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgIH0NCg0KICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBzZWxlY3RlZCgpIHsNCiAgICB2YXIgaWRzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3RydW1zKSwNCiAgICAgICAgYnJ1c2hlZCA9IF9fLmRhdGE7DQoNCiAgICAvLyBHZXQgdGhlIGlkcyBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBzdHJ1bXMuDQogICAgaWRzID0gaWRzLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICByZXR1cm4gIWlzTmFOKGQpOw0KICAgIH0pOw0KDQogICAgZnVuY3Rpb24gY3Jvc3Nlc1N0cnVtKGQsIGlkKSB7DQogICAgICB2YXIgc3RydW0gPSBzdHJ1bXNbaWRdLA0KICAgICAgICAgIHRlc3QgPSBjb250YWlubWVudFRlc3Qoc3RydW0sIHN0cnVtcy53aWR0aChpZCkpLA0KICAgICAgICAgIGQxID0gc3RydW0uZGltcy5sZWZ0LA0KICAgICAgICAgIGQyID0gc3RydW0uZGltcy5yaWdodCwNCiAgICAgICAgICB5MSA9IF9fLmRpbWVuc2lvbnNbZDFdLnlzY2FsZSwNCiAgICAgICAgICB5MiA9IF9fLmRpbWVuc2lvbnNbZDJdLnlzY2FsZSwNCiAgICAgICAgICBwb2ludCA9IFt5MShkW2QxXSkgLSBzdHJ1bS5taW5YLCB5MihkW2QyXSkgLSBzdHJ1bS5taW5YXTsNCiAgICAgIHJldHVybiB0ZXN0KHBvaW50KTsNCiAgICB9DQoNCiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gYnJ1c2hlZDsgfQ0KDQogICAgcmV0dXJuIGJydXNoZWQuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgIHN3aXRjaChicnVzaC5wcmVkaWNhdGUpIHsNCiAgICAgIGNhc2UgIkFORCI6DQogICAgICAgIHJldHVybiBpZHMuZXZlcnkoZnVuY3Rpb24oaWQpIHsgcmV0dXJuIGNyb3NzZXNTdHJ1bShkLCBpZCk7IH0pOw0KICAgICAgY2FzZSAiT1IiOg0KICAgICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24oaWQpIHsgcmV0dXJuIGNyb3NzZXNTdHJ1bShkLCBpZCk7IH0pOw0KICAgICAgZGVmYXVsdDoNCiAgICAgICAgdGhyb3cgIlVua25vd24gYnJ1c2ggcHJlZGljYXRlICIgKyBfXy5icnVzaFByZWRpY2F0ZTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHJlbW92ZVN0cnVtKCkgew0KICAgIHZhciBzdHJ1bSA9IHN0cnVtc1tzdHJ1bXMuYWN0aXZlXSwNCiAgICAgICAgc3ZnID0gcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuc2VsZWN0KCJnI3N0cnVtcyIpOw0KDQogICAgZGVsZXRlIHN0cnVtc1tzdHJ1bXMuYWN0aXZlXTsNCiAgICBzdHJ1bXMuYWN0aXZlID0gdW5kZWZpbmVkOw0KICAgIHN2Zy5zZWxlY3RBbGwoImxpbmUjc3RydW0tIiArIHN0cnVtLmRpbXMuaSkucmVtb3ZlKCk7DQogICAgc3ZnLnNlbGVjdEFsbCgiY2lyY2xlI3N0cnVtLSIgKyBzdHJ1bS5kaW1zLmkpLnJlbW92ZSgpOw0KICB9DQoNCiAgZnVuY3Rpb24gb25EcmFnRW5kKCkgew0KICAgIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBicnVzaGVkID0gX18uZGF0YSwNCiAgICAgICAgICBzdHJ1bSA9IHN0cnVtc1tzdHJ1bXMuYWN0aXZlXTsNCg0KICAgICAgLy8gT2theSwgc29tZXdoYXQgdW5leHBlY3RlZCwgYnV0IG5vdCB0b3RhbGx5IHVuc3VycHJpc2luZywgYSBtb3VzY2xpY2sgaXMNCiAgICAgIC8vIGNvbnNpZGVyZWQgYSBkcmFnIHdpdGhvdXQgbW92ZS4gU28gd2UgaGF2ZSB0byBkZWFsIHdpdGggdGhhdCBjYXNlDQogICAgICBpZiAoc3RydW0gJiYgc3RydW0ucDFbMF0gPT09IHN0cnVtLnAyWzBdICYmIHN0cnVtLnAxWzFdID09PSBzdHJ1bS5wMlsxXSkgew0KICAgICAgICByZW1vdmVTdHJ1bShzdHJ1bXMpOw0KICAgICAgfQ0KDQogICAgICBicnVzaGVkID0gc2VsZWN0ZWQoc3RydW1zKTsNCiAgICAgIHN0cnVtcy5hY3RpdmUgPSB1bmRlZmluZWQ7DQogICAgICBfXy5icnVzaGVkID0gYnJ1c2hlZDsNCiAgICAgIHBjLnJlbmRlckJydXNoZWQoKTsNCiAgICAgIGV2ZW50cy5icnVzaGVuZC5jYWxsKHBjLCBfXy5icnVzaGVkKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gYnJ1c2hSZXNldChzdHJ1bXMpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgaWRzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3RydW1zKS5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gIWlzTmFOKGQpOw0KICAgICAgfSk7DQoNCiAgICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgc3RydW1zLmFjdGl2ZSA9IGQ7DQogICAgICAgIHJlbW92ZVN0cnVtKHN0cnVtcyk7DQogICAgICB9KTsNCiAgICAgIG9uRHJhZ0VuZChzdHJ1bXMpKCk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGluc3RhbGwoKSB7DQogICAgdmFyIGRyYWcgPSBkMy5iZWhhdmlvci5kcmFnKCk7DQoNCiAgICAvLyBNYXAgb2YgY3VycmVudCBzdHJ1bXMuIFN0cnVtcyBhcmUgc3RvcmVkIHBlciBzZWdtZW50IG9mIHRoZSBQQy4gQSBzZWdtZW50LA0KICAgIC8vIGJlaW5nIHRoZSBhcmVhIGJldHdlZW4gdHdvIGF4ZXMuIFRoZSBsZWZ0IG1vc3QgYXJlYSBpcyBpbmRleGVkIGF0IDAuDQogICAgc3RydW1zLmFjdGl2ZSA9IHVuZGVmaW5lZDsNCiAgICAvLyBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgUEMgc2VnbWVudCB3aGVyZSBjdXJyZW50bHkgYSBzdHJ1bSBpcyBiZWluZw0KICAgIC8vIHBsYWNlZC4gTk9URTogZXZlbiB0aG91Z2ggdGhleSBhcmUgZXZlbmx5IHNwYWNlZCBpbiBvdXIgY3VycmVudA0KICAgIC8vIGltcGxlbWVudGF0aW9uLCB3ZSBrZWVwIGZvciB3aGVuIG5vbi1ldmVuIHNwYWNlZCBzZWdtZW50cyBhcmUgc3VwcG9ydGVkIGFzDQogICAgLy8gd2VsbC4NCiAgICBzdHJ1bXMud2lkdGggPSBmdW5jdGlvbihpZCkgew0KICAgICAgdmFyIHN0cnVtID0gc3RydW1zW2lkXTsNCg0KICAgICAgaWYgKHN0cnVtID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICAgIH0NCg0KICAgICAgcmV0dXJuIHN0cnVtLm1heFggLSBzdHJ1bS5taW5YOw0KICAgIH07DQoNCiAgICBwYy5vbigiYXhlc3Jlb3JkZXIuc3RydW1zIiwgZnVuY3Rpb24oKSB7DQogICAgICB2YXIgaWRzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3RydW1zKS5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gIWlzTmFOKGQpOw0KICAgICAgfSk7DQoNCiAgICAgIC8vIENoZWNrcyBpZiB0aGUgZmlyc3QgZGltZW5zaW9uIGlzIGRpcmVjdGx5IGxlZnQgb2YgdGhlIHNlY29uZCBkaW1lbnNpb24uDQogICAgICBmdW5jdGlvbiBjb25zZWN1dGl2ZShmaXJzdCwgc2Vjb25kKSB7DQogICAgICAgIHZhciBsZW5ndGggPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aDsNCiAgICAgICAgcmV0dXJuIGQzLmtleXMoX18uZGltZW5zaW9ucykuc29tZShmdW5jdGlvbihkLCBpKSB7DQogICAgICAgICAgcmV0dXJuIChkID09PSBmaXJzdCkNCiAgICAgICAgICAgID8gaSArIGkgPCBsZW5ndGggJiYgX18uZGltZW5zaW9uc1tpICsgMV0gPT09IHNlY29uZA0KICAgICAgICAgICAgOiBmYWxzZTsNCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIGlmIChpZHMubGVuZ3RoID4gMCkgeyAvLyBXZSBoYXZlIHNvbWUgc3RydW1zLCB3aGljaCBtaWdodCBuZWVkIHRvIGJlIHJlbW92ZWQuDQogICAgICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICB2YXIgZGltcyA9IHN0cnVtc1tkXS5kaW1zOw0KICAgICAgICAgIHN0cnVtcy5hY3RpdmUgPSBkOw0KICAgICAgICAgIC8vIElmIHRoZSB0d28gZGltZW5zaW9ucyBvZiB0aGUgY3VycmVudCBzdHJ1bSBhcmUgbm90IG5leHQgdG8gZWFjaCBvdGhlcg0KICAgICAgICAgIC8vIGFueSBtb3JlLCB0aGFuIHdlJ2xsIG5lZWQgdG8gcmVtb3ZlIHRoZSBzdHJ1bS4gT3RoZXJ3aXNlIHdlIGtlZXAgaXQuDQogICAgICAgICAgaWYgKCFjb25zZWN1dGl2ZShkaW1zLmxlZnQsIGRpbXMucmlnaHQpKSB7DQogICAgICAgICAgICByZW1vdmVTdHJ1bShzdHJ1bXMpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIG9uRHJhZ0VuZChzdHJ1bXMpKCk7DQogICAgICB9DQogICAgfSk7DQoNCiAgICAvLyBBZGQgYSBuZXcgc3ZnIGdyb3VwIGluIHdoaWNoIHdlIGRyYXcgdGhlIHN0cnVtcy4NCiAgICBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5hcHBlbmQoImciKQ0KICAgICAgLmF0dHIoImlkIiwgInN0cnVtcyIpDQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgX18ubWFyZ2luLmxlZnQgKyAiLCIgKyBfXy5tYXJnaW4udG9wICsgIikiKTsNCg0KICAgIC8vIEluc3RhbGwgdGhlIHJlcXVpcmVkIGJydXNoUmVzZXQgZnVuY3Rpb24NCiAgICBwYy5icnVzaFJlc2V0ID0gYnJ1c2hSZXNldChzdHJ1bXMpOw0KDQogICAgZHJhZw0KICAgICAgLm9uKCJkcmFnc3RhcnQiLCBvbkRyYWdTdGFydChzdHJ1bXMpKQ0KICAgICAgLm9uKCJkcmFnIiwgb25EcmFnKHN0cnVtcykpDQogICAgICAub24oImRyYWdlbmQiLCBvbkRyYWdFbmQoc3RydW1zKSk7DQoNCiAgICAvLyBOT1RFOiBUaGUgc3R5bGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUgYW5kIG5vdCBpbiB0aGUgY3NzLiBUaGlzIGlzIGJlY2F1c2UNCiAgICAvLyAgICAgICBmb3IgMUQgYnJ1c2hpbmcsIHRoZSBjYW52YXMgbGF5ZXJzIHNob3VsZCBub3QgbGlzdGVuIHRvDQogICAgLy8gICAgICAgcG9pbnRlci1ldmVudHMuDQogICAgc3RydW1SZWN0ID0gcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuaW5zZXJ0KCJyZWN0IiwgImcjc3RydW1zIikNCiAgICAgIC5hdHRyKCJpZCIsICJzdHJ1bS1ldmVudHMiKQ0KICAgICAgLmF0dHIoIngiLCBfXy5tYXJnaW4ubGVmdCkNCiAgICAgIC5hdHRyKCJ5IiwgX18ubWFyZ2luLnRvcCkNCiAgICAgIC5hdHRyKCJ3aWR0aCIsIHcoKSkNCiAgICAgIC5hdHRyKCJoZWlnaHQiLCBoKCkgKyAyKQ0KICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMCkNCiAgICAgIC5jYWxsKGRyYWcpOw0KICB9DQoNCiAgYnJ1c2gubW9kZXNbIjJELXN0cnVtcyJdID0gew0KICAgIGluc3RhbGw6IGluc3RhbGwsDQogICAgdW5pbnN0YWxsOiBmdW5jdGlvbigpIHsNCiAgICAgIHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgiZyNzdHJ1bXMiKS5yZW1vdmUoKTsNCiAgICAgIHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgicmVjdCNzdHJ1bS1ldmVudHMiKS5yZW1vdmUoKTsNCiAgICAgIHBjLm9uKCJheGVzcmVvcmRlci5zdHJ1bXMiLCB1bmRlZmluZWQpOw0KICAgICAgZGVsZXRlIHBjLmJydXNoUmVzZXQ7DQoNCiAgICAgIHN0cnVtUmVjdCA9IHVuZGVmaW5lZDsNCiAgICB9LA0KICAgIHNlbGVjdGVkOiBzZWxlY3RlZCwNCiAgICBicnVzaFN0YXRlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJ1bXM7IH0NCiAgfTsNCg0KfSgpKTsNCg0KLy8gYnJ1c2ggbW9kZTogMUQtQXhlcyB3aXRoIG11bHRpcGxlIGV4dGVudHMNCi8vIHJlcXVpcmVzIGQzLnN2Zy5tdWx0aWJydXNoDQoNCihmdW5jdGlvbigpIHsNCiAgaWYgKHR5cGVvZiBkMy5zdmcubXVsdGlicnVzaCAhPT0gJ2Z1bmN0aW9uJykgew0KCSAgcmV0dXJuOw0KICB9DQogIHZhciBicnVzaGVzID0ge307DQoNCiAgZnVuY3Rpb24gaXNfYnJ1c2hlZChwKSB7DQogICAgcmV0dXJuICFicnVzaGVzW3BdLmVtcHR5KCk7DQogIH0NCg0KICAvLyBkYXRhIHdpdGhpbiBleHRlbnRzDQogIGZ1bmN0aW9uIHNlbGVjdGVkKCkgew0KICAgIHZhciBhY3RpdmVzID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKS5maWx0ZXIoaXNfYnJ1c2hlZCksDQogICAgICAgIGV4dGVudHMgPSBhY3RpdmVzLm1hcChmdW5jdGlvbihwKSB7IHJldHVybiBicnVzaGVzW3BdLmV4dGVudCgpOyB9KTsNCg0KICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBmdWxsIGRhdGEgc2V0IHdoZW4gdGhlcmUgYXJlIG5vIGF4ZXMgYnJ1c2hlZC4NCiAgICAvLyBBY3R1YWxseSwgd2hlbiB0aGVyZSBhcmUgbm8gYXhlcyBicnVzaGVkLCBieSBkZWZpbml0aW9uLCBubyBpdGVtcyBhcmUNCiAgICAvLyBzZWxlY3RlZC4gU28sIGxldCdzIGF2b2lkIHRoZSBmaWx0ZXJpbmcgYW5kIGp1c3QgcmV0dXJuIGZhbHNlLg0KICAgIC8vaWYgKGFjdGl2ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7DQoNCiAgICAvLyBSZXNvbHZlcyBicm9rZW4gZXhhbXBsZXMgZm9yIG5vdy4gVGhleSBleHBlY3QgdG8gZ2V0IHRoZSBmdWxsIGRhdGFzZXQgYmFjayBmcm9tIGVtcHR5IGJydXNoZXMNCiAgICBpZiAoYWN0aXZlcy5sZW5ndGggPT09IDApIHJldHVybiBfXy5kYXRhOw0KDQogICAgLy8gdGVzdCBpZiB3aXRoaW4gcmFuZ2UNCiAgICB2YXIgd2l0aGluID0gew0KICAgICAgImRhdGUiOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uLGIpIHsNCiAgICAgICAgaWYgKHR5cGVvZiBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZS5yYW5nZVBvaW50cyA9PT0gImZ1bmN0aW9uIikgeyAvLyBpZiBpdCBpcyBvcmRpbmFsDQogICAgICAgICAgcmV0dXJuIGJbMF0gPD0gX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgJiYgX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgPD0gYlsxXQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIGJbMF0gPD0gZFtwXSAmJiBkW3BdIDw9IGJbMV0NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJudW1iZXIiOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uLGIpIHsNCiAgICAgICAgaWYgKHR5cGVvZiBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZS5yYW5nZVBvaW50cyA9PT0gImZ1bmN0aW9uIikgeyAvLyBpZiBpdCBpcyBvcmRpbmFsDQogICAgICAgICAgcmV0dXJuIGJbMF0gPD0gX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgJiYgX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgPD0gYlsxXQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIGJbMF0gPD0gZFtwXSAmJiBkW3BdIDw9IGJbMV0NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJzdHJpbmciOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uLGIpIHsNCiAgICAgICAgcmV0dXJuIGJbMF0gPD0gX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgJiYgX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgPD0gYlsxXQ0KICAgICAgfQ0KICAgIH07DQoNCiAgICByZXR1cm4gX18uZGF0YQ0KICAgIC5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgc3dpdGNoKGJydXNoLnByZWRpY2F0ZSkgew0KICAgICAgY2FzZSAiQU5EIjoNCiAgICAgICAgcmV0dXJuIGFjdGl2ZXMuZXZlcnkoZnVuY3Rpb24ocCwgZGltZW5zaW9uKSB7DQogICAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXS5zb21lKGZ1bmN0aW9uKGIpIHsNCiAgICAgICAgICAJcmV0dXJuIHdpdGhpbltfXy5kaW1lbnNpb25zW3BdLnR5cGVdKGQscCxkaW1lbnNpb24sYik7DQogICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgY2FzZSAiT1IiOg0KICAgICAgICByZXR1cm4gYWN0aXZlcy5zb21lKGZ1bmN0aW9uKHAsIGRpbWVuc2lvbikgew0KICAgICAgCSAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXS5zb21lKGZ1bmN0aW9uKGIpIHsNCiAgICAgICAgICAgIAlyZXR1cm4gd2l0aGluW19fLmRpbWVuc2lvbnNbcF0udHlwZV0oZCxwLGRpbWVuc2lvbixiKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgIGRlZmF1bHQ6DQogICAgICAgIHRocm93ICJVbmtub3duIGJydXNoIHByZWRpY2F0ZSAiICsgX18uYnJ1c2hQcmVkaWNhdGU7DQogICAgICB9DQogICAgfSk7DQogIH07DQoNCiAgZnVuY3Rpb24gYnJ1c2hFeHRlbnRzKGV4dGVudHMpIHsNCiAgICBpZiAodHlwZW9mKGV4dGVudHMpID09PSAndW5kZWZpbmVkJykgew0KICAgICAgZXh0ZW50cyA9IHt9Ow0KICAgICAgZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7DQogICAgICAgIHZhciBicnVzaCA9IGJydXNoZXNbZF07DQogICAgICAgIGlmIChicnVzaCAhPT0gdW5kZWZpbmVkICYmICFicnVzaC5lbXB0eSgpKSB7DQogICAgICAgICAgdmFyIGV4dGVudCA9IGJydXNoLmV4dGVudCgpOw0KICAgICAgICAgIGV4dGVudHNbZF0gPSBleHRlbnQ7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgICAgcmV0dXJuIGV4dGVudHM7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgLy9maXJzdCBnZXQgYWxsIHRoZSBicnVzaCBzZWxlY3Rpb25zDQogICAgICB2YXIgYnJ1c2hTZWxlY3Rpb25zID0ge307DQogICAgICBnLnNlbGVjdEFsbCgnLmJydXNoJykNCiAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgICAgYnJ1c2hTZWxlY3Rpb25zW2RdID0gZDMuc2VsZWN0KHRoaXMpOw0KICAgICAgICAgIH0pOw0KDQogICAgICAvLyBsb29wIG92ZXIgZWFjaCBkaW1lbnNpb24gYW5kIHVwZGF0ZSBhcHByb3ByaWF0ZWx5IChpZiBpdCB3YXMgcGFzc2VkIGluIHRocm91Z2ggZXh0ZW50cykNCiAgICAgIGQzLmtleXMoX18uZGltZW5zaW9ucykuZm9yRWFjaChmdW5jdGlvbiAoZCkgew0KICAgICAgICBpZiAoZXh0ZW50c1tkXSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGJydXNoID0gYnJ1c2hlc1tkXTsNCiAgICAgICAgaWYgKGJydXNoICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAvL3VwZGF0ZSB0aGUgZXh0ZW50DQogICAgICAgICAgYnJ1c2guZXh0ZW50KGV4dGVudHNbZF0pOw0KDQogICAgICAgICAgLy9yZWRyYXcgdGhlIGJydXNoDQogICAgICAgICAgYnJ1c2hTZWxlY3Rpb25zW2RdDQogICAgICAgICAgICAgIC50cmFuc2l0aW9uKCkNCiAgICAgICAgICAgICAgLmR1cmF0aW9uKDApDQogICAgICAgICAgICAgIC5jYWxsKGJydXNoKTsNCg0KICAgICAgICAgIC8vZmlyZSBzb21lIGV2ZW50cw0KICAgICAgICAgIGJydXNoLmV2ZW50KGJydXNoU2VsZWN0aW9uc1tkXSk7DQogICAgICAgIH0NCiAgICAgIH0pOw0KDQogICAgICAvL3JlZHJhdyB0aGUgY2hhcnQNCiAgICAgIHBjLnJlbmRlckJydXNoZWQoKTsNCg0KICAgICAgcmV0dXJuIHBjOw0KICAgIH0NCiAgfQ0KDQogIC8vZnVuY3Rpb24gYnJ1c2hFeHRlbnRzKCkgew0KICAvLyAgdmFyIGV4dGVudHMgPSB7fTsNCiAgLy8gIGQzLmtleXMoX18uZGltZW5zaW9ucykuZm9yRWFjaChmdW5jdGlvbihkKSB7DQogIC8vICAgIHZhciBicnVzaCA9IGJydXNoZXNbZF07DQogIC8vICAgIGlmIChicnVzaCAhPT0gdW5kZWZpbmVkICYmICFicnVzaC5lbXB0eSgpKSB7DQogIC8vICAgICAgdmFyIGV4dGVudCA9IGJydXNoLmV4dGVudCgpOw0KICAvLyAgICAgIGV4dGVudHNbZF0gPSBleHRlbnQ7DQogIC8vICAgIH0NCiAgLy8gIH0pOw0KICAvLyAgcmV0dXJuIGV4dGVudHM7DQogIC8vfQ0KDQogIGZ1bmN0aW9uIGJydXNoRm9yKGF4aXMpIHsNCiAgICB2YXIgYnJ1c2ggPSBkMy5zdmcubXVsdGlicnVzaCgpOw0KDQogICAgYnJ1c2gNCiAgICAgIC55KF9fLmRpbWVuc2lvbnNbYXhpc10ueXNjYWxlKQ0KICAgICAgLm9uKCJicnVzaHN0YXJ0IiwgZnVuY3Rpb24oKSB7DQoJCQkJaWYoZDMuZXZlbnQuc291cmNlRXZlbnQgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmJydXNoc3RhcnQuY2FsbChwYywgX18uYnJ1c2hlZCk7DQoJCQkJCWQzLmV2ZW50LnNvdXJjZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KCQkJCX0NCiAgICAgIH0pDQogICAgICAub24oImJydXNoIiwgZnVuY3Rpb24oKSB7DQogICAgICAgIGJydXNoVXBkYXRlZChzZWxlY3RlZCgpKTsNCiAgICAgIH0pDQogICAgICAub24oImJydXNoZW5kIiwgZnVuY3Rpb24oKSB7DQogICAgCS8vIGQzLnN2Zy5tdWx0aWJydXNoIGNsZWFycyBleHRlbnRzIGp1c3QgYmVmb3JlIGNhbGxpbmcgJ2JydXNoZW5kJw0KICAgIAkvLyBzbyB3ZSBoYXZlIHRvIHVwZGF0ZSBoZXJlIGFnYWluLg0KICAgIAkvLyBUaGlzIGZpeGVzIGlzc3VlICMxMDMgZm9yIG5vdywgYnV0IHNob3VsZCBiZSBjaGFuZ2VkIGluIGQzLnN2Zy5tdWx0aWJydXNoDQogICAgCS8vIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNvbXB1dGF0aW9uLg0KICAgIAlicnVzaFVwZGF0ZWQoc2VsZWN0ZWQoKSk7DQogICAgICAgIGV2ZW50cy5icnVzaGVuZC5jYWxsKHBjLCBfXy5icnVzaGVkKTsNCiAgICAgIH0pDQogICAgICAuZXh0ZW50QWRhcHRpb24oZnVuY3Rpb24oc2VsZWN0aW9uKSB7DQogICAgCSAgc2VsZWN0aW9uDQogICAgCSAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgbnVsbCkNCiAgICAgICAgICAuYXR0cigieCIsIC0xNSkNCiAgICAgICAgICAuYXR0cigid2lkdGgiLCAzMCkNCiAgICAgICAgICAuc3R5bGUoImZpbGwiLCAicmdiYSgyNTUsMjU1LDI1NSwwLjI1KSIpDQogICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCAicmdiYSgwLDAsMCwwLjYpIik7DQogICAgICB9KQ0KICAgICAgLnJlc2l6ZUFkYXB0aW9uKGZ1bmN0aW9uKHNlbGVjdGlvbikgew0KICAgIAkgc2VsZWN0aW9uDQogICAgCSAgIC5zZWxlY3RBbGwoInJlY3QiKQ0KICAgIAkgICAuYXR0cigieCIsIC0xNSkNCiAgICAJICAgLmF0dHIoIndpZHRoIiwgMzApDQogICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCBudWxsKQ0KICAgICAgICAgLnN0eWxlKCJmaWxsIiwgInJnYmEoMCwwLDAsMC4xKSIpOw0KICAgICAgfSk7DQoNCiAgICBicnVzaGVzW2F4aXNdID0gYnJ1c2g7DQogICAgcmV0dXJuIGJydXNoOw0KICB9DQoNCiAgZnVuY3Rpb24gYnJ1c2hSZXNldChkaW1lbnNpb24pIHsNCiAgICBfXy5icnVzaGVkID0gZmFsc2U7DQogICAgaWYgKGcpIHsNCiAgICAgIGcuc2VsZWN0QWxsKCcuYnJ1c2gnKQ0KICAgICAgICAuZWFjaChmdW5jdGlvbihkKSB7DQogICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmNhbGwoDQogICAgICAgICAgICBicnVzaGVzW2RdLmNsZWFyKCkNCiAgICAgICAgICApOw0KICAgICAgICB9KTsNCiAgICAgIHBjLnJlbmRlckJydXNoZWQoKTsNCiAgICB9DQogICAgcmV0dXJuIHRoaXM7DQogIH07DQoNCiAgZnVuY3Rpb24gaW5zdGFsbCgpIHsNCiAgICBpZiAoIWcpIHBjLmNyZWF0ZUF4ZXMoKTsNCg0KICAgIC8vIEFkZCBhbmQgc3RvcmUgYSBicnVzaCBmb3IgZWFjaCBheGlzLg0KICAgIHZhciBicnVzaCA9IGcuYXBwZW5kKCJzdmc6ZyIpDQogICAgICAuYXR0cigiY2xhc3MiLCAiYnJ1c2giKQ0KICAgICAgLmVhY2goZnVuY3Rpb24oZCkgew0KICAgICAgICBkMy5zZWxlY3QodGhpcykuY2FsbChicnVzaEZvcihkKSk7DQogICAgICB9KQ0KDQogICAgYnJ1c2guc2VsZWN0QWxsKCJyZWN0IikNCiAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgbnVsbCkNCiAgICAgICAgLmF0dHIoIngiLCAtMTUpDQogICAgICAgIC5hdHRyKCJ3aWR0aCIsIDMwKTsNCg0KICAgIGJydXNoLnNlbGVjdEFsbCgicmVjdC5iYWNrZ3JvdW5kIikNCiAgICAgICAgLnN0eWxlKCJmaWxsIiwgInRyYW5zcGFyZW50Iik7DQoNCiAgICBicnVzaC5zZWxlY3RBbGwoInJlY3QuZXh0ZW50IikNCiAgICAgICAgLnN0eWxlKCJmaWxsIiwgInJnYmEoMjU1LDI1NSwyNTUsMC4yNSkiKQ0KICAgICAgICAuc3R5bGUoInN0cm9rZSIsICJyZ2JhKDAsMCwwLDAuNikiKTsNCg0KICAgIGJydXNoLnNlbGVjdEFsbCgiLnJlc2l6ZSByZWN0IikNCiAgICAgICAgLnN0eWxlKCJmaWxsIiwgInJnYmEoMCwwLDAsMC4xKSIpOw0KDQogICAgcGMuYnJ1c2hFeHRlbnRzID0gYnJ1c2hFeHRlbnRzOw0KICAgIHBjLmJydXNoUmVzZXQgPSBicnVzaFJlc2V0Ow0KICAgIHJldHVybiBwYzsNCiAgfQ0KDQogIGJydXNoLm1vZGVzWyIxRC1heGVzLW11bHRpIl0gPSB7DQogICAgaW5zdGFsbDogaW5zdGFsbCwNCiAgICB1bmluc3RhbGw6IGZ1bmN0aW9uKCkgew0KICAgICAgZy5zZWxlY3RBbGwoIi5icnVzaCIpLnJlbW92ZSgpOw0KICAgICAgYnJ1c2hlcyA9IHt9Ow0KICAgICAgZGVsZXRlIHBjLmJydXNoRXh0ZW50czsNCiAgICAgIGRlbGV0ZSBwYy5icnVzaFJlc2V0Ow0KICAgIH0sDQogICAgc2VsZWN0ZWQ6IHNlbGVjdGVkLA0KICAgIGJydXNoU3RhdGU6IGJydXNoRXh0ZW50cw0KICB9DQp9KSgpOw0KLy8gYnJ1c2ggbW9kZTogYW5ndWxhcg0KLy8gY29kZSBiYXNlZCBvbiAyRC5zdHJ1bXMuanMNCg0KKGZ1bmN0aW9uKCkgew0KICB2YXIgYXJjcyA9IHt9LA0KICAgICAgc3RydW1SZWN0Ow0KDQogIGZ1bmN0aW9uIGRyYXdTdHJ1bShhcmMsIGFjdGl2ZVBvaW50KSB7DQogICAgdmFyIHN2ZyA9IHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgiZyNhcmNzIiksDQogICAgICAgIGlkID0gYXJjLmRpbXMuaSwNCiAgICAgICAgcG9pbnRzID0gW2FyYy5wMiwgYXJjLnAzXSwNCiAgICAgICAgbGluZSA9IHN2Zy5zZWxlY3RBbGwoImxpbmUjYXJjLSIgKyBpZCkuZGF0YShbe3AxOmFyYy5wMSxwMjphcmMucDJ9LHtwMTphcmMucDEscDI6YXJjLnAzfV0pLA0KICAgICAgICBjaXJjbGVzID0gc3ZnLnNlbGVjdEFsbCgiY2lyY2xlI2FyYy0iICsgaWQpLmRhdGEocG9pbnRzKSwNCiAgICAgICAgZHJhZyA9IGQzLmJlaGF2aW9yLmRyYWcoKSwNCiAgICAgICAgcGF0aCA9IHN2Zy5zZWxlY3RBbGwoInBhdGgjYXJjLSIgKyBpZCkuZGF0YShbYXJjXSk7DQoNCiAgICBwYXRoLmVudGVyKCkNCiAgICAgIC5hcHBlbmQoInBhdGgiKQ0KICAgICAgLmF0dHIoImlkIiwgImFyYy0iICsgaWQpDQogICAgICAuYXR0cigiY2xhc3MiLCAiYXJjIikNCiAgICAgIC5zdHlsZSgiZmlsbCIsICJvcmFuZ2UiKQ0KICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMC41KTsNCg0KICAgIHBhdGgNCiAgICAgIC5hdHRyKCJkIiwgYXJjLmFyYykNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBhcmMucDFbMF0gKyAiLCIgKyBhcmMucDFbMV0gKyAiKSIpOw0KDQogICAgbGluZS5lbnRlcigpDQogICAgICAuYXBwZW5kKCJsaW5lIikNCiAgICAgIC5hdHRyKCJpZCIsICJhcmMtIiArIGlkKQ0KICAgICAgLmF0dHIoImNsYXNzIiwgImFyYyIpOw0KDQogICAgbGluZQ0KICAgICAgLmF0dHIoIngxIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5wMVswXTsgfSkNCiAgICAgIC5hdHRyKCJ5MSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQucDFbMV07IH0pDQogICAgICAuYXR0cigieDIiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnAyWzBdOyB9KQ0KICAgICAgLmF0dHIoInkyIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5wMlsxXTsgfSkNCiAgICAgIC5hdHRyKCJzdHJva2UiLCAiYmxhY2siKQ0KICAgICAgLmF0dHIoInN0cm9rZS13aWR0aCIsIDIpOw0KDQogICAgZHJhZw0KICAgICAgLm9uKCJkcmFnIiwgZnVuY3Rpb24oZCwgaSkgew0KICAgICAgICB2YXIgZXYgPSBkMy5ldmVudCwNCiAgICAgICAgCWFuZ2xlID0gMDsNCg0KICAgICAgICBpID0gaSArIDI7DQoNCiAgICAgICAgYXJjWyJwIiArIGldWzBdID0gTWF0aC5taW4oTWF0aC5tYXgoYXJjLm1pblggKyAxLCBldi54KSwgYXJjLm1heFgpOw0KICAgICAgICBhcmNbInAiICsgaV1bMV0gPSBNYXRoLm1pbihNYXRoLm1heChhcmMubWluWSwgZXYueSksIGFyYy5tYXhZKTsNCg0KICAgICAgICBhbmdsZSA9IGkgPT09IDMgPyBhcmNzLnN0YXJ0QW5nbGUoaWQpIDogYXJjcy5lbmRBbmdsZShpZCk7DQoNCiAgICAgICAgaWYgKChhcmMuc3RhcnRBbmdsZSA8IE1hdGguUEkgJiYgYXJjLmVuZEFuZ2xlIDwgTWF0aC5QSSAmJiBhbmdsZSA8IE1hdGguUEkpIHx8DQogICAgICAgIAkJKGFyYy5zdGFydEFuZ2xlID49IE1hdGguUEkgJiYgYXJjLmVuZEFuZ2xlID49IE1hdGguUEkgJiYgYW5nbGUgPj0gTWF0aC5QSSkpIHsNCg0KICAgICAgICAJaWYgKGkgPT09IDIpIHsNCgkgICAgICAgIAlhcmMuZW5kQW5nbGUgPSBhbmdsZTsNCgkgICAgICAgIAlhcmMuYXJjLmVuZEFuZ2xlKGFuZ2xlKTsNCgkgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMykgew0KCSAgICAgICAgCWFyYy5zdGFydEFuZ2xlID0gYW5nbGU7DQoJICAgICAgICAJYXJjLmFyYy5zdGFydEFuZ2xlKGFuZ2xlKTsNCgkgICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAgICAgICAgZHJhd1N0cnVtKGFyYywgaSAtIDIpOw0KICAgICAgfSkNCiAgICAgIC5vbigiZHJhZ2VuZCIsIG9uRHJhZ0VuZCgpKTsNCg0KICAgIGNpcmNsZXMuZW50ZXIoKQ0KICAgICAgLmFwcGVuZCgiY2lyY2xlIikNCiAgICAgIC5hdHRyKCJpZCIsICJhcmMtIiArIGlkKQ0KICAgICAgLmF0dHIoImNsYXNzIiwgImFyYyIpOw0KDQogICAgY2lyY2xlcw0KICAgICAgLmF0dHIoImN4IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZFswXTsgfSkNCiAgICAgIC5hdHRyKCJjeSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGRbMV07IH0pDQogICAgICAuYXR0cigiciIsIDUpDQogICAgICAuc3R5bGUoIm9wYWNpdHkiLCBmdW5jdGlvbihkLCBpKSB7DQogICAgICAgIHJldHVybiAoYWN0aXZlUG9pbnQgIT09IHVuZGVmaW5lZCAmJiBpID09PSBhY3RpdmVQb2ludCkgPyAwLjggOiAwOw0KICAgICAgfSkNCiAgICAgIC5vbigibW91c2VvdmVyIiwgZnVuY3Rpb24oKSB7DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgib3BhY2l0eSIsIDAuOCk7DQogICAgICB9KQ0KICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoIm9wYWNpdHkiLCAwKTsNCiAgICAgIH0pDQogICAgICAuY2FsbChkcmFnKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRpbWVuc2lvbnNGb3JQb2ludChwKSB7DQogICAgdmFyIGRpbXMgPSB7IGk6IC0xLCBsZWZ0OiB1bmRlZmluZWQsIHJpZ2h0OiB1bmRlZmluZWQgfTsNCiAgICBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLnNvbWUoZnVuY3Rpb24oZGltLCBpKSB7DQogICAgICBpZiAoeHNjYWxlKGRpbSkgPCBwWzBdKSB7DQogICAgICAgIHZhciBuZXh0ID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKVtwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpLmluZGV4T2YoZGltKSsxXTsNCiAgICAgICAgZGltcy5pID0gaTsNCiAgICAgICAgZGltcy5sZWZ0ID0gZGltOw0KICAgICAgICBkaW1zLnJpZ2h0ID0gbmV4dDsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfSk7DQoNCiAgICBpZiAoZGltcy5sZWZ0ID09PSB1bmRlZmluZWQpIHsNCiAgICAgIC8vIEV2ZW50IG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGZpcnN0IGF4aXMuDQogICAgICBkaW1zLmkgPSAwOw0KICAgICAgZGltcy5sZWZ0ID0gcGMuZ2V0T3JkZXJlZERpbWVuc2lvbktleXMoKVswXTsNCiAgICAgIGRpbXMucmlnaHQgPSBwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpWzFdOw0KICAgIH0gZWxzZSBpZiAoZGltcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAvLyBFdmVudCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgbGFzdCBheGlzDQogICAgICBkaW1zLmkgPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aCAtIDE7DQogICAgICBkaW1zLnJpZ2h0ID0gZGltcy5sZWZ0Ow0KICAgICAgZGltcy5sZWZ0ID0gcGMuZ2V0T3JkZXJlZERpbWVuc2lvbktleXMoKVtkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aCAtIDJdOw0KICAgIH0NCg0KICAgIHJldHVybiBkaW1zOw0KICB9DQoNCiAgZnVuY3Rpb24gb25EcmFnU3RhcnQoKSB7DQogICAgLy8gRmlyc3Qgd2UgbmVlZCB0byBkZXRlcm1pbmUgYmV0d2VlbiB3aGljaCB0d28gYXhlcyB0aGUgYXJjIHdhcyBzdGFydGVkLg0KICAgIC8vIFRoaXMgd2lsbCBkZXRlcm1pbmUgdGhlIGZyZWVkb20gb2YgbW92ZW1lbnQsIGJlY2F1c2UgYSBhcmMgY2FuDQogICAgLy8gbG9naWNhbGx5IG9ubHkgaGFwcGVuIGJldHdlZW4gdHdvIGF4ZXMsIHNvIG5vIG1vdmVtZW50IG91dHNpZGUgdGhlc2UgYXhlcw0KICAgIC8vIHNob3VsZCBiZSBhbGxvd2VkLg0KICAgIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBwID0gZDMubW91c2Uoc3RydW1SZWN0WzBdWzBdKSwNCiAgICAgICAgICBkaW1zLA0KICAgICAgICAgIGFyYzsNCg0KICAgICAgcFswXSA9IHBbMF0gLSBfXy5tYXJnaW4ubGVmdDsNCiAgICAgIHBbMV0gPSBwWzFdIC0gX18ubWFyZ2luLnRvcDsNCg0KICAgICAgZGltcyA9IGRpbWVuc2lvbnNGb3JQb2ludChwKSwNCiAgICAgIGFyYyA9IHsNCiAgICAgICAgcDE6IHAsDQogICAgICAgIGRpbXM6IGRpbXMsDQogICAgICAgIG1pblg6IHhzY2FsZShkaW1zLmxlZnQpLA0KICAgICAgICBtYXhYOiB4c2NhbGUoZGltcy5yaWdodCksDQogICAgICAgIG1pblk6IDAsDQogICAgICAgIG1heFk6IGgoKSwNCiAgICAgICAgc3RhcnRBbmdsZTogdW5kZWZpbmVkLA0KICAgICAgICBlbmRBbmdsZTogdW5kZWZpbmVkLA0KICAgICAgICBhcmM6IGQzLnN2Zy5hcmMoKS5pbm5lclJhZGl1cygwKQ0KICAgICAgfTsNCg0KICAgICAgYXJjc1tkaW1zLmldID0gYXJjOw0KICAgICAgYXJjcy5hY3RpdmUgPSBkaW1zLmk7DQoNCiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kcw0KICAgICAgYXJjLnAxWzBdID0gTWF0aC5taW4oTWF0aC5tYXgoYXJjLm1pblgsIHBbMF0pLCBhcmMubWF4WCk7DQogICAgICBhcmMucDIgPSBhcmMucDEuc2xpY2UoKTsNCiAgICAgIGFyYy5wMyA9IGFyYy5wMS5zbGljZSgpOw0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBvbkRyYWcoKSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGV2ID0gZDMuZXZlbnQsDQogICAgICAgICAgYXJjID0gYXJjc1thcmNzLmFjdGl2ZV07DQoNCiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kcw0KICAgICAgYXJjLnAyWzBdID0gTWF0aC5taW4oTWF0aC5tYXgoYXJjLm1pblggKyAxLCBldi54IC0gX18ubWFyZ2luLmxlZnQpLCBhcmMubWF4WCk7DQogICAgICBhcmMucDJbMV0gPSBNYXRoLm1pbihNYXRoLm1heChhcmMubWluWSwgZXYueSAtIF9fLm1hcmdpbi50b3ApLCBhcmMubWF4WSk7DQogICAgICBhcmMucDMgPSBhcmMucDIuc2xpY2UoKTsNCi8vICAgICAgY29uc29sZS5sb2coYXJjcy5hbmdsZShhcmNzLmFjdGl2ZSkpOw0KLy8gICAgICBjb25zb2xlLmxvZyhzaWduZWRBbmdsZShhcmNzLnVuc2lnbmVkQW5nbGUoYXJjcy5hY3RpdmUpKSk7DQogICAgICBkcmF3U3RydW0oYXJjLCAxKTsNCiAgICB9Ow0KICB9DQoNCiAgLy8gc29tZSBoZWxwZXIgZnVuY3Rpb25zDQogIGZ1bmN0aW9uIGh5cG90aGVudXNlKGEsIGIpIHsNCgkgIHJldHVybiBNYXRoLnNxcnQoYSphICsgYipiKTsNCiAgfQ0KDQogIHZhciByYWQgPSAoZnVuY3Rpb24oKSB7DQoJICB2YXIgYyA9IE1hdGguUEkgLyAxODA7DQoJICByZXR1cm4gZnVuY3Rpb24oYW5nbGUpIHsNCgkJICByZXR1cm4gYW5nbGUgKiBjOw0KCSAgfTsNCiAgfSkoKTsNCg0KICB2YXIgZGVnID0gKGZ1bmN0aW9uKCkgew0KCSAgdmFyIGMgPSAxODAgLyBNYXRoLlBJOw0KCSAgcmV0dXJuIGZ1bmN0aW9uKGFuZ2xlKSB7DQoJCSAgcmV0dXJuIGFuZ2xlICogYzsNCgkgIH07DQogIH0pKCk7DQoNCiAgLy8gWzAsIDIqUEldIC0+IFstUEkvMiwgUEkvMl0NCiAgdmFyIHNpZ25lZEFuZ2xlID0gZnVuY3Rpb24oYW5nbGUpIHsNCiAgICB2YXIgcmV0ID0gYW5nbGU7DQogICAgaWYgKGFuZ2xlID4gTWF0aC5QSSkgew0KICAgICAgcmV0ID0gYW5nbGUgLSAxLjUgKiBNYXRoLlBJOw0KICAgICAgcmV0ID0gYW5nbGUgLSAxLjUgKiBNYXRoLlBJOw0KICAgIH0gZWxzZSB7DQogICAgICByZXQgPSBhbmdsZSAtIDAuNSAqIE1hdGguUEk7DQogICAgICByZXQgPSBhbmdsZSAtIDAuNSAqIE1hdGguUEk7DQogICAgfQ0KICAgIHJldHVybiAtcmV0Ow0KICB9DQoNCiAgLyoqDQogICAqIGFuZ2xlcyBhcmUgc3RvcmVkIGluIHJhZGlhbnMgZnJvbSBpbiBbMCwgMipQSV0sIHdoZXJlIDAgaW4gMTIgbydjbG9jay4NCiAgICogSG93ZXZlciwgb25lIGNhbiBvbmx5IHNlbGVjdCBsaW5lcyBmcm9tIDAgdG8gUEksIHNvIHdlIGNvbXB1dGUgdGhlDQogICAqICdzaWduZWQnIGFuZ2xlLCB3aGVyZSAwIGlzIHRoZSBob3Jpem9udGFsIGxpbmUgKDMgbydjbG9jayksIGFuZCArLy0gUEkvMg0KICAgKiBhcmUgMTIgYW5kIDYgbydjbG9jayByZXNwZWN0aXZlbHkuDQogICAqLw0KICBmdW5jdGlvbiBjb250YWlubWVudFRlc3QoYXJjKSB7DQogICAgdmFyIHN0YXJ0QW5nbGUgPSBzaWduZWRBbmdsZShhcmMuc3RhcnRBbmdsZSk7DQogICAgdmFyIGVuZEFuZ2xlID0gc2lnbmVkQW5nbGUoYXJjLmVuZEFuZ2xlKTsNCg0KICAgIGlmIChzdGFydEFuZ2xlID4gZW5kQW5nbGUpIHsNCiAgICAJdmFyIHRtcCA9IHN0YXJ0QW5nbGU7DQogICAgCXN0YXJ0QW5nbGUgPSBlbmRBbmdsZTsNCiAgICAJZW5kQW5nbGUgPSB0bXA7DQogICAgfQ0KDQogICAgLy8gdGVzdCBpZiBzZWdtZW50IGFuZ2xlIGlzIGNvbnRhaW5lZCBpbiBhbmdsZSBpbnRlcnZhbA0KICAgIHJldHVybiBmdW5jdGlvbihhKSB7DQoNCiAgICAgIGlmIChhID49IHN0YXJ0QW5nbGUgJiYgYSA8PSBlbmRBbmdsZSkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgIH0NCg0KICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBzZWxlY3RlZCgpIHsNCiAgICB2YXIgaWRzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJjcyksDQogICAgICAgIGJydXNoZWQgPSBfXy5kYXRhOw0KDQogICAgLy8gR2V0IHRoZSBpZHMgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgYXJjcy4NCiAgICBpZHMgPSBpZHMuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgIHJldHVybiAhaXNOYU4oZCk7DQogICAgfSk7DQoNCiAgICBmdW5jdGlvbiBjcm9zc2VzU3RydW0oZCwgaWQpIHsNCiAgICAgIHZhciBhcmMgPSBhcmNzW2lkXSwNCiAgICAgICAgICB0ZXN0ID0gY29udGFpbm1lbnRUZXN0KGFyYyksDQogICAgICAgICAgZDEgPSBhcmMuZGltcy5sZWZ0LA0KICAgICAgICAgIGQyID0gYXJjLmRpbXMucmlnaHQsDQogICAgICAgICAgeTEgPSBfXy5kaW1lbnNpb25zW2QxXS55c2NhbGUsDQogICAgICAgICAgeTIgPSBfXy5kaW1lbnNpb25zW2QyXS55c2NhbGUsDQogICAgICAgICAgYSA9IGFyY3Mud2lkdGgoaWQpLA0KICAgICAgICAgIGIgPSB5MShkW2QxXSkgLSB5MihkW2QyXSksDQogICAgICAgICAgYyA9IGh5cG90aGVudXNlKGEsIGIpLA0KICAgICAgICAgIGFuZ2xlID0gTWF0aC5hc2luKGIvYyk7CS8vIHJhZCBpbiBbLVBJLzIsIFBJLzJdDQogICAgICByZXR1cm4gdGVzdChhbmdsZSk7DQogICAgfQ0KDQogICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGJydXNoZWQ7IH0NCg0KICAgIHJldHVybiBicnVzaGVkLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICBzd2l0Y2goYnJ1c2gucHJlZGljYXRlKSB7DQogICAgICBjYXNlICJBTkQiOg0KICAgICAgICByZXR1cm4gaWRzLmV2ZXJ5KGZ1bmN0aW9uKGlkKSB7IHJldHVybiBjcm9zc2VzU3RydW0oZCwgaWQpOyB9KTsNCiAgICAgIGNhc2UgIk9SIjoNCiAgICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uKGlkKSB7IHJldHVybiBjcm9zc2VzU3RydW0oZCwgaWQpOyB9KTsNCiAgICAgIGRlZmF1bHQ6DQogICAgICAgIHRocm93ICJVbmtub3duIGJydXNoIHByZWRpY2F0ZSAiICsgX18uYnJ1c2hQcmVkaWNhdGU7DQogICAgICB9DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiByZW1vdmVTdHJ1bSgpIHsNCiAgICB2YXIgYXJjID0gYXJjc1thcmNzLmFjdGl2ZV0sDQogICAgICAgIHN2ZyA9IHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgiZyNhcmNzIik7DQoNCiAgICBkZWxldGUgYXJjc1thcmNzLmFjdGl2ZV07DQogICAgYXJjcy5hY3RpdmUgPSB1bmRlZmluZWQ7DQogICAgc3ZnLnNlbGVjdEFsbCgibGluZSNhcmMtIiArIGFyYy5kaW1zLmkpLnJlbW92ZSgpOw0KICAgIHN2Zy5zZWxlY3RBbGwoImNpcmNsZSNhcmMtIiArIGFyYy5kaW1zLmkpLnJlbW92ZSgpOw0KICAgIHN2Zy5zZWxlY3RBbGwoInBhdGgjYXJjLSIgKyBhcmMuZGltcy5pKS5yZW1vdmUoKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uRHJhZ0VuZCgpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgYnJ1c2hlZCA9IF9fLmRhdGEsDQogICAgICAgICAgYXJjID0gYXJjc1thcmNzLmFjdGl2ZV07DQoNCiAgICAgIC8vIE9rYXksIHNvbWV3aGF0IHVuZXhwZWN0ZWQsIGJ1dCBub3QgdG90YWxseSB1bnN1cnByaXNpbmcsIGEgbW91c2NsaWNrIGlzDQogICAgICAvLyBjb25zaWRlcmVkIGEgZHJhZyB3aXRob3V0IG1vdmUuIFNvIHdlIGhhdmUgdG8gZGVhbCB3aXRoIHRoYXQgY2FzZQ0KICAgICAgaWYgKGFyYyAmJiBhcmMucDFbMF0gPT09IGFyYy5wMlswXSAmJiBhcmMucDFbMV0gPT09IGFyYy5wMlsxXSkgew0KICAgICAgICByZW1vdmVTdHJ1bShhcmNzKTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGFyYykgew0KICAgIAkgIHZhciBhbmdsZSA9IGFyY3Muc3RhcnRBbmdsZShhcmNzLmFjdGl2ZSk7DQoNCiAgICAJICBhcmMuc3RhcnRBbmdsZSA9IGFuZ2xlOw0KICAgICAgICAgIGFyYy5lbmRBbmdsZSA9IGFuZ2xlOw0KICAgICAgICAgIGFyYy5hcmMNCiAgICAgICAgICAgIC5vdXRlclJhZGl1cyhhcmNzLmxlbmd0aChhcmNzLmFjdGl2ZSkpDQogICAgICAgICAgICAuc3RhcnRBbmdsZShhbmdsZSkNCiAgICAgICAgICAgIC5lbmRBbmdsZShhbmdsZSk7DQogICAgICB9DQoNCg0KICAgICAgYnJ1c2hlZCA9IHNlbGVjdGVkKGFyY3MpOw0KICAgICAgYXJjcy5hY3RpdmUgPSB1bmRlZmluZWQ7DQogICAgICBfXy5icnVzaGVkID0gYnJ1c2hlZDsNCiAgICAgIHBjLnJlbmRlckJydXNoZWQoKTsNCiAgICAgIGV2ZW50cy5icnVzaGVuZC5jYWxsKHBjLCBfXy5icnVzaGVkKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gYnJ1c2hSZXNldChhcmNzKSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGlkcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFyY3MpLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICAgIHJldHVybiAhaXNOYU4oZCk7DQogICAgICB9KTsNCg0KICAgICAgaWRzLmZvckVhY2goZnVuY3Rpb24oZCkgew0KICAgICAgICBhcmNzLmFjdGl2ZSA9IGQ7DQogICAgICAgIHJlbW92ZVN0cnVtKGFyY3MpOw0KICAgICAgfSk7DQogICAgICBvbkRyYWdFbmQoYXJjcykoKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gaW5zdGFsbCgpIHsNCiAgICB2YXIgZHJhZyA9IGQzLmJlaGF2aW9yLmRyYWcoKTsNCg0KICAgIC8vIE1hcCBvZiBjdXJyZW50IGFyY3MuIGFyY3MgYXJlIHN0b3JlZCBwZXIgc2VnbWVudCBvZiB0aGUgUEMuIEEgc2VnbWVudCwNCiAgICAvLyBiZWluZyB0aGUgYXJlYSBiZXR3ZWVuIHR3byBheGVzLiBUaGUgbGVmdCBtb3N0IGFyZWEgaXMgaW5kZXhlZCBhdCAwLg0KICAgIGFyY3MuYWN0aXZlID0gdW5kZWZpbmVkOw0KICAgIC8vIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSBQQyBzZWdtZW50IHdoZXJlIGN1cnJlbnRseSBhIGFyYyBpcyBiZWluZw0KICAgIC8vIHBsYWNlZC4gTk9URTogZXZlbiB0aG91Z2ggdGhleSBhcmUgZXZlbmx5IHNwYWNlZCBpbiBvdXIgY3VycmVudA0KICAgIC8vIGltcGxlbWVudGF0aW9uLCB3ZSBrZWVwIGZvciB3aGVuIG5vbi1ldmVuIHNwYWNlZCBzZWdtZW50cyBhcmUgc3VwcG9ydGVkIGFzDQogICAgLy8gd2VsbC4NCiAgICBhcmNzLndpZHRoID0gZnVuY3Rpb24oaWQpIHsNCiAgICAgIHZhciBhcmMgPSBhcmNzW2lkXTsNCg0KICAgICAgaWYgKGFyYyA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBhcmMubWF4WCAtIGFyYy5taW5YOw0KICAgIH07DQoNCiAgICAvLyByZXR1cm5zIGFuZ2xlcyBpbiBbLVBJLzIsIFBJLzJdDQogICAgYW5nbGUgPSBmdW5jdGlvbihwMSwgcDIpIHsNCiAgICAgICAgdmFyIGEgPSBwMVswXSAtIHAyWzBdLA0KICAgICAgICAJYiA9IHAxWzFdIC0gcDJbMV0sDQogICAgICAgIAljID0gaHlwb3RoZW51c2UoYSwgYik7DQoNCiAgICAgICAgcmV0dXJuIE1hdGguYXNpbihiL2MpOw0KICAgIH0NCg0KICAgIC8vIHJldHVybnMgYW5nbGVzIGluIFswLCAyICogUEldDQogICAgYXJjcy5lbmRBbmdsZSA9IGZ1bmN0aW9uKGlkKSB7DQogICAgCXZhciBhcmMgPSBhcmNzW2lkXTsNCiAgICAJaWYgKGFyYyA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KICAgICAgICB9DQogICAgCXZhciBzQW5nbGUgPSBhbmdsZShhcmMucDEsIGFyYy5wMiksDQogICAgCQl1QW5nbGUgPSAtc0FuZ2xlICsgTWF0aC5QSSAvIDI7DQoNCiAgICAJaWYgKGFyYy5wMVswXSA+IGFyYy5wMlswXSkgew0KICAgIAkJdUFuZ2xlID0gMiAqIE1hdGguUEkgLSB1QW5nbGU7DQogICAgCX0NCg0KICAgIAlyZXR1cm4gdUFuZ2xlOw0KICAgIH0NCg0KICAgIGFyY3Muc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKGlkKSB7DQogICAgCXZhciBhcmMgPSBhcmNzW2lkXTsNCiAgICAJaWYgKGFyYyA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KICAgICAgICB9DQoNCiAgICAJdmFyIHNBbmdsZSA9IGFuZ2xlKGFyYy5wMSwgYXJjLnAzKSwNCiAgICAJCXVBbmdsZSA9IC1zQW5nbGUgKyBNYXRoLlBJIC8gMjsNCg0KICAgIAlpZiAoYXJjLnAxWzBdID4gYXJjLnAzWzBdKSB7DQogICAgCQl1QW5nbGUgPSAyICogTWF0aC5QSSAtIHVBbmdsZTsNCiAgICAJfQ0KDQogICAgCXJldHVybiB1QW5nbGU7DQogICAgfQ0KDQogICAgYXJjcy5sZW5ndGggPSBmdW5jdGlvbihpZCkgew0KICAgIAl2YXIgYXJjID0gYXJjc1tpZF07DQoNCiAgICAgICAgaWYgKGFyYyA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBhID0gYXJjLnAxWzBdIC0gYXJjLnAyWzBdLA0KICAgICAgICAJYiA9IGFyYy5wMVsxXSAtIGFyYy5wMlsxXSwNCiAgICAgICAgCWMgPSBoeXBvdGhlbnVzZShhLCBiKTsNCg0KICAgICAgICByZXR1cm4oYyk7DQogICAgfQ0KDQogICAgcGMub24oImF4ZXNyZW9yZGVyLmFyY3MiLCBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBpZHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhcmNzKS5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gIWlzTmFOKGQpOw0KICAgICAgfSk7DQoNCiAgICAgIC8vIENoZWNrcyBpZiB0aGUgZmlyc3QgZGltZW5zaW9uIGlzIGRpcmVjdGx5IGxlZnQgb2YgdGhlIHNlY29uZCBkaW1lbnNpb24uDQogICAgICBmdW5jdGlvbiBjb25zZWN1dGl2ZShmaXJzdCwgc2Vjb25kKSB7DQogICAgICAgIHZhciBsZW5ndGggPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aDsNCiAgICAgICAgcmV0dXJuIGQzLmtleXMoX18uZGltZW5zaW9ucykuc29tZShmdW5jdGlvbihkLCBpKSB7DQogICAgICAgICAgcmV0dXJuIChkID09PSBmaXJzdCkNCiAgICAgICAgICAgID8gaSArIGkgPCBsZW5ndGggJiYgX18uZGltZW5zaW9uc1tpICsgMV0gPT09IHNlY29uZA0KICAgICAgICAgICAgOiBmYWxzZTsNCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIGlmIChpZHMubGVuZ3RoID4gMCkgeyAvLyBXZSBoYXZlIHNvbWUgYXJjcywgd2hpY2ggbWlnaHQgbmVlZCB0byBiZSByZW1vdmVkLg0KICAgICAgICBpZHMuZm9yRWFjaChmdW5jdGlvbihkKSB7DQogICAgICAgICAgdmFyIGRpbXMgPSBhcmNzW2RdLmRpbXM7DQogICAgICAgICAgYXJjcy5hY3RpdmUgPSBkOw0KICAgICAgICAgIC8vIElmIHRoZSB0d28gZGltZW5zaW9ucyBvZiB0aGUgY3VycmVudCBhcmMgYXJlIG5vdCBuZXh0IHRvIGVhY2ggb3RoZXINCiAgICAgICAgICAvLyBhbnkgbW9yZSwgdGhhbiB3ZSdsbCBuZWVkIHRvIHJlbW92ZSB0aGUgYXJjLiBPdGhlcndpc2Ugd2Uga2VlcCBpdC4NCiAgICAgICAgICBpZiAoIWNvbnNlY3V0aXZlKGRpbXMubGVmdCwgZGltcy5yaWdodCkpIHsNCiAgICAgICAgICAgIHJlbW92ZVN0cnVtKGFyY3MpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIG9uRHJhZ0VuZChhcmNzKSgpOw0KICAgICAgfQ0KICAgIH0pOw0KDQogICAgLy8gQWRkIGEgbmV3IHN2ZyBncm91cCBpbiB3aGljaCB3ZSBkcmF3IHRoZSBhcmNzLg0KICAgIHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLmFwcGVuZCgiZyIpDQogICAgICAuYXR0cigiaWQiLCAiYXJjcyIpDQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgX18ubWFyZ2luLmxlZnQgKyAiLCIgKyBfXy5tYXJnaW4udG9wICsgIikiKTsNCg0KICAgIC8vIEluc3RhbGwgdGhlIHJlcXVpcmVkIGJydXNoUmVzZXQgZnVuY3Rpb24NCiAgICBwYy5icnVzaFJlc2V0ID0gYnJ1c2hSZXNldChhcmNzKTsNCg0KICAgIGRyYWcNCiAgICAgIC5vbigiZHJhZ3N0YXJ0Iiwgb25EcmFnU3RhcnQoYXJjcykpDQogICAgICAub24oImRyYWciLCBvbkRyYWcoYXJjcykpDQogICAgICAub24oImRyYWdlbmQiLCBvbkRyYWdFbmQoYXJjcykpOw0KDQogICAgLy8gTk9URTogVGhlIHN0eWxpbmcgbmVlZHMgdG8gYmUgZG9uZSBoZXJlIGFuZCBub3QgaW4gdGhlIGNzcy4gVGhpcyBpcyBiZWNhdXNlDQogICAgLy8gICAgICAgZm9yIDFEIGJydXNoaW5nLCB0aGUgY2FudmFzIGxheWVycyBzaG91bGQgbm90IGxpc3RlbiB0bw0KICAgIC8vICAgICAgIHBvaW50ZXItZXZlbnRzLg0KICAgIHN0cnVtUmVjdCA9IHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLmluc2VydCgicmVjdCIsICJnI2FyY3MiKQ0KICAgICAgLmF0dHIoImlkIiwgImFyYy1ldmVudHMiKQ0KICAgICAgLmF0dHIoIngiLCBfXy5tYXJnaW4ubGVmdCkNCiAgICAgIC5hdHRyKCJ5IiwgX18ubWFyZ2luLnRvcCkNCiAgICAgIC5hdHRyKCJ3aWR0aCIsIHcoKSkNCiAgICAgIC5hdHRyKCJoZWlnaHQiLCBoKCkgKyAyKQ0KICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMCkNCiAgICAgIC5jYWxsKGRyYWcpOw0KICB9DQoNCiAgYnJ1c2gubW9kZXNbImFuZ3VsYXIiXSA9IHsNCiAgICBpbnN0YWxsOiBpbnN0YWxsLA0KICAgIHVuaW5zdGFsbDogZnVuY3Rpb24oKSB7DQogICAgICBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5zZWxlY3QoImcjYXJjcyIpLnJlbW92ZSgpOw0KICAgICAgcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuc2VsZWN0KCJyZWN0I2FyYy1ldmVudHMiKS5yZW1vdmUoKTsNCiAgICAgIHBjLm9uKCJheGVzcmVvcmRlci5hcmNzIiwgdW5kZWZpbmVkKTsNCiAgICAgIGRlbGV0ZSBwYy5icnVzaFJlc2V0Ow0KDQogICAgICBzdHJ1bVJlY3QgPSB1bmRlZmluZWQ7DQogICAgfSwNCiAgICBzZWxlY3RlZDogc2VsZWN0ZWQsDQogICAgYnJ1c2hTdGF0ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJjczsgfQ0KICB9Ow0KDQp9KCkpOw0KcGMuaW50ZXJhY3RpdmUgPSBmdW5jdGlvbigpIHsNCiAgZmxhZ3MuaW50ZXJhY3RpdmUgPSB0cnVlOw0KICByZXR1cm4gdGhpczsNCn07DQoNCi8vIGV4cG9zZSBhIGZldyBvYmplY3RzDQpwYy54c2NhbGUgPSB4c2NhbGU7DQpwYy5jdHggPSBjdHg7DQpwYy5jYW52YXMgPSBjYW52YXM7DQpwYy5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBnOyB9Ow0KDQovLyByZXNjYWxlIGZvciBoZWlnaHQsIHdpZHRoIGFuZCBtYXJnaW5zDQovLyBUT0RPIGN1cnJlbnRseSBhc3N1bWVzIGNoYXJ0IGlzIGJydXNoYWJsZSwgYW5kIGRlc3Ryb3lzIG9sZCBicnVzaGVzDQpwYy5yZXNpemUgPSBmdW5jdGlvbigpIHsNCiAgLy8gc2VsZWN0aW9uIHNpemUNCiAgcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikNCiAgICAuYXR0cigid2lkdGgiLCBfXy53aWR0aCkNCiAgICAuYXR0cigiaGVpZ2h0IiwgX18uaGVpZ2h0KQ0KICBwYy5zdmcuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgX18ubWFyZ2luLmxlZnQgKyAiLCIgKyBfXy5tYXJnaW4udG9wICsgIikiKTsNCg0KICAvLyBGSVhNRTogdGhlIGN1cnJlbnQgYnJ1c2ggc3RhdGUgc2hvdWxkIHBhc3MgdGhyb3VnaA0KICBpZiAoZmxhZ3MuYnJ1c2hhYmxlKSBwYy5icnVzaFJlc2V0KCk7DQoNCiAgLy8gc2NhbGVzDQogIHBjLmF1dG9zY2FsZSgpOw0KDQogIC8vIGF4ZXMsIGRlc3Ryb3lzIG9sZCBicnVzaGVzLg0KICBpZiAoZykgcGMuY3JlYXRlQXhlcygpOw0KICBpZiAoZmxhZ3MuYnJ1c2hhYmxlKSBwYy5icnVzaGFibGUoKTsNCiAgaWYgKGZsYWdzLnJlb3JkZXJhYmxlKSBwYy5yZW9yZGVyYWJsZSgpOw0KDQogIGV2ZW50cy5yZXNpemUuY2FsbCh0aGlzLCB7d2lkdGg6IF9fLndpZHRoLCBoZWlnaHQ6IF9fLmhlaWdodCwgbWFyZ2luOiBfXy5tYXJnaW59KTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQovLyBoaWdobGlnaHQgYW4gYXJyYXkgb2YgZGF0YQ0KcGMuaGlnaGxpZ2h0ID0gZnVuY3Rpb24oZGF0YSkgew0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgew0KICAgIHJldHVybiBfXy5oaWdobGlnaHRlZDsNCiAgfQ0KDQogIF9fLmhpZ2hsaWdodGVkID0gZGF0YTsNCiAgcGMuY2xlYXIoImhpZ2hsaWdodCIpOw0KICBkMy5zZWxlY3RBbGwoW2NhbnZhcy5mb3JlZ3JvdW5kLCBjYW52YXMuYnJ1c2hlZF0pLmNsYXNzZWQoImZhZGVkIiwgdHJ1ZSk7DQogIGRhdGEuZm9yRWFjaChwYXRoX2hpZ2hsaWdodCk7DQogIGV2ZW50cy5oaWdobGlnaHQuY2FsbCh0aGlzLCBkYXRhKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQovLyBjbGVhciBoaWdobGlnaHRpbmcNCnBjLnVuaGlnaGxpZ2h0ID0gZnVuY3Rpb24oKSB7DQogIF9fLmhpZ2hsaWdodGVkID0gW107DQogIHBjLmNsZWFyKCJoaWdobGlnaHQiKTsNCiAgZDMuc2VsZWN0QWxsKFtjYW52YXMuZm9yZWdyb3VuZCwgY2FudmFzLmJydXNoZWRdKS5jbGFzc2VkKCJmYWRlZCIsIGZhbHNlKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQovLyBjYWxjdWxhdGUgMmQgaW50ZXJzZWN0aW9uIG9mIGxpbmUgYS0+YiB3aXRoIGxpbmUgYy0+ZA0KLy8gcG9pbnRzIGFyZSBvYmplY3RzIHdpdGggeCBhbmQgeSBwcm9wZXJ0aWVzDQpwYy5pbnRlcnNlY3Rpb24gPSAgZnVuY3Rpb24oYSwgYiwgYywgZCkgew0KICByZXR1cm4gew0KICAgIHg6ICgoYS54ICogYi55IC0gYS55ICogYi54KSAqIChjLnggLSBkLngpIC0gKGEueCAtIGIueCkgKiAoYy54ICogZC55IC0gYy55ICogZC54KSkgLyAoKGEueCAtIGIueCkgKiAoYy55IC0gZC55KSAtIChhLnkgLSBiLnkpICogKGMueCAtIGQueCkpLA0KICAgIHk6ICgoYS54ICogYi55IC0gYS55ICogYi54KSAqIChjLnkgLSBkLnkpIC0gKGEueSAtIGIueSkgKiAoYy54ICogZC55IC0gYy55ICogZC54KSkgLyAoKGEueCAtIGIueCkgKiAoYy55IC0gZC55KSAtIChhLnkgLSBiLnkpICogKGMueCAtIGQueCkpDQogIH07DQp9Ow0KDQpmdW5jdGlvbiBwb3NpdGlvbihkKSB7DQogIGlmICh4c2NhbGUucmFuZ2UoKS5sZW5ndGggPT09IDApIHsNCiAgICB4c2NhbGUucmFuZ2VQb2ludHMoWzAsIHcoKV0sIDEpOw0KICB9DQogIHZhciB2ID0gZHJhZ2dpbmdbZF07DQogIHJldHVybiB2ID09IG51bGwgPyB4c2NhbGUoZCkgOiB2Ow0KfQ0KDQovLyBNZXJnZXMgdGhlIGNhbnZhc2VzIGFuZCBTVkcgZWxlbWVudHMgaW50byBvbmUgY2FudmFzIGVsZW1lbnQgd2hpY2ggaXMgdGhlbiBwYXNzZWQgaW50byB0aGUgY2FsbGJhY2sNCi8vIChzbyB5b3UgY2FuIGNob29zZSB0byBzYXZlIGl0IHRvIGRpc2ssIGV0Yy4pDQpwYy5tZXJnZVBhcmNvb3JkcyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogIC8vIFJldGluYSBkaXNwbGF5LCBldGMuDQogIHZhciBkZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTsNCg0KICAvLyBDcmVhdGUgYSBjYW52YXMgZWxlbWVudCB0byBzdG9yZSB0aGUgbWVyZ2VkIGNhbnZhc2VzDQogIHZhciBtZXJnZWRDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsNCiAgbWVyZ2VkQ2FudmFzLndpZHRoID0gcGMuY2FudmFzLmZvcmVncm91bmQuY2xpZW50V2lkdGggKiBkZXZpY2VQaXhlbFJhdGlvDQogIG1lcmdlZENhbnZhcy5oZWlnaHQgPSAocGMuY2FudmFzLmZvcmVncm91bmQuY2xpZW50SGVpZ2h0ICsgMzApICogZGV2aWNlUGl4ZWxSYXRpbzsNCiAgbWVyZ2VkQ2FudmFzLnN0eWxlLndpZHRoID0gbWVyZ2VkQ2FudmFzLndpZHRoIC8gZGV2aWNlUGl4ZWxSYXRpbyArICJweCI7DQogIG1lcmdlZENhbnZhcy5zdHlsZS5oZWlnaHQgPSBtZXJnZWRDYW52YXMuaGVpZ2h0IC8gZGV2aWNlUGl4ZWxSYXRpbyArICJweCI7DQoNCiAgLy8gR2l2ZSB0aGUgY2FudmFzIGEgd2hpdGUgYmFja2dyb3VuZA0KICB2YXIgY29udGV4dCA9IG1lcmdlZENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOw0KICBjb250ZXh0LmZpbGxTdHlsZSA9ICIjZmZmZmZmIjsNCiAgY29udGV4dC5maWxsUmVjdCgwLCAwLCBtZXJnZWRDYW52YXMud2lkdGgsIG1lcmdlZENhbnZhcy5oZWlnaHQpOw0KDQogIC8vIE1lcmdlIGFsbCB0aGUgY2FudmFzZXMNCiAgZm9yICh2YXIga2V5IGluIHBjLmNhbnZhcykgew0KICAgIGNvbnRleHQuZHJhd0ltYWdlKHBjLmNhbnZhc1trZXldLCAwLCAyNCAqIGRldmljZVBpeGVsUmF0aW8sIG1lcmdlZENhbnZhcy53aWR0aCwgbWVyZ2VkQ2FudmFzLmhlaWdodCAtIDMwICogZGV2aWNlUGl4ZWxSYXRpbyk7DQogIH0NCg0KICAvLyBBZGQgU1ZHIGVsZW1lbnRzIHRvIGNhbnZhcw0KICB2YXIgRE9NVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdzsNCiAgdmFyIHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcigpOw0KICB2YXIgc3ZnU3RyID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKVswXVswXSk7DQoNCiAgLy8gQ3JlYXRlIGEgRGF0YSBVUkkuDQogIHZhciBzcmMgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnICsgd2luZG93LmJ0b2Eoc3ZnU3RyKTsNCiAgdmFyIGltZyA9IG5ldyBJbWFnZSgpOw0KICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgew0KICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoICogZGV2aWNlUGl4ZWxSYXRpbywgaW1nLmhlaWdodCAqIGRldmljZVBpeGVsUmF0aW8pOw0KICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICJmdW5jdGlvbiIpIHsNCiAgICAgIGNhbGxiYWNrKG1lcmdlZENhbnZhcyk7DQogICAgfQ0KICB9Ow0KICBpbWcuc3JjID0gc3JjOw0KfQ0KcGMudmVyc2lvbiA9ICIwLjcuMCI7DQogIC8vIHRoaXMgZGVzY3JpcHRpdmUgdGV4dCBzaG91bGQgbGl2ZSB3aXRoIG90aGVyIGludHJvc3BlY3RpdmUgbWV0aG9kcw0KICBwYy50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gIlBhcmFsbGVsIENvb3JkaW5hdGVzOiAiICsgZDMua2V5cyhfXy5kaW1lbnNpb25zKS5sZW5ndGggKyAiIGRpbWVuc2lvbnMgKCIgKyBkMy5rZXlzKF9fLmRhdGFbMF0pLmxlbmd0aCArICIgdG90YWwpICwgIiArIF9fLmRhdGEubGVuZ3RoICsgIiByb3dzIjsgfTsNCg0KICByZXR1cm4gcGM7DQp9Ow0KDQpkMy5yZW5kZXJRdWV1ZSA9IChmdW5jdGlvbihmdW5jKSB7DQogIHZhciBfcXVldWUgPSBbXSwgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRvIGJlIHJlbmRlcmVkDQogICAgICBfcmF0ZSA9IDEwLCAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgY2FsbHMgcGVyIGZyYW1lDQogICAgICBfY2xlYXIgPSBmdW5jdGlvbigpIHt9LCAgICAgICAvLyBjbGVhcmluZyBmdW5jdGlvbg0KICAgICAgX2kgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24NCg0KICB2YXIgcnEgPSBmdW5jdGlvbihkYXRhKSB7DQogICAgaWYgKGRhdGEpIHJxLmRhdGEoZGF0YSk7DQogICAgcnEuaW52YWxpZGF0ZSgpOw0KICAgIF9jbGVhcigpOw0KICAgIHJxLnJlbmRlcigpOw0KICB9Ow0KDQogIHJxLnJlbmRlciA9IGZ1bmN0aW9uKCkgew0KICAgIF9pID0gMDsNCiAgICB2YXIgdmFsaWQgPSB0cnVlOw0KICAgIHJxLmludmFsaWRhdGUgPSBmdW5jdGlvbigpIHsgdmFsaWQgPSBmYWxzZTsgfTsNCg0KICAgIGZ1bmN0aW9uIGRvRnJhbWUoKSB7DQogICAgICBpZiAoIXZhbGlkKSByZXR1cm4gdHJ1ZTsNCiAgICAgIGlmIChfaSA+IF9xdWV1ZS5sZW5ndGgpIHJldHVybiB0cnVlOw0KDQogICAgICAvLyBUeXBpY2FsIGQzIGJlaGF2aW9yIGlzIHRvIHBhc3MgYSBkYXRhIGl0ZW0gKmFuZCogaXRzIGluZGV4LiBBcyB0aGUNCiAgICAgIC8vIHJlbmRlciBxdWV1ZSBzcGxpdHMgdGhlIG9yaWdpbmFsIGRhdGEgc2V0LCB3ZSdsbCBoYXZlIHRvIGJlIHNsaWdodGx5DQogICAgICAvLyBtb3JlIGNhcmVmdWxsIGFib3V0IHBhc3NpbmcgdGhlIGNvcnJlY3QgaW5kZXggd2l0aCB0aGUgZGF0YSBpdGVtLg0KICAgICAgdmFyIGVuZCA9IE1hdGgubWluKF9pICsgX3JhdGUsIF9xdWV1ZS5sZW5ndGgpOw0KICAgICAgZm9yICh2YXIgaSA9IF9pOyBpIDwgZW5kOyBpKyspIHsNCiAgICAgICAgZnVuYyhfcXVldWVbaV0sIGkpOw0KICAgICAgfQ0KICAgICAgX2kgKz0gX3JhdGU7DQogICAgfQ0KDQogICAgZDMudGltZXIoZG9GcmFtZSk7DQogIH07DQoNCiAgcnEuZGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICBycS5pbnZhbGlkYXRlKCk7DQogICAgX3F1ZXVlID0gZGF0YS5zbGljZSgwKTsNCiAgICByZXR1cm4gcnE7DQogIH07DQoNCiAgcnEucmF0ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gX3JhdGU7DQogICAgX3JhdGUgPSB2YWx1ZTsNCiAgICByZXR1cm4gcnE7DQogIH07DQoNCiAgcnEucmVtYWluaW5nID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIF9xdWV1ZS5sZW5ndGggLSBfaTsNCiAgfTsNCg0KICAvLyBjbGVhciB0aGUgY2FudmFzDQogIHJxLmNsZWFyID0gZnVuY3Rpb24oZnVuYykgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgew0KICAgICAgX2NsZWFyKCk7DQogICAgICByZXR1cm4gcnE7DQogICAgfQ0KICAgIF9jbGVhciA9IGZ1bmM7DQogICAgcmV0dXJuIHJxOw0KICB9Ow0KDQogIHJxLmludmFsaWRhdGUgPSBmdW5jdGlvbigpIHt9Ow0KDQogIHJldHVybiBycTsNCn0pOw0K"></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAncGFyY29vcmRzJywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgdmFyIGluc3RhbmNlID0geyB9Ow0KDQogICAgdmFyIGRyYXcgPSBmdW5jdGlvbihlbCwgaW5zdGFuY2Upew0KDQogICAgICB2YXIgeCA9IGluc3RhbmNlLng7DQoNCiAgICAgIC8vdWdseSBidXQgY3VycmVudGx5IGhhdmUgdG8gY2xlYXIgb3V0DQogICAgICAvLyAgZWFjaCB0aW1lIHRvIGdldCBwcm9wZXIgcmVuZGVyDQogICAgICAvLyBkZWxldGUgYWxsIGNoaWxkcmVuIG9mIGVsDQogICAgICAvLyAgcG9zc2libHkgcmV2aXNpdCB0byBzZWUgaWYgd2Ugc2hvdWxkIGJlIGEgbGl0dGxlIG1vcmUgZGVsaWNhdGUNCiAgICAgIGQzLnNlbGVjdCggZWwgKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTsNCg0KICAgICAgLy8gaWYgaGVpZ2h0IG9yIHdpZHRoID0gMCB0aGVuIGJhaWwNCiAgICAgIC8vICAgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGZsZXhkYXNoYm9hcmQgYW5kIHRhYnNldHMNCiAgICAgIGlmKA0KICAgICAgICBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA9PT0gMCB8fA0KICAgICAgICBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgPT09IDANCiAgICAgICl7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCg0KICAgICAgLy8gY3JlYXRlIG91ciBwYXJhbGxlbCBjb29yZGluYXRlcw0KICAgICAgdmFyIHBhcmNvb3JkcyA9IGQzLnBhcmNvb3JkcygpKCIjIiArIGVsLmlkKQ0KICAgICAgICAuZGF0YSggeC5kYXRhICk7DQoNCiAgICAgIC8vIHVzZSBleHBhbmRvIHRvIGF0dGFjaCBwYXJjb29yZHMgdG8gdGhlIGVsZW1lbnQNCiAgICAgIC8vICB0aGlzIGR1cGxpY2F0ZXMgdGhlIHN0ZXAgYmVsb3cNCiAgICAgIC8vICBidXQgbWlnaHQgbWFrZSBpdCBlYXNpZXIgZm9yIGEgdXNlcg0KICAgICAgLy8gIHRvIG1hbmlwdWxhdGUgdGhlIHBhcmNvb3Jkcw0KICAgICAgLy8gIGlmIHRoZXkgYXJlIG5vdCBmYW1pbGlhciB3aXRoIHRoZQ0KICAgICAgLy8gIGludGVybmFscyBvZiBodG1sd2lkZ2V0cw0KICAgICAgZWwucGFyY29vcmRzID0gcGFyY29vcmRzOw0KICAgICAgLy8gYWxzbyBhdHRhY2ggdGhlIHBhcmFsbGVsIGNvb3JkaW5hdGVzIGFuZCB4IHRvIGluc3RhbmNlDQogICAgICBpbnN0YW5jZS5wYXJjb29yZHMgPSBwYXJjb29yZHM7DQoNCiAgICAgIC8vaWRlbnRpZnkgdGhlIGJydXNoZWQgZWxlbWVudHMgYW5kIHJldHVybiB0aG9zZSBkYXRhIElEcyB0byBSc2hpbnkNCiAgICAgIC8vdGhlIHBhcmNvb3Jkcy5vbigiYnJ1c2giLGZ1bmN0aW9uKGQpKXt9IG9ubHkgd29ya3Mgd2l0aCAxRC1heGVzIHNlbGVjdGlvbg0KICAgICAgaWYgKEhUTUxXaWRnZXRzLnNoaW55TW9kZSl7DQogICAgICAgIHBhcmNvb3Jkcy5vbigicmVuZGVyIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgdmFyIGlkcyA9IFtdOw0KICAgICAgICAgIGlmKHRoaXMuYnJ1c2hlZCgpKXsNCiAgICAgICAgICAgIGlkcyA9IHRoaXMuYnJ1c2hlZCgpLm1hcChmdW5jdGlvbihkKXsNCiAgICAgICAgICAgICAgcmV0dXJuIGQubmFtZXM7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vcmV0dXJuIHRoZSBicnVzaGVkIHJvdyBuYW1lcw0KICAgICAgICAgIGlmKFNoaW55Lm9uSW5wdXRDaGFuZ2Upew0KICAgICAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZShlbC5pZCArICJfYnJ1c2hlZF9yb3dfbmFtZXMiLCBpZHMpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIC8vIHNlcGFyYXRlIGZyb20gYWJvdmUgU2hpbnkgaGFuZGxpbmcgZm9yIG5vdywNCiAgICAgIC8vICAgYnV0IGV2ZW50dWFsbHkgaW50ZWdyYXRlDQogICAgICB2YXIgY3Jvc3N0YWxrX3N1cHBvcnRlZCA9IHR5cGVvZihjcm9zc3RhbGspICE9PSAidW5kZWZpbmVkIiAmJg0KICAgICAgICAgIHR5cGVvZih4LmNyb3NzdGFsa19vcHRzKSAhPT0gInVuZGVmaW5lZCI7DQoNCiAgICAgIGlmKGNyb3NzdGFsa19zdXBwb3J0ZWQpIHsNCiAgICAgICAgdmFyIGN0X3NlbCA9IG5ldyBjcm9zc3RhbGsuU2VsZWN0aW9uSGFuZGxlKHguY3Jvc3N0YWxrX29wdHMuZ3JvdXApOw0KICAgICAgICBwYXJjb29yZHMub24oInJlbmRlciIsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgIHZhciBpZHMgPSBbXTsNCiAgICAgICAgICBpZigNCiAgICAgICAgICAgIHRoaXMuYnJ1c2hlZCgpICYmDQogICAgICAgICAgICB0aGlzLmJydXNoZWQoKS5sZW5ndGggPCBwYXJjb29yZHMuZGF0YSgpLmxlbmd0aA0KICAgICAgICAgICl7DQogICAgICAgICAgICBpZHMgPSB0aGlzLmJydXNoZWQoKS5tYXAoZnVuY3Rpb24oZCl7DQogICAgICAgICAgICAgIHJldHVybiBkLmtleV87DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLy8gYWRkIGJydXNoZWQgdG8gZmlsdGVyDQogICAgICAgICAgICBjdF9zZWwuc2V0KGlkcyk7DQogICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCh0aGlzLmJydXNoZWQoKSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHBhcmNvb3Jkcy51bmhpZ2hsaWdodCgpOw0KICAgICAgICAgICAgLy8gaW5zdGVhZCBzZXQgdG8gZW1wdHkgYXJyYXkNCiAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIHRvIG1ha2Ugc3VyZSBwYXJjb29yZHMgaW5pdGlhdGVkDQogICAgICAgICAgICAvLyAgYmVmb3JlIGNsZWFyaW5nDQogICAgICAgICAgICBpZih0eXBlb2YocGFyY29vcmRzLmJydXNoUmVzZXR0ZXIpICE9PSAidW5kZWZpbmVkIiAmJg0KICAgICAgICAgICAgICAgIHBhcmNvb3Jkcy5icnVzaFJlc2V0dGVyID09PSAic2VsZiINCiAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAvLyBzZWVtcyB0aGlzIHNldHMgdG8gdW5kZWZpbmVkDQogICAgICAgICAgICAgIC8vICAgd2hpY2ggUGxvdGx5IGRvZXMgbm90IGN1cnJlbnRseSBoYW5kbGUNCiAgICAgICAgICAgICAgLy9jdF9zZWwuY2xlYXIoKTsNCiAgICAgICAgICAgICAgY3Rfc2VsLnNldChudWxsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQoNCiAgICAgICAgfSk7DQogICAgICB9DQoNCg0KICAgICAgLy8gaGFuZGxlIGRpbWVuc2lvbnM7ICBpdCBhcHBlYXJzIHRoYXQgcGFyY29vcmRzDQogICAgICAvLyAgIGRldGVjdERpbWVuc2lvbnMgZG9lcyBub3QgcnVuIGlmIGN1c3RvbSBkaW1lbnNpb25zDQogICAgICAvLyAgIGFyZSBwcm92aWRlZCwgc28gd2UnbGwgbmVlZCB0byBkZXRlY3REaW1lbnNpb25zDQogICAgICAvLyAgIGFuZCB0aGVuIGluIGFueSB0aGF0IGFyZSBzcGVjaWZpZWQNCiAgICAgIGlmKCB4Lm9wdGlvbnMuZGltZW5zaW9ucyApew0KICAgICAgICBwYXJjb29yZHMuZGV0ZWN0RGltZW5zaW9ucygpOw0KICAgICAgICB2YXIgZGltcyA9IHBhcmNvb3Jkcy5kaW1lbnNpb25zKCk7DQogICAgICAgIC8vIHRoaXMgaXMgdWdseSBidXQgdHJ5aW5nIHRvIGF2b2lkIGRlcGVuZGVuY3kNCiAgICAgICAgLy8gT2JqZWN0LmFzc2lnbiBkaWQgbm90IHdvcmsgaW4gUlN0dWRpbw0KICAgICAgICBPYmplY3Qua2V5cyh4Lm9wdGlvbnMuZGltZW5zaW9ucykubWFwKGZ1bmN0aW9uKGspew0KICAgICAgICAgIE9iamVjdC5rZXlzKHgub3B0aW9ucy5kaW1lbnNpb25zW2tdKS5tYXAoZnVuY3Rpb24oa2spew0KICAgICAgICAgICAgZGltc1trXVtra10gPSB4Lm9wdGlvbnMuZGltZW5zaW9uc1trXVtra107DQogICAgICAgICAgfSkNCiAgICAgICAgfSkNCiAgICAgICAgeC5vcHRpb25zLmRpbWVuc2lvbnMgPSBkaW1zOw0KICAgICAgfQ0KDQogICAgICAvLyBjdXN0b21pemUgb3VyIHBhcmNvb3JkcyBhY2NvcmRpbmcgdG8gb3B0aW9ucw0KICAgICAgT2JqZWN0LmtleXMoIHgub3B0aW9ucyApLmZpbHRlcihmdW5jdGlvbihrKXsgcmV0dXJuIGsgIT09ICJyZW9yZGVyYWJsZSIgJiYgayAhPT0gImJydXNoTW9kZSIgJiYgayAhPT0gImJydXNoUHJlZGljYXRlIiAmJiBrIT09ICJjb2xvciIgJiYgayE9PSJyb3duYW1lcyJ9KS5tYXAoIGZ1bmN0aW9uKGspIHsNCiAgICAgICAgLy8gaWYgdGhlIGtleSBleGlzdHMgd2l0aGluIHBhcmNvb3Jkcw0KICAgICAgICBpZiAoIHBhcmNvb3Jkc1trXSApew0KICAgICAgICAgIGlmKCB0eXBlb2YgeC5vcHRpb25zW2tdID09PSAiYm9vbGVhbiIgKXsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgIHBhcmNvb3Jkc1trXSgpOw0KICAgICAgICAgICAgfSBjYXRjaChlKSB7DQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCAia2V5L29wdGlvbjogIiArIGsgKyAiIGRpZCBub3Qgd29yayBzbyBpZ25vcmUgZm9yIG5vdy4iICkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdHJ5ew0KICAgICAgICAgICAgICBwYXJjb29yZHNba10oIHgub3B0aW9uc1trXSApOw0KICAgICAgICAgICAgfSBjYXRjaChlKSB7DQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCAia2V5L29wdGlvbjogIiArIGsgKyAiIHdpdGggdmFsdWUgIiArIHgub3B0aW9uc1trXSArICJkaWQgbm90IHdvcmsgc28gaWdub3JlIGZvciBub3cuIiApDQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGNvbnNvbGUubG9nKCAia2V5L29wdGlvbjogIiArIGsgKyAiIGlzIG5vdCBhdmFpbGFibGUgZm9yIGN1c3RvbWl6YXRpb24uIiApDQogICAgICAgIH0NCiAgICAgIH0pDQoNCg0KICAgICAgdmFyIGhpZGRlbl9heGVzID0gW107DQogICAgICAvLyBhdCBvbmUgcG9pbnQgdGhvdWdodCBJIHNob3VsZA0KICAgICAgLy8gICByZW1vdmUgdGhpcyBiZWNhdXNlIG9mIGJ1ZyB3aXRoIGV4cGVyaW1lbnRhbCBkaW1lbnNpb25zDQogICAgICAvLyAgICBhbmQgaGFuZGxlIGZvciBub3cgYnkgcmVtb3Zpbmcgcm93bmFtZXMgZnJvbSB0aGUgZGF0YQ0KICAgICAgLy8gYnV0IGluc3RlYWQgSSBqdXN0IGhhZCB0byBtb3ZlIHRoaXMgcGllY2UgdG8gaGVyZQ0KICAgICAgaWYoIHR5cGVvZiB4Lm9wdGlvbnMucm93bmFtZXMgPT0gInVuZGVmaW5lZCIgfHwgeC5vcHRpb25zLnJvd25hbWVzID09PSBmYWxzZSApIHsNCiAgICAgICAgLy9yb3duYW1lcyA9IEYgc28gaGlkZSB0aGUgYXhpcw0KICAgICAgICBoaWRkZW5fYXhlcy5wdXNoKCJuYW1lcyIpOw0KICAgICAgfQ0KDQogICAgICAvLyBoaWRlIGNyb3NzdGFsayBrZXkgY29sdW1uDQogICAgICBpZihjcm9zc3RhbGtfc3VwcG9ydGVkKSB7DQogICAgICAgIGhpZGRlbl9heGVzLnB1c2goImtleV8iKTsNCiAgICAgIH0NCg0KICAgICAgcGFyY29vcmRzLmhpZGVBeGlzKGhpZGRlbl9heGVzKTsNCg0KICAgICAgLy8gY29sb3Igb3B0aW9uIHdpbGwgcmVxdWlyZSBzb21lIGN1c3RvbSBoYW5kbGluZw0KICAgICAgLy8gICBpZiBjb2xvciBpcyBhbiBvYmplY3Qgd2l0aCBjb2xvclNjYWxlIGFuZCBjb2xvckJ5DQogICAgICAvLyAgICB3aWxsIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIHVuaXF1ZSBncm91cCB2YWx1ZXMNCiAgICAgIC8vICAgIGFuZCBhc3NpZ24gYSBjb2xvcg0KICAgICAgaWYgKCB0eXBlb2YgeC5vcHRpb25zLmNvbG9yICE9PSAidW5kZWZpbmVkIiApIHsNCiAgICAgICAgdmFyIGNvbG9yOw0KICAgICAgICBpZiggeC5vcHRpb25zLmNvbG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICJPYmplY3QiICkgew0KICAgICAgICAgIGNvbG9yU2NhbGUgPSB4Lm9wdGlvbnMuY29sb3IuY29sb3JTY2FsZSAgPyB4Lm9wdGlvbnMuY29sb3IuY29sb3JTY2FsZSA6IGQzLnNjYWxlLmNhdGVnb3J5MjBiKCk7DQogICAgICAgICAgdmFyIGNvbG9ycyA9IHt9Ow0KICAgICAgICAgIGQzLmtleXMoZDMubmVzdCgpLmtleShmdW5jdGlvbihkKXtyZXR1cm4gZFt4Lm9wdGlvbnMuY29sb3IuY29sb3JCeV19KS5tYXAoeC5kYXRhKSkubWFwKGZ1bmN0aW9uKGMpew0KICAgICAgICAgICAgY29sb3JzW2NdID0gY29sb3JTY2FsZShjKTsNCiAgICAgICAgICB9KQ0KDQogICAgICAgICAgY29sb3IgPSBmdW5jdGlvbihkKSB7DQogICAgICAgICAgICByZXR1cm4gY29sb3JzW2RbeC5vcHRpb25zLmNvbG9yLmNvbG9yQnldXTsNCiAgICAgICAgICB9Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIC8vICAgY29sb3IgY2FuIGJlIGEgc2luZ2xlIHZhbHVlIGluIHdoaWNoIGFsbCBsaW5lcyB3aWxsIGJlIHNhbWUgY29sb3INCiAgICAgICAgICAvLyAgICBmb3IgdGhpcyB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZw0KICAgICAgICAgIGNvbG9yID0geC5vcHRpb25zLmNvbG9yOw0KICAgICAgICB9DQoNCiAgICAgICAgcGFyY29vcmRzLmNvbG9yKCBjb2xvciApOw0KICAgICAgfQ0KDQogICAgICAvLyBub3cgcmVuZGVyIG91ciBwYXJjb29yZHMNCiAgICAgIHBhcmNvb3Jkcw0KICAgICAgICAucmVuZGVyKCkNCg0KICAgICAgaWYoIHgub3B0aW9ucy5yZW9yZGVyYWJsZSApIHsNCiAgICAgICAgcGFyY29vcmRzLnJlb3JkZXJhYmxlKCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBwYXJjb29yZHMuY3JlYXRlQXhlcygpOw0KICAgICAgfQ0KDQogICAgICBpZiggeC5vcHRpb25zLmJydXNoTW9kZSApIHsNCiAgICAgICAgcGFyY29vcmRzLmJydXNoTW9kZSh4Lm9wdGlvbnMuYnJ1c2hNb2RlKTsNCiAgICAgICAgcGFyY29vcmRzLmJydXNoUHJlZGljYXRlKHgub3B0aW9ucy5icnVzaFByZWRpY2F0ZSk7DQogICAgICB9DQoNCiAgICAgIC8vIGlmIHJvd25hbWVzID0gVCB0aGVuIHJlbW92ZSBheGlzIHRpdGxlDQogICAgICBpZiggdHlwZW9mIHgub3B0aW9ucy5yb3duYW1lcyAhPT0gInVuZGVmaW5lZCIgJiYgeC5vcHRpb25zLnJvd25hbWVzID09PSB0cnVlICkgew0KICAgICAgICBkMy5zZWxlY3QoIiMiICsgZWwuaWQgKyAiIC5kaW1lbnNpb24gLmF4aXMgPiB0ZXh0IikucmVtb3ZlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIHNsb3BweSBidXQgZm9yIG5vdyBsZXQncyBmb3JjZSB0ZXh0IHNtYWxsZXINCiAgICAgIC8vICAgPz8gaG93IGJlc3QgdG8gcHJvdmlkZSBwYXJhbWV0ZXIgaW4gUg0KICAgICAgZDMuc2VsZWN0QWxsKCIjIiArIGVsLmlkICsgIiBzdmcgdGV4dCIpDQogICAgICAgICAgLnN0eWxlKCJmb250LXNpemUiLCIxMHB4Iik7DQoNCiAgICAgIC8vIHNldCB1cCBhIGNvbnRhaW5lciBmb3IgdGFza3MgdG8gcGVyZm9ybSBhZnRlciBjb21wbGV0aW9uDQogICAgICAvLyAgb25lIGV4YW1wbGUgd291bGQgYmUgYWRkIGNhbGxiYWNrcyBmb3IgZXZlbnQgaGFuZGxpbmcNCiAgICAgIC8vICBzdHlsaW5nDQogICAgICBpZiAoISh0eXBlb2YgeC50YXNrcyA9PT0gInVuZGVmaW5lZCIgfHwgeC50YXNrcyA9PT0gbnVsbCkgKXsNCiAgICAgICAgaWYgKCAodHlwZW9mIHgudGFza3MubGVuZ3RoID09PSAidW5kZWZpbmVkIikgfHwNCiAgICAgICAgICh0eXBlb2YgeC50YXNrcyA9PT0gImZ1bmN0aW9uIiApICkgew0KICAgICAgICAgICAvLyBoYW5kbGUgYSBmdW5jdGlvbiBub3QgZW5jbG9zZWQgaW4gYXJyYXkNCiAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIG9uY2UgdXNpbmcganNvbmxpdGUNCiAgICAgICAgICAgeC50YXNrcyA9IFt4LnRhc2tzXTsNCiAgICAgICAgfQ0KICAgICAgICB4LnRhc2tzLm1hcChmdW5jdGlvbih0KXsNCiAgICAgICAgICAvLyBmb3IgZWFjaCB0YXNrcyBjYWxsIHRoZSB0YXNrIHdpdGggZWwgc3VwcGxpZWQgYXMgYHRoaXNgDQogICAgICAgICAgdC5jYWxsKHtlbDplbCxwYXJjb29yZHM6cGFyY29vcmRzLHg6eH0pOw0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBkcmF3biBhbmQgZXhlY3V0ZWQgdGFza3MNCiAgICAgIC8vICAgd2lyZSB1cCBjcm9zc3RhbGsgc2VsZWN0aW9uIGZyb20gb3V0c2lkZSBwYXJjb29yZHMNCiAgICAgIGlmKGNyb3NzdGFsa19zdXBwb3J0ZWQpIHsNCiAgICAgICAgY3Rfc2VsLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihzZWwpew0KICAgICAgICAgIGlmKCEoDQogICAgICAgICAgICB0eXBlb2YoY3Rfc2VsLnZhbHVlKSA9PT0gInVuZGVmaW5lZCIgfHwNCiAgICAgICAgICAgIGN0X3NlbC52YWx1ZSA9PT0gbnVsbCB8fA0KICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY3Rfc2VsLnZhbHVlKSAmJiBjdF9zZWwudmFsdWUubGVuZ3RoID09PSAwKQ0KICAgICAgICAgICkpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGN0X3NlbC52YWx1ZTsNCg0KICAgICAgICAgICAgLy8gaGFuZGxlIG5vbi1hcnJheSBzaW5nbGUtdmFsdWUNCiAgICAgICAgICAgIGlmKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSkgew0KICAgICAgICAgICAgICBzZWxlY3RlZCA9IFtzZWxlY3RlZF07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihzZWwuc2VuZGVyID09PSBjdF9zZWwpew0KICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIGZvciBub3cNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIC8vIGNsZWFyIGJydXNoZXMNCiAgICAgICAgICAgICAgaWYocGFyY29vcmRzLmJydXNoZWQoKSl7DQogICAgICAgICAgICAgICAgLy8gbmFzdHkgd2F5IG9mIGRldGVybWluaW5nIHNvdXJjZSBvZiBicnVzaCByZXNldA0KICAgICAgICAgICAgICAgIC8vICAgbmVlZCB0aGlzIHRvIGtub3cgd2hldGhlciB0byBjaGFuZ2UNCiAgICAgICAgICAgICAgICAvLyAgIGNyb3NzdGFsayBzZWxlY3Rpb24gb3IgaWYgdGhlIGJydXNoIHJlc2V0DQogICAgICAgICAgICAgICAgLy8gICBpcyBhbiBvdXRjb21lIGNhdXNlZCBieSBzb21ldGhpbmcgb3RoZXIgdGhhbg0KICAgICAgICAgICAgICAgIC8vICAgdGhpcyBwYXJjb29yZHMgY2hhbmdpbmcgdGhlIHNlbGVjdGlvbg0KICAgICAgICAgICAgICAgIHBhcmNvb3Jkcy5icnVzaFJlc2V0dGVyID0gIm90aGVyIjsNCiAgICAgICAgICAgICAgICBwYXJjb29yZHMuYnJ1c2hSZXNldCgpOw0KICAgICAgICAgICAgICAgIHBhcmNvb3Jkcy5icnVzaFJlc2V0dGVyID0gInNlbGYiOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8vIHVzZSBoaWdobGlnaHQgdG8gc2hvdyB0aGUgc2VsZWN0aW9uDQogICAgICAgICAgICAgIHBhcmNvb3Jkcy5oaWdobGlnaHQocGFyY29vcmRzLmRhdGEoKS5maWx0ZXIoZnVuY3Rpb24oZCxpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmluZGV4T2YoZC5rZXlfKSA+PSAwOw0KICAgICAgICAgICAgICB9KSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHBhcmNvb3Jkcy51bmhpZ2hsaWdodCgpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBpbnN0YW5jZTsNCg0KICAgIH07DQoNCiAgICByZXR1cm4gew0KDQogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgew0KDQogICAgICAgIC8vIGJhc2ljIGNoZWNrIG9mIGRhdGEgdG8gbWFrZSBzdXJlIHdlIHJlY2VpdmVkDQogICAgICAgIC8vICAgaW4gY29sdW1uIGZvcm1hdCBvciBvYmplY3Qgb2YgYXJyYXlzDQogICAgICAgIC8vICAgd2hpY2ggaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgaHRtbHdpZGdldHMNCiAgICAgICAgLy8gICByZWFzb24gZm9yIHRoaXMgY2hlY2sgaXMNCiAgICAgICAgLy8gICAgICBmdXR1cmUtcHJvb2ZpbmcgaWYgYmVoYXZpb3IgY2hhbmdlcw0KICAgICAgICAvLyAgICAgIHNvbWVvbmUgc3VwcGxpZXMgZGF0YSBpbiBhbiBhdHlwaWNhbCB3YXkNCiAgICAgICAgaWYoIHguZGF0YS5jb25zdHJ1Y3Rvci5uYW1lID09PSAiT2JqZWN0IiApew0KICAgICAgICAgIC8vIHVzZSBIVE1MV2lkZ2V0cyBmdW5jdGlvbiB0byBjb252ZXJ0IHRvIGFuIGFycmF5IG9mIG9iamVjdHMgKHJvdyBmb3JtYXQpDQogICAgICAgICAgeC5kYXRhID0gSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyggeC5kYXRhICkNCiAgICAgICAgfQ0KDQogICAgICAgIGluc3RhbmNlLnggPSB4Ow0KDQogICAgICAgIGluc3RhbmNlID0gZHJhdyhlbCwgaW5zdGFuY2UpOw0KDQogICAgICB9LA0KDQogICAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgICAgICAvLyBvbmx5IHJlc2l6ZSBpZiBhdXRvcmVzaXplIHNldCB0byBUUlVFDQogICAgICAgIC8vICAgcmVzaXplIHdpbGwgY2F1c2UgdGhlIGVudGlyZSBwYXJjb29yZHMgdG8gcmUtcmVuZGVyDQogICAgICAgIC8vICAgc28gYnJ1c2hlZCBzZWxlY3Rpb25zLCBldGMuIHdpbGwgYmUgbG9zdA0KICAgICAgICAvLyAgIGFuZCBpbiBldmVudCBvZiBiaWdnZXIgZGF0YSwgZXhwZW5zaXZlIHJlLXJlbmRlcg0KICAgICAgICAvLyAgIHdpbGwgb2NjdXINCiAgICAgICAgaWYoaW5zdGFuY2UueC5hdXRvcmVzaXplKXsNCg0KICAgICAgICAgIGluc3RhbmNlID0gZHJhdyhlbCwgaW5zdGFuY2UpOw0KDQogICAgICAgIH0NCg0KICAgICAgfSwNCg0KICAgICAgaW5zdGFuY2U6IGluc3RhbmNlDQoNCiAgICB9Ow0KICB9DQp9KTsNCg=="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uIGEoYixjLGQpe2Z1bmN0aW9uIGUoZyxoKXtpZighY1tnXSl7aWYoIWJbZ10pe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFoJiZpKXJldHVybiBpKGcsITApO2lmKGYpcmV0dXJuIGYoZywhMCk7dmFyIGo9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZysiJyIpO3Rocm93IGouY29kZT0iTU9EVUxFX05PVF9GT1VORCIsan12YXIgaz1jW2ddPXtleHBvcnRzOnt9fTtiW2ddWzBdLmNhbGwoay5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbZ11bMV1bYV07cmV0dXJuIGUoYz9jOmEpfSxrLGsuZXhwb3J0cyxhLGIsYyxkKX1yZXR1cm4gY1tnXS5leHBvcnRzfWZvcih2YXIgZj0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxnPTA7ZzxkLmxlbmd0aDtnKyspZShkW2ddKTtyZXR1cm4gZX0oezE6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXTtkLmVudW1lcmFibGU9ZC5lbnVtZXJhYmxlfHwhMSxkLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gZCYmKGQud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGQua2V5LGQpfX1yZXR1cm4gZnVuY3Rpb24oYixjLGQpe3JldHVybiBjJiZhKGIucHJvdG90eXBlLGMpLGQmJmEoYixkKSxifX0oKSxmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2QodGhpcyxhKSx0aGlzLl90eXBlcz17fSx0aGlzLl9zZXE9MH1yZXR1cm4gZShhLFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl90eXBlc1thXTtjfHwoYz10aGlzLl90eXBlc1thXT17fSk7dmFyIGQ9InN1YiIrdGhpcy5fc2VxKys7cmV0dXJuIGNbZF09YixkfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX3R5cGVzW2FdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXtmb3IodmFyIGQgaW4gYylpZihjLmhhc093blByb3BlcnR5KGQpJiZjW2RdPT09YilyZXR1cm4gZGVsZXRlIGNbZF0sZDtyZXR1cm4hMX1pZigic3RyaW5nIj09dHlwZW9mIGIpcmV0dXJuISghY3x8IWNbYl0pJiYoZGVsZXRlIGNbYl0sYik7dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHR5cGUgZm9yIGxpc3RlbmVyIil9fSx7a2V5OiJ0cmlnZ2VyIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fdHlwZXNbYV07Zm9yKHZhciBlIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShlKSYmZFtlXS5jYWxsKGMsYil9fV0pLGF9KCk7Yy5kZWZhdWx0PWZ9LHt9XSwyOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSl7aWYoYSYmYS5fX2VzTW9kdWxlKXJldHVybiBhO3ZhciBiPXt9O2lmKG51bGwhPWEpZm9yKHZhciBjIGluIGEpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYykmJihiW2NdPWFbY10pO3JldHVybiBiLmRlZmF1bHQ9YSxifWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGEmJmEuX19lc01vZHVsZT9hOntkZWZhdWx0OmF9fWZ1bmN0aW9uIGYoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBnKGEpe3ZhciBiPWEudmFyKCJmaWx0ZXJzZXQiKSxjPWIuZ2V0KCk7cmV0dXJuIGN8fChjPW5ldyBtLmRlZmF1bHQsYi5zZXQoYykpLGN9ZnVuY3Rpb24gaCgpe3JldHVybiByKyt9T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGMuRmlsdGVySGFuZGxlPXZvaWQgMDt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXTtkLmVudW1lcmFibGU9ZC5lbnVtZXJhYmxlfHwhMSxkLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gZCYmKGQud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGQua2V5LGQpfX1yZXR1cm4gZnVuY3Rpb24oYixjLGQpe3JldHVybiBjJiZhKGIucHJvdG90eXBlLGMpLGQmJmEoYixkKSxifX0oKSxqPWEoIi4vZXZlbnRzIiksaz1lKGopLGw9YSgiLi9maWx0ZXJzZXQiKSxtPWUobCksbj1hKCIuL2dyb3VwIiksbz1lKG4pLHA9YSgiLi91dGlsIikscT1kKHApLHI9MTtjLkZpbHRlckhhbmRsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjKXtmKHRoaXMsYSksdGhpcy5fZXZlbnRSZWxheT1uZXcgay5kZWZhdWx0LHRoaXMuX2VtaXR0ZXI9bmV3IHEuU3Vic2NyaXB0aW9uVHJhY2tlcih0aGlzLl9ldmVudFJlbGF5KSx0aGlzLl9ncm91cD1udWxsLHRoaXMuX2ZpbHRlclNldD1udWxsLHRoaXMuX2ZpbHRlclZhcj1udWxsLHRoaXMuX3Zhck9uQ2hhbmdlU3ViPW51bGwsdGhpcy5fZXh0cmFJbmZvPXEuZXh0ZW5kKHtzZW5kZXI6dGhpc30sYyksdGhpcy5faWQ9ImZpbHRlciIraCgpLHRoaXMuc2V0R3JvdXAoYil9cmV0dXJuIGkoYSxbe2tleToic2V0R3JvdXAiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7aWYodGhpcy5fZ3JvdXAhPT1hJiYodGhpcy5fZ3JvdXB8fGEpJiYodGhpcy5fZmlsdGVyVmFyJiYodGhpcy5fZmlsdGVyVmFyLm9mZigiY2hhbmdlIix0aGlzLl92YXJPbkNoYW5nZVN1YiksdGhpcy5jbGVhcigpLHRoaXMuX3Zhck9uQ2hhbmdlU3ViPW51bGwsdGhpcy5fZmlsdGVyVmFyPW51bGwsdGhpcy5fZmlsdGVyU2V0PW51bGwpLHRoaXMuX2dyb3VwPWEsYSkpe2E9KDAsby5kZWZhdWx0KShhKSx0aGlzLl9maWx0ZXJTZXQ9ZyhhKSx0aGlzLl9maWx0ZXJWYXI9KDAsby5kZWZhdWx0KShhKS52YXIoImZpbHRlciIpO3ZhciBjPXRoaXMuX2ZpbHRlclZhci5vbigiY2hhbmdlIixmdW5jdGlvbihhKXtiLl9ldmVudFJlbGF5LnRyaWdnZXIoImNoYW5nZSIsYSxiKX0pO3RoaXMuX3Zhck9uQ2hhbmdlU3ViPWN9fX0se2tleToiX21lcmdlRXh0cmFJbmZvIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gcS5leHRlbmQoe30sdGhpcy5fZXh0cmFJbmZvP3RoaXMuX2V4dHJhSW5mbzpudWxsLGE/YTpudWxsKX19LHtrZXk6ImNsb3NlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCksdGhpcy5jbGVhcigpLHRoaXMuc2V0R3JvdXAobnVsbCl9fSx7a2V5OiJjbGVhciIsdmFsdWU6ZnVuY3Rpb24oYSl7dGhpcy5fZmlsdGVyU2V0JiYodGhpcy5fZmlsdGVyU2V0LmNsZWFyKHRoaXMuX2lkKSx0aGlzLl9vbkNoYW5nZShhKSl9fSx7a2V5OiJzZXQiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dGhpcy5fZmlsdGVyU2V0JiYodGhpcy5fZmlsdGVyU2V0LnVwZGF0ZSh0aGlzLl9pZCxhKSx0aGlzLl9vbkNoYW5nZShiKSl9fSx7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5fZW1pdHRlci5vbihhLGIpfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9lbWl0dGVyLm9mZihhLGIpfX0se2tleToiX29uQ2hhbmdlIix2YWx1ZTpmdW5jdGlvbihhKXt0aGlzLl9maWx0ZXJTZXQmJnRoaXMuX2ZpbHRlclZhci5zZXQodGhpcy5fZmlsdGVyU2V0LnZhbHVlLHRoaXMuX21lcmdlRXh0cmFJbmZvKGEpKX19LHtrZXk6ImZpbHRlcmVkS2V5cyIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpbHRlclNldD90aGlzLl9maWx0ZXJTZXQudmFsdWU6bnVsbH19XSksYX0oKX0seyIuL2V2ZW50cyI6MSwiLi9maWx0ZXJzZXQiOjMsIi4vZ3JvdXAiOjQsIi4vdXRpbCI6MTF9XSwzOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGE9PT1iPzA6YTxiPy0xOmE+Yj8xOnZvaWQgMH1PYmplY3QuZGVmaW5lUHJvcGVydHkoYywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY107ZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGQmJihkLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxkLmtleSxkKX19cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYyYmYShiLnByb3RvdHlwZSxjKSxkJiZhKGIsZCksYn19KCksZz1hKCIuL3V0aWwiKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2QodGhpcyxhKSx0aGlzLnJlc2V0KCl9cmV0dXJuIGYoYSxbe2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5faGFuZGxlcz17fSx0aGlzLl9rZXlzPXt9LHRoaXMuX3ZhbHVlPW51bGwsdGhpcy5fYWN0aXZlSGFuZGxlcz0wfX0se2tleToidXBkYXRlIix2YWx1ZTpmdW5jdGlvbihhLGIpe251bGwhPT1iJiYoYj1iLnNsaWNlKDApLGIuc29ydChlKSk7dmFyIGM9KDAsZy5kaWZmU29ydGVkTGlzdHMpKHRoaXMuX2hhbmRsZXNbYV0sYiksZD1jLmFkZGVkLGY9Yy5yZW1vdmVkO3RoaXMuX2hhbmRsZXNbYV09Yjtmb3IodmFyIGg9MDtoPGQubGVuZ3RoO2grKyl0aGlzLl9rZXlzW2RbaF1dPSh0aGlzLl9rZXlzW2RbaF1dfHwwKSsxO2Zvcih2YXIgaT0wO2k8Zi5sZW5ndGg7aSsrKXRoaXMuX2tleXNbZltpXV0tLTt0aGlzLl91cGRhdGVWYWx1ZShiKX19LHtrZXk6Il91cGRhdGVWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5fYWxsS2V5cyxiPU9iamVjdC5rZXlzKHRoaXMuX2hhbmRsZXMpLmxlbmd0aDtpZigwPT09Yil0aGlzLl92YWx1ZT1udWxsO2Vsc2V7dGhpcy5fdmFsdWU9W107Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuX2tleXNbYVtjXV07ZD09PWImJnRoaXMuX3ZhbHVlLnB1c2goYVtjXSl9fX19LHtrZXk6ImNsZWFyIix2YWx1ZTpmdW5jdGlvbihhKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuX2hhbmRsZXNbYV0pe3ZhciBiPXRoaXMuX2hhbmRsZXNbYV07Ynx8KGI9W10pO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuX2tleXNbYltjXV0tLTtkZWxldGUgdGhpcy5faGFuZGxlc1thXSx0aGlzLl91cGRhdGVWYWx1ZSgpfX19LHtrZXk6InZhbHVlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFsdWV9fSx7a2V5OiJfYWxsS2V5cyIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9T2JqZWN0LmtleXModGhpcy5fa2V5cyk7cmV0dXJuIGEuc29ydChlKSxhfX1dKSxhfSgpO2MuZGVmYXVsdD1ofSx7Ii4vdXRpbCI6MTF9XSw0OltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3JldHVybiBhJiZhLl9fZXNNb2R1bGU/YTp7ZGVmYXVsdDphfX1mdW5jdGlvbiBlKGEsYil7aWYoIShhIGluc3RhbmNlb2YgYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gZihhKXtpZihhJiYic3RyaW5nIj09dHlwZW9mIGEpcmV0dXJuIGsuaGFzT3duUHJvcGVydHkoYSl8fChrW2FdPW5ldyBsKGEpKSxrW2FdO2lmKCJvYmplY3QiPT09KCJ1bmRlZmluZWQiPT10eXBlb2YgYT8idW5kZWZpbmVkIjpoKGEpKSYmYS5fdmFycyYmYS52YXIpcmV0dXJuIGE7aWYoQXJyYXkuaXNBcnJheShhKSYmMT09YS5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgYVswXSlyZXR1cm4gZihhWzBdKTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZ3JvdXBOYW1lIGFyZ3VtZW50Iil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdO2QuZW51bWVyYWJsZT1kLmVudW1lcmFibGV8fCExLGQuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBkJiYoZC53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9fXJldHVybiBmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGMmJmEoYi5wcm90b3R5cGUsYyksZCYmYShiLGQpLGJ9fSgpLGg9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGF9O2MuZGVmYXVsdD1mO3ZhciBpPWEoIi4vdmFyIiksaj1kKGkpO2IuX19jcm9zc3RhbGtfZ3JvdXBzPWIuX19jcm9zc3RhbGtfZ3JvdXBzfHx7fTt2YXIgaz1iLl9fY3Jvc3N0YWxrX2dyb3VwcyxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtlKHRoaXMsYSksdGhpcy5uYW1lPWIsdGhpcy5fdmFycz17fX1yZXR1cm4gZyhhLFt7a2V5OiJ2YXIiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHZhciBuYW1lIik7cmV0dXJuIHRoaXMuX3ZhcnMuaGFzT3duUHJvcGVydHkoYSl8fCh0aGlzLl92YXJzW2FdPW5ldyBqLmRlZmF1bHQodGhpcyxhKSksdGhpcy5fdmFyc1thXX19LHtrZXk6ImhhcyIsdmFsdWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJzdHJpbmciIT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFyIG5hbWUiKTtyZXR1cm4gdGhpcy5fdmFycy5oYXNPd25Qcm9wZXJ0eShhKX19XSksYX0oKX0pLmNhbGwodGhpcywidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL3ZhciI6MTJ9XSw1OltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3JldHVybiBhJiZhLl9fZXNNb2R1bGU/YTp7ZGVmYXVsdDphfX1mdW5jdGlvbiBlKGEpe3JldHVybiBrLnZhcihhKX1mdW5jdGlvbiBmKGEpe3JldHVybiBrLmhhcyhhKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoYywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGc9YSgiLi9ncm91cCIpLGg9ZChnKSxpPWEoIi4vc2VsZWN0aW9uIiksaj1hKCIuL2ZpbHRlciIpO2EoIi4vaW5wdXQiKSxhKCIuL2lucHV0X3NlbGVjdGl6ZSIpLGEoIi4vaW5wdXRfY2hlY2tib3hncm91cCIpLGEoIi4vaW5wdXRfc2xpZGVyIik7dmFyIGs9KDAsaC5kZWZhdWx0KSgiZGVmYXVsdCIpO2IuU2hpbnkmJmIuU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoInVwZGF0ZS1jbGllbnQtdmFsdWUiLGZ1bmN0aW9uKGEpeyJzdHJpbmciPT10eXBlb2YgYS5ncm91cD8oMCxoLmRlZmF1bHQpKGEuZ3JvdXApLnZhcihhLm5hbWUpLnNldChhLnZhbHVlKTplKGEubmFtZSkuc2V0KGEudmFsdWUpfSk7dmFyIGw9e2dyb3VwOmguZGVmYXVsdCx2YXI6ZSxoYXM6ZixTZWxlY3Rpb25IYW5kbGU6aS5TZWxlY3Rpb25IYW5kbGUsRmlsdGVySGFuZGxlOmouRmlsdGVySGFuZGxlfTtjLmRlZmF1bHQ9bCxiLmNyb3NzdGFsaz1sfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vZmlsdGVyIjoyLCIuL2dyb3VwIjo0LCIuL2lucHV0Ijo2LCIuL2lucHV0X2NoZWNrYm94Z3JvdXAiOjcsIi4vaW5wdXRfc2VsZWN0aXplIjo4LCIuL2lucHV0X3NsaWRlciI6OSwiLi9zZWxlY3Rpb24iOjEwfV0sNjpbZnVuY3Rpb24oYSxiLGMpeyhmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtoW2IuY2xhc3NOYW1lXT1iLGEuZG9jdW1lbnQmJiJjb21wbGV0ZSIhPT1hLmRvY3VtZW50LnJlYWR5U3RhdGU/ZyhmdW5jdGlvbigpe2QoKX0pOmEuZG9jdW1lbnQmJnNldFRpbWVvdXQoZCwxMDApfWZ1bmN0aW9uIGQoKXtPYmplY3Qua2V5cyhoKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWhbYV07ZygiLiIrYi5jbGFzc05hbWUpLm5vdCgiLmNyb3NzdGFsay1pbnB1dC1ib3VuZCIpLmVhY2goZnVuY3Rpb24oYSxjKXtmKGIsYyl9KX0pfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGEucmVwbGFjZSgvKFshIiMkJSYnKCkqKywuXC86Ozw9Pj9AXFtcXFxdXmB7fH1+XSkvZywiXFwkMSIpfWZ1bmN0aW9uIGYoYSxiKXt2YXIgYz1nKGIpLmZpbmQoInNjcmlwdFt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ11bZGF0YS1mb3I9JyIrZShiLmlkKSsiJ10iKSxkPUpTT04ucGFyc2UoY1swXS5pbm5lclRleHQpLGY9YS5mYWN0b3J5KGIsZCk7ZyhiKS5kYXRhKCJjcm9zc3RhbGstaW5zdGFuY2UiLGYpLGcoYikuYWRkQ2xhc3MoImNyb3NzdGFsay1pbnB1dC1ib3VuZCIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxjLnJlZ2lzdGVyPWI7dmFyIGc9YS5qUXVlcnksaD17fTthLlNoaW55JiYhZnVuY3Rpb24oKXt2YXIgYj1uZXcgYS5TaGlueS5JbnB1dEJpbmRpbmcsYz1hLmpRdWVyeTtjLmV4dGVuZChiLHtmaW5kOmZ1bmN0aW9uKGEpe3JldHVybiBjKGEpLmZpbmQoIi5jcm9zc3RhbGstaW5wdXQiKX0sZ2V0SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaWR9LGdldFZhbHVlOmZ1bmN0aW9uKGEpe30sc2V0VmFsdWU6ZnVuY3Rpb24oYSxiKXt9LHJlY2VpdmVNZXNzYWdlOmZ1bmN0aW9uKGEsYil7fSxzdWJzY3JpYmU6ZnVuY3Rpb24oYSxiKXtjKGEpLm9uKCJjcm9zc3RhbGstdmFsdWUtY2hhbmdlLmNyb3NzdGFsayIsZnVuY3Rpb24oYSl7YighMSl9KX0sdW5zdWJzY3JpYmU6ZnVuY3Rpb24oYSl7YyhhKS5vZmYoIi5jcm9zc3RhbGsiKX19KSxhLlNoaW55LmlucHV0QmluZGluZ3MucmVnaXN0ZXIoYiwiY3Jvc3N0YWxrLmlucHV0QmluZGluZyIpfSgpfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7fV0sNzpbZnVuY3Rpb24oYSxiLGMpeyhmdW5jdGlvbihiKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYyhhKXtpZihhJiZhLl9fZXNNb2R1bGUpcmV0dXJuIGE7dmFyIGI9e307aWYobnVsbCE9YSlmb3IodmFyIGMgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmKGJbY109YVtjXSk7cmV0dXJuIGIuZGVmYXVsdD1hLGJ9dmFyIGQ9YSgiLi9pbnB1dCIpLGU9YyhkKSxmPWEoIi4vZmlsdGVyIiksZz1iLmpRdWVyeTtlLnJlZ2lzdGVyKHtjbGFzc05hbWU6ImNyb3NzdGFsay1pbnB1dC1jaGVja2JveGdyb3VwIixmYWN0b3J5OmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGYuRmlsdGVySGFuZGxlKGIuZ3JvdXApLGQ9ZyhhKTtkLm9uKCJjaGFuZ2UiLCJpbnB1dFt0eXBlPSdjaGVja2JveCddIixmdW5jdGlvbigpe3ZhciBhPWQuZmluZCgiaW5wdXRbdHlwZT0nY2hlY2tib3gnXTpjaGVja2VkIik7MD09PWEubGVuZ3RoP2MuY2xlYXIoKTohZnVuY3Rpb24oKXt2YXIgZD17fTthLmVhY2goZnVuY3Rpb24oKXtiLm1hcFt0aGlzLnZhbHVlXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2RbYV09ITB9KX0pO3ZhciBlPU9iamVjdC5rZXlzKGQpO2Uuc29ydCgpLGMuc2V0KGUpfSgpfSl9fSl9KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsiLi9maWx0ZXIiOjIsIi4vaW5wdXQiOjZ9XSw4OltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBjKGEpe2lmKGEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTt2YXIgYj17fTtpZihudWxsIT1hKWZvcih2YXIgYyBpbiBhKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGMpJiYoYltjXT1hW2NdKTtyZXR1cm4gYi5kZWZhdWx0PWEsYn12YXIgZD1hKCIuL2lucHV0IiksZT1jKGQpLGY9YSgiLi91dGlsIiksZz1jKGYpLGg9YSgiLi9maWx0ZXIiKSxpPWIualF1ZXJ5O2UucmVnaXN0ZXIoe2NsYXNzTmFtZToiY3Jvc3N0YWxrLWlucHV0LXNlbGVjdCIsZmFjdG9yeTpmdW5jdGlvbihhLGIpe3ZhciBjPVt7dmFsdWU6IiIsbGFiZWw6IihBbGwpIn1dLGQ9Zy5kYXRhZnJhbWVUb0QzKGIuaXRlbXMpLGU9e29wdGlvbnM6Yy5jb25jYXQoZCksdmFsdWVGaWVsZDoidmFsdWUiLGxhYmVsRmllbGQ6ImxhYmVsIn0sZj1pKGEpLmZpbmQoInNlbGVjdCIpWzBdLGo9aShmKS5zZWxlY3RpemUoZSlbMF0uc2VsZWN0aXplLGs9bmV3IGguRmlsdGVySGFuZGxlKGIuZ3JvdXApO3JldHVybiBqLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7MD09PWouaXRlbXMubGVuZ3RoP2suY2xlYXIoKTohZnVuY3Rpb24oKXt2YXIgYT17fTtqLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oYyl7Yi5tYXBbY10uZm9yRWFjaChmdW5jdGlvbihiKXthW2JdPSEwfSl9KTt2YXIgYz1PYmplY3Qua2V5cyhhKTtjLnNvcnQoKSxrLnNldChjKX0oKX0pLGp9fSl9KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsiLi9maWx0ZXIiOjIsIi4vaW5wdXQiOjYsIi4vdXRpbCI6MTF9XSw5OltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBjKGEpe2lmKGEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTt2YXIgYj17fTtpZihudWxsIT1hKWZvcih2YXIgYyBpbiBhKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGMpJiYoYltjXT1hW2NdKTtyZXR1cm4gYi5kZWZhdWx0PWEsYn1mdW5jdGlvbiBkKGEsYil7Zm9yKHZhciBjPWEudG9TdHJpbmcoKTtjLmxlbmd0aDxiOyljPSIwIitjO3JldHVybiBjfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBEYXRlP2EuZ2V0VVRDRnVsbFllYXIoKSsiLSIrZChhLmdldFVUQ01vbnRoKCkrMSwyKSsiLSIrZChhLmdldFVUQ0RhdGUoKSwyKTpudWxsfXZhciBmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPVtdLGQ9ITAsZT0hMSxmPXZvaWQgMDt0cnl7Zm9yKHZhciBnLGg9YVtTeW1ib2wuaXRlcmF0b3JdKCk7IShkPShnPWgubmV4dCgpKS5kb25lKSYmKGMucHVzaChnLnZhbHVlKSwhYnx8Yy5sZW5ndGghPT1iKTtkPSEwKTt9Y2F0Y2goYSl7ZT0hMCxmPWF9ZmluYWxseXt0cnl7IWQmJmgucmV0dXJuJiZoLnJldHVybigpfWZpbmFsbHl7aWYoZSl0aHJvdyBmfX1yZXR1cm4gY31yZXR1cm4gZnVuY3Rpb24oYixjKXtpZihBcnJheS5pc0FycmF5KGIpKXJldHVybiBiO2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYikpcmV0dXJuIGEoYixjKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLGc9YSgiLi9pbnB1dCIpLGg9YyhnKSxpPWEoIi4vZmlsdGVyIiksaj1iLmpRdWVyeSxrPWIuc3RyZnRpbWU7aC5yZWdpc3Rlcih7Y2xhc3NOYW1lOiJjcm9zc3RhbGstaW5wdXQtc2xpZGVyIixmYWN0b3J5OmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe3ZhciBhPWguZGF0YSgiaW9uUmFuZ2VTbGlkZXIiKS5yZXN1bHQsYj12b2lkIDAsYz1oLmRhdGEoImRhdGEtdHlwZSIpO3JldHVybiBiPSJkYXRlIj09PWM/ZnVuY3Rpb24oYSl7cmV0dXJuIGUobmV3IERhdGUoK2EpKX06ImRhdGV0aW1lIj09PWM/ZnVuY3Rpb24oYSl7cmV0dXJuK2EvMWUzfTpmdW5jdGlvbihhKXtyZXR1cm4rYX0sImRvdWJsZSI9PT1oLmRhdGEoImlvblJhbmdlU2xpZGVyIikub3B0aW9ucy50eXBlP1tiKGEuZnJvbSksYihhLnRvKV06YihhLmZyb20pfXZhciBkPW5ldyBpLkZpbHRlckhhbmRsZShiLmdyb3VwKSxnPXt9LGg9aihhKS5maW5kKCJpbnB1dCIpLGw9aC5kYXRhKCJkYXRhLXR5cGUiKSxtPWguZGF0YSgidGltZS1mb3JtYXQiKSxuPXZvaWQgMDtpZigiZGF0ZSI9PT1sKW49ay51dGMoKSxnLnByZXR0aWZ5PWZ1bmN0aW9uKGEpe3JldHVybiBuKG0sbmV3IERhdGUoYSkpfTtlbHNlIGlmKCJkYXRldGltZSI9PT1sKXt2YXIgbz1oLmRhdGEoInRpbWV6b25lIik7bj1vP2sudGltZXpvbmUobyk6ayxnLnByZXR0aWZ5PWZ1bmN0aW9uKGEpe3JldHVybiBuKG0sbmV3IERhdGUoYSkpfX1oLmlvblJhbmdlU2xpZGVyKGcpLGgub24oImNoYW5nZS5jcm9zc3RhbGtTbGlkZXJJbnB1dCIsZnVuY3Rpb24oYSl7aWYoIWguZGF0YSgidXBkYXRpbmciKSYmIWguZGF0YSgiYW5pbWF0aW5nIikpe2Zvcih2YXIgZT1jKCksZz1mKGUsMiksaT1nWzBdLGo9Z1sxXSxrPVtdLGw9MDtsPGIudmFsdWVzLmxlbmd0aDtsKyspe3ZhciBtPWIudmFsdWVzW2xdO20+PWkmJm08PWomJmsucHVzaChiLmtleXNbbF0pfWsuc29ydCgpLGQuc2V0KGspfX0pfX0pfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vZmlsdGVyIjoyLCIuL2lucHV0Ijo2fV0sMTA6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtpZihhJiZhLl9fZXNNb2R1bGUpcmV0dXJuIGE7dmFyIGI9e307aWYobnVsbCE9YSlmb3IodmFyIGMgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmKGJbY109YVtjXSk7cmV0dXJuIGIuZGVmYXVsdD1hLGJ9ZnVuY3Rpb24gZShhKXtyZXR1cm4gYSYmYS5fX2VzTW9kdWxlP2E6e2RlZmF1bHQ6YX19ZnVuY3Rpb24gZihhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxjLlNlbGVjdGlvbkhhbmRsZT12b2lkIDA7dmFyIGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY107ZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGQmJihkLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxkLmtleSxkKX19cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYyYmYShiLnByb3RvdHlwZSxjKSxkJiZhKGIsZCksYn19KCksaD1hKCIuL2V2ZW50cyIpLGk9ZShoKSxqPWEoIi4vZ3JvdXAiKSxrPWUoaiksbD1hKCIuL3V0aWwiKSxtPWQobCk7Yy5TZWxlY3Rpb25IYW5kbGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO2YodGhpcyxhKSx0aGlzLl9ldmVudFJlbGF5PW5ldyBpLmRlZmF1bHQsdGhpcy5fZW1pdHRlcj1uZXcgbS5TdWJzY3JpcHRpb25UcmFja2VyKHRoaXMuX2V2ZW50UmVsYXkpLHRoaXMuX2dyb3VwPW51bGwsdGhpcy5fdmFyPW51bGwsdGhpcy5fdmFyT25DaGFuZ2VTdWI9bnVsbCx0aGlzLl9leHRyYUluZm89bS5leHRlbmQoe3NlbmRlcjp0aGlzfSxjKSx0aGlzLnNldEdyb3VwKGIpfXJldHVybiBnKGEsW3trZXk6InNldEdyb3VwIix2YWx1ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzO2lmKHRoaXMuX2dyb3VwIT09YSYmKHRoaXMuX2dyb3VwfHxhKSYmKHRoaXMuX3ZhciYmKHRoaXMuX3Zhci5vZmYoImNoYW5nZSIsdGhpcy5fdmFyT25DaGFuZ2VTdWIpLHRoaXMuX3Zhcj1udWxsLHRoaXMuX3Zhck9uQ2hhbmdlU3ViPW51bGwpLHRoaXMuX2dyb3VwPWEsYSkpe3RoaXMuX3Zhcj0oMCxrLmRlZmF1bHQpKGEpLnZhcigic2VsZWN0aW9uIik7dmFyIGM9dGhpcy5fdmFyLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKGEpe2IuX2V2ZW50UmVsYXkudHJpZ2dlcigiY2hhbmdlIixhLGIpfSk7dGhpcy5fdmFyT25DaGFuZ2VTdWI9Y319fSx7a2V5OiJfbWVyZ2VFeHRyYUluZm8iLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBtLmV4dGVuZCh7fSx0aGlzLl9leHRyYUluZm8/dGhpcy5fZXh0cmFJbmZvOm51bGwsYT9hOm51bGwpfX0se2tleToic2V0Iix2YWx1ZTpmdW5jdGlvbihhLGIpe3RoaXMuX3ZhciYmdGhpcy5fdmFyLnNldChhLHRoaXMuX21lcmdlRXh0cmFJbmZvKGIpKX19LHtrZXk6ImNsZWFyIix2YWx1ZTpmdW5jdGlvbihhKXt0aGlzLl92YXImJnRoaXMuc2V0KHZvaWQgMCx0aGlzLl9tZXJnZUV4dHJhSW5mbyhhKSl9fSx7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5fZW1pdHRlci5vbihhLGIpfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9lbWl0dGVyLm9mZihhLGIpfX0se2tleToiY2xvc2UiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKSx0aGlzLnNldEdyb3VwKG51bGwpfX0se2tleToidmFsdWUiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92YXI/dGhpcy5fdmFyLmdldCgpOm51bGx9fV0pLGF9KCl9LHsiLi9ldmVudHMiOjEsIi4vZ3JvdXAiOjQsIi4vdXRpbCI6MTF9XSwxMTpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEsYil7aWYoIShhIGluc3RhbmNlb2YgYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gZShhKXtmb3IodmFyIGI9YXJndW1lbnRzLmxlbmd0aCxjPUFycmF5KGI+MT9iLTE6MCksZD0xO2Q8YjtkKyspY1tkLTFdPWFyZ3VtZW50c1tkXTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGYmJm51bGwhPT1mKWZvcih2YXIgZyBpbiBmKWYuaGFzT3duUHJvcGVydHkoZykmJihhW2ddPWZbZ10pfXJldHVybiBhfWZ1bmN0aW9uIGYoYSl7Zm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspaWYoYVtiXTw9YVtiLTFdKXRocm93IG5ldyBFcnJvcigiTGlzdCBpcyBub3Qgc29ydGVkIG9yIGNvbnRhaW5zIGR1cGxpY2F0ZSIpfWZ1bmN0aW9uIGcoYSxiKXt2YXIgYz0wLGQ9MDthfHwoYT1bXSksYnx8KGI9W10pO3ZhciBlPVtdLGc9W107Zm9yKGYoYSksZihiKTtjPGEubGVuZ3RoJiZkPGIubGVuZ3RoOylhW2NdPT09YltkXT8oYysrLGQrKyk6YVtjXTxiW2RdP2UucHVzaChhW2MrK10pOmcucHVzaChiW2QrK10pO3JldHVybiBjPGEubGVuZ3RoJiYoZT1lLmNvbmNhdChhLnNsaWNlKGMpKSksZDxiLmxlbmd0aCYmKGc9Zy5jb25jYXQoYi5zbGljZShkKSkpLHtyZW1vdmVkOmUsYWRkZWQ6Z319ZnVuY3Rpb24gaChhKXt2YXIgYj1bXSxjPXZvaWQgMDtmb3IodmFyIGQgaW4gYSl7aWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYi5wdXNoKGQpLCJvYmplY3QiIT09aihhW2RdKXx8InVuZGVmaW5lZCI9PXR5cGVvZiBhW2RdLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGMmJmMhPT1hW2RdLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7Yz1hW2RdLmxlbmd0aH1mb3IodmFyIGU9W10sZj12b2lkIDAsZz0wO2c8YztnKyspe2Y9e307Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspZltiW2hdXT1hW2JbaF1dW2ddO2UucHVzaChmKX1yZXR1cm4gZX1PYmplY3QuZGVmaW5lUHJvcGVydHkoYywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY107ZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGQmJihkLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxkLmtleSxkKX19cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYyYmYShiLnByb3RvdHlwZSxjKSxkJiZhKGIsZCksYn19KCksaj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGF9OmZ1bmN0aW9uKGEpe3JldHVybiBhJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgYX07Yy5leHRlbmQ9ZSxjLmNoZWNrU29ydGVkPWYsYy5kaWZmU29ydGVkTGlzdHM9ZyxjLmRhdGFmcmFtZVRvRDM9aDtjLlN1YnNjcmlwdGlvblRyYWNrZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2QodGhpcyxhKSx0aGlzLl9lbWl0dGVyPWIsdGhpcy5fc3Vicz17fX1yZXR1cm4gaShhLFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9lbWl0dGVyLm9uKGEsYik7cmV0dXJuIHRoaXMuX3N1YnNbY109YSxjfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2VtaXR0ZXIub2ZmKGEsYik7cmV0dXJuIGMmJmRlbGV0ZSB0aGlzLl9zdWJzW2NdLGN9fSx7a2V5OiJyZW1vdmVBbGxMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPXRoaXMuX3N1YnM7dGhpcy5fc3Vicz17fSxPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2EuX2VtaXR0ZXIub2ZmKGJbY10sYyl9KX19XSksYX0oKX0se31dLDEyOltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3JldHVybiBhJiZhLl9fZXNNb2R1bGU/YTp7ZGVmYXVsdDphfX1mdW5jdGlvbiBlKGEsYil7aWYoIShhIGluc3RhbmNlb2YgYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBmPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmEuY29uc3RydWN0b3I9PT1TeW1ib2wmJmEhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBhfSxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdO2QuZW51bWVyYWJsZT1kLmVudW1lcmFibGV8fCExLGQuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBkJiYoZC53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9fXJldHVybiBmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGMmJmEoYi5wcm90b3R5cGUsYyksZCYmYShiLGQpLGJ9fSgpLGg9YSgiLi9ldmVudHMiKSxpPWQoaCksaj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjLGQpe2UodGhpcyxhKSx0aGlzLl9ncm91cD1iLHRoaXMuX25hbWU9Yyx0aGlzLl92YWx1ZT1kLHRoaXMuX2V2ZW50cz1uZXcgaS5kZWZhdWx0fXJldHVybiBnKGEsW3trZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFsdWV9fSx7a2V5OiJzZXQiLHZhbHVlOmZ1bmN0aW9uKGEsYyl7aWYodGhpcy5fdmFsdWUhPT1hKXt2YXIgZD10aGlzLl92YWx1ZTt0aGlzLl92YWx1ZT1hO3ZhciBlPXt9O2lmKGMmJiJvYmplY3QiPT09KCJ1bmRlZmluZWQiPT10eXBlb2YgYz8idW5kZWZpbmVkIjpmKGMpKSlmb3IodmFyIGcgaW4gYyljLmhhc093blByb3BlcnR5KGcpJiYoZVtnXT1jW2ddKTtlLm9sZFZhbHVlPWQsZS52YWx1ZT1hLHRoaXMuX2V2ZW50cy50cmlnZ2VyKCJjaGFuZ2UiLGUsdGhpcyksYi5TaGlueSYmYi5TaGlueS5vbklucHV0Q2hhbmdlJiZiLlNoaW55Lm9uSW5wdXRDaGFuZ2UoIi5jbGllbnRWYWx1ZS0iKyhudWxsIT09dGhpcy5fZ3JvdXAubmFtZT90aGlzLl9ncm91cC5uYW1lKyItIjoiIikrdGhpcy5fbmFtZSxhKX19fSx7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5fZXZlbnRzLm9uKGEsYil9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2V2ZW50cy5vZmYoYSxiKX19XSksYX0oKTtjLmRlZmF1bHQ9an0pLmNhbGwodGhpcywidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL2V2ZW50cyI6MX1dfSx7fSxbNV0pOwovLyMgc291cmNlTWFwcGluZ1VSTD1jcm9zc3RhbGsubWluLmpzLm1hcA=="></script>
</head>
<body style="background-color:white;">
<div>
<span style="font-style:bold">mpg</span> <br /> <span id="sparkline-mpg" class="sparkline html-widget"></span>
<script type="application/json" data-for="sparkline-mpg">{"x":{"values":[21,21,22.8,21.4,18.7,18.1,14.3,24.4,22.8,19.2,17.8,16.4,17.3,15.2,10.4,10.4,14.7,32.4,30.4,33.9,21.5,15.5,15.2,13.3,19.2,27.3,26,30.4,15.8,19.7,15,21.4],"options":{"type":"box","chartRangeMin":0,"chartRangeMax":33.9,"height":20,"width":60},"width":60,"height":20},"evals":[],"jsHooks":[]}</script>
<br /> <span id="sparkline-mpg-selected" class="sparkline html-widget"></span>
<script type="application/json" data-for="sparkline-mpg-selected">{"x":{"values":[21,21,22.8,21.4,18.7,18.1,14.3,24.4,22.8,19.2,17.8,16.4,17.3,15.2,10.4,10.4,14.7,32.4,30.4,33.9,21.5,15.5,15.2,13.3,19.2,27.3,26,30.4,15.8,19.7,15,21.4],"options":{"type":"box","chartRangeMin":0,"chartRangeMax":33.9,"height":20,"width":60},"width":60,"height":20},"evals":[],"jsHooks":[]}</script>
</div>
<div>
<span style="font-style:bold">disp</span> <br /> <span id="sparkline-disp" class="sparkline html-widget"></span>
<script type="application/json" data-for="sparkline-disp">{"x":{"values":[160,160,108,258,360,225,360,146.7,140.8,167.6,167.6,275.8,275.8,275.8,472,460,440,78.7,75.7,71.1,120.1,318,304,350,400,79,120.3,95.1,351,145,301,121],"options":{"type":"box","chartRangeMin":0,"chartRangeMax":472,"height":20,"width":60},"width":60,"height":20},"evals":[],"jsHooks":[]}</script>
<br /> <span id="sparkline-disp-selected" class="sparkline html-widget"></span>
<script type="application/json" data-for="sparkline-disp-selected">{"x":{"values":[160,160,108,258,360,225,360,146.7,140.8,167.6,167.6,275.8,275.8,275.8,472,460,440,78.7,75.7,71.1,120.1,318,304,350,400,79,120.3,95.1,351,145,301,121],"options":{"type":"box","chartRangeMin":0,"chartRangeMax":472,"height":20,"width":60},"width":60,"height":20},"evals":[],"jsHooks":[]}</script>
</div>
<div id="htmlwidget-a0743f1b5a249ebcbdb6" class="parcoords html-widget" style="width:960px;height:500px;">
</div>
<script type="application/json" data-for="htmlwidget-a0743f1b5a249ebcbdb6">{"x":{"data":{"names":["Mazda RX4","Mazda RX4 Wag","Datsun 710","Hornet 4 Drive","Hornet Sportabout","Valiant","Duster 360","Merc 240D","Merc 230","Merc 280","Merc 280C","Merc 450SE","Merc 450SL","Merc 450SLC","Cadillac Fleetwood","Lincoln Continental","Chrysler Imperial","Fiat 128","Honda Civic","Toyota Corolla","Toyota Corona","Dodge Challenger","AMC Javelin","Camaro Z28","Pontiac Firebird","Fiat X1-9","Porsche 914-2","Lotus Europa","Ford Pantera L","Ferrari Dino","Maserati Bora","Volvo 142E"],"mpg":[21,21,22.8,21.4,18.7,18.1,14.3,24.4,22.8,19.2,17.8,16.4,17.3,15.2,10.4,10.4,14.7,32.4,30.4,33.9,21.5,15.5,15.2,13.3,19.2,27.3,26,30.4,15.8,19.7,15,21.4],"cyl":[6,6,4,6,8,6,8,4,4,6,6,8,8,8,8,8,8,4,4,4,4,8,8,8,8,4,4,4,8,6,8,4],"disp":[160,160,108,258,360,225,360,146.7,140.8,167.6,167.6,275.8,275.8,275.8,472,460,440,78.7,75.7,71.1,120.1,318,304,350,400,79,120.3,95.1,351,145,301,121],"hp":[110,110,93,110,175,105,245,62,95,123,123,180,180,180,205,215,230,66,52,65,97,150,150,245,175,66,91,113,264,175,335,109],"drat":[3.9,3.9,3.85,3.08,3.15,2.76,3.21,3.69,3.92,3.92,3.92,3.07,3.07,3.07,2.93,3,3.23,4.08,4.93,4.22,3.7,2.76,3.15,3.73,3.08,4.08,4.43,3.77,4.22,3.62,3.54,4.11],"wt":[2.62,2.875,2.32,3.215,3.44,3.46,3.57,3.19,3.15,3.44,3.44,4.07,3.73,3.78,5.25,5.424,5.345,2.2,1.615,1.835,2.465,3.52,3.435,3.84,3.845,1.935,2.14,1.513,3.17,2.77,3.57,2.78],"qsec":[16.46,17.02,18.61,19.44,17.02,20.22,15.84,20,22.9,18.3,18.9,17.4,17.6,18,17.98,17.82,17.42,19.47,18.52,19.9,20.01,16.87,17.3,15.41,17.05,18.9,16.7,16.9,14.5,15.5,14.6,18.6],"vs":[0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,1,0,0,0,1],"am":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1],"gear":[4,4,4,3,3,3,3,4,4,4,4,3,3,3,3,3,3,4,4,4,3,3,3,3,3,4,5,5,5,5,5,4],"carb":[4,4,1,1,2,1,4,2,2,4,4,3,3,3,4,4,4,1,2,1,1,2,2,4,2,1,2,2,4,6,8,2],"key_":["Mazda RX4","Mazda RX4 Wag","Datsun 710","Hornet 4 Drive","Hornet Sportabout","Valiant","Duster 360","Merc 240D","Merc 230","Merc 280","Merc 280C","Merc 450SE","Merc 450SL","Merc 450SLC","Cadillac Fleetwood","Lincoln Continental","Chrysler Imperial","Fiat 128","Honda Civic","Toyota Corolla","Toyota Corona","Dodge Challenger","AMC Javelin","Camaro Z28","Pontiac Firebird","Fiat X1-9","Porsche 914-2","Lotus Europa","Ford Pantera L","Ferrari Dino","Maserati Bora","Volvo 142E"]},"options":{"rownames":true,"brushMode":"1D-axes","brushPredicate":"AND","reorderable":false,"margin":{"top":50,"bottom":50,"left":100,"right":50},"mode":false},"autoresize":false,"tasks":null,"crosstalk_opts":{"group":"grp1","key":["Mazda RX4","Mazda RX4 Wag","Datsun 710","Hornet 4 Drive","Hornet Sportabout","Valiant","Duster 360","Merc 240D","Merc 230","Merc 280","Merc 280C","Merc 450SE","Merc 450SL","Merc 450SLC","Cadillac Fleetwood","Lincoln Continental","Chrysler Imperial","Fiat 128","Honda Civic","Toyota Corolla","Toyota Corona","Dodge Challenger","AMC Javelin","Camaro Z28","Pontiac Firebird","Fiat X1-9","Porsche 914-2","Lotus Europa","Ford Pantera L","Ferrari Dino","Maserati Bora","Volvo 142E"]}},"evals":[],"jsHooks":{"render":[{"code":"function(el,x){window.mtcars = x.data}","data":null}]}}</script>
<script>
var drawBox = function(selection){
//make sure mtcars is available first
// since this will likely run before
// we run assignment of mtcars after parcoords render
if(mtcars){
var selected_rows = mtcars;
if(selection && selection.length > 0){
selection = Array.isArray(selection) ? selection : [selection];
selected_rows = mtcars.filter(function(d){
return selection.indexOf(d.key_) >= 0
});
}
$('#sparkline-mpg-selected').sparkline(
selected_rows.map(function(d){return d.mpg}),
{type:'box',chartRangeMin:0,chartRangeMax:34}
);
$('#sparkline-disp-selected').sparkline(
selected_rows.map(function(d){return d.disp}),
{type:'box',chartRangeMin:0,chartRangeMax:472}
);
}
};
var sel_handle = new crosstalk.SelectionHandle('grp1');
sel_handle.on(
'change',
function(val){drawBox(val.value)}
);
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment